Made the game a state, added menu

This commit is contained in:
Entarno54 2025-05-29 23:28:13 +07:00
parent 36b735f6be
commit 7c4338fdf5
32 changed files with 19058 additions and 5253 deletions

View File

@ -180,9 +180,9 @@
209
],
"camera_position": [
80,
-40
-100,
40
],
"sing_duration": 4,
"scale": 1
}
}

142
characters/dad.json Normal file
View File

@ -0,0 +1,142 @@
{
"animations": [
{
"offsets": [
-9,
10
],
"loop": false,
"anim": "singLEFT",
"fps": 24,
"name": "Dad Sing Note LEFT",
"indices": []
},
{
"offsets": [
0,
-30
],
"loop": false,
"anim": "singDOWN",
"fps": 24,
"name": "Dad Sing Note DOWN",
"indices": []
},
{
"offsets": [
-6,
50
],
"loop": false,
"anim": "singUP",
"fps": 24,
"name": "Dad Sing Note UP",
"indices": []
},
{
"offsets": [
0,
27
],
"loop": false,
"anim": "singRIGHT",
"fps": 24,
"name": "Dad Sing Note RIGHT",
"indices": []
},
{
"offsets": [
0,
0
],
"loop": false,
"anim": "idle",
"fps": 24,
"name": "Dad idle dance",
"indices": []
},
{
"offsets": [
0,
0
],
"loop": true,
"fps": 24,
"anim": "idle-loop",
"indices": [
10,
11,
12,
12
],
"name": "Dad idle dance"
},
{
"offsets": [
-9,
10
],
"loop": true,
"fps": 24,
"anim": "singLEFT-loop",
"indices": [
12,
13,
14,
15
],
"name": "Dad Sing Note LEFT"
},
{
"offsets": [
0,
27
],
"loop": true,
"fps": 24,
"anim": "singRIGHT-loop",
"indices": [
15,
16,
17,
18
],
"name": "Dad Sing Note RIGHT"
},
{
"offsets": [
-6,
50
],
"loop": true,
"fps": 24,
"anim": "singUP-loop",
"indices": [
56,
57,
58,
59
],
"name": "Dad Sing Note UP"
}
],
"no_antialiasing": false,
"image": "sprites/DADDY_DEAREST",
"position": [
-200,
160
],
"healthicon": "dad",
"flip_x": false,
"healthbar_colors": [
175,
102,
206
],
"camera_position": [
-800,
0
],
"sing_duration": 6.1,
"scale": 1
}

209
characters/gf.json Normal file
View File

@ -0,0 +1,209 @@
{
"animations": [
{
"loop": false,
"offsets": [
3,
0
],
"fps": 24,
"anim": "cheer",
"indices": [],
"name": "GF Cheer"
},
{
"loop": false,
"offsets": [
0,
-19
],
"fps": 24,
"anim": "singLEFT",
"indices": [],
"name": "GF left note"
},
{
"loop": false,
"offsets": [
0,
-20
],
"fps": 24,
"anim": "singDOWN",
"indices": [],
"name": "GF Down Note"
},
{
"loop": false,
"offsets": [
0,
4
],
"fps": 24,
"anim": "singUP",
"indices": [],
"name": "GF Up Note"
},
{
"loop": false,
"offsets": [
0,
-20
],
"fps": 24,
"anim": "singRIGHT",
"indices": [],
"name": "GF Right Note"
},
{
"loop": false,
"offsets": [
-2,
-21
],
"fps": 24,
"anim": "sad",
"indices": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12
],
"name": "gf sad"
},
{
"loop": false,
"offsets": [
0,
-9
],
"fps": 24,
"anim": "danceLeft",
"indices": [
30,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
],
"name": "GF Dancing Beat"
},
{
"loop": false,
"offsets": [
0,
-9
],
"fps": 24,
"anim": "danceRight",
"indices": [
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29
],
"name": "GF Dancing Beat"
},
{
"loop": true,
"offsets": [
45,
-8
],
"fps": 24,
"anim": "hairBlow",
"indices": [
0,
1,
2,
3
],
"name": "GF Dancing Beat Hair blowing"
},
{
"loop": false,
"offsets": [
0,
-9
],
"fps": 24,
"anim": "hairFall",
"indices": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11
],
"name": "GF Dancing Beat Hair Landing"
},
{
"loop": true,
"offsets": [
-2,
-17
],
"fps": 24,
"anim": "scared",
"indices": [],
"name": "GF FEAR"
}
],
"no_antialiasing": false,
"image": "sprites/GF_assets",
"position": [
0,
160
],
"healthicon": "gf",
"flip_x": false,
"healthbar_colors": [
165,
0,
77
],
"camera_position": [
0,
0
],
"sing_duration": 4,
"scale": 1
}

View File

@ -136,9 +136,9 @@
225
],
"camera_position": [
-200,
-5000
-500,
-20
],
"sing_duration": 4,
"scale": 1
}
}

View File

