All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
116 lines
3.7 KiB
Lua
116 lines
3.7 KiB
Lua
--- @section PlayerNameWindow
|
|
|
|
local _frame = 0
|
|
local _on_confirm = nil
|
|
local MAX_LEN = 3
|
|
local BOX_W = 24
|
|
local BOX_H = 24
|
|
local BOX_GAP = 12
|
|
local BOX_Y = 50
|
|
local WARN_Y = 104
|
|
|
|
local function box_start_x()
|
|
return math.floor((Config.screen.width - (MAX_LEN * BOX_W + (MAX_LEN - 1) * BOX_GAP)) / 2)
|
|
end
|
|
|
|
local function box_x(i)
|
|
return box_start_x() + (i - 1) * (BOX_W + BOX_GAP)
|
|
end
|
|
|
|
--- Initialises the player name window.
|
|
--- @within PlayerNameWindow
|
|
--- @param on_confirm function Called with the entered name when the player saves.
|
|
function PlayerNameWindow.init(on_confirm)
|
|
_frame = 0
|
|
_on_confirm = on_confirm
|
|
TextInput.init(MAX_LEN)
|
|
end
|
|
|
|
local function draw_boxes()
|
|
local cursor = TextInput.get_position()
|
|
local blink = math.floor(_frame / 18) % 2 == 0
|
|
|
|
for i = 1, MAX_LEN do
|
|
local x = box_x(i)
|
|
local is_cur = (i == cursor)
|
|
local done = TextInput.is_done()
|
|
|
|
local fill = (is_cur and not done) and Config.colors.blue or Config.colors.black
|
|
local border = (is_cur and not done) and Config.colors.white
|
|
or done and Config.colors.light_blue
|
|
or Config.colors.dark_grey
|
|
|
|
rect (x, BOX_Y, BOX_W, BOX_H, fill)
|
|
rectb(x, BOX_Y, BOX_W, BOX_H, border)
|
|
|
|
local show = not (is_cur and blink and not done)
|
|
if show then
|
|
local ch = TextInput.get_letter(i)
|
|
local cw = print(ch, 0, -100, 0, false, 2)
|
|
local cx = x + math.floor((BOX_W - cw) / 2)
|
|
local cy = BOX_Y + math.floor((BOX_H - 11) / 2)
|
|
local col = (is_cur and not done) and Config.colors.white or Config.colors.light_grey
|
|
print(ch, cx, cy, col, false, 2)
|
|
end
|
|
end
|
|
|
|
-- caret arrow below active box
|
|
if not TextInput.is_done() then
|
|
local cx = box_x(cursor) + math.floor(BOX_W / 2)
|
|
local ay = BOX_Y + BOX_H + 4
|
|
line(cx - 4, ay, cx, ay + 4, Config.colors.white)
|
|
line(cx + 4, ay, cx, ay + 4, Config.colors.white)
|
|
end
|
|
end
|
|
|
|
--- Draws the player name window.
|
|
--- @within PlayerNameWindow
|
|
function PlayerNameWindow.draw()
|
|
cls(Config.colors.black)
|
|
|
|
Print.text_center("Player Name", Config.screen.width / 2, 14, Config.colors.white, false, 2)
|
|
|
|
draw_boxes()
|
|
|
|
if TextInput.is_done() then
|
|
Print.text_center("Z: save name B: edit", Config.screen.width / 2, BOX_Y + BOX_H + 12, Config.colors.light_blue)
|
|
else
|
|
Print.text_center("Up/Dn: letter Lft/Rgt: move Z: ok", Config.screen.width / 2, BOX_Y + BOX_H + 12, Config.colors.dark_grey)
|
|
end
|
|
|
|
-- Warning section
|
|
rect(0, WARN_Y, Config.screen.width, Config.screen.height - WARN_Y, Config.colors.blue)
|
|
rectb(0, WARN_Y, Config.screen.width, Config.screen.height - WARN_Y, Config.colors.light_blue)
|
|
Print.text_center("Remember your name!", Config.screen.width / 2, WARN_Y + 8, Config.colors.white)
|
|
Print.text_center("You will need it to load the game.", Config.screen.width / 2, WARN_Y + 20, Config.colors.light_grey)
|
|
end
|
|
|
|
--- Updates player name window logic.
|
|
--- @within PlayerNameWindow
|
|
function PlayerNameWindow.update()
|
|
_frame = _frame + 1
|
|
|
|
if TextInput.is_done() then
|
|
if Input.select() then
|
|
Context.player_name = TextInput.get_name()
|
|
if _on_confirm then _on_confirm() else Window.set_current("menu") end
|
|
elseif Input.back() then
|
|
TextInput.prev_position()
|
|
end
|
|
return
|
|
end
|
|
|
|
if Input.up_repeat() then TextInput.next_letter() end
|
|
if Input.down_repeat() then TextInput.prev_letter() end
|
|
if Input.right() then TextInput.next_position() end
|
|
if Input.select() then TextInput.select_letter() end
|
|
|
|
if Input.left() or Input.back() then
|
|
if TextInput.get_position() > 1 then
|
|
TextInput.prev_position()
|
|
else
|
|
Window.set_current("menu")
|
|
end
|
|
end
|
|
end
|