feat(render): add ascii level and status panel
This commit is contained in:
1 parent
67fba37173
commit
6080324ec2
1 file changed
+67
@@ -0,0 +1,67 @@
|
||||
-- ASCII presentation of the current level and a status panel. Reads game state
|
||||
-- only; never mutates. Unexplored cells stay blank, explored-but-unseen cells
|
||||
-- show terrain, and only cells currently lit reveal actors and loot.
|
||||
|
||||
local Status = require("status")
|
||||
local Identify = require("identify")
|
||||
|
||||
local Render = {}
|
||||
|
||||
local function cell(game, x, y)
|
||||
local level = game.level
|
||||
local map = level.map
|
||||
local idx = map:index(x, y)
|
||||
if not level.explored[idx] then return " " end
|
||||
if game.visible[idx] then
|
||||
if game.player.x == x and game.player.y == y then return "@" end
|
||||
local monster = level:entityAt(x, y)
|
||||
if monster then return monster.glyph end
|
||||
local here = level:itemsAt(x, y)
|
||||
if #here > 0 then return here[1].item.glyph end
|
||||
end
|
||||
return map:get(x, y)
|
||||
end
|
||||
|
||||
local function statusTags(entity)
|
||||
local tags = {}
|
||||
for _, active in ipairs(entity.statuses) do
|
||||
tags[#tags + 1] = active.kind
|
||||
end
|
||||
if #tags == 0 then return "none" end
|
||||
return table.concat(tags, ",")
|
||||
end
|
||||
|
||||
function Render.panel(game)
|
||||
local player = game.player
|
||||
local level = game.level
|
||||
local weapon = player.weapon and Identify.label(game.identify, player.weapon) or "none"
|
||||
local armor = player.armor and Identify.label(game.identify, player.armor) or "none"
|
||||
local ring = player.ring and player.ring.name or "none"
|
||||
local torch = player.light.fuel > 0 and tostring(player.light.fuel) or "spent"
|
||||
local lines = {
|
||||
string.format("HP %d/%d ATK %d DEF %d depth %d turn %d %s%s",
|
||||
player.hp, player.maxHp, player:effectiveAttack(), player:effectiveDefense(),
|
||||
game.depth, game.turn, level.generator, level.dark and " dark" or ""),
|
||||
string.format("food %d torch %s status %s", player.satiation, torch, statusTags(player)),
|
||||
string.format("weapon %s armor %s ring %s items %d foes %d",
|
||||
weapon, armor, ring, #player.inventory, #level.entities),
|
||||
}
|
||||
local last = game.log:last()
|
||||
if last then lines[#lines + 1] = "- " .. last end
|
||||
return table.concat(lines, "\n")
|
||||
end
|
||||
|
||||
function Render.frame(game)
|
||||
local map = game.level.map
|
||||
local rows = {}
|
||||
for y = 1, map.height do
|
||||
local row = {}
|
||||
for x = 1, map.width do
|
||||
row[x] = cell(game, x, y)
|
||||
end
|
||||
rows[#rows + 1] = table.concat(row)
|
||||
end
|
||||
return table.concat(rows, "\n") .. "\n" .. Render.panel(game)
|
||||
end
|
||||
|
||||
return Render
|
||||
Reference in new issue
Block a user