Skip to content

Commit

Permalink
new character system
Browse files Browse the repository at this point in the history
  • Loading branch information
GuglioIsStupid committed Aug 31, 2024
1 parent 8ab2123 commit d2bef91
Show file tree
Hide file tree
Showing 21 changed files with 320 additions and 208 deletions.
49 changes: 49 additions & 0 deletions src/love/data/characters/BaseCharacter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
local Character = Object:extend()

function Character:new(luaPath)
self.spr = love.filesystem.load(luaPath)()
self.x, self.y = 0, 0
self.orientation = 0
self.sizeX, self.sizeY = 1, 1
self.offsetX, self.offsetY = 0, 0
self.shearX, self.shearY = 0, 0
self.optionsTable = self.spr.optionsTable
self.icon = self.optionsTable.icon
self.holdTimer = 0
self.maxHoldTimer = self.spr.maxHoldTimer

self.visible = true
end

function Character:update(dt)
self.spr:update(dt)

self.spr.x, self.spr.y = self.x, self.y
self.spr.orientation = self.orientation
self.spr.sizeX, self.spr.sizeY = self.sizeX, self.sizeY
self.spr.offsetX, self.spr.offsetY = self.spr.offsetX, self.spr.offsetY
self.spr.shearX, self.spr.shearY = self.shearX, self.shearY

self.spr.holdTimer = self.holdTimer
end

function Character:draw()
if not self.visible then return end

self.spr:draw()
end

function Character:udraw(sx, sy)
if not self.visible then return end
self.spr:udraw(sx, sy)
end

function Character:beat(beat)
self.spr:beat(beat)
end

function Character:animate(...)
self.spr:animate(...)
end

return Character
180 changes: 180 additions & 0 deletions src/love/data/characters/NeneCharacter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
local Nene = BaseCharacter:extend()

ABOT_IMAGE = nil
local abotVisualizers = {}
local MAX_ABOT_VIZ = 7
local VIS_TIME_MAX = 0.033333333333333333
local deltaCurTime = 0
local vizFrameWidth = 0

function Nene:new()
self.abot = graphics.newImage(graphics.imagePath("weekend1/abot"))
self.abotBack = graphics.newImage(graphics.imagePath("weekend1/stereoBG"))

abotVisualizers = {}
BaseCharacter.new(self, "sprites/characters/nene.lua")

self.STATE_DEFAULT = 0
self.STATE_PRE_RAISE = 1
self.STATE_RAISE = 2
self.STATE_READY = 3
self.STATE_LOWER = 4
self.currentState = self.STATE_DEFAULT

self.MIN_BLINK_DELAY = 3
self.MAX_BLINK_DELAY = 7
self.blinkCountdown = self.MIN_BLINK_DELAY

self.animationFinished = false

ABOT_IMAGE = love.graphics.newImage(graphics.imagePath("weekend1/aBotViz"))

for i = 1, MAX_ABOT_VIZ do
local viz = love.filesystem.load("sprites/weekend1/abotViz.lua")()
--viz:animate(tostring(i) .. "_1", false)
vizFrameWidth = viz:getFrameWidth()/2
viz.x = -170 + (vizFrameWidth + 25) * i
viz.y = 0--stageImages["abot"].y + 120
--print(viz.x)
table.insert(abotVisualizers, viz)
end
end

function Nene:update(dt)
BaseCharacter.update(self, dt)

deltaCurTime = deltaCurTime + dt

self.abot.x, self.abot.y = self.x + 48, self.y + 250
self.abotBack.x, self.abotBack.y = self.x + 48, self.y + 250

for i = 1, MAX_ABOT_VIZ do
abotVisualizers[i].x, abotVisualizers[i].y = self.x + -180 + (vizFrameWidth + 25) * i, self.y + 270
end
end

