//This script is Reusable so do whatever you want with it //commands local colorizedghost = CV_RegisterVar({ name = "colorizedghost", defaultvalue = "On", flags = CV_SHOWMODIF, PossibleValue = CV_OnOff, }) local hyperstars = CV_RegisterVar({ name = "hyperstars", defaultvalue = "On", flags = CV_SHOWMODIF, PossibleValue = CV_OnOff, }) local screenflash = CV_RegisterVar({ name = "screenflash", defaultvalue = "On", flags = CV_SHOWMODIF, PossibleValue = CV_OnOff, }) local allsuperemeralds = CV_RegisterVar({ name = "allsuperemeralds", defaultvalue = "Off", flags = CV_SHOWMODIF|CV_NETVAR|CV_CHEAT, PossibleValue = CV_OnOff, }) local hyperskincolor = CV_RegisterVar({ name = "hyperskincolor", flags = CV_SHOWMODIF, PossibleValue = { Vanilla = 1, S3K = 2}, defaultvalue = "Vanilla", }) //local variables local forward_dash_dist = 75*FRACUNIT local sideward_dash_dist = 75*FRACUNIT local vertical_dash_dist = 20*FRACUNIT //Hyper stars local function SpawnHyperStars(player) local hyperstar = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_SUPERSPARK) hyperstar.momx = P_RandomRange(-14, 14) * FRACUNIT + FixedMul(-12, 12, player.mo.scale) hyperstar.momy = P_RandomRange(-14, 14) * FRACUNIT + FixedMul(-12, 12, player.mo.scale) hyperstar.momz = P_RandomRange(-1, 9) * FRACUNIT + FixedMul(-12, 12, player.mo.scale) hyperstar.fuse = 5 hyperstar.scale = player.mo.scale * 20 / 24 hyperstar.source = player.mo end addHook("PlayerThink", function(player) local mo = player.mo local skin = mo.skin if player.hyper == nil local hyper = { isunlocked = false, capable = false, transformed = false } player.hyperwad = true player.superemeralds = 0 if mo player.hyper = hyper else player.hyper = nil end end --If you have all 7 Super Emeralds... You have now unlocked your Hyper Form! if player.superemeralds >= 7 if player.hyper.isunlocked == false player.hyper.isunlocked = true player.pflags = $ | SF_SUPER end end --If you don't have all 7 Super Emeralds, fuck off, you aren't going hyper. if player.superemeralds > 7 and not player.superemeralds == 0 player.hyper.isunlocked = false if (player.pflags & SF_SUPER) then player.pflags = $ & ~ SF_SUPER P_DoSuperTransformation(player, false) end end --Give all 7 emeralds with a special console command if allsuperemeralds.value == 1 then player.superemeralds = 7 player.hyper.isunlocked = true elseif allsuperemeralds.value == 0 then player.superemeralds = 0 player.hyper.isunlocked = false if player.hyper.transformed == true player.hyper.transformed = false end end --if you're capable of going hyper if skin == "sonic" and player.hyper.isunlocked == true --let's fucking go if not player.powers[pw_super] player.hyper.transformed = false else player.hyper.transformed = true end --You're rings drain twice as fast now, you're welcome :p if (leveltime % 35 == 18) and (player.powers[pw_super] >= 2) and player.hyper.transformed == true P_GivePlayerRings(player, -1) end --If you're hyper... if (player.hyper.transformed == true) if mo.state == S_PLAY_SUPER_TRANS1 then if not S_SoundPlaying(player.mo, sfx_s3k9f) then S_StartSound(player.mo, sfx_s3k9f) end end player.accelstart = skins[skin].accelstart * 7 / 5 if hyperstars.value == 1 SpawnHyperStars(player) end --rianboww if mo.color == SKINCOLOR_SUPERGOLD1 or mo.color == SKINCOLOR_SUPERGOLD2 or mo.color == SKINCOLOR_SUPERGOLD3 or mo.color == SKINCOLOR_SUPERGOLD4 or mo.color == SKINCOLOR_SUPERGOLD5 if hyperskincolor.value == 1 mo.color = (SKINCOLOR_SUPERSILVER1 + 5*((leveltime >> 1) % 7)) elseif hyperskincolor.value == 2 mo.color = (SKINCOLOR_HYPERSONIC1 + abs( ( (leveltime >> 1) % 17) - 5)) end end //Hyper Sonic: "Oxygen? What's that?" if (mo.eflags & MFE_UNDERWATER) player.powers[pw_underwater] = 0 end if P_InSpaceSector(mo) player.powers[pw_spacetime] = 0 end if (player.speed > 2*FRACUNIT or mo.momz > 2*FRACUNIT or mo.momz < -3*FRACUNIT) then local ghost = P_SpawnGhostMobj(mo) //God I wish the games hardcoded afterimages could be recolored with lua ghost.fuse = 4 ghost.rollangle = mo.rollangle if colorizedghost.value == 1 ghost.colorized = true ghost.color = mo.color else ghost.colorized = false end end else player.accelstart = skins[skin].accelstart end end end) //other functions //The quakes should only appear for the player creating them local function StartQuakes(player) if (player == consoleplayer) P_StartQuake(7*FRACUNIT, 4) end end //Handles dashing in 3D local function Do3DHyperDash(player) local mo = player.mo //my god is this code a mess local dash_forward = (player.cmd.forwardmove) and not (((player.pflags & PF_USEDOWN) and (player.cmd.forwardmove) or ((player.cmd.forwardmove) and (player.cmd.sidemove))) and not (mo.state == S_PLAY_FLOAT or mo.state == S_PLAY_FLOAT_RUN)) local dash_diagonal = ((player.cmd.forwardmove) and (player.cmd.sidemove)) and not ((player.pflags & PF_USEDOWN) and not (mo.state == S_PLAY_FLOAT or mo.state == S_PLAY_FLOAT_RUN)) local dash_sideward = (player.cmd.sidemove) and not ((player.cmd.forwardmove) and (player.cmd.sidemove)) and not ((player.pflags & PF_USEDOWN) and not (mo.state == S_PLAY_FLOAT or mo.state == S_PLAY_FLOAT_RUN)) local dash_upward = P_GetPlayerControlDirection(player) == 0 and not ((player.pflags & PF_USEDOWN) and not (mo.state == S_PLAY_FLOAT or mo.state == S_PLAY_FLOAT_RUN)) local dash_downward = (player.pflags & PF_USEDOWN) and mo.state != S_PLAY_FLOAT and mo.state != S_PLAY_FLOAT_RUN if dash_forward P_InstaThrust(mo, mo.angle, forward_dash_dist) elseif dash_diagonal P_InstaThrust(mo, player.drawangle, sideward_dash_dist) elseif dash_sideward P_InstaThrust(mo, player.drawangle, sideward_dash_dist) elseif dash_upward P_SetObjectMomZ(mo, vertical_dash_dist, false) elseif dash_downward P_SetObjectMomZ(mo, -vertical_dash_dist, false) end end //Handles dashing in 2D //the exact same way it worked in Sonic 3 & Knuckles local function Do2DHyperDash(player) local mo = player.mo //my god is this code a mess local dash_forward = (player.cmd.forwardmove) local dash_upward = (player.cmd.forwardmove > 0) and not (player.cmd.forwardmove < 0) local dash_downward = (player.cmd.forwardmove < 0) and not (player.cmd.forwardmove > 0) if not dash_forward P_InstaThrust(mo, mo.angle, forward_dash_dist) elseif dash_upward P_SetObjectMomZ(mo, vertical_dash_dist, false) elseif dash_downward P_SetObjectMomZ(mo, -vertical_dash_dist, false) end end //now we can dash, yay :DDDDDD addHook("AbilitySpecial", function(player) local mo = player.mo if mo.skin != "sonic" then return end if (player.pflags & PF_THOKKED) then return end local sonics = skins["sonic"] if (player.hyper.transformed == true) P_SpawnThokMobj(player) S_StartSound(mo, sfx_s3kb6) P_RadiusAttack(mo, mo, 1214*FRACUNIT) StartQuakes(player) player.pflags = $ | PF_THOKKED if screenflash.value == 1 P_FlashPal(player, PAL_WHITE, 3) end if not (mo.flags2 & MF2_TWOD) Do3DHyperDash(player) //3D Hyper Dash else Do2DHyperDash(player) //2D Hyper Dash end elseif (player.hyper.transformed == false) then player.charability = sonics.ability end end) addHook("TouchSpecial", function(token, p) if p.player and p.valid and p.health and token.valid if All7Emeralds(emeralds) p.player.pflags = $ & ~ SF_SUPER if p.player.superemeralds < 7 p.player.superemeralds = $ + 1 end end end end, MT_TOKEN) addHook("PlayerSpawn", function(player) player.superemeralds = $ end) freeslot("SKINCOLOR_HYPERSONIC1", "SKINCOLOR_HYPERSONIC2", "SKINCOLOR_HYPERSONIC3", "SKINCOLOR_HYPERSONIC4", "SKINCOLOR_HYPERSONIC5", "SKINCOLOR_HYPERSONIC6", "SKINCOLOR_HYPERSONIC7", "SKINCOLOR_HYPERSONIC8", "SKINCOLOR_HYPERSONIC9", "SKINCOLOR_HYPERSONIC10", "SKINCOLOR_HYPERSONIC11", "SKINCOLOR_HYPERSONIC12") skincolors[SKINCOLOR_HYPERSONIC1] = { name = "Hyper Sonic 1", ramp = {0,0,0,80,80,80,80,81,81,81,82,82,64,64,64,65}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC2] = { name = "Hyper Sonic 2", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC3] = { name = "Hyper Sonic 3", ramp = {0,0,252,252,208,208,208,48,209,209,209,210,210,210,32,32}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC4] = { name = "Hyper Sonic 4", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC5] = { name = "Hyper Sonic 5", ramp = {0,0,144,144,144,160,160,160,161,161,161,161,162,162,162,162}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC6] = { name = "Hyper Sonic 6", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC7] = { name = "Hyper Sonic 7", ramp = {0,0,144,144,144,144,145,145,145,146,146,146,146,147,147,147}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC8] = { name = "Hyper Sonic 8", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC9] = { name = "Hyper Sonic 9", ramp = {0,0,0,0,88,88,96,96,96,98,98,100,100,101,104,104}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC10] = { name = "Hyper Sonic 10", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC11] = { name = "Hyper Sonic 11", ramp = {0,0,0,80,80,81,81,83,83,64,64,64,64,65,65,65}, accessible = false } skincolors[SKINCOLOR_HYPERSONIC12] = { name = "Hyper Sonic 12", ramp = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, accessible = false }