Last active
August 9, 2023 14:31
-
-
Save Achie72/2c3e66ea8e085fc350598ae87e18c25b to your computer and use it in GitHub Desktop.
Siege of Muldyr - Unit placement and combat logic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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