Class WeaponPowerUp : Inventory { Default { Tag "$T_WPOWERUP"; Inventory.PickupMessage "$I_WPOWERUP"; Inventory.PickupSound "misc/p_pkup"; +COUNTITEM; +INVENTORY.BIGPOWERUP; } override bool TryPickup( in out Actor toucher ) { if ( !toucher.FindInventory("DispersionPistol") ) return false; let damo = DefaultAmmo(toucher.FindInventory("DefaultAmmo")); if ( damo ) { damo.BackpackMaxAmount = damo.MaxAmount = min(90,damo.MaxAmount+10); damo.Amount = min(damo.MaxAmount,damo.Amount+10); } let dpis = DispersionPistol(toucher.FindInventory("DispersionPistol")); if ( dpis && (dpis.pendingupgrade < 4) ) { dpis.pendingupgrade++; if ( toucher.player && (toucher.player.ReadyWeapon == dpis) && (toucher.player.PendingWeapon == WP_NOCHANGE) ) { let psp = toucher.player.FindPSprite(PSP_Weapon); if ( toucher.player.WeaponState&WF_WEAPONREADY ) psp.SetState(dpis.FindState("Upgrade")); } else ScriptUtil.SetWeapon(toucher,"DispersionPistol"); } GoAwayAndDie(); return true; } override void PostBeginPlay() { Super.PostBeginPlay(); tracer = Spawn("WeaponPowerUpX",pos); tracer.angle = angle; tracer.target = self; } States { Spawn: WPOW A -1; Stop; } } Class WeaponPowerUpX : ASMDAmmoX { States { Spawn: WPOW ABCDEFGHIJKLMNOPQRST 3 Bright; Loop; } } Class DefaultAmmo : Ammo { double rechargephase, rechargespeed; Default { Inventory.Icon "I_Disper"; Inventory.Amount 10; Inventory.MaxAmount 50; Ammo.BackpackAmount 0; Ammo.BackpackMaxAmount 50; } override void Tick() { Super.Tick(); if ( !Owner ) return; rechargespeed = max(1.1,0.11*Amount); rechargephase += 1./rechargespeed; if ( rechargephase < 35 ) return; rechargephase = 0; Amount = min(Amount+1,MaxAmount); } } Class DispExLight1 : PaletteLight { Default { Tag "DBlue"; Args 0,0,0,80; ReactionTime 25; } } Class DispExLight2 : PaletteLight { Default { Tag "DGreen"; Args 0,0,0,80; ReactionTime 25; } } Class DispExLight3 : PaletteLight { Default { Tag "DYellow"; Args 0,0,0,80; ReactionTime 25; } } Class DispExLight4 : PaletteLight { Default { Tag "DOrange"; Args 0,0,0,80; ReactionTime 25; } } Class DispExLight5 : PaletteLight { Default { Tag "DRed"; Args 0,0,0,80; ReactionTime 25; } } Class DispBurst1 : ASMDSpark { States { Spawn: DEFB ABCDEFG 1 Bright { A_FadeOut(FRandom[ASMD](0.0,0.3)); vel *= 0.95; } Loop; } } Class DispBurst2 : DispBurst1 { States { Spawn: DEFG ABCDEFG 1 Bright { A_FadeOut(FRandom[ASMD](0.0,0.3)); vel *= 0.95; } Loop; } } Class DispBurst3 : DispBurst1 { States { Spawn: DEFY ABCDEFG 1 Bright { A_FadeOut(FRandom[ASMD](0.0,0.3)); vel *= 0.95; } Loop; } } Class DispBurst4 : DispBurst1 { States { Spawn: DEFO ABCDEFG 1 Bright { A_FadeOut(FRandom[ASMD](0.0,0.3)); vel *= 0.95; } Loop; } } Class DispBurst5 : DispBurst1 { States { Spawn: DEFR ABCDEFG 1 Bright { A_FadeOut(FRandom[ASMD](0.0,0.3)); vel *= 0.95; } Loop; } } Class ViewDispBurst1 : ViewASMDSpark { States { Spawn: DEFB ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); Loop; } } Class ViewDispBurst2 : ViewDispBurst1 { States { Spawn: DEFG ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); Loop; } } Class ViewDispBurst3 : ViewDispBurst1 { States { Spawn: DEFY ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); Loop; } } Class ViewDispBurst4 : ViewDispBurst1 { States { Spawn: DEFO ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); Loop; } } Class ViewDispBurst5 : ViewDispBurst1 { States { Spawn: DEFR ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); Loop; } } Class DispExplo1 : Actor { Default { RenderStyle "Add"; Scale 0.4; +NOGRAVITY; +NOBLOCKMAP; Radius 0.1; Height 0; } override void PostBeginPlay() { Super.PostBeginPlay(); Scale.x *= RandomPick[DPistol](-1,1); Scale.y *= RandomPick[DPistol](-1,1); } States { Spawn: DSEB ABCDEFGHIJ 2 Bright; Stop; } } Class DispExplo2 : DispExplo1 { States { Spawn: DISE ABCDEFGHIJ 2 Bright; Stop; } } Class DispExplo3 : DispExplo1 { States { Spawn: DSEY ABCDEFGHIJ 2 Bright; Stop; } } Class DispExplo4 : DispExplo1 { States { Spawn: DSEO ABCDEFGHIJ 2 Bright; Stop; } } Class DispExplo5 : DispExplo1 { States { Spawn: DSER ABCDEFGHIJ 2 Bright; Stop; } } // yes this is the projectile class name, blame Epic Class DispersionAmmo : Actor { Class LightClass, BurstClass, ExploClass; double mult; Property LightClass : LightClass; Property BurstClass : BurstClass; Property ExploClass : ExploClass; action void A_DispTrail() { Vector3 x, y, z, dir; double a, s; Actor p; [x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll); for ( int i=0; i<3; i++ ) { a = FRandom[DPistol](0,360); s = FRandom[ASMD](0,0.35); dir = (-x+y*cos(a)*s+z*sin(a)*s).unit(); p = Spawn(invoker.BurstClass,level.Vec3Offset(pos,scale.x*(dir*16.+x*32.))); p.A_SetScale(0.1*min(0.8+invoker.mult*0.75,1.5)); p.vel = vel*0.5+dir*FRandom[DPistol](3,8); } } action void A_DispExpl() { UTMainHandler.DoKnockback(tracer,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)),6000); A_AlertMonsters(); A_SprayDecal("RazorBlast",20); Spawn(invoker.LightClass,pos); Actor a; double ang, pt; int numpt = int(Random[DPistol](12,18)*invoker.mult); for ( int i=0; i proj, part; int ulevel = invoker.upgradelevel; if ( !(sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true)) ) { if ( weap.Ammo1.Amount < max(10,invoker.MainUse) ) { weap.Ammo1.Amount -= 1; ulevel = 0; } else weap.Ammo1.Amount -= invoker.MainUse; } switch ( ulevel ) { case 0: proj = "DispersionAmmo"; part = "ViewDispBurst1"; UTMainHandler.DoFlash(self,Color(80,96,64,255),1); A_Overlay(PSP_FLASH,"Flash1"); break; case 1: proj = "DAmmo2"; part = "ViewDispBurst2"; UTMainHandler.DoFlash(self,Color(80,64,255,96),1); A_Overlay(PSP_FLASH,"Flash2"); break; case 2: proj = "DAmmo3"; part = "ViewDispBurst3"; UTMainHandler.DoFlash(self,Color(80,255,255,96),1); A_Overlay(PSP_FLASH,"Flash3"); break; case 3: proj = "DAmmo4"; part = "ViewDispBurst4"; UTMainHandler.DoFlash(self,Color(80,255,160,64),1); A_Overlay(PSP_FLASH,"Flash4"); break; default: proj = "DAmmo5"; part = "ViewDispBurst5"; UTMainHandler.DoFlash(self,Color(80,255,96,64),1); A_Overlay(PSP_FLASH,"Flash5"); break; } A_OverlayFlags(PSP_FLASH,PSPF_RenderStyle,true); A_OverlayRenderstyle(PSP_FLASH,STYLE_Add); UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3),FRandom[DPistol](-0.1,0.3)),2,-0.3,3,SWING_Spring,0,3); if ( !Dampener.Active(self) ) A_AlertMonsters(); A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z; Actor p = Spawn(proj,origin); p.angle = angle; p.pitch = BulletSlope(); p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed; p.target = self; DispersionAmmo(p).mult = mult; int numpt = Random[DPistol](10,20); for ( int i=0; i proj, part; switch ( ulevel ) { case 0: proj = "DispersionAmmo"; part = "ViewDispBurst1"; UTMainHandler.DoFlash(self,Color(80,96,64,255),1); A_Overlay(PSP_FLASH,"Flash1"); break; case 1: proj = "DAmmo2"; part = "ViewDispBurst2"; UTMainHandler.DoFlash(self,Color(80,64,255,96),1); A_Overlay(PSP_FLASH,"Flash2"); break; case 2: proj = "DAmmo3"; part = "ViewDispBurst3"; UTMainHandler.DoFlash(self,Color(80,255,255,96),1); A_Overlay(PSP_FLASH,"Flash3"); break; case 3: proj = "DAmmo4"; part = "ViewDispBurst4"; UTMainHandler.DoFlash(self,Color(80,255,160,64),1); A_Overlay(PSP_FLASH,"Flash4"); break; default: proj = "DAmmo5"; part = "ViewDispBurst5"; UTMainHandler.DoFlash(self,Color(80,255,96,64),1); A_Overlay(PSP_FLASH,"Flash5"); break; } A_OverlayFlags(PSP_FLASH,PSPF_RenderStyle,true); A_OverlayRenderstyle(PSP_FLASH,STYLE_Add); double ss = 0.5+invoker.chargesize*0.3; UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3)*ss,FRandom[DPistol](-0.1,0.3))*ss,2,-0.3,3,SWING_Spring,0,3); if ( !Dampener.Active(self) ) A_AlertMonsters(); int qs = int(1+invoker.chargesize*0.3); A_QuakeEx(qs,qs,qs,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z; Actor p = Spawn(proj,origin); p.angle = angle; p.pitch = BulletSlope(); p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed; p.target = self; p.bAMBUSH = true; double scl = 0.5+invoker.chargesize*0.6; p.scale *= scl; DispersionAmmo(p).mult = scl*mult*1.1; int numpt = Random[DPistol](10,20); for ( int i=0; i= 5. ) return true; if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) ) { if ( weap.Ammo1.Amount < invoker.ChargeUse ) return true; weap.Ammo1.Amount -= invoker.ChargeUse; } return false; } Default { Tag "$T_DPISTOL"; Inventory.PickupMessage "$I_DPISTOL"; Weapon.UpSound "dpistol/select"; Weapon.SlotNumber 1; Weapon.SelectionOrder 2; Weapon.SlotPriority 1; Weapon.AmmoType "DefaultAmmo"; Weapon.AmmoUse 1; Weapon.AmmoType2 "DefaultAmmo"; Weapon.AmmoUse2 1; Weapon.AmmoGive 50; UTWeapon.DropAmmo 25; +WEAPON.WIMPY_WEAPON; } States { Spawn: DPIP A -1; Stop; DPIP B -1; Stop; Ready: DPS1 A 0 { if ( invoker.upgradelevel == 0 ) return ResolveState("Ready1"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Ready2"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Ready3"); else if ( invoker.upgradelevel == 3 ) return ResolveState("Ready4"); return ResolveState("Ready5"); } Ready1: DPS1 ABCDEFGHIJK 2; DPI1 A 5; Goto Idle; Ready2: DPS2 ABCDEFGHIJK 2; DPI2 A 5; Goto Idle; Ready3: DPS3 ABCDEFGHIJK 2; DPI3 A 5; Goto Idle; Ready4: DPS4 ABCDEFGHIJK 2; DPI4 A 5; Goto Idle; Ready5: DPS5 ABCDEFGHIJK 2; DPI5 A 5; Goto Idle; Dummy: TNT1 A 1 { A_CheckReload(); let weap = Weapon(invoker); if ( invoker.pendingupgrade > invoker.upgradelevel ) player.SetPSprite(PSP_WEAPON,ResolveState("Upgrade")); else if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady(); else A_WeaponReady(WRF_NOFIRE); } Wait; Idle: #### # 0 { A_Overlay(-9999,"Dummy"); if ( invoker.upgradelevel == 0 ) return ResolveState("Idle1"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Idle2"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Idle3"); else if ( invoker.upgradelevel == 3 ) return ResolveState("Idle4"); return ResolveState("Idle5"); } Idle1: DPI1 AB 30; Goto Idle1; Idle2: DPI2 AB 30; Goto Idle2; Idle3: DPI3 AB 30; Goto Idle3; Idle4: DPI4 AB 30; Goto Idle4; Idle5: DPI5 AB 30; Goto Idle5; Fire: #### # 0 { A_Overlay(-9999,"Null"); if ( invoker.upgradelevel == 0 ) return ResolveState("Fire1"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Fire2"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Fire3"); else if ( invoker.upgradelevel == 3 ) return ResolveState("Fire4"); return ResolveState("Fire5"); } Fire1: #### # 3 A_DispFire(); DPF1 ABC 5; DPI1 A 5 A_Refire("Fire1"); Goto Idle; Fire2: #### # 3 A_DispFire(); DPF2 ABC 5; DPI2 A 5 A_Refire("Fire2"); Goto Idle; Fire3: #### # 3 A_DispFire(); DPF3 ABC 5; DPI3 A 5 A_Refire("Fire3"); Goto Idle; Fire4: #### # 3 A_DispFire(); DPF4 ABC 5; DPI4 A 5 A_Refire("Fire4"); Goto Idle; Fire5: #### # 3 A_DispFire(); DPF5 ABC 5; DPI5 A 5 A_Refire("Fire5"); Goto Idle; AltFire: #### # 0 { invoker.chargesize = invoker.count = 0.; invoker.bCharging = true; // need to make sure player does the repeat fire anim if ( self is 'UPlayer' ) UPlayer(self).PlayAttacking(); A_PlaySound("dpistol/charge",CHAN_WEAPON,Dampener.Active(self)?.4:1.); A_Overlay(-9999,"Null"); if ( invoker.upgradelevel == 0 ) return ResolveState("AltFire1"); else if ( invoker.upgradelevel == 1 ) return ResolveState("AltFire2"); else if ( invoker.upgradelevel == 2 ) return ResolveState("AltFire3"); else if ( invoker.upgradelevel == 3 ) return ResolveState("AltFire4"); return ResolveState("AltFire5"); } AltFire1: #### # 1 A_JumpIf(A_DispCharge(),2); #### # 0 A_ReFire("AltFire1"); AltRelease1: #### # 3 A_DispAltFire(); DPF1 ABC 8; DPI1 A 6; Goto Idle; AltFire2: #### # 1 A_JumpIf(A_DispCharge(),2); #### # 0 A_ReFire("AltFire2"); AltRelease2: #### # 3 A_DispAltFire(); DPF2 ABC 8; DPI2 A 6; Goto Idle; AltFire3: #### # 1 A_JumpIf(A_DispCharge(),2); #### # 0 A_ReFire("AltFire3"); AltRelease3: #### # 3 A_DispAltFire(); DPF3 ABC 8; DPI3 A 6; Goto Idle; AltFire4: #### # 1 A_JumpIf(A_DispCharge(),2); #### # 0 A_ReFire("AltFire4"); AltRelease4: #### # 3 A_DispAltFire(); DPF4 ABC 8; DPI4 A 6; Goto Idle; AltFire5: #### # 1 A_JumpIf(A_DispCharge(),2); #### # 0 A_ReFire("AltFire5"); AltRelease5: #### # 3 A_DispAltFire(); DPF5 ABC 8; DPI5 A 6; Goto Idle; Upgrade: #### # 1 { A_Overlay(-9999,"Null"); invoker.MainUse = min(6,invoker.upgradelevel+1); invoker.upgradelevel++; if ( invoker.upgradelevel == 0 ) return ResolveState("Idle"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2"); else if ( invoker.upgradelevel == 3 ) return ResolveState("Upgrade3"); return ResolveState("Upgrade4"); } Upgrade1: #### # 0 A_PlaySound("dpistol/up1",CHAN_6,Dampener.Active(self)?.2:1.); DPU1 ABCD 9; DPI2 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade"); Goto Idle; Upgrade2: #### # 0 A_PlaySound("dpistol/up2",CHAN_6,Dampener.Active(self)?.2:1.); DPU2 ABCDEFGHI 9; DPI3 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade"); Goto Idle; Upgrade3: #### # 0 A_PlaySound("dpistol/up3",CHAN_6,Dampener.Active(self)?.2:1.); DPU3 ABCDEFGHI 9; DPI4 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade"); Goto Idle; Upgrade4: #### # 0 A_PlaySound("dpistol/up4",CHAN_6,Dampener.Active(self)?.2:1.); DPU4 ABCDEFGHI 9; DPI5 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade"); Goto Idle; Select: DPS1 A 1 A_Raise(int.max); Wait; Deselect: #### # 0 { A_Overlay(-9999,"Null"); if ( invoker.upgradelevel == 0 ) return ResolveState("Deselect1"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Deselect2"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Deselect3"); else if ( invoker.upgradelevel == 3 ) return ResolveState("Deselect4"); return ResolveState("Deselect5"); } Deselect1: DPD1 ABCDE 2; DPD1 E 1 A_Lower(int.max); Wait; Deselect2: DPD2 ABCDE 2; DPD2 E 1 A_Lower(int.max); Wait; Deselect3: DPD3 ABCDE 2; DPD3 E 1 A_Lower(int.max); Wait; Deselect4: DPD4 ABCDE 2; DPD4 E 1 A_Lower(int.max); Wait; Deselect5: DPD5 ABCDE 2; DPD5 E 1 A_Lower(int.max); Wait; Flash1: DPFF A 2 Bright { let l = Spawn("DispLight1",pos); l.target = self; } Stop; Flash2: DPFF B 2 Bright { let l = Spawn("DispLight2",pos); l.target = self; } Stop; Flash3: DPFF C 2 Bright { let l = Spawn("DispLight3",pos); l.target = self; } Stop; Flash4: DPFF D 2 Bright { let l = Spawn("DispLight4",pos); l.target = self; } Stop; Flash5: DPFF E 2 Bright { let l = Spawn("DispLight5",pos); l.target = self; } Stop; } }