@ -0,0 +1,97 @@
-- RANK ONLY UP TILL 20, 0 MINIMUM, CHANGE THIS TO SUGGEST HOW HARD THE SONG IS, BY MARKEDAMAN
function onCreate()
if difficulty == 0 then -- easy
rank = 1
elseif difficulty == 1 then -- normal
rank = 1
elseif difficulty == 2 then -- hard
rank = 2
elseif difficulty == 3 then -- erect
rank = 11
elseif difficulty == 4 then -- nightmare
rank = 12
end
end
function onCreatePost()
if not hideHud then
if rank > 10 then
makeLuaSprite('star', 'star2', 1070, 590)
makeAnimatedLuaSprite('starFlame', 'starFlame', 1030, 440)
addAnimationByPrefix('starFlame', 'starFlame', 'fire loop full instance', 24, true)
setProperty('starFlame.alpha', 0)
scaleObject('starFlame', 1.5, 1.5)
setObjectCamera('starFlame', 'hud')
addLuaSprite('starFlame', true)
elseif rank <= 10 then
makeLuaSprite('star', 'star1', 1070, 590)
end
scaleObject('star', 0.9, 0.9)
setObjectCamera('star', 'hud')
setObjectOrder('star', getObjectOrder('starFlame') + 1)
setProperty('star.alpha', 0)
addLuaSprite('star')
makeLuaText('difficulty', ''.. rank ..'', 2230 , 0, 620)
setTextSize('difficulty', 37)
setTextFont('difficulty', 'combo.ttf')
setProperty('difficulty.alpha', 0)
addLuaText('difficulty', false)
setObjectOrder('difficulty', getObjectOrder('star') + 1)
if downscroll then
setProperty('difficulty.y', 70)
setProperty('star.y', 40)
setProperty('starFlame.y', -5)
setProperty('starFlame.angle', 190)
end
if rank > 10 then
setTextColor('difficulty', 'ffffff')
setTextBorder('difficulty', 2, '00AEFF')
elseif rank <= 10 then
setTextColor('difficulty', '000000')
setTextBorder('difficulty', 3, 'FFFFFF')
end
runTimer('ready', 0.5) -- star fade in
runTimer('wait', 8) -- star fade out
runTimer('wait2', 7.5) -- difficulty fade out
if rank > 10 then
runTimer('pausefire', 2) -- difficulty fade in
elseif rank <=10 then
runTimer('pause', 2)
end
end
end
function onTimerCompleted(tag)
if not hideHud then
if tag == 'ready' then
doTweenAlpha('hi', 'star', 1, 0.5,'linear')
end
if tag == 'wait' then
doTweenAlpha('gone', 'star', 0, 0.5,'linear')
doTweenAlpha('fireout', 'starFlame', 0, 0.5,'linear')
end
if tag == 'wait2' then
doTweenAlpha('bye', 'difficulty', 0, 0.5,'linear')
end
if tag == 'pause' then
doTweenAlpha('hi2', 'difficulty', 1, 0.5,'linear')
end
if tag == 'pausefire' then
setProperty('difficulty.alpha', 1)
setProperty('starFlame.alpha', 1)
playSound('light', 0.7)
end
end
end

View File

@ -0,0 +1,4 @@
function onCreate()
setTextFont('scoreTxt', 'vcr.ttf')
setTextFont('timeTxt','timer.ttf')
end

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,301 @@
{
"song": {
"events": [
[
32000,
[
[
"Dadbattle Spotlight",
"1",
""
],
[
"Camera Flash",
"2",
""
]
]
],
[
41333.3333333333,
[
[
"Set Cam Zoom",
"0.9",
""
],
[
"Camera Set Target",
"b",
""
]
]
],
[
42666.6666666667,
[
[
"Dadbattle Spotlight",
"3",
""
]
]
],
[
48000,
[
[
"Camera Flash",
"0.5",
""
],
[
"Camera Follow Pos",
"650",
"550"
],
[
"Set Cam Zoom",
"0.65",
""
]
]
],
[
48333.3333333334,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
48666.6666666667,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
49000,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
49666.6666666667,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
50000,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
50333.3333333334,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
51000,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
51333.3333333334,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
51666.6666666667,
[
[
"Add Camera Zoom",
"",
""
]
]
],
[
52000,
[
[
"Add Camera Zoom",
"0.015",
"0"
]
]
],
[
52166.6666666667,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
52333.3333333334,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
52500,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
52666.6666666667,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
52833.3333333334,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
52916.6666666667,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
53000,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
53083.3333333334,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
53166.6666666667,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
53250,
[
[
"Add Camera Zoom",
"0.03",
""
]
]
],
[
53333.3333333334,
[
[
"Dadbattle Spotlight",
"0",
""
],
[
"Set Cam Zoom",
"0.75",
"2"
],
[
"Camera Follow Pos",
"",
""
],
[
"Camera Flash",
"0.5",
""
]
]
],
[
74666.6666666667,
[
[
"Set Cam Zoom",
"0.8",
""
]
]
]
]
}
}

View File

