summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-04-26 16:52:37 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-04-26 16:52:37 -0700
commit42aeb43e2c8a959f5ea1f9a33cfe63d667321c56 (patch)
treecd33beaeddd05d6daedb7474820b85f10b62aac2
parentc8444758afa213ed89c9cf6d4793bd7812b0b734 (diff)
downloaddyl8-42aeb43e2c8a959f5ea1f9a33cfe63d667321c56.tar.gz
dyl8-42aeb43e2c8a959f5ea1f9a33cfe63d667321c56.zip
Very naive knockback
-rw-r--r--collisions.lua7
-rw-r--r--dyl.lua7
-rw-r--r--entity.lua45
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
diff --git a/dyl.lua b/dyl.lua
index e379ae3..bd024ef 100644
--- a/dyl.lua
+++ b/dyl.lua
@@ -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))
diff --git a/entity.lua b/entity.lua
index caa5226..5cb52d8 100644
--- a/entity.lua
+++ b/entity.lua
@@ -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