Compare commits
3 Commits
b337ae8516
...
feature/13
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ae1eec48a | |||
| 8921f02821 | |||
| 211af18c26 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,3 +7,4 @@ docs
|
|||||||
minify.lua
|
minify.lua
|
||||||
*.tic
|
*.tic
|
||||||
*.zip
|
*.zip
|
||||||
|
NOTES_*
|
||||||
|
|||||||
@@ -144,26 +144,21 @@ function Decision.update(decisions, selected_decision_index)
|
|||||||
selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1)
|
selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
if Mouse.clicked() then
|
local bar_h = 16
|
||||||
local mx = Mouse.x()
|
local bar_y = Config.screen.height - bar_h
|
||||||
local my = Mouse.y()
|
local prev_zone = { x = 0, y = bar_y, w = 15, h = bar_h }
|
||||||
local bar_height = 16
|
local next_zone = { x = Config.screen.width-15, y = bar_y, w = 15, h = bar_h }
|
||||||
local bar_y = Config.screen.height - bar_height
|
local confirm_zone = { x = 15, y = bar_y, w = Config.screen.width-30, h = bar_h }
|
||||||
if my >= bar_y then
|
|
||||||
if mx < 15 then
|
if Mouse.zone(prev_zone) then
|
||||||
Audio.sfx_beep()
|
Audio.sfx_beep()
|
||||||
Mouse.consume()
|
|
||||||
selected_decision_index = Util.safeindex(decisions, selected_decision_index - 1)
|
selected_decision_index = Util.safeindex(decisions, selected_decision_index - 1)
|
||||||
elseif mx > Config.screen.width - 15 then
|
elseif Mouse.zone(next_zone) then
|
||||||
Audio.sfx_beep()
|
Audio.sfx_beep()
|
||||||
Mouse.consume()
|
|
||||||
selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1)
|
selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1)
|
||||||
else
|
elseif Mouse.zone(confirm_zone) then
|
||||||
Mouse.consume()
|
|
||||||
return selected_decision_index, true
|
return selected_decision_index, true
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return selected_decision_index, false
|
return selected_decision_index, false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ function Context.initial_data()
|
|||||||
return {
|
return {
|
||||||
current_menu_item = 1,
|
current_menu_item = 1,
|
||||||
test_mode = false,
|
test_mode = false,
|
||||||
|
mouse_trace = false,
|
||||||
popup = {
|
popup = {
|
||||||
show = false,
|
show = false,
|
||||||
content = {}
|
content = {}
|
||||||
@@ -46,6 +47,8 @@ function Context.initial_data()
|
|||||||
have_done_work_today = false,
|
have_done_work_today = false,
|
||||||
should_ascend = false,
|
should_ascend = false,
|
||||||
have_met_sumphore = false,
|
have_met_sumphore = false,
|
||||||
|
office_sprites = {},
|
||||||
|
walking_to_office_sprites = {},
|
||||||
game = {
|
game = {
|
||||||
current_screen = "home",
|
current_screen = "home",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -8,21 +8,43 @@ Screen.register({
|
|||||||
},
|
},
|
||||||
init = function()
|
init = function()
|
||||||
Audio.music_play_room_work()
|
Audio.music_play_room_work()
|
||||||
|
Context.have_been_to_office = true
|
||||||
|
|
||||||
|
local possible_sprites = {
|
||||||
|
"dev_project_manager",
|
||||||
|
"dev_hr_girl",
|
||||||
|
"dev_introvert",
|
||||||
|
"dev_extrovert",
|
||||||
|
"dev_guru",
|
||||||
|
"dev_operator",
|
||||||
|
{id="dev_buddy", y_correct=1 * 8},
|
||||||
|
{id="dev_boy", y_correct=1 * 8},
|
||||||
|
{id="dev_girl", y_correct=1 * 8}
|
||||||
|
}
|
||||||
|
|
||||||
|
local possible_positions = {
|
||||||
|
{x = 6 * 8, y = 4 * 8},
|
||||||
|
{x = 10 * 8, y = 11 * 8 + 4},
|
||||||
|
{x = 12 * 8, y = 4 * 8},
|
||||||
|
{x = 15 * 8, y = 9 * 8},
|
||||||
|
{x = 16 * 8, y = 4 * 8},
|
||||||
|
{x = 17 * 8, y = 8 * 8},
|
||||||
|
{x = 17 * 8, y = 11 * 8},
|
||||||
|
{x = 20 * 8, y = 4 * 8},
|
||||||
|
{x = 23 * 8, y = 5 * 8},
|
||||||
|
{x = 22 * 8, y = 10 * 8 + 4},
|
||||||
|
{x = 27 * 8, y = 10 * 8 + 4},
|
||||||
|
{x = -4 + 5 * 8, y = 9 * 8}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context.office_sprites = Sprite.list_randomize(possible_sprites, possible_positions)
|
||||||
end,
|
end,
|
||||||
background = "office",
|
background = "office",
|
||||||
draw = function()
|
draw = function()
|
||||||
if Window.get_current_id() == "game" then
|
if Window.get_current_id() == "game" then
|
||||||
Sprite.draw_at("norman", 13 * 8, 9 * 8)
|
Sprite.draw_at("norman", 13 * 8, 9 * 8)
|
||||||
Sprite.draw_at("dev_buddy", 15 * 8, 9 * 8)
|
|
||||||
Sprite.draw_at("dev_project_manager", 6 * 8, 4 * 8)
|
Sprite.draw_list(Context.office_sprites)
|
||||||
Sprite.draw_at("dev_hr_girl", 12 * 8, 4 * 8)
|
|
||||||
Sprite.draw_at("dev_introvert", -4 + 5 * 8, 9 * 8)
|
|
||||||
Sprite.draw_at("dev_extrovert", 20 * 8, 4 * 8)
|
|
||||||
Sprite.draw_at("dev_girl", 23 * 8, 5 * 8)
|
|
||||||
Sprite.draw_at("dev_boy", 10 * 8, 11 * 8 + 4)
|
|
||||||
Sprite.draw_at("dev_guru", 22 * 8, 10 * 8 + 4)
|
|
||||||
Sprite.draw_at("dev_operator", 27 * 8, 10 * 8 + 4)
|
|
||||||
end
|
end
|
||||||
Context.have_been_to_office = true
|
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -8,6 +8,28 @@ Screen.register({
|
|||||||
},
|
},
|
||||||
init = function()
|
init = function()
|
||||||
Audio.music_play_room_work()
|
Audio.music_play_room_work()
|
||||||
|
|
||||||
|
local possible_sprites = {
|
||||||
|
"matrix_trinity",
|
||||||
|
"matrix_neo",
|
||||||
|
{id="matrix_oraculum", y_correct=1 * 8},
|
||||||
|
"matrix_architect"
|
||||||
|
}
|
||||||
|
|
||||||
|
local possible_positions = {
|
||||||
|
{x = 5 * 8, y = 11 * 8},
|
||||||
|
{x = 7 * 8, y = 11 * 8},
|
||||||
|
{x = 9 * 8, y = 11 * 8},
|
||||||
|
{x = 11 * 8, y = 11 * 8},
|
||||||
|
{x = 13 * 8, y = 11 * 8},
|
||||||
|
{x = 15 * 8, y = 11 * 8},
|
||||||
|
{x = 18 * 8, y = 11 * 8},
|
||||||
|
{x = 21 * 8, y = 11 * 8},
|
||||||
|
{x = 24 * 8, y = 11 * 8},
|
||||||
|
{x = 27 * 8, y = 11 * 8},
|
||||||
|
}
|
||||||
|
|
||||||
|
Context.walking_to_office_sprites = Sprite.list_randomize(possible_sprites, possible_positions)
|
||||||
end,
|
end,
|
||||||
background = "street",
|
background = "street",
|
||||||
draw = function()
|
draw = function()
|
||||||
@@ -16,10 +38,8 @@ Screen.register({
|
|||||||
Sprite.draw_at("sumphore", 9 * 8, 2 * 8)
|
Sprite.draw_at("sumphore", 9 * 8, 2 * 8)
|
||||||
Sprite.draw_at("pizza_vendor", 19 * 8, 1 * 8)
|
Sprite.draw_at("pizza_vendor", 19 * 8, 1 * 8)
|
||||||
Sprite.draw_at("dev_guard", 22 * 8, 2 * 8)
|
Sprite.draw_at("dev_guard", 22 * 8, 2 * 8)
|
||||||
Sprite.draw_at("matrix_trinity", 5 * 8, 11 * 8)
|
|
||||||
Sprite.draw_at("matrix_neo", 7 * 8, 11 * 8)
|
Sprite.draw_list(Context.walking_to_office_sprites)
|
||||||
Sprite.draw_at("matrix_oraculum", 9 * 8, 12 * 8)
|
|
||||||
Sprite.draw_at("matrix_architect", 11 * 8, 11 * 8)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -73,6 +73,70 @@ function Sprite.generate_table(width, height, starting_s, x_base, y_base, x_step
|
|||||||
return sprites
|
return sprites
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Immediately draws a list of sprites
|
||||||
|
--- @within Sprite
|
||||||
|
--- @param sprite_list table An array of tables, each containing: `id` (string) sprite identifier, `x` (number) x-coordinate, `y` (number) y-coordinate, and optional `colorkey`, `scale`, `flip_x`, `flip_y`, `rot` parameters.
|
||||||
|
function Sprite.draw_list(sprite_list)
|
||||||
|
for _, sprite_info in ipairs(sprite_list) do
|
||||||
|
local sprite_data = _sprites[sprite_info.id]
|
||||||
|
if not sprite_data then
|
||||||
|
trace("Error: Attempted to draw non-registered sprite with id: " .. sprite_info.id)
|
||||||
|
else
|
||||||
|
draw_sprite_instance(sprite_data, sprite_info)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Given a list of sprite IDs (or sprite entries with correction offsets) and a list of possible positions, randomly assigns each sprite to a unique position and returns a drawable list.
|
||||||
|
--- @within Sprite
|
||||||
|
--- @param sprite_ids table An array of sprite identifier values or tables.
|
||||||
|
--- Each entry may be either:
|
||||||
|
--- - string: sprite ID to draw.
|
||||||
|
--- - table: { sprite_id = string, x_correct = number, y_correct = number }.
|
||||||
|
--- @param positions table An array of tables, each containing `x` and `y` fields for possible sprite positions.
|
||||||
|
function Sprite.list_randomize(sprite_ids, positions)
|
||||||
|
if #sprite_ids > #positions then
|
||||||
|
trace("Error: More sprite IDs than available positions in Sprite.draw_randomized")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local shuffled_positions = {}
|
||||||
|
for i, pos in ipairs(positions) do
|
||||||
|
shuffled_positions[i] = pos
|
||||||
|
end
|
||||||
|
for i = #shuffled_positions, 2, -1 do
|
||||||
|
local j = math.random(i)
|
||||||
|
shuffled_positions[i], shuffled_positions[j] = shuffled_positions[j], shuffled_positions[i]
|
||||||
|
end
|
||||||
|
|
||||||
|
local drawable_list = {}
|
||||||
|
for i, sprite_entry in ipairs(sprite_ids) do
|
||||||
|
local sprite_id = sprite_entry
|
||||||
|
local x_correct = 0
|
||||||
|
local y_correct = 0
|
||||||
|
|
||||||
|
if type(sprite_entry) == "table" then
|
||||||
|
sprite_id = sprite_entry.sprite_id or sprite_entry.id
|
||||||
|
x_correct = sprite_entry.x_correct or 0
|
||||||
|
y_correct = sprite_entry.y_correct or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local sprite_data = _sprites[sprite_id]
|
||||||
|
if not sprite_data then
|
||||||
|
trace("Error: Attempted to draw non-registered sprite with id: " .. tostring(sprite_id))
|
||||||
|
else
|
||||||
|
local pos = shuffled_positions[i]
|
||||||
|
table.insert(drawable_list, {
|
||||||
|
id = sprite_id,
|
||||||
|
x = pos.x + x_correct,
|
||||||
|
y = pos.y + y_correct
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return drawable_list
|
||||||
|
end
|
||||||
|
|
||||||
--- Schedules a sprite for drawing.
|
--- Schedules a sprite for drawing.
|
||||||
--- @within Sprite
|
--- @within Sprite
|
||||||
--- @param id string The unique identifier of the sprite.<br/>
|
--- @param id string The unique identifier of the sprite.<br/>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ local INPUT_KEY_RIGHT = 3
|
|||||||
local INPUT_KEY_A = 4
|
local INPUT_KEY_A = 4
|
||||||
local INPUT_KEY_B = 5
|
local INPUT_KEY_B = 5
|
||||||
local INPUT_KEY_SPACE = 48
|
local INPUT_KEY_SPACE = 48
|
||||||
|
local INPUT_KEY_ENTER = 50
|
||||||
local INPUT_KEY_BACKSPACE = 51
|
local INPUT_KEY_BACKSPACE = 51
|
||||||
|
|
||||||
--- Checks if Up is pressed.
|
--- Checks if Up is pressed.
|
||||||
@@ -26,3 +27,6 @@ function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) or Mou
|
|||||||
--- Checks if Back is pressed.
|
--- Checks if Back is pressed.
|
||||||
--- @within Input
|
--- @within Input
|
||||||
function Input.back() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_BACKSPACE) end
|
function Input.back() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_BACKSPACE) end
|
||||||
|
--- Checks if Enter is pressed.
|
||||||
|
--- @within Input
|
||||||
|
function Input.enter() return keyp(INPUT_KEY_ENTER) end
|
||||||
|
|||||||
@@ -10,6 +10,11 @@ function Mouse.update()
|
|||||||
_consumed = false
|
_consumed = false
|
||||||
local mt = {mouse()}
|
local mt = {mouse()}
|
||||||
_mx, _my, _mleft = mt[1], mt[2], mt[3]
|
_mx, _my, _mleft = mt[1], mt[2], mt[3]
|
||||||
|
|
||||||
|
-- trace mouse position and tile for testing purposes
|
||||||
|
if Context.test_mode and Context.mouse_trace then
|
||||||
|
trace("Mouse: (" .. _mx .. "," .. _my .. "), tile: (" .. math.floor(_mx / 8) .. "," .. math.floor(_my / 8) .. ")")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Returns current mouse X position.
|
--- Returns current mouse X position.
|
||||||
@@ -41,3 +46,36 @@ function Mouse.consume() _consumed = true end
|
|||||||
function Mouse.in_rect(x, y, w, h)
|
function Mouse.in_rect(x, y, w, h)
|
||||||
return _mx >= x and _mx < x + w and _my >= y and _my < y + h
|
return _mx >= x and _mx < x + w and _my >= y and _my < y + h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Returns true if the mouse is within the given circle.
|
||||||
|
--- @within Mouse
|
||||||
|
--- @param cx number Center x.
|
||||||
|
--- @param cy number Center y.
|
||||||
|
--- @param r number Radius.
|
||||||
|
function Mouse.in_circle(cx, cy, r)
|
||||||
|
local dx = _mx - cx
|
||||||
|
local dy = _my - cy
|
||||||
|
return (dx * dx + dy * dy) <= (r * r)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Returns true if the mouse was clicked inside the given rectangle, and consumes the click.
|
||||||
|
--- @within Mouse
|
||||||
|
--- @param rect table A table with fields: x, y, w, h.
|
||||||
|
function Mouse.zone(rect)
|
||||||
|
if Mouse.clicked() and Mouse.in_rect(rect.x, rect.y, rect.w, rect.h) then
|
||||||
|
Mouse.consume()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Returns true if the mouse was clicked inside the given circle, and consumes the click.
|
||||||
|
--- @within Mouse
|
||||||
|
--- @param circle table A table with fields: x, y, r.
|
||||||
|
function Mouse.zone_circle(circle)
|
||||||
|
if Mouse.clicked() and Mouse.in_circle(circle.x, circle.y, circle.r) then
|
||||||
|
Mouse.consume()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|||||||
@@ -58,9 +58,7 @@ function UI.update_menu(items, selected_item, x, y, centered)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if x ~= nil and y ~= nil and Mouse.clicked() then
|
if x ~= nil and y ~= nil then
|
||||||
local mx = Mouse.x()
|
|
||||||
local my = Mouse.y()
|
|
||||||
local menu_x = x
|
local menu_x = x
|
||||||
if centered then
|
if centered then
|
||||||
local max_w = 0
|
local max_w = 0
|
||||||
@@ -71,9 +69,7 @@ function UI.update_menu(items, selected_item, x, y, centered)
|
|||||||
menu_x = (Config.screen.width - max_w) / 2
|
menu_x = (Config.screen.width - max_w) / 2
|
||||||
end
|
end
|
||||||
for i, _ in ipairs(items) do
|
for i, _ in ipairs(items) do
|
||||||
local item_y = y + (i - 1) * 10
|
if Mouse.zone({ x = menu_x - 8, y = y + (i-1) * 10, w = Config.screen.width, h = 10 }) then
|
||||||
if my >= item_y and my < item_y + 10 and mx >= menu_x - 8 then
|
|
||||||
Mouse.consume()
|
|
||||||
return i, true
|
return i, true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ function TTGIntroWindow.update()
|
|||||||
TTGIntroWindow.glitch_started = true
|
TTGIntroWindow.glitch_started = true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Count menu_back presses during the intro
|
-- Count enter presses during the intro
|
||||||
if Input.back() then
|
if Input.enter() then
|
||||||
TTGIntroWindow.space_count = TTGIntroWindow.space_count + 1
|
TTGIntroWindow.space_count = TTGIntroWindow.space_count + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -355,16 +355,11 @@ function MinigameDDRWindow.update()
|
|||||||
right = Input.right()
|
right = Input.right()
|
||||||
}
|
}
|
||||||
|
|
||||||
if Mouse.clicked() then
|
|
||||||
local mx = Mouse.x()
|
|
||||||
local my = Mouse.y()
|
|
||||||
for _, target in ipairs(mg.target_arrows) do
|
for _, target in ipairs(mg.target_arrows) do
|
||||||
if mx >= target.x and mx < target.x + mg.arrow_size and
|
if Mouse.zone({ x = target.x, y = mg.target_y, w = mg.arrow_size, h = mg.arrow_size }) then
|
||||||
my >= mg.target_y and my < mg.target_y + mg.arrow_size then
|
|
||||||
input_map[target.dir] = true
|
input_map[target.dir] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
for dir, pressed in pairs(input_map) do
|
for dir, pressed in pairs(input_map) do
|
||||||
if pressed and mg.input_cooldowns[dir] == 0 then
|
if pressed and mg.input_cooldowns[dir] == 0 then
|
||||||
|
|||||||
@@ -83,12 +83,7 @@ function MinigameButtonMashWindow.update()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local mouse_on_button = false
|
local mouse_on_button = Mouse.zone_circle({ x = mg.button_x, y = mg.button_y, r = mg.button_size })
|
||||||
if Mouse.clicked() then
|
|
||||||
local dx = Mouse.x() - mg.button_x
|
|
||||||
local dy = Mouse.y() - mg.button_y
|
|
||||||
mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size)
|
|
||||||
end
|
|
||||||
|
|
||||||
if Input.select() or mouse_on_button then
|
if Input.select() or mouse_on_button then
|
||||||
Audio.sfx_drum_high()
|
Audio.sfx_drum_high()
|
||||||
|
|||||||
@@ -95,12 +95,7 @@ function MinigameRhythmWindow.update()
|
|||||||
if mg.press_cooldown > 0 then
|
if mg.press_cooldown > 0 then
|
||||||
mg.press_cooldown = mg.press_cooldown - 1
|
mg.press_cooldown = mg.press_cooldown - 1
|
||||||
end
|
end
|
||||||
local mouse_on_button = false
|
local mouse_on_button = Mouse.zone_circle({ x = mg.button_x, y = mg.button_y, r = mg.button_size })
|
||||||
if Mouse.clicked() then
|
|
||||||
local dx = Mouse.x() - mg.button_x
|
|
||||||
local dy = Mouse.y() - mg.button_y
|
|
||||||
mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size)
|
|
||||||
end
|
|
||||||
|
|
||||||
if (Input.select() or mouse_on_button) and mg.press_cooldown == 0 then
|
if (Input.select() or mouse_on_button) and mg.press_cooldown == 0 then
|
||||||
mg.button_pressed_timer = mg.button_press_duration
|
mg.button_pressed_timer = mg.button_press_duration
|
||||||
|
|||||||
Reference in New Issue
Block a user