@ -0,0 +1,113 @@
-- Script made by Washo789, please, if you use it or modify it, I would like you to give me credits.
local xx = 520; -- Code to change the position of the camera to the left or right for your opponent, Less = Left (They can be negative numbers), More = Right
local yy = 350; -- Code to change the position of the camera up or down for the enemy Less = Down (They can be negative numbers), More = Up
local xx2 = 820; -- Same code as above, but for boyfriend left, right
local yy2 = 550; -- Same code as above, but for boyfriend up, down
local xx3 = 520; -- Same code as above, but for girlfriend left, right
local yy3 = 450; -- Same code as above, but for girlfriend, up, down
local ofs = 35; -- Code to adjust the intensity with which the camera moves, the more numbers, the more intense, and the fewer numbers, less intense
local followchars = true; -- This code is necessary for the script to work, don't even think about deleting it!
local del = 0;
local del2 = 0;
function onUpdate() -- The Main Code
if del > 0 then
del = del - 1
end
if del2 > 0 then
del2 = del2 - 1
end
if followchars == true then
if mustHitSection == false then -- Code for the camera to follow the poses of your opponent
if getProperty('dad.animation.curAnim.name') == 'singLEFT' then
triggerEvent('Camera Follow Pos',xx-ofs,yy)
end
if getProperty('dad.animation.curAnim.name') == 'singRIGHT' then
triggerEvent('Camera Follow Pos',xx+ofs,yy)
end
if getProperty('dad.animation.curAnim.name') == 'singUP' then
triggerEvent('Camera Follow Pos',xx,yy-ofs)
end
if getProperty('dad.animation.curAnim.name') == 'singDOWN' then
triggerEvent('Camera Follow Pos',xx,yy+ofs)
end
if getProperty('dad.animation.curAnim.name') == 'singLEFT-alt' then
triggerEvent('Camera Follow Pos',xx-ofs,yy)
end
if getProperty('dad.animation.curAnim.name') == 'singRIGHT-alt' then
triggerEvent('Camera Follow Pos',xx+ofs,yy)
end
if getProperty('dad.animation.curAnim.name') == 'singUP-alt' then
triggerEvent('Camera Follow Pos',xx,yy-ofs)
end
if getProperty('dad.animation.curAnim.name') == 'singDOWN-alt' then
triggerEvent('Camera Follow Pos',xx,yy+ofs)
end
if getProperty('dad.animation.curAnim.name') == 'idle-alt' then
triggerEvent('Camera Follow Pos',xx,yy)
end
if getProperty('dad.animation.curAnim.name') == 'idle' then
triggerEvent('Camera Follow Pos',xx,yy)
end
if gfSection == true then -- The camera follows GF when she sings, only when the "GF Section" option in the chart editor is activated.
if getProperty('gf.animation.curAnim.name') == 'singLEFT' then -- Credits to Serebeat and company for their Slaybells mod,
triggerEvent('Camera Follow Pos',xx3-ofs,yy3) -- That's where I got the gf code from.
end
if getProperty('gf.animation.curAnim.name') == 'singRIGHT' then
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
end
if getProperty('gf.animation.curAnim.name') == 'singUP' then
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
end
if getProperty('gf.animation.curAnim.name') == 'singDOWN' then
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
end
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
triggerEvent('Camera Follow Pos',xx3,yy3)
end
if getProperty('gf.animation.curAnim.name') == 'singRIGHT-alt' then
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
end
if getProperty('gf.animation.curAnim.name') == 'singUP-alt' then
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
end
if getProperty('gf.animation.curAnim.name') == 'singDOWN-alt' then
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
end
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
triggerEvent('Camera Follow Pos',xx3,yy3)
end
end
else
-- Code for the camera to follow the poses of boyfriend
if getProperty('boyfriend.animation.curAnim.name') == 'singLEFT' then
triggerEvent('Camera Follow Pos',xx2-ofs,yy2)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT' then
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singUP' then
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN' then
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT-alt' then
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singUP-alt' then
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
end
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN-alt' then
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
end
if getProperty('boyfriend.animation.curAnim.name') == 'idle-alt' then
triggerEvent('Camera Follow Pos',xx2,yy2)
end
end
else
triggerEvent('Camera Follow Pos','','') -- Self explanatory
end
end

View File

@ -1,7 +1,7 @@
{
"song": {
"player1": "bf2",
"player2": "mom-car",
"player1": "bf",
"player2": "dad",
"events": [],
"notes": [
{
@ -4169,12 +4169,12 @@
"mustHitSection": true
}
],
"gfVersion": "gf-car",
"gfVersion": "gf",
"song": "High Erect",
"needsVoices": true,
"stage": "limo",
"stage": "stage",
"validScore": true,
"bpm": 125,
"speed": 2.4
}
}
}

View File

