#credit to ManicTH14 for this walljump SOC
FREESLOT
S_FAKESPARK
MT_STOMPDUST
MT_BOOST
MT_MTHOK
S_MTHOK
MT_PLACEHOLDERSONICWALLJUMP
S_PLACEHOLDERSONICWALLJUMP1
S_PLACEHOLDERSONICWALLJUMP2
S_PLACEHOLDERSONICWALLJUMP3
S_PLACEHOLDERSONICWALLJUMP4
S_PLACEHOLDERSONICWALLJUMP5
S_PLACEHOLDERSONICWALLJUMP6
S_PLACEHOLDERSONICWALLJUMP7
S_PLACEHOLDERSONICWALLJUMP8
S_PLACEHOLDERSONICWALLJUMP9
S_PLACEHOLDERSONICWALLJUMP10
S_PLACEHOLDERSONICWALLJUMP11
MT_SONICWALLJUMP
S_SONICWALLJUMP1
S_SONICWALLJUMP2
S_SONICWALLJUMP3
S_SONICWALLJUMP4
S_SONICWALLJUMP5
MT_SUPERSONICWALLJUMP
S_SUPERSONICWALLJUMP1
S_SUPERSONICWALLJUMP2
S_SUPERSONICWALLJUMP3
S_SUPERSONICWALLJUMP4


Thing MT_STOMPDUST
MAPTHINGNUM = -1
SPAWNSTATE = S_XPLD1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 0
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = 0
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 20*FRACUNIT
RADIUS = 16*FRACUNIT
HEIGHT = 32*FRACUNIT
MASS = 0
DAMAGE = 0
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_MISSILE|MF_NOGRAVITY|MF_NOBLOCKMAP


State S_SPRK1
Duration = 0
Next = 0
Action A_SpawnObjectRelative
Var2 = MT_SPARK

object MT_SPARK
SpawnState = S_FAKESPARK

State S_FAKESPARK
Spritenumber = 195
Spritesubnumber = tr_trans40
Duration = 1
Action None
Next = S_SPRK2

Thing MT_MTHOK
MAPTHINGNUM = -1
SPAWNSTATE = S_MTHOK
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = 0
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 8
RADIUS = 2097152
HEIGHT = 4194304
MASS = 16
DAMAGE = 0
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NOGRAVITY|MF_NOCLIP|MF_SCENERY|MF_NOBLOCKMAP

FRAME S_MTHOK
SPRITENAME = THOK
SPRITEFRAME = A
Spritesubnumber = tr_trans60
DURATION = 3
NEXT = S_NULL
ACTION NONE
VAR1 = 0
VAR2 = 0

Thing MT_PLACEHOLDERSONICWALLJUMP
MAPTHINGNUM = -1
SPAWNSTATE = S_PLACEHOLDERSONICWALLJUMP1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 1
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_PLACEHOLDERSONICWALLJUMP7
DEATHSOUND = 0
XDEATHSTATE = S_PLACEHOLDERSONICWALLJUMP7
SPEED = 20*FRACUNIT
RADIUS = 11*FRACUNIT
HEIGHT = 8*FRACUNIT
MASS = 100
DAMAGE = -20*FRACUNIT
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_RUNSPAWNFUNC

#Boring spawn frame.

FRAME S_PLACEHOLDERSONICWALLJUMP1
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP2
ACTION A_FindTarget
VAR1 = MT_PLAYER
VAR2 = 0

#Capechase the player so it's ready to spawn objects on him, so they collide with him.

FRAME S_PLACEHOLDERSONICWALLJUMP2
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP3
ACTION A_CapeChase
VAR1 = 0
VAR2 = 0

#Move the object in front of Sonic to check for walls?

FRAME S_PLACEHOLDERSONICWALLJUMP3
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP4
ACTION A_MoveRelative
VAR1 = 0
VAR2 = 5

#Make into a missile to collide with walls.

FRAME S_PLACEHOLDERSONICWALLJUMP4
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP5
ACTION A_SetObjectFlags
VAR1 = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE
VAR2 = 0

#Otherwise turn into a useless crap nothingness item.

FRAME S_PLACEHOLDERSONICWALLJUMP5
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP6
ACTION A_SetObjectFlags
VAR1 = 0
VAR2 = 0

#Object didn't find anything to die against, so spawn the Sonic's Stomp object.

