local ____lualib = require("lualib_bundle") local __TS__New = ____lualib.__TS__New local __TS__AsyncAwaiter = ____lualib.__TS__AsyncAwaiter local __TS__Await = ____lualib.__TS__Await local ____exports = {} local ____storyteller = require("code.engine.storyteller") local ST = ____storyteller.ST local STAnimation = ____storyteller.STAnimation local STContainer = ____storyteller.STContainer local STHitbox = ____storyteller.STHitbox local STObject = ____storyteller.STObject local STSprite = ____storyteller.STSprite local STText = ____storyteller.STText local ____utils = require("code.engine.utils") local ezchar = ____utils.ezchar local ____global = require("code.global") local accessor = ____global.accessor local function player(assets, batch, game) local metadata = { floof = accessor.floof, floof_update = false, last_x = 0, last_y = 0, moved = false, test = false, walk = false } local player = ezchar({ metadata = metadata, position = {x = accessor.location_pos_x, y = accessor.location_pos_y}, stances = {down = assets["ic$player$down"], left = assets["ic$player$left"], right = assets["ic$player$right"], up = assets["ic$player$up"]}, stance = accessor.location_stance, color = 10652124 }):addTicker(function(self) self.priority = self.position.y end):addDrawer(function(self) if metadata.floof then if not metadata.floof_update then metadata.floof_update = true self.stances.down = assets["ic$player$down_plush"] self.stances.left = assets["ic$player$left_plush"] self.stances.right = assets["ic$player$right_plush"] self.stances.up = assets["ic$player$up_plush"] self.stance = self.stance end elseif metadata.floof_update then metadata.floof_update = false self.stances.down = assets["ic$player$down"] self.stances.left = assets["ic$player$left"] self.stances.right = assets["ic$player$right"] self.stances.up = assets["ic$player$up"] self.stance = self.stance end end) local player_hitbox = __TS__New(STHitbox, {anchor = {x = 0.5, y = 1}, size = {x = 17, y = 3}}) local player_interactor = __TS__New(STHitbox) local player_walkbox = __TS__New(STHitbox, {anchor = {x = 0.5, y = 1}, size = {x = 9, y = 3}}) local player_walkeractor = __TS__New(STHitbox, {anchor = {x = 0.5, y = 1}, size = {x = 7, y = 2}}) player:attach(player_hitbox, player_interactor, player_walkbox, player_walkeractor) return { player = player, player_hitbox = player_hitbox, player_interact = function(test, interactables) if interactables == nil then interactables = {} end player_interactor:calculate() table.sort( interactables, function(a, b) return a.priority < b.priority end ) for ____, interactable in ipairs(interactables) do if player_interactor:test(interactable) then interactable.metadata:script(test) if test and player.metadata.test then break end end end end, player_interactor = player_interactor, player_menu = __TS__New( STAnimation, { metadata = false, alpha = 0, anchor = {x = 0.5, y = 1}, scale = 0, children = {__TS__New(STContainer)}, priority = 10000, frames = assets["im$ov_bubble"], color = 10652124 } ):addTicker(function(self) local s local x = player.position.x local y = player.position.y local px = player.parent.position.x + x local py = player.parent.position.y + y if px < -95 and py < -58 then s = 6 self.anchor.x = 0 self.anchor.y = 0 self.position.x = x + 7 self.position.y = y self.children[1].position.x = 28 self.children[1].position.y = 7.5 elseif px < -95 and py > 86 then s = 4 self.anchor.x = 0 self.anchor.y = 1 self.position.x = x + 7 self.position.y = y - 28 self.children[1].position.x = 28 self.children[1].position.y = -34.5 elseif px > 95 and py < -58 then s = 5 self.anchor.x = 1 self.anchor.y = 0 self.position.x = x - 7 self.position.y = y self.children[1].position.x = -27 self.children[1].position.y = 7.5 elseif px > 95 and py > 86 then s = 7 self.anchor.x = 1 self.anchor.y = 1 self.position.x = x - 7 self.position.y = y - 28 self.children[1].position.x = -27 self.children[1].position.y = -34.5 elseif px < -95 then s = 2 self.anchor.x = 0 self.anchor.y = 0.5 self.position.x = x + 7 self.position.y = y - 14 self.children[1].position.x = 28 self.children[1].position.y = -13.5 elseif px > 95 then s = 3 self.anchor.x = 1 self.anchor.y = 0.5 self.position.x = x - 7 self.position.y = y - 14 self.children[1].position.x = -27 self.children[1].position.y = -13.5 elseif py < -21 then s = 1 self.anchor.x = 0.5 self.anchor.y = 0 self.position.x = x self.position.y = y self.children[1].position.x = 0.5 self.children[1].position.y = 7.5 else s = 0 self.anchor.x = 0.5 self.anchor.y = 1 self.position.x = x self.position.y = y - 28 self.children[1].position.x = 0.5 self.children[1].position.y = -34.5 end self.frame = s if self.metadata then local ____self_alpha_0, ____value_1 = self.alpha, "value" ____self_alpha_0[____value_1] = ____self_alpha_0[____value_1] + (1 - self.alpha.value) / 2 if s < 2 then self.scale.x = 1 local ____self_scale_2, ____y_3 = self.scale, "y" ____self_scale_2[____y_3] = ____self_scale_2[____y_3] + (1 - self.scale.y) / 2 elseif s < 4 then local ____self_scale_4, ____x_5 = self.scale, "x" ____self_scale_4[____x_5] = ____self_scale_4[____x_5] + (1 - self.scale.x) / 2 self.scale.y = 1 else local ____self_scale_6, ____x_7 = self.scale, "x" ____self_scale_6[____x_7] = ____self_scale_6[____x_7] + (1 - self.scale.x) / 2 local ____self_scale_8, ____y_9 = self.scale, "y" ____self_scale_8[____y_9] = ____self_scale_8[____y_9] + (1 - self.scale.y) / 2 end else local ____self_alpha_10, ____value_11 = self.alpha, "value" ____self_alpha_10[____value_11] = ____self_alpha_10[____value_11] - self.alpha.value / 2 if s < 2 then self.scale.x = 1 local ____self_scale_12, ____y_13 = self.scale, "y" ____self_scale_12[____y_13] = ____self_scale_12[____y_13] - self.scale.y / 2 elseif s < 4 then local ____self_scale_14, ____x_15 = self.scale, "x" ____self_scale_14[____x_15] = ____self_scale_14[____x_15] - self.scale.x / 2 self.scale.y = 1 else local ____self_scale_16, ____x_17 = self.scale, "x" ____self_scale_16[____x_17] = ____self_scale_16[____x_17] - self.scale.x / 2 local ____self_scale_18, ____y_19 = self.scale, "y" ____self_scale_18[____y_19] = ____self_scale_18[____y_19] - self.scale.y / 2 end end end), player_move = function(x, y, a, b, obstacles, walkstacles, walkables) if a == nil then a = false end if b == nil then b = false end if obstacles == nil then obstacles = {} end if walkstacles == nil then walkstacles = {} end if walkables == nil then walkables = {} end player:move(x, y) if x > 2 or x < -2 or y > 2 or y < -2 then player.duration = 3 elseif x > 1 or x < -1 or y > 1 or y < -1 then player.duration = 5 else player.duration = 6 end repeat local ____switch35 = player.stance local ____cond35 = ____switch35 == "down" if ____cond35 then player_interactor.anchor.x = 0.5 player_interactor.anchor.y = 0 player_interactor.size.x = 1 player_interactor.size.y = 10 break end ____cond35 = ____cond35 or ____switch35 == "left" if ____cond35 then player_interactor.anchor.x = 1 player_interactor.anchor.y = 1 player_interactor.size.x = 19 player_interactor.size.y = 1 break end ____cond35 = ____cond35 or ____switch35 == "right" if ____cond35 then player_interactor.anchor.x = 0 player_interactor.anchor.y = 1 player_interactor.size.x = 19 player_interactor.size.y = 1 break end ____cond35 = ____cond35 or ____switch35 == "up" if ____cond35 then player_interactor.anchor.x = 0.5 player_interactor.anchor.y = 1 player_interactor.size.x = 1 player_interactor.size.y = 10 + 3 break end until true if x == 0 and y == 0 then player.metadata.moved = false return end player.metadata.last_x = x player.metadata.last_y = y player.metadata.moved = true local obs = #obstacles local wls = #walkstacles if obs == 0 and wls == 0 then return end local ____player_position_20, ____y_21 = player.position, "y" ____player_position_20[____y_21] = ____player_position_20[____y_21] - y if x ~= 0 and obs ~= 0 then player_hitbox:calculate() for ____, obstacle in ipairs(obstacles) do while x ~= 0 and player_hitbox:test(obstacle) do local d = ST:clamp(x, -1, 1) x = x - d local ____player_position_22, ____x_23 = player.position, "x" ____player_position_22[____x_23] = ____player_position_22[____x_23] - d player_hitbox:calculate() end if x == 0 then break end end end if x ~= 0 and wls ~= 0 then player_walkbox:calculate() for ____, walkstacle in ipairs(walkstacles) do while x ~= 0 and player_walkbox:test(walkstacle) do local d = ST:clamp(x, -1, 1) x = x - d local ____player_position_24, ____x_25 = player.position, "x" ____player_position_24[____x_25] = ____player_position_24[____x_25] - d player_walkbox:calculate() end if x == 0 then break end end end local ____player_position_26, ____y_27 = player.position, "y" ____player_position_26[____y_27] = ____player_position_26[____y_27] + y if y ~= 0 and obs ~= 0 then player_hitbox:calculate() for ____, obstacle in ipairs(obstacles) do while y ~= 0 and player_hitbox:test(obstacle) do local d = ST:clamp(y, -1, 1) y = y - d local ____player_position_28, ____y_29 = player.position, "y" ____player_position_28[____y_29] = ____player_position_28[____y_29] - d player_hitbox:calculate() end if y == 0 then break end end end if y ~= 0 and wls ~= 0 then player_walkbox:calculate() for ____, walkstacle in ipairs(walkstacles) do while y ~= 0 and player_walkbox:test(walkstacle) do local d = ST:clamp(y, -1, 1) y = y - d local ____player_position_30, ____y_31 = player.position, "y" ____player_position_30[____y_31] = ____player_position_30[____y_31] - d player_walkbox:calculate() end if y == 0 then break end end end if a and x == 0 or b and y == 0 then local dance_x = a and x == 0 and (game.c_secondary and 3 or 2) or 0 local dance_y = b and y == 0 and (game.c_secondary and 3 or 2) or 0 local ____player_metadata_32, ____last_x_33 = player.metadata, "last_x" ____player_metadata_32[____last_x_33] = ____player_metadata_32[____last_x_33] + dance_x local ____player_metadata_34, ____last_y_35 = player.metadata, "last_y" ____player_metadata_34[____last_y_35] = ____player_metadata_34[____last_y_35] + dance_y player:move(dance_x, dance_y) elseif x == 0 and y == 0 then player.direction = 0 player.frame = 0 player.step = 0 end table.sort( walkables, function(a, b) return a.priority < b.priority end ) for ____, walkable in ipairs(walkables) do if player_hitbox:test(walkable) then walkable.metadata:script() end end return {x = x, y = y} end, player_step = function(speed, ...) if speed == nil then speed = 0 end local points = {...} return __TS__AsyncAwaiter(function(____awaiter_resolve) player.metadata.walk = true if speed > 2 then player.duration = 3 elseif speed > 1 then player.duration = 5 else player.duration = 6 end player.direction = 1 player.frame = 0 player.step = 0 __TS__Await(player.position:step( speed, unpack(points) )) player.direction = 0 player.frame = 0 player.step = 0 player.metadata.walk = false end) end, player_tooltip = __TS__New( STObject, { alpha = 0, priority = 9999, metadata = {content = "", interact = false, width = 0}, children = { __TS__New(STSprite, {anchor = {x = 1}, image = assets["im$tt_side"], position = {y = -90}}), __TS__New(STSprite, {anchor = {x = 0.5}, image = assets["im$tt_edge"], position = {y = -90}}), __TS__New(STSprite, {anchor = {x = 1}, scale = {x = -1}, image = assets["im$tt_side"], position = {y = -90}}), __TS__New(STText, { font = assets["f$helloplayer"], priority = 1, justify = 0.5, anchor = {x = 0.5}, position = {y = -87.5} }) } } ):addTicker(function(self) local spr1, spr2, spr3, txt = unpack(self.children) local ideal if self.metadata.content == txt.content then ideal = self.metadata.width else txt.content = self.metadata.content ideal = assets["f$helloplayer"]:compute(self.metadata.content).x + 10 self.metadata.width = ideal end if player.metadata.test then if self.alpha.value ~= 0.7 then local ____self_alpha_36, ____value_37 = self.alpha, "value" local ____self_alpha_value_38 = ____self_alpha_36[____value_37] + 0.7 / 4 ____self_alpha_36[____value_37] = ____self_alpha_value_38 if 0.7 < ____self_alpha_value_38 then self.alpha.value = 0.7 end end elseif self.alpha.value ~= 0 then local ____self_alpha_39, ____value_40 = self.alpha, "value" local ____self_alpha_value_41 = ____self_alpha_39[____value_40] - 1 / 4 ____self_alpha_39[____value_40] = ____self_alpha_value_41 if ____self_alpha_value_41 < 0 then self.alpha.value = 0 self:isolate() end end local width = self.alpha.value == 0.7 and (spr2.scale.x + ideal * 2) / 3 or ideal self.position.y = ST:bezier(self.alpha.value / 0.7, -15, 0, 0) spr1.position.x = width / -2 spr2.scale.x = width spr3.position.x = width / 2 if self.metadata.interact then txt.color.red = 162 txt.color.green = 137 txt.color.blue = 220 else txt.color.red = 255 txt.color.green = 255 txt.color.blue = 255 end end):addDrawer(batch.drawer), player_walk = function(speed, ...) if speed == nil then speed = 0 end local points = {...} return __TS__AsyncAwaiter(function(____awaiter_resolve) player.metadata.walk = true if speed > 2 then player.duration = 3 elseif speed > 1 then player.duration = 5 else player.duration = 6 end __TS__Await(player:walk( speed, unpack(points) )) player.metadata.walk = false end) end, player_walkbox = player_walkbox, player_walkeract = function(test, walkeractables) if walkeractables == nil then walkeractables = {} end player_walkeractor:calculate() table.sort( walkeractables, function(a, b) return a.priority < b.priority end ) for ____, walkeractable in ipairs(walkeractables) do if player_walkeractor:test(walkeractable) then walkeractable.metadata:script(test) if test and player.metadata.test then break end end end end, player_walkeractor = player_walkeractor } end ____exports.default = player return ____exports