[MASTER] 1.0-beta2 #47
@@ -10,7 +10,7 @@ function Print.text(text, x, y, color, fixed, scale)
|
|||||||
local shadow_color = Config.colors.black
|
local shadow_color = Config.colors.black
|
||||||
if color == shadow_color then shadow_color = Config.colors.light_grey end
|
if color == shadow_color then shadow_color = Config.colors.light_grey end
|
||||||
scale = scale or 1
|
scale = scale or 1
|
||||||
print(text, x + 1, y + 1, shadow_color, fixed, scale)
|
print(text, x + scale, y + scale, shadow_color, fixed, scale)
|
||||||
print(text, x, y, color, fixed, scale)
|
print(text, x, y, color, fixed, scale)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ end
|
|||||||
--- @param[opt] scale number The scaling factor.<br/>
|
--- @param[opt] scale number The scaling factor.<br/>
|
||||||
function Print.text_center(text, x, y, color, fixed, scale)
|
function Print.text_center(text, x, y, color, fixed, scale)
|
||||||
scale = scale or 1
|
scale = scale or 1
|
||||||
local text_width = print(text, 0, -6, 0, fixed, scale)
|
local text_width = print(text, 0, -6 * scale, 0, fixed, scale)
|
||||||
local centered_x = x - (text_width / 2)
|
local centered_x = x - (text_width / 2)
|
||||||
Print.text(text, centered_x, y, color, fixed, scale)
|
Print.text(text, centered_x, y, color, fixed, scale)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,19 +1,62 @@
|
|||||||
--- @section MenuWindow
|
--- @section MenuWindow
|
||||||
local _menu_items = {}
|
local _menu_items = {}
|
||||||
local _click_timer = 0
|
local _click_timer = 0
|
||||||
|
local _anim = 0
|
||||||
|
local _menu_max_w = 0
|
||||||
|
local ANIM_SPEED = 2.5
|
||||||
|
local HEADER_H = 28
|
||||||
|
|
||||||
|
--- Calculates the animated x position of the menu block.
|
||||||
|
--- @within MenuWindow
|
||||||
|
--- @return number x The left edge x coordinate for the menu.
|
||||||
|
function MenuWindow.calc_menu_x()
|
||||||
|
local center_start = Config.screen.width / 2
|
||||||
|
local center_end = Config.screen.width * 0.72
|
||||||
|
local center = center_start + _anim * (center_end - center_start)
|
||||||
|
return math.floor(center - _menu_max_w / 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Draws the header with title and separator.
|
||||||
|
--- @within MenuWindow
|
||||||
|
function MenuWindow.draw_header()
|
||||||
|
rect(0, 0, Config.screen.width, HEADER_H, Config.colors.dark_grey)
|
||||||
|
rect(0, HEADER_H - 2, Config.screen.width, 2, Config.colors.light_blue)
|
||||||
|
|
||||||
|
local cx = Config.screen.width / 2
|
||||||
|
local subtitle = "Definitely not an"
|
||||||
|
if Context.test_mode then subtitle = subtitle .. " [TEST]" end
|
||||||
|
local sub_w = print(subtitle, 0, -6, 0, false, 1, true)
|
||||||
|
print(subtitle, math.floor(cx - sub_w / 2) + 1, 5, Config.colors.dark_grey, false, 1, true)
|
||||||
|
print(subtitle, math.floor(cx - sub_w / 2), 4, Config.colors.light_grey, false, 1, true)
|
||||||
|
|
||||||
|
Print.text_center("IMPOSTOR", cx, 12, Config.colors.item, false, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Draws the 4x scaled Norman sprite on the left side of the screen.
|
||||||
|
--- @within MenuWindow
|
||||||
|
function MenuWindow.draw_norman()
|
||||||
|
local nx = math.floor(Config.screen.width * 0.45 / 2) - 32
|
||||||
|
local ny = HEADER_H + math.floor((Config.screen.height - HEADER_H - 96) / 2)
|
||||||
|
spr(272, nx, ny, 0, 4)
|
||||||
|
spr(273, nx + 32, ny, 0, 4)
|
||||||
|
spr(288, nx, ny + 32, 0, 4)
|
||||||
|
spr(289, nx + 32, ny + 32, 0, 4)
|
||||||
|
spr(304, nx, ny + 64, 0, 4)
|
||||||
|
spr(305, nx + 32, ny + 64, 0, 4)
|
||||||
|
end
|
||||||
|
|
||||||
--- Draws the menu window.
|
--- Draws the menu window.
|
||||||
--- @within MenuWindow
|
--- @within MenuWindow
|
||||||
function MenuWindow.draw()
|
function MenuWindow.draw()
|
||||||
local title = "Definitely not an Impostor"
|
MenuWindow.draw_header()
|
||||||
if Context.test_mode then
|
|
||||||
title = title .. " (TEST MODE)"
|
if _anim > 0 then
|
||||||
|
MenuWindow.draw_norman()
|
||||||
end
|
end
|
||||||
UI.draw_top_bar(title)
|
|
||||||
|
|
||||||
local menu_h = #_menu_items * 10
|
local menu_h = #_menu_items * 10
|
||||||
local y = 10 + (Config.screen.height - 10 - 10 - menu_h) / 2
|
local y = HEADER_H + math.floor((Config.screen.height - HEADER_H - 10 - menu_h) / 2)
|
||||||
UI.draw_menu(_menu_items, Context.current_menu_item, 0, y, true)
|
UI.draw_menu(_menu_items, Context.current_menu_item, MenuWindow.calc_menu_x(), y, false)
|
||||||
|
|
||||||
local ttg_text = "TTG"
|
local ttg_text = "TTG"
|
||||||
local ttg_w = print(ttg_text, 0, -10, 0, false, 1, false)
|
local ttg_w = print(ttg_text, 0, -10, 0, false, 1, false)
|
||||||
@@ -23,8 +66,12 @@ end
|
|||||||
--- Updates the menu window logic.
|
--- Updates the menu window logic.
|
||||||
--- @within MenuWindow
|
--- @within MenuWindow
|
||||||
function MenuWindow.update()
|
function MenuWindow.update()
|
||||||
|
if _anim < 1 then
|
||||||
|
_anim = math.min(1, _anim + ANIM_SPEED * Context.delta_time)
|
||||||
|
end
|
||||||
|
|
||||||
local menu_h = #_menu_items * 10
|
local menu_h = #_menu_items * 10
|
||||||
local y = 10 + (Config.screen.height - 10 - 10 - menu_h) / 2
|
local y = HEADER_H + math.floor((Config.screen.height - HEADER_H - 10 - menu_h) / 2)
|
||||||
|
|
||||||
if _click_timer > 0 then
|
if _click_timer > 0 then
|
||||||
_click_timer = _click_timer - Context.delta_time
|
_click_timer = _click_timer - Context.delta_time
|
||||||
@@ -38,7 +85,7 @@ function MenuWindow.update()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local new_item, mouse_confirmed = UI.update_menu(_menu_items, Context.current_menu_item, 0, y, true)
|
local new_item, mouse_confirmed = UI.update_menu(_menu_items, Context.current_menu_item, MenuWindow.calc_menu_x(), y, false)
|
||||||
Context.current_menu_item = new_item
|
Context.current_menu_item = new_item
|
||||||
|
|
||||||
if mouse_confirmed then
|
if mouse_confirmed then
|
||||||
@@ -104,7 +151,7 @@ function MenuWindow.continued()
|
|||||||
GameWindow.set_state("continued")
|
GameWindow.set_state("continued")
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Opens the minigame ddr test menu.
|
--- Opens the DDR minigame test.
|
||||||
--- @within MenuWindow
|
--- @within MenuWindow
|
||||||
function MenuWindow.ddr_test()
|
function MenuWindow.ddr_test()
|
||||||
AudioTestWindow.init()
|
AudioTestWindow.init()
|
||||||
@@ -112,7 +159,7 @@ function MenuWindow.ddr_test()
|
|||||||
MinigameDDRWindow.start("menu", "generated", { special_mode = "only_nothing" })
|
MinigameDDRWindow.start("menu", "generated", { special_mode = "only_nothing" })
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Refreshes menu items.
|
--- Refreshes the list of menu items based on current game state.
|
||||||
--- @within MenuWindow
|
--- @within MenuWindow
|
||||||
function MenuWindow.refresh_menu_items()
|
function MenuWindow.refresh_menu_items()
|
||||||
_menu_items = {}
|
_menu_items = {}
|
||||||
@@ -133,6 +180,13 @@ function MenuWindow.refresh_menu_items()
|
|||||||
|
|
||||||
table.insert(_menu_items, {label = "Exit", decision = MenuWindow.exit})
|
table.insert(_menu_items, {label = "Exit", decision = MenuWindow.exit})
|
||||||
|
|
||||||
|
_menu_max_w = 0
|
||||||
|
for _, item in ipairs(_menu_items) do
|
||||||
|
local w = print(item.label, 0, -10, 0, false, 1, false)
|
||||||
|
if w > _menu_max_w then _menu_max_w = w end
|
||||||
|
end
|
||||||
|
|
||||||
Context.current_menu_item = 1
|
Context.current_menu_item = 1
|
||||||
_click_timer = 0
|
_click_timer = 0
|
||||||
|
_anim = 0
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user