2025-04-16 21:38:42 +08:00

1428 lines
77 KiB
Lua

local ____lualib = require("lualib_bundle")
local __TS__New = ____lualib.__TS__New
local __TS__ArrayPushArray = ____lualib.__TS__ArrayPushArray
local __TS__ArraySplice = ____lualib.__TS__ArraySplice
local __TS__AsyncAwaiter = ____lualib.__TS__AsyncAwaiter
local __TS__Await = ____lualib.__TS__Await
local Map = ____lualib.Map
local __TS__ArrayMap = ____lualib.__TS__ArrayMap
local __TS__InstanceOf = ____lualib.__TS__InstanceOf
local __TS__ArrayIndexOf = ____lualib.__TS__ArrayIndexOf
local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter
local __TS__PromiseAll = ____lualib.__TS__PromiseAll
local __TS__Delete = ____lualib.__TS__Delete
local __TS__Iterator = ____lualib.__TS__Iterator
local ____exports = {}
local ____storyteller = require("code.engine.storyteller")
local ST = ____storyteller.ST
local STAnimation = ____storyteller.STAnimation
local STContainer = ____storyteller.STContainer
local STFacing = ____storyteller.STFacing
local STMap = ____storyteller.STMap
local STRectangle = ____storyteller.STRectangle
local STSprite = ____storyteller.STSprite
local STText = ____storyteller.STText
local STValue = ____storyteller.STValue
local ____global = require("code.global")
local accessor = ____global.accessor
local random = ____global.random
local function textGen()
return { encounter1 = "(Press [↑] [↓] [←] [→] to move.)" }
end
local function rhythm(assets, ____bindingPattern0, batch, game, inputs, ____bindingPattern1)
local atlas
atlas = ____bindingPattern0.atlas
local screen
screen = ____bindingPattern1.screen
local rhythm_container, rhythm_hooks, text
local rhythm = {
intro = function(self)
return __TS__AsyncAwaiter(function(____awaiter_resolve)
local acc = 0
local starx = __TS__New(
STRectangle,
{
metadata = __TS__New(STValue, 0.25),
priority = 60000
}
)
screen:attach(starx)
local field = __TS__New(STContainer, { alpha = 0, metadata = { b = {}, p = {} }, priority = 2 })
local function starDrawer(sim, a)
if sim == nil then
sim = false
end
if a == nil then
a = starx.metadata.value
end
acc = acc + (1 + a * 20)
while 1 <= acc do
acc = acc - 1
if #field.metadata.b == 0 then
__TS__ArrayPushArray(
field.metadata.b,
ST:populate(
360,
function(i) return i end
)
)
end
local xy = ST:ray(
__TS__ArraySplice(
field.metadata.b,
math.floor(math.random() * #field.metadata.b),
1
)[1],
1
)
local ____field_metadata_p_0 = field.metadata.p
____field_metadata_p_0[#____field_metadata_p_0 + 1] = {
xy.x,
xy.y,
math.random(),
0.001
}
end
local index = #field.metadata.p
while true do
local ____index_1 = index
index = ____index_1 - 1
if not (____index_1 ~= 0) then
break
end
do
local starline = field.metadata.p[index + 1]
local progress = starline[4] * (1 + a / (50 - starline[3] * 48))
if 1.5 <= progress then
__TS__ArraySplice(field.metadata.p, index, 1)
goto __continue9
end
if sim then
starline[4] = progress
goto __continue9
end
local ox = starline[1] * starline[4] * 200
local oy = starline[2] * starline[4] * 200
starline[4] = progress
local c = (1 - (1 - progress) ^ 2) * (0.05 + starline[3] ^ 4 * 0.95)
love.graphics.setLineWidth(ST:remap(progress * (0.2 + starline[3] * 0.8), 0.25, 1.5))
love.graphics.setColor(c, c, c, a)
love.graphics.line(ox, oy, starline[1] * progress * 200, starline[2] * progress * 200)
end
::__continue9::
end
end
local i = 30 * 20
while true do
local ____i_2 = i
i = ____i_2 - 1
if not (____i_2 ~= 0) then
break
end
starDrawer(true, 1)
end
local sh = __TS__New(STValue)
local function shTicker()
screen.position.x = sh.value * (math.random() * 2 - 1)
screen.position.y = sh.value * (math.random() * 2 - 1)
end
screen:addTicker(shTicker)
local ____self_3 = sh:automate(150, 2, 0)
____self_3["then"](
____self_3,
function()
screen:removeTicker(shTicker)
screen.position.x = 0
screen.position.y = 0
end
)
local canvas = love.graphics.newCanvas(ST.width, ST.height)
field:addDrawer(function(self)
local color = { love.graphics.getColor() }
local canvas2 = { love.graphics.getCanvas() }
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas(canvas)
love.graphics.clear(0, 0, 0, 0)
love.graphics.push()
love.graphics.replaceTransform(love.math.newTransform(
ST.width / 2 + starx.position.x,
ST.height / 2 + starx.position.y,
0,
starx.scale.x,
starx.scale.y
))
starDrawer()
love.graphics.pop()
return function()
love.graphics.push()
love.graphics.replaceTransform(love.math.newTransform(
0,
0,
0,
ST.scale,
ST.scale
))
love.graphics.setCanvas(canvas2)
love.graphics.setColor(color)
love.graphics.setBlendMode("add", "alphamultiply")
love.graphics.draw(canvas)
love.graphics.pop()
end
end)
starx:attach(field)
field.alpha:automate(15, 1)
starx.metadata:automate(150, 1)
__TS__Await(ST:pause(10))
local black = __TS__New(STRectangle, {
alpha = 0,
priority = 1,
anchor = 0.5,
color = 0,
size = { x = 250, y = 190 }
})
starx:attach(black)
__TS__Await(black.alpha:automate(30, 1))
local white = __TS__New(STRectangle,
{ alpha = 0, anchor = 0.5, size = { x = 250, y = 190 }, priority = 3 })
starx:attach(white)
__TS__Await(white.alpha:automate(90, 1))
starx:detach(black, field)
canvas:release()
local ____self_4 = white.alpha:automate(90, 0)
____self_4["then"](
____self_4,
function()
screen:detach(starx)
end
)
end)
end,
start = function(self, preset)
return __TS__AsyncAwaiter(function(____awaiter_resolve)
game.encounter = true
local stage = preset.init
local state = {}
local music = __TS__New(Map)
while true do
local stargate, task1, wrapper, xgen
local value = preset.stages[stage]
local script = __TS__Await(preset:script(state, stage))
if value == nil then
break
end
for ____, track in ipairs(value.tracks) do
if not music:has(track) then
music:set(
track,
preset.tracks[track + 1]:instance_forced({
autoplay = false,
effects = ST.distance
.name_list,
rate = value.rate
})
)
end
end
local audios = __TS__ArrayMap(
value.tracks,
function(____, track) return music:get(track).audio end
)
if not music:has(-1) then
music:set(
-1,
value.inst:instance_forced({ autoplay = false, gain = 0, rate = value.rate })
)
end
local inst = music:get(-1)
audios[#audios + 1] = inst.audio
local ____try = __TS__AsyncAwaiter(function()
for ____, audio in ipairs(audios) do
audio:play()
end
end)
__TS__Await(____try.catch(
____try,
function(____)
end
))
for ____, track in ipairs(value.tracks) do
music:get(track).active = true
end
inst.active = true
local apool = ST:populate(
#value.actions,
function(index) return index end
)
local actions = __TS__ArrayMap(
value.actions,
function(____, action, index)
return {
action[1],
__TS__ArraySplice(
apool,
random:int(#apool),
1
)[1],
action[2],
index
}
end
)
table.sort(
actions,
function(a, b) return a[1] < b[1] end
)
local finish = -math.huge
local total = 0
local buffer = value.buffer
local duration = math.floor(value.duration / value.rate + 0.5)
local notes = {}
local seconds = math.floor((inst.audio:getDuration("seconds") or 0) * ST.fps + 0.5)
local start = math.floor((inst.position.value or 0) * ST.fps + 0.5)
for ____, note in ipairs(value.chart) do
if start + buffer <= note[1] and note[1] + note[2] <= start + buffer + duration then
notes[#notes + 1] = note
finish = math.max(finish, note[1] + note[2])
total = total + note[2]
elseif start + buffer <= seconds + note[1] and seconds + note[1] + note[2] <= start + buffer + duration then
notes[#notes + 1] = { seconds + note[1], note[2], note[3] }
finish = math.max(finish, seconds + note[1] + note[2])
total = total + note[2]
end
end
local done = false
local face_note = nil
local face = nil
local score = 0
local hint_progress = accessor.rhythm and 3 or 0
local hint_time = 0
local prog = 0
local time = start
local canvas = love.graphics.newCanvas(ST.width, ST.height)
local emotion = __TS__New(STAnimation, {
frames = value.emotion,
anchor = 0.5,
direction = 1,
priority = -99,
color = value.color
}):addTicker(function(self)
self.alpha.value = wrapper.alpha.value * stargate.alpha.value * 0.2
end)
local gvalue = __TS__New(STValue, 1)
local function flare_ticker(self)
if self.metadata then
self.alpha.value = 1
self.direction = 1
else
self.direction = 0
local ____temp_8 = not done and self.alpha.value > 0
if ____temp_8 then
local ____self_alpha_5, ____value_6 = self.alpha, "value"
local ____self_alpha_value_7 = ____self_alpha_5[____value_6] - 0.1
____self_alpha_5[____value_6] = ____self_alpha_value_7
____temp_8 = ____self_alpha_value_7 < 0
end
if ____temp_8 then
self.alpha.value = 0
self.frame = 0
self.step = 0
end
end
end
local flare_down = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
anchor = { y = 0.5 },
frames = assets["ig$rhythm$flare"],
position = { y = 20 },
rotation = 90
}):addTicker(flare_ticker)
local flare_down_left = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
frames = assets["ig$rhythm$flare_diag"],
position = { x = -8, y = 8 },
rotation = 90
}):addTicker(flare_ticker)
local flare_down_right = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
frames = assets["ig$rhythm$flare_diag"],
position = 8
}):addTicker(flare_ticker)
local flare_left = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
anchor = { y = 0.5 },
frames = assets["ig$rhythm$flare"],
position = { x = -20 },
rotation = 180
}):addTicker(flare_ticker)
local flare_right = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
anchor = { y = 0.5 },
frames = assets["ig$rhythm$flare"],
position = { x = 20 }
}):addTicker(flare_ticker)
local flare_up = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
anchor = { y = 0.5 },
frames = assets["ig$rhythm$flare"],
position = { y = -20 },
rotation = 270
}):addTicker(flare_ticker)
local flare_up_left = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
frames = assets["ig$rhythm$flare_diag"],
position = { x = -8, y = -8 },
rotation = 180
}):addTicker(flare_ticker)
local flare_up_right = __TS__New(STAnimation, {
alpha = 0,
priority = 5,
metadata = false,
frames = assets["ig$rhythm$flare_diag"],
position = { x = 8, y = -8 },
rotation = 270
}):addTicker(flare_ticker)
local joystick = __TS__New(STAnimation, {
anchor = 0.5,
direction = 1,
frames = assets["ig$rhythm$joystick_neutral1"],
priority = 6,
metadata = { x = nil, y = nil, c = 15 }
}):addTicker(function(self)
local idx = math.floor(ST:remap(
score / total,
0,
6,
prog == 0 and 0 or actions[prog][1],
actions[prog + 1][1]
))
local d = false
local r = 0
local x = 0
local y = 0
repeat
local ____switch45 = face
local ____cond45 = ____switch45 == STFacing.DOWN
if ____cond45 then
r = 90
y = 1
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.DOWN_LEFT
if ____cond45 then
d = true
r = 90
x = -0.7071067811865476
y = 0.7071067811865476
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.DOWN_RIGHT
if ____cond45 then
d = true
x = 0.7071067811865476
y = 0.7071067811865476
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.LEFT
if ____cond45 then
r = 180
x = -1
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.RIGHT
if ____cond45 then
x = 1
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.UP
if ____cond45 then
r = 270
y = -1
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.UP_LEFT
if ____cond45 then
d = true
r = 180
x = -0.7071067811865476
y = -0.7071067811865476
break
end
____cond45 = ____cond45 or ____switch45 == STFacing.UP_RIGHT
if ____cond45 then
d = true
r = 270
x = 0.7071067811865476
y = -0.7071067811865476
break
end
until true
x = x * (11 - idx)
y = y * (11 - idx)
if self.metadata.x == nil or self.metadata.y == nil then
self.metadata.x = x
self.metadata.y = y
end
self.metadata.x = (self.metadata.x + x * 2) / 3
self.metadata.y = (self.metadata.y + y * 2) / 3
self.position.x = math.floor(self.metadata.x + 0.5)
self.position.y = math.floor(self.metadata.y + 0.5)
self.rotation.value = r
if face_note ~= nil and face == face_note then
if not done then
self.metadata.c = 0
end
if d then
repeat
local ____switch50 = idx
local ____cond50 = ____switch50 == 0
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal1"]
break
end
____cond50 = ____cond50 or ____switch50 == 1
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal2"]
break
end
____cond50 = ____cond50 or ____switch50 == 2
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal3"]
break
end
____cond50 = ____cond50 or ____switch50 == 3
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal4"]
break
end
____cond50 = ____cond50 or ____switch50 == 4
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal5"]
break
end
____cond50 = ____cond50 or ____switch50 == 5
if ____cond50 then
self.frames = assets["ig$rhythm$joystick_diagonal6"]
break
end
until true
else
repeat
local ____switch52 = idx
local ____cond52 = ____switch52 == 0
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal1"]
break
end
____cond52 = ____cond52 or ____switch52 == 1
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal2"]
break
end
____cond52 = ____cond52 or ____switch52 == 2
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal3"]
break
end
____cond52 = ____cond52 or ____switch52 == 3
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal4"]
break
end
____cond52 = ____cond52 or ____switch52 == 4
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal5"]
break
end
____cond52 = ____cond52 or ____switch52 == 5
if ____cond52 then
self.frames = assets["ig$rhythm$joystick_cardinal6"]
break
end
until true
end
else
repeat
local ____switch54 = idx
local ____cond54 = ____switch54 == 0
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral1"]
break
end
____cond54 = ____cond54 or ____switch54 == 1
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral2"]
break
end
____cond54 = ____cond54 or ____switch54 == 2
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral3"]
break
end
____cond54 = ____cond54 or ____switch54 == 3
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral4"]
break
end
____cond54 = ____cond54 or ____switch54 == 4
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral5"]
break
end
____cond54 = ____cond54 or ____switch54 == 5
if ____cond54 then
self.frames = assets["ig$rhythm$joystick_neutral6"]
break
end
until true
end
local c = ST:remap(self.metadata.c / 15, 255, 127)
self.color.red = c
self.color.green = c
self.color.blue = c
if not done and self.metadata.c < 15 then
local ____self_metadata_9, ____c_10 = self.metadata, "c"
____self_metadata_9[____c_10] = ____self_metadata_9[____c_10] + 1
end
end)
local map = screen:scan(function(c) return __TS__InstanceOf(c, STMap) end):next().value
local rgb = ST:hex2rgb(value.color)
stargate = __TS__New(
STContainer,
{
scale = 0.9,
color = ST:hex2rgb(12566463),
metadata = nil,
children = {
__TS__New(STSprite, { image = assets["ig$rhythm$backdrop"], anchor = 0.5 }):addTicker(function(
self)
self.scale.x = 1 / stargate.scale.x
self.scale.y = 1 / stargate.scale.y
end),
__TS__New(STSprite,
{ image = assets["ig$rhythm$circle"], anchor = 0.5, metadata = 15, priority = 2 })
:addTicker(function(self)
if not done and face_note ~= nil and face ~= face_note then
self.metadata = 0
end
local c = ST:remap(self.metadata / 15, 255, 127)
self.color.red = c
self.color.green = c
self.color.blue = c
if not done and self.metadata < 15 then
self.metadata = self.metadata + 1
end
end),
flare_down,
flare_down_left,
flare_down_right,
flare_left,
flare_right,
flare_up,
flare_up_left,
flare_up_right,
__TS__New(STContainer, { priority = 4 }):addDrawer(function(self)
local color = { love.graphics.getColor() }
local canvas2 = { love.graphics.getCanvas() }
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas(canvas)
love.graphics.clear(0, 0, 0, 0)
love.graphics.push()
love.graphics.replaceTransform(love.math.newTransform(
ST.width / 2 + stargate.position.x,
ST.height / 2 + stargate.position.y,
0,
stargate.scale.x,
stargate.scale.y
))
for ____, note in ipairs(notes) do
if note[1] <= time + 50 and time < note[1] + note[2] then
local offset = math.floor(math.max(0, note[1] - time) * 4 + 0.5)
local length = math.floor(math.min(
note[2],
math.max(0, note[1] + note[2] - time)
) * 4 + 0.5)
repeat
local ____switch72 = note[3]
local ____cond72 = ____switch72 == STFacing.DOWN
if ____cond72 then
love.graphics.rectangle(
"line",
-1.5,
21.5 + offset,
3,
length
)
break
end
____cond72 = ____cond72 or ____switch72 == STFacing.DOWN_LEFT
if ____cond72 then
do
local x = math.floor(-15 - offset * 0.7071067811865476 + 0.5)
local y = math.floor(15 + offset * 0.7071067811865476 + 0.5)
local l = math.floor(length * 0.7071067811865476 + 0.5)
love.graphics.line(
x - 1.5,
y - 1.5,
x + 1.5,
y + 1.5,
x - l + 1.5,
y + l + 1.5,
x - l - 1.5,
y + l - 1.5,
x - 1.5,
y - 1.5
)
break
end
end
____cond72 = ____cond72 or ____switch72 == STFacing.DOWN_RIGHT
if ____cond72 then
do
local x = math.floor(15 + offset * 0.7071067811865476 + 0.5)
local y = math.floor(15 + offset * 0.7071067811865476 + 0.5)
local l = math.floor(length * 0.7071067811865476 + 0.5)
love.graphics.line(
x + 1.5,
y - 1.5,
x + l + 1.5,
y + l - 1.5,
x + l - 1.5,
y + l + 1.5,
x - 1.5,
y + 1.5,
x + 1.5,
y - 1.5
)
break
end
end
____cond72 = ____cond72 or ____switch72 == STFacing.LEFT
if ____cond72 then
love.graphics.rectangle(
"line",
-21.5 - offset - length,
-1.5,
length,
3
)
break
end
____cond72 = ____cond72 or ____switch72 == STFacing.RIGHT
if ____cond72 then
love.graphics.rectangle(
"line",
21.5 + offset,
-1.5,
length,
3
)
break
end
____cond72 = ____cond72 or ____switch72 == STFacing.UP
if ____cond72 then
love.graphics.rectangle(
"line",
-1.5,
-21.5 - offset - length,
3,
length
)
break
end
____cond72 = ____cond72 or ____switch72 == STFacing.UP_LEFT
if ____cond72 then
do
local x = math.floor(-15 - offset * 0.7071067811865476 + 0.5)
local y = math.floor(-15 - offset * 0.7071067811865476 + 0.5)
local l = math.floor(length * 0.7071067811865476 + 0.5)
love.graphics.line(
x - l + 1.5,
y - l - 1.5,
x + 1.5,
y - 1.5,
x - 1.5,
y + 1.5,
x - l - 1.5,
y - l + 1.5,
x - l + 1.5,
y - l - 1.5
)
break
end
end
____cond72 = ____cond72 or ____switch72 == STFacing.UP_RIGHT
if ____cond72 then
do
local x = math.floor(15 + offset * 0.7071067811865476 + 0.5)
local y = math.floor(-15 - offset * 0.7071067811865476 + 0.5)
local l = math.floor(length * 0.7071067811865476 + 0.5)
love.graphics.line(
x + l - 1.5,
y - l - 1.5,
x + l + 1.5,
y - l + 1.5,
x + 1.5,
y + 1.5,
x - 1.5,
y - 1.5,
x + l - 1.5,
y - l - 1.5
)
break
end
end
until true
end
end
love.graphics.pop()
return function()
love.graphics.push()
love.graphics.replaceTransform(love.math.newTransform(
0,
0,
0,
ST.scale,
ST.scale
))
love.graphics.setCanvas(canvas2)
love.graphics.setColor(color)
love.graphics.draw(canvas)
love.graphics.pop()
end
end),
joystick
}
}
):addTicker(function(self)
if done then
if self.alpha.value > 0.01 then
self.alpha.value = self.alpha.value * 5 / 6
self.scale.x = (self.scale.x * 5 + 0.9) / 6
self.scale.y = (self.scale.y * 5 + 0.9) / 6
map.alpha.value = 1 - self.alpha.value / 4
map.scale.x = self.scale.x / 0.9
map.scale.y = self.scale.y / 0.9
local ev = { name = "gameplay_fade", value = 1 - self.alpha.value }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
map:tick_position()
gvalue.value = 1 - self.alpha.value
else
wrapper:detach(stargate)
map.alpha.value = 1
map.scale.x = 1
map.scale.y = 1
local ev = { name = "gameplay_fade", value = 1 }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
map:tick_position()
task1.complete()
end
end
end)
local task0 = ST:task()
task1 = ST:task()
wrapper = __TS__New(
STContainer,
{
alpha = 0,
metadata = { xord = {}, xpop = 0 },
children = {
stargate,
unpack(accessor.rhythm and ({}) or ({ __TS__New(STText, {
font = assets["f$helloplayer"],
color = 8355711,
anchor = 0.5,
position = { y = -70 },
scale = 0.75,
content = text.encounter1,
justify = 0.5
}):addTicker(function(self)
self.alpha.value = (3 <= hint_progress or hint_time < 90) and 0 or 1
if not done and face == nil then
hint_time = hint_time + 1
end
end) }))
}
}
):addTicker(function(self)
if self.alpha.value < 0.99 then
self.alpha.value = (self.alpha.value * 5 + 1) / 6
stargate.scale.x = (stargate.scale.x * 5 + 1) / 6
stargate.scale.y = (stargate.scale.y * 5 + 1) / 6
map.alpha.value = 1 - self.alpha.value / 3
map.scale.x = stargate.scale.x / 0.9
map.scale.y = stargate.scale.y / 0.9
local ev = { name = "gameplay_fade", value = 1 - self.alpha.value }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
map:tick_position()
gvalue.value = 1 - self.alpha.value
elseif self.alpha.value ~= 1 then
self.alpha.value = 1
stargate.scale.x = 1
stargate.scale.y = 1
map.alpha.value = 2 / 3
map.scale.x = 1 / 0.9
map.scale.y = 1 / 0.9
local ev = { name = "gameplay_fade", value = 0 }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
map:tick_position()
gvalue.value = 0
end
flare_down.metadata = false
flare_down_left.metadata = false
flare_down_right.metadata = false
flare_left.metadata = false
flare_right.metadata = false
flare_up.metadata = false
flare_up_left.metadata = false
flare_up_right.metadata = false
if done then
local ____inst_gain_13, ____value_14 = inst.gain, "value"
____inst_gain_13[____value_14] = ____inst_gain_13[____value_14] / 4
return
end
local shx = 0
local shy = 0
local pface = face
if inputs.up.held then
if inputs.left.held then
face = STFacing.UP_LEFT
shx = -1
shy = -1
elseif inputs.right.held then
face = STFacing.UP_RIGHT
shx = 1
shy = -1
else
face = STFacing.UP
shy = -1
end
elseif inputs.down.held then
if inputs.left.held then
face = STFacing.DOWN_LEFT
shx = -1
shy = 1
elseif inputs.right.held then
face = STFacing.DOWN_RIGHT
shx = 1
shy = 1
else
face = STFacing.DOWN
shy = 1
end
elseif inputs.left.held then
face = STFacing.LEFT
shx = -1
elseif inputs.right.held then
face = STFacing.RIGHT
shx = 1
else
face = nil
end
if pface ~= face and face ~= nil then
if 120 <= hint_time then
hint_progress = 3
else
hint_progress = hint_progress + 1
end
hint_time = 0
end
face_note = nil
for ____, note in ipairs(notes) do
do
if note[1] <= time and time < note[1] + note[2] then
face_note = note[3]
if face ~= face_note then
goto __continue110
end
repeat
local ____switch113 = note[3]
local ____cond113 = ____switch113 == STFacing.DOWN
if ____cond113 then
flare_down.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.DOWN_LEFT
if ____cond113 then
flare_down_left.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.DOWN_RIGHT
if ____cond113 then
flare_down_right.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.LEFT
if ____cond113 then
flare_left.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.RIGHT
if ____cond113 then
flare_right.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.UP
if ____cond113 then
flare_up.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.UP_LEFT
if ____cond113 then
flare_up_left.metadata = true
break
end
____cond113 = ____cond113 or ____switch113 == STFacing.UP_RIGHT
if ____cond113 then
flare_up_right.metadata = true
break
end
until true
end
end
::__continue110::
end
local x
local y
if face_note ~= nil then
if face == face_note then
local s = ST:wave(ST:remap(
score / total,
0,
6,
prog == 0 and 0 or actions[prog][1],
actions[prog + 1][1]
))
x = s * shx * -2
y = s * shy * -2
inst.gain.value = inst.daemon.gain
emotion.alpha.value = 0.3
else
x = math.random() * 2 - 1
y = math.random() * 2 - 1
local ____inst_gain_15, ____value_16 = inst.gain, "value"
____inst_gain_15[____value_16] = ____inst_gain_15[____value_16] / 4
local ____emotion_alpha_17, ____value_18 = emotion.alpha, "value"
____emotion_alpha_17[____value_18] = ____emotion_alpha_17[____value_18] - 0.05 / 15
if emotion.alpha.value < 0.25 then
emotion.alpha.value = 0.25
end
end
else
x = 0
y = 0
local ____emotion_alpha_19, ____value_20 = emotion.alpha, "value"
____emotion_alpha_19[____value_20] = ____emotion_alpha_19[____value_20] - 0.05 / 15
if emotion.alpha.value < 0.2 then
emotion.alpha.value = 0.2
end
end
if stargate.metadata == nil then
stargate.metadata = { x, y }
end
stargate.metadata[1] = (stargate.metadata[1] + x * 2) / 3
stargate.metadata[2] = (stargate.metadata[2] + y * 2) / 3
stargate.position.x = math.floor(stargate.metadata[1] + 0.5)
stargate.position.y = math.floor(stargate.metadata[2] + 0.5)
end):addDrawer(function(self)
local c = { love.graphics.getColor() }
love.graphics.setColor(
ST:remap(stargate.alpha.value, c[1], rgb.red / 255),
ST:remap(stargate.alpha.value, c[2], rgb.green / 255),
ST:remap(stargate.alpha.value, c[3], rgb.blue / 255),
c[4]
)
return function()
if not done then
time = time + value.rate
local ____temp_12 = face_note ~= nil and face == face_note
if ____temp_12 then
local ____actions_index__1_11 = actions[prog + 1][1]
score = score + 1
____temp_12 = ____actions_index__1_11 <= score / total
end
if ____temp_12 then
xgen()
end
if finish <= time or prog == #actions then
done = true
if 3 <= hint_progress then
accessor.rhythm = true
else
hint_progress = 3
end
joystick.direction = 0
if prog == #actions then
stargate:detach(joystick)
end
end
end
if done and task0.active and wrapper.metadata.xpop == 0 then
task0.complete()
end
love.graphics.setColor(c)
end
end)
xgen = function(insta)
if insta == nil then
insta = false
end
if not insta then
local ____wrapper_metadata_21, ____xpop_22 = wrapper.metadata, "xpop"
____wrapper_metadata_21[____xpop_22] = ____wrapper_metadata_21[____xpop_22] + 1
local ev = { name = "action_unlock" }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
end
local ex = 0
local ty = 0
local ____prog_23 = prog
prog = ____prog_23 + 1
local action = actions[____prog_23 + 1]
local diag = joystick.frames == assets["ig$rhythm$joystick_diagonal6"]
while ex < #wrapper.metadata.xord and wrapper.metadata.xord[ex + 1] < action[2] do
ex = ex + 1
end
__TS__ArraySplice(wrapper.metadata.xord, ex, 0, action[2])
local xfade = __TS__New(STAnimation, {
direction = 1,
anchor = 0.5,
frames = joystick.frames,
step = joystick.step,
frame = joystick.frame,
rotation = joystick.rotation.value
})
local xtext = __TS__New(STText, {
position = { x = 0.5 },
metadata = 0,
alpha = 0,
font = assets["f$fives"],
anchor = 0.5
})
local xwrapper = __TS__New(
STContainer,
{
alpha = insta and 0 or 1,
metadata = { c = 0, w = 0 },
children = {
__TS__New(STSprite,
{ anchor = { x = 1, y = 0.5 }, image = assets["ig$rhythm$expand_side"] }),
__TS__New(STSprite, { anchor = 0.5, image = assets["ig$rhythm$expand_middle"] }),
__TS__New(STSprite,
{ anchor = { x = 1, y = 0.5 }, image = assets["ig$rhythm$expand_side"], scale = -1 }),
xtext
}
}
):addTicker(function(self)
if self.alpha.value < 0.99 then
self.alpha.value = (self.alpha.value * 3 + 1) / 4
elseif self.alpha.value ~= 1 then
self.alpha.value = 1
end
local w = math.max(self.metadata.w - 10, 4)
self.children[1].position.x = w / -2
self.children[2].scale.x = w
self.children[3].position.x = w / 2
self.children[4].scale.x = self.metadata.w / xtext.metadata
if self.children[4].alpha.value < 1 then
local ____self_children__4_alpha_24, ____value_25 = self.children[4].alpha, "value"
local ____self_children__4_alpha_value_26 = ____self_children__4_alpha_24[____value_25] +
0.1
____self_children__4_alpha_24[____value_25] = ____self_children__4_alpha_value_26
if ____self_children__4_alpha_value_26 > 1 then
self.children[4].alpha.value = 1
end
end
if atlas.target == "choicer_horiz" and atlas.navigators.choicer_horiz.position.x == __TS__ArrayIndexOf(wrapper.metadata.xord, action[2]) then
self.color.red = 162
self.color.green = 137
self.color.blue = 220
elseif atlas.target == nil or atlas.target == "choicer_horiz" then
local c = ST:remap(self.metadata.c, 127, 255)
self.color.red = c
self.color.green = c
self.color.blue = c
else
self.color.red = 63
self.color.green = 63
self.color.blue = 63
end
end)
if not insta then
local vy = -4
local py = joystick.position.y + stargate.position.y
while py < 70 do
vy = vy + 0.4
py = py + vy
ty = ty + (vy - math.max(py - 70, 0)) / vy
end
assets["s$ry_split"]:instance({ rate = 0.9 + math.random() * 0.2 })
end
local tf = insta and 0 or math.ceil(ty) - 1
local dx = ST:spread_quantize(120, action[2], #actions)
local ____wrapper_attach_44 = wrapper.attach
local ____STAnimation_43 = STAnimation
local ____temp_40 = insta and 0.7 or nil
local ____temp_41 = { time = 0, squish_time = 0 }
local ____temp_42 = insta and ({ x = dx, y = 70 }) or joystick.position:add(stargate.position)
local ____insta_38
if insta then
____insta_38 = nil
else
____insta_38 = { y = 0.4 }
end
local ____insta_39
if insta then
____insta_39 = nil
else
____insta_39 = { x = (dx - (joystick.position.x + stargate.position.x)) / ty, y = -4 }
end
____wrapper_attach_44(
wrapper,
__TS__New(____STAnimation_43, {
alpha = ____temp_40,
anchor = 0.5,
metadata = ____temp_41,
position = ____temp_42,
gravity = ____insta_38,
priority = 2,
velocity = ____insta_39,
children = insta and ({ xwrapper }) or ({ xfade })
}):addTicker(function(self)
local mt = self.metadata.time
if mt < tf then
local wave = ST:remap(mt / tf, 1.2, 1)
self.scale.x = ST:remap(
ST:wave(mt / tf),
1 / wave,
wave
)
self.scale.y = ST:remap(
ST:wave(0.5 + mt / tf),
1 / wave,
wave
)
xfade.alpha.value = (1 - mt / tf) ^ 2
self.alpha.value = ST:remap(mt / tf, 1, 0.7)
repeat
local ____switch142 = math.floor((1 - (1 - mt / tf) ^ 3) * 6)
local ____cond142 = ____switch142 == 0
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral6"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal6"] or
assets["ig$rhythm$joystick_cardinal6"]
break
end
____cond142 = ____cond142 or ____switch142 == 1
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral5"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal5"] or
assets["ig$rhythm$joystick_cardinal5"]
break
end
____cond142 = ____cond142 or ____switch142 == 2
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral4"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal4"] or
assets["ig$rhythm$joystick_cardinal4"]
break
end
____cond142 = ____cond142 or ____switch142 == 3
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral3"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal3"] or
assets["ig$rhythm$joystick_cardinal3"]
break
end
____cond142 = ____cond142 or ____switch142 == 4
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral2"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal2"] or
assets["ig$rhythm$joystick_cardinal2"]
break
end
____cond142 = ____cond142 or ____switch142 == 5
if ____cond142 then
self.frames = assets["ig$rhythm$joystick_neutral1"]
xfade.frames = diag and assets["ig$rhythm$joystick_diagonal1"] or
assets["ig$rhythm$joystick_cardinal1"]
break
end
until true
elseif mt < tf + 7 then
if self.gravity.y ~= 0 then
self:attach(__TS__New(STAnimation, {
anchor = 0.5,
frames = assets["ig$rhythm$joystick_neutral1"],
gravity = { y = 0.5 },
velocity = { x = self.velocity.x * 0.75, y = self.velocity.y / -2 },
priority = 5000000
}):addTicker(function(self)
local ____self_alpha_27, ____value_28 = self.alpha, "value"
local ____self_alpha_value_29 = ____self_alpha_27[____value_28] - 0.1
____self_alpha_27[____value_28] = ____self_alpha_value_29
if ____self_alpha_value_29 <= 0 then
self.parent:detach(self)
else
local ____self_scale_30, ____x_31 = self.scale, "x"
____self_scale_30[____x_31] = ____self_scale_30[____x_31] * 1.08
local ____self_scale_32, ____y_33 = self.scale, "y"
____self_scale_32[____y_33] = ____self_scale_32[____y_33] * 1.08
end
end))
self.gravity.y = 0
self.velocity.x = 0
self.velocity.y = 0
self.position.x = dx
self.position.y = 70
self.scale.x = 1
self.scale.y = 1
self.frames = nil
self:detach(xfade)
self:attach(xwrapper)
local ____wrapper_metadata_34, ____xpop_35 = wrapper.metadata, "xpop"
____wrapper_metadata_34[____xpop_35] = ____wrapper_metadata_34[____xpop_35] - 1
self.alpha.value = 0.7
assets["s$ry_bounce"]:instance({ rate = 0.9 + math.random() * 0.2 })
end
if task0.active then
return
end
if mt == tf then
xtext.content = action[3]
xtext.metadata = assets["f$fives"]:compute(action[3]).x + 10
end
xwrapper.metadata.c = (mt - tf) / 7
xwrapper.metadata.w = ST:remap(
ST:bezier((mt - tf) / 7, 0, 1.05, 1),
14,
xtext.metadata
)
elseif mt == tf + 7 then
xwrapper.metadata.c = 1
xtext.metadata = xtext.metadata
else
return
end
local ____self_metadata_36, ____time_37 = self.metadata, "time"
____self_metadata_36[____time_37] = ____self_metadata_36[____time_37] + 1
end):addDrawer(function(self)
local v = math.min(self.metadata.time / tf, 1)
local color = { love.graphics.getColor() }
love.graphics.setColor(
ST:remap(v, color[1], 1),
ST:remap(v, color[2], 1),
ST:remap(v, color[3], 1),
color[4]
)
end):addDrawer(batch.drawer)
)
end
while actions[prog + 1][1] == 0 do
xgen(true)
end
rhythm_container:attach(wrapper)
screen:attach(rhythm_container, emotion)
__TS__Await(task0)
score = math.floor(score / total * 1000 + 0.5) / 1000
local choices = __TS__ArrayFilter(
actions,
function(____, action) return action[1] <= score end
)
table.sort(
choices,
function(a, b) return a[2] < b[2] end
)
game.h_len = #choices
local ____opt_result_47
if script ~= nil then
____opt_result_47 = script()
end
__TS__Await(____opt_result_47)
local task2 = ST:task()
game.h_task = task2
atlas:switch("choicer_horiz")
local ____self_48 = __TS__PromiseAll({ task1, task2 })
____self_48["then"](
____self_48,
function()
rhythm_container:clear()
screen:detach(rhythm_container, emotion)
canvas:release()
end
)
__TS__Await(task2)
game.h_task = nil
game.h_len = 0
__TS__Await(value.actions[choices[atlas.navigators.choicer_horiz.position.x + 1][4] + 1][3](
function(progression)
for key in pairs(progression) do
state[key] = math.floor(((state[key] or 0) + progression[key]) * 1000 + 0.5) / 1000
end
local max = 0
local max_stage = nil
for key in pairs(state) do
do
if state[key] < 1 then
goto __continue159
end
local power = progression[key]
if power > max then
max = power
max_stage = key
end
end
::__continue159::
end
if max_stage ~= nil then
stage = max_stage
for key in pairs(state) do
__TS__Delete(state, key)
end
for ____, instance in __TS__Iterator(music:values()) do
instance:stop()
end
music:clear()
local ev = { name = "stage_update", stage = stage }
for ____, fn in ipairs(rhythm_hooks) do
fn(ev)
end
end
end,
state
))
end
game.encounter = false
end)
end
}
rhythm_container = __TS__New(STContainer, { priority = 20 })
rhythm_hooks = {}
text = textGen()
return { rhythm = rhythm, rhythm_container = rhythm_container, rhythm_hooks = rhythm_hooks, text = text }
end
____exports.default = rhythm
return ____exports