-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcannons.lua
More file actions
86 lines (73 loc) · 2.76 KB
/
cannons.lua
File metadata and controls
86 lines (73 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
local timeSpentInCannon = 0
---@param m MarioState
local function before_mario_update(m)
if m.playerIndex ~= 0 then return end
if m.action == ACT_IN_CANNON
and m.actionState == 2 then
timeSpentInCannon = timeSpentInCannon + 1
else
timeSpentInCannon = 0
end
if timeSpentInCannon >= 5 * 30 then
m.controller.buttonPressed = m.controller.buttonPressed | A_BUTTON
end
if m.action == ACT_SHOT_FROM_CANNON and (m.controller.buttonDown & Z_TRIG ~= 0
or m.controller.buttonPressed & Z_TRIG ~= 0) then
set_mario_action(m, ACT_GROUND_POUND, 0)
end
end
local function allow_interact(m, o, intee, interacted)
if intee == INTERACT_CANNON_BASE and not gGlobalSyncTable.cannons then
return false
end
end
---@param o Object
local function cannon_lid_init(o)
o.oFlags = OBJ_FLAG_PERSISTENT_RESPAWN | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.collisionData = gGlobalObjectCollisionData.cannon_lid_seg8_collision_08004950
cur_obj_set_home_once()
end
---@param o Object
local function cannon_lid_loop(o)
if gGlobalSyncTable.cannons then
obj_set_model_extended(o, E_MODEL_NONE)
else
obj_set_model_extended(o, E_MODEL_DL_CANNON_LID)
load_object_collision_model()
end
end
---@param o Object
local function hidden_120_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.collisionData = gGlobalObjectCollisionData.castle_grounds_seg7_collision_cannon_grill
o.oCollisionDistance = 4000
end
---@param o Object
local function hidden_120_loop(o)
if gGlobalSyncTable.cannons then
obj_set_model_extended(o, E_MODEL_NONE)
else
obj_set_model_extended(o, E_MODEL_CASTLE_GROUNDS_CANNON_GRILL)
load_object_collision_model()
end
end
hook_behavior(id_bhvHiddenAt120Stars, OBJ_LIST_SURFACE, true, hidden_120_init, hidden_120_loop)
id_bhvCannonLid = hook_behavior(nil, OBJ_LIST_SURFACE, false, cannon_lid_init, cannon_lid_loop, "cannonLid")
id_bhvCannonClosed = hook_behavior(id_bhvCannonClosed, OBJ_LIST_SURFACE, false, function (o)
spawn_non_sync_object(id_bhvCannonLid, E_MODEL_DL_CANNON_LID, o.oPosX, o.oPosY - 5, o.oPosZ, function (obj)
obj.oFaceAnglePitch = o.oFaceAnglePitch
obj.oFaceAngleYaw = o.oFaceAngleYaw
obj.oFaceAngleRoll = o.oFaceAngleRoll
end)
o.activeFlags = ACTIVE_FLAG_DEACTIVATED
end, nil, nil)
local function hud_render()
local m = gMarioStates[0]
if m.action == ACT_IN_CANNON
and m.actionState == 2 then
render_bar("Cannon Will Fire in " .. 5 - math.floor(timeSpentInCannon / 30), 5 - timeSpentInCannon / 30, 0, 5, 0, 70, 252)
end
end
hook_event(HOOK_ALLOW_INTERACT, allow_interact)
hook_event(HOOK_BEFORE_MARIO_UPDATE, before_mario_update)
hook_event(HOOK_ON_HUD_RENDER, hud_render)