diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-04-26 16:52:37 -0700 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-04-26 16:52:37 -0700 |
| commit | 42aeb43e2c8a959f5ea1f9a33cfe63d667321c56 (patch) | |
| tree | cd33beaeddd05d6daedb7474820b85f10b62aac2 | |
| parent | c8444758afa213ed89c9cf6d4793bd7812b0b734 (diff) | |
| download | dyl8-42aeb43e2c8a959f5ea1f9a33cfe63d667321c56.tar.gz dyl8-42aeb43e2c8a959f5ea1f9a33cfe63d667321c56.zip | |
Very naive knockback
| -rw-r--r-- | collisions.lua | 7 | ||||
| -rw-r--r-- | dyl.lua | 7 | ||||
| -rw-r--r-- | entity.lua | 45 |
3 files changed, 53 insertions, 6 deletions
diff --git a/collisions.lua b/collisions.lua index 4b9c430..04575c4 100644 --- a/collisions.lua +++ b/collisions.lua @@ -9,8 +9,11 @@ function is_colliding(a, b) end function handle_collision(a, b) - if b.entity_type == Entities.Enemy then - print(b.id, b.id * 10, b.id * 10) + if a.damage and b.health then + if b:is_in_iframe() then + return + end + b:take_damage(a.line_of_sight, a.damage) end end @@ -31,6 +31,7 @@ enemy = entity() function enemy:transition_state() 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)) @@ -100,16 +101,18 @@ bow:b_type(Entities.Bow) 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 end -sword - :b_type(Entities.Sword) +sword:b_type(Entities.Sword) :b_line_of_sight(vec2(1, 0)) :b_position(vec2(0, 0)) :b_sprite_position(vec2(0, 0)) @@ -29,6 +29,14 @@ function Entity:b_state(name) self.state_stopwatch = 0 return self end +function Entity:b_health(health) + self.health = health + return self +end +function Entity:b_damage(damage_spec) + self.damage = damage_spec + return self +end function Entity:b_render_order(ord) self.render_order = ord return self @@ -69,6 +77,10 @@ function Entity:build() assert(self.state_stopwatch) end +function Entity:is_in_iframe() + return self.knockback ~= nil and self.knockback.time >= 0 +end + function Entity:transition_to(state_name) assert(self.states[state_name]) if self.state ~= state_name then @@ -99,6 +111,9 @@ function Entity:update(dt) if self.life_time ~= nil then self.life_time -= dt end + if self.life ~= nil and self.life <= 0 then + self:kill() + end end function Entity:update_line_of_sight() @@ -109,10 +124,11 @@ end -- prevent cobblestoning during non-manhattan movement by "lagging" the sprite -- behind the actual physical position +-- this part was painful. function Entity:update_sprite_position() if self.sprite_position == nil then return end - -- step in only x or y. trivial + -- step in only x or y. trivial. if self.velocity == nil or self.velocity.y == 0 or self.velocity.x == 0 then self.sprite_position.x = self.position.x self.sprite_position.y = self.position.y @@ -152,9 +168,34 @@ function Entity:update_sprite_position() return self end +function Entity:take_damage(direction, damage_spec) + if self.health == nil then + return + end + self.health -= damage_spec.amount + if damage_spec.knockback ~= nil then + self.knockback = { + velocity = direction * damage_spec.knockback.magnitude, + remaining_time = damage_spec.knockback.time, + time = damage_spec.knockback.time + } + end +end + function Entity:integrate(dt) self.state_stopwatch += dt - if (self.velocity != nil) then + + if self.knockback ~= nil then + if self.knockback.remaining_time <= 0 then + self.knockback = nil + self.velocity = vec2(0, 0) + else + self.velocity = self.knockback.velocity * (self.knockback.remaining_time / self.knockback.time) + self.knockback.remaining_time -= dt + end + end + + if self.velocity ~= nil then self.position = self.position + (self.velocity * dt) end end |
