New states began, completely changed the typing system and made it easier to mod

This commit is contained in:
entar 2025-06-29 23:25:19 +07:00
parent 1284b1f4b2
commit 6d2db400d9
29 changed files with 556 additions and 489 deletions

View File

@ -1,7 +1,7 @@
local module = {}
local myMath = require("modules.math")
local myTypes = require("modules.types")
local lastChange = 0

View File

@ -0,0 +1,23 @@
local module = {}
local time = 0
local started = false
function module.onCreate()
module.shared.canStart = false
render.cameraPosition = Vector2(500, 1000)
started = false
time = 0
end
function module.onUpdate(dt)
time = time + dt
if time > 5 and not started then
started = true
module.shared.canStart = true
end
end
return module

View File

@ -1,4 +1,7 @@
require("modules.loveanimate")
print("Loaded")
require("modules.types")
require("modules.math")
curChar = "bf"
@ -7,14 +10,16 @@ local gamePath = love.filesystem.getSourceBaseDirectory() -- Assuming it's alway
-- love TaggedEngine.love --fused
local mounted = love.filesystem.mount(gamePath, "") -- Mounting the game directory, should be accessible like if normal.
local myTypes = require("modules.types")
assert(mounted, "Couldn't mount the game directory.")
local states = {
playstate = "states.playstate",
freeplaystate = "states.freeplaystate",
resultsstate = "states.resultsstate"
resultsstate = "states.resultsstate",
menustate = "states.menustate",
weekstate = "states.weekstate"
}
local curState
@ -30,7 +35,7 @@ function setState(name, ...)
curState.quit = function(accuracy, score)
curState = nil
stateLoaded = false
myTypes.destroyAllSprites()
render.destroyAllSprites()
setState("freeplaystate")
end
@ -38,7 +43,7 @@ function setState(name, ...)
local lastStateName = curState.name
curState = nil
stateLoaded = false
myTypes.destroyAllSprites()
render.destroyAllSprites()
setState(lastStateName, ...)
end
@ -46,7 +51,7 @@ function setState(name, ...)
curState.changeState = function(...)
curState = nil
stateLoaded = false
myTypes.destroyAllSprites()
render.destroyAllSprites()
setState(...)
end

View File

@ -1,6 +1,7 @@
local myMath = require("modules.math")
local logging = require("modules.logging")
--- @class Conductor
local conductor = {}
conductor.bpm = 120
conductor.crochet = 1000
@ -86,7 +87,7 @@ function conductor:mapBpmChanges(song)
table.insert(self.bpmChangeMap, change)
end
local deltaSteps = myMath.round(self:getSectionBeats(song, index) * 4)
local deltaSteps = Round(self:getSectionBeats(song, index) * 4)
totalSteps = totalSteps + deltaSteps
totalPos = (totalPos + (60/curBPM) * 1000 / 4) * deltaSteps
end

View File

@ -1,11 +1,7 @@
local module = {}
function module.lerp(a, b,c)
function Lerp(a, b,c)
return a + (b - a) * c
end
function module.round(a)
function Round(a)
return math.floor(a + .5)
end
return module
end

View File

@ -1,10 +1,12 @@
print("init")
local module = {}
chars = module
-- local myTypes = require("modules.types")
local files = require("modules.files")
local json = require("modules.json")
local logging = require("modules.logging")
print("evil")
---@class Character
local CharacterClass = {}
CharacterClass.__index = CharacterClass
@ -12,11 +14,11 @@ function CharacterClass:PlayAnimation(name)
local animName = self.animations[name]
if self.animInfo[name].random then
self.sprite.extraOffset = module.myTypes.Vector2(self.animInfo[name].offsets[1] * (self.flipX and -1 or 1) - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y)
self.sprite.extraOffset = Vector2(self.animInfo[name].offsets[1] * (self.flipX and -1 or 1) - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y)
self.sprite:PlayAnimation(animName..string.format("%s ", math.random(self.animInfo[name].random[1], self.animInfo[name].random[2])), self.animInfo[name].fps)
else
self.sprite.extraOffset = module.myTypes.Vector2(self.animInfo[name].offsets[1] * (self.flipX and -1 or 1) - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y)
self.sprite.extraOffset = Vector2(self.animInfo[name].offsets[1] * (self.flipX and -1 or 1) - self.stagePosition.x, self.animInfo[name].offsets[2] - self.stagePosition.y)
self.sprite.allowedFrames = self.animInfo[name].indices and #self.animInfo[name].indices > 0 and self.animInfo[name].indices
self.sprite.allowedFrame = 1
@ -33,7 +35,7 @@ function CharacterClass:Destroy()
self = nil
end
function module.character(name)
function Character(name)
local charFile = files.read_file(string.format("characters/%s.json", name))
if not charFile then
error("Failed to load character "..name)
@ -44,8 +46,8 @@ function module.character(name)
local image = parsed.image..".png"
local sheet = parsed.image..".json"
local sprite = module.myTypes.Sprite(image, sheet)
sprite.position = module.myTypes.Vector2(parsed.position[1], parsed.position[2])
local sprite = Sprite(image, sheet)
sprite.position = Vector2(parsed.position[1], parsed.position[2])
sprite.flipX = parsed.flip_x
sprite.layer = 5
@ -56,8 +58,8 @@ function module.character(name)
animInfo = {},
sprite = sprite,
singing = false,
stagePosition = module.myTypes.Vector2(0,0), -- Changeable
stageCamera = module.myTypes.Vector2(parsed.camera_position[1], parsed.camera_position[2]),
stagePosition = Vector2(0,0), -- Changeable
stageCamera = Vector2(parsed.camera_position[1], parsed.camera_position[2]),
flipX = parsed.flip_x,
beats = parsed.beats or 4,
animation = "idle",
@ -91,7 +93,7 @@ function module.preload(name)
local image = parsed.image..".png"
local sheet = parsed.image..".json"
module.myTypes.preload(image, sheet)
render.preload(image, sheet)
end
return module

View File

@ -1,29 +1,11 @@
local module = {}
for index, type in next, love.filesystem.getDirectoryItems("modules/types") do
if type == "init.lua" then goto continue end
local noteclass = require("modules.types.note")
local characterclass = require("modules.types.character")
local renderClasses = require("modules.types.render")
local vectorClass = require("modules.types.vector")
print(type)
local file = type:split(".")[1]
print("modules.types."..file)
noteclass.types = module
module.note = noteclass.note
require("modules.types."..file)
characterclass.myTypes = module
module.character = characterclass.character
module.preloadChar = characterclass.preload
renderClasses.myTypes = module
module.Sprite = renderClasses.Sprite
module.Rect = renderClasses.Rect
module.Image = renderClasses.Image
module.destroyAllSprites = renderClasses.destroyAllSprites
module.drawSprites = renderClasses.drawSprites
module.updateSprites = renderClasses.updateSprites
module.preload = renderClasses.preLoad
module.drawUI = renderClasses.drawUI
module.Vector2 = vectorClass.Vector2
module.render = renderClasses
return module
::continue::
end

View File

@ -1,5 +1,6 @@
local module = {}
---@class Note
local NoteClass = {}
NoteClass.__index = NoteClass
@ -10,7 +11,7 @@ local sprites = {
"red"
}
function module.note(raw, mustHitSection, hold, holdEnd)
function _G.Note(raw, mustHitSection, hold, holdEnd)
local newNote = setmetatable({
position = raw[1],
@ -24,14 +25,14 @@ function module.note(raw, mustHitSection, hold, holdEnd)
last = holdEnd,
hitHealth = 0.02,
missHealth = 0.05,
offset = module.types.Vector2()
offset = Vector2()
}, NoteClass)
return newNote
end
function NoteClass:spawn()
local sprite = module.types.Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
local sprite = Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
self.sprite = sprite
sprite.layer = 10
@ -43,7 +44,7 @@ function NoteClass:spawn()
sprite.layer = 10
spriteName = string.format("%s hold end", sprites[self.direction])
if self.flipY then
sprite.extraOffset = module.types.Vector2(0, -70)
sprite.extraOffset = Vector2(0, -70)
end
else
spriteName = string.format("%s hold piece", sprites[self.direction])

View File

