feat: tidier card display
This commit is contained in:
+112
-72
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user