Skip to content

Instantly share code, notes, and snippets.

@Achie72
Last active August 9, 2023 14:31
Show Gist options
  • Save Achie72/2c3e66ea8e085fc350598ae87e18c25b to your computer and use it in GitHub Desktop.
Save Achie72/2c3e66ea8e085fc350598ae87e18c25b to your computer and use it in GitHub Desktop.
Siege of Muldyr - Unit placement and combat logic
-- made for my Lowrezjam2023 entry - Siege of Muldyr!
-- you can read the corresponding devlog on:
-- kofi article: https://ko-fi.com/post/Siege-Devlog-1--Lowrezjam-2023-How-to-Start-Wh-I2I3O14RM
-- itch devlogs: https://itch.io/t/3057134/siege-devlog-series
function add_defender(unitType, place)
local unitHealth = {10,10,10,3}
local isTrapTable = {false, false, false, true}
local rangeTable = {3, 20, 20, 2}
local damageCooldownTable = {6, 2, 12, 10}
local damageTable = {2, 1, 3, 1}
local unit = {
unitType = unitType,
place = place,
hp = unitHealth[unitType+1],
isTrap = isTrapTable[unitType+1],
range = rangeTable[unitType+1],
damage = damageTable[unitType+1],
target = vacant,
damageCooldown = damageCooldownTable[unitType+1]
}
defenders[place] = unit
end
function add_enemy(unitType, side)
local unitHealth = {20,10,10,3}
local rangeTable = {3, 20, 20, 2}
local startPos = {0, 64}
local unit = {
unitType = unitType,
side = side,
x = startPos[side],
y = 53,
hp = unitHealth[unitType+1],
range = rangeTable[unitType+1],
damageCooldown = 0
}
add(enemies, unit)
end
-- inside update we
for enemy in all(enemies) do
-- move the nemy depending on
-- which side it is spawned in
local movement = {0.2,-0.2}
enemy.x += movement[enemy.side]
-- damage cooldown so you cannot hurt them
-- on each frame
if enemy.damageCooldown > 0 then
enemy.damageCooldown -= 1
end
-- they despawn and you lose a heart upon them
-- reaching the castle gate
if (enemy.x > 32) and (enemy.x < 33) then
del(enemies, enemy)
castleHealth -= 1
end
-- death on 0 or less hp
if enemy.hp <= 0 then
del(enemies, enemy)
end
end
for defender in all(defenders) do
-- if there is a defender on the place and not empty
if defender != vacant then
-- if it doesn't have a target
if defender.target == vacant then
-- find a target and exit
for enemy in all(enemies) do
if in_range(defender, enemy) then
defender.target = enemy
goto found_enemy
end
end
::found_enemy::
end
-- if it has a target
if defender.target != vacant then
-- check if it is still in range
if in_range(defender, defender.target) then
-- hit it if the cooldown allows
if (defender.target.damageCooldown <= 0) then
defender.target.hp -= defender.damage
defender.target.damageCooldown = defender.damageCooldown
-- add the floating damage number
add_float("-"..defender.damage, defender.target.x, defender.target.y-4, 0, -rnd(), 7, 10)
-- hande death here as well
if defender.target.hp <= 0 then
del(enemies, defender.target)
-- if dead set target to vacant
defender.target = vacant
end
end
else
-- if not in range set to empty to be able to search for new target
defender.target = vacant
end
end
end
end
function in_range(defender, enemy)
-- table to declare defender positions
local pos = {
{12,53}, {16, 53}, {26,53},
{39, 53}, {48, 53}, {52, 53},
{24, 39}, {41, 39}
}
defender.x = pos[defender.place][1]
defender.y = pos[defender.place][2]
-- simple inside check
if (enemy.x >= defender.x-defender.range) and (enemy.x <= defender.x+defender.range) and (enemy.y >= defender.y-defender.range) and (enemy.y <= defender.y+defender.range) then
return true
else
return false
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment