Petrichor-PSTVL/code/engine/storyteller.lua
2025-04-16 21:38:42 +08:00

4283 lines
145 KiB
Lua

local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ArrayIncludes = ____lualib.__TS__ArrayIncludes
local __TS__ArrayIndexOf = ____lualib.__TS__ArrayIndexOf
local __TS__ArraySplice = ____lualib.__TS__ArraySplice
local __TS__ArrayMap = ____lualib.__TS__ArrayMap
local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
local __TS__New = ____lualib.__TS__New
local __TS__ArraySlice = ____lualib.__TS__ArraySlice
local __TS__ArrayPushArray = ____lualib.__TS__ArrayPushArray
local __TS__DelegatedYield = ____lualib.__TS__DelegatedYield
local __TS__Generator = ____lualib.__TS__Generator
local __TS__ArrayEntries = ____lualib.__TS__ArrayEntries
local __TS__Iterator = ____lualib.__TS__Iterator
local __TS__AsyncAwaiter = ____lualib.__TS__AsyncAwaiter
local __TS__Await = ____lualib.__TS__Await
local __TS__StringSlice = ____lualib.__TS__StringSlice
local __TS__StringSplit = ____lualib.__TS__StringSplit
local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter
local __TS__StringAccess = ____lualib.__TS__StringAccess
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__ObjectFromEntries = ____lualib.__TS__ObjectFromEntries
local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
local __TS__ArrayUnshift = ____lualib.__TS__ArrayUnshift
local __TS__ArrayFlatMap = ____lualib.__TS__ArrayFlatMap
local __TS__SparseArrayNew = ____lualib.__TS__SparseArrayNew
local __TS__SparseArrayPush = ____lualib.__TS__SparseArrayPush
local __TS__SparseArraySpread = ____lualib.__TS__SparseArraySpread
local __TS__Promise = ____lualib.__TS__Promise
local __TS__ObjectAssign = ____lualib.__TS__ObjectAssign
local __TS__ObjectValues = ____lualib.__TS__ObjectValues
local ____exports = {}
local ____sat = require("code.engine.sat")
local Polygon = ____sat.Polygon
local testPolygonPolygon = ____sat.testPolygonPolygon
local Vector = ____sat.Vector
local events = require("code.engine.events")
local json = require("code.engine.json")
local utf8 = require("utf8")
--- Blend modes used when images or animation frames are drawn to a canvas.
____exports.STBlend = STBlend or ({})
____exports.STBlend.ADD = 0
____exports.STBlend[____exports.STBlend.ADD] = "ADD"
____exports.STBlend.ALPHA = 1
____exports.STBlend[____exports.STBlend.ALPHA] = "ALPHA"
____exports.STBlend.DARKEN = 2
____exports.STBlend[____exports.STBlend.DARKEN] = "DARKEN"
____exports.STBlend.LIGHTEN = 3
____exports.STBlend[____exports.STBlend.LIGHTEN] = "LIGHTEN"
____exports.STBlend.MULTIPLY = 4
____exports.STBlend[____exports.STBlend.MULTIPLY] = "MULTIPLY"
____exports.STBlend.REPLACE = 5
____exports.STBlend[____exports.STBlend.REPLACE] = "REPLACE"
____exports.STBlend.SCREEN = 6
____exports.STBlend[____exports.STBlend.SCREEN] = "SCREEN"
____exports.STBlend.SUBTRACT = 7
____exports.STBlend[____exports.STBlend.SUBTRACT] = "SUBTRACT"
--- Cardinal and diagonal facing directions.
____exports.STFacing = STFacing or ({})
____exports.STFacing.DOWN = 0
____exports.STFacing[____exports.STFacing.DOWN] = "DOWN"
____exports.STFacing.DOWN_LEFT = 1
____exports.STFacing[____exports.STFacing.DOWN_LEFT] = "DOWN_LEFT"
____exports.STFacing.DOWN_RIGHT = 2
____exports.STFacing[____exports.STFacing.DOWN_RIGHT] = "DOWN_RIGHT"
____exports.STFacing.LEFT = 3
____exports.STFacing[____exports.STFacing.LEFT] = "LEFT"
____exports.STFacing.RIGHT = 4
____exports.STFacing[____exports.STFacing.RIGHT] = "RIGHT"
____exports.STFacing.UP = 5
____exports.STFacing[____exports.STFacing.UP] = "UP"
____exports.STFacing.UP_LEFT = 6
____exports.STFacing[____exports.STFacing.UP_LEFT] = "UP_LEFT"
____exports.STFacing.UP_RIGHT = 7
____exports.STFacing[____exports.STFacing.UP_RIGHT] = "UP_RIGHT"
--- The line splitting behavior of individual characters while auto-wrapping text.
____exports.STSplitterResult = STSplitterResult or ({})
____exports.STSplitterResult.NONE = 0
____exports.STSplitterResult[____exports.STSplitterResult.NONE] = "NONE"
____exports.STSplitterResult.INCLUDE = 1
____exports.STSplitterResult[____exports.STSplitterResult.INCLUDE] = "INCLUDE"
____exports.STSplitterResult.EXCLUDE = 2
____exports.STSplitterResult[____exports.STSplitterResult.EXCLUDE] = "EXCLUDE"
--- A loadable *thing* which caches a value if at least one user is retaining it.
____exports.STAsset = __TS__Class()
local STAsset = ____exports.STAsset
STAsset.name = "STAsset"
function STAsset.prototype.____constructor(self, loader, unloader)
self.users = {}
self.value = nil
self.loader = loader
self.unloader = unloader
end
function STAsset.prototype.load(self, user)
if user == nil then
user = self
end
if #self.users == 0 or not __TS__ArrayIncludes(self.users, user) then
local ____self_users_0 = self.users
____self_users_0[#____self_users_0 + 1] = user
end
local ____self_1, ____value_2 = self, "value"
if ____self_1[____value_2] == nil then
____self_1[____value_2] = self.loader()
end
return self.value
end
function STAsset.prototype.reload(self)
if self.value ~= nil then
self.unloader(self.value)
self.value = self.loader()
end
end
function STAsset.prototype.unload(self, user)
if user == nil then
user = self
end
if #self.users == 0 then
return
end
local index = __TS__ArrayIndexOf(self.users, user)
if index ~= -1 then
__TS__ArraySplice(self.users, index, 1)
if #self.users == 0 then
self.unloader(self.value)
self.value = nil
end
end
end
--- A control system that can switch between navigators as targets. This system is designed primarily for creating multi-level menus.
-- ```ts
-- // create the atlas
-- const atlas = new STAtlas({
-- main_menu: {
-- grid: () => [ [ 'play', 'settings' ], [ 'quit'] ],
-- position: { x: 0, y: 0 },
-- from () {
-- // start rendering menu
-- },
-- to () {
-- // stop rendering menu
-- },
-- next () {
-- // check which grid value is selected
-- switch (atlas.selection()) {
-- case 'play':
-- atlas.switch(null); // close the atlas
-- // play game
-- break;
-- case 'settings':
-- atlas.switch('settings'); // switch to `settings` menu
-- break;
-- case 'quit':
-- atlas.switch(null); // close the atlas
-- // quit game
-- break;
-- }
-- }
-- },
-- settings: {
-- grid: () => [ [ 'music' ], [ 'sound' ], [ 'language' ], [ 'back' ] ],
-- position: { x: 0, y: 0 },
-- from () {
-- // start rendering menu
-- },
-- to () {
-- // stop rendering menu
-- },
-- next () {
-- // check which grid value is selected
-- switch (atlas.selection()) {
-- case 'music':
-- // toggle music
-- break;
-- case 'sound':
-- // toggle sound
-- break;
-- case 'language':
-- // switch language
-- break;
-- case 'back':
-- atlas.prev(); // call `prev()` (as seen below) by way of `atlas.prev()`
-- break;
-- }
-- },
-- prev () {
-- atlas.switch('main_menu'); // return to `main_menu`
-- }
-- }
-- });
--
-- // open the atlas to `main_menu`
-- atlas.switch('main_menu');
-- ```
____exports.STAtlas = __TS__Class()
local STAtlas = ____exports.STAtlas
STAtlas.name = "STAtlas"
function STAtlas.prototype.____constructor(self, navigators)
self.target = nil
self.navigators = navigators
end
function STAtlas.prototype.next(self)
if self.target == nil then
return
end
local navigator = self.navigators[self.target]
local ____opt_4 = navigator.next
if ____opt_4 ~= nil then
____opt_4(navigator, navigator)
end
end
function STAtlas.prototype.prev(self)
if self.target == nil then
return
end
local navigator = self.navigators[self.target]
local ____opt_6 = navigator.prev
if ____opt_6 ~= nil then
____opt_6(navigator, navigator)
end
end
function STAtlas.prototype.seek(self, facing)
if self.target == nil then
return false
end
local navigator = self.navigators[self.target]
local grid = navigator:grid(navigator)
if #grid == 0 then
return false
end
repeat
local ____switch19 = facing
local ____cond19 = ____switch19 == ____exports.STFacing.DOWN
if ____cond19 then
do
if #grid == 1 then
return false
end
local y = navigator.position.y
while true do
local ____navigator_position_8, ____y_9 = navigator.position, "y"
local ____navigator_position_y_10 = ____navigator_position_8[____y_9] + 1
____navigator_position_8[____y_9] = ____navigator_position_y_10
if ____navigator_position_y_10 == #grid then
navigator.position.y = 0
end
if #grid[navigator.position.y + 1] > navigator.position.x then
break
end
end
return navigator.position.y ~= y
end
end
____cond19 = ____cond19 or ____switch19 == ____exports.STFacing.LEFT
if ____cond19 then
do
local subgrid = grid[navigator.position.y + 1]
if (subgrid and #subgrid) < 2 then
return false
end
local ____navigator_position_13, ____x_14 = navigator.position, "x"
local ____navigator_position_x_15 = ____navigator_position_13[____x_14] - 1
____navigator_position_13[____x_14] = ____navigator_position_x_15
if ____navigator_position_x_15 == -1 then
navigator.position.x = #subgrid - 1
end
return true
end
end
____cond19 = ____cond19 or ____switch19 == ____exports.STFacing.RIGHT
if ____cond19 then
do
local subgrid = grid[navigator.position.y + 1]
if #subgrid < 2 then
return false
end
local ____navigator_position_16, ____x_17 = navigator.position, "x"
local ____navigator_position_x_18 = ____navigator_position_16[____x_17] + 1
____navigator_position_16[____x_17] = ____navigator_position_x_18
if ____navigator_position_x_18 == #subgrid then
navigator.position.x = 0
end
return true
end
end
____cond19 = ____cond19 or ____switch19 == ____exports.STFacing.UP
if ____cond19 then
do
if #grid == 1 then
return false
end
local y = navigator.position.y
while true do
local ____navigator_position_19, ____y_20 = navigator.position, "y"
local ____navigator_position_y_21 = ____navigator_position_19[____y_20] - 1
____navigator_position_19[____y_20] = ____navigator_position_y_21
if ____navigator_position_y_21 == -1 then
navigator.position.y = #grid - 1
end
if #grid[navigator.position.y + 1] > navigator.position.x then
break
end
end
return navigator.position.y ~= y
end
end
until true
return false
end
function STAtlas.prototype.selection(self)
if self.target == nil then
return
end
local navigator = self.navigators[self.target]
local list = navigator:grid(navigator)[navigator.position.y + 1]
if list == nil then
return
end
return list[navigator.position.x + 1]
end
function STAtlas.prototype.switch(self, target)
local current = self.target
if target == current then
return
end
if current ~= nil then
local navigator = self.navigators[current]
local ____opt_22 = navigator.to
if ____opt_22 ~= nil then
____opt_22(navigator, navigator, target)
end
end
self.target = target
if target ~= nil then
local navigator = self.navigators[target]
local ____opt_24 = navigator.from
if ____opt_24 ~= nil then
____opt_24(navigator, navigator, current)
end
end
end
--- An automatable, single-number representable RGB color, with values ranging from `0` to `255` (`0xff`).
____exports.STColor = __TS__Class()
local STColor = ____exports.STColor
STColor.name = "STColor"
function STColor.prototype.____constructor(self, value)
self.task = nil
self.red = value.red
self.green = value.green
self.blue = value.blue
end
function STColor.prototype.automate(self, duration, ...)
local points = {...}
local ____opt_26 = self.task
if ____opt_26 ~= nil then
____opt_26.complete()
end
local r = self.red
local g = self.green
local b = self.blue
local ____temp_28 = ____exports.ST:automate(
duration,
function(delta)
self.red = ____exports.ST:bezier(
delta,
r,
unpack(__TS__ArrayMap(
points,
function(____, point) return point.red or self.red end
))
)
self.green = ____exports.ST:bezier(
delta,
g,
unpack(__TS__ArrayMap(
points,
function(____, point) return point.green or self.green end
))
)
self.blue = ____exports.ST:bezier(
delta,
b,
unpack(__TS__ArrayMap(
points,
function(____, point) return point.blue or self.blue end
))
)
if delta == 1 then
self.task = nil
return true
end
return false
end
)
self.task = ____temp_28
return ____temp_28
end
__TS__SetDescriptor(
STColor.prototype,
"value",
{
get = function(self)
return ____exports.ST:rgb2hex(self.red, self.green, self.blue)
end,
set = function(self, value)
local color = ____exports.ST:hex2rgb(value)
self.red = color.red
self.green = color.green
self.blue = color.blue
end
},
true
)
--- A scene graph element, which can both contain, and be contained by other scene graph elements. A container does nothing on its own, but can be used to group together other scene graph elements like `STSprite` and `STHitbox`.
____exports.STContainer = __TS__Class()
local STContainer = ____exports.STContainer
STContainer.name = "STContainer"
function STContainer.prototype.____constructor(self, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local scale
local rotation
local priority
local position
local metadata
local color
local children
local blend_multiply
local blend
local alpha
alpha = ____bindingPattern0.alpha
if alpha == nil then
alpha = 1
end
blend = ____bindingPattern0.blend
if blend == nil then
blend = ____exports.STBlend.ALPHA
end
blend_multiply = ____bindingPattern0.blend_multiply
if blend_multiply == nil then
blend_multiply = true
end
children = ____bindingPattern0.children
if children == nil then
children = ____exports.ST.empty_array
end
color = ____bindingPattern0.color
if color == nil then
color = 16777215
end
metadata = ____bindingPattern0.metadata
if metadata == nil then
metadata = nil
end
position = ____bindingPattern0.position
if position == nil then
position = 0
end
priority = ____bindingPattern0.priority
if priority == nil then
priority = 0
end
rotation = ____bindingPattern0.rotation
if rotation == nil then
rotation = 0
end
scale = ____bindingPattern0.scale
if scale == nil then
scale = 1
end
self.children = {}
self.drawers = {}
self.parent = nil
self.tickers = {}
self.alpha = __TS__New(____exports.STValue, alpha)
self.blend = blend
self.blend_multiply = blend_multiply
self.color = __TS__New(
____exports.STColor,
type(color) == "number" and ____exports.ST:hex2rgb(color) or color
)
self.metadata = metadata
self.position = __TS__New(____exports.STPoint, position)
self.priority = priority
self.rotation = __TS__New(____exports.STValue, rotation)
self.scale = __TS__New(
____exports.STPoint,
type(scale) == "number" and scale or ({x = scale.x or 1, y = scale.y or 1})
)
self:attach(unpack(__TS__ArraySlice(children, 0)))
end
function STContainer.prototype.addDrawer(self, script)
if #self.drawers == 0 or not __TS__ArrayIncludes(self.drawers, script) then
local ____self_drawers_29 = self.drawers
____self_drawers_29[#____self_drawers_29 + 1] = script
end
return self
end
function STContainer.prototype.addTicker(self, script)
if #self.tickers == 0 or not __TS__ArrayIncludes(self.tickers, script) then
local ____self_tickers_30 = self.tickers
____self_tickers_30[#____self_tickers_30 + 1] = script
end
return self
end
function STContainer.prototype.attach(self, ...)
local children = {...}
for ____, child in ipairs(children) do
do
if child.parent == self then
goto __continue58
end
if child.parent ~= nil then
__TS__ArraySplice(
child.parent.children,
__TS__ArrayIndexOf(child.parent.children, child),
1
)
end
child.parent = self
local ____self_children_31 = self.children
____self_children_31[#____self_children_31 + 1] = child
end
::__continue58::
end
return self
end
function STContainer.prototype.cleanup(self)
for ____, child in ipairs(self.children) do
child:cleanup()
end
end
function STContainer.prototype.clear(self)
return self:detach(unpack(self.children))
end
function STContainer.prototype.detach(self, ...)
local children = {...}
for ____, child in ipairs(children) do
do
if child.parent ~= self then
goto __continue67
end
child.parent = nil
__TS__ArraySplice(
self.children,
__TS__ArrayIndexOf(self.children, child),
1
)
child:cleanup()
end
::__continue67::
end
return self
end
function STContainer.prototype.draw(self)
love.graphics.push()
love.graphics.translate(self.position.x, self.position.y)
love.graphics.rotate(self.rotation.value * (math.pi / 180))
love.graphics.scale(self.scale.x, self.scale.y)
local color = {love.graphics.getColor()}
love.graphics.setColor(color[1] * (self.color.red / 255), color[2] * (self.color.green / 255), color[3] * (self.color.blue / 255), color[4] * self.alpha.value)
local blend, blend_alpha = love.graphics.getBlendMode()
repeat
local ____switch71 = self.blend
local ____cond71 = ____switch71 == ____exports.STBlend.ADD
if ____cond71 then
love.graphics.setBlendMode("add", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.ALPHA
if ____cond71 then
love.graphics.setBlendMode("alpha", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.DARKEN
if ____cond71 then
love.graphics.setBlendMode("darken", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.LIGHTEN
if ____cond71 then
love.graphics.setBlendMode("lighten", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.MULTIPLY
if ____cond71 then
love.graphics.setBlendMode("multiply", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.REPLACE
if ____cond71 then
love.graphics.setBlendMode("replace", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.SCREEN
if ____cond71 then
love.graphics.setBlendMode("screen", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
____cond71 = ____cond71 or ____switch71 == ____exports.STBlend.SUBTRACT
if ____cond71 then
love.graphics.setBlendMode("subtract", self.blend_multiply and "alphamultiply" or "premultiplied")
break
end
until true
local results = {}
for ____, script in ipairs(__TS__ArraySlice(self.drawers)) do
results[#results + 1] = script(self)
end
self:draw_self()
if #self.children ~= 0 then
__TS__ArrayPushArray(____exports.ST.empty_array, self.children)
table.sort(
____exports.ST.empty_array,
function(a, b) return a.priority < b.priority end
)
for ____, child in ipairs(__TS__ArraySplice(____exports.ST.empty_array, 0)) do
child:draw()
end
end
local index = #results
while true do
local ____index_34 = index
index = ____index_34 - 1
if not (____index_34 ~= 0) then
break
end
local ____opt_32 = results[index + 1]
if ____opt_32 ~= nil then
____opt_32()
end
end
love.graphics.setBlendMode(blend, blend_alpha)
love.graphics.setColor(color)
love.graphics.pop()
end
function STContainer.prototype.draw_self(self)
end
function STContainer.prototype.isolate(self)
local ____opt_35 = self.parent
return ____opt_35 and ____opt_35:detach(self)
end
function STContainer.prototype.removeDrawer(self, script)
if #self.drawers ~= 0 then
local index = __TS__ArrayIndexOf(self.drawers, script)
if index ~= -1 then
__TS__ArraySplice(self.drawers, index, 1)
end
end
return self
end
function STContainer.prototype.removeTicker(self, script)
if #self.tickers ~= 0 then
local index = __TS__ArrayIndexOf(self.tickers, script)
if index ~= -1 then
__TS__ArraySplice(self.tickers, index, 1)
end
end
return self
end
STContainer.prototype.scan = __TS__Generator(function(self, filter)
if filter == nil then
filter = true
end
if filter == true or filter(self) then
coroutine.yield(self)
end
for ____, child in ipairs({unpack(self.children)}) do
__TS__DelegatedYield(child:scan(filter))
end
end)
function STContainer.prototype.tick(self)
local results = {}
for ____, script in ipairs(__TS__ArraySlice(self.tickers)) do
results[#results + 1] = script(self)
end
self:tick_self()
if #self.children ~= 0 then
__TS__ArrayPushArray(____exports.ST.empty_array, self.children)
for ____, child in ipairs(__TS__ArraySplice(____exports.ST.empty_array, 0)) do
child:tick()
end
end
local index = #results
while true do
local ____index_39 = index
index = ____index_39 - 1
if not (____index_39 ~= 0) then
break
end
local ____opt_37 = results[index + 1]
if ____opt_37 ~= nil then
____opt_37()
end
end
end
function STContainer.prototype.tick_self(self)
end
--- A system for playing and managing audio.
-- ```ts
-- // make a new daemon
-- const daemon = new STDaemon('dist/test.ogg', {
-- gain: 0.5,
-- rate: 0.8,
-- loop: true
-- });
--
-- // start playback (use instance_forced to ensure the audio starts)
-- const inst = daemon.instance_forced();
--
-- // wait for some time (100 frames)
-- ST.pause(100).then(() => {
-- // stop playback
-- inst.stop();
-- });
--
-- // a hypothetical event function which may be called multiple times during one frame
-- function gameEvent () {
-- // instance() ensures the daemon can't create two instances during one frame
-- daemon.instance({
-- // multiplied with daemon gain of 0.5, resulting in 0.25 gain on playback
-- gain: 0.5,
-- // multiplied with daemon rate of 0.8, resulting in 0.6 rate on playback
-- rate: 0.75,
-- // overrides the daemon's loop property
-- loop: false
-- });
-- };
-- ```
____exports.STDaemon = __TS__Class()
local STDaemon = ____exports.STDaemon
STDaemon.name = "STDaemon"
function STDaemon.prototype.____constructor(self, source, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local rate
local position
local pass
local mixer
local loop
local gain
local effects
effects = ____bindingPattern0.effects
if effects == nil then
effects = {}
end
gain = ____bindingPattern0.gain
if gain == nil then
gain = 1
end
loop = ____bindingPattern0.loop
if loop == nil then
loop = false
end
mixer = ____bindingPattern0.mixer
if mixer == nil then
mixer = __TS__New(____exports.STValue)
end
pass = ____bindingPattern0.pass
if pass == nil then
pass = 1
end
position = ____bindingPattern0.position
if position == nil then
position = 0
end
rate = ____bindingPattern0.rate
if rate == nil then
rate = 1
end
self.instances = {}
self.last_player = nil
self.effects = effects
self.gain = gain
self.loop = loop
self.mixer = mixer
self.pass = pass
self.position = position
self.rate = rate
self.source = source
end
function STDaemon.prototype.instance(self, properties)
if self.last_player == ____exports.ST.time then
return
end
self.last_player = ____exports.ST.time
return __TS__New(____exports.STInstance, self, properties)
end
function STDaemon.prototype.instance_forced(self, properties)
self.last_player = ____exports.ST.time
return __TS__New(____exports.STInstance, self, properties)
end
function STDaemon.prototype.stop(self)
local index = #self.instances
while true do
local ____index_40 = index
index = ____index_40 - 1
if not (____index_40 ~= 0) then
break
end
self.instances[index + 1]:stop()
end
end
--- Handles user input in a logical way.
-- ```ts
-- // create an input from the spacebar
-- const input = new STInput([ () => love.keyboard.isDown('space') ]);
--
-- // add a handler for pressing the spacebar
-- input.addDown(() => {
-- // perform an action
-- });
--
-- // add a handler which fires every tick the spacebar is held
-- input.addHold(() => {
-- // perform an action perpetually
-- });
--
-- // add a handler for releasing the spacebar
-- input.addUp(() => {
-- // stop performing an action, perhaps?
-- });
--
-- // create an input with multiple sources (up arrow, W, and primary mouse button)
-- const input = new STInput([
-- () => love.keyboard.isDown('up'),
-- () => love.keyboard.isDown('w'),
-- () => love.mouse.isDown(1)
-- ]);
--
-- // add a handler for activating an input (pressing up or w, clicking the primary mouse button)
-- input.addDown(index => {
-- switch (index) {
-- case 0:
-- // up was pressed
-- break;
-- case 1:
-- // w was pressed
-- break;
-- case 2:
-- // primary mouse button was clicked
-- break;
-- }
-- });
--
-- // check if an input is being held during some other hypothetical code
-- const gameEvent = () => {
-- if (input.held) {
-- // perform an action
-- } else {
-- // you've really got to stop performing these actions, mate
-- }
-- };
-- ```
____exports.STInput = __TS__Class()
local STInput = ____exports.STInput
STInput.name = "STInput"
function STInput.prototype.____constructor(self, sources)
self.buffer = false
self.downs = {}
self.held = false
self.holds = {}
self.queue = {}
self.sources = {}
self.state = {}
self.ups = {}
self.sources = sources
end
function STInput.prototype.addDown(self, listener)
if #self.downs == 0 or not __TS__ArrayIncludes(self.downs, listener) then
local ____self_downs_41 = self.downs
____self_downs_41[#____self_downs_41 + 1] = listener
end
return self
end
function STInput.prototype.addHold(self, listener)
if #self.holds == 0 or not __TS__ArrayIncludes(self.holds, listener) then
local ____self_holds_42 = self.holds
____self_holds_42[#____self_holds_42 + 1] = listener
end
return self
end
function STInput.prototype.addUp(self, listener)
if #self.ups == 0 or not __TS__ArrayIncludes(self.ups, listener) then
local ____self_ups_43 = self.ups
____self_ups_43[#____self_ups_43 + 1] = listener
end
return self
end
function STInput.prototype.fire(self)
if #self.queue ~= 0 then
for ____, ____value in ipairs(__TS__ArraySplice(self.queue, 0)) do
local index = ____value[1]
local value = ____value[2]
repeat
local ____switch115 = value
local ____cond115 = ____switch115 == 0
if ____cond115 then
for ____, down in ipairs(self.downs) do
down(self, index)
end
break
end
____cond115 = ____cond115 or ____switch115 == 1
if ____cond115 then
for ____, down in ipairs(self.downs) do
down(self, index)
end
for ____, up in ipairs(self.ups) do
up(self, index)
end
break
end
____cond115 = ____cond115 or ____switch115 == 2
if ____cond115 then
for ____, up in ipairs(self.ups) do
up(self, index)
end
break
end
____cond115 = ____cond115 or ____switch115 == 3
if ____cond115 then
for ____, up in ipairs(self.ups) do
up(self, index)
end
break
end
until true
end
end
if self.buffer then
self.buffer = false
self.held = true
for ____, hold in ipairs(self.holds) do
hold(self)
end
else
self.held = false
end
end
function STInput.prototype.removeDown(self, listener)
if #self.downs ~= 0 then
local index = __TS__ArrayIndexOf(self.downs, listener)
if index ~= -1 then
__TS__ArraySplice(self.downs, index, 1)
end
end
return self
end
function STInput.prototype.removeHold(self, listener)
if #self.holds ~= 0 then
local index = __TS__ArrayIndexOf(self.holds, listener)
if index ~= -1 then
__TS__ArraySplice(self.holds, index, 1)
end
end
return self
end
function STInput.prototype.removeUp(self, listener)
if #self.ups ~= 0 then
local index = __TS__ArrayIndexOf(self.ups, listener)
if index ~= -1 then
__TS__ArraySplice(self.ups, index, 1)
end
end
return self
end
function STInput.prototype.update(self)
for ____, ____value in __TS__Iterator(__TS__ArrayEntries(self.sources)) do
local index = ____value[1]
local source = ____value[2]
do
if source() then
self.buffer = true
if #self.state == 0 or not __TS__ArrayIncludes(self.state, index) then
local ____self_state_44 = self.state
____self_state_44[#____self_state_44 + 1] = index
if #self.queue ~= 0 then
local down = false
for ____, event in ipairs(self.queue) do
if event[1] == index then
down = true
if event[2] == 2 then
event[2] = 3
end
break
end
end
if down then
goto __continue141
end
end
local ____self_queue_45 = self.queue
____self_queue_45[#____self_queue_45 + 1] = {index, 0}
end
elseif #self.state ~= 0 and __TS__ArrayIncludes(self.state, index) then
__TS__ArraySplice(
self.state,
__TS__ArrayIndexOf(self.state, index),
1
)
if #self.queue ~= 0 then
local up = false
for ____, event in ipairs(self.queue) do
if event[1] == index then
up = true
if event[2] == 0 then
event[2] = 1
end
break
end
end
if up then
goto __continue141
end
end
local ____self_queue_46 = self.queue
____self_queue_46[#____self_queue_46 + 1] = {index, 2}
end
end
::__continue141::
end
end
--- A control wrapper around an audio source, created with an `STDaemon`.
____exports.STInstance = __TS__Class()
local STInstance = ____exports.STInstance
STInstance.name = "STInstance"
function STInstance.prototype.____constructor(self, daemon, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local rate
local position
local pass
local mixer
local loop
local gain
local effects
local autoplay
autoplay = ____bindingPattern0.autoplay
if autoplay == nil then
autoplay = true
end
effects = ____bindingPattern0.effects
if effects == nil then
effects = daemon.effects
end
gain = ____bindingPattern0.gain
if gain == nil then
gain = 1
end
loop = ____bindingPattern0.loop
if loop == nil then
loop = daemon.loop
end
mixer = ____bindingPattern0.mixer
if mixer == nil then
mixer = daemon.mixer
end
pass = ____bindingPattern0.pass
if pass == nil then
pass = daemon.pass
end
position = ____bindingPattern0.position
if position == nil then
position = daemon.position
end
rate = ____bindingPattern0.rate
if rate == nil then
rate = 1
end
self.active_value = false
self.pass = __TS__New(
____exports.STValueLinked,
function() return self.pass_value end,
function(value)
self.pass_value = value
self:access(function(audio) return audio:setFilter({type = "bandpass", volume = value}) end)
end
)
self.position = __TS__New(
____exports.STValueLinked,
function() return self:access(
function(audio) return audio:tell() end,
self.position_value
) end,
function(value)
self.position_value = value
self:access(function(audio) return audio:seek(value) end)
end
)
self.position_value = 0
if type(daemon.source) == "string" then
self.audio = love.audio.newSource(daemon.source, "stream")
else
self.audio = love.audio.newSource(daemon.source:load(self))
end
self.daemon = daemon
self.effects = effects
self.gain = __TS__New(____exports.STValue, gain)
self.loop_value = loop
self.mixer = mixer
self.pass_value = pass
self.rate = __TS__New(____exports.STValue, rate)
for ____, effect in ipairs(effects) do
self.audio:setEffect(effect)
end
self.audio:setLooping(loop)
self.audio:seek(position)
local ____daemon_instances_47 = daemon.instances
____daemon_instances_47[#____daemon_instances_47 + 1] = self
local ____exports_ST_instances_48 = ____exports.ST.instances
____exports_ST_instances_48[#____exports_ST_instances_48 + 1] = self
self:update()
if autoplay then
self.active_value = true
self.audio:play()
end
end
function STInstance.prototype.access(self, callback, placeholder)
do
local function ____catch()
return true, placeholder
end
local ____try, ____hasReturned, ____returnValue = pcall(function()
return true, callback(self.audio)
end)
if not ____try then
____hasReturned, ____returnValue = ____catch()
end
if ____hasReturned then
return ____returnValue
end
end
end
function STInstance.prototype.stop(self)
do
pcall(function()
self.audio:stop()
self.audio:release()
end)
end
__TS__ArraySplice(
self.daemon.instances,
__TS__ArrayIndexOf(self.daemon.instances, self),
1
)
if type(self.daemon.source) ~= "string" then
self.daemon.source:unload(self)
end
__TS__ArraySplice(
____exports.ST.instances,
__TS__ArrayIndexOf(____exports.ST.instances, self),
1
)
end
function STInstance.prototype.update(self)
do
pcall(function()
if self.active_value and not self.audio:isPlaying() then
self:stop()
else
self.audio:setPitch(self.rate.value * self.daemon.rate * ____exports.ST.speed)
self.audio:setVolume(self.gain.value * self.daemon.gain * self.mixer.value)
self.position_value = self.audio:tell()
end
end)
end
end
__TS__SetDescriptor(
STInstance.prototype,
"active",
{
get = function(self)
return self.active_value
end,
set = function(self, value)
self.active_value = value
if value then
self:access(function(audio) return audio:play() end)
else
self:access(function(audio) return audio:pause() end)
end
end
},
true
)
__TS__SetDescriptor(
STInstance.prototype,
"loop",
{
get = function(self)
return self.loop_value
end,
set = function(self, value)
self.loop_value = value
self:access(function(audio) return audio:setLooping(value) end)
end
},
true
)
____exports.STInterpolator = __TS__Class()
local STInterpolator = ____exports.STInterpolator
STInterpolator.name = "STInterpolator"
function STInterpolator.prototype.____constructor(self, ...)
local events = {...}
self.events = events
end
function STInterpolator.prototype.resolve(self, time, offset, events)
if offset == nil then
offset = 0
end
if events == nil then
events = self.events
end
local value = 0
for ____, event in ipairs(events) do
for ____, start in ipairs(event.starts) do
do
if time - offset < start or time - offset > start + event.duration then
goto __continue193
end
if type(event.resolve) == "function" then
value = value + event.resolve((time - offset - start) / event.duration, time)
else
value = value + self:resolve(time, offset + start, event.resolve)
end
end
::__continue193::
end
end
return value
end
____exports.STPager = __TS__Class()
local STPager = ____exports.STPager
STPager.name = "STPager"
function STPager.prototype.____constructor(self, random, storage)
self.random = random
self.storage = storage
end
function STPager.prototype.create(self, ____type, ...)
local pages = {...}
repeat
local ____switch201 = ____type
local ____cond201 = ____switch201 == 0
if ____cond201 then
return function(key, ...)
if not (self.storage[key] ~= nil) then
self.storage[key] = 0
end
local ____pages_53 = pages
local ____temp_52
if self.storage[key] == #pages - 1 then
____temp_52 = self.storage[key]
else
local ____self_storage_49, ____key_50 = self.storage, key
local ____self_storage_key_51 = ____self_storage_49[____key_50]
____self_storage_49[____key_50] = ____self_storage_key_51 + 1
____temp_52 = ____self_storage_key_51
end
local page = ____pages_53[____temp_52 + 1]
return type(page) == "function" and page(...) or page
end
end
____cond201 = ____cond201 or ____switch201 == 1
if ____cond201 then
return function(key, ...)
if not (self.storage[key] ~= nil) then
self.storage[key] = 0
end
local ____temp_54 = self.storage[key] == #pages
if ____temp_54 then
self.storage[key] = 0
____temp_54 = 0
end
local ____pages_58 = pages
local ____self_storage_55, ____key_56 = self.storage, key
local ____self_storage_key_57 = ____self_storage_55[____key_56]
____self_storage_55[____key_56] = ____self_storage_key_57 + 1
local page = ____pages_58[____self_storage_key_57 + 1]
return type(page) == "function" and page(...) or page
end
end
____cond201 = ____cond201 or ____switch201 == 2
if ____cond201 then
return function(key, ...)
local page = pages[self.random:int(#pages) + 1]
return type(page) == "function" and page(...) or page
end
end
until true
end
____exports.STPoint = __TS__Class()
local STPoint = ____exports.STPoint
STPoint.name = "STPoint"
function STPoint.prototype.____constructor(self, arg1, arg2)
if arg1 == nil then
arg1 = 0
end
if arg2 == nil then
arg2 = arg1
end
self.task = nil
if type(arg1) == "number" then
self.x = arg1
self.y = arg2
else
self.x = arg1.x or 0
self.y = arg1.y or 0
end
end
function STPoint.prototype.abs(self)
return __TS__New(
____exports.STPoint,
math.abs(self.x),
math.abs(self.y)
)
end
function STPoint.prototype.add(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(____exports.STPoint, self.x + arg1, self.y + arg2)
else
return self:add(arg1.x or 0, arg1.y or 0)
end
end
function STPoint.prototype.angle(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
if self.y == arg2 then
if self.x < arg1 then
return 0
else
return 180
end
elseif self.x == arg1 then
if self.y < arg2 then
return 90
else
return 270
end
else
return math.atan2(arg2 - self.y, arg1 - self.x) * (180 / math.pi)
end
else
return self:angle(arg1.x or self.x, arg1.y or self.y)
end
end
function STPoint.prototype.automate(self, duration, ...)
local points = {...}
local ____opt_59 = self.task
if ____opt_59 ~= nil then
____opt_59.complete()
end
local x = self.x
local y = self.y
local ____temp_61 = ____exports.ST:automate(
duration,
function(delta)
self.x = ____exports.ST:bezier(
delta,
x,
unpack(__TS__ArrayMap(
points,
function(____, point) return type(point) == "number" and point or (point.x or self.x) end
))
)
self.y = ____exports.ST:bezier(
delta,
y,
unpack(__TS__ArrayMap(
points,
function(____, point) return type(point) == "number" and point or (point.y or self.y) end
))
)
if delta == 1 then
self.task = nil
return true
end
return false
end
)
self.task = ____temp_61
return ____temp_61
end
function STPoint.prototype.ceil(self, arg1, arg2)
if arg1 == nil then
arg1 = 1
end
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(
____exports.STPoint,
math.ceil(self.x * arg1) / arg1,
math.ceil(self.y * arg2) / arg2
)
else
return self:ceil(arg1.x or 1, arg1.y or 1)
end
end
function STPoint.prototype.clamp(self, min, max)
return __TS__New(
____exports.STPoint,
math.min(
math.max(
self.x,
type(min) == "number" and min or (min.x or -math.huge)
),
type(max) == "number" and max or (max.x or math.huge)
),
math.min(
math.max(
self.y,
type(min) == "number" and min or (min.y or -math.huge)
),
type(max) == "number" and max or (max.y or math.huge)
)
)
end
function STPoint.prototype.clone(self)
return __TS__New(____exports.STPoint, self)
end
function STPoint.prototype.distance(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
if self.x == arg1 then
return math.abs(arg2 - self.y)
elseif self.y == arg2 then
return math.abs(arg1 - self.x)
else
return math.sqrt((arg1 - self.x) ^ 2 + (arg2 - self.y) ^ 2)
end
else
return self:distance(arg1.x or self.x, arg1.y or self.y)
end
end
function STPoint.prototype.divide(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(____exports.STPoint, self.x / arg1, self.y / arg2)
else
return self:divide(arg1.x or 1, arg1.y or 1)
end
end
function STPoint.prototype.floor(self, arg1, arg2)
if arg1 == nil then
arg1 = 1
end
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(
____exports.STPoint,
math.floor(self.x * arg1) / arg1,
math.floor(self.y * arg2) / arg2
)
else
return self:floor(arg1.x or 1, arg1.y or 1)
end
end
function STPoint.prototype.multiply(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(____exports.STPoint, self.x * arg1, self.y * arg2)
else
return self:multiply(arg1.x or 1, arg1.y or 1)
end
end
function STPoint.prototype.round(self, arg1, arg2)
if arg1 == nil then
arg1 = 1
end
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(
____exports.STPoint,
math.floor(self.x * arg1 + 0.5) / arg1,
math.floor(self.y * arg2 + 0.5) / arg2
)
else
return self:round(arg1.x or 1, arg1.y or 1)
end
end
function STPoint.prototype.set(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
self.x = arg1
self.y = arg2
return self
else
return self:set(arg1.x or self.x, arg1.y or self.y)
end
end
function STPoint.prototype.step(self, speed, ...)
local points = {...}
return __TS__AsyncAwaiter(function(____awaiter_resolve)
for ____, point in ipairs(points) do
if type(point) == "number" then
__TS__Await(self:automate(
math.floor(self:distance(point) / speed + 0.5),
point
))
else
__TS__Await(self:automate(
math.floor(self:distance(point.x or self.x, point.y or self.y) / speed + 0.5),
point
))
end
end
end)
end
function STPoint.prototype.subtract(self, arg1, arg2)
if arg2 == nil then
arg2 = arg1
end
if type(arg1) == "number" then
return __TS__New(____exports.STPoint, self.x - arg1, self.y - arg2)
else
return self:subtract(arg1.x or 0, arg1.y or 0)
end
end
____exports.STStorage = __TS__Class()
local STStorage = ____exports.STStorage
STStorage.name = "STStorage"
function STStorage.prototype.____constructor(self, file)
self.entries = nil
self.file = file
end
function STStorage.prototype.get(self, key)
self:load()
for ____, entry in ipairs(self.entries) do
if entry[1] == key then
return entry[2]
end
end
return nil
end
STStorage.prototype.keys = __TS__Generator(function(self)
self:load()
for ____, entry in __TS__Iterator(__TS__ArrayEntries(self.entries)) do
coroutine.yield(entry[2][1])
end
end)
function STStorage.prototype.load(self)
if self.entries ~= nil then
return
end
local ____opt_62 = love.filesystem.getInfo(self.file)
local ____type = ____opt_62 and ____opt_62.type
if ____type ~= "file" then
self.entries = {}
else
self.entries = __TS__ArrayMap(
__TS__ArrayFilter(
__TS__StringSplit((love.filesystem.read("string", self.file)), "\n"),
function(____, a) return a ~= "" end
),
function(____, a)
local index = (string.find(a, "=", nil, true) or 0) - 1
local value = __TS__StringSlice(a, index + 1)
return {
__TS__StringSlice(a, 0, index),
value == "Infinity" and math.huge or (value == "-Infinity" and -math.huge or ____exports.ST:decode(value))
}
end
)
end
end
function STStorage.prototype.save(self)
if self.entries == nil then
return
end
local ____opt_64 = love.filesystem.getInfo(self.file)
local ____type = ____opt_64 and ____opt_64.type
if ____type == nil or ____type == "file" then
local data = table.concat(
__TS__ArrayMap(
self.entries,
function(____, ____bindingPattern0)
local value
local key
key = ____bindingPattern0[1]
value = ____bindingPattern0[2]
return (key .. "=") .. (value == math.huge and "Infinity" or (value == -math.huge and "-Infinity" or ____exports.ST:encode(value)))
end
),
"\n"
)
for ____, file in ipairs(____exports.ST.disk.files) do
if file[1] == self.file then
file[2] = data
return
end
end
local ____exports_ST_disk_files_66 = ____exports.ST.disk.files
____exports_ST_disk_files_66[#____exports_ST_disk_files_66 + 1] = {self.file, data}
end
end
function STStorage.prototype.set(self, key, value)
if value == nil then
if self.entries ~= nil then
for ____, entry in __TS__Iterator(__TS__ArrayEntries(self.entries)) do
if entry[2][1] == key then
__TS__ArraySplice(self.entries, entry[1], 1)
self:save()
return
end
end
end
else
self:load()
for ____, entry in ipairs(self.entries) do
if entry[1] == key then
entry[2] = value
self:save()
return
end
end
local ____self_entries_67 = self.entries
____self_entries_67[#____self_entries_67 + 1] = {key, value}
self:save()
end
end
function STStorage.prototype.unload(self, save)
if save == nil then
save = false
end
if self.entries == nil then
return
end
if save then
self:save()
end
self.entries = nil
end
STStorage.prototype.values = __TS__Generator(function(self)
self:load()
for ____, entry in __TS__Iterator(__TS__ArrayEntries(self.entries)) do
coroutine.yield(entry[2][2])
end
end)
____exports.STTyper = __TS__Class()
local STTyper = ____exports.STTyper
STTyper.name = "STTyper"
function STTyper.prototype.____constructor(self, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local variables
local receiver
local placeholder
local interval
local functions
local formatter
local chunk
chunk = ____bindingPattern0.chunk
if chunk == nil then
chunk = 1
end
formatter = ____bindingPattern0.formatter
if formatter == nil then
formatter = nil
end
functions = ____bindingPattern0.functions
if functions == nil then
functions = {}
end
interval = ____bindingPattern0.interval
if interval == nil then
interval = 1
end
placeholder = ____bindingPattern0.placeholder
if placeholder == nil then
placeholder = "\0"
end
receiver = ____bindingPattern0.receiver
if receiver == nil then
receiver = nil
end
variables = ____bindingPattern0.variables
if variables == nil then
variables = {}
end
self.content = ""
self.task = nil
self.chunk = chunk
self.formatter = formatter
self.functions = functions
self.interval = interval
self.placeholder = placeholder
self.receiver = receiver
self.variables = variables
end
function STTyper.prototype.text(self, content)
while __TS__StringAccess(content, 0) == "<" do
local ____end = (string.find(content, ">", nil, true) or 0) - 1
local key, value = unpack(__TS__StringSplit(
__TS__StringSlice(content, 1, ____end),
":"
))
if value == nil then
value = ""
end
if self.functions[key] ~= nil then
self.functions[key](self, value)
end
content = __TS__StringSlice(content, ____end + 1)
end
while true do
local start = (string.find(content, "[", nil, true) or 0) - 1
if start == -1 then
break
end
local ____end = (string.find(content, "]", nil, true) or 0) - 1
local code = __TS__StringSlice(content, start + 2, ____end)
local value = ""
repeat
local ____switch306 = __TS__StringAccess(content, start + 1)
local ____cond306 = ____switch306 == "%"
if ____cond306 then
if self.variables[code] ~= nil then
value = self.variables[code]
end
break
end
____cond306 = ____cond306 or ____switch306 == "^"
if ____cond306 then
do
local count = code
while true do
local ____count_68 = count
count = ____count_68 - 1
if not (____count_68 ~= 0) then
break
end
value = value .. self.placeholder
end
break
end
end
until true
content = (__TS__StringSlice(content, 0, start) .. value) .. __TS__StringSlice(content, ____end + 1)
end
if self.formatter ~= nil then
content = self.formatter(content)
end
local ____opt_69 = self.task
if ____opt_69 ~= nil then
____opt_69.complete()
end
local index = 0
local interval = 0
local text_length = utf8.len(content)
local task = ____exports.ST:task()
local ____exports_ST_scripts_71 = ____exports.ST.scripts
____exports_ST_scripts_71[#____exports_ST_scripts_71 + 1] = function()
if not task.active then
return true
end
if interval == 0 then
interval = self.interval
local chunk = ""
local index_chunk = 0
while index < text_length and index_chunk < self.chunk do
local offs = utf8.offset(content, index + 1) - 1
local char = __TS__StringSlice(
content,
offs,
utf8.offset(content, index + 2) - 1
)
index = index + 1
if char == "{" then
local offs = utf8.offset(content, index + 1) - 1
local code = __TS__StringSlice(
content,
offs,
(string.find(
content,
"}",
math.max(offs + 1, 1),
true
) or 0) - 1
)
index = index + (utf8.len(code) + 1)
self.content = self.content .. ("{" .. code) .. "}"
else
chunk = chunk .. char
index_chunk = index_chunk + 1
self.content = self.content .. char
end
end
if self.receiver ~= nil and index_chunk ~= 0 then
self.receiver(chunk)
end
end
interval = interval - 1
if index < text_length then
return false
end
self.task = nil
task.complete()
return true
end
self.task = task
return task
end
____exports.STValue = __TS__Class()
local STValue = ____exports.STValue
STValue.name = "STValue"
function STValue.prototype.____constructor(self, value)
if value == nil then
value = 0
end
self.task = nil
self.value = value
end
function STValue.prototype.automate(self, duration, ...)
local points = {...}
local ____opt_72 = self.task
if ____opt_72 ~= nil then
____opt_72.complete()
end
local v = self.value
local ____temp_74 = ____exports.ST:automate(
duration,
function(delta)
self.value = ____exports.ST:bezier(
delta,
v,
unpack(points)
)
if delta == 1 then
self.task = nil
return true
end
return false
end
)
self.task = ____temp_74
return ____temp_74
end
function STValue.prototype.step(self, speed, ...)
local points = {...}
return __TS__AsyncAwaiter(function(____awaiter_resolve)
for ____, point in ipairs(points) do
__TS__Await(self:automate(
math.abs(point - self.value) / speed,
point
))
end
end)
end
____exports.STValueLinked = __TS__Class()
local STValueLinked = ____exports.STValueLinked
STValueLinked.name = "STValueLinked"
function STValueLinked.prototype.____constructor(self, getter, setter)
self.task = nil
self.getter = getter
self.setter = setter
end
function STValueLinked.prototype.automate(self, duration, ...)
local points = {...}
local ____opt_75 = self.task
if ____opt_75 ~= nil then
____opt_75.complete()
end
local v = self.getter()
local ____temp_77 = ____exports.ST:automate(
duration,
function(delta)
self.setter(____exports.ST:bezier(
delta,
v,
unpack(points)
))
if delta == 1 then
self.task = nil
return true
end
return false
end
)
self.task = ____temp_77
return ____temp_77
end
function STValueLinked.prototype.step(self, speed, ...)
local points = {...}
return __TS__AsyncAwaiter(function(____awaiter_resolve)
for ____, point in ipairs(points) do
__TS__Await(self:automate(
math.abs(point - self.getter()) / speed,
point
))
end
end)
end
__TS__SetDescriptor(
STValueLinked.prototype,
"value",
{
get = function(self)
return self.getter()
end,
set = function(self, value)
self.setter(value)
end
},
true
)
____exports.STValueRandom = __TS__Class()
local STValueRandom = ____exports.STValueRandom
STValueRandom.name = "STValueRandom"
function STValueRandom.prototype.____constructor(self, low, high, get, set)
self.generator = love.math.newRandomGenerator(low, high)
self.getter = get
self.setter = set
end
function STValueRandom.prototype.int(self, limit)
return math.floor(self:next() * limit)
end
function STValueRandom.prototype.next(self)
local value = self.value
self.setter(self.generator:getState())
return value
end
__TS__SetDescriptor(
STValueRandom.prototype,
"value",
{get = function(self)
local state = self.getter()
if state ~= nil then
self.generator:setState(state)
end
return self.generator:random()
end},
true
)
____exports.STAudio = __TS__Class()
local STAudio = ____exports.STAudio
STAudio.name = "STAudio"
__TS__ClassExtends(STAudio, ____exports.STAsset)
function STAudio.prototype.____constructor(self, source)
STAudio.____super.prototype.____constructor(
self,
function() return love.sound.newSoundData(self.source) end,
function(value) return value:release() end
)
self.source = source
end
function STAudio.prototype.swap(self, source)
self.source = source
self:reload()
end
____exports.STFont = __TS__Class()
local STFont = ____exports.STFont
STFont.name = "STFont"
__TS__ClassExtends(STFont, ____exports.STAsset)
function STFont.prototype.____constructor(self, source_data, source_image)
STFont.____super.prototype.____constructor(
self,
function()
local ____string = (love.filesystem.read("string", self.source_data))
if ____string == nil then
error("MISSING " .. self.source_data, 0)
end
local array = __TS__ArrayFilter(
__TS__StringSplit(____string, "\n"),
function(____, a) return a ~= "" end
)
return {
{
array[1],
__TS__ObjectFromEntries(__TS__ArrayMap(
__TS__ArraySlice(array, 1),
function(____, a)
local b = __TS__ArrayMap(
__TS__StringSplit(a, ";"),
function(____, a) return a end
)
return {
b[1],
__TS__ArraySlice(b, 1)
}
end
))
},
love.graphics.newImage(self.source_image)
}
end,
function(value) return value[2]:release() end
)
self.source_data = source_data
self.source_image = source_image
end
function STFont.prototype.compute(self, content, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local spacing
local plain
plain = ____bindingPattern0.plain
if plain == nil then
plain = false
end
spacing = ____bindingPattern0.spacing
if spacing == nil then
spacing = {x = 0, y = 0}
end
local cursor_x = 0
local cursor_y = 0
local index = 0
local line = 0
local max_x = 0
local stretch = 1
local subspacing_x = 0
local subspacing_y = 0
local data = self:load()[1]
self:unload()
local line_max = {0}
local line_height = data[1]
local text_length = utf8.len(content)
while index < text_length do
local offs = utf8.offset(content, index + 1) - 1
local char = __TS__StringSlice(
content,
offs,
utf8.offset(content, index + 2) - 1
)
index = index + 1
if char == "\n" then
cursor_x = 0
cursor_y = cursor_y + (line_height + spacing.y + subspacing_y)
line_max[#line_max + 1] = 0
line = line + 1
elseif not plain and char == "{" then
local offs = utf8.offset(content, index + 1) - 1
local code = __TS__StringSlice(
content,
offs,
(string.find(
content,
"}",
math.max(offs + 1, 1),
true
) or 0) - 1
)
index = index + (utf8.len(code) + 1)
local key, value = unpack(__TS__StringSplit(code, "="))
repeat
local ____switch355 = key
local x, y
local ____cond355 = ____switch355 == "shift"
if ____cond355 then
cursor_x = cursor_x + value * stretch
max_x = math.max(max_x, cursor_x)
line_max[line + 1] = math.max(line_max[line + 1], cursor_x)
break
end
____cond355 = ____cond355 or ____switch355 == "stretch"
if ____cond355 then
stretch = value
break
end
____cond355 = ____cond355 or ____switch355 == "spacing"
if ____cond355 then
x, y = unpack(__TS__StringSplit(value, "/"))
if y == nil then
y = x
end
subspacing_x = x
subspacing_y = y
break
end
until true
else
local glyph = data[2][tostring(utf8.codepoint(char, 1))]
if glyph ~= nil then
cursor_x = cursor_x + glyph[7] * stretch
max_x = math.max(max_x, cursor_x)
line_max[line + 1] = math.max(line_max[line + 1], cursor_x)
cursor_x = cursor_x + (spacing.x + subspacing_x) * stretch
end
end
end
cursor_y = cursor_y + line_height
return {x = max_x, y = cursor_y, w = line_max}
end
function STFont.prototype.swap(self, source_data, source_image)
self.source_data = source_data
self.source_image = source_image
self:reload()
end
function STFont.prototype.wrap(self, content, width, splitter, ____bindingPattern0)
if ____bindingPattern0 == nil then
____bindingPattern0 = ____exports.ST.empty_table
end
local spacing
local plain
plain = ____bindingPattern0.plain
if plain == nil then
plain = false
end
spacing = ____bindingPattern0.spacing
if spacing == nil then
spacing = {x = 0}
end
local index = 0
local line_x = 0
local stretch = 1
local subspacing_x = 0
local word = ""
local word_size = 0
local word_x = 0
local data = self:load()[1]
self:unload()
local output = ____exports.ST.empty_array
output[#output + 1] = ""
local text_length = utf8.len(content)
local stack = {}
while index < text_length do
do
local char_end = 0
local char_size = 0
local char_x = 0
local offs = utf8.offset(content, index + 1) - 1
local char = __TS__StringSlice(
content,
offs,
utf8.offset(content, index + 2) - 1
)
index = index + 1
if char == "\n" then
if index < text_length then
char_end = 3
else
char_end = 4
end
elseif not plain and char == "{" then
local offs = utf8.offset(content, index + 1) - 1
local code = __TS__StringSlice(
content,
offs,
(string.find(
content,
"}",
math.max(offs + 1, 1),
true
) or 0) - 1
)
index = index + (utf8.len(code) + 1)
word = word .. ("{" .. code) .. "}"
local key, value = unpack(__TS__StringSplit(code, "="))
repeat
local ____switch365 = key
local x
local ____cond365 = ____switch365 == "shift"
if ____cond365 then
word_x = word_x + value * stretch
word_size = word_x
break
end
____cond365 = ____cond365 or ____switch365 == "stretch"
if ____cond365 then
stretch = value
break
end
____cond365 = ____cond365 or ____switch365 == "spacing"
if ____cond365 then
x = __TS__StringSplit(value, "/")[1]
subspacing_x = x
break
end
until true
if index < text_length then
goto __continue360
end
char_end = 4
else
local glyph = data[2][tostring(utf8.codepoint(char, 1))]
if glyph ~= nil then
char_size = glyph[7] * stretch
char_x = char_size + (spacing.x + subspacing_x) * stretch
end
char_end = splitter(char)
if char_end == 0 then
word = word .. char
word_size = word_x + char_size
word_x = word_x + char_x
if index < text_length then
goto __continue360
end
char_end = 4
end
end
repeat
local ____switch371 = char_end
local ____cond371 = ____switch371 == ____exports.STSplitterResult.INCLUDE or ____switch371 == ____exports.STSplitterResult.EXCLUDE
if ____cond371 then
if line_x + (char_end == 1 and word_x + char_size or word_size) > width(#output - 1) then
stack[#stack + 1] = word .. char
line_x = 0
else
local ____output_78, ____temp_79 = output, #output
____output_78[____temp_79] = ____output_78[____temp_79] .. word .. char
end
line_x = line_x + (word_x + char_x)
break
end
____cond371 = ____cond371 or (____switch371 == 3 or ____switch371 == 4)
if ____cond371 then
if line_x + word_size > width(#output - 1) then
stack[#stack + 1] = word
else
local ____output_80, ____temp_81 = output, #output
____output_80[____temp_81] = ____output_80[____temp_81] .. word
end
if char_end == 3 then
stack[#stack + 1] = ""
line_x = 0
end
break
end
until true
for ____, element in ipairs(__TS__ArraySplice(stack, 0)) do
local line = output[#output]
if splitter(__TS__StringAccess(line, #line - 1)) == 2 then
output[#output] = string.sub(line, 1, -2)
end
output[#output + 1] = element
end
word = ""
word_size = 0
word_x = 0
end
::__continue360::
end
return table.concat(
__TS__ArraySplice(output, 0),
"\n"
)
end
____exports.STFrames = __TS__Class()
local STFrames = ____exports.STFrames
STFrames.name = "STFrames"
__TS__ClassExtends(STFrames, ____exports.STAsset)
function STFrames.prototype.____constructor(self, source_data, source_image)
STFrames.____super.prototype.____constructor(
self,
function()
local ____string = (love.filesystem.read("string", self.source_data))
if ____string == nil then
error("MISSING " .. self.source_data, 0)
end
local object = ____exports.ST:decode(____string)
return {
__TS__ArrayMap(
object.frames,
function(____, frame, index) return {
frame.duration,
frame.spriteSourceSize.x,
frame.spriteSourceSize.y,
frame.sourceSize.w,
frame.sourceSize.h,
frame.frame.x,
frame.frame.y,
frame.frame.w,
frame.frame.h,
unpack(__TS__ArrayMap(
__TS__ArrayFilter(
object.meta.frameTags,
function(____, tag) return tag.from <= index and index <= tag.to end
),
function(____, tag) return tag.name end
))
} end
),
love.graphics.newImage(self.source_image)
}
end,
function(value) return value[2]:release() end
)
self.source_data = source_data
self.source_image = source_image
end
function STFrames.prototype.swap(self, source_data, source_image)
self.source_data = source_data
self.source_image = source_image
self:reload()
end
____exports.STImage = __TS__Class()
local STImage = ____exports.STImage
STImage.name = "STImage"
__TS__ClassExtends(STImage, ____exports.STAsset)
function STImage.prototype.____constructor(self, source)
STImage.____super.prototype.____constructor(
self,
function() return love.graphics.newImage(self.source) end,
function(value) return value:release() end
)
self.source = source
end
function STImage.prototype.swap(self, source)
self.source = source
self:reload()
end
____exports.STObject = __TS__Class()
local STObject = ____exports.STObject
STObject.name = "STObject"
__TS__ClassExtends(STObject, ____exports.STContainer)
function STObject.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STObject.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local velocity
local spin
local offset
local gravity
local anchor
local acceleration
acceleration = ____bindingPattern0.acceleration
if acceleration == nil then
acceleration = 1
end
anchor = ____bindingPattern0.anchor
if anchor == nil then
anchor = 0
end
gravity = ____bindingPattern0.gravity
if gravity == nil then
gravity = 0
end
offset = ____bindingPattern0.offset
if offset == nil then
offset = 0
end
spin = ____bindingPattern0.spin
if spin == nil then
spin = 0
end
velocity = ____bindingPattern0.velocity
if velocity == nil then
velocity = 0
end
self.acceleration = __TS__New(____exports.STValue, acceleration)
self.anchor = __TS__New(____exports.STPoint, anchor)
self.gravity = __TS__New(____exports.STPoint, gravity)
self.offset = __TS__New(____exports.STPoint, offset)
self.spin = __TS__New(____exports.STValue, spin)
self.velocity = __TS__New(____exports.STPoint, velocity)
end)(properties)
end
function STObject.prototype.tick_self(self)
local ____self_velocity_82, ____x_83 = self.velocity, "x"
____self_velocity_82[____x_83] = ____self_velocity_82[____x_83] + self.gravity.x
local ____self_velocity_84, ____y_85 = self.velocity, "y"
____self_velocity_84[____y_85] = ____self_velocity_84[____y_85] + self.gravity.y
if self.acceleration.value ~= 1 then
local ____self_velocity_86, ____x_87 = self.velocity, "x"
____self_velocity_86[____x_87] = ____self_velocity_86[____x_87] * self.acceleration.value
local ____self_velocity_88, ____y_89 = self.velocity, "y"
____self_velocity_88[____y_89] = ____self_velocity_88[____y_89] * self.acceleration.value
local ____self_spin_90, ____value_91 = self.spin, "value"
____self_spin_90[____value_91] = ____self_spin_90[____value_91] * self.acceleration.value
end
local ____self_position_92, ____x_93 = self.position, "x"
____self_position_92[____x_93] = ____self_position_92[____x_93] + self.velocity.x
local ____self_position_94, ____y_95 = self.position, "y"
____self_position_94[____y_95] = ____self_position_94[____y_95] + self.velocity.y
local ____self_rotation_96, ____value_97 = self.rotation, "value"
____self_rotation_96[____value_97] = ____self_rotation_96[____value_97] + self.spin.value
end
____exports.STScreen = __TS__Class()
local STScreen = ____exports.STScreen
STScreen.name = "STScreen"
__TS__ClassExtends(STScreen, ____exports.STContainer)
function STScreen.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STScreen.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local camera_min
local camera_max
local camera
camera = ____bindingPattern0.camera
if camera == nil then
camera = 0
end
camera_max = ____bindingPattern0.camera_max
if camera_max == nil then
camera_max = 0
end
camera_min = ____bindingPattern0.camera_min
if camera_min == nil then
camera_min = 0
end
self.camera = __TS__New(____exports.STPoint, camera)
self.camera_max = __TS__New(____exports.STPoint, camera_max)
self.camera_min = __TS__New(____exports.STPoint, camera_min)
end)(properties)
end
function STScreen.prototype.draw_self(self)
self.position.x = -____exports.ST:clamp(self.camera.x, self.camera_min.x, self.camera_max.x)
self.position.y = -____exports.ST:clamp(self.camera.y, self.camera_min.y, self.camera_max.y)
end
____exports.STSaveFile = __TS__Class()
local STSaveFile = ____exports.STSaveFile
STSaveFile.name = "STSaveFile"
__TS__ClassExtends(STSaveFile, ____exports.STStorage)
function STSaveFile.prototype.____constructor(self, file, schema)
STSaveFile.____super.prototype.____constructor(self, file)
self.volatile = {}
self.schema = schema
end
function STSaveFile.prototype.accessor(self)
local object = {}
for key in pairs(self.schema) do
__TS__ObjectDefineProperty(
object,
key,
{
get = function() return self:get(key) end,
set = function(____, value) return self:set(key, value) end
}
)
end
return object
end
function STSaveFile.prototype.apply(self)
for ____, ____value in ipairs(self:dump()) do
local key = ____value[1]
local value = ____value[2]
local ____key_99 = key
local ____temp_98
if value == self.schema[key] then
____temp_98 = nil
else
____temp_98 = value
end
STSaveFile.____super.prototype.set(self, ____key_99, ____temp_98)
end
end
function STSaveFile.prototype.check(self)
return #self.volatile
end
function STSaveFile.prototype.dump(self)
return __TS__ArraySplice(self.volatile, 0)
end
function STSaveFile.prototype.get(self, key)
if __TS__StringAccess(key, 0) == "_" or __TS__StringAccess(key, 0) == "$" then
local ____STSaveFile_____super_prototype_get_result_100 = STSaveFile.____super.prototype.get(self, key)
if ____STSaveFile_____super_prototype_get_result_100 == nil then
____STSaveFile_____super_prototype_get_result_100 = self.schema[key]
end
return ____STSaveFile_____super_prototype_get_result_100
end
for ____, entry in ipairs(self.volatile) do
if entry[1] == key then
return entry[2]
end
end
local ____STSaveFile_____super_prototype_get_result_101 = STSaveFile.____super.prototype.get(self, key)
if ____STSaveFile_____super_prototype_get_result_101 == nil then
____STSaveFile_____super_prototype_get_result_101 = self.schema[key]
end
return ____STSaveFile_____super_prototype_get_result_101
end
function STSaveFile.prototype.reset(self, level)
if level == nil then
level = 0
end
self:dump()
for key in pairs(self.schema) do
do
if __TS__StringAccess(key, 0) == "_" and level < 1 then
goto __continue416
elseif __TS__StringAccess(key, 0) == "$" and level < 2 then
goto __continue416
end
STSaveFile.____super.prototype.set(self, key, nil)
end
::__continue416::
end
end
function STSaveFile.prototype.set(self, key, value)
if __TS__StringAccess(key, 0) == "_" or __TS__StringAccess(key, 0) == "$" then
local ____key_103 = key
local ____temp_102
if value == self.schema[key] then
____temp_102 = nil
else
____temp_102 = value
end
STSaveFile.____super.prototype.set(self, ____key_103, ____temp_102)
return
end
for ____, entry in ipairs(self.volatile) do
if entry[1] == key then
entry[2] = value
return
end
end
local ____self_volatile_104 = self.volatile
____self_volatile_104[#____self_volatile_104 + 1] = {key, value}
end
____exports.STAnimation = __TS__Class()
local STAnimation = ____exports.STAnimation
STAnimation.name = "STAnimation"
__TS__ClassExtends(STAnimation, ____exports.STObject)
function STAnimation.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STAnimation.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local step
local speed
local frames
local frame
local duration
local direction
local crop
crop = ____bindingPattern0.crop
if crop == nil then
crop = nil
end
direction = ____bindingPattern0.direction
if direction == nil then
direction = 0
end
duration = ____bindingPattern0.duration
if duration == nil then
duration = 0
end
frame = ____bindingPattern0.frame
if frame == nil then
frame = 0
end
frames = ____bindingPattern0.frames
if frames == nil then
frames = nil
end
speed = ____bindingPattern0.speed
if speed == nil then
speed = 1
end
step = ____bindingPattern0.step
if step == nil then
step = 0
end
local ____temp_105
if crop == nil then
____temp_105 = nil
else
____temp_105 = {bottom = crop.bottom or 0, left = crop.left or 0, right = crop.right or 0, top = crop.top or 0}
end
self.crop = ____temp_105
self.direction = direction
self.duration = duration
self.frame = frame
self.frames_value = frames
self.speed = __TS__New(____exports.STValue, speed)
self.step = step
end)(properties)
end
function STAnimation.prototype.cleanup(self)
local ____opt_106 = self.frames_value
if ____opt_106 ~= nil then
____opt_106:unload(self)
end
STAnimation.____super.prototype.cleanup(self)
end
function STAnimation.prototype.draw_self(self)
if self.frames_value == nil then
return
end
local data, image = unpack(self.frames_value:load(self))
local frame = data[math.floor(self.frame) + 1]
if frame == nil then
return
end
local width = frame[4]
local height = frame[5]
local cx = 0
local cy = 0
local cw = width
local ch = height
if self.crop ~= nil then
local cb = self.crop.bottom or 0
local cl = self.crop.left or 0
local cr = self.crop.right or 0
local ct = self.crop.top or 0
cx = (cl < 0 and width or 0) + cl
cw = (cr < 0 and 0 or width) - cr - cx
cy = (ct < 0 and height or 0) + ct
ch = (cb < 0 and 0 or height) - cb - cy
end
local dx = math.max(cx - frame[2], 0)
local dy = math.max(cy - frame[3], 0)
local ex = math.max(frame[2] - cx, 0)
local ey = math.max(frame[3] - cy, 0)
local quad = love.graphics.newQuad(
frame[6] + dx,
frame[7] + dy,
math.min(frame[8] - dx, cw - ex),
math.min(frame[9] - dy, ch - ey),
image:getWidth(),
image:getHeight()
)
love.graphics.draw(image, quad, ex + self.offset.x + cw * -self.anchor.x, ey + self.offset.y + ch * -self.anchor.y)
quad:release()
end
function STAnimation.prototype.getSize(self)
if self.frames_value == nil then
return
end
local data = self.frames_value:load()[1]
self.frames_value:unload()
local frame = data[math.floor(self.frame) + 1]
if frame == nil then
return
end
local width = frame[4]
local height = frame[5]
local cx = 0
local cy = 0
local cw = width
local ch = height
if self.crop ~= nil then
local cb = self.crop.bottom or 0
local cl = self.crop.left or 0
local cr = self.crop.right or 0
local ct = self.crop.top or 0
cx = (cl < 0 and width or 0) + cl
cw = (cr < 0 and 0 or width) - cr - cx
cy = (ct < 0 and height or 0) + ct
ch = (cb < 0 and 0 or height) - cb - cy
end
local dx = math.max(cx - frame[2], 0)
local dy = math.max(cy - frame[3], 0)
local ex = math.max(frame[2] - cx, 0)
local ey = math.max(frame[3] - cy, 0)
return {
x = math.min(frame[8] - dx, cw - ex),
y = math.min(frame[9] - dy, ch - ey)
}
end
function STAnimation.prototype.tick_self(self)
STAnimation.____super.prototype.tick_self(self)
if self.direction == 0 or self.frames_value == nil then
return
end
local data = self.frames_value:load(self)[1]
local frame = data[math.floor(self.frame) + 1]
if frame == nil then
return
end
local duration = self.duration == 0 and frame[1] / (1000 / ____exports.ST.fps) or self.duration
if duration <= 0 then
return
end
if self.direction == -1 then
self.step = self.step - self.speed.value
while self.step < 0 do
self.step = self.step + duration
local ____self_108, ____frame_109 = self, "frame"
local ____self_frame_110 = ____self_108[____frame_109] - 1
____self_108[____frame_109] = ____self_frame_110
if ____self_frame_110 == -1 then
self.frame = #data - 1
end
end
else
self.step = self.step + self.speed.value
while duration <= self.step do
self.step = self.step - duration
local ____self_111, ____frame_112 = self, "frame"
local ____self_frame_113 = ____self_111[____frame_112] + 1
____self_111[____frame_112] = ____self_frame_113
if ____self_frame_113 == #data then
self.frame = 0
end
end
end
end
__TS__SetDescriptor(
STAnimation.prototype,
"frames",
{
get = function(self)
return self.frames_value
end,
set = function(self, value)
if value == self.frames_value then
return
end
local ____opt_114 = self.frames_value
if ____opt_114 ~= nil then
____opt_114:unload(self)
end
self.frames_value = value
end
},
true
)
____exports.STHitbox = __TS__Class()
local STHitbox = ____exports.STHitbox
STHitbox.name = "STHitbox"
__TS__ClassExtends(STHitbox, ____exports.STObject)
function STHitbox.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STHitbox.____super.prototype.____constructor(self, properties)
self.bounds_max = {x = 0, y = 0}
self.bounds_min = {x = 0, y = 0}
self.polygon = __TS__New(
Polygon,
__TS__New(Vector),
{
__TS__New(Vector),
__TS__New(Vector),
__TS__New(Vector),
__TS__New(Vector)
}
);
(function(____bindingPattern0)
local size
size = ____bindingPattern0.size
if size == nil then
size = 0
end
self.size = __TS__New(____exports.STPoint, size)
end)(properties)
end
function STHitbox.prototype.calculate(self)
local ____self = self
local containers = ____exports.ST.empty_array
while ____self ~= nil do
__TS__ArrayUnshift(containers, ____self)
____self = ____self.parent
end
local position_x = 0
local position_y = 0
local rotation = 0
local scale_x = 1
local scale_y = 1
for ____, container in ipairs(__TS__ArraySplice(containers, 0)) do
if rotation ~= 0 and rotation % 360 ~= 0 and container.parent ~= nil then
local ____temp_116 = ____exports.ST:ray(
container.parent.position:angle(container.position) + rotation,
container.parent.position:distance(container.position)
)
local x = ____temp_116.x
local y = ____temp_116.y
position_x = position_x + x * scale_x
position_y = position_y + y * scale_y
else
position_x = position_x + container.position.x * scale_x
position_y = position_y + container.position.y * scale_y
end
rotation = rotation + container.rotation.value
scale_x = scale_x * container.scale.x
scale_y = scale_y * container.scale.y
end
position_x = position_x + self.offset.x
position_y = position_y + self.offset.y
scale_x = scale_x * self.size.x
scale_y = scale_y * self.size.y
self.polygon.pos.x = position_x
self.polygon.pos.y = position_y
self.polygon:setAngle(rotation * (math.pi / 180))
self.polygon:setOffset(__TS__New(Vector, scale_x * -self.anchor.x, scale_y * -self.anchor.y))
self.polygon:setPoints({
__TS__New(Vector),
__TS__New(Vector, scale_x, 0),
__TS__New(Vector, scale_x, scale_y),
__TS__New(Vector, 0, scale_y)
})
if #self.polygon.calcPoints == 4 then
local ____self_polygon_calcPoints__1_117 = self.polygon.calcPoints[1]
local x1 = ____self_polygon_calcPoints__1_117.x
local y1 = ____self_polygon_calcPoints__1_117.y
local ____self_polygon_calcPoints__2_118 = self.polygon.calcPoints[2]
local x2 = ____self_polygon_calcPoints__2_118.x
local y2 = ____self_polygon_calcPoints__2_118.y
local ____self_polygon_calcPoints__3_119 = self.polygon.calcPoints[3]
local x3 = ____self_polygon_calcPoints__3_119.x
local y3 = ____self_polygon_calcPoints__3_119.y
local ____self_polygon_calcPoints__4_120 = self.polygon.calcPoints[4]
local x4 = ____self_polygon_calcPoints__4_120.x
local y4 = ____self_polygon_calcPoints__4_120.y
self.bounds_min.x = math.floor((position_x + math.min(x1, x2, x3, x4)) * 1000 + 0.5) / 1000
self.bounds_min.y = math.floor((position_y + math.min(y1, y2, y3, y4)) * 1000 + 0.5) / 1000
self.bounds_max.x = math.floor((position_x + math.max(x1, x2, x3, x4)) * 1000 + 0.5) / 1000
self.bounds_max.y = math.floor((position_y + math.max(y1, y2, y3, y4)) * 1000 + 0.5) / 1000
else
local ____self_polygon_calcPoints__1_121 = self.polygon.calcPoints[1]
local x = ____self_polygon_calcPoints__1_121.x
local y = ____self_polygon_calcPoints__1_121.y
self.bounds_min.x = math.floor((position_x + x) * 1000 + 0.5) / 1000
self.bounds_min.y = math.floor((position_y + y) * 1000 + 0.5) / 1000
self.bounds_max.x = math.floor((position_x + x) * 1000 + 0.5) / 1000
self.bounds_max.y = math.floor((position_y + y) * 1000 + 0.5) / 1000
end
return self
end
function STHitbox.prototype.draw_self(self)
if not ____exports.ST.debug then
return
end
local canvas = {love.graphics.getCanvas()}
local color = {love.graphics.getColor()}
love.graphics.setCanvas(____exports.ST.canvas_debug)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.rectangle(
"line",
self.offset.x + self.size.x * -self.anchor.x,
self.offset.y + self.size.y * -self.anchor.y,
self.size.x,
self.size.y
)
love.graphics.setCanvas(canvas)
love.graphics.setColor(color)
end
function STHitbox.prototype.test(self, other)
return self.bounds_min.x < other.bounds_max.x and other.bounds_min.x < self.bounds_max.x and self.bounds_min.y < other.bounds_max.y and other.bounds_min.y < self.bounds_max.y and testPolygonPolygon(self.polygon, other.polygon)
end
____exports.STMap = __TS__Class()
local STMap = ____exports.STMap
STMap.name = "STMap"
__TS__ClassExtends(STMap, ____exports.STScreen)
function STMap.prototype.____constructor(self, ____bindingPattern0)
local transition
local sheet
local rooms
local objects
objects = ____bindingPattern0.objects
rooms = ____bindingPattern0.rooms
sheet = ____bindingPattern0.sheet
transition = ____bindingPattern0.transition
if transition == nil then
transition = {1}
end
STMap.____super.prototype.____constructor(self)
self.autoplay = true
self.autorestore = true
self.music_state = nil
self.music_state_previous = nil
self.task = nil
self.transition_state = {0, 0, 0}
self.room_value = 0
self.updaters = {}
self.objects = objects
self.rooms = rooms
self.sheet_value = sheet
self.transition = transition
end
function STMap.prototype.addUpdater(self, script)
if #self.updaters == 0 or not __TS__ArrayIncludes(self.updaters, script) then
local ____self_updaters_122 = self.updaters
____self_updaters_122[#____self_updaters_122 + 1] = script
end
return self
end
function STMap.prototype.cam_clamped(self)
return self.camera:clamp(self.camera_min, self.camera_max)
end
function STMap.prototype.cam_free(self)
local min = self.camera_min:clone()
local max = self.camera_max:clone()
self.camera_min.x = -math.huge
self.camera_min.y = -math.huge
self.camera_max.x = math.huge
self.camera_max.y = math.huge
return {min, max}
end
function STMap.prototype.cam_restore(self, min, max)
if type(min) == "table" then
self.camera_min.x = min.x or -math.huge
self.camera_min.y = min.y or -math.huge
else
local ____self_camera_min_124 = self.camera_min
local ____min_123 = min
if ____min_123 == nil then
____min_123 = -math.huge
end
____self_camera_min_124.x = ____min_123
local ____self_camera_min_126 = self.camera_min
local ____min_125 = min
if ____min_125 == nil then
____min_125 = -math.huge
end
____self_camera_min_126.y = ____min_125
end
if type(max) == "table" then
self.camera_max.x = max.x or math.huge
self.camera_max.y = max.y or math.huge
else
local ____self_camera_max_128 = self.camera_max
local ____max_127 = max
if ____max_127 == nil then
____max_127 = math.huge
end
____self_camera_max_128.x = ____max_127
local ____self_camera_max_130 = self.camera_max
local ____max_129 = max
if ____max_129 == nil then
____max_129 = math.huge
end
____self_camera_max_130.y = ____max_129
end
end
function STMap.prototype.play(self, score)
local ____opt_131 = self.music_state_previous
local player_previous = ____opt_131 and ____opt_131[1]
self.music_state = {
score.daemon == (player_previous and player_previous.daemon) and player_previous or score.daemon:instance_forced({
gain = self.transition_state[1] == self.transition[1] and score.gain or 0,
pass = ____exports.ST:remap(score.distance, ____exports.ST.distance.near_pass, ____exports.ST.distance.far_pass),
rate = score.rate,
effects = ____exports.ST.distance.name_list
}),
score.distance,
score.gain,
score.rate
}
end
function STMap.prototype.removeUpdater(self, script)
if #self.updaters ~= 0 then
local index = __TS__ArrayIndexOf(self.updaters, script)
if index ~= -1 then
__TS__ArraySplice(self.updaters, index, 1)
end
end
return self
end
function STMap.prototype.stop(self)
local music = self.music_state
if music ~= nil then
music[1]:stop()
self.music_state = nil
local ____music__1_137 = music[1]
local ____opt_135 = self.music_state_previous
if ____music__1_137 == (____opt_135 and ____opt_135[1]) then
self.music_state_previous = nil
end
end
end
function STMap.prototype.tick_music(self, progress)
if progress == nil then
progress = self:tick_progress()
end
local music = self.music_state
local music_previous = self.music_state_previous
local distance = nil
if music ~= nil then
if music[1] == (music_previous and music_previous[1]) then
distance = ____exports.ST:remap(progress, music_previous[2], music[2])
music[1].gain.value = ____exports.ST:remap(progress, music_previous[3], music[3])
music[1].pass.value = ____exports.ST:remap(distance, ____exports.ST.distance.near_pass, ____exports.ST.distance.far_pass)
music[1].rate.value = ____exports.ST:remap(progress, music_previous[4], music[4])
else
distance = music[2]
music[1].gain.value = ____exports.ST:remap(progress, 0, music[3])
music[1].pass.value = ____exports.ST:remap(distance, ____exports.ST.distance.near_pass, ____exports.ST.distance.far_pass)
music[1].rate.value = music[4]
end
end
if music_previous ~= nil then
if progress == self.transition[#self.transition] then
if (music and music[1]) ~= music_previous[1] then
music_previous[1]:stop()
end
self.music_state_previous = nil
elseif (music and music[1]) ~= music_previous[1] then
distance = music_previous[2]
music_previous[1].gain.value = ____exports.ST:remap(progress, music_previous[3], 0)
music_previous[1].pass.value = ____exports.ST:remap(distance, ____exports.ST.distance.near_pass, ____exports.ST.distance.far_pass)
music_previous[1].rate.value = music_previous[4]
end
end
if distance == nil then
return
end
____exports.ST.distance.properties_a.gain = ____exports.ST:remap(distance, ____exports.ST.distance.near_mix, ____exports.ST.distance.far_mix)
____exports.ST.distance.properties_b.highcut = ____exports.ST:remap(distance, ____exports.ST.distance.near_frequency, ____exports.ST.distance.far_frequency)
love.audio.setEffect(____exports.ST.distance.name_a, ____exports.ST.distance.properties_a)
love.audio.setEffect(____exports.ST.distance.name_b, ____exports.ST.distance.properties_b)
end
function STMap.prototype.tick_position(self, progress)
if progress == nil then
progress = self:tick_progress()
end
self.position.x = ____exports.ST:remap(
progress,
self.transition_state[2],
-____exports.ST:clamp(self.camera.x, self.camera_min.x, self.camera_max.x)
) * self.scale.x
self.position.y = ____exports.ST:remap(
progress,
self.transition_state[3],
-____exports.ST:clamp(self.camera.y, self.camera_min.y, self.camera_max.y)
) * self.scale.y
end
function STMap.prototype.tick_progress(self, step)
if step == nil then
step = false
end
if step then
local ____temp_147 = self.transition_state[1] < self.transition[1]
if ____temp_147 then
local ____self_transition_state_144, ____1_145 = self.transition_state, 1
local ____self_transition_state__1_146 = ____self_transition_state_144[____1_145]
____self_transition_state_144[____1_145] = ____self_transition_state__1_146 + 1
____temp_147 = ____self_transition_state__1_146
end
end
return ____exports.ST:bezier(
math.min(self.transition_state[1] / self.transition[1], 1),
unpack(__TS__ArraySlice(self.transition, 1))
)
end
function STMap.prototype.tick_self(self)
local progress = self:tick_progress(true)
self:tick_position(progress)
self:tick_music(progress)
end
function STMap.prototype.view(self, index, values)
return __TS__AsyncAwaiter(function(____awaiter_resolve)
local prev = nil
self.transition_state[1] = self.transition[1]
local objects, release = unpack(self.objects(values))
self:attach(unpack(objects))
while index ~= nil do
self.room_value = index
local task = ____exports.ST:task()
local room = self.rooms[index + 1]
if self.autorestore then
self:cam_restore(room.camera_min, room.camera_max)
if type(room.camera_min) == "table" then
self.camera_min.x = room.camera_min.x or 0
self.camera_min.y = room.camera_min.y or 0
else
self.camera_min.x = room.camera_min or 0
self.camera_min.y = room.camera_min or 0
end
if type(room.camera_max) == "table" then
self.camera_max.x = room.camera_max.x or 0
self.camera_max.y = room.camera_max.y or 0
else
self.camera_max.x = room.camera_max or 0
self.camera_max.y = room.camera_max or 0
end
end
local rooms = {
{index, 0, 0},
unpack(room.neighbors or ____exports.ST.empty_array)
}
local visuals = __TS__ArrayMap(
rooms,
function(____, ____bindingPattern0)
local y
local x
local index
index = ____bindingPattern0[1]
x = ____bindingPattern0[2]
y = ____bindingPattern0[3]
local ____opt_150 = self.rooms[index + 1]
local ____opt_148 = ____opt_150 and ____opt_150.visual
local ____temp_152 = ____opt_148 and ____opt_148(____opt_150, values, self.sheet_value, index)
if ____temp_152 == nil then
____temp_152 = {
____exports.ST.empty_array,
function()
end
}
end
local containers, release = unpack(____temp_152)
for ____, container in ipairs(containers) do
local ____container_position_153, ____x_154 = container.position, "x"
____container_position_153[____x_154] = ____container_position_153[____x_154] + x
local ____container_position_155, ____y_156 = container.position, "y"
____container_position_155[____y_156] = ____container_position_155[____y_156] + y
if type(container.metadata) == "table" then
container.metadata.x = x
container.metadata.y = y
end
end
return {containers, release}
end
)
local ____opt_157 = room.physical
local ____temp_159 = ____opt_157 and ____opt_157(room, values)
if ____temp_159 == nil then
____temp_159 = {
____exports.ST.empty_array,
function()
end
}
end
local containers, release = unpack(____temp_159)
local ____self_attach_161 = self.attach
local ____array_160 = __TS__SparseArrayNew(unpack(__TS__ArrayFlatMap(
visuals,
function(____, visual) return visual[1] end
)))
__TS__SparseArrayPush(
____array_160,
unpack(containers)
)
____self_attach_161(
self,
__TS__SparseArraySpread(____array_160)
)
local rm = 0
while rm ~= #rooms do
local room = rooms[rm + 1]
local last = rm == #rooms - 1
for ____, script in ipairs(self.updaters) do
script(
self,
prev,
room[1],
room[1] == index,
room[2],
room[3],
last
)
end
rm = rm + 1
end
if self.autoplay and room.score ~= nil then
self:play(room.score)
end
self.task = task
prev = index
index = __TS__Await(task)
self.task = nil
local ____self_detach_163 = self.detach
local ____array_162 = __TS__SparseArrayNew(unpack(__TS__ArrayFlatMap(
visuals,
function(____, visual) return visual[1] end
)))
__TS__SparseArrayPush(
____array_162,
unpack(containers)
)
____self_detach_163(
self,
__TS__SparseArraySpread(____array_162)
)
for ____, visual in ipairs(visuals) do
visual[2]()
end
release()
if self.music_state_previous ~= nil then
local ____self_music_state_previous__1_166 = self.music_state_previous[1]
local ____opt_164 = self.music_state
if ____self_music_state_previous__1_166 ~= (____opt_164 and ____opt_164[1]) then
self.music_state_previous[1]:stop()
self.music_state_previous = nil
end
end
if index ~= nil or index ~= prev then
self.transition_state[1] = self.transition[1]
if room.neighbors ~= nil then
for ____, neighbor in ipairs(room.neighbors) do
if neighbor[1] == index then
self.transition_state[1] = 0
self.transition_state[2] = self.position.x + neighbor[2]
self.transition_state[3] = self.position.y + neighbor[3]
local cam = false
for ____, object in ipairs(objects) do
local ____object_position_167, ____x_168 = object.position, "x"
____object_position_167[____x_168] = ____object_position_167[____x_168] - neighbor[2]
local ____object_position_169, ____y_170 = object.position, "y"
____object_position_169[____y_170] = ____object_position_169[____y_170] - neighbor[3]
if object.position == self.camera then
cam = true
end
end
if not cam then
local ____self_camera_171, ____x_172 = self.camera, "x"
____self_camera_171[____x_172] = ____self_camera_171[____x_172] - neighbor[2]
local ____self_camera_173, ____y_174 = self.camera, "y"
____self_camera_173[____y_174] = ____self_camera_173[____y_174] - neighbor[3]
end
break
end
end
end
if self.music_state ~= nil then
self.music_state_previous = self.music_state
self.music_state = nil
end
end
self.autoplay = true
if index == nil then
for ____, script in ipairs(self.updaters) do
script(
self,
prev,
nil,
false,
0,
0,
true
)
end
end
end
self.room_value = 0
self:stop()
self:detach(unpack(objects))
release()
end)
end
__TS__SetDescriptor(
STMap.prototype,
"music",
{get = function(self)
local ____opt_175 = self.music_state
return ____opt_175 and ____opt_175[1]
end},
true
)
__TS__SetDescriptor(
STMap.prototype,
"music_previous",
{get = function(self)
local ____opt_177 = self.music_state_previous
return ____opt_177 and ____opt_177[1]
end},
true
)
__TS__SetDescriptor(
STMap.prototype,
"room",
{get = function(self)
return self.room_value
end},
true
)
__TS__SetDescriptor(
STMap.prototype,
"sheet",
{get = function(self)
return self.sheet_value
end},
true
)
____exports.STRectangle = __TS__Class()
local STRectangle = ____exports.STRectangle
STRectangle.name = "STRectangle"
__TS__ClassExtends(STRectangle, ____exports.STObject)
function STRectangle.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STRectangle.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local size
size = ____bindingPattern0.size
if size == nil then
size = 0
end
self.size = __TS__New(____exports.STPoint, size)
end)(properties)
end
function STRectangle.prototype.draw_self(self)
if self.size.x == 0 or self.size.y == 0 then
return
end
love.graphics.rectangle(
"fill",
self.offset.x + self.size.x * -self.anchor.x,
self.offset.y + self.size.y * -self.anchor.y,
self.size.x,
self.size.y
)
end
____exports.STSprite = __TS__Class()
local STSprite = ____exports.STSprite
STSprite.name = "STSprite"
__TS__ClassExtends(STSprite, ____exports.STObject)
function STSprite.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STSprite.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local image
local crop
crop = ____bindingPattern0.crop
if crop == nil then
crop = nil
end
image = ____bindingPattern0.image
if image == nil then
image = nil
end
local ____temp_179
if crop == nil then
____temp_179 = nil
else
____temp_179 = {bottom = crop.bottom or 0, left = crop.left or 0, right = crop.right or 0, top = crop.top or 0}
end
self.crop = ____temp_179
self.image_value = image
end)(properties)
end
function STSprite.prototype.cleanup(self)
local ____opt_180 = self.image_value
if ____opt_180 ~= nil then
____opt_180:unload(self)
end
STSprite.____super.prototype.cleanup(self)
end
function STSprite.prototype.draw_self(self)
if self.image_value == nil then
return
end
local image = self.image_value:load(self)
local width = image:getWidth()
local height = image:getHeight()
local cx = 0
local cy = 0
local cw = width
local ch = height
if self.crop ~= nil then
local cb = self.crop.bottom or 0
local cl = self.crop.left or 0
local cr = self.crop.right or 0
local ct = self.crop.top or 0
cx = (cl < 0 and width or 0) + cl
cw = (cr < 0 and 0 or width) - cr - cx
cy = (ct < 0 and height or 0) + ct
ch = (cb < 0 and 0 or height) - cb - cy
end
local quad = love.graphics.newQuad(
cx,
cy,
cw,
ch,
width,
height
)
love.graphics.draw(image, quad, self.offset.x - cw * self.anchor.x, self.offset.y - ch * self.anchor.y)
quad:release()
end
function STSprite.prototype.getSize(self)
if self.image_value == nil then
return
end
local image = self.image_value:load()
local width = image:getWidth()
local height = image:getHeight()
self.image_value:unload()
local cx = 0
local cy = 0
local cw = width
local ch = height
if self.crop ~= nil then
local cb = self.crop.bottom or 0
local cl = self.crop.left or 0
local cr = self.crop.right or 0
local ct = self.crop.top or 0
cx = (cl < 0 and width or 0) + cl
cw = (cr < 0 and 0 or width) - cr - cx
cy = (ct < 0 and height or 0) + ct
ch = (cb < 0 and 0 or height) - cb - cy
end
return {x = cw, y = ch}
end
__TS__SetDescriptor(
STSprite.prototype,
"image",
{
get = function(self)
return self.image_value
end,
set = function(self, value)
if value == self.image_value then
return
end
local ____opt_182 = self.image_value
if ____opt_182 ~= nil then
____opt_182:unload(self)
end
self.image_value = value
end
},
true
)
____exports.STText = __TS__Class()
local STText = ____exports.STText
STText.name = "STText"
__TS__ClassExtends(STText, ____exports.STObject)
function STText.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STText.____super.prototype.____constructor(self, properties);
(function(____bindingPattern0)
local spacing
local plain
local justify
local font
local content
content = ____bindingPattern0.content
if content == nil then
content = ""
end
font = ____bindingPattern0.font
if font == nil then
font = nil
end
justify = ____bindingPattern0.justify
if justify == nil then
justify = 0
end
plain = ____bindingPattern0.plain
if plain == nil then
plain = false
end
spacing = ____bindingPattern0.spacing
if spacing == nil then
spacing = 0
end
self.content = content
self.font_value = font
self.justify = justify
self.plain = plain
self.spacing = __TS__New(____exports.STPoint, spacing)
end)(properties)
end
function STText.prototype.cleanup(self)
local ____opt_184 = self.font_value
if ____opt_184 ~= nil then
____opt_184:unload(self)
end
STText.____super.prototype.cleanup(self)
end
function STText.prototype.draw_self(self)
if self.font_value == nil then
return
end
local color = {love.graphics.getColor()}
local data, image = unpack(self.font_value:load(self))
local width = image:getWidth()
local height = image:getHeight()
local color_r = color[1]
local color_g = color[2]
local color_b = color[3]
local cursor_x = 0
local cursor_y = 0
local index = 0
local line = 0
local shake_x = 0
local shake_y = 0
local stretch = 1
local subspacing_x = 0
local subspacing_y = 0
local wave_d = 0
local wave_i = 0
local wave_o = 0
local wave_s = 0
local wave_x = 0
local wave_y = 0
local size = self.font_value:compute(self.content, self)
local base_x = self.offset.x + size.x * -self.anchor.x
local base_y = self.offset.y + size.y * -self.anchor.y
local line_height = data[1]
local line_max = math.max(unpack(size.w))
local text_length = utf8.len(self.content)
while index < text_length do
local offs = utf8.offset(self.content, index + 1) - 1
local char = __TS__StringSlice(
self.content,
offs,
utf8.offset(self.content, index + 2) - 1
)
index = index + 1
if char == "\n" then
cursor_x = 0
cursor_y = cursor_y + (line_height + self.spacing.y + subspacing_y)
line = line + 1
elseif not self.plain and char == "{" then
local offs = utf8.offset(self.content, index + 1) - 1
local code = __TS__StringSlice(
self.content,
offs,
(string.find(
self.content,
"}",
math.max(offs + 1, 1),
true
) or 0) - 1
)
index = index + (utf8.len(code) + 1)
local key, value = unpack(__TS__StringSplit(code, "="))
if value == nil then
value = ""
end
repeat
local ____switch556 = key
local ____cond556 = ____switch556 == "color"
if ____cond556 then
do
if value == "" then
color_r = color[1]
color_g = color[2]
color_b = color[3]
else
local color = ____exports.ST:hex2rgb(value)
color_r = color.red / 255
color_g = color.green / 255
color_b = color.blue / 255
end
break
end
end
____cond556 = ____cond556 or ____switch556 == "reset"
if ____cond556 then
do
color_r = color[1]
color_g = color[2]
color_b = color[3]
shake_x = 0
shake_y = 0
stretch = 1
wave_d = 0
wave_o = 0
wave_s = 0
wave_x = 0
wave_y = 0
break
end
end
____cond556 = ____cond556 or ____switch556 == "shake"
if ____cond556 then
do
local x, y = unpack(__TS__StringSplit(value, "/"))
if y == nil then
y = x
end
shake_x = x
shake_y = y
break
end
end
____cond556 = ____cond556 or ____switch556 == "shift"
if ____cond556 then
cursor_x = cursor_x + value * stretch
break
end
____cond556 = ____cond556 or ____switch556 == "stretch"
if ____cond556 then
stretch = value
break
end
____cond556 = ____cond556 or ____switch556 == "spacing"
if ____cond556 then
do
local x, y = unpack(__TS__StringSplit(value, "/"))
if y == nil then
y = x
end
subspacing_x = x
subspacing_y = y
break
end
end
____cond556 = ____cond556 or ____switch556 == "wave"
if ____cond556 then
do
local x, y, s, o, d = unpack(__TS__StringSplit(value, "/"))
if y == nil then
y = x
end
if s == nil then
s = 1
end
if o == nil then
o = 1
end
if d == nil then
d = x == 0 and 0 or 0.25
end
wave_d = d * math.pi * 2
wave_o = o * math.pi * 2
wave_s = s / ____exports.ST.fps * math.pi * 2
wave_x = x
wave_y = y
break
end
end
until true
else
local glyph = data[2][tostring(utf8.codepoint(char, 1))]
if glyph ~= nil then
love.graphics.setColor(color_r, color_g, color_b, color[4])
local quad = love.graphics.newQuad(
glyph[1],
glyph[2],
glyph[3],
glyph[4],
width,
height
)
love.graphics.draw(
image,
quad,
base_x + self.justify * (line_max - size.w[line + 1]) + cursor_x + (shake_x == 0 and 0 or shake_x * stretch * (math.random() - 0.5)) + (wave_x == 0 and 0 or wave_x * stretch * math.sin(____exports.ST.time * wave_s + wave_i * wave_o)) + glyph[5],
base_y + cursor_y + (shake_y == 0 and 0 or shake_y * (math.random() - 0.5)) + (wave_y == 0 and 0 or wave_y * math.sin(____exports.ST.time * wave_s + wave_i * wave_o + wave_d)) + glyph[6],
0,
stretch,
1
)
quad:release()
cursor_x = cursor_x + (glyph[7] + self.spacing.x + subspacing_x) * stretch
end
wave_i = wave_i + 1
end
end
love.graphics.setColor(color)
end
__TS__SetDescriptor(
STText.prototype,
"font",
{
get = function(self)
return self.font_value
end,
set = function(self, value)
if value == self.font_value then
return
end
local ____opt_186 = self.font_value
if ____opt_186 ~= nil then
____opt_186:unload(self)
end
self.font_value = value
end
},
true
)
____exports.STActor = __TS__Class()
local STActor = ____exports.STActor
STActor.name = "STActor"
__TS__ClassExtends(STActor, ____exports.STAnimation)
function STActor.prototype.____constructor(self, properties)
if properties == nil then
properties = ____exports.ST.empty_table
end
STActor.____super.prototype.____constructor(self, properties)
self.task = nil;
(function(____bindingPattern0)
local stances
local stance
local facings
facings = ____bindingPattern0.facings
if facings == nil then
facings = ____exports.ST.empty_table
end
stance = ____bindingPattern0.stance
if stance == nil then
stance = nil
end
stances = ____bindingPattern0.stances
if stances == nil then
stances = {}
end
self.facings = {
facings.up or nil,
facings.up_right or facings.up or nil,
facings.right or facings.down or nil,
facings.down_right or facings.down or nil,
facings.down or nil,
facings.down_left or facings.down or nil,
facings.left or facings.up or nil,
facings.up_left or facings.up or nil
}
local ____temp_188
if stance == nil then
____temp_188 = nil
else
____temp_188 = stances[stance]
end
self.frames = ____temp_188
self.stance_value = stance
self.stances = stances
end)(properties)
end
function STActor.prototype.move(self, x, y, r)
if x == nil then
x = 0
end
if y == nil then
y = 0
end
if r == nil then
r = false
end
if x == 0 and y == 0 then
self.direction = 0
self.frame = 0
self.step = 0
else
self.direction = 1
local stance = self.facings[(x == 0 and (y < 0 and 0 or 4) or (y == 0 and (x < 0 and 6 or 2) or (x < 0 and (y < 0 and 7 or 5) or (y < 0 and 1 or 3)))) + 1]
if self.stance_value ~= stance then
self.stance = stance
if r then
self.frame = 0
self.step = 0
end
end
local ____self_position_189, ____x_190 = self.position, "x"
____self_position_189[____x_190] = ____self_position_189[____x_190] + x
local ____self_position_191, ____y_192 = self.position, "y"
____self_position_191[____y_192] = ____self_position_191[____y_192] + y
end
end
function STActor.prototype.walk(self, speed, ...)
if speed == nil then
speed = 0
end
local points = {...}
return __TS__AsyncAwaiter(function(____awaiter_resolve)
local ____opt_193 = self.task
if ____opt_193 ~= nil then
____opt_193.complete()
end
if speed == 0 then
self:move()
self.task = nil
return ____awaiter_resolve(nil)
end
local index = 0
local task = ____exports.ST:task()
local ____exports_ST_scripts_195 = ____exports.ST.scripts
____exports_ST_scripts_195[#____exports_ST_scripts_195 + 1] = function()
if not task.active then
return true
end
local point = points[index + 1]
self:move(
____exports.ST:clamp((point.x or self.position.x) - self.position.x, -speed, speed),
____exports.ST:clamp((point.y or self.position.y) - self.position.y, -speed, speed)
)
while math.abs((point.x or self.position.x) - self.position.x) < 0.000001 and math.abs((point.y or self.position.y) - self.position.y) < 0.000001 do
self.position.x = point.x or self.position.x
self.position.y = point.y or self.position.y
index = index + 1
if index == #points then
self:move()
self.task = nil
task.complete()
return true
end
point = points[index + 1]
end
return false
end
self.task = task
return ____awaiter_resolve(nil, task)
end)
end
__TS__SetDescriptor(
STActor.prototype,
"stance",
{
get = function(self)
return self.stance_value
end,
set = function(self, value)
local ____temp_196
if value == nil then
____temp_196 = nil
else
____temp_196 = self.stances[value]
end
self.frames = ____temp_196
if value == self.stance_value then
return
end
self.stance_value = value
end
},
true
)
____exports.ST_SEMITONE = 2 ^ (1 / 12)
____exports.ST = {
acquit = nil,
canvas = nil,
canvas_debug = nil,
debug = false,
delta = 1,
distance = {
near_frequency = 20000,
near_pass = 1,
near_mix = 0,
far_frequency = 4000,
far_pass = 0,
far_mix = 1,
name_a = "#distance_a",
name_b = "#distance_b",
name_list = {"#distance_a", "#distance_b"},
properties_a = {
type = "reverb",
airabsorption = 0.892,
decaytime = 4,
density = 1,
diffusion = 1,
gain = 0
},
properties_b = {type = "equalizer", highcut = 20000}
},
disk = {
channel = love.thread.getChannel("files"),
files = {},
thread = love.thread.newThread("\n files = love.thread.getChannel('files');\n while true do\n local file = files:pop();\n if file then\n love.filesystem.write(file[1], file[2]);\n else\n break\n end\n end\n ")
},
empty_array = {},
empty_table = {},
fps = 30,
height = 640,
inputs = {},
instances = {},
scale = 1,
screen = nil,
scripts = {},
speed = 1,
superscripts = {},
time = 0,
width = 480,
automate = function(self, duration, controller)
local time = 0
local task = ____exports.ST:task()
local ____exports_ST_scripts_198 = ____exports.ST.scripts
____exports_ST_scripts_198[#____exports_ST_scripts_198 + 1] = function()
if not task.active then
return true
end
local ____controller_197 = controller
time = time + 1
if ____controller_197(time / duration) then
task.complete()
return true
end
return false
end
return task
end,
bezier = function(self, value, ...)
local points = {...}
repeat
local ____switch590 = #points
local ____cond590 = ____switch590 == 0
if ____cond590 then
return value
end
____cond590 = ____cond590 or ____switch590 == 1
if ____cond590 then
return points[1]
end
____cond590 = ____cond590 or ____switch590 == 2
if ____cond590 then
if points[1] == points[2] then
return points[1]
else
return value * (points[2] - points[1]) / 1 + points[1]
end
end
____cond590 = ____cond590 or ____switch590 == 3
if ____cond590 then
if points[1] == points[2] then
if points[1] == points[3] then
return points[1]
else
return value ^ 2 * (points[3] - points[1]) + points[1]
end
elseif points[1] == points[3] then
return (value * (value - 1) * 2 + 1) * (points[1] - points[2]) + points[2]
elseif points[2] == points[3] then
return (1 - (1 - value) ^ 2) * (points[2] - points[1]) + points[1]
end
break
end
____cond590 = ____cond590 or ____switch590 == 4
if ____cond590 then
if points[1] == points[2] then
if points[1] == points[3] then
if points[1] == points[4] then
return points[1]
else
return value ^ 3 * (points[4] - points[1]) + points[1]
end
elseif points[3] == points[4] then
return value ^ 2 * (3 - value * 2) * (points[4] - points[1]) + points[1]
end
elseif points[2] == points[3] then
if points[1] == points[4] then
return (value * (value - 1) * 3 + 1) * (points[1] - points[2]) + points[2]
elseif points[2] == points[4] then
return (1 - (1 - value) ^ 3) * (points[2] - points[1]) + points[1]
end
end
break
end
until true
local total = #points - 1
while total ~= 0 do
local index = 0
while index ~= total do
points[index + 1] = points[index + 1] * (1 - value) + points[index + 1 + 1] * value
index = index + 1
end
total = total - 1
end
return points[1]
end,
cardinal = function(self, angle)
local trueAngle = angle % 360
if trueAngle < -315 or trueAngle > 315 then
return "right"
end
if trueAngle <= -225 then
return "down"
end
if trueAngle < -135 then
return "left"
end
if trueAngle <= -45 then
return "up"
end
if trueAngle < 45 then
return "right"
end
if trueAngle <= 135 then
return "down"
end
if trueAngle < 225 then
return "left"
end
return "up"
end,
clamp = function(self, value, min, max)
return value < min and min or (value > max and max or value)
end,
cos = function(self, value)
return math.cos(value * (math.pi / 180))
end,
decode = function(self, value)
return json.decode(value)
end,
encode = function(self, value)
return json.encode(value)
end,
hex2rgb = function(self, value)
return {
red = math.floor(value / 65536) % 256,
green = math.floor(value / 256) % 256,
blue = math.floor(value) % 256
}
end,
linear = function(self, value, ...)
local points = {...}
if #points == 0 then
return value
elseif #points == 1 then
return points[1]
elseif value <= 0 then
return ____exports.ST:remap(value, points[1], points[2])
elseif 1 <= value then
return ____exports.ST:remap(value, points[#points - 2 + 1], points[#points])
else
local supervalue = value * (#points - 1)
local index = math.floor(supervalue)
return ____exports.ST:remap(supervalue % 1, points[index + 1], points[index + 1 + 1])
end
end,
pause = function(self, duration)
local time = 0
return ____exports.ST:when(function()
time = time + 1
return time == duration
end)
end,
populate = function(self, size, provider)
local index = 0
local array = {}
while index ~= size do
local ____provider_200 = provider
local ____index_199 = index
index = ____index_199 + 1
array[#array + 1] = ____provider_200(____index_199)
end
return array
end,
ray = function(self, angle, distance)
return {
x = distance * ____exports.ST:sin(angle + 90),
y = -distance * ____exports.ST:cos(angle + 90)
}
end,
remap = function(self, value, min2, max2, min1, max1)
if min1 == nil then
min1 = 0
end
if max1 == nil then
max1 = 1
end
return (value - min1) * (max2 - min2) / (max1 - min1) + min2
end,
remap_clamped = function(self, value, min2, max2, min1, max1)
if min1 == nil then
min1 = 0
end
if max1 == nil then
max1 = 1
end
return ____exports.ST:clamp((value - min1) * (max2 - min2) / (max1 - min1) + min2, min2, max2)
end,
rgb2hex = function(self, red, green, blue)
return red * 65536 + green * 256 + blue
end,
sin = function(self, value)
return math.sin(value * (math.pi / 180))
end,
spread = function(self, size, index, total)
if total <= 1 then
return 0
else
local base = (total - 1) / 2
return (index - base) / base * size
end
end,
spread_quantize = function(self, size, index, total)
return ____exports.ST:spread(size, index % total + 0.5, total + 1)
end,
stack = function(self, radix, values)
local total = 0
for ____, ____value in __TS__Iterator(__TS__ArrayEntries(values)) do
local index = ____value[1]
local value = ____value[2]
total = total + value * radix ^ (#values - index - 1)
end
return total
end,
task = function(self)
local task
local complete
local promise = __TS__New(
__TS__Promise,
function(____, resolve)
complete = function(value)
task.active = false
resolve(nil, value)
end
end
)
task = __TS__ObjectAssign(promise, {active = true, complete = complete})
return task
end,
unstack = function(self, radix, value, place)
return math.floor(value / radix ^ place) % radix
end,
view = function(self, screen, inputs, script)
return __TS__AsyncAwaiter(function(____awaiter_resolve)
____exports.ST.screen = screen
____exports.ST.inputs = __TS__ObjectValues(inputs)
local cleanup = __TS__Await(script(screen, inputs))
____exports.ST.scripts = {}
____exports.ST.inputs = {}
____exports.ST.screen = nil
screen:cleanup()
if #____exports.ST.instances ~= 0 then
__TS__ArrayPushArray(____exports.ST.empty_array, ____exports.ST.instances)
for ____, instance in ipairs(__TS__ArraySplice(____exports.ST.empty_array, 0)) do
instance:stop()
end
end
cleanup()
end)
end,
wave = function(self, value)
return ____exports.ST:sin(math.floor(((value + 0.5) * 2 - 1) * 180 + 0.5)) / 2 + 0.5
end,
weigh = function(self, weights, modifier)
local total = 0
for ____, entry in ipairs(weights) do
total = total + entry[2]
end
local value = modifier * total
for ____, entry in ipairs(weights) do
total = total - entry[2]
if value > total then
return entry[1]
end
end
end,
when = function(self, condition)
return __TS__New(
__TS__Promise,
function(____, resolve)
local ____self_scripts_201 = self.scripts
____self_scripts_201[#____self_scripts_201 + 1] = function()
if condition() then
resolve(nil)
return true
else
return false
end
end
end
)
end
}
love.run = function()
collectgarbage("stop")
love.audio.setEffect(____exports.ST.distance.name_a, ____exports.ST.distance.properties_a)
love.audio.setEffect(____exports.ST.distance.name_b, ____exports.ST.distance.properties_b)
love.graphics.setBlendMode("alpha", "alphamultiply")
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setDefaultFilter("nearest", "nearest", 1)
love.graphics.setLineStyle("rough")
love.timer.step()
return function()
local result = events()
local ____temp_204 = result ~= nil
if ____temp_204 then
local ____opt_202 = ____exports.ST.acquit
____temp_204 = (____opt_202 and ____opt_202(result)) ~= true
end
if ____temp_204 then
while #____exports.ST.disk.files ~= 0 do
for ____, file in ipairs(__TS__ArraySplice(____exports.ST.disk.files, 0)) do
____exports.ST.disk.channel:push(file)
end
if not ____exports.ST.disk.thread:isRunning() then
____exports.ST.disk.thread:start()
end
____exports.ST.disk.thread:wait()
end
return result
end
for ____, superscript in ipairs(____exports.ST.superscripts) do
superscript()
end
if #____exports.ST.instances ~= 0 then
local index = #____exports.ST.instances
while true do
local ____index_205 = index
index = ____index_205 - 1
if not (____index_205 ~= 0) then
break
end
____exports.ST.instances[index + 1]:update()
end
end
for ____, input in ipairs(____exports.ST.inputs) do
input:update()
end
local ____exports_ST_206, ____delta_207 = ____exports.ST, "delta"
local ____exports_ST_delta_208 = ____exports_ST_206[____delta_207] + math.min(
love.timer.step() * ____exports.ST.fps * ____exports.ST.speed,
1
)
____exports_ST_206[____delta_207] = ____exports_ST_delta_208
if 1 <= ____exports_ST_delta_208 then
local ____exports_ST_209, ____delta_210 = ____exports.ST, "delta"
____exports_ST_209[____delta_210] = ____exports_ST_209[____delta_210] - 1
local ____exports_ST_211, ____time_212 = ____exports.ST, "time"
____exports_ST_211[____time_212] = ____exports_ST_211[____time_212] + 1
for ____, input in ipairs(____exports.ST.inputs) do
input:fire()
end
if #____exports.ST.scripts ~= 0 then
__TS__ArrayPushArray(____exports.ST.empty_array, ____exports.ST.scripts)
for ____, script in ipairs(__TS__ArraySplice(____exports.ST.empty_array, 0)) do
if script() then
__TS__ArraySplice(
____exports.ST.scripts,
__TS__ArrayIndexOf(____exports.ST.scripts, script),
1
)
end
end
end
local width = ____exports.ST.width * ____exports.ST.scale
local height = ____exports.ST.height * ____exports.ST.scale
if ____exports.ST.canvas == nil or ____exports.ST.canvas:getWidth() ~= width or ____exports.ST.canvas:getHeight() ~= height then
local ____opt_213 = ____exports.ST.canvas
if ____opt_213 ~= nil then
____opt_213:release()
end
____exports.ST.canvas = love.graphics.newCanvas(width, height)
end
if ____exports.ST.screen == nil then
love.graphics.clear()
else
____exports.ST.screen:tick()
if ____exports.ST.debug then
____exports.ST.canvas_debug = love.graphics.newCanvas(width, height)
love.graphics.setCanvas(____exports.ST.canvas_debug)
love.graphics.clear()
end
love.graphics.setCanvas(____exports.ST.canvas)
love.graphics.clear()
love.graphics.push()
love.graphics.translate(width / 2, height / 2)
love.graphics.scale(____exports.ST.scale)
____exports.ST.screen:draw()
love.graphics.pop()
if ____exports.ST.debug then
love.graphics.draw(____exports.ST.canvas_debug)
____exports.ST.canvas_debug:release()
____exports.ST.canvas_debug = nil
end
love.graphics.setCanvas()
end
local win_width, win_height = love.window.getMode()
local x = 0
local y = 0
local scale
if width / height < win_width / win_height then
scale = win_height / height
x = (win_width - width * scale) / 2
else
scale = win_width / width
y = (win_height - height * scale) / 2
end
love.graphics.clear()
love.graphics.setBlendMode("alpha", "premultiplied")
love.graphics.draw(
____exports.ST.canvas,
x,
y,
0,
scale,
scale
)
love.graphics.setBlendMode("alpha", "alphamultiply")
love.graphics.present()
if #____exports.ST.disk.files ~= 0 then
for ____, file in ipairs(__TS__ArraySplice(____exports.ST.disk.files, 0)) do
____exports.ST.disk.channel:push(file)
end
if not ____exports.ST.disk.thread:isRunning() then
____exports.ST.disk.thread:start()
end
end
collectgarbage("collect")
end
love.timer.sleep(0.001)
end
end
return ____exports