From 0736af3a5facf29e1913bc02884379dcc05989d9 Mon Sep 17 00:00:00 2001 From: Entarno54 Date: Sun, 1 Jun 2025 12:11:05 +0700 Subject: [PATCH] Optimized table usage as much as possible (more fps) --- .gitignore | 1 + charts/dad-battle/DIFFICULTYRANK.lua | 97 ----------------------- charts/dad-battle/changeFont.lua | 4 - charts/dad-battle/script 2 copy.lua | 113 --------------------------- modules/states/playstate.lua | 52 ++++++++---- modules/types.lua | 9 +-- modules/types/character.lua | 6 +- settings.json | 3 +- 8 files changed, 46 insertions(+), 239 deletions(-) delete mode 100644 charts/dad-battle/DIFFICULTYRANK.lua delete mode 100644 charts/dad-battle/changeFont.lua delete mode 100644 charts/dad-battle/script 2 copy.lua diff --git a/.gitignore b/.gitignore index 0667445..0c53cac 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ luac.out *.hex +settings.json \ No newline at end of file diff --git a/charts/dad-battle/DIFFICULTYRANK.lua b/charts/dad-battle/DIFFICULTYRANK.lua deleted file mode 100644 index e3f59ae..0000000 --- a/charts/dad-battle/DIFFICULTYRANK.lua +++ /dev/null @@ -1,97 +0,0 @@ --- 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 diff --git a/charts/dad-battle/changeFont.lua b/charts/dad-battle/changeFont.lua deleted file mode 100644 index b5b477d..0000000 --- a/charts/dad-battle/changeFont.lua +++ /dev/null @@ -1,4 +0,0 @@ -function onCreate() - setTextFont('scoreTxt', 'vcr.ttf') - setTextFont('timeTxt','timer.ttf') -end diff --git a/charts/dad-battle/script 2 copy.lua b/charts/dad-battle/script 2 copy.lua deleted file mode 100644 index 0697428..0000000 --- a/charts/dad-battle/script 2 copy.lua +++ /dev/null @@ -1,113 +0,0 @@ - -- 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 diff --git a/modules/states/playstate.lua b/modules/states/playstate.lua index 8f8833b..896cdb7 100644 --- a/modules/states/playstate.lua +++ b/modules/states/playstate.lua @@ -1,4 +1,4 @@ -return function(songName, songDifficulty) +local function state(songName, songDifficulty) local state = {} -- Returns needed functions for the state to work after loading it properly -- I NEED THEM IMPORTS @@ -43,6 +43,8 @@ return function(songName, songDifficulty) local characters = {} + local settings = {} + local directions = { "LEFT", "DOWN", @@ -50,6 +52,13 @@ return function(songName, songDifficulty) "RIGHT" } + local singVectors = { + singLEFT = myTypes.Vector2(20, 0), + singDOWN = myTypes.Vector2(0, -20), + singUP = myTypes.Vector2(0, 20), + singRIGHT = myTypes.Vector2(-20, 0) + } + local pressed = { false, false, @@ -106,7 +115,7 @@ return function(songName, songDifficulty) characters.bf:PlayAnimation("sing"..directions[note.direction]) note.pressed = true receptors[dir]:PlayAnimation(string.lower(directions[dir]).." confirm", 25, false) - table.remove(notes, index) + notes[index] = nil note:destroy() end end @@ -114,6 +123,7 @@ return function(songName, songDifficulty) end local elapsed = 0 + local actualElapsed = 0 function state.update(dt) if not playing then return end @@ -171,7 +181,8 @@ return function(songName, songDifficulty) local currentTime = socket.gettime() - elapsed = (currentTime - startTime) * 1000 - pauseTime + actualElapsed = (currentTime - startTime) * 1000 - pauseTime + elapsed = actualElapsed > 100 and actualElapsed - 100 or 0 conductor.songPosition = elapsed @@ -204,9 +215,11 @@ return function(songName, songDifficulty) 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)) + local currentSingVector = singVectors[characters.bf.animation] or myTypes.Vector2() + myTypes.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector) else - myTypes.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)) + local currentSingVector = singVectors[characters.dad.animation] or myTypes.Vector2() + myTypes.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector) end myTypes.updateSprites(dt) @@ -218,7 +231,7 @@ return function(songName, songDifficulty) miss:stop() miss:play() characters.bf:PlayAnimation("sing"..directions[note.direction].."miss") - table.remove(notes, index) + notes[index] = nil end end end @@ -232,24 +245,24 @@ return function(songName, songDifficulty) 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) + unspawnedNotes[index] = nil + notes[#notes+1] = note elseif note.position - elapsed < 600 and not note.mustPress then - table.remove(unspawnedNotes, index) - table.insert(notes, note) + unspawnedNotes[index] = nil + notes[#notes+1] = note end end for index, note in next, notes do if note.spawned then - note.sprite.position = myTypes.Vector2(400 + 65 * (note.direction - 1), note.position - elapsed - 100) + note.sprite.position = myTypes.Vector2(400 + 65 * (note.direction - 1), settings.Downscroll and 430 - (note.position-elapsed-100) or note.position - elapsed-100) if note.position - elapsed < -150 then note:destroy() - table.remove(notes, index) + notes[index] = nil end else if note.position - elapsed < 50 then - table.remove(notes, index) + notes[index] = nil if section.altAnim or note.altAnim then characters.dad:PlayAnimation("sing"..directions[note.direction].."-alt") else @@ -312,7 +325,7 @@ return function(songName, songDifficulty) 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) + unspawnedNotes[#unspawnedNotes+1] = newNote end end @@ -320,23 +333,24 @@ return function(songName, songDifficulty) local receptor = myTypes.Sprite("sprites/NOTE_assets.png", "sprites/NOTE_assets.json") receptor:PlayAnimation("arrow"..directions[i+1], 25, false) - receptor.position = myTypes.Vector2(400 + (65 * i), 0) + receptor.position = myTypes.Vector2(400 + (65 * i), settings.Downscroll and 0 or 430) receptor.ui = true -- So it doesnt move with the camera. receptors[i + 1] = receptor end - state.loaded = true + myTypes.cameraTarget = myTypes.Vector2() - local settings = json.parse(files.read_file("settings.json")) + settings = json.parse(files.read_file("settings.json")) if not settings then error("Failed to load settings") end keyBinds = settings.Keybinds + state.loaded = true end function state.finish() @@ -347,6 +361,7 @@ return function(songName, songDifficulty) end --waiting till the song actually plays. elapsed = 0 + actualElapsed = 0 playing = true @@ -355,3 +370,6 @@ return function(songName, songDifficulty) return state end + + +return state \ No newline at end of file diff --git a/modules/types.lua b/modules/types.lua index 73aaec4..c7b7e6b 100644 --- a/modules/types.lua +++ b/modules/types.lua @@ -91,7 +91,7 @@ function module.Sprite(image, sheet) newSprite.quads = quads - table.insert(Sprites, newSprite) + Sprites[#Sprites+1] = newSprite return newSprite end @@ -108,7 +108,7 @@ function Sprite:Destroy() if self.rect then for index, rect in next, Rects do if rect == self then - table.remove(Rects, index) + Rects[index] = nil -- for name, animation in next, rect.quads do -- for index, quad in next, animation do -- quad:release() @@ -120,7 +120,7 @@ function Sprite:Destroy() else for index, sprite in next, Sprites do if sprite == self then - table.remove(Sprites, index) + Sprites[index] = nil -- for name, animation in next, sprite.quads do -- for index, quad in next, animation do -- quad:release() @@ -161,7 +161,6 @@ function module.updateSprites(dt) end function module.drawSprites() - print(logging.dump(module.cameraPosition)) for index, sprite in next, Sprites do if not sprite.animation or not sprite.quads or not sprite.quads[sprite.animation] then goto continue end -- For some reason OG LUA doesnt have continue -- So im forced to use goto ::continue:: since it goes straight to the last point of the cycle @@ -252,7 +251,7 @@ function module.Rect(image, sheet) newSprite.quads = quads - table.insert(Rects, newSprite) + Rects[#Rects+1] = newSprite return newSprite end diff --git a/modules/types/character.lua b/modules/types/character.lua index f61175c..6780049 100644 --- a/modules/types/character.lua +++ b/modules/types/character.lua @@ -18,6 +18,7 @@ function CharacterClass:PlayAnimation(name) self.sprite.extraOffset = module.myTypes.Vector2(self.animInfo[name].offsets[1] - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y) end self.singing = name ~= "idle" and name ~= "danceLeft" and name ~= "danceRight" + self.animation = name end function module.character(name) @@ -45,10 +46,11 @@ function module.character(name) stagePosition = module.myTypes.Vector2(0,0), -- Changeable stageCamera = module.myTypes.Vector2(parsed.camera_position[1], parsed.camera_position[2]), flipX = parsed.flip_x, - beats = parsed.beats or 4 + beats = parsed.beats or 4, + animation = "idle" }, CharacterClass) - for index, alias in next, parsed.animations do + for index, alias in ipairs(parsed.animations) do newCharacter.animations[alias.anim] = alias.name newCharacter.animInfo[alias.anim] = alias end diff --git a/settings.json b/settings.json index e9e081a..846def9 100644 --- a/settings.json +++ b/settings.json @@ -1,5 +1,6 @@ { "Keybinds": [ "a", "s", "up", "right" - ] + ], + "Downscroll": true } \ No newline at end of file