--[[ ##################################### ## SPRING TRICKS -- ## by ARJr -- ## Based on Pointy/Fluffy's tricks -- ##----------------------------------- See below for info on how to add your own tricks to the list. --]] -- ################################################## -- TRICK FUNCTIONS -- These are used to actually animate the trick and determine when to stop the trick. -- Pirouette A local function TRICK_PirouetteA(player, ticker) -- ticker is the same as the titlecard HUD hook ticker (the amount of time the trick has been going on for in tics) if ticker >= 16 then player.drawangle = player.SpringTricks.vars.storedangle -- Make sure to set trick-specific variables in player.SpringTricks.vars player.SpringTricks.vars.storedangle = nil player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false --< Set this to false when you want to end the trick return elseif ticker == 1 then player.SpringTricks.vars.storedangle = player.drawangle end player.drawangle = player.SpringTricks.vars.storedangle + (ticker*ANGLE_22h) player.mo.state = S_PLAY_EDGE player.mo.frame = 0 end -- Pirouette B local function TRICK_PirouetteB(player, ticker) if ticker >= 16 then player.drawangle = player.SpringTricks.vars.storedangle player.SpringTricks.vars.storedangle = nil player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return elseif ticker == 1 then player.SpringTricks.vars.storedangle = player.drawangle end player.drawangle = player.SpringTricks.vars.storedangle + (ticker*ANGLE_22h) player.mo.state = S_PLAY_SPRING player.mo.frame = 0 end -- Spin local function TRICK_Spin(player, ticker) if ticker >= 9 then player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return end if player.mo.state ~= S_PLAY_ROLL then player.mo.state = S_PLAY_ROLL end end -- Airwalk local function TRICK_Airwalk(player, ticker) if ticker >= 16 then player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return end if ticker % 2 == 0 then player.mo.state = S_PLAY_WALK end end -- Flashback (XMom) local function TRICK_Flashback(player, ticker) if ticker >= 16 then player.mo.rollangle = 0 if player.followmobj then player.followmobj.rollangle = 0 end S_StartSound(player.mo, sfx_kc48) player.SpringTricks.tricking = false --< Set this to false when you want to end the trick return end player.mo.rollangle = ticker*ANGLE_22h if player.followmobj then player.followmobj.rollangle = ticker*ANGLE_22h end end -- True Speed (Sonic) local function TRICK_True(player, ticker) if ticker >= 15 then player.mo.flags2 = $ & ~MF2_DONTDRAW P_SpawnThokMobj(player) S_StartSound(player.mo, sfx_appear) S_StartSound(player.mo, sfx_skid) player.SpringTricks.tricking = false return elseif ticker == 1 then P_SpawnThokMobj(player) end player.mo.flags2 = $|MF2_DONTDRAW end -- Fly High (Tails) local function TRICK_FlyHigh(player, ticker) if ticker >= 3*TICRATE/8 then player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return end player.mo.state = S_PLAY_FLY end -- Chuckler (Knux) local function TRICK_Chuck(player, ticker) if ticker >= 18 then player.mo.state = S_PLAY_FALL player.drawangle = player.SpringTricks.vars.storedangle player.SpringTricks.vars.storedangle = nil player.SpringTricks.tricking = false return elseif ticker == 1 then player.SpringTricks.vars.storedangle = player.drawangle end player.mo.state = S_PLAY_WAIT player.drawangle = player.SpringTricks.vars.storedangle + ANGLE_180 end -- Hearty Cheer (Amy) local function TRICK_Cheer(player, ticker) if ticker >= 13 then player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return elseif ticker == 1 then local heart = P_SpawnMobjFromMobj(player.mo, 0, 0, player.mo.height, MT_LHRT) P_SetObjectMomZ(heart, 10*FRACUNIT) heart.fuse = TICRATE heart.target = player.mo player.mo.state = S_PLAY_NIGHTS_TRANS1 end if player.mo.state != S_PLAY_NIGHTS_TRANS6 then player.mo.state = $+1 else player.mo.frame = 6 end end -- Red Handed (Fang) local function TRICK_RedHanded(player, ticker) if ticker >= 16 then player.drawangle = player.SpringTricks.vars.storedangle player.SpringTricks.vars.storedangle = nil player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return elseif ticker == 1 then player.SpringTricks.vars.storedangle = player.drawangle end player.drawangle = player.SpringTricks.vars.storedangle + (ticker*ANGLE_22h) player.mo.state = S_PLAY_RUN player.mo.frame = $+1 end -- Charge (Metal) local function TRICK_Charge(player, ticker) if ticker >= 15 then player.mo.state = S_PLAY_FALL player.SpringTricks.tricking = false return end player.mo.state = S_METALSONIC_GATHER end -- ################################################## -- TRICK LIST -- The table used to store the tricks. Use dto pick a random trick to play. local trickTable = { -- Format: {name = "Name of trick", char = "skinname", func = TRICK_Function, sound = sfx_sndid} { name = "Pirouette A", char = "all", --You can enter "all" to make it apply to all skins func = TRICK_PirouetteA, sound = sfx_prloop }, {name = "Pirouette B", char = "all", func = TRICK_PirouetteB, sound = sfx_prloop}, {name = "Spinning Flip", char = "all", func = TRICK_Spin, sound = sfx_thok}, {name = "Airwalker", char = "all", func = TRICK_Airwalk, sound = sfx_skid}, {name = "Flashback", char = "all", func = TRICK_Flashback}, {name = "True Speed", char = "sonic", func = TRICK_True, sound = sfx_zoom}, {name = "Fly High", char = "tails", func = TRICK_FlyHigh, sound = sfx_putput}, {name = "Chuckler", char = "knuckles", func = TRICK_Chuck, sound = sfx_nbmper}, {name = "Cheerful Companion", char = "amy", func = TRICK_Cheer, sound = sfx_chchng}, {name = "Caught Red Handed", char = "fang", func = TRICK_RedHanded, sound = sfx_alart}, {name = "Charge Up", char = "metalsonic", func = TRICK_Charge, sound = sfx_kc4d} } rawset(_G, "TRICK_TrickList", trickTable) -- ################################################## -- THE CODE -- The actual code for the trick handling. Only edit this if you know what you're doing! local function RandTrick(skin) local randtrick = TRICK_TrickList[P_RandomRange(1, #TRICK_TrickList)] if randtrick.char == "all" or randtrick.char == skin then return randtrick end return RandTrick(skin) -- Recursive reshuffle end local trickScore = { 100,200,500,1000,1000, 1000,2000,2000,5000,5000, 5000,10000,10000,10000,10000, 10000,10000,10000,10000,10000, 10000,50000 } addHook("PlayerThink", function(player) if not (player.mo and player.mo.valid and player.playerstate == PST_LIVE) then return end player.SpringTricks = $ or { vars = {}, tricking = false, trickTicker = 0, trick = nil, chain = 0, trickbt = false, ready = false } if player.mo.eflags & MFE_SPRUNG then player.SpringTricks.ready = true player.SpringTricks.chain = 0 elseif player.mo.eflags & MFE_JUSTHITFLOOR or player.mo.state == S_PLAY_PAIN or (P_IsObjectOnGround(player.mo) and player.SpringTricks.ready) or player.pflags & (PF_JUMPED|PF_THOKKED) then player.SpringTricks.ready = false player.SpringTricks.trick = nil player.SpringTricks.tricking = false player.SpringTricks.chain = 0 player.SpringTricks.trickTicker = 0 player.mo.rollangle = 0 if player.followmobj then player.followmobj.rollangle = 0 end end if player.cmd.buttons & BT_TOSSFLAG then if not player.SpringTricks.trickbt and player.SpringTricks.ready and not player.SpringTricks.tricking then player.SpringTricks.trick = RandTrick(player.mo.skin) player.SpringTricks.tricking = true player.SpringTricks.trickTicker = 1 player.SpringTricks.chain = $+1 local score = player.SpringTricks.chain if score > #trickScore then score = #trickScore end P_AddPlayerScore(player, trickScore[score]) if player.SpringTricks.trick.sound then S_StartSound(player.mo, player.SpringTricks.trick.sound) end end player.SpringTricks.trickbt = true else player.SpringTricks.trickbt = false end if player.SpringTricks.trickTicker then player.SpringTricks.trick.func(player, player.SpringTricks.trickTicker) if not player.SpringTricks.tricking then player.SpringTricks.trickTicker = 0 else player.SpringTricks.trickTicker = $+1 end end end) -- ################################################## -- THE HUD -- Displaying the tricks. hud.add(function(v, player) if not player.SpringTricks then return end if player.SpringTricks.ready then if not player.SpringTricks.trick then v.drawString(300, 8, "Press \x82Toss Flag\x80 to begin tricking!", V_SNAPTOTOP|V_ALLOWLOWERCASE, "thin-right") else v.drawString(300, 8, player.SpringTricks.trick.name, V_YELLOWMAP|V_SNAPTOTOP|V_ALLOWLOWERCASE, "right") v.drawString(300, 16, "Chain "..player.SpringTricks.chain, V_SNAPTOTOP|V_ALLOWLOWERCASE|V_50TRANS, "thin-right") end end end)