Spreadgun can now be unloaded and left empty (hold altfire + tap fire).

Buffed golden shell splash damage.
This commit is contained in:
Mari the Deer 2021-02-03 18:13:49 +01:00
commit f353a056a1
12 changed files with 256 additions and 69 deletions

View file

@ -19,11 +19,6 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after
- Lithium - Volume One *(A work of art, one of the finest graphic novels)*
- Manarock *("A delicacy for gods, but instantly deadly for mortals")*
- Rubber Duck *("Is this some kind of convoluted joke from those two?")*
* **Original English Voice Acting:**
- Demolitionist
- Ibuki
- Saya
- Kirin
* ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff**
* **Leaning and a lot of other stuff involving ViewAngles and ViewPos**
* **Crouch sliding *(+ proper crouch dashing)***
@ -40,9 +35,14 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after
- **[Heretic]** Interstellar Demolitionist (a somewhat simple vertical SHMUP, kinda Touhou styled)
- **[Hexen]** Demolition Quest (a JRPG, kinda like early FF / BoF)
* **Mothgirl summon for Lämp easter egg**
* **Ibuki companion add-on *(w/ optional "stream friendly" clothing)***
* **Saya model, for scenes or something idk *(maybe a companion add-on too)***
* ***(Maybe)* Kirin model???**
* **Ibuki companion add-on**
* **Saya companion add-on**
* **Kirin companion add-on *(Hexen-exclusive)***
* **Original English Voice Acting:**
- Demolitionist
- Ibuki
- Saya
- Kirin
* **Japanese localization???**
* **Strife support, with rewritten dialogue**
* **Monster/decoration replacements add-on**

View file

