feat: tidier card display

This commit is contained in:
2025-10-08 21:25:27 +13:00
parent 0b1487c119
commit 02abd67f4e
+112 -72
View File
@@ -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
-- <PALETTE>
-- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
-- </PALETTE>
-- <TRACKS>
-- 000:100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- </TRACKS>
-- <PALETTE>
-- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
-- </PALETTE>