-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdeathmatch.lua
133 lines (109 loc) · 4.47 KB
/
deathmatch.lua
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
local ELIMINATED = 2
---@param m MarioState
local function mario_update(m)
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
m.health = 0x880 -- set mario's health to full
if gPlayerSyncTable[m.playerIndex].state == ELIMINATED then
-- set model state
m.marioBodyState.modelState = MODEL_STATE_NOISE_ALPHA
m.flags = m.flags | MARIO_VANISH_CAP
m.flags = m.flags | MARIO_WING_CAP
end
if m.playerIndex ~= 0 then return end
local s = gPlayerSyncTable[0]
if s.tagLives and s.tagLives <= 0 and s.state == TAGGER then
s.state = ELIMINATED
end
end
local function hud_render()
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
-- set djui font and resolution
djui_hud_set_font(djui_menu_get_font())
djui_hud_set_resolution(RESOLUTION_N64)
-- check that we dont have the modifier MODIFIER_NO_RADAR enabled
if gGlobalSyncTable.modifier ~= MODIFIER_NO_RADAR then
-- render radar for each player
for i = 1, MAX_PLAYERS - 1 do
if gNetworkPlayers[i].connected then
-- make sure the states line up
if gPlayerSyncTable[i].state == TAGGER and gPlayerSyncTable[0].state == TAGGER then -- check if we meet the checks to render the radar
render_radar(gMarioStates[i], icon_radar[i], false) -- render radar on player
end
end
end
end
if gPlayerSyncTable[0].state == TAGGER and gGlobalSyncTable.roundState == ROUND_ACTIVE then
render_bar("Lives Remaining: " .. gPlayerSyncTable[0].tagLives, gPlayerSyncTable[0].tagLives, 0, gGlobalSyncTable.tagMaxLives, 66, 176, 245)
end
end
local function on_warp()
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
if gGlobalSyncTable.roundState ~= ROUND_ACTIVE then return end
if gNetworkPlayers[0].currLevelNum ~= levels[gGlobalSyncTable.selectedLevel].level then return end
if not gGlobalSyncTable.eliminateOnDeath then return end
-- subtract lives by 1
if gPlayerSyncTable[0].state == TAGGER then
gPlayerSyncTable[0].tagLives = gPlayerSyncTable[0].tagLives - 1
end
end
---@param a MarioState
---@param v MarioState
local function allow_pvp(a, v)
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
-- check if eliminated player is trying to perform a pvp attack
if gPlayerSyncTable[v.playerIndex].state == ELIMINATED or gPlayerSyncTable[a.playerIndex].state == ELIMINATED then return false end
end
---@param a MarioState
---@param v MarioState
local function on_pvp(a, v)
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
if v.playerIndex ~= 0 then return end
-- handle pvp if we are the victim
deathmatch_handle_pvp(a.playerIndex, v.playerIndex)
end
---@param aI number
---@param vI number
function deathmatch_handle_pvp(aI, vI)
-- this checks and sets our states
local a = gPlayerSyncTable[aI]
local v = gPlayerSyncTable[vI]
-- check if tagger tagged tagger
if v.state == TAGGER and a.state == TAGGER
and v.invincTimer <= 0 and gGlobalSyncTable.roundState == ROUND_ACTIVE then
-- reduce lives for victim
v.tagLives = v.tagLives - 1
-- if tagLives is set to 0 or less then create popup
if v.tagLives <= 0 then
-- create popup
tagged_popup(aI, vI)
end
-- increase amount of tags and set invincibility timer to 1 second
a.amountOfTags = a.amountOfTags + 1
-- set victim i frames
v.invincTimer = 3 * 30
end
end
---@param m MarioState
---@param o Object
---@param intee InteractionType
local function allow_interact(m, o, intee)
if gGlobalSyncTable.gamemode ~= DEATHMATCH then return end
-- check if player interacts with another player
if intee == INTERACT_PLAYER then
for i = 0, MAX_PLAYERS - 1 do
if gNetworkPlayers[i].connected then
-- find the other player and check his state
if gMarioStates[i].marioObj == o and (gPlayerSyncTable[m.playerIndex].state == ELIMINATED or gPlayerSyncTable[i].state == ELIMINATED) then
-- don't allow the interaction
return false
end
end
end
end
end
hook_event(HOOK_MARIO_UPDATE, mario_update)
hook_event(HOOK_ON_HUD_RENDER, hud_render)
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp)
hook_event(HOOK_ON_PVP_ATTACK, on_pvp)
hook_event(HOOK_ON_WARP, on_warp)
hook_event(HOOK_ALLOW_INTERACT, allow_interact)