From 48491750e4ece19d2252592850b75d100afc2455 Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Wed, 29 Apr 2026 19:26:18 -0700 Subject: The refactor from HELL --- dyl.lua | 353 +++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 193 insertions(+), 160 deletions(-) (limited to 'dyl.lua') diff --git a/dyl.lua b/dyl.lua index bd024ef..1517438 100644 --- a/dyl.lua +++ b/dyl.lua @@ -1,18 +1,13 @@ -_slashing_timer_sec = 0.12 -function spawn_slashing_particle(e) - slash_animation = entity() - _slash_animation_distance = 3 - function slash_animation:transition_state() - -- TODO: Find a better place to put this lol. This has nothing to do with state - -- transitions - slash_animation:equipped_from(e, _slash_animation_distance) - end - return slash_animation:b_type(Entities.Particle) - :b_line_of_sight(e.line_of_sight) - :b_position(vec2(e.position)) - :b_sprite_position(vec2(position)) +_slashing_timer_sec = .12 +_slash_animation_distance = 3 +function slashing_particle(following) + SlashingParticleBuilder = EntityBuilder:new(World) + :b_type(Entities.Particle) :b_render_order(-1) :b_live_for(_slashing_timer_sec) + :b_position(vec2(following.position)) + :b_sprite_position(vec2(following.sprite_position)) + :b_line_of_sight(vec2(following.line_of_sight)) :b_add_state( States.Active, { animation = { @@ -24,161 +19,200 @@ function spawn_slashing_particle(e) } ) :b_state(States.Active) - :build() -end + function SlashingParticleBuilder:transition_state() + end -enemy = entity() -function enemy:transition_state() + return SlashingParticleBuilder:build() end -enemy:b_type(Entities.Enemy) - :b_health(100) - :b_position(vec2(30, 40)) - :b_sprite_position(vec2(30, 30)) - :b_line_of_sight(vec2(1, 0)) - :b_render_order(1) - :b_collidable() - :b_add_state( - States.Idle, { - animation = { - pos_y = { sequence = { 32, 33 }, dt = 1 }, - neg_y = { sequence = { 32, 33 }, dt = 1 }, - pos_x = { sequence = { 32, 33 }, dt = 1 }, - neg_x = { sequence = { 32, 33 }, dt = 1, reflect = vec2(true, false) } + +function enemy() + EnemyBuilder = EntityBuilder:new(World) + function EnemyBuilder:transition_state() + end + EnemyBuilder:b_type(Entities.Enemy) + :b_health(100) + :b_position(vec2(30, 40)) + :b_sprite_position(vec2(30, 40)) + :b_line_of_sight(vec2(1, 0)) + :b_render_order(1) + :b_collidable() + :b_add_state( + States.Idle, { + animation = { + pos_y = { sequence = { 32, 33 }, dt = 1 }, + neg_y = { sequence = { 32, 33 }, dt = 1 }, + pos_x = { sequence = { 32, 33 }, dt = 1 }, + neg_x = { sequence = { 32, 33 }, dt = 1, reflect = vec2(true, false) } + } } - } - ) - :b_add_state( - States.Walk, { - animation = { - pos_x = { sequence = { 32, 34 }, dt = 0.20 }, - neg_x = { sequence = { 32, 34 }, dt = 0.20, reflect = vec2(true, false) }, - pos_y = { sequence = { 32, 34 }, dt = 0.20 }, - neg_y = { sequence = { 32, 34 }, dt = 0.20 } + ) + :b_add_state( + States.Walk, { + animation = { + pos_x = { sequence = { 32, 34 }, dt = 0.20 }, + neg_x = { sequence = { 32, 34 }, dt = 0.20, reflect = vec2(true, false) }, + pos_y = { sequence = { 32, 34 }, dt = 0.20 }, + neg_y = { sequence = { 32, 34 }, dt = 0.20 } + } } - } - ) - :b_state(States.Walk) - :b_equipped({ sword }) - :build() - + ) + :b_state(States.Walk) + return EnemyBuilder:build() +end -bow = entity() -function bow:transition_state() +function wife() + WifeBuilder = EntityBuilder:new(World) + function WifeBuilder:transition_state() + end + WifeBuilder:b_type(Entities.Wife) + :b_line_of_sight(vec2(1, 0)) + :b_render_order(2) + :b_collidable() + :b_position(vec2(50, 50)) + :b_sprite_position(vec2(30, 30)) + :b_add_state( + States.Idle, { + animation = { + pos_y = { sequence = { 16, 17 }, dt = 1 }, + neg_y = { sequence = { 16, 17 }, dt = 1 }, + pos_x = { sequence = { 16, 17 }, dt = 1 }, + neg_x = { sequence = { 16, 17 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_state(States.Idle) + return WifeBuilder:build() end -bow:b_type(Entities.Bow) - :b_position(vec2(0, 0)) - :b_sprite_position(vec2(0, 0)) - :b_line_of_sight(vec2(1, 0)) - :b_render_order(1) - :b_collidable() - :b_add_state( - States.Equipped, { - animation = { - pos_y = { sequence = { 96 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 96 }, dt = 1 }, - pos_x = { sequence = { 80 }, dt = 1 }, - neg_x = { sequence = { 80 }, dt = 1, reflect = vec2(true, false) } + +function bow() + BowBuilder = EntityBuilder:new(World) + function BowBuilder:transition_state() + end + BowBuilder:b_type(Entities.Bow) + :b_position(vec2(0, 0)) + :b_sprite_position(vec2(0, 0)) + :b_line_of_sight(vec2(1, 0)) + :b_render_order(1) + :b_collidable() + :b_add_state( + States.Equipped, { + animation = { + pos_y = { sequence = { 96 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 96 }, dt = 1 }, + pos_x = { sequence = { 80 }, dt = 1 }, + neg_x = { sequence = { 80 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Drawn, { + animation = { + pos_y = { sequence = { 81 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 81 }, dt = 1 }, + pos_x = { sequence = { 81 }, dt = 1 }, + neg_x = { sequence = { 81 }, dt = 1, reflect = vec2(true, false) } + } } - } - ) - :b_add_state( - States.Drawn, { - animation = { - pos_y = { sequence = { 81 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 81 }, dt = 1 }, - pos_x = { sequence = { 81 }, dt = 1 }, - neg_x = { sequence = { 81 }, dt = 1, reflect = vec2(true, false) } + ) + :b_add_state( + States.Drawing, { + animation = BowBuilder.states[States.Equipped] } - } - ) - :b_add_state( - States.Drawing, { - animation = bow.states[States.Equipped] - } - ) - :b_state(States.Equipped) - :build() - -sword = entity() -_attack_burst_sec = 0.200 -_sword_damage = { amount = 2, knockback = { magnitude = 200, time = 0.080 } } -function sword:transition_state() - if button_just_pressed(5) and self.state == States.Equipped and self.state_stopwatch > _attack_burst_sec then - self:transition_to(States.Slashing) - spawn_slashing_particle(self) - self.damage = _sword_damage - elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_sec then - self.damage = nil - self:transition_to(States.Equipped) - end + ) + :b_state(States.Equipped) + return BowBuilder:build() end -sword:b_type(Entities.Sword) - :b_line_of_sight(vec2(1, 0)) - :b_position(vec2(0, 0)) - :b_sprite_position(vec2(0, 0)) - :b_render_order(0) - :b_collidable() - :b_add_state( - States.Equipped, { - animation = { - pos_y = { sequence = { 99 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 99 }, dt = 1, reflect = vec2(true, false) }, - pos_x = { sequence = { 98 }, dt = 1 }, - neg_x = { sequence = { 98 }, dt = 1, reflect = vec2(true, false) } + +function sword() + _attack_burst_sec = 0.200 + _sword_damage = { amount = 2, knockback = { magnitude = 200, time = 0.080 } } + SwordBuilder = EntityBuilder:new(World) + function SwordBuilder:transition_state() + if button_just_pressed(5) and self.state == States.Equipped and self.state_stopwatch > _attack_burst_sec then + self:transition_to(States.Slashing) + self:equip(slashing_particle(self)) + self.damage = _sword_damage + elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_sec then + self.damage = nil + self:transition_to(States.Equipped) + end + end + SwordBuilder:b_type(Entities.Sword) + :b_line_of_sight(vec2(1, 0)) + :b_position(vec2(0, 0)) + :b_sprite_position(vec2(0, 0)) + :b_render_order(0) + :b_collidable() + :b_add_state( + States.Equipped, { + animation = { + pos_y = { sequence = { 99 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 99 }, dt = 1, reflect = vec2(true, false) }, + pos_x = { sequence = { 98 }, dt = 1 }, + neg_x = { sequence = { 98 }, dt = 1, reflect = vec2(true, false) } + } } - } - ) - :b_add_state( - States.Slashing, { - animation = { - pos_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, true) }, - neg_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) }, - pos_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, false)}, - neg_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) } + ) + :b_add_state( + States.Slashing, { + animation = { + pos_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, true) }, + neg_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) }, + pos_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, false)}, + neg_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) } + } } - } - ) - :b_state(States.Equipped) - :build() - -player = entity() -function player:transition_state() - if (self.velocity.x == 0 and self.velocity.y == 0) then - self:transition_to(States.Idle) - else - self:transition_to(States.Walk) - end + ) + :b_state(States.Equipped) + return SwordBuilder:build() end -player - :b_type(Entities.Player) - :b_line_of_sight(vec2(1, 0)) - :b_render_order(2) - :b_collidable() - :b_position(vec2(30, 30)) - :b_sprite_position(vec2(30, 30)) - :b_add_state( - States.Idle, { - animation = { - pos_y = { sequence = { 3, 19 }, dt = 1 }, - neg_y = { sequence = { 6, 22 }, dt = 1 }, - pos_x = { sequence = { 0, 1 }, dt = 1 }, - neg_x = { sequence = { 0, 1 }, dt = 1, reflect = vec2(true, false) } + +_enemy = enemy() +_sword = sword() +_wife = wife() +_bow = bow() + +function player() + PlayerBuilder = EntityBuilder:new(World) + function PlayerBuilder:transition_state() + if (self.velocity.x == 0 and self.velocity.y == 0) then + self:transition_to(States.Idle) + else + self:transition_to(States.Walk) + end + end + PlayerBuilder + :b_type(Entities.Player) + :b_line_of_sight(vec2(1, 0)) + :b_render_order(2) + :b_collidable() + :b_position(vec2(30, 30)) + :b_sprite_position(vec2(30, 30)) + :b_add_state( + States.Idle, { + animation = { + pos_y = { sequence = { 3, 19 }, dt = 1 }, + neg_y = { sequence = { 6, 22 }, dt = 1 }, + pos_x = { sequence = { 0, 1 }, dt = 1 }, + neg_x = { sequence = { 0, 1 }, dt = 1, reflect = vec2(true, false) } + } } - } - ) - :b_add_state( - States.Walk, { - animation = { - pos_x = { sequence = { 2, 0 }, dt = 0.20 }, - neg_x = { sequence = { 2, 0 }, dt = 0.20, reflect = vec2(true, false) }, - pos_y = { sequence = { 4, 5 }, dt = 0.20 }, - neg_y = { sequence = { 7, 8 }, dt = 0.20 } + ) + :b_add_state( + States.Walk, { + animation = { + pos_x = { sequence = { 2, 0 }, dt = 0.20 }, + neg_x = { sequence = { 2, 0 }, dt = 0.20, reflect = vec2(true, false) }, + pos_y = { sequence = { 4, 5 }, dt = 0.20 }, + neg_y = { sequence = { 7, 8 }, dt = 0.20 } + } } - } - ) - :b_state(States.Idle) - :b_equipped({ sword }) - :build() + ) + :b_state(States.Idle) + return PlayerBuilder:build() +end +_player = player() +_player:equip(_sword) _walk_speed = 35 -- powerup increase? function handle_input() @@ -188,7 +222,7 @@ function handle_input() if btn(3) then dpos.y += 1 end if btn(2) then dpos.y -= 1 end - player.velocity = dpos:normal() * _walk_speed + _player.velocity = dpos:normal() * _walk_speed end function _init() @@ -206,8 +240,7 @@ function _update() foreach(update_hooks, function(f) f(step_dt) end) handle_input() - World.foreach(function(e) if (not e.equipped) then e:update(step_dt) end end) - World.foreach(function(e) if (e.equipped) then e:update(step_dt) end end) + World.foreach(function(e) e:update(step_dt) end) run_collisions() @@ -215,8 +248,8 @@ function _update() end function _draw() - qsort(World, function(a, b) return b.render_order < a.render_order end) - World.foreach(function(e) - e:render() + World.sort(function(a, b) + return b.render_order < a.render_order end) + World.foreach(function(e) e:render() end) end \ No newline at end of file -- cgit v1.3