From f0e9943e679dc58e76ac42efe1a8b7010fc2acc6 Mon Sep 17 00:00:00 2001 From: entar Date: Mon, 30 Jun 2025 00:03:45 +0700 Subject: [PATCH] new SharedVars class, made public too --- charts/guns/script.lua | 4 +-- charts/satin-panties/script.lua | 14 +++++----- charts/stress/script.lua | 4 +-- charts/ugh/script.lua | 14 +++++----- charts/winter-horrorland/script.lua | 4 +-- src/modules/types/character.lua | 6 ++++- src/modules/types/init.lua | 2 -- src/modules/types/note.lua | 12 +++++++-- src/modules/types/render.lua | 34 +++++++++++++++++++++++- src/modules/types/vector.lua | 16 ++++++++++++ src/states/playstate.lua | 22 ++++++++++++---- stages/billy.lua | 40 ++++++++++++++--------------- stages/limo.lua | 8 +----- stages/school.lua | 8 +++--- stages/spooky.lua | 4 +-- 15 files changed, 128 insertions(+), 64 deletions(-) diff --git a/charts/guns/script.lua b/charts/guns/script.lua index 5cdb289..e55c66a 100644 --- a/charts/guns/script.lua +++ b/charts/guns/script.lua @@ -8,7 +8,7 @@ local module = {} function module.onCreate(songName) if songName == "Guns" then - module.shared.canStart = false + sharedVars.canStart = false song = songName videoStream = love.video.newVideoStream(love.filesystem.newFile(videoPath)) videoStream:play() @@ -20,7 +20,7 @@ end function module.onUpdate() if videoStream then if not videoStream:isPlaying() then - module.shared.canStart = true + sharedVars.canStart = true video = nil videoStream = nil end diff --git a/charts/satin-panties/script.lua b/charts/satin-panties/script.lua index b1a8887..fcb2cd3 100644 --- a/charts/satin-panties/script.lua +++ b/charts/satin-panties/script.lua @@ -29,7 +29,7 @@ local degree = -45 function module.onCreate() lastChange = 0 - for index, receptor in next, module.shared.receptors do + for index, receptor in next, sharedVars.receptors do -- receptor.position.x = 100 -- receptor.position.y = 500 + 70 * (index - 1) -- receptor.rotation = degree @@ -38,17 +38,17 @@ end function module.onUpdate(dt, elapsed) if enabled then - -- for index, note in next, module.shared.notes do + -- for index, note in next, sharedVars.notes do -- if note.mustPress then - -- note.offset.x = math.sin(math.rad(degree)) * (note.position - elapsed) * module.shared.speed - -- note.offset.y = (math.cos(math.rad(degree)) * (note.position - elapsed) * module.shared.speed) - (note.position - elapsed) + -- note.offset.x = math.sin(math.rad(degree)) * (note.position - elapsed) * sharedVars.speed + -- note.offset.y = (math.cos(math.rad(degree)) * (note.position - elapsed) * sharedVars.speed) - (note.position - elapsed) -- -- note.sprite.rotation = degree -- end -- end - -- for index, hold in next, module.shared.holds do + -- for index, hold in next, sharedVars.holds do -- if hold.mustPress then - -- hold.offset.x = math.sin(math.rad(degree)) * (hold.position - elapsed) * module.shared.speed - -- hold.offset.y = (math.cos(math.rad(degree)) * (hold.position - elapsed) * module.shared.speed) - (hold.position - elapsed) + -- hold.offset.x = math.sin(math.rad(degree)) * (hold.position - elapsed) * sharedVars.speed + -- hold.offset.y = (math.cos(math.rad(degree)) * (hold.position - elapsed) * sharedVars.speed) - (hold.position - elapsed) -- hold.sprite.rotation = degree -- end -- end diff --git a/charts/stress/script.lua b/charts/stress/script.lua index 1a6337a..a9882ff 100644 --- a/charts/stress/script.lua +++ b/charts/stress/script.lua @@ -8,7 +8,7 @@ local module = {} function module.onCreate(songName) if songName == "Stress" then - module.shared.canStart = false + sharedVars.canStart = false song = songName videoStream = love.video.newVideoStream(love.filesystem.newFile(videoPath)) videoStream:play() @@ -20,7 +20,7 @@ end function module.onUpdate() if videoStream then if not videoStream:isPlaying() then - module.shared.canStart = true + sharedVars.canStart = true video = nil videoStream = nil end diff --git a/charts/ugh/script.lua b/charts/ugh/script.lua index e9fa227..fe26df8 100644 --- a/charts/ugh/script.lua +++ b/charts/ugh/script.lua @@ -11,15 +11,15 @@ local module = {} function module.onCreate(songName) random = math.random(1, 25) - if not module.shared.tankmanLoaded then - module.shared.tankmanLoaded = {} + if not sharedVars.tankmanLoaded then + sharedVars.tankmanLoaded = {} end - if not module.shared.tankmanLoaded[random] then - module.shared.tankmanLoaded[random] = love.audio.newSource(string.format("sounds/week7/death/jeffGameover-%s.ogg", random), "stream") + if not sharedVars.tankmanLoaded[random] then + sharedVars.tankmanLoaded[random] = love.audio.newSource(string.format("sounds/week7/death/jeffGameover-%s.ogg", random), "stream") end if songName == "Ugh" then - module.shared.canStart = false + sharedVars.canStart = false song = songName videoStream = love.video.newVideoStream(love.filesystem.newFile(videoPath)) videoStream:play() @@ -31,7 +31,7 @@ end function module.onUpdate() if videoStream then if not videoStream:isPlaying() then - module.shared.canStart = true + sharedVars.canStart = true video = nil videoStream = nil else @@ -61,7 +61,7 @@ function module.onClose() end function module.onDeath() - module.shared.tankmanLoaded[random]:play() + sharedVars.tankmanLoaded[random]:play() end return module \ No newline at end of file diff --git a/charts/winter-horrorland/script.lua b/charts/winter-horrorland/script.lua index 4ba2f69..4e82ee5 100644 --- a/charts/winter-horrorland/script.lua +++ b/charts/winter-horrorland/script.lua @@ -6,7 +6,7 @@ local time = 0 local started = false function module.onCreate() - module.shared.canStart = false + sharedVars.canStart = false render.cameraPosition = Vector2(500, 1000) started = false time = 0 @@ -16,7 +16,7 @@ function module.onUpdate(dt) time = time + dt if time > 5 and not started then started = true - module.shared.canStart = true + sharedVars.canStart = true end end diff --git a/src/modules/types/character.lua b/src/modules/types/character.lua index a9319d0..1d437e4 100644 --- a/src/modules/types/character.lua +++ b/src/modules/types/character.lua @@ -6,10 +6,12 @@ local files = require("modules.files") local json = require("modules.json") print("evil") +---Character class, child of Sprite class. Makes work with characters easier by calling some sprite functions with preset character file arguments. ---@class Character local CharacterClass = {} CharacterClass.__index = CharacterClass +--- @param name string function CharacterClass:PlayAnimation(name) local animName = self.animations[name] @@ -35,7 +37,9 @@ function CharacterClass:Destroy() self = nil end -function Character(name) +--- @param name string +--- @return Character +function _G.Character(name) local charFile = files.read_file(string.format("characters/%s.json", name)) if not charFile then error("Failed to load character "..name) diff --git a/src/modules/types/init.lua b/src/modules/types/init.lua index dcc18e3..4ba7933 100644 --- a/src/modules/types/init.lua +++ b/src/modules/types/init.lua @@ -1,9 +1,7 @@ for index, type in next, love.filesystem.getDirectoryItems("modules/types") do if type == "init.lua" then goto continue end - print(type) local file = type:split(".")[1] - print("modules.types."..file) require("modules.types."..file) diff --git a/src/modules/types/note.lua b/src/modules/types/note.lua index 51e43a6..305072e 100644 --- a/src/modules/types/note.lua +++ b/src/modules/types/note.lua @@ -11,6 +11,12 @@ local sprites = { "red" } +--- Make a note. +--- @param raw table +--- @param mustHitSection boolean +--- @param hold boolean +--- @param holdEnd boolean +--- @return Note function _G.Note(raw, mustHitSection, hold, holdEnd) local newNote = setmetatable({ @@ -31,7 +37,8 @@ function _G.Note(raw, mustHitSection, hold, holdEnd) return newNote end -function NoteClass:spawn() +--- Make the note sprite +function NoteClass:Spawn() local sprite = Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json") self.sprite = sprite @@ -62,7 +69,8 @@ function NoteClass:spawn() self.spawned = true end -function NoteClass:destroy() +--- Destroy the note +function NoteClass:Destroy() if self.sprite then self.sprite:Destroy() end diff --git a/src/modules/types/render.lua b/src/modules/types/render.lua index 4df8159..3e38e5a 100644 --- a/src/modules/types/render.lua +++ b/src/modules/types/render.lua @@ -5,10 +5,12 @@ local module = {} _G.render = module ---@class Sprite +---Sprite Sheet animatable class local Sprite = {} Sprite.__index = Sprite ---@class Image +---Image class local Image = {} Image.__index = Image @@ -19,6 +21,10 @@ local loadedShaders = {} local Sprites, Rects, Images, Atlases = {}, {}, {}, {} +--- Makes a sprite object. +--- @param image string +--- @param sheet string +--- @return Sprite function _G.Sprite(image, sheet) if not cachedQuads[sheet] then local sheetString = files.read_file(sheet) @@ -95,6 +101,11 @@ function _G.Sprite(image, sheet) end end +--- Plays a animation on the sprite. +--- @param name string +--- @param fps number +--- @param loop boolean +--- @param allowed table? function Sprite:PlayAnimation(name, fps, loop, allowed) self.animation = name self.fps = fps @@ -110,6 +121,7 @@ function Sprite:PlayAnimation(name, fps, loop, allowed) self.ended = false end +--- Destroys the Sprite / Rect object. function Sprite:Destroy() if self.rect then for index, rect in next, Rects do @@ -138,6 +150,7 @@ function Sprite:Destroy() end end +--- Destroys the image object. function Image:Destroy() for index, image in next, Images do if image == self then @@ -339,12 +352,16 @@ function module.drawUI() end end +--- Makes a new Rect object. +--- @param image string +--- @param sheet string +--- @return Sprite function _G.Rect(image, sheet) if not cachedQuads[sheet] then local sheetString = files.read_file(sheet) if not sheetString then - error("Failed to load", sheet) + error("Failed to load".. sheet) end local atlas = json.parse(sheetString).TextureAtlas.SubTexture @@ -415,11 +432,15 @@ function _G.Rect(image, sheet) end end +--- Puts a specific frame on the Rect. +--- @param name string +--- @param frame number function Sprite:Frame(name, frame) self.animation = name self.frame = frame end +--- Stops the sprite animation (Sprite will become invisible) function Sprite:StopAnimation() self.animation = nil self.frame = 0 @@ -433,6 +454,10 @@ function module.destroyAllSprites() Atlases = {} end +--- Makes an image. +--- @param path string +--- @param scrollFactor number? +--- @return Image function _G.Image(path, scrollFactor) if not cachedImages[path] then cachedImages[path] = love.graphics.newImage(path) @@ -504,17 +529,24 @@ function module.getShader(name) end ---@class Atlas +---Texture Atlas animatable object. local Atlas = {} Atlas.__index = Atlas +--- Plays a symbol on the atlas +--- @param name string function Atlas:PlayAnimation(name) self.atlas:play(name) end +--- Destroys the atlas function Atlas:Destroy() Atlases[self.index] = nil end +--- Makes an atlas. +--- @param folder string +--- @return Atlas function _G.Atlas(folder) local newAtlas = setmetatable({ atlas = love.animate.newTextureAtlas(), diff --git a/src/modules/types/vector.lua b/src/modules/types/vector.lua index 2c83e48..af24b4e 100644 --- a/src/modules/types/vector.lua +++ b/src/modules/types/vector.lua @@ -1,31 +1,47 @@ --- @class Vector2 +--- @field x number +--- @field y number local Vector2Class = {} Vector2Class.__index = Vector2Class +--- @param newVector2 Vector2 +--- @param position number +--- @return Vector2 function Vector2Class:Lerp(newVector2, position) return Vector2(Lerp(self.x, newVector2.x, position), Lerp(self.y, newVector2.y, position)) end +--- @return number, number function Vector2Class:Get() return self.x, self.y end +--- @return Vector2 function Vector2Class:Negate() return Vector2(-self.x, -self.y) end +--- @param addVector2 Vector2 +--- @return Vector2 function Vector2Class:Add(addVector2) return Vector2(self.x + addVector2.x, self.y + addVector2.y) end +--- @param num number +--- @return Vector2 function Vector2Class:Mul(num) return Vector2(self.x * num, self.y * num) end +--- @param num number +--- @return Vector2 function Vector2Class:Div(num) return Vector2(self.x / num, self.y / num) end +--- @param x number? +--- @param y number? +--- @return Vector2 function _G.Vector2(x, y) return setmetatable({x = x or 0, y = y or 0}, Vector2Class) end \ No newline at end of file diff --git a/src/states/playstate.lua b/src/states/playstate.lua index 4bd23bf..a873556 100644 --- a/src/states/playstate.lua +++ b/src/states/playstate.lua @@ -167,7 +167,21 @@ local function state(songName, songDifficulty, show) cdLength = cdLength + audio:getDuration() * 1000 end - local sharedVars = { + --- @class SharedVars + --- @field canStart boolean + --- @field screenSize Vector2 + --- @field canvasSize Vector2 + --- @field singVectors table + --- @field settings table + --- @field receptors table + --- @field splashes table + --- @field opponentReceptors table + --- @field health number + --- @field speed number + --- @field ui table + --- @field notes table + --- @field characters table + _G.sharedVars = { canStart = true, screenSize = Vector2(1280, 720), canvasSize = Vector2(1920,1080), @@ -598,7 +612,7 @@ local function state(songName, songDifficulty, show) hold.sprite.position = Vector2(receptors[hold.direction].position.x + hold.offset.x, settings.Downscroll and receptors[hold.direction].position.y - (hold.position-elapsed) * speed or receptors[hold.direction].position.y + (hold.position - elapsed) * speed) if (hold.position - elapsed) * speed < 10 then if love.keyboard.isDown(keyBinds[hold.direction]) then - if characters.bf.animInfo["sing"..directions[hold.direction].."-alt"] and (section.altAnim or hold.altAnim) then + if characters.bf.animInfo["sing"..directions[hold.direction].."-alt"] and (section and section.altAnim or hold.altAnim) then characters.bf:PlayAnimation("sing"..directions[hold.direction].."-alt") else characters.bf:PlayAnimation("sing"..directions[hold.direction]) @@ -616,7 +630,7 @@ local function state(songName, songDifficulty, show) else hold.sprite.position = Vector2(opponentReceptors[hold.direction].position.x + hold.offset.x, settings.Downscroll and opponentReceptors[hold.direction].position.y - (hold.position-elapsed) * speed or opponentReceptors[hold.direction].position.y + (hold.position - elapsed) * speed) if (hold.position - elapsed) * speed < 10 then - if characters.dad.animInfo["sing"..directions[hold.direction].."-alt"] and (section.altAnim or hold.altAnim) then + if characters.dad.animInfo["sing"..directions[hold.direction].."-alt"] and ( section and section.altAnim or hold.altAnim) then characters.dad:PlayAnimation("sing"..directions[hold.direction].."-alt") else characters.dad:PlayAnimation("sing"..directions[hold.direction]) @@ -960,8 +974,6 @@ local function state(songName, songDifficulty, show) for i, module in next, modules do if type(module) ~= "boolean" then - module.shared = sharedVars - if module.onCreate then module.onCreate(chart.song) end diff --git a/stages/billy.lua b/stages/billy.lua index 8c9ed04..25c488b 100644 --- a/stages/billy.lua +++ b/stages/billy.lua @@ -70,7 +70,7 @@ function module.onCreate() asset1.position.y = -270 asset1.position.x = -400 - for index, receptor in next, module.shared.opponentReceptors do + for index, receptor in next, sharedVars.opponentReceptors do receptor.ui = false receptor.position = Vector2(100 * (index - 1), 300) receptor.layer = -5 @@ -89,27 +89,27 @@ function module.onCreate() evilAtlas.position = Vector2(50000,50000) evilAtlas.layer = 1 - module.shared.settings.Downscroll = true -- forcing downscroll because i am not coding upscroll positions dawg + sharedVars.settings.Downscroll = true -- forcing downscroll because i am not coding upscroll positions dawg moveAway = false end function module.onEvent(event) if event.name == "ill make" then if event.var1 == "anim" then - oldPosition = module.shared.characters.dad.stagePosition - oldSpritePosition = module.shared.characters.dad.sprite.position - module.shared.characters.dad.stagePosition = Vector2(50000,5000) - module.shared.characters.dad.sprite.position = Vector2(50000,5000) + oldPosition = sharedVars.characters.dad.stagePosition + oldSpritePosition = sharedVars.characters.dad.sprite.position + sharedVars.characters.dad.stagePosition = Vector2(50000,5000) + sharedVars.characters.dad.sprite.position = Vector2(50000,5000) evilAtlas.position = Vector2(920, 600) evilAtlas:PlayAnimation("story_of_yourtalebilly") elseif event.var1 == "vid" then evilAtlas:Destroy() - module.shared.characters.dad.stagePosition = oldPosition - module.shared.characters.dad.sprite.position = oldPosition + sharedVars.characters.dad.stagePosition = oldPosition + sharedVars.characters.dad.sprite.position = oldPosition sillyVideo:play() startedEvilVideo = true nextplayerReceptorPosition = Vector2(324, -90) - for index, receptor in next, module.shared.opponentReceptors do + for index, receptor in next, sharedVars.opponentReceptors do receptor.ui = false receptor.position = Vector2(10000,10000) -- not visible honk mimimi receptor.layer = -5 @@ -120,10 +120,10 @@ function module.onEvent(event) elseif event.var1 == "pre" then nextplayerReceptorPosition = Vector2(600, -90) --Those are tweened to look bettah moveAway = true - module.shared.ui.timebar = false - module.shared.ui.health = false - module.shared.ui.score = false - module.shared.ui.ratings = false + sharedVars.ui.timebar = false + sharedVars.ui.health = false + sharedVars.ui.score = false + sharedVars.ui.ratings = false --[[ local ui = { timebar = true, @@ -146,26 +146,26 @@ function module.onUpdate(dt, el) rain:send("u_time", el/1000) currentplayerReceptorPosition = currentplayerReceptorPosition:Lerp(nextplayerReceptorPosition, .05) - for index, note in next, module.shared.notes do + for index, note in next, sharedVars.notes do if not note.mustPress then note.sprite.ui = false note.sprite.layer = -3 end end - for index, note in next, module.shared.holds do + for index, note in next, sharedVars.holds do if not note.mustPress then note.sprite.ui = false note.sprite.layer = -4 end end - for index, receptor in next, module.shared.receptors do + for index, receptor in next, sharedVars.receptors do receptor.position = Vector2(currentplayerReceptorPosition.x + 79 * (index - 1), currentplayerReceptorPosition.y) end - for index, receptor in next, module.shared.splashes do + for index, receptor in next, sharedVars.splashes do receptor.position = Vector2(currentplayerReceptorPosition.x - 30 + 79 * (index - 1), currentplayerReceptorPosition.y - 30) end - for index, receptor in next, module.shared.opponentReceptors do + for index, receptor in next, sharedVars.opponentReceptors do receptor.position = receptor.position:Lerp(moveAway and Vector2(100 * (index - 1), -100) or Vector2(100 * (index - 1), 300), .05) end @@ -178,7 +178,7 @@ function module.onUpdate(dt, el) if not sillyVideo:isPlaying() and not paused and startedEvilVideo and not endedEvilVideo then endedEvilVideo = true nextplayerReceptorPosition = Vector2(600, 430) - module.shared.globalShader = evilShader + sharedVars.globalShader = evilShader end end @@ -217,7 +217,7 @@ function module.onClose() introVideo:pause() introVideo = nil end - module.shared.globalShader = nil + sharedVars.globalShader = nil end return module \ No newline at end of file diff --git a/stages/limo.lua b/stages/limo.lua index 606f2cd..a2efb52 100644 --- a/stages/limo.lua +++ b/stages/limo.lua @@ -1,15 +1,9 @@ - - local dancers = {} -local curSong - return { onCreate = function(song) - curSong = song - dancers = {} - + local sunset = Image("images/limo/limoSunset.png", .2) sunset.position = Vector2(-1000, -100) sunset.resize = Vector2(1.5, 1.5) diff --git a/stages/school.lua b/stages/school.lua index 8c75068..8e85b6a 100644 --- a/stages/school.lua +++ b/stages/school.lua @@ -1,11 +1,11 @@ local module = {} function module.onCreate() - module.shared.canvasSize = Vector2(311, 161) - module.shared.screenSize = Vector2(967, 500) + sharedVars.canvasSize = Vector2(311, 161) + sharedVars.screenSize = Vector2(967, 500) - for index, dir in next, module.shared.singVectors do - module.shared.singVectors[index] = dir:Div(5) + for index, dir in next, sharedVars.singVectors do + sharedVars.singVectors[index] = dir:Div(5) end love.graphics.setDefaultFilter("nearest", "nearest", 0) diff --git a/stages/spooky.lua b/stages/spooky.lua index 351d7cc..70cdaaa 100644 --- a/stages/spooky.lua +++ b/stages/spooky.lua @@ -25,8 +25,8 @@ return { if lightningCountdown == 0 then mansion:PlayAnimation("halloweem bg lightning strike", 24, false) - module.shared.characters.bf:PlayAnimation("scared") - module.shared.characters.gf:PlayAnimation("scared") + sharedVars.characters.bf:PlayAnimation("scared") + sharedVars.characters.gf:PlayAnimation("scared") lightningCountdown = love.math.random(15, 20)