@ -1,8 +1,8 @@
{
"song": {
"player1": "bf-holding-gf",
"player1": "bf",
"events": [],
"gfVersion": "pico-speaker",
"gfVersion": "gf",
"notes": [
{
"sectionNotes": [
@ -3049,4 +3049,4 @@
"bpm": 178,
"speed": 1.75
}
}
}

View File

@ -1,8 +1,8 @@
{
"song": {
"player1": "bf-holding-gf",
"player1": "bf",
"events": [],
"gfVersion": "pico-speaker",
"gfVersion": "gf",
"notes": [
{
"sectionNotes": [
@ -5794,4 +5794,4 @@
"bpm": 178,
"speed": 2.6
}
}
}

View File

@ -1,8 +1,8 @@
{
"song": {
"player1": "bf-holding-gf",
"player1": "bf",
"events": [],
"gfVersion": "pico-speaker",
"gfVersion": "gf",
"notes": [
{
"sectionNotes": [
@ -4324,4 +4324,4 @@
"bpm": 178,
"speed": 2.2
}
}
}

File diff suppressed because it is too large Load Diff

300
main.lua
View File

@ -1,259 +1,81 @@
local Height = 0
local Width = 0
local state = require("modules.states.playstate")
local myMath = require("modules.math")
local myTypes = require("modules.types")
local conductor = require("modules.conductor")
local json = require("modules.json")
local files = require("modules.files")
local logger = require("modules.logging")
local socket = require("socket")
local logging= require("modules.logging")
local json = require("modules.json")
local logging = require("modules.logging")
local newVector2 = myTypes.Vector2(10, 10)
local songs = json.parse(files.read_file("songs.json"))
local startTime = 0
local curSong = "dad-battle"
local curDiffList = {"erect"}
local curDiff = "erect"
local songName = "stress"
local songDifficulty = "hard"
local curState = nil
local stateLoaded = false
local chartString = files.read_file(string.format("charts/%s/%s-%s.json", songName, songName, songDifficulty))
local pressed = {false,false,false}
if not chartString then
error("Chart couldn't be loaded!")
end
local chart = json.parse(chartString).song
local inst = love.audio.newSource(string.format("songs/%s/Inst.ogg", chart.song), "stream")
local voices = love.audio.newSource(string.format("songs/%s/Voices.ogg", chart.song), "stream")
local miss = love.audio.newSource("sounds/missnote1.ogg", "static")
conductor:setBpm(chart.bpm)
conductor:mapBpmChanges(chart)
local step = 0
local beat = 0
local playing = false
local characters = {}
local stage = json.parse(files.read_file("stages/stage.json"))
local unspawnedNotes = {}
local notes = {}
local directions = {
"LEFT",
"DOWN",
"UP",
"RIGHT"
}
local pressed = {
false,
false,
false,
false
}
local holded = {
false,
false,
false,
false
}
local receptors = {
}
function love.load()
characters.bf = myTypes.character("bf")
characters.bf.stagePosition = myTypes.Vector2(stage.boyfriend[1], stage.boyfriend[2])
characters.dad = myTypes.character("tankman")
characters.dad.stagePosition = myTypes.Vector2(stage.opponent[1], stage.opponent[2])
for index, section in next, chart.notes do
for index, note in next, section.sectionNotes do
local newNote = myTypes.note(note, section.mustHitSection)
table.insert(unspawnedNotes, newNote)
end
end
for i = 0, 3 do
local receptor = myTypes.Sprite("sprites/NOTE_assets.png", "sprites/NOTE_assets.json", false)
receptor:PlayAnimation("arrow"..directions[i+1], 25, false)
receptor.position = myTypes.Vector2(100 + (65 * i), 0)
receptor.ui = true -- So it doesnt move with the camera.
receptors[i + 1] = receptor
end
inst:play()
voices:play()
startTime = socket.gettime()
playing = true
end
local function checkNote(dir)
if pressed[dir] or holded[dir] then
pressed[dir] = false
holded[dir] = true
if receptors[dir].animation ~= string.lower(directions[dir]).." confirm" then
receptors[dir]:PlayAnimation(string.lower(directions[dir]).." press", 25, false)
end
return -- You dont check if you are already holding and not just pressing
end
pressed[dir] = true
for index, note in next, notes do
if note.position - conductor.songPosition < 200 then
if note.mustPress and not note.pressed and note.direction == dir then
characters.bf:PlayAnimation("sing"..directions[note.direction])
note.pressed = true
receptors[dir]:PlayAnimation(string.lower(directions[dir]).." confirm", 25, false)
table.remove(notes, index)
note:destroy()
end
end
end
end
-- for index, song in next, songs do
-- curSong = index
-- curDiff = song[1]
-- break
-- end
function love.update(dt)
if not playing then return end
local currentTime = socket.gettime()
local elapsed = math.floor((currentTime - startTime) * 1000)
conductor.songPosition = elapsed
local oldStep = step
local oldBeat = beat
step = conductor:getStepRounded(elapsed)
beat = conductor:getBeatRounded(elapsed)
if beat ~= oldBeat then
if beat % 2 == 0 then
-- gf:PlayAnimation("BF NOTE LEFT", 30, false)
for name, character in next, characters do
if not character.singing then
character:PlayAnimation("idle")
end
end
end
end
myTypes.updateSprites(dt)
if love.keyboard.isDown("a") then
checkNote(1)
if curState and curState.loaded then
if stateLoaded then
curState.update(dt)
else
holded[1] = false
pressed[1] = false
stateLoaded = true -- skipping this update frame
end
if love.keyboard.isDown("s") then
checkNote(2)
else
holded[2] = false
pressed[2] = false
end
if love.keyboard.isDown("up") then
checkNote(3)
else
holded[3] = false
pressed[3] = false
end
if love.keyboard.isDown("right") then
checkNote(4)
else
holded[4] = false
pressed[4] = false
end
for index, note in next, notes do
if note.position - conductor.songPosition < 0 then
if note.mustPress then
miss:stop()
miss:play()
characters.bf:PlayAnimation("sing"..directions[note.direction].."miss")
table.remove(notes, index)
end
elseif not curState then
if love.keyboard.isDown("return") then
curState = state(curSong, curDiff)
curState.load()
elseif love.keyboard.isDown("down") and not pressed[1] then
curSong = next(songs, curSong)
if not curSong then
curSong = next(songs)
curDiffList = songs[curSong]
else
curDiffList = songs[curSong]
end
curDiff = curDiffList[1]
pressed[1] = true
elseif love.keyboard.isDown("right") and not pressed[2] then
local curDiffNum = 0
for index, diff in next, curDiffList do
if diff == curDiff then
curDiffNum = index + 1
end
end
for name, character in next, characters do
if character.sprite.animation ~= "idle" and character.sprite.ended then
character:PlayAnimation("idle")
end
curDiff = curDiffList[curDiffNum] or curDiff
pressed[2] = true
elseif love.keyboard.isDown("left") and not pressed[3] then
local curDiffNum = 0
for index, diff in next, curDiffList do
if diff == curDiff then
curDiffNum = index - 1
end
end
curDiff = curDiffList[curDiffNum] or curDiff
pressed[3] = true
elseif not love.keyboard.isDown("down") then
pressed[1] = false
elseif not love.keyboard.isDown("right") then
pressed[2] = false
elseif not love.keyboard.isDown("left") then
pressed[3] = false
end
for index, note in next, unspawnedNotes do
if note.position - elapsed < 600 and note.mustPress then
note:spawn()
table.remove(unspawnedNotes, index)
table.insert(notes, note)
elseif note.position - elapsed < 600 and not note.mustPress then
table.remove(unspawnedNotes, index)
table.insert(notes, note)
end
end
for index, note in next, notes do
if note.spawned then
note.sprite.position = myTypes.Vector2(100 + 65 * (note.direction - 1), note.position - elapsed - 100)
if note.position - elapsed < -150 then
note:destroy()
table.remove(notes, index)
end
else
if note.position - elapsed < 0 then
table.remove(notes, index)
characters.dad:PlayAnimation("sing"..directions[note.direction])
note = nil
end
end
end
for index, receptor in next, receptors do
if receptor.ended and receptor.animation ~= "arrow"..directions[index] and receptor.animation ~= "" then
receptor:PlayAnimation("arrow"..directions[index], 25, false)
end
end
local section = chart.notes[math.floor(step / 16) + 1]
if section.mustHitSection then
myTypes.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate())
else
-- When i add DAD he will be here too
myTypes.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate())
end
if not inst:isPlaying() then
love.event.quit()
end
end
end
local mainCanvas = love.graphics.newCanvas(1920, 1080)
function love.draw()
love.graphics.setCanvas(mainCanvas)
love.graphics.clear()
love.graphics.circle("fill", 960, 59, 50000)
myTypes.drawSprites()
love.graphics.setCanvas()
love.graphics.draw(mainCanvas, 0, 0, 0, (love.graphics:getHeight() / 1080) * (4/3), love.graphics:getHeight() / 1080)
if curState and stateLoaded then
curState.draw()
else
love.graphics.print(string.format("Song: %s, Difficulty: %s, List: %s", curSong, curDiff, logging.dump(curDiffList)), x, y, r, sx, sy, ox, oy, kx, ky)
end
end
love.window.setMode(1280, 720, { fullscreen = false , resizable = true})

View File

@ -0,0 +1,281 @@
return function(songName, songDifficulty)
local state = {}
local Height = 0
local Width = 0
local myMath = require("modules.math")
local myTypes = require("modules.types")
local conductor = require("modules.conductor")
local json = require("modules.json")
local files = require("modules.files")
local logger = require("modules.logging")
local socket = require("socket")
local logging= require("modules.logging")
local newVector2 = myTypes.Vector2(10, 10)
local startTime = 0
local chartString = files.read_file(string.format("charts/%s/%s-%s.json", songName, songName, songDifficulty))
if not chartString then
error("Chart couldn't be loaded!")
end
local chart = json.parse(chartString).song
local inst = love.audio.newSource(string.format("songs/%s/Inst.ogg", chart.song), "stream")
local voices = love.audio.newSource(string.format("songs/%s/Voices.ogg", chart.song), "stream")
local miss = love.audio.newSource("sounds/missnote1.ogg", "static")
conductor:setBpm(chart.bpm)
conductor:mapBpmChanges(chart)
local step = 0
local beat = 0
local playing = false
local characters = {}
local stage = json.parse(files.read_file("stages/stage.json"))
local unspawnedNotes = {}
local notes = {}
local directions = {
"LEFT",
"DOWN",
"UP",
"RIGHT"
}
local pressed = {
false,
false,
false,
false
}
local holded = {
false,
false,
false,
false
}
local receptors = {
}
local function checkNote(dir)
if pressed[dir] or holded[dir] then
pressed[dir] = false
holded[dir] = true
if receptors[dir].animation ~= string.lower(directions[dir]).." confirm" then
receptors[dir]:PlayAnimation(string.lower(directions[dir]).." press", 25, false)
end
return -- You dont check if you are already holding and not just pressing
end
pressed[dir] = true
for index, note in next, notes do
if note.position - conductor.songPosition < 200 then
if note.mustPress and not note.pressed and note.direction == dir then
characters.bf:PlayAnimation("sing"..directions[note.direction])
note.pressed = true
receptors[dir]:PlayAnimation(string.lower(directions[dir]).." confirm", 25, false)
table.remove(notes, index)
note:destroy()
end
end
end
end
local elapsed = 0
function state.update(dt)
if not playing then return end
local currentTime = socket.gettime()
elapsed = elapsed + dt * 1000
conductor.songPosition = elapsed
local oldStep = step
local oldBeat = beat
step = conductor:getStepRounded(elapsed)
beat = conductor:getBeatRounded(elapsed)
if beat ~= oldBeat then
if beat % 2 == 0 then
-- gf:PlayAnimation("BF NOTE LEFT", 30, false)
for name, character in next, characters do
if not character.singing then
if name == "gf" then
if beat % 4 == 0 then
character:PlayAnimation("danceLeft")
end
else
character:PlayAnimation("idle")
end
end
end
end
end
local section = chart.notes[math.floor(step / 16) + 1]
if section.mustHitSection then
myTypes.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200))
else
myTypes.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200))
end
myTypes.updateSprites(dt)
if love.keyboard.isDown("a") then
checkNote(1)
else
holded[1] = false
pressed[1] = false
end
if love.keyboard.isDown("s") then
checkNote(2)
else
holded[2] = false
pressed[2] = false
end
if love.keyboard.isDown("up") then
checkNote(3)
else
holded[3] = false
pressed[3] = false
end
if love.keyboard.isDown("right") then
checkNote(4)
else
holded[4] = false
pressed[4] = false
end
for index, note in next, notes do
if note.position - conductor.songPosition < 0 then
if note.mustPress then
miss:stop()
miss:play()
characters.bf:PlayAnimation("sing"..directions[note.direction].."miss")
table.remove(notes, index)
end
end
end
for name, character in next, characters do
if name ~= "gf" and character.sprite.animation ~= "idle" and character.sprite.ended then
character:PlayAnimation("idle")
end
end
for index, note in next, unspawnedNotes do
if note.position - elapsed < 600 and note.mustPress then
note:spawn()
table.remove(unspawnedNotes, index)
table.insert(notes, note)
elseif note.position - elapsed < 600 and not note.mustPress then
table.remove(unspawnedNotes, index)
table.insert(notes, note)
end
end
for index, note in next, notes do
if note.spawned then
note.sprite.position = myTypes.Vector2(100 + 65 * (note.direction - 1), note.position - elapsed - 100)
if note.position - elapsed < -150 then
note:destroy()
table.remove(notes, index)
end
else
if note.position - elapsed < 50 then
table.remove(notes, index)
if section.altAnim then
characters.dad:PlayAnimation("sing"..directions[note.direction].."-alt")
else
characters.dad:PlayAnimation("sing"..directions[note.direction])
end
note = nil
end
end
end
for index, receptor in next, receptors do
if receptor.ended and receptor.animation ~= "arrow"..directions[index] and receptor.animation ~= "" then
receptor:PlayAnimation("arrow"..directions[index], 25, false)
end
end
if not inst:isPlaying() then
love.event.quit()
end
end
local mainCanvas = love.graphics.newCanvas(1920, 1080)
function state.draw()
love.graphics.setCanvas(mainCanvas)
love.graphics.clear()
love.graphics.circle("fill", 960, 59, 50000)
myTypes.drawSprites()
love.graphics.setCanvas()
love.graphics.draw(mainCanvas, 0, 0, 0, (love.graphics:getHeight() / 1080) * (4/3), love.graphics:getHeight() / 1080)
end
love.window.setMode(1280, 720, { fullscreen = false , resizable = true})
function state.load()
-- GF first so she is below other chars
characters.gf = myTypes.character(chart.gfVersion)
characters.gf.stagePosition = myTypes.Vector2(stage.girlfriend[1], stage.girlfriend[2])
characters.bf = myTypes.character(chart.player1)
characters.bf.stagePosition = myTypes.Vector2(stage.boyfriend[1], stage.boyfriend[2])
characters.dad = myTypes.character(chart.player2)
characters.dad.stagePosition = myTypes.Vector2(stage.opponent[1], stage.opponent[2])
for index, section in next, chart.notes do
for index, note in next, section.sectionNotes do
local newNote = myTypes.note(note, section.mustHitSection)
table.insert(unspawnedNotes, newNote)
end
end
for i = 0, 3 do
local receptor = myTypes.Sprite("sprites/NOTE_assets.png", "sprites/NOTE_assets.json", false)
receptor:PlayAnimation("arrow"..directions[i+1], 25, false)
receptor.position = myTypes.Vector2(100 + (65 * i), 0)
receptor.ui = true -- So it doesnt move with the camera.
receptors[i + 1] = receptor
end
inst:play()
voices:play()
elapsed = 0
playing = true
state.loaded = true
myTypes.cameraTarget = myTypes.Vector2()
end
return state
end