function Nene:transitionState()
if self.currentState == self.STATE_DEFAULT then
if health <= 0.5 then
self.currentState = self.STATE_PRE_RAISE
else
self.currentState = self.STATE_DEFAULT
end
elseif self.currentState == self.STATE_PRE_RAISE then
if health > 0.5 then
self.currentState = self.STATE_DEFAULT
elseif self.animationFinished then
self.currentState = self.STATE_RAISE
self:animate("knifeRaise", false, function()
self:transitionState()
self.animationFinished = true
end)
self.animationFinished = false
end
elseif self.currentState == self.STATE_RAISE then
if self.animationFinished then
self.currentState = self.STATE_READY
self.animationFinished = false
end
elseif self.currentState == self.STATE_READY then
if health > 0.5 then
self.currentState = self.STATE_LOWER
self:animate("knifeLower", false, function()
self:transitionState()
self.animationFinished = true
end)
end
elseif self.currentState == self.STATE_LOWER then
if self.animationFinished then
self.currentState = self.STATE_DEFAULT
self.animationFinished = false
end
else
self.currentState = self.STATE_DEFAULT
end
end

function Nene:updateOverride(dt)
self:transitionState()

if self.currentState == self.STATE_PRE_RAISE then
if self:getAnimName() == "danceLeft" and self:getFrameFromCurrentAnim() == self:getFrameCountFromCurrentAnim()-2 then
self.animationFinished = true
self:transitionState()
end
end
end

function Nene:beat(beat)
local beat = math.floor(beat) or 0

if beatHandler.onBeat() then
if beat % self.spr.danceSpeed == 0 then
self.spr.danced = not self.spr.danced

if self.currentState == self.STATE_DEFAULT then
if self.spr.danced then
self:animate("danceLeft", false)
else
self:animate("danceRight", false)
end
elseif self.currentState == self.STATE_PRE_RAISE then
self:animate("danceLeft")
self.spr.danced = true
elseif self.currentState == self.STATE_READY then
if self.blinkCountdown == 0 then
self:animate("knifeIdle", false)
self.blinkCountdown = love.math.random(self.MIN_BLINK_DELAY, self.MAX_BLINK_DELAY)
else
self.blinkCountdown = self.blinkCountdown - 1
end
end
end
end
end

function Nene:draw()
if not self.visible then return end

self.abotBack:draw()
if curOS ~= "NX" then
local fftArray = lovefftINST:get()
local bfFFTArray, enemyFFTArray = {}, {}
local time = inst:tell()
if deltaCurTime > VIS_TIME_MAX then
deltaCurTime = 0
--print("Time: " .. time)
lovefftINST:updatePlayTime(time)
end
-- we only have 7 bars
local MAX_BARS = 7
local forEach = #fftArray / MAX_BARS
local index = 1
for i = 1, #fftArray, forEach do
local i = math.floor(i)
-- 7 bars
local barHeight = fftArray[i] * 720*100
--print(index, i, barHeight)
-- convert bar height from a number from 1-6
local animNum = math.floor(math.remap(barHeight, 0, 720, 1, 6))
--print(index, i, animNum)
abotVisualizers[index]:animate(tostring(index) .. "_" .. tostring(animNum), false)
abotVisualizers[index]:draw()
index = index + 1
end
end
graphics.setColor(1, 1, 1, 1)
love.graphics.rectangle("fill", -315, 30, 120, 60)
self.abot:draw()

self.spr:draw()
end

function Nene:release()
for _, v in pairs(abotVisualizers) do
v = nil
end
ABOT_IMAGE = nil
end

return Nene
4 changes: 4 additions & 0 deletions src/love/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ function love.load()
loadSavedata()
settings.pixelPerfect = false

-- Load Characters
BaseCharacter = require "data.characters.BaseCharacter"
NeneCharacter = require "data.characters.NeneCharacter"

-- Modding
importMods = require "modding.importMods"

