const int CLR_JESTERRIBBON = 3525;

actor JesterRibbonWep_NormalBar : NormalBar { args 226, 178 }

actor JesterRibbonWep : BaseMM8BDMWep
{
Weapon.AmmoUse 2
Weapon.AmmoGive 28
Weapon.SlotNumber 4
Inventory.Pickupmessage "$PU_JESTERRIBBON"
Obituary "$OB_JESTERRIBBON"
Tag "$TAG_JESTERRIBBON"
weapon.ammotype "JesterRibbonAmmo"
inventory.icon "JSRIICO"
States
{
SpawnLoop:
JSRI X -1
loop
Ready:
JSRI A 0 ACS_NamedExecuteWithResult("core_weaponcolor",CLR_JESTERRIBBON)
JSRI A 1 A_WeaponReady
Goto Ready+1
Deselect:
JSRI A 0
goto DeselectSwap
Select:
JSRI A 0
goto SelectSwap
Fire:
JSRI A 0 A_JumpIfNoAmmo("NoAmmo")
//JSRI BC 3
JSRI C 0 A_SpawnItemEx("JesterRibbonSpawner")
goto Fire2
Fire2:
JSRI A 0 A_TakeInventory("JesterRibbonAmmo",2,TIF_NOTAKEINFINITE)
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI B 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
JSRI C 0 A_PlaySoundEx("weapon/jesterribbon","Weapon")
JSRI C 2
//18 frames total
JSRI CBA 5
JSRI A 0 A_Refire
Goto Ready+1
AltFire:
JSRI A 0 A_JumpIfNoAmmo("NoAmmo")
//JSRI BC 3
JSRI C 0 A_SpawnItemEx("JesterRibbonSpawnerAlt")
goto Fire2
NoAmmo:
JSRI A 1 ACS_NamedExecuteAlways("core_noammo",0)
Goto Ready+1
}
}

actor JesterRibbonAmmo : Ammo
{
inventory.amount 1
inventory.maxamount 28
+INVENTORY.IGNORESKILL
}

actor JesterRibbonSpawner : ProjSpawnFuncActor
{
PROJECTILE
+NOINTERACTION
+FORCEXYBILLBOARD
args 0, 0
States
{
Spawn:
TNT1 A 0
TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("core_targetexists")==0, "End")
TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 0, 0, WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
TNT1 A 0 A_SpawnItemEx("FireJesterRibbon",0,16,28,0,0,0,(32-args[0]*9),SXF_TRANSFERPOINTERS|SXF_TRANSFERSPECIAL)
TNT1 AA 1 A_Warp(AAPTR_TARGET, 0, 0, 0, 0, WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
TNT1 A 0 A_SetArg(0,args[0]+1)
TNT1 A 0 A_JumpIf(args[0]>8,"End")
loop
End:
TNT1 A 0
stop
}
}

actor FireJesterRibbon : BasicProjectile
{
damage (0)
height 1
radius 1
States
{
Spawn:
TNT1 A 0
TNT1 A 0 A_SpawnItemEx("JesterRibbon",0,0,0,0,0,0,0,SXF_TRANSFERPOINTERS|SXF_TRANSFERSPECIAL)
TNT1 A 0 A_JumpIfInTargetInventory("PowerSpreadRune", 1, "SpreadR")
stop
SpreadR:
TNT1 A 0 A_SpawnItemEx("JesterRibbon",0,0,0,0,0,0,-30,SXF_TRANSFERPOINTERS|SXF_TRANSFERSPECIAL)
TNT1 A 0 A_SpawnItemEx("JesterRibbon",0,0,0,0,0,0,30,SXF_TRANSFERPOINTERS|SXF_TRANSFERSPECIAL)
stop
}
}