View File

@ -159,7 +159,12 @@ function module.drawSprites()
quad.offset.x = sprite.quads[sprite.animation][0].offset.x
quad.offset.y = sprite.quads[sprite.animation][0].offset.y
end
local cameraOffset = sprite.ui and module.Vector2() or module.cameraPosition
if sprite.flipX and not quad.flipped then
quad.flipped = true
quad.offset.x = -quad.offset.x
end
local cameraOffset = sprite.ui and module.Vector2() or module.cameraPosition or module.Vector2()
love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y), 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y)
::continue:: -- Point itself
@ -170,7 +175,12 @@ function module.drawSprites()
local quad = rect.quads[rect.animation][0]
local cameraOffset = rect.ui and module.Vector2() or module.cameraPosition
if rect.flipX and not quad.flipped then
quad.flipped = true
quad.offset.x = -quad.offset.x
end
local cameraOffset = rect.ui and module.Vector2() or module.cameraPosition or module.Vector2()
love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y), 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y)
::continue::

View File

@ -11,7 +11,7 @@ function CharacterClass:PlayAnimation(name)
local animName = self.animations[name]
self.sprite:PlayAnimation(animName, self.animInfo[name].fps)
self.sprite.extraOffset = module.myTypes.Vector2(self.animInfo[name].offsets[1] - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y)
self.singing = name ~= "idle"
self.singing = name ~= "idle" and name ~= "danceLeft" and name ~= "danceRight"
end
function module.character(name)
@ -46,9 +46,13 @@ function module.character(name)
newCharacter.animInfo[alias.anim] = alias
end
newCharacter:PlayAnimation("idle")
if newCharacter.animInfo["idle"] then
newCharacter:PlayAnimation("idle")
else
newCharacter:PlayAnimation("danceLeft")
end
return newCharacter
end
return module
return module

