This commit is contained in:
115
inc/window/window.player_name.lua
Normal file
115
inc/window/window.player_name.lua
Normal file
@@ -0,0 +1,115 @@
|
||||
--- @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
|
||||
Reference in New Issue
Block a user