@ -2,10 +2,13 @@ local json = require("modules.json")
local files = require("modules.files")
local module = {}
_G.render = module
---@class Sprite
local Sprite = {}
Sprite.__index = Sprite
---@class Image
local Image = {}
Image.__index = Image
@ -16,7 +19,7 @@ local loadedShaders = {}
local Sprites, Rects, Images, Atlases = {}, {}, {}, {}
function module.Sprite(image, sheet)
function _G.Sprite(image, sheet)
if not cachedQuads[sheet] then
local sheetString = files.read_file(sheet)
if not sheetString then
@ -34,9 +37,9 @@ function module.Sprite(image, sheet)
fps = 10,
animation = nil,
frame = 0,
position = module.myTypes.Vector2(200, 100), -- changeable
position = Vector2(200, 100), -- changeable
looping = false,
extraOffset = module.myTypes.Vector2(0,0),
extraOffset = Vector2(0,0),
rect = false,
modifier = 1,
layer = 0
@ -60,7 +63,7 @@ function module.Sprite(image, sheet)
quads[name:sub(0, name:len() - 4)] = {}
end
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = Vector2(frameX or 0, frameY or 0), resize = Vector2(1,1)}
end
newSprite.quads = quads
@ -77,9 +80,9 @@ function module.Sprite(image, sheet)
fps = 10,
animation = nil,
frame = 0,
position = module.myTypes.Vector2(200, 100), -- changeable
position = Vector2(200, 100), -- changeable
looping = false,
extraOffset = module.myTypes.Vector2(0,0),
extraOffset = Vector2(0,0),
rect = false,
modifier = 1,
allowedFrame = 0,
@ -168,7 +171,7 @@ function module.updateSprites(dt)
sprite.elapsed = 0
end
-- sprite.quads[sprite.animation][sprite.frame].resize = module.myTypes.Vector2(love.graphics.getWidth() / 1920, love.graphics.getHeight() / 1080)
-- sprite.quads[sprite.animation][sprite.frame].resize = Vector2(love.graphics.getWidth() / 1920, love.graphics.getHeight() / 1080)
::continue:: -- At the end. always.
end
@ -178,10 +181,10 @@ function module.updateSprites(dt)
end
if not module.cameraPosition then
module.cameraPosition = module.myTypes.Vector2()
module.cameraPosition = Vector2()
end
module.cameraPosition = module.cameraPosition:Lerp(module.cameraTarget or module.myTypes.Vector2(0,0), .2)
module.cameraPosition = module.cameraPosition:Lerp(module.cameraTarget or Vector2(0,0), .2)
end
local leftOvers = {}
@ -221,7 +224,7 @@ function module.drawSprites()
end
if thing.isImage then
local cameraOffset = thing.ui and module.myTypes.Vector2() or module.cameraPosition
local cameraOffset = thing.ui and Vector2() or module.cameraPosition
if thing.shader and loadedShaders[thing.shader] then
love.graphics.setShader(loadedShaders[thing.shader])
end
@ -244,7 +247,7 @@ function module.drawSprites()
quad.offset.x = -quad.offset.x
end
local cameraOffset = sprite.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
local cameraOffset = sprite.ui and Vector2() or module.cameraPosition or Vector2()
if sprite.shader and loadedShaders[sprite.shader] then
love.graphics.setShader(loadedShaders[sprite.shader])
@ -264,7 +267,7 @@ function module.drawSprites()
quad.offset.x = -quad.offset.x
end
local cameraOffset = rect.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
local cameraOffset = rect.ui and Vector2() or module.cameraPosition or Vector2()
if rect.shader and loadedShaders[rect.shader] then
love.graphics.setShader(loadedShaders[rect.shader])
@ -275,7 +278,7 @@ function module.drawSprites()
love.graphics.setShader()
end
elseif thing.isAtlas then
local cameraOffset = thing.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
local cameraOffset = thing.ui and Vector2() or module.cameraPosition or Vector2()
thing.atlas:draw(thing.position.x + (cameraOffset.x * thing.modifier), thing.position.y + (cameraOffset.y * thing.modifier), thing.rotation, thing.resize.x, thing.resize.y)
end
@ -288,7 +291,7 @@ function module.drawUI()
for index, thing in ipairs(leftOvers) do
if thing.isImage then
local cameraOffset = thing.ui and module.myTypes.Vector2() or module.cameraPosition
local cameraOffset = thing.ui and Vector2() or module.cameraPosition
love.graphics.draw(thing.image, thing.position.x + cameraOffset.x * thing.modifier , thing.position.y + cameraOffset.y * thing.modifier, thing.rotation, thing.resize.x * (thing.flipX and -1 or 1), thing.resize.y * (thing.flipY and -1 or 1))
elseif thing.isSprite then
local sprite = thing
@ -308,7 +311,7 @@ function module.drawUI()
quad.offset.y = - quad.offset.y
end
local cameraOffset = sprite.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
local cameraOffset = sprite.ui and Vector2() or module.cameraPosition or Vector2()
love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x * sprite.modifier), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y * sprite.modifier), sprite.rotation or 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y* (sprite.flipY and -1 or 1))
end
@ -326,7 +329,7 @@ function module.drawUI()
quad.offset.y = - quad.offset.y
end
local cameraOffset = rect.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
local cameraOffset = rect.ui and Vector2() or module.cameraPosition or Vector2()
love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x * rect.modifier), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y * rect.modifier), rect.rotation or 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y* (rect.flipY and -1 or 1))
end
@ -336,7 +339,7 @@ function module.drawUI()
end
end
function module.Rect(image, sheet)
function _G.Rect(image, sheet)
if not cachedQuads[sheet] then
local sheetString = files.read_file(sheet)
@ -355,9 +358,9 @@ function module.Rect(image, sheet)
fps = 10,
animation = nil,
frame = 0,
position = module.myTypes.Vector2(200, 100), -- changeable
position = Vector2(200, 100), -- changeable
looping = false,
extraOffset = module.myTypes.Vector2(0,0),
extraOffset = Vector2(0,0),
rect = false,
modifier = 1,
layer = 0
@ -381,7 +384,7 @@ function module.Rect(image, sheet)
quads[name:sub(0, name:len() - 4)] = {}
end
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = Vector2(frameX or 0, frameY or 0), resize = Vector2(1,1)}
end
newSprite.quads = quads
@ -398,9 +401,9 @@ function module.Rect(image, sheet)
fps = 10,
animation = nil,
frame = 0,
position = module.myTypes.Vector2(200, 100), -- changeable
position = Vector2(200, 100), -- changeable
looping = false,
extraOffset = module.myTypes.Vector2(0,0),
extraOffset = Vector2(0,0),
rect = false,
modifier = 1,
layer = 0
@ -430,15 +433,15 @@ function module.destroyAllSprites()
Atlases = {}
end
function module.Image(path, scrollFactor)
function _G.Image(path, scrollFactor)
if not cachedImages[path] then
cachedImages[path] = love.graphics.newImage(path)
end
local newImage = setmetatable({
image = cachedImages[path],
resize = module.myTypes.Vector2(1,1),
position = module.myTypes.Vector2(),
resize = Vector2(1,1),
position = Vector2(),
modifier = scrollFactor or 1,
rotation = 0,
layer = 0
@ -478,7 +481,7 @@ function module.preLoad(imagePath, sheetPath)
if not quads[name:sub(0, name:len() - 4)] then
quads[name:sub(0, name:len() - 4)] = {}
end
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, image), offset = Vector2(frameX or 0, frameY or 0), resize = Vector2(1,1)}
end
cachedQuads[sheetPath] = {quads = quads, image = image}
@ -500,6 +503,7 @@ function module.getShader(name)
return loadedShaders[name]
end
---@class Atlas
local Atlas = {}
Atlas.__index = Atlas
@ -511,12 +515,12 @@ function Atlas:Destroy()
Atlases[self.index] = nil
end
function module.Atlas(folder)
function _G.Atlas(folder)
local newAtlas = setmetatable({
atlas = love.animate.newTextureAtlas(),
position = module.myTypes.Vector2(),
position = Vector2(),
rotation = 0,
resize = module.myTypes.Vector2(1,1),
resize = Vector2(1,1),
index = 0,
modifier = 1
}, Atlas)

View File

@ -1,36 +1,31 @@
local myMath = require("modules.math")
--- @class Vector2
local Vector2Class = {}
Vector2Class.__index = Vector2Class
local module = {}
local Vector2 = {}
Vector2.__index = Vector2
function Vector2:Lerp(newVector2, position)
return module.Vector2(myMath.lerp(self.x, newVector2.x, position), myMath.lerp(self.y, newVector2.y, position))
function Vector2Class:Lerp(newVector2, position)
return Vector2(Lerp(self.x, newVector2.x, position), Lerp(self.y, newVector2.y, position))
end
function Vector2:Get()
function Vector2Class:Get()
return self.x, self.y
end
function Vector2:Negate()
return module.Vector2(-self.x, -self.y)
function Vector2Class:Negate()
return Vector2(-self.x, -self.y)
end
function Vector2:Add(addVector2)
return module.Vector2(self.x + addVector2.x, self.y + addVector2.y)
function Vector2Class:Add(addVector2)
return Vector2(self.x + addVector2.x, self.y + addVector2.y)
end
function Vector2:Mul(num)
return module.Vector2(self.x * num, self.y * num)
function Vector2Class:Mul(num)
return Vector2(self.x * num, self.y * num)
end
function Vector2:Div(num)
return module.Vector2(self.x / num, self.y / num)
function Vector2Class:Div(num)
return Vector2(self.x / num, self.y / num)
end
function module.Vector2(x, y)
return setmetatable({x = x or 0, y = y or 0}, Vector2)
end
return module
function _G.Vector2(x, y)
return setmetatable({x = x or 0, y = y or 0}, Vector2Class)
end

View File

