diff --git a/src/Lua/Functions/Scripts/endGame.lua b/src/Lua/Functions/Scripts/endGame.lua index a3a5ba2..aa3fb8e 100644 --- a/src/Lua/Functions/Scripts/endGame.lua +++ b/src/Lua/Functions/Scripts/endGame.lua @@ -19,11 +19,26 @@ return function(self, endType) MM_N.endType = endType MM_N.gameover = true + S_StopMusic(consoleplayer) + + for mo in mobjs.iterate() + if not (mo and mo.valid) then continue end + if (mo == MM_N.end_camera) then continue end + + if mo.flags & MF_NOTHINK + mo.notthinking = true + continue + end + + mo.flags = $|MF_NOTHINK + end + + /* MM_N.mapVote = {} mapmusname = "_INTER" S_ChangeMusic(mapmusname) - + local addedMaps = 0 while addedMaps < 3 do local map = P_RandomRange(1, 1024) @@ -48,7 +63,7 @@ return function(self, endType) }) addedMaps = $+1 end - + for p in players.iterate do if not (p and p.mm) then continue end @@ -58,4 +73,6 @@ return function(self, endType) end table.insert(MM_N.innocents, p) end + */ + end \ No newline at end of file diff --git a/src/Lua/Functions/Scripts/init.lua b/src/Lua/Functions/Scripts/init.lua index c96a5b1..4bf9c20 100644 --- a/src/Lua/Functions/Scripts/init.lua +++ b/src/Lua/Functions/Scripts/init.lua @@ -4,7 +4,11 @@ local randomPlayer = MM.require "Libs/getRandomPlayer" return function(self) MM_N = shallowCopy(matchVars) - + if (MM_N.end_camera and MM_N.end_camera.valid) + P_RemoveMobj(MM_N.end_camera) + MM_N.end_camera = nil + end + for p in players.iterate do self:playerInit(p, true) end diff --git a/src/Lua/Functions/Scripts/startEndCamera.lua b/src/Lua/Functions/Scripts/startEndCamera.lua new file mode 100644 index 0000000..37b494c --- /dev/null +++ b/src/Lua/Functions/Scripts/startEndCamera.lua @@ -0,0 +1,84 @@ +local function intervalhelper(t, d) + return (min(t,d)*FU) / (max(d,1)) +end + +local function interval(t, s, d) + return intervalhelper(max(t,s) - s, d) +end + +local function follow(mobj, mul) + P_MoveOrigin(mobj, + mobj.origin[1] + P_ReturnThrustX(nil,mobj.angle,-mobj.lerpradius), + mobj.origin[2] + P_ReturnThrustY(nil,mobj.angle,-mobj.lerpradius), + mobj.z + ) +end + +return function(self, origin, focusang, finalradius, panduration, panspeed) + if not (MM_N.end_camera and MM_N.end_camera.valid) + local angle = AngleFixed(focusang) + + MM_N.end_camera = P_SpawnMobjFromMobj(origin, + P_ReturnThrustX(nil,focusang,-finalradius), + P_ReturnThrustY(nil,focusang,-finalradius), + origin.height, + MT_THOK + ) + MM_N.end_camera.tics = -1 + MM_N.end_camera.fuse = -1 + MM_N.end_camera.flags2 = $|MF2_DONTDRAW + + MM_N.end_camera.origin = {origin.x,origin.y,origin.z + origin.height} + MM_N.end_camera.startradius = {1200*FU,800*FU} + MM_N.end_camera.endradius = {finalradius, finalradius/2} + MM_N.end_camera.lerpradius = finalradius + + MM_N.end_camera.swirldur = 3*TICRATE + MM_N.end_camera.startangle = angle + 90*FU + MM_N.end_camera.endangle = angle + 990*FU --720*FU + + MM_N.end_camera.target = origin + + MM_N.end_camera.panduration = panduration + MM_N.end_camera.panspeed = panspeed + + MM_N.end_camera.ticker = 0 + --Move + else + local time = MM_N.end_camera.ticker + local pan = ease.outquint( + interval(time, MM_N.end_camera.swirldur, MM_N.end_camera.panduration), + FU, 0 + ) + + if time <= MM_N.end_camera.swirldur + local swirl = intervalhelper(time, MM_N.end_camera.swirldur) + + local ang = FixedAngle(swirl < FU/2 and + ease.inoutquint(swirl, MM_N.end_camera.startangle, MM_N.end_camera.endangle) or + ease.inoutquad(swirl, MM_N.end_camera.startangle, MM_N.end_camera.endangle) + ) + local hdist = ease.outquad(swirl, MM_N.end_camera.startradius[1], MM_N.end_camera.endradius[1]) + + /* + local p = { + x = MM_N.end_camera.origin[1] - FixedMul(cos(ang), hdist), + y = MM_N.end_camera.origin[2] - FixedMul(sin(ang), hdist), + z = MM_N.end_camera.origin[3] + ease.outquad(swirl, MM_N.end_camera.startradius[2], MM_N.end_camera.endradius[2]) + } + */ + + MM_N.end_camera.lerpradius = hdist + + MM_N.end_camera.angle = ang - ANGLE_90 + MM_N.end_camera.ticker = $+1 + end + follow(MM_N.end_camera, FixedMul(pan, MM_N.end_camera.panspeed)) + + end + + for p in players.iterate + p.awayviewmobj = MM_N.end_camera + p.awayviewtics = 10*TICRATE + end +end \ No newline at end of file diff --git a/src/Lua/Functions/Scripts/startVote.lua b/src/Lua/Functions/Scripts/startVote.lua new file mode 100644 index 0000000..a8e2d2f --- /dev/null +++ b/src/Lua/Functions/Scripts/startVote.lua @@ -0,0 +1,46 @@ +return function(self) + if MM_N.voting then return end + + MM_N.voting = true + MM_N.end_ticker = 0 + + MM_N.mapVote = {} + + mapmusname = "_INTER" + S_ChangeMusic(mapmusname) + + local addedMaps = 0 + while addedMaps < 3 do + local map = P_RandomRange(1, 1024) + if not mapheaderinfo[map] then continue end + + local data = mapheaderinfo[map] + + local mapWasIn = false + for _,oldmap in ipairs(MM_N.mapVote) do + if map == oldmap.map then mapWasIn = true break end + end + if mapWasIn then continue end + + if not (data.typeoflevel & TOL_MATCH) then + continue + end + if data.bonustype then continue end + + table.insert(MM_N.mapVote, { + map = map, + votes = 0 + }) + addedMaps = $+1 + end + + for p in players.iterate do + if not (p and p.mm) then continue end + + if p.mm.role == 2 then + table.insert(MM_N.murderers, p) + continue + end + table.insert(MM_N.innocents, p) + end +end \ No newline at end of file diff --git a/src/Lua/Functions/main.lua b/src/Lua/Functions/main.lua index 7246a87..3f56fce 100644 --- a/src/Lua/Functions/main.lua +++ b/src/Lua/Functions/main.lua @@ -7,4 +7,6 @@ doAndInsert("init") doAndInsert("playerInit") doAndInsert("endGame") doAndInsert("pingMurderers") -doAndInsert("playerWithGun") \ No newline at end of file +doAndInsert("playerWithGun") +doAndInsert("startVote") +doAndInsert("startEndCamera") diff --git a/src/Lua/Hooks/Game/Manager.lua b/src/Lua/Hooks/Game/Manager.lua index fb41d69..c81e8d4 100644 --- a/src/Lua/Hooks/Game/Manager.lua +++ b/src/Lua/Hooks/Game/Manager.lua @@ -45,20 +45,44 @@ addHook("ThinkFrame", function() if not MM:isMM() then return end if MM_N.gameover then - MM_N.end_ticker = $+1 - if MM_N.end_ticker > 15*TICRATE then - local selected_map = 1 - local most_votes = 0 - for _,map in ipairs(MM_N.mapVote) do - if map.votes < most_votes then continue end - - selected_map = map.map - most_votes = map.votes + if MM_N.voting + MM_N.end_ticker = $+1 + if MM_N.end_ticker > 15*TICRATE then + local selected_map = 1 + local most_votes = 0 + for _,map in ipairs(MM_N.mapVote) do + if map.votes < most_votes then continue end + + selected_map = map.map + most_votes = map.votes + end + G_SetCustomExitVars(selected_map, 2) + G_ExitLevel() + end + else + MM_N.end_ticker = $+1 + + if (MM_N.end_camera and MM_N.end_camera.valid) + MM:startEndCamera() + end + + if MM_N.end_ticker == 3*TICRATE + for mo in mobjs.iterate() + if not (mo and mo.valid) then continue end + + if mo.notthinking + continue + end + + mo.flags = $ &~MF_NOTHINK + end + end + + if MM_N.end_ticker >= 5*TICRATE + MM:startVote() end - G_SetCustomExitVars(selected_map, 2) - G_ExitLevel() end - + return end @@ -93,11 +117,13 @@ addHook("ThinkFrame", function() innocents = $+1 end - + + --innocents win if not (murderers) then MM:endGame(1) return end + --murderers win if not (innocents) then MM:endGame(2) return diff --git a/src/Lua/Hooks/HUD/Drawers/intermission.lua b/src/Lua/Hooks/HUD/Drawers/intermission.lua index 2a1de1f..75d7e87 100644 --- a/src/Lua/Hooks/HUD/Drawers/intermission.lua +++ b/src/Lua/Hooks/HUD/Drawers/intermission.lua @@ -29,8 +29,8 @@ end local MAX_FADE = 20 return function(v) - if not MM.gameover then return end - if MM.end_ticker == nil then return end + if not MM_N.voting then return end + if MM_N.end_ticker == nil then return end // DEFINITION diff --git a/src/Lua/Hooks/HUD/Drawers/showdownicon.lua b/src/Lua/Hooks/HUD/Drawers/showdownicon.lua index 1532661..c748dd4 100644 --- a/src/Lua/Hooks/HUD/Drawers/showdownicon.lua +++ b/src/Lua/Hooks/HUD/Drawers/showdownicon.lua @@ -6,7 +6,12 @@ return function(v,p,c) return end - v.drawString(6, 30, "SHOWDOWN!", V_SNAPTOTOP|V_SNAPTOLEFT|V_REDMAP, "thin") + v.drawString(6*FU - MMHUD.xoffset, + 30*FU, + "SHOWDOWN!", + V_SNAPTOTOP|V_SNAPTOLEFT|V_REDMAP, + "thin-fixed" + ) if not (p and p.mo and p.mm and p.mm.role == 2) then return end diff --git a/src/Lua/Hooks/HUD/main.lua b/src/Lua/Hooks/HUD/main.lua index bbe95b9..eda3229 100644 --- a/src/Lua/Hooks/HUD/main.lua +++ b/src/Lua/Hooks/HUD/main.lua @@ -108,7 +108,7 @@ addHook("HUD", function(v,p,c) MMHUD.xoffset = ease.inquart(FU*9/10,$,0) end else - MMHUD.xoffset = ease.inquart(FU*9/10,$,HUD_BEGINNINGXOFF) + MMHUD.xoffset = ease.inexpo(FU*7/10,$,HUD_BEGINNINGXOFF) end hudwasmm = true diff --git a/src/Lua/Hooks/Player/corpse.lua b/src/Lua/Hooks/Player/corpse.lua index daea762..60e2f7e 100644 --- a/src/Lua/Hooks/Player/corpse.lua +++ b/src/Lua/Hooks/Player/corpse.lua @@ -34,6 +34,28 @@ addHook("MobjDeath", function(target, inflictor, source) target.player.mm.whokilledme = source + --TODO: make this better and determine if this kill is a winning kill + local headcount = 0 + for p in players.iterate + if p.spectator + or not (p.mo and p.mo.valid and p.mo.health) + or (p.mm and p.mm.spectator) + continue + end + headcount = $+1 + end + + if headcount == 2 + S_StartSound(nil,sfx_buzz3) + S_StartSound(nil,sfx_s253) + MM:startEndCamera(target, + target.player.drawangle + ANGLE_180, + 200*FU, + 6*TICRATE, + FU/16 + ) + end + local corpse = P_SpawnMobjFromMobj(target, 0,0,0, MT_THOK) diff --git a/src/Lua/Variables/Data/Match.lua b/src/Lua/Variables/Data/Match.lua index 8175d3a..313131e 100644 --- a/src/Lua/Variables/Data/Match.lua +++ b/src/Lua/Variables/Data/Match.lua @@ -5,6 +5,7 @@ return { maxtime = match_time, waiting_for_players = false, gameover = false, + voting = false, showdown = false, end_ticker = 0, showdown_ticker = 0,