From 02abd67f4eb0ff1aebde5fe37983d480ea49307c Mon Sep 17 00:00:00 2001 From: Nick Koirala Date: Wed, 8 Oct 2025 21:25:27 +1300 Subject: [PATCH] feat: tidier card display --- lucksmith.lua | 184 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 112 insertions(+), 72 deletions(-) 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 +--