@ -3,8 +3,8 @@ return function()
local dataFolder = love.filesystem.getSaveDirectory()
local myMath = require("modules.math")
local myTypes = require("modules.types")
local files = require("modules.files")
local json = require("modules.json")
local logging = require("modules.logging")
@ -27,7 +27,7 @@ return function()
local icon = song.icon
if not icon then goto evilgoto end
local spriteicon = myTypes.Sprite(string.format("sprites/freeplay/icons/%s.png", icon),
local spriteicon = Sprite(string.format("sprites/freeplay/icons/%s.png", icon),
string.format("sprites/freeplay/icons/%s.json", icon))
spriteicon:PlayAnimation("idle", .005, false)
spriteicon.frame = 1
@ -81,41 +81,41 @@ return function()
local function setup()
start = false
bg = myTypes.Image("images/menuBG.png", 0)
bg = Image("images/menuBG.png", 0)
bg.ui = false
bg.layer = -10
-- NO MORE GF
left = myTypes.Image("images/MenuLeft.png")
left = Image("images/MenuLeft.png")
left.layer = 0
left.resize = myTypes.Vector2(2, 1)
left.resize = Vector2(2, 1)
arrow = myTypes.Sprite("sprites/freeplay/freeplaySelector.png", "sprites/freeplay/freeplaySelector.json")
arrow = Sprite("sprites/freeplay/freeplaySelector.png", "sprites/freeplay/freeplaySelector.json")
arrow.position.y = 330
arrow.position.x = 20
arrow.layer = 1
arrow.resize = myTypes.Vector2(.5, .5)
arrow.resize = Vector2(.5, .5)
arrow.flipX = true
arrow:PlayAnimation("arrow pointer loop", 24, true)
-- myTypes.render.preLoad(
-- render.preLoad(
-- "sprites/freeplay/freeplaySelector_pico.png",
-- "sprites/freeplay/freeplaySelector.json"
-- )
myTypes.render.preLoad("sprites/freeplay/freeplaySelector_pico.png",
render.preLoad("sprites/freeplay/freeplaySelector_pico.png",
"sprites/freeplay/freeplaySelector_pico.json")
diffIMG = myTypes.Sprite("images/diff/diffList.png", "images/diff/diffList.json") --look there was a different plan going in
diffIMG = Sprite("images/diff/diffList.png", "images/diff/diffList.json") --look there was a different plan going in
diffIMG:PlayAnimation(curDiff, 24, false)
diffIMG.position = myTypes.Vector2(200, 320)
diffIMG.position = Vector2(200, 320)
diffIMG.layer = 2
charIcon = myTypes.Sprite("sprites/menu/charIcons.png", "sprites/menu/charIcons.json")
charIcon = Sprite("sprites/menu/charIcons.png", "sprites/menu/charIcons.json")
charIcon:PlayAnimation(curChar .. iconNum, 24, false)
charIcon.position = myTypes.Vector2(175, 100)
charIcon.resize = myTypes.Vector2(0.25, 0.25) --this doesnt work and idk why
charIcon.position = Vector2(175, 100)
charIcon.resize = Vector2(0.25, 0.25) --this doesnt work and idk why
charIcon.layer = 2 --since they won't overlap this is ok i think
freaky:play()
@ -139,7 +139,7 @@ return function()
end
local function run()
myTypes.destroyAllSprites()
render.destroyAllSprites()
freaky:stop()
state.changeState("playstate", curSong.name, curDiff, true)
@ -171,15 +171,15 @@ return function()
end
end
bfAtlas:update(dt)
myTypes.render.cameraTarget = myTypes.Vector2(0, 0)
myTypes.updateSprites(dt)
render.cameraTarget = Vector2(0, 0)
render.updateSprites(dt)
end
function state.draw()
love.graphics.setDefaultFilter("nearest", "nearest")
myTypes.drawSprites()
render.drawSprites()
evilCurIndex = myMath.lerp(evilCurIndex, curIndex, .3)
evilCurIndex = Lerp(evilCurIndex, curIndex, .3)
for index, song in next, songs do
local color = index == curIndex and { 50, 50, 50 } or { 0, 0, 0 }
@ -188,12 +188,12 @@ return function()
local icon = icons[song.name]
if icon then
icon.position = myTypes.Vector2(5 * (index - evilCurIndex) + 80 + (song.name:len() * 10),
icon.position = Vector2(5 * (index - evilCurIndex) + 80 + (song.name:len() * 10),
love.graphics:getHeight() / 4 + (25 * (index - evilCurIndex - .5)))
end
end
arrow.position = myTypes.Vector2(30 + 8 * (evilCurIndex - curIndex),
arrow.position = Vector2(30 + 8 * (evilCurIndex - curIndex),
love.graphics:getHeight() / 4 + (evilCurIndex - curIndex - 1) * 25)
--love.graphics.print({{0,0,0}, curDiff}, font, 400, 660)
@ -305,23 +305,23 @@ return function()
bfAtlas:stop()
bfAtlas:load("sprites/charSelect/picoChill")
bfAtlas:play("pico slide in")
arrow = myTypes.Sprite(
arrow = Sprite(
"sprites/freeplay/freeplaySelector_pico.png",
"sprites/freeplay/freeplaySelector_pico.json"
)
arrow.position.y = 330
arrow.position.x = 20
arrow.layer = 1
arrow.resize = myTypes.Vector2(.5, .5)
arrow.resize = Vector2(.5, .5)
arrow.flipX = true
arrow:PlayAnimation("arrow pointer loop", 24, true)
else
arrow = myTypes.Sprite("sprites/freeplay/freeplaySelector.png",
arrow = Sprite("sprites/freeplay/freeplaySelector.png",
"sprites/freeplay/freeplaySelector.json")
arrow.position.y = 330
arrow.position.x = 20
arrow.layer = 1
arrow.resize = myTypes.Vector2(.5, .5)
arrow.resize = Vector2(.5, .5)
arrow.flipX = true
arrow:PlayAnimation("arrow pointer loop", 24, true)
songs = require("charts.songs")
@ -345,6 +345,8 @@ return function()
charSwapSND:play()
lastChange = 0
setupIcons()
elseif key == "escape" then
state.changeState("menustate")
elseif tonumber(key) and tonumber(key) < 5 then
if key == "0" then
settings.Downscroll = not settings.Downscroll

5
src/states/menustate.lua Normal file
View File

@ -0,0 +1,5 @@
return function()
local state = {}
return state
end

View File

@ -2,8 +2,8 @@ local function state(songName, songDifficulty, show)
local state = {} -- Returns needed functions for the state to work after loading it properly
-- I NEED THEM IMPORTS
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")
@ -169,17 +169,17 @@ local function state(songName, songDifficulty, show)
local sharedVars = {
canStart = true,
screenSize = myTypes.Vector2(1280, 720),
canvasSize = myTypes.Vector2(1920,1080),
screenSize = Vector2(1280, 720),
canvasSize = Vector2(1920,1080),
singVectors = {
singLEFT = myTypes.Vector2(20, 0),
singDOWN = myTypes.Vector2(0, -20),
singUP = myTypes.Vector2(0, 20),
singRIGHT = myTypes.Vector2(-20, 0),
["singLEFT-alt"] = myTypes.Vector2(20, 0), -- alt anims need to be here too
["singDOWN-alt"] = myTypes.Vector2(0, -20),
["singUP-alt"] = myTypes.Vector2(0, 20),
["singRIGHT-alt"] = myTypes.Vector2(-20, 0)
singLEFT = Vector2(20, 0),
singDOWN = Vector2(0, -20),
singUP = Vector2(0, 20),
singRIGHT = Vector2(-20, 0),
["singLEFT-alt"] = Vector2(20, 0), -- alt anims need to be here too
["singDOWN-alt"] = Vector2(0, -20),
["singUP-alt"] = Vector2(0, 20),
["singRIGHT-alt"] = Vector2(-20, 0)
},
settings = settings,
receptors = receptors,
@ -312,9 +312,9 @@ local function state(songName, songDifficulty, show)
miss:stop()
miss:release()
myTypes.destroyAllSprites()
render.destroyAllSprites()
deadBF = myTypes.character(string.format("%s-dead", chart.player1))
deadBF = Character(string.format("%s-dead", chart.player1))
deadBF:PlayAnimation("firstDeath")
loss:play()
@ -385,7 +385,7 @@ local function state(songName, songDifficulty, show)
startTime = socket.gettime()
end
if dead then
myTypes.render.cameraTarget = deadBF.stageCamera
render.cameraTarget = deadBF.stageCamera
if not restart then
if deadBF and deadBF.sprite.ended then
deadBF:PlayAnimation("deathLoop")
@ -406,7 +406,7 @@ local function state(songName, songDifficulty, show)
state.restart(songName, songDifficulty)
end
end
myTypes.updateSprites(dt)
render.updateSprites(dt)
end
return
end
@ -482,6 +482,12 @@ local function state(songName, songDifficulty, show)
module.onBeat(beat)
end
end
inst:seek(elapsed / 1000 > 0 and elapsed / 1000 or 0, "seconds")
if chart.needsVoices then
voices:seek(elapsed / 1000 > 0 and elapsed / 1000 or 0, "seconds")
end
end
local section = chart.notes[math.floor(step / 16) + 1]
@ -489,27 +495,27 @@ local function state(songName, songDifficulty, show)
if section then
if not section.gfSection then
if section.mustHitSection then
local currentSingVector = sharedVars.singVectors[characters.bf.animation] or myTypes.Vector2()
myTypes.render.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
local currentSingVector = sharedVars.singVectors[characters.bf.animation] or Vector2()
render.cameraTarget = Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(Vector2(0, -200)):Add(currentSingVector)
else
if characters.dad then
local currentSingVector = sharedVars.singVectors[characters.dad.animation] or myTypes.Vector2()
myTypes.render.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
local currentSingVector = sharedVars.singVectors[characters.dad.animation] or Vector2()
render.cameraTarget = Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(Vector2(0, -200)):Add(currentSingVector)
else
local currentSingVector = sharedVars.singVectors[characters.gf.animation] or myTypes.Vector2()
myTypes.render.cameraTarget = myTypes.Vector2(stage.camera_girlfriend[1], stage.camera_girlfriend[2]):Add(characters.gf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
local currentSingVector = sharedVars.singVectors[characters.gf.animation] or Vector2()
render.cameraTarget = Vector2(stage.camera_girlfriend[1], stage.camera_girlfriend[2]):Add(characters.gf.stageCamera:Negate()):Add(Vector2(0, -200)):Add(currentSingVector)
end
end
else
local currentSingVector = sharedVars.singVectors[characters.gf.animation] or myTypes.Vector2()
myTypes.render.cameraTarget = myTypes.Vector2(stage.camera_girlfriend[1], stage.camera_girlfriend[2]):Add(characters.gf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
local currentSingVector = sharedVars.singVectors[characters.gf.animation] or Vector2()
render.cameraTarget = Vector2(stage.camera_girlfriend[1], stage.camera_girlfriend[2]):Add(characters.gf.stageCamera:Negate()):Add(Vector2(0, -200)):Add(currentSingVector)
end
else
local currentSingVector = sharedVars.singVectors[characters.bf.animation] or myTypes.Vector2()
myTypes.render.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
local currentSingVector = sharedVars.singVectors[characters.bf.animation] or Vector2()
render.cameraTarget = Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(Vector2(0, -200)):Add(currentSingVector)
end
myTypes.updateSprites(dt)
render.updateSprites(dt)
for name, character in next, characters do
if name ~= "gf" and character.animInfo.idle and character.sprite.animation ~= "idle" and character.sprite.ended then
@ -546,7 +552,7 @@ local function state(songName, songDifficulty, show)
for index, note in next, notes do
if note.mustPress then
note.sprite.position = myTypes.Vector2(receptors[note.direction].position.x + note.offset.x, settings.Downscroll and receptors[note.direction].position.y - (note.position-elapsed) * speed or receptors[note.direction].position.y + (note.position - elapsed) * speed)
note.sprite.position = Vector2(receptors[note.direction].position.x + note.offset.x, settings.Downscroll and receptors[note.direction].position.y - (note.position-elapsed) * speed or receptors[note.direction].position.y + (note.position - elapsed) * speed)
if (note.position - elapsed) * speed < -150 then
note:destroy()
miss:stop()
@ -561,7 +567,7 @@ local function state(songName, songDifficulty, show)
end
end
else
note.sprite.position = myTypes.Vector2(opponentReceptors[note.direction].position.x + note.offset.x, settings.Downscroll and opponentReceptors[note.direction].position.y - (note.position-elapsed) * speed or opponentReceptors[note.direction].position.y + (note.position - elapsed) * speed)
note.sprite.position = Vector2(opponentReceptors[note.direction].position.x + note.offset.x, settings.Downscroll and opponentReceptors[note.direction].position.y - (note.position-elapsed) * speed or opponentReceptors[note.direction].position.y + (note.position - elapsed) * speed)
if (note.position - elapsed) * speed < 10 then
notes[index] = nil
if section then
@ -589,7 +595,7 @@ local function state(songName, songDifficulty, show)
for index, hold in next, holdNotes do
if hold.mustPress then
hold.sprite.position = myTypes.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)
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
@ -608,7 +614,7 @@ local function state(songName, songDifficulty, show)
end
end
else
hold.sprite.position = myTypes.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)
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
characters.dad:PlayAnimation("sing"..directions[hold.direction].."-alt")
@ -627,7 +633,7 @@ local function state(songName, songDifficulty, show)
if event.name == "change character" then
characters[event.var1]:Destroy()
characters[event.var1] = myTypes.character(event.var2)
characters[event.var1] = Character(event.var2)
elseif event.name == "play animation" then
characters[event.var2]:PlayAnimation(event.var1)
elseif event.name == "hey!" then
@ -642,8 +648,8 @@ local function state(songName, songDifficulty, show)
end
end
zoom = myMath.lerp(zoom, stage.defaultZoom or 1, .05)
uiZoom = myMath.lerp(uiZoom, 1, .05)
zoom = Lerp(zoom, stage.defaultZoom or 1, .05)
uiZoom = Lerp(uiZoom, 1, .05)
if inst and inst:getVolume() ~= volume / 100 then
inst:setVolume(volume / 100)
@ -680,7 +686,7 @@ local function state(songName, songDifficulty, show)
love.graphics.clear()
myTypes.drawSprites()
render.drawSprites()
for i, module in next, modules do
if module.drawBelowUI then
@ -692,7 +698,7 @@ local function state(songName, songDifficulty, show)
love.graphics.clear()
myTypes.drawUI()
render.drawUI()
if playing and ui.score then
love.graphics.print({{0,0,0,1}, string.format("Score: %s Accuracy: %s", score, tostring(accuracy):sub(1, 5))}, evenBiggerFont, 760, settings.Downscroll and 1030 or 50)
@ -773,14 +779,14 @@ local function state(songName, songDifficulty, show)
-- GF first so she is below other chars
if chart.gfVersion ~= "none" then
characters.gf = myTypes.character(chart.gfVersion)
characters.gf.stagePosition = myTypes.Vector2(stage.girlfriend[1], stage.girlfriend[2])
characters.gf = Character(chart.gfVersion)
characters.gf.stagePosition = Vector2(stage.girlfriend[1], stage.girlfriend[2])
characters.gf:PlayAnimation("danceLeft")
characters.gf.sprite.layer = 0
end
characters.bf = myTypes.character(chart.player1)
characters.bf.stagePosition = myTypes.Vector2(stage.boyfriend[1], stage.boyfriend[2])
characters.bf = Character(chart.player1)
characters.bf.stagePosition = Vector2(stage.boyfriend[1], stage.boyfriend[2])
characters.bf:PlayAnimation("idle")
characters.bf.sprite.layer = 1
@ -788,8 +794,8 @@ local function state(songName, songDifficulty, show)
icons.bf = {image = image, alive = love.graphics.newQuad(0,0, 150, 150, image), dead = love.graphics.newQuad(150, 0, 150, 150, image)}
if chart.player2 ~= "none" then -- you can have no player2 but always player1
characters.dad = myTypes.character(chart.player2)
characters.dad.stagePosition = myTypes.Vector2(stage.opponent[1], stage.opponent[2])
characters.dad = Character(chart.player2)
characters.dad.stagePosition = Vector2(stage.opponent[1], stage.opponent[2])
characters.dad:PlayAnimation(characters.dad.animInfo.idle and "idle" or "danceLeft")
characters.dad.sprite.layer = 1
@ -803,30 +809,30 @@ local function state(songName, songDifficulty, show)
local noteSplash = chart.splashSkin or "noteSplashes"
for i = 0, 3 do
local receptor = myTypes.Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
local receptor = Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
receptor:Frame("arrow"..directions[i+1], 0)
receptor.layer = 9
receptor.position = myTypes.Vector2(600 + (79* i), settings.Downscroll and 430 or 0)
receptor.position = Vector2(600 + (79* i), settings.Downscroll and 430 or 0)
receptor.ui = true -- So it doesnt move with the camera.
receptors[i + 1] = receptor
local splash = myTypes.Sprite("sprites/noteSplashes.png", "sprites/noteSplashes.json")
local splash = Sprite("sprites/noteSplashes.png", "sprites/noteSplashes.json")
splash.layer = 11
splash.position = myTypes.Vector2(570 + (79* i), settings.Downscroll and 400 or -50)
splash.position = Vector2(570 + (79* i), settings.Downscroll and 400 or -50)
splash.ui = true
splashes[i + 1] = splash
end
for i = 0, 3 do -- opponent receptors, purely graphics
local receptor = myTypes.Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
local receptor = Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json")
receptor:Frame("arrow"..directions[i+1], 0)
receptor.position = myTypes.Vector2(50 + 79 * i, settings.Downscroll and 430 or 0)
receptor.position = Vector2(50 + 79 * i, settings.Downscroll and 430 or 0)
receptor.layer = 9
receptor.ui = true -- So it doesnt move with the camera.
@ -838,18 +844,18 @@ local function state(songName, songDifficulty, show)
for index, section in next, chart.notes do
for index, note in next, section.sectionNotes do
if note[2] >= 0 then
local newNote = myTypes.note(note, section.mustHitSection)
local newNote = Note(note, section.mustHitSection)
unspawnedNotes[#unspawnedNotes+1] = newNote
if note[3] > 0 then
local length = math.floor(note[3] / conductor.stepCrochet)
for i = 0, length - .1, .1 do
local newHold = myTypes.note({note[1] + i * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true)
local newHold = Note({note[1] + i * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true)
unspawnedHoldNotes[#unspawnedHoldNotes+1] = newHold
end
local newHold = myTypes.note({note[1] + length * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true, true)
local newHold = Note({note[1] + length * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true, true)
unspawnedHoldNotes[#unspawnedHoldNotes+1] = newHold
newHold.holdEnd = true
if settings.Downscroll then
@ -867,7 +873,7 @@ local function state(songName, songDifficulty, show)
events[#events+1] = newEvent
if newEvent.name == "change character" then
myTypes.preloadChar(newEvent.var2)
chars.preloadChar(newEvent.var2)
end
end
end
@ -893,7 +899,7 @@ local function state(songName, songDifficulty, show)
events[#events+1] = newEvent
if newEvent.name == "change character" then
myTypes.preloadChar(newEvent.var2)
chars.preloadChar(newEvent.var2)
end
logging.log(string.lower(note[3]))
@ -915,7 +921,7 @@ local function state(songName, songDifficulty, show)
events[#events+1] = newEvent
if newEvent.name == "change character" then
myTypes.preloadChar(newEvent.var2)
chars.preloadChar(newEvent.var2)
end
end
end
@ -940,13 +946,13 @@ local function state(songName, songDifficulty, show)
events[#events+1] = newEvent
if newEvent.name == "change character" then
myTypes.preloadChar(newEvent.var2)
chars.preloadChar(newEvent.var2)
end
end
end
end
myTypes.render.cameraTarget = myTypes.Vector2()
render.cameraTarget = Vector2()
keyBinds = settings.Keybinds
@ -962,39 +968,12 @@ local function state(songName, songDifficulty, show)
end
end
logging.log(logging.dump(modules))
local sickImage = myTypes.Image("images/ui/sick.png")
local goodImage = myTypes.Image("images/ui/good.png")
local badImage = myTypes.Image("images/ui/bad.png")
local shitImage = myTypes.Image("images/ui/shit.png")
sickImage.position.y = 330
goodImage.position.y = 405
badImage.position.y = 480
shitImage.position.y = 555
sickImage.ui = true
goodImage.ui = true
badImage.ui = true
shitImage.ui = true
sickImage.layer = 7
goodImage.layer = 7
badImage.layer = 7
shitImage.layer = 7
sickImage.resize = myTypes.Vector2(0.5,0.5)
goodImage.resize = myTypes.Vector2(0.5,0.5)
badImage.resize = myTypes.Vector2(0.5,0.5)
shitImage.resize = myTypes.Vector2(0.5,0.5)
local canvasSize = sharedVars.canvasSize or myTypes.Vector2(1920,1080)
local canvasSize = sharedVars.canvasSize or Vector2(1920,1080)
mainCanvas = love.graphics.newCanvas(canvasSize.x, canvasSize.y)
uiCanvas = love.graphics.newCanvas(canvasSize.x, canvasSize.y)
local screenSize = sharedVars.screenSize or myTypes.Vector2(1280, 720)
local screenSize = sharedVars.screenSize or Vector2(1280, 720)
love.window.setMode(screenSize.x, screenSize.y, { fullscreen = false , resizable = false})
end

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local logging = require("modules.logging")
local files = require("modules.files")
local json = require("modules.json")
@ -8,7 +8,7 @@ text.__index = text
function text:Move(position)
for index, tex in next, self.text do
tex.position = myTypes.Vector2(position.x + 15 * (index - 1), position.y)
tex.position = Vector2(position.x + 15 * (index - 1), position.y)
end
self.position = position
end
@ -23,9 +23,9 @@ local function createFunkinNumbers(number, position, layer)
for i = 1, #str do
local l = str:sub(i, i)
local newText = myTypes.Rect("sprites/resultScreen/tallieNumber.png", "sprites/resultScreen/tallieNumber.json")
local newText = Rect("sprites/resultScreen/tallieNumber.png", "sprites/resultScreen/tallieNumber.json")
newText:Frame(string.format("%s small", l), 0)
newText.position = myTypes.Vector2(position.x + 15 * (i - 1), position.y)
newText.position = Vector2(position.x + 15 * (i - 1), position.y)
newText.layer = layer - (i / 200)
newText.modifier = 0
@ -83,7 +83,7 @@ return function(score, accuracy, ratings, combo)
local state = {}
function state.update(dt)
myTypes.updateSprites(dt)
render.updateSprites(dt)
end
function state.keypressed(key, un, is)
@ -104,29 +104,29 @@ return function(score, accuracy, ratings, combo)
end
end
soundSystem = myTypes.Sprite("sprites/resultScreen/soundSystem.png", "sprites/resultScreen/soundSystem.json")
soundSystem = Sprite("sprites/resultScreen/soundSystem.png", "sprites/resultScreen/soundSystem.json")
soundSystem:PlayAnimation("sound system", 24, false)
soundSystem.position = myTypes.Vector2(0, -100)
soundSystem.position = Vector2(0, -100)
soundSystem.layer = 10
soundSystem.modifier = 0
rantingPopin = myTypes.Sprite("sprites/resultScreen/ratingsPopin.png", "sprites/resultScreen/ratingsPopin.json")
rantingPopin.position = myTypes.Vector2(-60, 70)
rantingPopin = Sprite("sprites/resultScreen/ratingsPopin.png", "sprites/resultScreen/ratingsPopin.json")
rantingPopin.position = Vector2(-60, 70)
rantingPopin.layer = 11
rantingPopin:PlayAnimation("Categories", 24, false)
rantingPopin.modifier = 0
local scorePopin = myTypes.Sprite("sprites/resultScreen/scorePopin.png", "sprites/resultScreen/scorePopin.json")
scorePopin.position = myTypes.Vector2(-100, 255)
local scorePopin = Sprite("sprites/resultScreen/scorePopin.png", "sprites/resultScreen/scorePopin.json")
scorePopin.position = Vector2(-100, 255)
scorePopin.layer = 12
scorePopin:PlayAnimation("tally score", 24, false)
scorePopin.modifier = 0
local top = myTypes.Image("sprites/resultScreen/topBarBlack.png", 0)
local top = Image("sprites/resultScreen/topBarBlack.png", 0)
top.layer = 6
local resultsLabel = myTypes.Sprite("sprites/resultScreen/results.png", "sprites/resultScreen/results.json")
resultsLabel.position = myTypes.Vector2(-100)
local resultsLabel = Sprite("sprites/resultScreen/results.png", "sprites/resultScreen/results.json")
resultsLabel.position = Vector2(-100)
resultsLabel.layer = 12
resultsLabel:PlayAnimation("results instance 1", 24, false)
resultsLabel.modifier = 0
@ -138,28 +138,28 @@ return function(score, accuracy, ratings, combo)
total = total + notes
end
local totalText = createFunkinNumbers(total, myTypes.Vector2(165, 75), 30)
local comboText = createFunkinNumbers(combo, myTypes.Vector2(165, 105), 30)
local totalText = createFunkinNumbers(total, Vector2(165, 75), 30)
local comboText = createFunkinNumbers(combo, Vector2(165, 105), 30)
local sick = createFunkinNumbers(ratings.sick, myTypes.Vector2(105, 135), 30)
local good = createFunkinNumbers(ratings.good, myTypes.Vector2(95, 165), 30)
local bad = createFunkinNumbers(ratings.bad, myTypes.Vector2(80, 195), 30)
local shit = createFunkinNumbers(ratings.shit, myTypes.Vector2(85, 220), 30)
local miss = createFunkinNumbers(ratings.miss, myTypes.Vector2(115, 250), 30)
local sick = createFunkinNumbers(ratings.sick, Vector2(105, 135), 30)
local good = createFunkinNumbers(ratings.good, Vector2(95, 165), 30)
local bad = createFunkinNumbers(ratings.bad, Vector2(80, 195), 30)
local shit = createFunkinNumbers(ratings.shit, Vector2(85, 220), 30)
local miss = createFunkinNumbers(ratings.miss, Vector2(115, 250), 30)
local info = json.parse(files.read_file(string.format("resultScreens/%s.json", curChar)))
for index, evil in next, info.results[string.lower(rank)] do
if evil.renderType == "animateatlas" then
local atlas = myTypes.render.Atlas(evil.assetPath)
local atlas = Atlas(evil.assetPath)
atlas.layer = evil.zIndex - 900
atlas.position = myTypes.Vector2(evil.offsets.x, evil.offsets.y)
atlas.position = Vector2(evil.offsets.x, evil.offsets.y)
atlas:PlayAnimation()
atlas.modifier = 0
elseif evil.renderType == "sparrow" then
local sprite = myTypes.Sprite(evil.assetPath .. ".png", evil.assetPath .. ".json")
local sprite = Sprite(evil.assetPath .. ".png", evil.assetPath .. ".json")
sprite.layer = evil.zIndex - 900
sprite.position = myTypes.Vector2(evil.offsets.x, evil.offsets.y)
sprite.position = Vector2(evil.offsets.x, evil.offsets.y)
sprite.modifier = 0
local anim
for name, quad in next, sprite.quads do
@ -189,22 +189,22 @@ return function(score, accuracy, ratings, combo)
for i = 0, 9 do
local letter = i <= score:len() and tonumber(score:sub(score:len() - i, score:len() - i)) or 0
local resultsLabel = myTypes.Sprite("sprites/resultScreen/score-digital-numbers.png", "sprites/resultScreen/score-digital-numbers.json")
resultsLabel.position = myTypes.Vector2(-100)
local resultsLabel = Sprite("sprites/resultScreen/score-digital-numbers.png", "sprites/resultScreen/score-digital-numbers.json")
resultsLabel.position = Vector2(-100)
resultsLabel.layer = 15
resultsLabel:PlayAnimation(string.format("%s DIGITAL", numbers[letter + 1]), 24, false)
resultsLabel.modifier = 0
resultsLabel.position = myTypes.Vector2(300 - (30 * i), 300)
resultsLabel.position = Vector2(300 - (30 * i), 300)
resultsLabel.frame = 1
end
myTypes.render.cameraPosition = myTypes.Vector2()
render.cameraPosition = Vector2()
end
function state.draw()
love.graphics.clear({ 1, 0.96470588235, 0.60784313725 })
myTypes.drawSprites()
myTypes.drawUI()
render.drawSprites()
render.drawUI()
end
return state

65
src/states/weekstate.lua Normal file
View File

@ -0,0 +1,65 @@
local weeks = require("weeks")
local weekOrder = {}
local backWeekOrder = {}
local orderIndex = 1
local evilorderIndex = 1
local weekImages = {}
local currentWeek = "tutorial"
local currentDifficulty = "easy"
return function()
local state = {}
local function setup()
local bg = Image("images/menuBG.png", 0)
bg.ui = false
bg.layer = -10
for name, week in next, weeks do
weekOrder[#weekOrder+1] = name
backWeekOrder[week] = #weekOrder
weekImages[name] = love.graphics.newImage("images/story/"..week.icon..".png")
end
end
function state.update(dt)
render.updateSprites(dt)
evilorderIndex = Lerp(evilorderIndex, orderIndex, .05)
for week, weekImage in next, weekImages do
weekImage.position = Vector2(love.graphics:getWidth() / 2 - weekImage:getWidth() / 2, love.graphics:getHeight() / 2 - weekImage:getHeight() / 2 - (week - evilorderIndex))
end
end
function state.draw()
render.drawSprites()
render.drawUI()
end
function state.keypressed(key)
if key == "down" then
orderIndex, currentWeek = next(weekOrder, orderIndex)
if not orderIndex then
orderIndex = 1
currentWeek = weekOrder[1]
end
elseif key == "return" then
gameMode = "storymode"
currentSong = 1
songOrder = weeks[currentWeek].songs
state.changeState(songOrder[currentSong], currentDifficulty)
end
end
function state.load()
setup()
end
return state
end

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local files = require("modules.files")
local module = {}
@ -33,9 +33,9 @@ local rain = love.graphics.newShader("shaders/rain.frag")
local evilShader = love.graphics.newShader(evilShaderScript)
--receptor.position = myTypes.Vector2(600 + (79* i), settings.Downscroll and 430 or 0)
local nextplayerReceptorPosition = myTypes.Vector2(600, 430) -- Its gonna be a forced downscroll so idc lmao lmao skill issue
local currentplayerReceptorPosition = myTypes.Vector2(600, 430)
--receptor.position = Vector2(600 + (79* i), settings.Downscroll and 430 or 0)
local nextplayerReceptorPosition = Vector2(600, 430) -- Its gonna be a forced downscroll so idc lmao lmao skill issue
local currentplayerReceptorPosition = Vector2(600, 430)
local moveAway = false
@ -44,49 +44,49 @@ function module.onCreate()
sillyVideo = love.graphics.newVideo("videos/SO_STAY_FINAL_1.ogv")
sillyVideo:getSource():setVolume(0)
mirror = myTypes.Image("images/billy/silly_mirror.png")
mirror = Image("images/billy/silly_mirror.png")
mirror.layer = -20
mirror.resize = myTypes.Vector2(1,1)
mirror.resize = Vector2(1,1)
mirror.position.y = -300
mirror.position.x = -800
evilMirror = myTypes.Image("images/billy/broken_mirror.png")
evilMirror = Image("images/billy/broken_mirror.png")
evilMirror.layer = -21 -- I will put this one forward on break mirror event ig
evilMirror.resize = myTypes.Vector2(1,1)
evilMirror.resize = Vector2(1,1)
evilMirror.position.y = -300
evilMirror.position.x = -800
local floor = myTypes.Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
local floor = Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
floor.layer = -15
floor:Frame("Silly_floor", 0)
floor.quads["Silly_floor"][0].resize = myTypes.Vector2(1.4, 1)
floor.quads["Silly_floor"][0].resize = Vector2(1.4, 1)
floor.position.y = -300
floor.position.x = -100
local asset1 = myTypes.Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
local asset1 = Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
asset1.layer = -10
asset1:Frame("Silly_idk_1", 0)
asset1.quads["Silly_idk_1"][0].resize = myTypes.Vector2(1, 1)
asset1.quads["Silly_idk_1"][0].resize = Vector2(1, 1)
asset1.position.y = -270
asset1.position.x = -400
for index, receptor in next, module.shared.opponentReceptors do
receptor.ui = false
receptor.position = myTypes.Vector2(100 * (index - 1), 300)
receptor.position = Vector2(100 * (index - 1), 300)
receptor.layer = -5
end
-- local asset2 = myTypes.Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
-- local asset2 = Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
-- asset2.layer = -8
-- asset2:Frame("Silly_idk_2", 0)
-- asset2.quads["Silly_idk_2"][0].resize = myTypes.Vector2(0.5, 0.5)
-- local asset3 = myTypes.Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
-- asset2.quads["Silly_idk_2"][0].resize = Vector2(0.5, 0.5)
-- local asset3 = Rect("images/billy/bgAssets.png", "images/billy/bgAssets.json")
-- asset3.layer = -7
-- asset3:Frame("Yo_y_mi_silly_pana", 0)
-- asset3.quads["Yo_y_mi_silly_pana"][0].resize = myTypes.Vector2(0.5, 0.5)
-- asset3.quads["Yo_y_mi_silly_pana"][0].resize = Vector2(0.5, 0.5)
evilAtlas = myTypes.render.Atlas("sprites/lyric")
evilAtlas.position = myTypes.Vector2(50000,50000)
evilAtlas = Atlas("sprites/lyric")
evilAtlas.position = Vector2(50000,50000)
evilAtlas.layer = 1
module.shared.settings.Downscroll = true -- forcing downscroll because i am not coding upscroll positions dawg
@ -98,9 +98,9 @@ function module.onEvent(event)
if event.var1 == "anim" then
oldPosition = module.shared.characters.dad.stagePosition
oldSpritePosition = module.shared.characters.dad.sprite.position
module.shared.characters.dad.stagePosition = myTypes.Vector2(50000,5000)
module.shared.characters.dad.sprite.position = myTypes.Vector2(50000,5000)
evilAtlas.position = myTypes.Vector2(920, 600)
module.shared.characters.dad.stagePosition = Vector2(50000,5000)
module.shared.characters.dad.sprite.position = Vector2(50000,5000)
evilAtlas.position = Vector2(920, 600)
evilAtlas:PlayAnimation("story_of_yourtalebilly")
elseif event.var1 == "vid" then
evilAtlas:Destroy()
@ -108,17 +108,17 @@ function module.onEvent(event)
module.shared.characters.dad.sprite.position = oldPosition
sillyVideo:play()
startedEvilVideo = true
nextplayerReceptorPosition = myTypes.Vector2(324, -90)
nextplayerReceptorPosition = Vector2(324, -90)
for index, receptor in next, module.shared.opponentReceptors do
receptor.ui = false
receptor.position = myTypes.Vector2(10000,10000) -- not visible honk mimimi
receptor.position = Vector2(10000,10000) -- not visible honk mimimi
receptor.layer = -5
end
elseif event.var1 == "break mirror" then
evilMirror.layer = -19
elseif event.var1 == "die" then
elseif event.var1 == "pre" then
nextplayerReceptorPosition = myTypes.Vector2(600, -90) --Those are tweened to look bettah
nextplayerReceptorPosition = Vector2(600, -90) --Those are tweened to look bettah
moveAway = true
module.shared.ui.timebar = false
module.shared.ui.health = false
@ -134,7 +134,7 @@ function module.onEvent(event)
}
]]
elseif event.var1 == "hud in" then
nextplayerReceptorPosition = myTypes.Vector2(324, 430)
nextplayerReceptorPosition = Vector2(324, 430)
end
end
end
@ -160,13 +160,13 @@ function module.onUpdate(dt, el)
end
for index, receptor in next, module.shared.receptors do
receptor.position = myTypes.Vector2(currentplayerReceptorPosition.x + 79 * (index - 1), currentplayerReceptorPosition.y)
receptor.position = Vector2(currentplayerReceptorPosition.x + 79 * (index - 1), currentplayerReceptorPosition.y)
end
for index, receptor in next, module.shared.splashes do
receptor.position = myTypes.Vector2(currentplayerReceptorPosition.x - 30 + 79 * (index - 1), currentplayerReceptorPosition.y - 30)
receptor.position = Vector2(currentplayerReceptorPosition.x - 30 + 79 * (index - 1), currentplayerReceptorPosition.y - 30)
end
for index, receptor in next, module.shared.opponentReceptors do
receptor.position = receptor.position:Lerp(moveAway and myTypes.Vector2(100 * (index - 1), -100) or myTypes.Vector2(100 * (index - 1), 300), .05)
receptor.position = receptor.position:Lerp(moveAway and Vector2(100 * (index - 1), -100) or Vector2(100 * (index - 1), 300), .05)
end
if el > 0 and not introVideo:isPlaying() and not paused and not playedIntro then
@ -177,7 +177,7 @@ function module.onUpdate(dt, el)
end
if not sillyVideo:isPlaying() and not paused and startedEvilVideo and not endedEvilVideo then
endedEvilVideo = true
nextplayerReceptorPosition = myTypes.Vector2(600, 430)
nextplayerReceptorPosition = Vector2(600, 430)
module.shared.globalShader = evilShader
end
end

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local dancers = {}
@ -10,33 +10,33 @@ return {
dancers = {}
local sunset = myTypes.Image("images/limo/limoSunset.png", .2)
sunset.position = myTypes.Vector2(-1000, -100)
sunset.resize = myTypes.Vector2(1.5, 1.5)
local sunset = Image("images/limo/limoSunset.png", .2)
sunset.position = Vector2(-1000, -100)
sunset.resize = Vector2(1.5, 1.5)
sunset.layer = -10
local road = myTypes.Sprite("sprites/limo/limoRoad.png", "sprites/limo/limoRoad.json")
local road = Sprite("sprites/limo/limoRoad.png", "sprites/limo/limoRoad.json")
road:PlayAnimation("COOLROAD", 24, true)
road.position = myTypes.Vector2(-300, 230)
road.position = Vector2(-300, 230)
road.modifier = 0.6
road.layer = -9
local limobg = myTypes.Sprite("sprites/limo/bgLimo.png", "sprites/limo/bgLimo.json")
local limobg = Sprite("sprites/limo/bgLimo.png", "sprites/limo/bgLimo.json")
limobg:PlayAnimation("background limo pink", 24, true)
limobg.position = myTypes.Vector2(-100, 350)
limobg.position = Vector2(-100, 350)
limobg.modifier = .6
limobg.layer = -8
local limoDriver = myTypes.Sprite("sprites/limo/limoDrive.png", "sprites/limo/limoDrive.json")
local limoDriver = Sprite("sprites/limo/limoDrive.png", "sprites/limo/limoDrive.json")
limoDriver:PlayAnimation("Limo stage", 24, true)
limoDriver.position = myTypes.Vector2(-300, 450)
limoDriver.position = Vector2(-300, 450)
limoDriver.layer = -7
for i = 1, 5 do
local dancer = myTypes.Sprite("sprites/limo/limoDancer.png", "sprites/limo/limoDancer.json")
local dancer = Sprite("sprites/limo/limoDancer.png", "sprites/limo/limoDancer.json")
dancer.modifier = .6
dancer:PlayAnimation("bg dancer sketch PINK", 24, false)
dancer.position = myTypes.Vector2(-10 + i * 150, 155)
dancer.position = Vector2(-10 + i * 150, 155)
dancer.layer = -7 + i
dancers[i] = dancer

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local dancers = {}
@ -17,89 +17,89 @@ return {
dancers = {}
local sunset = myTypes.Image("images/limo/erect/limoSunset.png")
sunset.position = myTypes.Vector2(-100, 0)
sunset.resize = myTypes.Vector2(1, 1)
local sunset = Image("images/limo/erect/limoSunset.png")
sunset.position = Vector2(-100, 0)
sunset.resize = Vector2(1, 1)
sunset.modifier = 0.1
sunset.layer = -12
shootingStar = myTypes.Sprite("sprites/limo/erect/shooting star.png", "sprites/limo/erect/shooting star.json")
shootingStar = Sprite("sprites/limo/erect/shooting star.png", "sprites/limo/erect/shooting star.json")
shootingStar:PlayAnimation("shooting star idle", 24, true)
shootingStar.position = myTypes.Vector2(200, 0)
shootingStar.position = Vector2(200, 0)
shootingStar.modifier = 0.12
shootingStar.layer = -11
local mistBG1 = myTypes.Image("images/limo/erect/mistBack.png", .2)
mistBG1.position = myTypes.Vector2(860, 100)
mistBG1.resize = myTypes.Vector2(1.8, 1.3)
local mistBG1 = Image("images/limo/erect/mistBack.png", .2)
mistBG1.position = Vector2(860, 100)
mistBG1.resize = Vector2(1.8, 1.3)
mistBG1.layer = -10
local mistBG2 = myTypes.Image("images/limo/erect/mistBack.png", .2)
mistBG2.position = myTypes.Vector2(-300, 100)
mistBG2.resize = myTypes.Vector2(1.8, 1.3)
local mistBG2 = Image("images/limo/erect/mistBack.png", .2)
mistBG2.position = Vector2(-300, 100)
mistBG2.resize = Vector2(1.8, 1.3)
mistBG2.layer = -10
mist[1] = mistBG1
mist[2] = mistBG2
local road = myTypes.Sprite("sprites/limo/limoRoad.png", "sprites/limo/limoRoad.json")
local road = Sprite("sprites/limo/limoRoad.png", "sprites/limo/limoRoad.json")
road:PlayAnimation("COOLROAD", 24, true)
road.position = myTypes.Vector2(-300, 230)
road.position = Vector2(-300, 230)
road.modifier = 0.6
road.layer = -9
--nevermind
--funkin team why would you need to alpha this out in game
--[[local backFog = myTypes.Image("images/limo/erect/mistBack.png")
backFog.position = myTypes.Vector2(-100, 0)
--[[local backFog = Image("images/limo/erect/mistBack.png")
backFog.position = Vector2(-100, 0)
backFog.modifier = 0.6]]
local limobg = myTypes.Sprite("sprites/limo/erect/bgLimo.png", "sprites/limo/erect/bgLimo.json")
local limobg = Sprite("sprites/limo/erect/bgLimo.png", "sprites/limo/erect/bgLimo.json")
limobg:PlayAnimation("background limo blue", 24, true)
limobg.position = myTypes.Vector2(-100, 350)
limobg.position = Vector2(-100, 350)
limobg.modifier = 0.6
limobg.layer = -8
local mistMid1 = myTypes.Image("images/limo/erect/mistMid.png", .5)
mistMid1.position = myTypes.Vector2(860, 300)
mistMid1.resize = myTypes.Vector2(1.8, 1.3)
local mistMid1 = Image("images/limo/erect/mistMid.png", .5)
mistMid1.position = Vector2(860, 300)
mistMid1.resize = Vector2(1.8, 1.3)
mistMid1.layer = -6.5
local mistMid2 = myTypes.Image("images/limo/erect/mistMid.png", .5)
mistMid2.position = myTypes.Vector2(-300, 300)
mistMid2.resize = myTypes.Vector2(1.8, 1.3)
local mistMid2 = Image("images/limo/erect/mistMid.png", .5)
mistMid2.position = Vector2(-300, 300)
mistMid2.resize = Vector2(1.8, 1.3)
mistMid2.layer = -6.5
mist[3] = mistMid1
mist[4] = mistMid2
local limoDriver = myTypes.Sprite("sprites/limo/erect/limoDrive.png", "sprites/limo/erect/limoDrive.json")
local limoDriver = Sprite("sprites/limo/erect/limoDrive.png", "sprites/limo/erect/limoDrive.json")
limoDriver:PlayAnimation("Limo stage", 24, true)
limoDriver.position = myTypes.Vector2(-300, 450)
limoDriver.position = Vector2(-300, 450)
limoDriver = -6
for i = 1, 5 do
local dancer = myTypes.Sprite("sprites/limo/limoDancer.png", "sprites/limo/limoDancer.json")
local dancer = Sprite("sprites/limo/limoDancer.png", "sprites/limo/limoDancer.json")
dancer.modifier = .6
dancer:PlayAnimation("bg dancer sketch PINK", 24, false)
dancer.position = myTypes.Vector2(-10 + i * 150, 155)
dancer.position = Vector2(-10 + i * 150, 155)
dancer.layer = -6 + i
dancers[i] = dancer
end
local mistFront1 = myTypes.Image("images/limo/erect/mistFront.png", .7)
mistFront1.position = myTypes.Vector2(-350, 500)
mistFront1.resize = myTypes.Vector2(1.8, 1.3)
local mistFront1 = Image("images/limo/erect/mistFront.png", .7)
mistFront1.position = Vector2(-350, 500)
mistFront1.resize = Vector2(1.8, 1.3)
mistFront1.layer = 5
local mistFront2 = myTypes.Image("images/limo/erect/mistFront.png", .7)
mistFront2.position = myTypes.Vector2(-1630, 500)
mistFront2.resize = myTypes.Vector2(1.8, 1.3)
local mistFront2 = Image("images/limo/erect/mistFront.png", .7)
mistFront2.position = Vector2(-1630, 500)
mistFront2.resize = Vector2(1.8, 1.3)
mistFront2.layer = 5
mist[5] = mistFront1

View File

@ -1,51 +1,51 @@
local myTypes = require("modules.types")
local upperBop, bottomBop, santa
local snow = {}
return {
onCreate = function(song)
local bg = myTypes.Image("images/mall/bgWalls.png")
bg.position = myTypes.Vector2(-600, -440)
bg.resize = myTypes.Vector2(0.8, 0.8)
local bg = Image("images/mall/bgWalls.png")
bg.position = Vector2(-600, -440)
bg.resize = Vector2(0.8, 0.8)
bg.modifier = 0.2
bg.layer = -10
upperBop = myTypes.Sprite("sprites/mall/upperBop.png", "sprites/mall/upperBop.json")
upperBop = Sprite("sprites/mall/upperBop.png", "sprites/mall/upperBop.json")
upperBop:PlayAnimation("Upper Crowd Bob", 24, false)
upperBop.position = myTypes.Vector2(-240, -40)
upperBop.position = Vector2(-240, -40)
upperBop.modifier = 0.33
upperBop.resize = myTypes.Vector2(0.85, 0.85)
upperBop.resize = Vector2(0.85, 0.85)
upperBop.layer = -9
local escalator = myTypes.Image("images/mall/bgEscalator.png")
escalator.position = myTypes.Vector2(-1100, -540)
escalator.resize = myTypes.Vector2(0.9, 0.9)
local escalator = Image("images/mall/bgEscalator.png")
escalator.position = Vector2(-1100, -540)
escalator.resize = Vector2(0.9, 0.9)
escalator.modifier = 0.3
escalator.layer = -8
local christmasTree = myTypes.Image("images/mall/christmasTree.png")
christmasTree.position = myTypes.Vector2(370, -250)
local christmasTree = Image("images/mall/christmasTree.png")
christmasTree.position = Vector2(370, -250)
christmasTree.modifier = 0.4
christmasTree.layer = -7
for i = 1, 4 do --repeating cus fuck rectangles
local snowPart = myTypes.Image("images/mall/fgSnow.png")
snowPart.position = myTypes.Vector2(-1150 , 480 + i * 200)
local snowPart = Image("images/mall/fgSnow.png")
snowPart.position = Vector2(-1150 , 480 + i * 200)
snowPart.layer = -6
snow[i] = snowPart
end
bottomBop = myTypes.Sprite("sprites/mall/bottomBop.png", "sprites/mall/bottomBop.json")
bottomBop = Sprite("sprites/mall/bottomBop.png", "sprites/mall/bottomBop.json")
bottomBop:PlayAnimation("Bottom Level Boppers", 24, false)
bottomBop.position = myTypes.Vector2(-300, 120)
bottomBop.position = Vector2(-300, 120)
bottomBop.modifier = 0.9
bottomBop.layer = -5
santa = myTypes.Sprite("sprites/mall/santa.png", "sprites/mall/santa.json")
santa = Sprite("sprites/mall/santa.png", "sprites/mall/santa.json")
santa:PlayAnimation("santa idle in fear", 24, false)
santa.position = myTypes.Vector2(-600, 140)
santa.position = Vector2(-600, 140)
santa.layer = -4
end,
onBeat = function(beat)

View File

@ -1,57 +1,57 @@
local myTypes = require("modules.types")
local upperBop, bottomBop, santa
local snow = {}
return {
onCreate = function(song)
local bg = myTypes.Image("images/mall/erect/bgWalls.png")
bg.position = myTypes.Vector2(-650, -440)
bg.resize = myTypes.Vector2(0.9, 0.9)
local bg = Image("images/mall/erect/bgWalls.png")
bg.position = Vector2(-650, -440)
bg.resize = Vector2(0.9, 0.9)
bg.modifier = 0.2
bg.layer = -10
upperBop = myTypes.Sprite("sprites/mall/erect/upperBop.png", "sprites/mall/erect/upperBop.json")
upperBop = Sprite("sprites/mall/erect/upperBop.png", "sprites/mall/erect/upperBop.json")
upperBop:PlayAnimation("upperBop", 24, false)
upperBop.position = myTypes.Vector2(-240, -40)
upperBop.position = Vector2(-240, -40)
upperBop.modifier = 0.33
upperBop.resize = myTypes.Vector2(0.85, 0.85)
upperBop.resize = Vector2(0.85, 0.85)
upperBop.layer = -9
local escalator = myTypes.Image("images/mall/erect/bgEscalator.png")
escalator.position = myTypes.Vector2(-1100, -540)
escalator.resize = myTypes.Vector2(0.9, 0.9)
local escalator = Image("images/mall/erect/bgEscalator.png")
escalator.position = Vector2(-1100, -540)
escalator.resize = Vector2(0.9, 0.9)
escalator.modifier = 0.3
escalator.layer = -8
local christmasTree = myTypes.Image("images/mall/erect/christmasTree.png")
christmasTree.position = myTypes.Vector2(370, -250)
local christmasTree = Image("images/mall/erect/christmasTree.png")
christmasTree.position = Vector2(370, -250)
christmasTree.modifier = 0.4
christmasTree.layer = -7
local fog = myTypes.Image("images/mall/erect/white.png")
fog.position = myTypes.Vector2(-1100, 200)
fog.resize = myTypes.Vector2(0.9, 0.9)
local fog = Image("images/mall/erect/white.png")
fog.position = Vector2(-1100, 200)
fog.resize = Vector2(0.9, 0.9)
fog.modifier = 0.85
fog.layer = -6
for i = 1, 4 do --repeating cus fuck rectangles
local snowPart = myTypes.Image("images/mall/fgSnow.png")
snowPart.position = myTypes.Vector2(-1150 , 480 + i * 200)
local snowPart = Image("images/mall/fgSnow.png")
snowPart.position = Vector2(-1150 , 480 + i * 200)
snowPart.layer = -5
snow[i] = snowPart
end
bottomBop = myTypes.Sprite("sprites/mall/erect/bottomBop.png", "sprites/mall/erect/bottomBop.json")
bottomBop = Sprite("sprites/mall/erect/bottomBop.png", "sprites/mall/erect/bottomBop.json")
bottomBop:PlayAnimation("bottomBop", 24, false)
bottomBop.position = myTypes.Vector2(-350, 120)
bottomBop.position = Vector2(-350, 120)
bottomBop.modifier = 0.9
bottomBop.layer = -3
santa = myTypes.Sprite("sprites/mall/santa.png", "sprites/mall/santa.json")
santa = Sprite("sprites/mall/santa.png", "sprites/mall/santa.json")
santa:PlayAnimation("santa idle in fear", 24, false)
santa.position = myTypes.Vector2(-600, 140)
santa.position = Vector2(-600, 140)
santa.layer = -2
end,
onBeat = function(beat)

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local snow = {}
@ -9,20 +9,20 @@ local snow = {}
--evilfuckeduplebronjames.png
return {
onCreate = function(song)
local bg = myTypes.Image("images/mall/evil/evilBG.png")
bg.position = myTypes.Vector2(-300, -500)
bg.resize = myTypes.Vector2(0.9, 0.9)
local bg = Image("images/mall/evil/evilBG.png")
bg.position = Vector2(-300, -500)
bg.resize = Vector2(0.9, 0.9)
bg.modifier = 0.2
bg.layer = -15
local christmasTree = myTypes.Image("images/mall/evil/evilTree.png")
christmasTree.position = myTypes.Vector2(400, -300)
local christmasTree = Image("images/mall/evil/evilTree.png")
christmasTree.position = Vector2(400, -300)
christmasTree.modifier = 0.4
christmasTree.layer = -14
for i = 1, 4 do --repeating cus fuck rectangles
local snowPart = myTypes.Image("images/mall/evil/evilSnow.png")
snowPart.position = myTypes.Vector2(-1000 , 480 + i * 200)
local snowPart = Image("images/mall/evil/evilSnow.png")
snowPart.position = Vector2(-1000 , 480 + i * 200)
snowPart.layer = -6 - i
snow[i] = snowPart

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local cd = math.random(20, 25)
@ -12,36 +12,36 @@ local stage = {
}
function stage.onCreate()
local bg = myTypes.Image("images/philly/sky.png")
bg.resize = myTypes.Vector2(1.5, 1.5)
local bg = Image("images/philly/sky.png")
bg.resize = Vector2(1.5, 1.5)
bg.modifier = 0.1
bg.position = myTypes.Vector2(-300)
bg.position = Vector2(-300)
bg.layer = -10
local city = myTypes.Image("images/philly/city.png")
city.resize = myTypes.Vector2(1.5, 1.5)
local city = Image("images/philly/city.png")
city.resize = Vector2(1.5, 1.5)
city.modifier = 0.4
city.position = myTypes.Vector2(-300)
city.position = Vector2(-300)
city.layer = -9
local windows = myTypes.Image("images/philly/window.png")
windows.resize = myTypes.Vector2(1.5, 1.5)
local windows = Image("images/philly/window.png")
windows.resize = Vector2(1.5, 1.5)
windows.modifier = 0.4
windows.position = myTypes.Vector2(-300)
windows.position = Vector2(-300)
windows.layer = -8
local behindTrain = myTypes.Image("images/philly/behindTrain.png")
behindTrain.resize = myTypes.Vector2(1.5, 1.5)
behindTrain.position = myTypes.Vector2(-885)
local behindTrain = Image("images/philly/behindTrain.png")
behindTrain.resize = Vector2(1.5, 1.5)
behindTrain.position = Vector2(-885)
behindTrain.layer = -7
train = myTypes.Image("images/philly/train.png")
train.position = myTypes.Vector2(2000, 600)
train = Image("images/philly/train.png")
train.position = Vector2(2000, 600)
train.layer = -6
local street = myTypes.Image("images/philly/street.png")
street.resize = myTypes.Vector2(1.5, 1.5)
street.position = myTypes.Vector2(-885)
local street = Image("images/philly/street.png")
street.resize = Vector2(1.5, 1.5)
street.position = Vector2(-885)
street.layer = -5
passing = love.audio.newSource("sounds/philly/train_passes.ogg", "static")
@ -53,7 +53,7 @@ function stage.onBeat(beat)
cd = cd - 1
if cd == 0 then
cd = math.random(20, 25)
train.position = myTypes.Vector2(2000, 600)
train.position = Vector2(2000, 600)
trainPassing = true
stage.shared.characters.gf:PlayAnimation("hairBlow")
end

View File

@ -1,10 +1,8 @@
local mytypes = require('modules.types')
local module = {}
function module.onCreate()
module.shared.canvasSize = mytypes.Vector2(311, 161)
module.shared.screenSize = mytypes.Vector2(967, 500)
module.shared.canvasSize = Vector2(311, 161)
module.shared.screenSize = Vector2(967, 500)
for index, dir in next, module.shared.singVectors do
module.shared.singVectors[index] = dir:Div(5)
@ -12,26 +10,26 @@ function module.onCreate()
love.graphics.setDefaultFilter("nearest", "nearest", 0)
local sky = mytypes.Image("images/weeb/weebSky.png")
local sky = Image("images/weeb/weebSky.png")
sky.modifier = 0
sky.layer = -15
local backTrees = mytypes.Image("images/weeb/weebBackTrees.png", .1)
local backTrees = Image("images/weeb/weebBackTrees.png", .1)
backTrees.layer = -14
backTrees.position = mytypes.Vector2(-10)
backTrees.position = Vector2(-10)
local school = mytypes.Image("images/weeb/weebSchool.png", .4)
local school = Image("images/weeb/weebSchool.png", .4)
school.layer = -10
backTrees.position = mytypes.Vector2(-15)
backTrees.position = Vector2(-15)
local road = mytypes.Image("images/weeb/weebStreet.png", 1)
local road = Image("images/weeb/weebStreet.png", 1)
road.layer = -9
backTrees.position = mytypes.Vector2(-50, 30)
backTrees.position = Vector2(-50, 30)
local ZHENSHINI = mytypes.Sprite("sprites/weeb/bgFreaks.png", "sprites/weeb/bgFreaks.json")
local ZHENSHINI = Sprite("sprites/weeb/bgFreaks.png", "sprites/weeb/bgFreaks.json")
ZHENSHINI.layer = -2
backTrees.position = mytypes.Vector2(-70, 50)
backTrees.position = Vector2(-70, 50)
end

View File

@ -1,19 +1,19 @@
local myTypes = require("modules.types")
local lightningCountdown = love.math.random(15, 20) --holy fuck
local mansion
local sounds
return {
onCreate = function(song)
mansion = myTypes.Sprite("sprites/spooky/halloween_bg.png", "sprites/spooky/halloween_bg.json")
mansion.resize = myTypes.Vector2(2,2)
mansion = Sprite("sprites/spooky/halloween_bg.png", "sprites/spooky/halloween_bg.json")
mansion.resize = Vector2(2,2)
mansion:PlayAnimation("halloweem bg", 1, false)
mansion.position = myTypes.Vector2(-400, -200)
mansion.position = Vector2(-400, -200)
mansion.layer = -1
for index, anim in next, mansion.quads do
for index, quad in next, anim do
quad.resize = myTypes.Vector2(1.4,1.4)
quad.resize = Vector2(1.4,1.4)
end
end

View File

@ -1,19 +1,19 @@
local myTypes = require("modules.types")
return {
onCreate = function(song)
local trees = myTypes.Sprite("sprites/spooky/erect/bgtrees.png", "sprites/spooky/erect/bgtrees.json")
local trees = Sprite("sprites/spooky/erect/bgtrees.png", "sprites/spooky/erect/bgtrees.json")
trees:PlayAnimation("bgtrees", 5, true)
trees.position = myTypes.Vector2(100, 0)
trees.position = Vector2(100, 0)
trees.modifier = 0.8
trees.layer = -2
local mansion = myTypes.Image("images/spooky/erect/bgDark.png")
mansion.position = myTypes.Vector2(-325, -300)
local mansion = Image("images/spooky/erect/bgDark.png")
mansion.position = Vector2(-325, -300)
mansion.layer = -1
local stairs = myTypes.Image("images/spooky/erect/stairsDark.png")
stairs.position = myTypes.Vector2(1100, -225)
local stairs = Image("images/spooky/erect/stairsDark.png")
stairs.position = Vector2(1100, -225)
stairs.layer = 2
end
}

View File

@ -1,17 +1,17 @@
local myTypes = require("modules.types")
return {
onCreate = function(song)
local back = myTypes.Image("images/stage/stageback.png")
local back = Image("images/stage/stageback.png")
back.layer = -10
back.position = myTypes.Vector2(-800, 50)
back.position = Vector2(-800, 50)
local front = myTypes.Image("images/stage/stagefront.png")
local front = Image("images/stage/stagefront.png")
front.layer = -1
front.position = myTypes.Vector2(-900, 1000)
front.position = Vector2(-900, 1000)
local curtains = myTypes.Image("images/stage/stagecurtains.png")
curtains.position = myTypes.Vector2(-1150, 50)
local curtains = Image("images/stage/stagecurtains.png")
curtains.position = Vector2(-1150, 50)
curtains.modifier = 1.3
curtains.layer = 5
end

View File

@ -1,49 +1,49 @@
local myTypes = require("modules.types")
return {
onCreate = function(song)
local backDark = myTypes.Image("images/stage/erect/backDark.png")
backDark.position = myTypes.Vector2(729, -170)
local backDark = Image("images/stage/erect/backDark.png")
backDark.position = Vector2(729, -170)
backDark.layer = -10
local crowd = myTypes.Sprite("sprites/stage/erect/crowd.png", "sprites/stage/erect/crowd.json")
local crowd = Sprite("sprites/stage/erect/crowd.png", "sprites/stage/erect/crowd.json")
crowd:PlayAnimation("Symbol 2 instance 1", 24, true)
crowd.position = myTypes.Vector2(560, 150)
crowd.position = Vector2(560, 150)
crowd.modifier = 0.8
crowd.layer = -9
local brightLightSmall = myTypes.Image("images/stage/erect/brightLightSmall.png")
brightLightSmall.position = myTypes.Vector2(967, -103)
local brightLightSmall = Image("images/stage/erect/brightLightSmall.png")
brightLightSmall.position = Vector2(967, -103)
brightLightSmall.modifier = 1.2
brightLightSmall.layer = -8
local bg = myTypes.Image("images/stage/erect/bg.png")
bg.position = myTypes.Vector2(-603, -187)
local bg = Image("images/stage/erect/bg.png")
bg.position = Vector2(-603, -187)
bg.layer = -7
local server = myTypes.Image("images/stage/erect/server.png")
server.position = myTypes.Vector2(-361, 205)
local server = Image("images/stage/erect/server.png")
server.position = Vector2(-361, 205)
server.layer = -6
local lightGreen = myTypes.Image("images/stage/erect/lightgreen.png")
lightGreen.position = myTypes.Vector2(-171, 242)
local lightGreen = Image("images/stage/erect/lightgreen.png")
lightGreen.position = Vector2(-171, 242)
lightGreen.layer = -5
local lightRed = myTypes.Image("images/stage/erect/lightred.png")
lightRed.position = myTypes.Vector2(-101, 560)
local lightRed = Image("images/stage/erect/lightred.png")
lightRed.position = Vector2(-101, 560)
lightRed.layer = -4
local lightOrange = myTypes.Image("images/stage/erect/orangeLight.png")
lightOrange.position = myTypes.Vector2(189, -195)
local lightOrange = Image("images/stage/erect/orangeLight.png")
lightOrange.position = Vector2(189, -195)
lightOrange.layer = -3
local lights = myTypes.Image("images/stage/erect/lights.png")
lights.position = myTypes.Vector2(-601, -147)
local lights = Image("images/stage/erect/lights.png")
lights.position = Vector2(-601, -147)
lights.modifier = 1.2
lights.layer = 5
local lightAbove = myTypes.Image("images/stage/erect/lightAbove.png")
lights.position = myTypes.Vector2(804, -117)
local lightAbove = Image("images/stage/erect/lightAbove.png")
lights.position = Vector2(804, -117)
lightAbove.layer = 6
end
}

View File

@ -1,4 +1,4 @@
local myTypes = require("modules.types")
local rollingBGTank
local bgTankX = 200
local bgTankY = 50
@ -6,107 +6,107 @@ local watchtower, audience1, audience2, audience3, audience4, audience5, audienc
return {
onCreate = function(song)
local tankSky = myTypes.Image("images/tank/tankSky.png")
local tankSky = Image("images/tank/tankSky.png")
tankSky.layer = -10
tankSky.position = myTypes.Vector2(-800, -400)
tankSky.position = Vector2(-800, -400)
tankSky.modifer = 0
tankSky.resize = myTypes.Vector2(2.5, 2.5)
tankSky.resize = Vector2(2.5, 2.5)
local tankMountains = myTypes.Image("images/tank/tankMountains.png")
local tankMountains = Image("images/tank/tankMountains.png")
tankMountains.layer = -9
tankMountains.position = myTypes.Vector2(-150, 150)
tankMountains.position = Vector2(-150, 150)
tankMountains.modifier = 0.2
tankMountains.resize = myTypes.Vector2(1.7, 1.7)
tankMountains.resize = Vector2(1.7, 1.7)
local tankBuildings = myTypes.Image("images/tank/tankBuildings.png")
tankBuildings.position = myTypes.Vector2(-400, -100)
local tankBuildings = Image("images/tank/tankBuildings.png")
tankBuildings.position = Vector2(-400, -100)
tankBuildings.modifier = 0.3
tankBuildings.layer = -7
tankBuildings.resize = myTypes.Vector2(1.6, 1.6)
tankBuildings.resize = Vector2(1.6, 1.6)
local tankRuins = myTypes.Image("images/tank/tankRuins.png")
tankRuins.position = myTypes.Vector2(-400, -100)
local tankRuins = Image("images/tank/tankRuins.png")
tankRuins.position = Vector2(-400, -100)
tankRuins.modifier = 0.35
tankRuins.layer = -6
tankRuins.resize = myTypes.Vector2(1.6, 1.6)
tankRuins.resize = Vector2(1.6, 1.6)
local clouds = myTypes.Image("images/tank/tankClouds.png")
clouds.position = myTypes.Vector2(0, 0)
local clouds = Image("images/tank/tankClouds.png")
clouds.position = Vector2(0, 0)
clouds.modifier = 0.4
clouds.layer = -8
local smokeLeft = myTypes.Sprite("sprites/tank/smokeLeft.png", "sprites/tank/smokeLeft.json")
local smokeLeft = Sprite("sprites/tank/smokeLeft.png", "sprites/tank/smokeLeft.json")
smokeLeft:PlayAnimation("SmokeBlurLeft instance 1", 24, true)
smokeLeft.position = myTypes.Vector2(-100, 0)
smokeLeft.position = Vector2(-100, 0)
smokeLeft.modifier = 0.4
smokeLeft.layer = -5
local smokeRight = myTypes.Sprite("sprites/tank/smokeRight.png", "sprites/tank/smokeRight.json")
local smokeRight = Sprite("sprites/tank/smokeRight.png", "sprites/tank/smokeRight.json")
smokeRight:PlayAnimation("SmokeRight instance 1", 24, true)
smokeRight.position = myTypes.Vector2(700, -100)
smokeRight.position = Vector2(700, -100)
smokeRight.modifier = 0.4
smokeRight.layer = -5
watchtower = myTypes.Sprite("sprites/tank/tankWatchtower.png", "sprites/tank/tankWatchtower.json")
watchtower = Sprite("sprites/tank/tankWatchtower.png", "sprites/tank/tankWatchtower.json")
watchtower:PlayAnimation("watchtower gradient color instance 1", 24, false)
watchtower.position = myTypes.Vector2(25, 50)
watchtower.position = Vector2(25, 50)
watchtower.modifier = 0.5
watchtower.resize = myTypes.Vector2(2, 2)
watchtower.resize = Vector2(2, 2)
watchtower.layer = -4
rollingBGTank = myTypes.Sprite("sprites/tank/tankRolling.png", "sprites/tank/tankRolling.json")
rollingBGTank = Sprite("sprites/tank/tankRolling.png", "sprites/tank/tankRolling.json")
rollingBGTank:PlayAnimation("BG tank w lighting instance 1", 24, true)
rollingBGTank.modifier = 0.5
rollingBGTank.layer = -3
rollingBGTank.flipY = true
local tankGround = myTypes.Image("images/tank/tankGround.png")
tankGround.position = myTypes.Vector2(-420, -150)
local tankGround = Image("images/tank/tankGround.png")
tankGround.position = Vector2(-420, -150)
tankGround.layer = -2
tankGround.resize = myTypes.Vector2(1.15, 1.15)
tankGround.resize = Vector2(1.15, 1.15)
audience1 = myTypes.Sprite("sprites/tank/tank0.png", "sprites/tank/tank0.json")
audience1 = Sprite("sprites/tank/tank0.png", "sprites/tank/tank0.json")
audience1:PlayAnimation("fg tankhead far right instance 1", 24, false)
audience1.position = myTypes.Vector2(-200, 350)
audience1.position = Vector2(-200, 350)
audience1.modifier = 1.5
audience1.layer = 2
audience1.resize = myTypes.Vector2(1.6, 1.6)
audience1.resize = Vector2(1.6, 1.6)
audience2 = myTypes.Sprite("sprites/tank/tank2.png", "sprites/tank/tank2.json")
audience2 = Sprite("sprites/tank/tank2.png", "sprites/tank/tank2.json")
audience2:PlayAnimation("foreground man 3 instance 1", 24, false)
audience2.position = myTypes.Vector2(0, 400)
audience2.position = Vector2(0, 400)
audience2.modifier = 1.5
audience2.layer = 3
audience2.resize = myTypes.Vector2(1.6, 1.6)
audience2.resize = Vector2(1.6, 1.6)
audience3 = myTypes.Sprite("sprites/tank/tank3.png", "sprites/tank/tank3.json")
audience3 = Sprite("sprites/tank/tank3.png", "sprites/tank/tank3.json")
audience3:PlayAnimation("fg tankhead 4 instance 1", 24, false)
audience3.position = myTypes.Vector2(-100, 500)
audience3.position = Vector2(-100, 500)
audience3.modifier = 2.5
audience3.layer = 5
audience3.resize = myTypes.Vector2(1.6, 1.6)
audience3.resize = Vector2(1.6, 1.6)
audience4 = myTypes.Sprite("sprites/tank/tank4.png", "sprites/tank/tank4.json")
audience4 = Sprite("sprites/tank/tank4.png", "sprites/tank/tank4.json")
audience4:PlayAnimation("fg tankman bobbin 3 instance 1", 24, false)
audience4.position = myTypes.Vector2(300, 400)
audience4.position = Vector2(300, 400)
audience4.modifier = 1.5
audience4.layer = 4
audience4.resize = myTypes.Vector2(1.6, 1.6)
audience4.resize = Vector2(1.6, 1.6)
audience5 = myTypes.Sprite("sprites/tank/tank5.png", "sprites/tank/tank5.json")
audience5 = Sprite("sprites/tank/tank5.png", "sprites/tank/tank5.json")
audience5:PlayAnimation("fg tankhead far right instance 1", 24, false)
audience5.position = myTypes.Vector2(500, 350)
audience5.position = Vector2(500, 350)
audience5.modifier = 1.5
audience5.layer = 3
audience5.resize = myTypes.Vector2(1.6, 1.6)
audience5.resize = Vector2(1.6, 1.6)
--I'm not even gonna try what is this
--[[audience6 = myTypes.Sprite("sprites/tank/tank1.png", "sprites/tank/tank1.json")
--[[audience6 = Sprite("sprites/tank/tank1.png", "sprites/tank/tank1.json")
audience6:PlayAnimation("fg tankhead 5 instance 1", 24, false)
audience6.position = myTypes.Vector2(700, 500)
audience6.position = Vector2(700, 500)
audience6.modifier = 1.5
audience6.layer = 2
audience6.resize = myTypes.Vector2(1.6, 1.6)]]
audience6.resize = Vector2(1.6, 1.6)]]
end,
onBeat = function(beat)
@ -126,7 +126,7 @@ return {
bgTankX = math.cos(math.rad(elapsed / 100)) * 500
bgTankY = math.sin(math.rad(elapsed / 100)) * 500
bgTankRotate = elapsed / 5000
rollingBGTank.position = myTypes.Vector2(bgTankX, bgTankY)
rollingBGTank.position = Vector2(bgTankX, bgTankY)
rollingBGTank.rotation = bgTankRotate --testing
end
}

9
weeks/init.lua Normal file
View File

@ -0,0 +1,9 @@
local weeks = {}
for index, week in next, love.filesystem.getDirectoryItems("weeks") do
if week == "init.lua" then goto continue end
weeks[week] = require("weeks."..week:replace(".lua", ""))
::continue::
end
return weeks