@ -108,7 +108,7 @@ Coming from the **Doom** modding side of things, this gun really packs a punch,
**Primary fire:** Fires, duh. Depending on the loaded ammo the effects may vary.
**Secondary fire:** Switches ammo type for the next shot to be loaded.
**Secondary fire:** On tap, switches ammo type for the next shot to be loaded. On hold, also tap primary fire to unload the current shell, but leave the gun empty.
**Reload:** Unload the current shell and load a new one. Unspent shells are re-added to their respective ammo type pool (or dropped if you can't hold more).

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r251 \cu(Wed 3 Feb 13:58:22 CET 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r251 \cu(2021-02-03 13:58:22)\c-";
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r252 \cu(Wed 3 Feb 18:13:49 CET 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r252 \cu(2021-02-03 18:13:49)\c-";

View file

@ -34,7 +34,7 @@ The wide range of compatible ammunition types makes the Spreadgun a rather versa
\cfPrimary Fire:\c- Shoot the loaded shell.
\cfSecondary Fire:\c- Select the next ammo type to be used on reload.
\cfSecondary Fire:\c- Tap to select the next ammo type to be used on reload. Hold and then press primary fire to unload the current shell and leave the weapon empty.
\cfReloading:\c- Unload the current shell and load a new one. If the loaded shell was not spent, it will be returned to its ammo pool. Should there not be enough storage space for it, it will be dropped on the ground instead.

View file

@ -30,7 +30,7 @@ El amplio rango de munición compatible hace del Trabuco un arma bastante versá
\cfFuego Primario:\c- Dispara el cartucho cargado.
\cfFuego Secundario:\c- Elige el tipo de munición a usar en la siguiente recarga.
\cfFuego Secundario:\c- Pulsa para elegir el tipo de munición a usar en la siguiente recarga. Mantén y luego pulsa fuego primario para retirar el cartucho actual y dejar el arma vacía.
\cfRecarga:\c- Retira el cartucho actual y carga uno nuevo. Si el cartucho cargado no fue gastado, se devolverá a su pila de munición. Si no queda suficiente espacio para almacenarlo, se dejará caer en el suelo.

View file

@ -201,36 +201,36 @@ Model "Spreadgun"
// buckshot
Scale 0.13 0.13 0.13
Skin 2 "ShotgMuz.png"
FrameIndex XZWZ A 2 0
FrameIndex XZW0 A 2 0
// slug
Scale 0.08 0.08 0.08
Skin 2 "ShotgMuz.png"
FrameIndex XZWZ B 2 0
FrameIndex XZW0 B 2 0
// dragon
Scale 0.12 0.12 0.12
Skin 2 "ShotgMuz.png"
FrameIndex XZWZ C 2 0
FrameIndex XZW0 C 2 0
// kinylum
Scale 0.13 0.13 0.13
Skin 2 "ShotgMuzSalt.png"
FrameIndex XZWZ D 2 0
FrameIndex XZW0 D 2 0
// flechettes
Scale 0.1 0.1 0.1
Skin 2 "ShotgMuz.png"
FrameIndex XZWZ E 2 0
FrameIndex XZW0 E 2 0
// ball
Scale 0.06 0.06 0.06
Skin 2 "ShotgMuz.png"
FrameIndex XZWZ F 2 0
FrameIndex XZW0 F 2 0
// gold
Scale 0.2 0.2 0.2
Skin 2 "GoldMuz.png"
FrameIndex XZWZ G 2 0
FrameIndex XZW0 G 2 0
}
// AAAAAAAAAAAA
// We really need a scripted way of changing surface skins so I don't have
// to do this. Hell this damn thing almost exhausted all the dummy sprite names
// to do this. Hell this damn thing uses ALL current dummy sprite names (though not all 936 frames)
Model "Spreadgun"
{
Path "models"
@ -1204,4 +1204,67 @@ Model "Spreadgun"
FrameIndex XZWY A 1 229
FrameIndex XZWY B 1 230
SurfaceSkin 1 4 ""
// Empty Unload
FrameIndex XZWY C 1 232
FrameIndex XZWY D 1 233
FrameIndex XZWY E 1 234
FrameIndex XZWY F 1 235
FrameIndex XZWY G 1 236
FrameIndex XZWY H 1 237
FrameIndex XZWY I 1 238
FrameIndex XZWY J 1 239
FrameIndex XZWY K 1 240
FrameIndex XZWY L 1 241
FrameIndex XZWY M 1 242
FrameIndex XZWY N 1 243
FrameIndex XZWY O 1 244
FrameIndex XZWY P 1 245
FrameIndex XZWY Q 1 246
FrameIndex XZWY R 1 247
FrameIndex XZWY S 1 248
FrameIndex XZWY T 1 249
FrameIndex XZWY U 1 250
// Empty Load
FrameIndex XZWY V 1 251
FrameIndex XZWY W 1 252
FrameIndex XZWY X 1 253
FrameIndex XZWY Y 1 254
FrameIndex XZWY Z 1 255
FrameIndex XZWZ A 1 256
FrameIndex XZWZ B 1 257
FrameIndex XZWZ C 1 258
FrameIndex XZWZ D 1 259
FrameIndex XZWZ E 1 260
FrameIndex XZWZ F 1 261
FrameIndex XZWZ G 1 262
FrameIndex XZWZ H 1 263
FrameIndex XZWZ I 1 264
FrameIndex XZWZ J 1 265
FrameIndex XZWZ K 1 266
FrameIndex XZWZ L 1 267
FrameIndex XZWZ M 1 268
FrameIndex XZWZ N 1 269
FrameIndex XZWZ O 1 270
// Empty Load (Fired)
FrameIndex XZWZ P 1 272
FrameIndex XZWZ Q 1 273
FrameIndex XZWZ R 1 274
FrameIndex XZWZ S 1 275
FrameIndex XZWZ T 1 276
FrameIndex XZWZ U 1 277
FrameIndex XZWZ V 1 278
FrameIndex XZWZ W 1 279
FrameIndex XZWZ X 1 280
FrameIndex XZWZ Y 1 281
FrameIndex XZWZ Z 1 282
FrameIndex XZW0 H 1 283
FrameIndex XZW0 I 1 284
FrameIndex XZW0 J 1 285
FrameIndex XZW0 K 1 286
FrameIndex XZW0 L 1 287
FrameIndex XZW0 M 1 288
FrameIndex XZW0 N 1 289
FrameIndex XZW0 O 1 290
FrameIndex XZW0 P 1 291
FrameIndex XZW0 Q 1 292
}

Binary file not shown.

Binary file not shown.

View file

@ -1498,6 +1498,40 @@ Class GExploLight2 : PaletteLight
}
}
Class GExploRing : Actor
{
Default
{
RenderStyle "Add";
Scale 8.;
Radius 0.1;
Height 0;
+NOGRAVITY;
+NOBLOCKMAP;
+FORCEXYBILLBOARD;
+NOTELEPORT;
+NOINTERACTION;
}
override void Tick()
{
if ( isFrozen() ) return;
if ( !CheckNoDelay() || (tics == -1) ) return;
if ( tics > 0 ) tics--;
while ( !tics )
{
if ( !SetState(CurState.NextState) )
return;
}
}
States
{
Spawn:
XRG0 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.05);
Stop;
}
}
Class GoldenImpact : Actor
{
Default
@ -1520,7 +1554,7 @@ Class GoldenImpact : Actor
{
Super.PostBeginPlay();
A_AlertMonsters(swwm_uncapalert?0:40000);
SWWMUtility.DoExplosion(self,777,40000,600,500,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,777,90000,600,500,DE_EXTRAZTHRUST);
A_QuakeEx(9,9,9,40,0,5000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollintensity:1.5);
A_StartSound("spreadgun/goldexpl",CHAN_VOICE,attenuation:.3);
A_StartSound("spreadgun/goldexpl",CHAN_WEAPON,attenuation:.15);
@ -1528,15 +1562,15 @@ Class GoldenImpact : Actor
Scale *= FRandom[ExploS](0.8,1.1);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
int numpt = Random[ExploS](10,20);
int numpt = Random[ExploS](30,40);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,9);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](64,224)+Color(30,25,0));
s.special1 = Random[ExploS](3,5);
s.scale *= 3.;
s.special1 = Random[ExploS](3,6);
s.scale *= 3.5;
s.alpha *= .8;
}
numpt = Random[ExploS](8,12);
@ -1563,18 +1597,20 @@ Class GoldenImpact : Actor
s.vel = pvel;
}
Spawn("GExploLight",pos);
let r = Spawn("GExploRing",pos);
}
action void A_GoldSpread()
{
special1++;
if ( (special1%3) || (special1 > 20) ) return;
if ( (special1%4) || (special1 > 30) ) return;
SWWMUtility.DoExplosion(self,777,90000,600-special1*15,500-special1*15,DE_EXTRAZTHRUST);
FLineTraceData d;
Vector3 HitNormal;
Vector3 origin;
double ang, pt;
for ( int i=0; i<6; i++ )
{
double totaldist = 30+(special1**2.)*1.2;
double totaldist = 30+(special1**2.)*.4;
ang = FRandom[ExploS](0,360);
pt = FRandom[ExploS](-90,90);
origin = pos;
@ -1627,12 +1663,7 @@ Class GoldenImpact : Actor
{
Spawn:
XEX1 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]] 1 Bright A_GoldSpread();
TNT1 A 1
{
A_GoldSpread();
if ( special1 > 20 ) Destroy();
}
Wait;
Stop;
}
}
@ -1658,21 +1689,21 @@ Class GoldenSubImpact : Actor
override void PostBeginPlay()
{
Super.PostBeginPlay();
SWWMUtility.DoExplosion(self,77,30000,400,300,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,77,80000,500,400,DE_EXTRAZTHRUST);
A_QuakeEx(7,7,7,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollintensity:.8);
A_SprayDecal("BigRocketBlast",-172);
Scale *= FRandom[ExploS](0.8,1.1);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
int numpt = Random[ExploS](3,8);
int numpt = Random[ExploS](6,10);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,9);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](64,224)+Color(30,25,0));
s.special1 = Random[ExploS](2,3);
s.scale *= 2.2;
s.special1 = Random[ExploS](2,4);
s.scale *= 2.6;
s.alpha *= .5;
}
numpt = Random[ExploS](4,6);
@ -1703,14 +1734,15 @@ Class GoldenSubImpact : Actor
action void A_GoldSubSpread()
{
special1++;
if ( (special1%2) || (special1 > 10) ) return;
if ( (special1%2) || (special1 > 20) ) return;
SWWMUtility.DoExplosion(self,77,80000,500-special1*10,400-special1*10,DE_EXTRAZTHRUST);
FLineTraceData d;
Vector3 HitNormal;
Vector3 origin;
double ang, pt;
for ( int i=0; i<3; i++ )
{
double totaldist = 20+(special1**2.)*.8;
double totaldist = 20+(special1**2.)*.2;
ang = FRandom[ExploS](0,360);
pt = FRandom[ExploS](-90,90);
origin = pos;
@ -1763,11 +1795,6 @@ Class GoldenSubImpact : Actor
{
Spawn:
XEX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright A_GoldSubSpread();
TNT1 A 1
{
A_GoldSubSpread();
if ( special1 > 10 ) Destroy();
}
Stop;
}
}
@ -1794,24 +1821,30 @@ Class GoldenSubSubImpact : Actor
override void PostBeginPlay()
{
Super.PostBeginPlay();
SWWMUtility.DoExplosion(self,7,20000,200,100,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,7,70000,400,300,DE_EXTRAZTHRUST);
A_QuakeEx(4,4,4,15,0,1000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:100,rollintensity:.4);
A_SprayDecal("RocketBlast",-172);
Scale *= FRandom[ExploS](0.8,1.1);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
int numpt = Random[ExploS](1,2);
int numpt = Random[ExploS](2,4);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,3);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](64,224)+Color(30,25,0));
s.special1 = Random[ExploS](0,2);
s.special1 = Random[ExploS](0,3);
s.scale *= 1.6;
s.alpha *= .2;
}
}
action void A_GoldSubSubSpread()
{
special1++;
if ( (special1%2) || (special1 > 10) ) return;
SWWMUtility.DoExplosion(self,7,70000,400-special1*5,300-special1*5,DE_EXTRAZTHRUST);
}
override void Tick()
{
if ( isFrozen() ) return;
@ -1826,7 +1859,7 @@ Class GoldenSubSubImpact : Actor
States
{
Spawn:
XEX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright;
XEX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright A_GoldSubSubSpread();
Stop;
}
}
@ -1834,7 +1867,10 @@ Class GoldenSubSubImpact : Actor
Class Spreadgun : SWWMWeapon
{
bool fired; // shell was used
bool chambered; // a shell is actually loaded
bool emptyup; // next reload will keep the chamber empty
Class<Ammo> loadammo, nextammo; // currently loaded shell, next shell to load
bool initialized;
transient ui TextureID WeaponBox, AmmoIcon[7], LoadedIcon[7];
transient ui Font TewiFont;
@ -1888,6 +1924,7 @@ Class Spreadgun : SWWMWeapon
ox = 33;
}
}
if ( !chambered ) return;
for ( int i=0; i<7; i++ )
{
if ( loadammo != types[i] ) continue;
@ -1900,7 +1937,7 @@ Class Spreadgun : SWWMWeapon
{
static const Class<Ammo> types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"};
for ( int i=0; i<7; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true;
return !fired;
return (!fired && chambered);
}
override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount )
@ -1908,7 +1945,7 @@ Class Spreadgun : SWWMWeapon
static const Class<Ammo> types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"};
if ( (firemode == PrimaryFire) || (firemode == AltFire) )
{
if ( !fired ) return true;
if ( !fired && chambered ) return true;
for ( int i=0; i<7; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true;
return false;
}
@ -1934,9 +1971,11 @@ Class Spreadgun : SWWMWeapon
amidx = i;
break;
}
if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx]));
if ( !invoker.chambered ) player.SetPSprite(PSP_WEAPON,invoker.FindState("UnloadEmpty")); // no "fired" one for this, as it can never happen
else if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx]));
else player.SetPSprite(PSP_WEAPON,invoker.FindState(firedstates[amidx]));
A_Overlay(-9999,"UnloadDummy");
if ( invoker.chambered ) A_Overlay(-9999,"UnloadDummy");
else A_Overlay(-9999,"UnloadDummyEmpty");
A_StartSound("spreadgun/deselect",CHAN_WEAPON,CHANF_OVERLAP);
}
@ -1952,14 +1991,21 @@ Class Spreadgun : SWWMWeapon
amidx = i;
break;
}
if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx]));
if ( invoker.emptyup )
{
if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState("LoadEmpty"));
else player.SetPSprite(PSP_WEAPON,invoker.FindState("LoadEmptyFired"));
}
else if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx]));
else player.SetPSprite(PSP_WEAPON,invoker.FindState(firedstates[amidx]));
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
if ( !invoker.emptyup && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
{
let amo = FindInventory(invoker.nextammo);
if ( amo && (amo.Amount > 0) ) amo.Amount--;
}
A_Overlay(-9999,"LoadDummy");
if ( invoker.emptyup ) A_Overlay(-9999,"LoadDummyEmpty");
else A_Overlay(-9999,"LoadDummy");
invoker.emptyup = false;
}
action void A_DropShell()
@ -2347,6 +2393,7 @@ Class Spreadgun : SWWMWeapon
action void A_LoadShell()
{
A_StartSound("spreadgun/shellin",CHAN_WEAPON,CHANF_OVERLAP);
invoker.chambered = true;
invoker.loadammo = invoker.nextammo;
}
@ -2363,7 +2410,7 @@ Class Spreadgun : SWWMWeapon
{
bool good = Super.PickupForAmmoSWWM(ownedWeapon);
let Owner = ownedWeapon.Owner;
if ( (AmmoGive1 == 0) && loadammo && !fired )
if ( (AmmoGive1 == 0) && loadammo && !fired && chambered )
{
let cur = Owner.FindInventory(loadammo);
if ( !cur )
@ -2384,7 +2431,13 @@ Class Spreadgun : SWWMWeapon
{
static const Class<Ammo> types[] = {"RedShell","GreenShell","WhiteShell","BlueShell","BlackShell","PurpleShell","GoldShell"};
Super.AttachToOwner(other);
if ( !loadammo ) loadammo = "RedShell";
if ( !initialized )
{
initialized = true;
if ( !loadammo ) loadammo = "RedShell";
fired = false;
chambered = true;
}
for ( int i=0; i<7; i++ )
{
Ammo a = Ammo(other.FindInventory(types[i]));
@ -2445,7 +2498,15 @@ Class Spreadgun : SWWMWeapon
action void A_AltHold()
{
A_WeaponReady(WRF_NOFIRE);
// tap fire to unload round
if ( invoker.chambered && (player.cmd.buttons&BT_ATTACK) )
{
invoker.emptyup = true;
player.SetPSPrite(PSP_WEAPON,invoker.FindState("Reload"));
return;
}
if ( player.cmd.buttons&BT_ALTATTACK ) return;
A_SwitchAmmoType();
if ( !invoker.fired ) player.SetPSPrite(PSP_WEAPON,invoker.FindState("Ready"));
else player.SetPSPrite(PSP_WEAPON,invoker.FindState("ReadyFired"));
}
@ -2514,6 +2575,7 @@ Class Spreadgun : SWWMWeapon
if ( invoker.nextammo && (CountInv(invoker.nextammo) > 0) && (invoker.loadammo != invoker.nextammo) )
flg |= WRF_ALLOWRELOAD;
A_WeaponReady(flg);
return ResolveState(null);
}
Wait;
ReadyFired:
@ -2527,12 +2589,13 @@ Class Spreadgun : SWWMWeapon
A_WeaponReady(flg);
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
invoker.CheckAmmo(EitherFire,true);
return ResolveState(null);
}
Wait;
Fire:
#### # 1
{
if ( invoker.fired ) return ResolveState("Reload");
if ( invoker.fired || !invoker.chambered ) return ResolveState("Reload");
A_FireShell();
return ResolveState(null);
}
@ -2540,7 +2603,6 @@ Class Spreadgun : SWWMWeapon
XZW2 VWXY 2;
Goto ReadyFired;
AltFire:
#### # 1 A_SwitchAmmoType();
#### # 1 A_AltHold();
Wait;
Reload:
@ -2552,9 +2614,17 @@ Class Spreadgun : SWWMWeapon
Stop;
UnloadDummy: // overlay with shared functions for all unload anims
TNT1 A 11;
TNT1 A 14 A_StartSound("spreadgun/open",CHAN_WEAPON,CHANF_OVERLAP);
TNT1 A 14
{
invoker.chambered = false;
A_StartSound("spreadgun/open",CHAN_WEAPON,CHANF_OVERLAP);
}
TNT1 A 1 A_DropShell();
Stop;
UnloadDummyEmpty:
TNT1 A 11;
TNT1 A 14 A_StartSound("spreadgun/open",CHAN_WEAPON,CHANF_OVERLAP);
Stop;
UnloadRedFired:
XZW2 Z 2;
XZW3 QRST 2;
@ -2648,6 +2718,11 @@ Class Spreadgun : SWWMWeapon
XZWP ABCDE 1;
XZWW V 1;
Goto Reload2;
UnloadEmpty:
XZW2 A 2;
XZWY CDEF 2;
XZWY GHIJKLMNOPQRSTU 1;
Goto Reload2;
Reload2:
#### # 1 A_SelectLoadState();
Stop;
@ -2658,6 +2733,12 @@ Class Spreadgun : SWWMWeapon
TNT1 A 2 A_Prime();
TNT1 A 1 { invoker.PlayUpSound(self); }
Stop;
LoadDummyEmpty:
TNT1 A 9;
TNT1 A 2 A_StartSound("spreadgun/close",CHAN_WEAPON,CHANF_OVERLAP);
TNT1 A 2 A_Prime();
TNT1 A 1 { invoker.PlayUpSound(self); }
Stop;
LoadRedFired:
XZW8 MNOPQRSTUVWXYZ 1;
XZW9 ABCDEFGHIJKLMNOPQRS 1;
@ -2716,6 +2797,14 @@ Class Spreadgun : SWWMWeapon
XZWX ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
XZWY AB 1;
Goto Ready;
LoadEmpty:
XZWY UVWXYZ 1;
XZWZ ABCDEFGHIJKLMNO 1;
Goto Ready;
LoadEmptyFired:
XZWZ PQRSTUVWXYZ 1;
XZW0 HIJKLMNOPQ 1;
Goto Ready;
Zoom:
XZW2 A 1
{
@ -2779,7 +2868,7 @@ Class Spreadgun : SWWMWeapon
XZWK FGHI 2;
Goto ReadyFired;
FlashRed:
XZWZ A 2 Bright
XZW0 A 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[3] = 120;
@ -2787,7 +2876,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashGreen:
XZWZ B 2 Bright
XZW0 B 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[3] = 90;
@ -2795,7 +2884,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashWhite:
XZWZ C 2 Bright
XZW0 C 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[1] = 176;
@ -2805,7 +2894,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashBlue:
XZWZ D 2 Bright
XZW0 D 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[0] = 96;
@ -2816,7 +2905,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashBlack:
XZWZ E 2 Bright
XZW0 E 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[3] = 60;
@ -2824,7 +2913,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashPurple:
XZWZ F 2 Bright
XZW0 F 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[3] = 60;
@ -2832,7 +2921,7 @@ Class Spreadgun : SWWMWeapon
}
Stop;
FlashGold:
XZWZ G 2 Bright
XZW0 G 2 Bright
{
let l = Spawn("SWWMWeaponLight",pos);
l.args[3] = 300;

View file

@ -408,6 +408,40 @@ Class ExploLight3 : PaletteLight
Args 0,0,0,250;
}
}
Class FatChodeRing : Actor
{
Default
{
RenderStyle "Add";
Scale 3.;
Radius 0.1;
Height 0;
+NOGRAVITY;
+NOBLOCKMAP;
+FORCEXYBILLBOARD;
+NOTELEPORT;
+NOINTERACTION;
}
override void Tick()
{
if ( isFrozen() ) return;
if ( !CheckNoDelay() || (tics == -1) ) return;
if ( tics > 0 ) tics--;
while ( !tics )
{
if ( !SetState(CurState.NextState) )
return;
}
}
States
{
Spawn:
XRG0 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.06);
Stop;
}
}
Class FatChodeImpact : Actor
{
double realangle, realpitch;
@ -491,6 +525,7 @@ Class FatChodeImpact : Actor
e.pitch = asin(-dir.z);
}
Spawn("ExploLight3",pos);
Spawn("FatChodeRing",pos);
}
override void Tick()
{