Expand Down
6 changes: 6 additions & 0 deletions src/love/modules/constants.lua
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ CONSTANTS.WEEKS = {
MISS_SCORE = 0,
SCORING_OFFSET = 54.00,
SCORING_SLOPE = 0.080,
LANE_SHADERS = {
love.graphics.newShader("shaders/RGBPallette.glsl"),
love.graphics.newShader("shaders/RGBPallette.glsl"),
love.graphics.newShader("shaders/RGBPallette.glsl"),
love.graphics.newShader("shaders/RGBPallette.glsl")
}
}

CONSTANTS.MISC = {
Expand Down
18 changes: 13 additions & 5 deletions src/love/modules/extras.lua
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,13 @@ function weeks.legacyGenerateNotes(self, chart)
local arrowsTable = enemyNote and enemyArrows or boyfriendArrows

noteObject.x = arrowsTable[id].x
noteObject.shader = love.graphics.newShader("shaders/RGBPallette.glsl")
noteObject.shader = CONSTANTS.WEEKS.LANE_SHADERS[id]
local r, g, b = CONSTANTS.ARROW_COLORS[id][1], CONSTANTS.ARROW_COLORS[id][2], CONSTANTS.ARROW_COLORS[id][3]

if dataStuff.r or dataStuff.g or dataStuff.b then
noteObject.shader = love.graphics.newShader("shaders/RGBPallette.glsl")
end

if dataStuff.r then r = {decToRGB(dataStuff.r)} end
if dataStuff.g then g = {decToRGB(dataStuff.g)} end
if dataStuff.b then b = {decToRGB(dataStuff.b)} end
Expand Down Expand Up @@ -188,17 +192,21 @@ function weeks.cneGenerateNotes(self, chart, metadata)

if settings.downscroll then noteObject.sizeY = -1 end

noteObject.x = arrowsTable[id].x
noteObject.shader = love.graphics.newShader("shaders/RGBPallette.glsl")
local r, g, b = CONSTANTS.ARROW_COLORS[id][1], CONSTANTS.ARROW_COLORS[id][2], CONSTANTS.ARROW_COLORS[id][3]

local dataStuff = {}
if noteTypes[noteVer] then
dataStuff = noteTypes[noteVer]
else
dataStuff = noteTypes["normal"]
end

noteObject.x = arrowsTable[id].x
noteObject.shader = CONSTANTS.WEEKS.LANE_SHADERS[id]
local r, g, b = CONSTANTS.ARROW_COLORS[id][1], CONSTANTS.ARROW_COLORS[id][2], CONSTANTS.ARROW_COLORS[id][3]

if dataStuff.r or dataStuff.g or dataStuff.b then
noteObject.shader = love.graphics.newShader("shaders/RGBPallette.glsl")
end

if dataStuff.r then r = {decToRGB(dataStuff.r)} end
if dataStuff.g then g = {decToRGB(dataStuff.g)} end
if dataStuff.b then b = {decToRGB(dataStuff.b)} end
Expand Down
2 changes: 1 addition & 1 deletion src/love/stages/city.lua
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ return {

stageImages["Train"].x, stageImages["Train"].y = 3000, -25

enemy = love.filesystem.load("sprites/characters/pico-enemy.lua")()
enemy = BaseCharacter("sprites/characters/pico-enemy.lua")

sounds.trainPassing = love.audio.newSource("sounds/week3/train.ogg", "static")

Expand Down
2 changes: 1 addition & 1 deletion src/love/stages/evilSchool.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ return {
stageImages = {
["Evil School"] = love.filesystem.load("sprites/week6/evil-school.lua")() -- evil school
}
enemy = love.filesystem.load("sprites/characters/spirit.lua")()
enemy = BaseCharacter("sprites/characters/spirit.lua")
enemy.x, enemy.y = -340, -20

girlfriend.x, girlfriend.y = 30, -50
Expand Down
2 changes: 1 addition & 1 deletion src/love/stages/hauntedHouse.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ return {
["Haunted House"] = love.filesystem.load("sprites/week2/haunted-house.lua")() -- Haunted House
}

enemy = love.filesystem.load("sprites/characters/skid-and-pump.lua")()
enemy = BaseCharacter("sprites/characters/skid-and-pump.lua")

girlfriend.x, girlfriend.y = -200, 50
enemy.x, enemy.y = -610, 140
Expand Down
8 changes: 4 additions & 4 deletions src/love/stages/mall.lua
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ return {
stageImages["Bottom Bop"].x, stageImages["Bottom Bop"].y = -75, 375
stageImages["Santa"].x, stageImages["Santa"].y = -1350, 410
end
girlfriend = love.filesystem.load("sprites/characters/girlfriend-christmas.lua")()
enemy = love.filesystem.load("sprites/characters/dearest-duo.lua")()
boyfriend = love.filesystem.load("sprites/characters/boyfriend-christmas.lua")()
fakeBoyfriend = love.filesystem.load("sprites/characters/boyfriend.lua")() -- Used for game over
girlfriend = BaseCharacter("sprites/characters/girlfriend-christmas.lua")
enemy = BaseCharacter("sprites/characters/dearest-duo.lua")
boyfriend = BaseCharacter("sprites/characters/boyfriend-christmas.lua")
fakeBoyfriend = BaseCharacter("sprites/characters/boyfriend.lua") -- Used for game over

camera.defaultZoom = 0.9

Expand Down
12 changes: 6 additions & 6 deletions src/love/stages/school.lua
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ return {
["Petals"] = love.filesystem.load("sprites/week6/petals.lua")(), -- petals
["Freaks"] = love.filesystem.load("sprites/week6/freaks.lua")() -- freaks
}
girlfriend = love.filesystem.load("sprites/characters/girlfriend-pixel.lua")()
boyfriend = love.filesystem.load("sprites/characters/boyfriend-pixel.lua")()
enemy = love.filesystem.load("sprites/characters/senpai.lua")()
girlfriend = BaseCharacter("sprites/characters/girlfriend-pixel.lua")
boyfriend = BaseCharacter("sprites/characters/boyfriend-pixel.lua")
enemy = BaseCharacter("sprites/characters/senpai.lua")
enemy.colours = {255,170,111}
fakeBoyfriend = love.filesystem.load("sprites/characters/boyfriend-pixel-dead.lua")() -- Used for game over
fakeBoyfriend = BaseCharacter("sprites/characters/boyfriend-pixel-dead.lua") -- Used for game over
if settings.pixelPerfect then
girlfriend.x, girlfriend.y = 0, 0
boyfriend.x, boyfriend.y = 50, 30
Expand All @@ -50,11 +50,11 @@ return {

load = function(self)
if song == 3 then
enemy = love.filesystem.load("sprites/characters/spirit.lua")()
enemy = BaseCharacter("sprites/characters/spirit.lua")
stageImages["School"] = love.filesystem.load("sprites/week6/evil-school.lua")()
enemy.x, enemy.y = -50, 0
elseif song == 2 then
enemy = love.filesystem.load("sprites/characters/senpai-angry.lua")()
enemy = BaseCharacter("sprites/characters/senpai-angry.lua")
enemy.colours = {255,170,111}
stageImages["Freaks"]:animate("dissuaded", true)
enemy.x, enemy.y = -50, 0
Expand Down
2 changes: 1 addition & 1 deletion src/love/stages/stage.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ return {
stageImages["Stage Front"].y = 400
stageImages["Curtains"].y = -100

enemy = love.filesystem.load("sprites/characters/daddy-dearest.lua")()
enemy = BaseCharacter("sprites/characters/daddy-dearest.lua")

girlfriend.x, girlfriend.y = 30, -90
enemy.x, enemy.y = -380, -110
Expand Down
Loading

0 comments on commit d2bef91

Please sign in to comment.