FRAME S_PLACEHOLDERSONICWALLJUMP6
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 35
NEXT = S_NULL
ACTION A_SpawnObjectRelative
VAR1 = 0
VAR2 = 0

#Object died! Spawn walljump object.

FRAME S_PLACEHOLDERSONICWALLJUMP7
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_PLACEHOLDERSONICWALLJUMP8
ACTION A_SPAWNSONICWALLJUMPOBJECT
VAR1 = MT_SONICWALLJUMP
VAR2 = MT_SUPERSONICWALLJUMP

#Call the next frame's action so the player plays a jump noise for walljump only.

FRAME S_PLACEHOLDERSONICWALLJUMP8
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 3
NEXT = S_PLACEHOLDERSONICWALLJUMP9
ACTION A_RemoteAction
VAR1 = -1
VAR2 = S_PLACEHOLDERSONICWALLJUMP10

FRAME S_PLACEHOLDERSONICWALLJUMP9
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_NULL
ACTION A_RemoteAction
VAR1 = -1
VAR2 = S_PLACEHOLDERSONICWALLJUMP11

FRAME S_PLACEHOLDERSONICWALLJUMP10
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 35
NEXT = S_NULL
ACTION A_PlaySound
VAR1 = SFX_S3K4C
VAR2 = 1

FRAME S_PLACEHOLDERSONICWALLJUMP11
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 35
NEXT = S_NULL
ACTION A_PlaySound
VAR1 = SFX_JUMP
VAR2 = 1

#Walljump springy object.

Thing MT_SONICWALLJUMP
MAPTHINGNUM = -1
SPAWNSTATE = S_SONICWALLJUMP1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 1
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = 0
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 0
RADIUS = 20*FRACUNIT
HEIGHT = 16*FRACUNIT
MASS = 15*FRACUNIT
DAMAGE = -10*FRACUNIT
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_RUNSPAWNFUNC

#Another spawn frame.

FRAME S_SONICWALLJUMP1
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SONICWALLJUMP2
ACTION None
VAR1 = 0
VAR2 = 0

#Find the nearest player, being Sonic himself.

FRAME S_SONICWALLJUMP2
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SONICWALLJUMP3
ACTION A_FindTarget
VAR1 = MT_PLAYER
VAR2 = 0

#Now connect to him so it effects him, sometimes will effect other objects and players, but works anyways.

FRAME S_SONICWALLJUMP3
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SONICWALLJUMP4
ACTION A_CapeChase
VAR1 = 0
VAR2 = 0

#Become a spring!

FRAME S_SONICWALLJUMP4
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SONICWALLJUMP5
ACTION A_SetObjectFlags
VAR1 = MF_SOLID|MF_SPRING
VAR2 = 0

FRAME S_SONICWALLJUMP5
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 2
NEXT = S_NULL
ACTION NONE
VAR1 = 0
VAR2 = 0

#Super verion of the Walljump springy object.

Thing MT_SUPERSONICWALLJUMP
MAPTHINGNUM = -1
SPAWNSTATE = S_SUPERSONICWALLJUMP1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 1
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = 0
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 0
RADIUS = 20*FRACUNIT
HEIGHT = 16*FRACUNIT
MASS = 30*FRACUNIT
DAMAGE = -30*FRACUNIT
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_RUNSPAWNFUNC

#Another spawn frame.

FRAME S_SUPERSONICWALLJUMP1
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SUPERSONICWALLJUMP2
ACTION None
VAR1 = 0
VAR2 = 0

#Find the nearest player, being Sonic himself.

FRAME S_SUPERSONICWALLJUMP2
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SUPERSONICWALLJUMP3
ACTION A_FindTarget
VAR1 = MT_PLAYER
VAR2 = 0

#Now connect to him so it effects him, sometimes will effect other objects and players, but works anyways.

FRAME S_SUPERSONICWALLJUMP3
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_SUPERSONICWALLJUMP4
ACTION A_CapeChase
VAR1 = 0
VAR2 = 0

#Become a spring!

FRAME S_SUPERSONICWALLJUMP4
SPRITENAME = NULL
SPRITEFRAME = A
DURATION = 1
NEXT = S_NULL
ACTION A_SetObjectFlags
VAR1 = MF_SOLID|MF_SPRING
VAR2 = 0