actor JesterRibbon : BasicProjectile
{
damage (0)
height 1
radius 1
states
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteWithResult("core_targetyawpitch",0)
TNT1 A 0 A_JumpIf(args[0]%4==3,"Beam4")
TNT1 A 0 A_JumpIf(args[0]%4==2,"Beam3")
TNT1 A 0 A_JumpIf(args[0]%4==1,"Beam2")
Goto Beam
Beam:
TNT1 A 0 A_JumpIf(args[1]==1,"BeamAlt")
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",56*cos(pitch),8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",80*cos(pitch),-12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",104*cos(pitch),-28,-104*sin(pitch),0,0,0,0)
stop
Beam2:
TNT1 A 0 A_JumpIf(args[1]==1,"Beam2Alt")
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",56*cos(pitch),8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",80*cos(pitch),-12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",104*cos(pitch),-28,-104*sin(pitch),0,0,0,0)
stop
Beam3:
TNT1 A 0 A_JumpIf(args[1]==1,"Beam3Alt")
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",56*cos(pitch),8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",80*cos(pitch),-12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",104*cos(pitch),-28,-104*sin(pitch),0,0,0,0)
stop
Beam4:
TNT1 A 0 A_JumpIf(args[1]==1,"Beam4Alt")
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",56*cos(pitch),8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",80*cos(pitch),-12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",104*cos(pitch),-28,-104*sin(pitch),0,0,0,0)
stop

BeamAlt:
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",56*cos(pitch),-8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",80*cos(pitch),12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",104*cos(pitch),28,-104*sin(pitch),0,0,0,0)
stop
Beam2Alt:
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",56*cos(pitch),-8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",80*cos(pitch),12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",104*cos(pitch),28,-104*sin(pitch),0,0,0,0)
stop
Beam3Alt:
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",56*cos(pitch),-8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",80*cos(pitch),12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",104*cos(pitch),28,-104*sin(pitch),0,0,0,0)
stop
Beam4Alt:
TNT1 A 0 A_SpawnItemEx("JesterRibbonD",32*cos(pitch),0,-32*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonA",56*cos(pitch),-8,-56*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonB",80*cos(pitch),12,-80*sin(pitch),0,0,0,0)
TNT1 A 0 A_SpawnItemEx("JesterRibbonC",104*cos(pitch),28,-104*sin(pitch),0,0,0,0)
stop
}
}

actor JesterRibbonElectrify : ElectrifyEffect {args 16}

actor JesterRibbonA : BasicProjectile
{
+FORCEXYBILLBOARD
+BRIGHT
+RIPPER
Radius 16
Height 16
damage (CallACS("basinofweps_cbm_damage", 2))
damagetype "JesterRibbon"
Obituary "$OB_JESTERRIBBON"
Translation "192:192=226:226", "198:198=178:178"
States
{
Spawn:
JSRI D 0
JSRI D 2
goto Death
Death:
TNT1 A 0
TNT1 A 0 A_SpawnItemEx("JesterRibbonElectrify")
stop
}
}
actor JesterRibbonB : JesterRibbonA
{
States
{
Spawn:
JSRI E 0
JSRI E 0 A_SpawnItemEx("JesterRibbonFX")
JSRI E 2
goto Death
}
}
actor JesterRibbonC : JesterRibbonA
{
States
{
Spawn:
JSRI F 0
JSRI F 0 A_SpawnItemEx("JesterRibbonFX2")
JSRI F 2
goto Death
}
}
actor JesterRibbonD : JesterRibbonA
{
States
{
Spawn:
JSRI G 0
JSRI G 0 A_SpawnItemEx("JesterRibbonFX3")
JSRI G 2
goto Death
}
}

actor JesterRibbonFX : BasicGraphicEffect
{
+FORCEXYBILLBOARD
+BRIGHT
Translation "192:192=226:226", "198:198=178:178"
States
{
SpawnFrame:
TNT1 A 0
JSRI H 2
stop
}
}
actor JesterRibbonFX2 : JesterRibbonFX
{
States
{
SpawnFrame:
TNT1 A 0
JSRI I 2
stop
}
}
actor JesterRibbonFX3 : JesterRibbonFX
{
States
{
SpawnFrame:
TNT1 A 0
JSRI J 2
stop
}
}

actor JesterRibbonSpawnerAlt : JesterRibbonSpawner
{
args 0, 1
States
{
Spawn:
TNT1 A 0
TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("core_targetexists")==0, "End")
TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 0, 0, WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
TNT1 A 0 A_SpawnItemEx("FireJesterRibbon",0,16,28,0,0,0,(-32+args[0]*9),SXF_TRANSFERPOINTERS|SXF_TRANSFERSPECIAL)
TNT1 AA 1 A_Warp(AAPTR_TARGET, 0, 0, 0, 0, WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
TNT1 A 0 A_SetArg(0,args[0]+1)
TNT1 A 0 A_JumpIf(args[0]>8,"End")
loop
End:
TNT1 A 0
stop
}
}

//reserved for future balancing
actor JesterRibbonProtect : PowerProtection
{
Powerup.Duration 3
DamageFactor "JesterRibbon", 0.5
}