13
songs.json Normal file
View File

@ -0,0 +1,13 @@
{
"high": [
"erect"
],
"dad-battle": [
"erect"
],
"stress": [
"easy",
"normal",
"hard"
]
}

Binary file not shown.

Binary file not shown.

1315
sprites/DADDY_DEAREST.json Normal file

File diff suppressed because it is too large Load Diff

BIN
sprites/DADDY_DEAREST.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

2435
sprites/GF_assets.json Normal file

File diff suppressed because it is too large Load Diff

BIN
sprites/GF_assets.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

View File

@ -1,699 +0,0 @@
{
"TextureAtlas": {
"imagePath": "momCar.png",
"SubTexture": [
{
"_name": "MOM DOWN POSE0000",
"_x": "0",
"_y": "0",
"_width": "452",
"_height": "594",
"_frameX": "-1",
"_frameY": "-19",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0001",
"_x": "462",
"_y": "0",
"_width": "444",
"_height": "586",
"_frameX": "-3",
"_frameY": "-27",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0002",
"_x": "916",
"_y": "0",
"_width": "441",
"_height": "613",
"_frameX": "-18",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0003",
"_x": "1367",
"_y": "0",
"_width": "442",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0004",
"_x": "1819",
"_y": "0",
"_width": "451",
"_height": "613",
"_frameX": "0",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0005",
"_x": "2280",
"_y": "0",
"_width": "438",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0006",
"_x": "916",
"_y": "0",
"_width": "441",
"_height": "613",
"_frameX": "-18",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0007",
"_x": "1367",
"_y": "0",
"_width": "442",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0008",
"_x": "1819",
"_y": "0",
"_width": "451",
"_height": "613",
"_frameX": "0",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0009",
"_x": "2280",
"_y": "0",
"_width": "438",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0010",
"_x": "916",
"_y": "0",
"_width": "441",
"_height": "613",
"_frameX": "-18",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0011",
"_x": "1367",
"_y": "0",
"_width": "442",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0012",
"_x": "1819",
"_y": "0",
"_width": "451",
"_height": "613",
"_frameX": "0",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0013",
"_x": "2280",
"_y": "0",
"_width": "438",
"_height": "607",
"_frameX": "-7",
"_frameY": "-6",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "MOM DOWN POSE0014",
"_x": "916",
"_y": "0",
"_width": "441",
"_height": "613",
"_frameX": "-18",
"_frameY": "0",
"_frameWidth": "459",
"_frameHeight": "613"
},
{
"_name": "Mom Idle0000",
"_x": "2728",
"_y": "0",
"_width": "467",
"_height": "811",
"_frameX": "0",
"_frameY": "-2",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0001",
"_x": "3205",
"_y": "0",
"_width": "478",
"_height": "810",
"_frameX": "0",
"_frameY": "-3",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0002",
"_x": "3693",
"_y": "0",
"_width": "467",
"_height": "797",
"_frameX": "0",
"_frameY": "-17",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0003",
"_x": "4170",
"_y": "0",
"_width": "478",
"_height": "792",
"_frameX": "0",
"_frameY": "-22",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0004",
"_x": "4658",
"_y": "0",
"_width": "461",
"_height": "805",
"_frameX": "-4",
"_frameY": "-9",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0005",
"_x": "5129",
"_y": "0",
"_width": "472",
"_height": "801",
"_frameX": "-4",
"_frameY": "-13",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0006",
"_x": "5611",
"_y": "0",
"_width": "460",
"_height": "807",
"_frameX": "-4",
"_frameY": "-7",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0007",
"_x": "6081",
"_y": "0",
"_width": "471",
"_height": "804",
"_frameX": "-4",
"_frameY": "-10",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0008",
"_x": "6562",
"_y": "0",
"_width": "460",
"_height": "813",
"_frameX": "-4",
"_frameY": "-1",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0009",
"_x": "7032",
"_y": "0",
"_width": "471",
"_height": "811",
"_frameX": "-4",
"_frameY": "-3",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0010",
"_x": "7513",
"_y": "0",
"_width": "471",
"_height": "814",
"_frameX": "-4",
"_frameY": "0",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0011",
"_x": "0",
"_y": "824",
"_width": "475",
"_height": "812",
"_frameX": "-4",
"_frameY": "-2",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0012",
"_x": "485",
"_y": "824",
"_width": "460",
"_height": "814",
"_frameX": "-4",
"_frameY": "0",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Idle0013",
"_x": "955",
"_y": "824",
"_width": "471",
"_height": "812",
"_frameX": "-4",
"_frameY": "-2",
"_frameWidth": "479",
"_frameHeight": "814"
},
{
"_name": "Mom Left Pose0000",
"_x": "1436",
"_y": "824",
"_width": "564",
"_height": "803",
"_frameX": "-1",
"_frameY": "-7",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0001",
"_x": "2010",
"_y": "824",
"_width": "561",
"_height": "800",
"_frameX": "-4",
"_frameY": "-10",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0002",
"_x": "2581",
"_y": "824",
"_width": "558",
"_height": "810",
"_frameX": "-12",
"_frameY": "0",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0003",
"_x": "3149",
"_y": "824",
"_width": "568",
"_height": "806",
"_frameX": "-2",
"_frameY": "-4",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0004",
"_x": "3727",
"_y": "824",
"_width": "570",
"_height": "810"
},
{
"_name": "Mom Left Pose0005",
"_x": "4307",
"_y": "824",
"_width": "566",
"_height": "806",
"_frameX": "-4",
"_frameY": "-4",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0006",
"_x": "2581",
"_y": "824",
"_width": "558",
"_height": "810",
"_frameX": "-12",
"_frameY": "0",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0007",
"_x": "3149",
"_y": "824",
"_width": "568",
"_height": "806",
"_frameX": "-2",
"_frameY": "-4",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Left Pose0008",
"_x": "3727",
"_y": "824",
"_width": "570",
"_height": "810"
},
{
"_name": "Mom Left Pose0009",
"_x": "4307",
"_y": "824",
"_width": "566",
"_height": "806",
"_frameX": "-4",
"_frameY": "-4",
"_frameWidth": "570",
"_frameHeight": "810"
},
{
"_name": "Mom Pose Left0000",
"_x": "4883",
"_y": "824",
"_width": "662",
"_height": "762",
"_frameX": "0",
"_frameY": "0",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0001",
"_x": "5555",
"_y": "824",
"_width": "672",
"_height": "762"
},
{
"_name": "Mom Pose Left0002",
"_x": "6237",
"_y": "824",
"_width": "648",
"_height": "745",
"_frameX": "0",
"_frameY": "-17",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0003",
"_x": "6895",
"_y": "824",
"_width": "658",
"_height": "743",
"_frameX": "0",
"_frameY": "-19",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0004",
"_x": "0",
"_y": "1648",
"_width": "658",
"_height": "749",
"_frameX": "0",
"_frameY": "-13",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0005",
"_x": "668",
"_y": "1648",
"_width": "662",
"_height": "747",
"_frameX": "0",
"_frameY": "-15",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0006",
"_x": "1340",
"_y": "1648",
"_width": "648",
"_height": "749",
"_frameX": "0",
"_frameY": "-13",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0007",
"_x": "1998",
"_y": "1648",
"_width": "658",
"_height": "747",
"_frameX": "0",
"_frameY": "-15",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0008",
"_x": "0",
"_y": "1648",
"_width": "658",
"_height": "749",
"_frameX": "0",
"_frameY": "-13",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Pose Left0009",
"_x": "668",
"_y": "1648",
"_width": "662",
"_height": "747",
"_frameX": "0",
"_frameY": "-15",
"_frameWidth": "672",
"_frameHeight": "762"
},
{
"_name": "Mom Up Pose0000",
"_x": "2666",
"_y": "1648",
"_width": "455",
"_height": "840",
"_frameX": "0",
"_frameY": "-14",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0001",
"_x": "3131",
"_y": "1648",
"_width": "451",
"_height": "838",
"_frameX": "-10",
"_frameY": "-16",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0002",
"_x": "3592",
"_y": "1648",
"_width": "455",
"_height": "860",
"_frameX": "-6",
"_frameY": "-1",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0003",
"_x": "4057",
"_y": "1648",
"_width": "452",
"_height": "861",
"_frameX": "-16",
"_frameY": "0",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0004",
"_x": "4519",
"_y": "1648",
"_width": "460",
"_height": "857",
"_frameX": "-10",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0005",
"_x": "4989",
"_y": "1648",
"_width": "467",
"_height": "858",
"_frameX": "-6",
"_frameY": "-3",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0006",
"_x": "5466",
"_y": "1648",
"_width": "455",
"_height": "857",
"_frameX": "-6",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0007",
"_x": "5931",
"_y": "1648",
"_width": "452",
"_height": "858",
"_frameX": "-16",
"_frameY": "-3",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0008",
"_x": "4519",
"_y": "1648",
"_width": "460",
"_height": "857",
"_frameX": "-10",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0009",
"_x": "4989",
"_y": "1648",
"_width": "467",
"_height": "858",
"_frameX": "-6",
"_frameY": "-3",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0010",
"_x": "5466",
"_y": "1648",
"_width": "455",
"_height": "857",
"_frameX": "-6",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0011",
"_x": "5931",
"_y": "1648",
"_width": "452",
"_height": "858",
"_frameX": "-16",
"_frameY": "-3",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0012",
"_x": "4519",
"_y": "1648",
"_width": "460",
"_height": "857",
"_frameX": "-10",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"_name": "Mom Up Pose0013",
"_x": "4989",
"_y": "1648",
"_width": "467",
"_height": "858",
"_frameX": "-6",
"_frameY": "-3",
"_frameWidth": "473",
"_frameHeight": "861"
},
{
"__name": "Mom Up Pose0014",
"_x": "5466",
"_y": "1648",
"_width": "455",
"_height": "857",
"_frameX": "-6",
"_frameY": "-4",
"_frameWidth": "473",
"_frameHeight": "861"
}
]
}
}

View File

@ -3,13 +3,13 @@
"defaultZoom": 0.75,
"isPixelStage": false,
"boyfriend": [770, 100],
"girlfriend": [400, 130],
"boyfriend": [500, 100],
"girlfriend": [0, 100],
"opponent": [100, 100],
"hide_girlfriend": false,
"camera_boyfriend": [0, 0],
"camera_opponent": [500, 0],
"camera_opponent": [0, 0],
"camera_girlfriend": [0, 0],
"camera_speed": 1
}