diff --git a/lucksmith.lua b/lucksmith.lua
index 8a1e0dc..af31c1f 100644
--- a/lucksmith.lua
+++ b/lucksmith.lua
@@ -10,14 +10,17 @@ player = {
energy = 0
}
enemies = {{
- hp = 8,
+ name = "Goblin",
+ hp = 2,
roll_mod = 0,
mult = 1
}, {
+ name = "Orc",
hp = 10,
roll_mod = 0,
mult = 1
}, {
+ name = "Troll",
hp = 12,
roll_mod = 0,
mult = 1
@@ -25,6 +28,7 @@ enemies = {{
level = 1
function get_enemy(level)
return {
+ name = enemies[level].name,
hp = enemies[level].hp,
max_hp = enemies[level].hp, -- store original max HP
roll_mod = enemies[level].roll_mod,
@@ -595,6 +599,84 @@ end
picked = 1
card_pick_selection = 1
+
+-- === DRAWING FUNCTIONS ===
+function draw_hud()
+ -- Draw level
+ spr(0, 110, 2, 0)
+ print(level, 115, 2, 7, false, 1, true)
+
+ -- Draw energy sprites
+ for i = 1, player.energy do
+ local x = -4 + (8 * i)
+ spr(17, x, 12, 0)
+ end
+
+ -- Draw deck info
+ spr(18, 220, 115, 0)
+ print(#draw_pile, 230, 116, 10, false, 1, true)
+ spr(19, 220, 125, 0)
+ print(#discard_pile, 230, 126, 14, false, 1, true)
+end
+
+function draw_health_bars()
+ -- Draw player health bar
+ for i = 1, 10 do
+ local x = 4 + (i - 1) * 8
+ if i <= player.hp then
+ spr(1, x, 2, 0) -- healthy HP
+ else
+ spr(3, x, 2, 0) -- damaged HP
+ end
+ end
+
+ -- Show player damage
+ if current_damage.player ~= 0 then
+ print((current_damage.player < 0 and "+" or "") .. -math.floor(current_damage.player), 88, 3, current_damage.player > 0 and 2 or 6, false, 1, true)
+ end
+
+ -- Draw enemy health bar
+ for i = 1, enemy.max_hp do
+ local x = 240 - (enemy.max_hp * 8) + (i - 1) * 8
+ if i <= (enemy.max_hp - enemy.hp) then
+ spr(3, x, 2, 0) -- damaged HP on the left
+ else
+ spr(2, x, 2, 0) -- healthy HP on the right
+ end
+ end
+
+ -- Show enemy damage
+ if current_damage.enemy > 0 then
+ local enemy_bar_start = 240 - (enemy.max_hp * 8) - 20
+ print((current_damage.enemy < 0 and "+" or "") .. -math.floor(current_damage.enemy), enemy_bar_start, 3, current_damage.enemy > 0 and 2 or 6, false, 1, true)
+ end
+
+ -- Draw enemy name under health bar
+ local enemy_name_x = 240 - (enemy.max_hp * 8) + (enemy.max_hp * 4) - (#enemy.name * 3)
+ print(enemy.name, enemy_name_x, 12, 7, false, 1, true)
+
+ -- Show shield sprite if player has shield
+ if player.shield and player.shield > 0 then
+ spr(16, 20, 22, 0)
+ if player.shield > 1 then
+ print(player.shield, 228, 23, 12, false, 1, true)
+ end
+ end
+end
+
+function draw_card(card, x, is_selected, can_afford)
+ local border_color = can_afford and (is_selected and 1 or 12) or (is_selected and 10 or 9)
+ rectb(x, 40, 52, 64, border_color)
+ if is_selected then rect(x+1, 41, 50, 62, 14) end
+ local text_color = can_afford and (is_selected and 11 or 10) or (is_selected and 10 or 9)
+ print(card.name, x + 3, 70, text_color, false, 1, true)
+
+ -- Show energy cost/gain
+ local energy_text = card.energy >= 0 and ("+" .. card.energy) or tostring(card.energy)
+ spr(17, x + 30, 42, 0)
+ print(energy_text, x + 40, 44, card.energy >= 0 and 11 or 8, false, 1, true)
+end
+
-- === INPUT ===
function TIC()
cls(0)
@@ -624,54 +706,9 @@ function TIC()
end
end
- -- Draw HUD
- spr(0, 110, 2, 0)
- print(level, 115, 2, 7, false, 1, true)
- -- Draw energy sprites (right-aligned at y=4)
- for i = 1, player.energy do
- local x = -4 + (8 * i) -- right-aligned, each sprite 8 pixels wide
- spr(17, x, 12, 0)
- end
- spr(18, 220, 115, 0)
- print( #draw_pile, 230, 116, 10, false, 1, true)
- spr(19, 220, 125, 0)
- print(#discard_pile, 230, 126, 14, false, 1, true)
- -- Draw player health bar (sprite 1 for health, sprite 3 for damage)
- for i = 1, 10 do
- local x = 4 + (i - 1) * 8 -- 8 pixels apart
- if i <= player.hp then
- spr(1, x, 2, 0) -- healthy HP
- else
- spr(3, x, 2, 0) -- damaged HP
- end
- end
- -- Show damage next to player health bar if in result phase
- if current_damage.player ~= 0 then
- print( (current_damage.player < 0 and "+" or "") .. -current_damage.player, 88, 3, current_damage.player > 0 and 2 or 6, false, 1, true) -- small red text
- end
-
- -- Draw enemy health bar (sprite 2 for health, sprite 3 for damage) - right aligned at y=2
- for i = 1, enemy.max_hp do
- local x = 240 - (enemy.max_hp * 8) + (i - 1) * 8 -- right-aligned, 8 pixels apart
- if i <= (enemy.max_hp - enemy.hp) then
- spr(3, x, 2, 0) -- damaged HP on the left
- else
- spr(2, x, 2, 0) -- healthy HP on the right
- end
- end
- -- Show damage next to enemy health bar if in result phase
- if current_damage.enemy > 0 then
- local enemy_bar_start = 240 - (enemy.max_hp * 8) - 20 -- position to left of health bar
- print((current_damage.enemy < 0 and "+" or "") .. -current_damage.enemy, enemy_bar_start, 3, current_damage.enemy > 0 and 2 or 6, false, 1, true) -- small red text
- end
-
- -- Show shield sprite if player has shield
- if player.shield and player.shield > 0 then
- spr(16, 20, 22, 0) -- sprite 16 in top right corner
- if player.shield > 1 then
- print(player.shield, 228, 23, 12, false, 1, true) -- show shield count if > 1
- end
- end
+ -- Draw HUD and health bars
+ draw_hud()
+ draw_health_bars()
if phase == "choose" then
-- Card Picker
@@ -689,16 +726,7 @@ function TIC()
local x = 10 + (i - 1) * 64
local can_afford = (card.energy >= 0) or (player.energy >= -card.energy)
local is_selected = i == picked
- local border_color = can_afford and (is_selected and 1 or 12) or (is_selected and 10 or 9)
- rectb(x, 40, 52, 64, border_color)
- if is_selected then rect(x+1, 41, 50, 62, 14) end
- local text_color = can_afford and (is_selected and 11 or 10) or (is_selected and 10 or 9)
- print(card.name, x + 3, 70, text_color, false, 1, true)
-
- -- Show energy cost/gain
- local energy_text = card.energy >= 0 and ("+" .. card.energy) or tostring(card.energy)
- spr(17, x + 30, 42, 0)
- print(energy_text, x + 40, 44, card.energy >= 0 and 11 or 8, false, 1, true)
+ draw_card(card, x, is_selected, can_afford)
end
local selected_card = hand[picked]
@@ -730,14 +758,7 @@ function TIC()
local card = cards[card_index]
local x = 10 + (i - 1) * 64
local is_selected = i == card_pick_selection
- local border_color = is_selected and 11 or 12
- rectb(x, 60, 62, 40, border_color)
- local text_color = is_selected and 11 or 10
- print(card.name, x + 3, 70, text_color, false, 1, true)
-
- -- Show energy cost/gain
- local energy_text = card.energy >= 0 and ("+" .. card.energy) or tostring(card.energy)
- print(energy_text, x + 50, 62, card.energy >= 0 and 11 or 8, false, 1, true)
+ draw_card(card, x, is_selected, true) -- always affordable in reward phase
end
-- Show selected card description
@@ -782,11 +803,11 @@ function TIC()
end
card_text = "You played " .. current_card.name
- enemy_card_text = "Enemy played " .. enemy_card.name
+ enemy_card_text = enemy.name .. " played " .. enemy_card.name
print(card_text, 4, 40, 2)
print(enemy_card_text, 4, 50, 6)
-- show rolls
- roll_text = "You roll " .. player.display_roll .. " / Enemy rolls " .. enemy.display_roll
+ roll_text = "You roll " .. player.display_roll .. " / " .. enemy.name .. " rolls " .. enemy.display_roll
print(roll_text, 4, 60, 12)
elseif phase == "mod" then
@@ -860,7 +881,7 @@ function TIC()
end
shake = 10
end
- msgtxt = "Enemy wins!"
+ msgtxt = enemy.name .. " wins!"
else
msgtxt = "Tie!"
end
@@ -893,9 +914,21 @@ function TIC()
end
elseif phase == "game_over" then
if enemy.hp <= 0 and player.hp > 0 then
- print("You Win! Press Z to choose new card", 4, 60, 12)
+ local victory_text = "You defeated " .. enemy.name .. "!"
+ local victory_x = 120 - (#victory_text * 3) -- center text (6 pixel font, so 3 pixels per char from center)
+ print(victory_text, victory_x, 40, 6)
+
+ local continue_text = "Press Z to choose new card"
+ local continue_x = 120 - (#continue_text * 3)
+ print(continue_text, continue_x, 80, 9)
else
- print("You Lose! Press X to restart", 4, 60, 14)
+ local defeat_text = enemy.name .. " defeated you!"
+ local defeat_x = 120 - (#defeat_text * 3)
+ print(defeat_text, defeat_x, 40, 2)
+
+ local restart_text = "Press X to restart"
+ local restart_x = 120 - (#restart_text * 3)
+ print(restart_text, restart_x, 60, 14)
end
if btnp(4) and enemy.hp <= 0 and player.hp > 0 then
-- Victory - go to card selection
@@ -968,4 +1001,11 @@ end
--
-- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
--
+--
+-- 000:100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+--
+
+--
+-- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
+--