Module dpmod: Change committed

havoc at icculus.org havoc at icculus.org
Thu Jan 29 19:08:24 EST 2004


Commiter   : havoc
CVSROOT    : /cvs/cvsroot/twilight
Module     : dpmod
Commit time: 2004-01-30 00:08:23 UTC

Log message:

more experimental weapon stuff (and yes most of the changes are the addition of a force parameter to T_RadiusDamage and all things which call it, and all things which call those things, and ...)

Modified files:
     qc/bullets.qc qc/damage.qc qc/decals.qc qc/explosion.qc
     qc/fire.qc qc/fireball.qc qc/gore.qc qc/grenade.qc qc/laser.qc
     qc/m_boss.qc qc/m_dog.qc qc/m_enforcer.qc qc/m_fish.qc
     qc/m_hknight.qc qc/m_knight.qc qc/m_ogre.qc qc/m_shalrath.qc
     qc/m_shambler.qc qc/m_soldier.qc qc/m_tarbaby.qc qc/m_wizard.qc
     qc/m_zombie.qc qc/mine.qc qc/misc.qc qc/plasma.qc
     qc/playermovement.qc qc/rocket.qc qc/t_radiusdamage.qc
     qc/trig_original.qc qc/w_system.qc qc/xplowall.qc

------=MIME.f3e8433104f05479d45c36b123246a27
Content-Type: text/plain; name="dpmod.20040130.000823.havoc.diff"
Content-Disposition: attachment; filename="dpmod.20040130.000823.havoc.diff"
Content-Transfer-Encoding: 8bit

Index: dpmod/qc/bullets.qc
diff -u dpmod/qc/bullets.qc:1.5 dpmod/qc/bullets.qc:1.6
--- dpmod/qc/bullets.qc:1.5	Fri Feb 28 00:13:31 2003
+++ dpmod/qc/bullets.qc	Thu Jan 29 19:08:13 2004
@@ -6,7 +6,7 @@
 {
 	local   vector  dir;
 	dir = normalize(self.velocity);
-	T_Damage(other, self, self.realowner, self.dmg, self.count, self.deathtype, self.cnt, self.origin, dir * self.count, self.obitfunc1);
+	T_Damage(other, self, self.realowner, self.dmg, self.count, self.deathtype, self.cnt, self.origin, dir * self.count * 0.2, self.obitfunc1);
 	if (other.solid == SOLID_BSP) // hit a wall
 	if (self.lefty >= 0)
 	if (pointcontents(self.origin) != CONTENT_SKY)
@@ -21,7 +21,7 @@
 	}
 	setorigin(self, self.origin - dir * 8);
 	if (self.count2)
-		BecomeExplosion(self, self.dmg2, self.count2, self.deathtype, '-1 0 0', self.effects & EF_BLUE, self.obitfunc1);
+		BecomeExplosion(self, self.dmg2, self.dmg2, self.count2, self.deathtype, '-1 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	else
 		remove(self);
 };
Index: dpmod/qc/damage.qc
diff -u dpmod/qc/damage.qc:1.7 dpmod/qc/damage.qc:1.8
--- dpmod/qc/damage.qc:1.7	Wed Jan 28 16:40:37 2004
+++ dpmod/qc/damage.qc	Thu Jan 29 19:08:13 2004
@@ -96,18 +96,25 @@
 float   DMG_SOLDIER_SHOTGUN_PELLETS     =    3;
 float   DMG_SOLDIER_SHOTGUN_DAMAGE      =   15;
 float   DMG_SOLDIER_SHOTGUN_BDAMAGE     =   15;
-float   DMG_OGRE_GRENADE                =   60;
+float   DMG_OGRE_GRENADE_DAMAGE         =   60;
+float   DMG_OGRE_GRENADE_FORCE          =   60;
 float   DMG_OGRE_GRENADE_RADIUS         =  100;
-float   DMG_SHALRATH_MISSILE            =   60;
+float   DMG_SHALRATH_MISSILE_DAMAGE     =   60;
+float   DMG_SHALRATH_MISSILE_FORCE      =   60;
 float   DMG_SHALRATH_MISSILE_RADIUS     =  100;
 float   DMG_SHAMBLER_LIGHTNING          =   20;
 float   DMG_ENFORCER_LASER              =   25;
-float   DMG_ENFORCER_PLASMA             =   20;
-float   DMG_ENFORCER_ROCKET             =   60;
+float   DMG_ENFORCER_PLASMA_DAMAGE      =   20;
+float   DMG_ENFORCER_PLASMA_FORCE       =   20;
+float   DMG_ENFORCER_PLASMA_RADIUS      =   20;
+float   DMG_ENFORCER_ROCKET_DAMAGE      =   60;
+float   DMG_ENFORCER_ROCKET_FORCE       =   60;
 float   DMG_ENFORCER_ROCKET_RADIUS      =  100;
-float   DMG_TARBABY                     =   90;
+float   DMG_TARBABY_DAMAGE              =   90;
+float   DMG_TARBABY_FORCE               =   90;
 float   DMG_TARBABY_RADIUS              =  200;
-float   DMG_CHTHON_LAVABALL             =   60;
+float   DMG_CHTHON_LAVABALL_DAMAGE      =   60;
+float   DMG_CHTHON_LAVABALL_FORCE       =   60;
 float   DMG_CHTHON_LAVABALL_RADIUS      =  100;
 float   DMG_ZOMBIE_CHUNK                =   20;
 
@@ -127,4 +134,4 @@
 float MH_ZOMBIE    =   200; // explosives do more damage than normal
 
 void(entity targ, entity inflictor, entity attacker, float damage, float bdamage, string dt, float damgtype, vector damgpoint, vector force, void(entity t, entity a, string m, float dtyp) obitfunc) T_Damage;
-void(entity inflictor, entity attacker, float damage, float radius, entity ignore, string dethtype, float damgtype, void(entity t, entity a, string m, float dtyp) obitfunc) T_RadiusDamage;
+void(entity inflictor, entity attacker, float damage, float force, float radius, entity ignore, string dethtype, float damgtype, void(entity t, entity a, string m, float dtyp) obitfunc) T_RadiusDamage;
Index: dpmod/qc/decals.qc
diff -u dpmod/qc/decals.qc:1.1.1.1 dpmod/qc/decals.qc:1.2
--- dpmod/qc/decals.qc:1.1.1.1	Thu Sep 19 15:07:48 2002
+++ dpmod/qc/decals.qc	Thu Jan 29 19:08:13 2004
@@ -107,7 +107,7 @@
 	e = newdecor();
 	e.createdtime = time;
 	e.angles = vectoangles(dir);
-	e.forcescale = 5;
+	e.forcescale = 15;
 	e.solid = SOLID_TRIGGER;
 	e.movetype = MOVETYPE_BOUNCE;
 	e.groundentity = en;
Index: dpmod/qc/explosion.qc
diff -u dpmod/qc/explosion.qc:1.4 dpmod/qc/explosion.qc:1.5
--- dpmod/qc/explosion.qc:1.4	Fri Feb 28 00:14:15 2003
+++ dpmod/qc/explosion.qc	Thu Jan 29 19:08:13 2004
@@ -32,7 +32,7 @@
 	newmis.effects = EF_ADDITIVE;
 };
 
-void(vector org, entity attacker, float damg, float radius, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) Explosion =
+void(vector org, entity attacker, float damg, float force, float radius, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) Explosion =
 {
 	local vector v;
 	local entity e;
@@ -51,7 +51,7 @@
 	else
 		te_explosionrgb(e.origin, explosioncolor);
 
-	T_RadiusDamage(e, attacker, damg, radius, world, dt, DT_EXPLOSION, obitfunc);
+	T_RadiusDamage(e, attacker, damg, force, radius, world, dt, DT_EXPLOSION, obitfunc);
 	remove(e);
 
 	v = findbetterlocation3(org); // move animation away from walls
@@ -69,7 +69,7 @@
 	*/
 };
 
-void(vector org, entity attacker, float damg, float radius, entity ignore, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) ExplosionIgnore =
+void(vector org, entity attacker, float damg, float force, float radius, entity ignore, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) ExplosionIgnore =
 {
 	local vector v;
 	local entity e;
@@ -88,7 +88,7 @@
 	else
 		te_explosionrgb(e.origin, explosioncolor);
 
-	T_RadiusDamage(e, attacker, damg, radius, ignore, dt, DT_EXPLOSION, obitfunc);
+	T_RadiusDamage(e, attacker, damg, force, radius, ignore, dt, DT_EXPLOSION, obitfunc);
 	remove(e);
 
 	v = findbetterlocation3(org); // move animation away from walls
@@ -106,7 +106,7 @@
 	*/
 };
 
-void(entity e, float damg, float radius, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) BecomeExplosion =
+void(entity e, float damg, float force, float radius, string dt, vector explosioncolor, float quad, void(entity t, entity a, string m, float dtyp) obitfunc) BecomeExplosion =
 {
 	local vector org, v, v2;
 	if (e.solid == SOLID_BSP)
@@ -141,7 +141,7 @@
 		te_smallflash(e.origin);
 	}
 
-	T_RadiusDamage(e, e.owner, damg, radius, world, dt, DT_EXPLOSION, obitfunc);
+	T_RadiusDamage(e, e.owner, damg, force, radius, world, dt, DT_EXPLOSION, obitfunc);
 	remove(e);
 
 	v = findbetterlocation3(org); // move animation away from walls
@@ -159,11 +159,11 @@
 	*/
 };
 
-void(entity e, float damg, float radius, string dt) TarbabyExplosion =
+void(entity e, float damg, float force, float radius, string dt) TarbabyExplosion =
 {
 	te_tarexplosion(e.origin);
 
-	T_RadiusDamage(e, e, damg, radius, world, dt, DT_EXPLOSION, Obituary_Generic);
+	T_RadiusDamage(e, e, damg, force, radius, world, dt, DT_EXPLOSION, Obituary_Generic);
 
 	//effect(e.origin, "progs/s_explod.spr", 0, 6, 10);
 	effect(e.origin, "progs/dpexplosion.spr32", 0, 20, 40);
Index: dpmod/qc/fire.qc
diff -u dpmod/qc/fire.qc:1.1.1.1 dpmod/qc/fire.qc:1.2
--- dpmod/qc/fire.qc:1.1.1.1	Thu Sep 19 15:07:04 2002
+++ dpmod/qc/fire.qc	Thu Jan 29 19:08:13 2004
@@ -110,7 +110,7 @@
 		//self.count = time + 0.6;
 		//T_BurnRadius (self, self.owner, 40, self.cnt, self.enemy, self.deathtype);
 		self.cnt2 = time + 0.3;
-		T_RadiusDamage(self, self.owner, 20, 80, self.enemy, self.deathtype, DT_FIRE, Obituary_Fire);
+		T_RadiusDamage(self, self.owner, 20, 0, 80, self.enemy, self.deathtype, DT_FIRE, Obituary_Fire);
 	}
 	if (pointcontents(self.origin) != CONTENT_EMPTY)
 		self.cnt = 0;
Index: dpmod/qc/fireball.qc
diff -u dpmod/qc/fireball.qc:1.2 dpmod/qc/fireball.qc:1.3
--- dpmod/qc/fireball.qc:1.2	Fri Jul 18 15:08:39 2003
+++ dpmod/qc/fireball.qc	Thu Jan 29 19:08:13 2004
@@ -1,10 +1,10 @@
 
 void() FireballExplode =
 {
-	BecomeExplosion(self, self.dmg, self.dmg2, self.deathtype, '0 0 0', FALSE, self.obitfunc1);
+	BecomeExplosion(self, self.dmg, self.count2, self.dmg2, self.deathtype, '0 0 0', FALSE, self.obitfunc1);
 };
 
-void(vector org, vector vel, entity own, float damg, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchFireball =
+void(vector org, vector vel, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchFireball =
 {
 	newmis = spawn ();
 	newmis.deathtype = dethtype;
@@ -22,13 +22,15 @@
 	newmis.think = FireballExplode;
 	newmis.nextthink = time + 15;
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = blastradius;
 	newmis.effects = EF_RED | EF_FULLBRIGHT;
 
 	if (own.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 
 	setmodel (newmis, "progs/lavaball.mdl");
Index: dpmod/qc/gore.qc
diff -u dpmod/qc/gore.qc:1.4 dpmod/qc/gore.qc:1.5
--- dpmod/qc/gore.qc:1.4	Thu Feb 20 04:01:01 2003
+++ dpmod/qc/gore.qc	Thu Jan 29 19:08:13 2004
@@ -55,7 +55,7 @@
 	if (e == world)
 		e = newdecor();
 	e.isdecor = TRUE; // let explosions find it
-	e.forcescale = 3;
+	e.forcescale = 6;
 	e.createdtime = time;
 	setorigin(e, org);
 	setmodel (e, gibname);
@@ -102,7 +102,7 @@
 	if (cvar("temp1") & 2048)
 		return;
 	e = newdecor();
-	e.forcescale = 3;
+	e.forcescale = 6;
 	e.createdtime = time;
 	e.movetype = MOVETYPE_BOUNCE;
 	e.solid = SOLID_NOT;
@@ -148,7 +148,7 @@
 		return;
 
 	newmis = newdecor();
-	newmis.forcescale = 3;
+	newmis.forcescale = 6;
 	newmis.createdtime = time + 0.5;
 	newmis.movetype = MOVETYPE_BOUNCE;
 	newmis.solid = SOLID_NOT;
Index: dpmod/qc/grenade.qc
diff -u dpmod/qc/grenade.qc:1.4 dpmod/qc/grenade.qc:1.5
--- dpmod/qc/grenade.qc:1.4	Wed Apr  9 23:24:30 2003
+++ dpmod/qc/grenade.qc	Thu Jan 29 19:08:13 2004
@@ -13,26 +13,26 @@
 	local vector v;
 	if (self.weapon & GRENADE_TENWARHEAD)
 	{
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
-		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
+		v = randomvec() * 200;LaunchGrenade(self.origin, self.velocity + v, self.owner, self.dmg, self.count2, self.dmg2, GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE, 10, self.deathtype, self.obitfunc1);
 	}
 	else if (self.deathtype == "GRENADE")
 	{
 		if (self.lefty)
-			Explosion(self.origin, self.owner, self.dmg, self.dmg2, "GRENADEBOUNCED", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+			Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, "GRENADEBOUNCED", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 		else
-			Explosion(self.origin, self.owner, self.dmg, self.dmg2, "GRENADEDIRECT", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+			Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, "GRENADEDIRECT", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	}
 	else
-		Explosion(self.origin, self.owner, self.dmg, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+		Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	self.owner.activemines = self.owner.activemines - 1;
 	remove(self);
 };
@@ -139,7 +139,7 @@
 		sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);  // bounce sound
 };
 
-void(vector org, vector vel, entity own, float damage, float damage2, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchGrenade =
+void(vector org, vector vel, entity own, float damage, float force, float damage2, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchGrenade =
 {
 	local   vector  v;
 	DelayGibComment();      // make him wait before commenting on gibs so it's not drown out by explosions etc
@@ -162,12 +162,14 @@
 	newmis.angles = vectoangles(newmis.velocity);
 	newmis.touch = GrenadeTouch;
 	newmis.dmg = damage;
+	newmis.count2 = force;
 	newmis.dmg2 = damage2;
 	newmis.effects = EF_LOWPRECISION;
 	if (self.items & IT_QUAD)
 	{
 		newmis.effects = newmis.effects | EF_BLUE;
 		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 	// set newmis duration
 	newmis.cnt = time + lifetime;
Index: dpmod/qc/laser.qc
diff -u dpmod/qc/laser.qc:1.1.1.1 dpmod/qc/laser.qc:1.2
--- dpmod/qc/laser.qc:1.1.1.1	Thu Sep 19 15:08:24 2002
+++ dpmod/qc/laser.qc	Thu Jan 29 19:08:13 2004
@@ -42,9 +42,9 @@
 	newmis.dmg2 = damg;
 	if (self.items & IT_QUAD)
 	{
+		newmis.effects = newmis.effects | EF_BLUE;
 		newmis.dmg = newmis.dmg * 4;
 		newmis.dmg2 = newmis.dmg2 * 4;
-		newmis.effects = newmis.effects | EF_BLUE;
 	}
 	newmis.deathtype = dethtype;
 	newmis.obitfunc1 = obitfunc;
Index: dpmod/qc/m_boss.qc
diff -u dpmod/qc/m_boss.qc:1.2 dpmod/qc/m_boss.qc:1.3
--- dpmod/qc/m_boss.qc:1.2	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_boss.qc	Thu Jan 29 19:08:13 2004
@@ -205,7 +205,7 @@
 		remove(self);
 		return;
 	}
-	BecomeExplosion(self, DMG_CHTHON_LAVABALL, DMG_CHTHON_LAVABALL_RADIUS, self.deathtype, '0 0 0', FALSE, Obituary_Generic);
+	BecomeExplosion(self, DMG_CHTHON_LAVABALL_DAMAGE, DMG_CHTHON_LAVABALL_FORCE, DMG_CHTHON_LAVABALL_RADIUS, self.deathtype, '0 0 0', FALSE, Obituary_Generic);
 };
 
 
@@ -239,7 +239,8 @@
 
 	vec = normalize (d - org);
 
-	LaunchFireball(org, vec * shotspeed, self, 90, 110, self.deathtype, Obituary_Generic);
+	LaunchFireball(org, vec * shotspeed, self, 90, 90, 110, self.deathtype, Obituary_Generic);
+	newmis.movetype = MOVETYPE_FLYMISSILE;
 	sound (self, CHAN_WEAPON, "boss1/throw.wav", 1, ATTN_NORM);
 
 	// check for dead enemy
Index: dpmod/qc/m_dog.qc
diff -u dpmod/qc/m_dog.qc:1.3 dpmod/qc/m_dog.qc:1.4
--- dpmod/qc/m_dog.qc:1.3	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_dog.qc	Thu Jan 29 19:08:13 2004
@@ -370,7 +370,7 @@
 	if (!monsterspawn)
 		precachemonster_dog();
 
-	self.forcescale = 6; // lighter than a player but also smaller, so only a little more forcescale
+	self.forcescale = 8;
 	self.netname = "a dog";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_enforcer.qc
diff -u dpmod/qc/m_enforcer.qc:1.8 dpmod/qc/m_enforcer.qc:1.9
--- dpmod/qc/m_enforcer.qc:1.8	Mon Nov 17 22:32:47 2003
+++ dpmod/qc/m_enforcer.qc	Thu Jan 29 19:08:13 2004
@@ -75,7 +75,7 @@
 	shotdir = normalize(hit - shotorg);
 	w_muzzleflash(shotorg, 2);
 	sound (self, CHAN_WEAPON, "plasma/plasma.wav", 1, ATTN_NORM);
-	FirePlasma(self, shotorg, shotdir * 5000, DMG_ENFORCER_PLASMA, DMG_ENFORCER_PLASMA, self.deathtype, Obituary_Generic);
+	FirePlasma(self, shotorg, shotdir * 5000, DMG_ENFORCER_PLASMA_DAMAGE, DMG_ENFORCER_PLASMA_FORCE, DMG_ENFORCER_PLASMA_RADIUS, self.deathtype, Obituary_Generic);
 };
 
 void(vector hit) enforcer_rocket =
@@ -99,7 +99,7 @@
 	shotdir = normalize(hit - shotorg);
 	sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
 	w_muzzleflash(shotorg, 5);
-	LaunchMissile(shotorg, shotdir * 5000, self, DMG_ENFORCER_ROCKET, DMG_ENFORCER_ROCKET_RADIUS, self.deathtype, Obituary_Generic);
+	LaunchMissile(shotorg, shotdir * 5000, self, DMG_ENFORCER_ROCKET_DAMAGE, DMG_ENFORCER_ROCKET_FORCE, DMG_ENFORCER_ROCKET_RADIUS, self.deathtype, Obituary_Generic);
 };
 
 //============================================================================
@@ -370,7 +370,7 @@
 	if (!monsterspawn)
 		precachemonster_enforcer();
 
-	self.forcescale = 3; // heavier than a player
+	self.forcescale = 4;
 	self.netname = "an enforcer";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_fish.qc
diff -u dpmod/qc/m_fish.qc:1.2 dpmod/qc/m_fish.qc:1.3
--- dpmod/qc/m_fish.qc:1.2	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_fish.qc	Thu Jan 29 19:08:13 2004
@@ -190,7 +190,7 @@
 	if (!monsterspawn)
 		precachemonster_fish();
 
-	self.forcescale = 3; // lightweight, but also small
+	self.forcescale = 6;
 	self.netname = "Rotfish";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_hknight.qc
diff -u dpmod/qc/m_hknight.qc:1.3 dpmod/qc/m_hknight.qc:1.4
--- dpmod/qc/m_hknight.qc:1.3	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_hknight.qc	Thu Jan 29 19:08:13 2004
@@ -248,7 +248,8 @@
 	// set missile speed
 	vec = dir + randomvec() * 0.05;
 
-	LaunchFireball(org, vec * 1000, self, 90, 110, self.deathtype, Obituary_Generic);
+	LaunchFireball(org, vec * 1000, self, 90, 90, 110, self.deathtype, Obituary_Generic);
+	newmis.movetype = MOVETYPE_FLYMISSILE;
 	sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
 };
 
@@ -780,7 +781,7 @@
 	if (!monsterspawn)
 		precachemonster_hell_knight();
 
-	self.forcescale = 2.5; // heavy
+	self.forcescale = 4;
 	self.netname = "a Hell-Knight";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_knight.qc
diff -u dpmod/qc/m_knight.qc:1.2 dpmod/qc/m_knight.qc:1.3
--- dpmod/qc/m_knight.qc:1.2	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_knight.qc	Thu Jan 29 19:08:13 2004
@@ -287,7 +287,7 @@
 	if (!monsterspawn)
 		precachemonster_knight();
 
-	self.forcescale = 3.5; // heavier than a player
+	self.forcescale = 6;
 	self.netname = "a knight";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_ogre.qc
diff -u dpmod/qc/m_ogre.qc:1.8 dpmod/qc/m_ogre.qc:1.9
--- dpmod/qc/m_ogre.qc:1.8	Mon Nov 17 22:32:47 2003
+++ dpmod/qc/m_ogre.qc	Thu Jan 29 19:08:13 2004
@@ -121,7 +121,7 @@
 	sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
 
 	v = (3 - skill) * 20 * randomvec();
-	LaunchGrenade(self.origin, findtrajectory_velocity + v, self, DMG_OGRE_GRENADE, DMG_OGRE_GRENADE_RADIUS, GRENADE_DETONATEONCREATURE, 5, self.deathtype, Obituary_Generic);
+	LaunchGrenade(self.origin, findtrajectory_velocity + v, self, DMG_OGRE_GRENADE_DAMAGE, DMG_OGRE_GRENADE_FORCE, DMG_OGRE_GRENADE_RADIUS, GRENADE_DETONATEONCREATURE, 5, self.deathtype, Obituary_Generic);
 
 	return TRUE;
 };
@@ -474,7 +474,7 @@
 	if (!monsterspawn)
 		precachemonster_ogre();
 
-	self.forcescale = 3; // heavier than a player
+	self.forcescale = 4;
 	self.netname = "an ogre";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_shalrath.qc
diff -u dpmod/qc/m_shalrath.qc:1.2 dpmod/qc/m_shalrath.qc:1.3
--- dpmod/qc/m_shalrath.qc:1.2	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_shalrath.qc	Thu Jan 29 19:08:13 2004
@@ -127,7 +127,7 @@
 
 void() ShalMissileDie =
 {
-	BecomeExplosion (self, DMG_SHALRATH_MISSILE, DMG_SHALRATH_MISSILE_RADIUS, self.deathtype, '0.8 0.5 1', FALSE, Obituary_Generic);
+	BecomeExplosion (self, DMG_SHALRATH_MISSILE_DAMAGE, DMG_SHALRATH_MISSILE_FORCE, DMG_SHALRATH_MISSILE_RADIUS, self.deathtype, '0.8 0.5 1', FALSE, Obituary_Generic);
 };
 
 void() ShalHome =
@@ -249,7 +249,7 @@
 	if (!monsterspawn)
 		precachemonster_shalrath();
 
-	self.forcescale = 2.5; // heavier than a player
+	self.forcescale = 3;
 	self.netname = "a shalrath";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_shambler.qc
diff -u dpmod/qc/m_shambler.qc:1.3 dpmod/qc/m_shambler.qc:1.4
--- dpmod/qc/m_shambler.qc:1.3	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_shambler.qc	Thu Jan 29 19:08:13 2004
@@ -524,7 +524,7 @@
 	if (!monsterspawn)
 		precachemonster_shambler();
 
-	self.forcescale = 0.5; // much heavier than a player
+	self.forcescale = 1.5; // much heavier than a player
 	self.netname = "a shambler";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_soldier.qc
diff -u dpmod/qc/m_soldier.qc:1.10 dpmod/qc/m_soldier.qc:1.11
--- dpmod/qc/m_soldier.qc:1.10	Wed Jan 28 16:40:37 2004
+++ dpmod/qc/m_soldier.qc	Thu Jan 29 19:08:13 2004
@@ -268,7 +268,7 @@
 	dir = normalize(dir);
 
 	sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
-	LaunchMissile(self.origin + '0 0 12', dir, self, DMG_SOLDIER_ROCKET, DMG_SOLDIER_ROCKET_RADIUS, self.deathtype, Obituary_Generic);
+	LaunchMissile(self.origin + '0 0 12', dir, self, DMG_SOLDIER_ROCKET_DAMAGE, DMG_SOLDIER_ROCKET_FORCE, DMG_SOLDIER_ROCKET_RADIUS, self.deathtype, Obituary_Generic);
 };
 
 void() army_rocket1    =[$shoot1, army_rocket2   ] {ai_face();self.dest = monster_shotlead(0.4, 1000);};
@@ -477,7 +477,7 @@
 	self.localdamage_hit = LD_NORMAL;
 	*/
 
-	self.forcescale = 6; // a little bit lighter than a player
+	self.forcescale = 6;
 	self.netname = "a grunt";
 	// self.doobits = 1;
 
Index: dpmod/qc/m_tarbaby.qc
diff -u dpmod/qc/m_tarbaby.qc:1.3 dpmod/qc/m_tarbaby.qc:1.4
--- dpmod/qc/m_tarbaby.qc:1.3	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_tarbaby.qc	Thu Jan 29 19:08:13 2004
@@ -193,7 +193,7 @@
 	MonsterGibs("", 0, "progs/tar_gib.mdl", 4, "", 0);
 	self.skin = 0;
 	self.owner = self;
-	TarbabyExplosion (self, DMG_TARBABY, DMG_TARBABY_RADIUS, self.deathtype);
+	TarbabyExplosion (self, DMG_TARBABY_DAMAGE, DMG_TARBABY_FORCE, DMG_TARBABY_RADIUS, self.deathtype);
 };
 
 void() tarbaby_sightsound =
@@ -235,7 +235,7 @@
 	if (!monsterspawn)
 		precachemonster_tarbaby();
 
-	self.forcescale = 4; // lighter than a player, but also much smaller, so lower force scale
+	self.forcescale = 6;
 	self.netname = "a spawn";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_wizard.qc
diff -u dpmod/qc/m_wizard.qc:1.3 dpmod/qc/m_wizard.qc:1.4
--- dpmod/qc/m_wizard.qc:1.3	Wed Jul 16 08:16:45 2003
+++ dpmod/qc/m_wizard.qc	Thu Jan 29 19:08:13 2004
@@ -359,7 +359,7 @@
 	self.localdamage_hit = LD_NORMAL;
 	*/
 
-	self.forcescale = 4; // lighter than a player but also smaller, so lower forcescale
+	self.forcescale = 6;
 	self.netname = "a scrag";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/m_zombie.qc
diff -u dpmod/qc/m_zombie.qc:1.4 dpmod/qc/m_zombie.qc:1.5
--- dpmod/qc/m_zombie.qc:1.4	Thu Feb 20 04:01:01 2003
+++ dpmod/qc/m_zombie.qc	Thu Jan 29 19:08:13 2004
@@ -651,7 +651,7 @@
 		return;
 	}
 
-	self.forcescale = 2; // heavier than player simply to make them killable with non-explosives
+	self.forcescale = 6;
 	self.netname = "Zombie";
 	// self.doobits = 1;
 	self.solid = SOLID_SLIDEBOX;
Index: dpmod/qc/mine.qc
diff -u dpmod/qc/mine.qc:1.9 dpmod/qc/mine.qc:1.10
--- dpmod/qc/mine.qc:1.9	Wed Jan 28 16:40:37 2004
+++ dpmod/qc/mine.qc	Thu Jan 29 19:08:13 2004
@@ -17,26 +17,26 @@
 	{
 		basevel = '0 0 0.5' * cvar("sv_gravity");
 		t = GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE;
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
 	}
 	else if (self.weapon & MINE_FIVEWARHEAD)
 	{
 		basevel = '0 0 0.5' * cvar("sv_gravity");
 		t = GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE;
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
-		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.count2, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
 	}
 	else if (self.lefty == 2)
 	{
@@ -45,15 +45,15 @@
 		makevectors(v);
 		shotorg = self.origin;
 		FireBullets(self.owner, self, -1, 4, self.dmg / 4, self.dmg / 4, 0, 0, v_forward * 10000, 0.05, "LASERTRIPMINEDIRECT", DT_NAIL, self.obitfunc1);
-		Explosion(self.origin, self.owner, self.dmg, self.dmg2, "LASERTRIPMINEBLAST", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+		Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, "LASERTRIPMINEBLAST", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	}
 	else if (self.lefty == 3)
 	{
 		T_Damage(self.enemy, self, self.owner, self.dmg, self.dmg, "TAGMINEDIRECT", DT_EXPLOSION, self.origin, '0 0 0.5' * self.dmg, self.obitfunc1);
-		ExplosionIgnore(self.origin, self.owner, self.dmg, self.dmg2, self.enemy, "TAGMINEBLAST", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+		ExplosionIgnore(self.origin, self.owner, self.dmg, self.count2, self.dmg2, self.enemy, "TAGMINEBLAST", '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	}
 	else
-		Explosion(self.origin, self.owner, self.dmg, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+		Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	remove(self);
 };
 
@@ -283,7 +283,7 @@
 	}
 };
 
-void(vector org, vector vel, entity own, float damage, float damage2, float impactdamage, float impactbodydamage, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchMine =
+void(vector org, vector vel, entity own, float damage, float force, float damage2, float impactdamage, float impactbodydamage, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchMine =
 {
 	local   vector  v;
 	DelayGibComment();      // make him wait before commenting on gibs so it's not drown out by explosions etc
@@ -307,6 +307,7 @@
 	newmis.angles = vectoangles(newmis.velocity);
 	newmis.touch = MineTouch;
 	newmis.dmg = damage;
+	newmis.count2 = force;
 	newmis.dmg2 = damage2;
 	newmis.count3 = impactdamage;
 	newmis.count4 = impactbodydamage;
@@ -315,6 +316,7 @@
 	{
 		newmis.effects = newmis.effects | EF_BLUE;
 		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 	// set newmis duration
 	newmis.cnt = time + lifetime;
Index: dpmod/qc/misc.qc
diff -u dpmod/qc/misc.qc:1.2 dpmod/qc/misc.qc:1.3
--- dpmod/qc/misc.qc:1.2	Thu Feb 13 21:40:20 2003
+++ dpmod/qc/misc.qc	Thu Jan 29 19:08:13 2004
@@ -490,7 +490,7 @@
 	v = randompos(self.mins, self.maxs) + self.origin;v2 = randomvec() * 50;ThrowDebris(world, v, v2, "progs/rubble3.mdl", 5);
 	SUB_UseTargets();
 	setorigin(self, (self.absmin + self.absmax) * 0.5);
-	BecomeExplosion (self, self.dmg, self.dmg * 0.5, self.deathtype, '0 0 0', FALSE, Obituary_Generic);
+	BecomeExplosion (self, self.dmg, self.dmg, self.dmg * 0.5, self.deathtype, '0 0 0', FALSE, Obituary_Generic);
 };
 
 void() barrel_det =
Index: dpmod/qc/plasma.qc
diff -u dpmod/qc/plasma.qc:1.5 dpmod/qc/plasma.qc:1.6
--- dpmod/qc/plasma.qc:1.5	Sat Aug  9 12:20:28 2003
+++ dpmod/qc/plasma.qc	Thu Jan 29 19:08:13 2004
@@ -11,7 +11,7 @@
 	}
 	v = normalize(self.velocity);
 	T_Damage(other, self, self.owner, self.dmg, self.dmg, self.deathtype, DT_PLASMA, self.origin, v * self.dmg, self.obitfunc1);
-	T_RadiusDamage(self, self.owner, self.dmg, self.dmg2, other, self.deathtype, DT_PLASMA, self.obitfunc1);
+	T_RadiusDamage(self, self.owner, self.dmg, self.count2, self.dmg2, other, self.deathtype, DT_PLASMA, self.obitfunc1);
 	sound(self, CHAN_WEAPON, "plasma/plasexpl.wav", 1, ATTN_NORM);
 	effect(self.origin - v * 16, "progs/plasmashot.spr32", 10, 5, 30);
 	te_plasmaburn(self.origin - v);
@@ -32,7 +32,7 @@
 		remove(self);
 };
 
-void(entity own, vector org, vector vel, float damg, float damg2, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) FirePlasma =
+void(entity own, vector org, vector vel, float damg, float force, float damg2, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) FirePlasma =
 {
 	local   vector  a;
 
@@ -52,11 +52,13 @@
 	newmis.effects = EF_LOWPRECISION;
 	newmis.velocity = vel;// + self.velocity;
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = damg2;
 	if (self.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 	newmis.deathtype = dethtype;
 	newmis.obitfunc1 = obitfunc;
@@ -81,8 +83,8 @@
 	if (other.solid != SOLID_BSP)
 		return;
 	v = normalize(self.velocity);
-	T_Damage(other, self, self.owner, self.dmg, self.dmg, self.deathtype, DT_PLASMA, self.origin, v * self.dmg, self.obitfunc1);
-	T_RadiusDamage(self, self.owner, self.dmg, self.dmg2, other, self.deathtype, DT_PLASMA, self.obitfunc1);
+	T_Damage(other, self, self.owner, self.dmg, self.dmg, self.deathtype, DT_PLASMA, self.origin, v * self.dmg * 0.3, self.obitfunc1);
+	T_RadiusDamage(self, self.owner, self.dmg, self.count2, self.dmg2, other, self.deathtype, DT_PLASMA, self.obitfunc1);
 	sound(self, CHAN_WEAPON, "plasma/plasexpl.wav", 1, ATTN_NORM);
 	effect(self.origin - v * 16, "progs/plasmashot.spr32", 10, 5, 30);
 	te_plasmaburn(self.origin - v);
@@ -109,10 +111,10 @@
 		if (self.frame >= 10)
 			self.frame = 0;
 	}
-	damage = self.dmg * (time - self.count2) * 5;
+	damage = self.dmg * (time - self.count1) * 5;
 	if (damage >= 10)
 	{
-		self.count2 = time;
+		self.count1 = time;
 		steps = ceil(damage / 50);
 		damage = damage / steps;
 		backup = self.origin;
@@ -122,7 +124,7 @@
 			step = step + 1;
 			self.origin = (backup - self.dest) * (step / steps) + self.dest;
 			//plasmaball_burn();
-			T_RadiusDamage(self, self.owner, damage, self.dmg2, self.owner, self.deathtype, DT_PLASMA, self.obitfunc1);
+			T_RadiusDamage(self, self.owner, damage, 0, self.dmg2, self.owner, self.deathtype, DT_PLASMA, self.obitfunc1);
 		}
 		// the above loop leaves self.origin restored to what it should be
 	}
@@ -130,7 +132,7 @@
 		remove(self);
 };
 
-void(entity own, vector org, vector vel, float damg, float damg2, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) FirePlasmaBall =
+void(entity own, vector org, vector vel, float damg, float force, float damg2, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) FirePlasmaBall =
 {
 	local   vector  a;
 
@@ -150,18 +152,20 @@
 	newmis.effects = EF_LOWPRECISION;
 	newmis.velocity = vel;// + self.velocity;
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = damg2;
 	if (self.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 	newmis.deathtype = dethtype;
 	newmis.obitfunc1 = obitfunc;
 //	newmis.frame = random() * 9.999;
 //	newmis.frame = floor(newmis.frame);
 	newmis.count = time + 50;
-	newmis.count2 = time;
+	newmis.count1 = time;
 	newmis.dest = self.origin;
 	newmis.touch = plasmaball_touch;
 	newmis.think = plasmaball_think;
Index: dpmod/qc/playermovement.qc
diff -u dpmod/qc/playermovement.qc:1.6 dpmod/qc/playermovement.qc:1.7
--- dpmod/qc/playermovement.qc:1.6	Thu Sep 18 14:37:33 2003
+++ dpmod/qc/playermovement.qc	Thu Jan 29 19:08:13 2004
@@ -5,7 +5,7 @@
 void() SV_PlayerPhysics =
 {
 	local   vector  wishvel, wishdir, v;
-	local   float   wishspeed, f;
+	local   float   wishspeed, f, accelerate;
 
 	if (self.movetype == MOVETYPE_NONE)
 		return;
@@ -20,6 +20,8 @@
 		sv_gravity = cvar("sv_gravity");
 	}
 
+	accelerate = sv_accelerate;
+
 	if (self.punchangle != '0 0 0')
 	{
 		f = vlen(self.punchangle) - 10 * frametime;
@@ -165,8 +167,11 @@
 		// airborn
 		makevectors(self.v_angle_y * '0 1 0');
 		wishvel = v_forward * self.movement_x + v_right * self.movement_y;
-		if (vlen(wishvel) > 10)
-			wishvel = normalize(wishvel) * 10;
+		// LordHavoc: air control...
+		//accelerate = accelerate * 0.5;
+		// LordHavoc: no air control...
+		//if (vlen(wishvel) > 10)
+		//	wishvel = normalize(wishvel) * 10;
 	}
 
 	// acceleration
@@ -178,6 +183,6 @@
 			wishspeed = sv_maxspeed;
 		f = wishspeed - (self.velocity * wishdir);
 		if (f > 0)
-			self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
+			self.velocity = self.velocity + wishdir * min(f, accelerate * frametime * wishspeed);
 	}
 };
Index: dpmod/qc/rocket.qc
diff -u dpmod/qc/rocket.qc:1.6 dpmod/qc/rocket.qc:1.7
--- dpmod/qc/rocket.qc:1.6	Sat Aug  9 12:20:28 2003
+++ dpmod/qc/rocket.qc	Thu Jan 29 19:08:13 2004
@@ -1,16 +1,94 @@
 
-void(vector org, vector vel, entity own, float damage, float damage2, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchGrenade;
+void(vector org, vector vel, entity own, float damage, float force, float damage2, float type, float lifetime, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchGrenade;
+void(vector org, vector vel, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchFireball;
+
+void() SmallFireballExplode =
+{
+	//local vector v;
+	self.solid = SOLID_NOT;
+	findbetterlocation2(self);
+
+	T_RadiusDamage(self, self.owner, self.dmg, self.count2, self.dmg2, world, self.deathtype, DT_EXPLOSION, self.obitfunc1);
+
+	//v = findbetterlocation3(self.origin); // move animation away from walls
+	effect(self.origin, "progs/s_explod.spr", 0, 6, 10);
+	//effect(self.origin, "progs/dpexplosion.spr32", 0, 20, 40);
+	remove(self);
+};
+
+void() SmallFireballThink =
+{
+	self.nextthink = time;
+	self.angles = vectoangles(self.velocity) + '90 0 0';
+	if (time > self.count)
+		remove(self);
+};
+
+void(vector org, vector vel, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchSmallFireball =
+{
+	newmis = spawn ();
+	newmis.deathtype = dethtype;
+	newmis.obitfunc1 = obitfunc;
+	newmis.shoulddodge = TRUE;
+	newmis.dangerrating = blastradius;
+	newmis.owner = own;
+	newmis.createdtime = time;
+	newmis.movetype = MOVETYPE_TOSS;
+	newmis.solid = SOLID_BBOX;
+	newmis.classname = "fireball";
+	newmis.velocity = vel;
+	//newmis.angles = vectoangles(newmis.velocity) + '90 0 0';
+	newmis.touch = SmallFireballExplode;
+	newmis.think = SmallFireballThink;
+	newmis.nextthink = time;
+	newmis.count = time + 15;
+	newmis.dmg = damg;
+	newmis.count2 = force;
+	newmis.dmg2 = blastradius;
+	newmis.effects = EF_RED | EF_FULLBRIGHT;
+
+	if (own.items & IT_QUAD)
+	{
+		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
+	}
+
+	setmodel (newmis, "progs/flame2.mdl");
+	setsize (newmis, '0 0 0', '0 0 0');
+	setorigin (newmis, org);
+};
+
+void() MissileExplodeFireballs =
+{
+	local float c;
+	local vector vel, basevel;
+	fightdone = time + 1; // delay stuff until fighting is over
+	c = 0;
+	basevel = cvar("sv_gravity") * '0 0 0.1';
+	//while (c < 5)
+	while (c < 50)
+	{
+		c = c + 1;
+		vel = randomvec() * 500 + basevel;
+		//LaunchSmallFireball(self.origin, vel, self.owner, 15, 0, 50, self.deathtype, self.obitfunc1);
+		LaunchSmallFireball(self.origin, vel, self.owner, 120, 0, 450, self.deathtype, self.obitfunc1);
+		newmis.movetype = MOVETYPE_TOSS;
+	}
+	BecomeExplosion(self, self.dmg, self.count2, self.dmg2, self.deathtype, '-1 0 0', self.effects & EF_BLUE, self.obitfunc1);
+	remove(self);
+};
 
 void() MissileExplode =
 {
 	fightdone = time + 1; // delay stuff until fighting is over
-	Explosion(self.origin, self.owner, self.dmg, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+	Explosion(self.origin, self.owner, self.dmg, self.count2, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
 	remove(self);
 };
 
 void() MissileDet =
 {
-	self.think = MissileExplode;
+	self.think = self.th_gib;
 	self.nextthink = time;
 }
 
@@ -27,7 +105,7 @@
 	}
 	v = normalize(self.velocity);
 	setorigin(self, self.origin - v * 16);
-	MissileExplode();
+	self.th_gib();
 };
 
 void() MissileThink =
@@ -50,14 +128,14 @@
 	p = pointcontents(self.origin);
 	if (time > self.cnt || p == CONTENT_SOLID || p == CONTENT_LAVA)
 	{
-		MissileExplode();
+		self.th_gib();
 		return;
 	}
 	if (p == CONTENT_SKY)
 		remove(self);
 };
 
-void(vector org, vector dir, entity own, float damg, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchMissile =
+void(vector org, vector dir, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchMissile =
 {
 	fightdone = time + 1; // delay stuff until fighting is over
 	newmis = spawn ();
@@ -77,11 +155,13 @@
 	newmis.touch = MissileTouch;
 	newmis.think = MissileThink;
 	newmis.th_die = MissileDet;
+	newmis.th_gib = MissileExplode;
 	newmis.nextthink = time;
 	newmis.takedamage = DAMAGE_YES;
-	newmis.health = 40;     // can be detonated inflight
+	newmis.health = 1;     // can be detonated inflight
 	newmis.cnt = time + 15; // 15 seconds max flight time
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = blastradius;
 	newmis.wait = time;
 	newmis.effects = EF_LOWPRECISION;
@@ -89,8 +169,9 @@
 
 	if (own.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 
 	setmodel (newmis, "progs/missile.mdl");
@@ -104,7 +185,7 @@
 
 	if (!self.enemy.health)
 	{
-		MissileExplode();
+		self.th_gib();
 		return;
 	}
 
@@ -127,13 +208,13 @@
 		remove(self);
 	if (time > self.cnt || p == CONTENT_SOLID || p == CONTENT_LAVA || (trace_fraction < 1 && trace_ent != self.owner))
 	{
-		MissileExplode();
+		self.th_gib();
 		return;
 	}
 };
 
 entity spiralmissile_orbitentity;
-void(vector org, vector dir, entity own, float damg, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc, float orbitdistance) LaunchSpiralMissile =
+void(vector org, vector dir, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc, float orbitdistance) LaunchSpiralMissile =
 {
 	fightdone = time + 1; // delay stuff until fighting is over
 	newmis = spawn ();
@@ -156,19 +237,22 @@
 	newmis.touch = MissileTouch;
 	newmis.think = MissileSpiralThink;
 	newmis.th_die = MissileDet;
+	newmis.th_gib = MissileExplode;
 	newmis.nextthink = time;
 	newmis.takedamage = DAMAGE_YES;
-	newmis.health = 40;     // can be detonated inflight
+	newmis.health = 1;     // can be detonated inflight
 	newmis.cnt = time + 15; // 15 seconds max flight time
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = blastradius;
 	newmis.wait = time;
 	newmis.effects = EF_LOWPRECISION;
 
 	if (own.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 
 	setmodel (newmis, "progs/missile.mdl");
Index: dpmod/qc/t_radiusdamage.qc
diff -u dpmod/qc/t_radiusdamage.qc:1.1.1.1 dpmod/qc/t_radiusdamage.qc:1.2
--- dpmod/qc/t_radiusdamage.qc:1.1.1.1	Thu Sep 19 15:07:49 2002
+++ dpmod/qc/t_radiusdamage.qc	Thu Jan 29 19:08:13 2004
@@ -9,9 +9,9 @@
 T_RadiusDamage
 ============
 */
-void(entity inflictor, entity attacker, float damage, float radius, entity ignore, string dethtype, float damgtype, void(entity t, entity a, string m, float dtyp) obitfunc) T_RadiusDamage =
+void(entity inflictor, entity attacker, float damage, float force, float radius, entity ignore, string dethtype, float damgtype, void(entity t, entity a, string m, float dtyp) obitfunc) T_RadiusDamage =
 {
-	local   float   points, points1, wt, d, scaler;
+	local   float   damagepoints, forcepoints, wt, d, scaler;
 	local   vector  v, l;
 	local   entity  head;
 
@@ -34,16 +34,18 @@
 		if (!head.isdecor)
 		if (head != ignore)
 		{
-			points = LinearRadDamage(head, ignore, inflictor.origin, damage, radius, 3);
-			if (points > damage)
-				points = damage;
-			points1 = points;
+			damagepoints = LinearRadDamage(head, ignore, inflictor.origin, damage, radius, 3);
+			forcepoints = LinearRadDamage(head, ignore, inflictor.origin, force, radius, 3);
+			if (damagepoints > damage)
+				damagepoints = damage;
 			if (head == attacker)
-				points = points * 0.5;
-			if (points >= 1)
+				damagepoints = damagepoints * 0.5;
+			if (forcepoints > force)
+				forcepoints = force;
+			if (damagepoints > 0 || forcepoints > 0)
 			{
-				head.radiusdamage_amount = head.radiusdamage_amount + ceil(points);
-				head.radiusdamage_force = head.radiusdamage_force + normalize((head.absmin + head.absmax) * 0.5 - inflictor.origin) * points1;
+				head.radiusdamage_amount = head.radiusdamage_amount + damagepoints;
+				head.radiusdamage_force = head.radiusdamage_force + normalize((head.absmin + head.absmax) * 0.5 - inflictor.origin) * forcepoints;
 				head.radiusdamage_hit = 1;
 				head.radiusdamage_lasthit = raddamage_lasthit;
 			}
@@ -72,13 +74,16 @@
 	head = findchainfloat(isdecor, TRUE);
 	while (head)
 	{
-		points = LinearRadDamage(head, ignore, inflictor.origin, damage, radius, 1);
-		if (points > damage)
-			points = damage;
-		if (points >= 1)
+		damagepoints = LinearRadDamage(head, ignore, inflictor.origin, damage, radius, 1);
+		forcepoints = LinearRadDamage(head, ignore, inflictor.origin, force, radius, 1);
+		if (damagepoints > damage)
+			damagepoints = damage;
+		if (forcepoints > damage)
+			forcepoints = damage;
+		if (damagepoints > 0 || forcepoints > 0)
 		{
-			head.radiusdamage_amount = head.radiusdamage_amount + ceil(points);
-			head.radiusdamage_force = head.radiusdamage_force + normalize((head.absmin + head.absmax) * 0.5 + '0 0 4'- inflictor.origin) * points;
+			head.radiusdamage_amount = head.radiusdamage_amount + damagepoints;
+			head.radiusdamage_force = head.radiusdamage_force + normalize((head.absmin + head.absmax) * 0.5 + '0 0 4'- inflictor.origin) * forcepoints;
 			head.radiusdamage_hit = 1;
 			head.radiusdamage_lasthit = raddamage_lasthit;
 		}
Index: dpmod/qc/trig_original.qc
diff -u dpmod/qc/trig_original.qc:1.2 dpmod/qc/trig_original.qc:1.3
--- dpmod/qc/trig_original.qc:1.2	Thu Aug 28 08:55:22 2003
+++ dpmod/qc/trig_original.qc	Thu Jan 29 19:08:13 2004
@@ -717,6 +717,7 @@
 	local vector org, v;
 	if (other.movetype == MOVETYPE_NONE || other.movetype == MOVETYPE_PUSH)
 		return;
+	other.flags = other.flags - (other.flags & FL_ONGROUND);
 	other.velocity = self.movedir;
 	if (self.enemy)
 	{
Index: dpmod/qc/w_system.qc
diff -u dpmod/qc/w_system.qc:1.6 dpmod/qc/w_system.qc:1.7
--- dpmod/qc/w_system.qc:1.6	Wed Jan 28 16:40:37 2004
+++ dpmod/qc/w_system.qc	Thu Jan 29 19:08:13 2004
@@ -165,6 +165,7 @@
 	return w_aimdir(findtrajectory_velocity, 0.1);
 };
 
+void() W_SetupShot;
 void() W_Hostile =
 {
 	// wake up monsters
@@ -172,6 +173,7 @@
 	weaponwakeup(self.origin, self);
 	fightdone = time + 1; // delay stuff until fighting is over
 	SuperDamageSound();
+	W_SetupShot();
 };
 
 .float firing;
@@ -672,13 +674,16 @@
 float SUPERNAILGUN_NAIL = 15;
 float SUPERNAILGUN_NAILS = 1;
 float SUPERNAILGUN_REFIRE = 0.05;
-float GRENADELAUNCHER_ROCKET = 150;
+float GRENADELAUNCHER_DAMAGE = 150;
+float GRENADELAUNCHER_FORCE = 150;
 float GRENADELAUNCHER_RADIUS = 120;
 float GRENADELAUNCHER_REFIRE = 0.8;
-float ROCKETLAUNCHER_SINGLE_ROCKET = 120;
+float ROCKETLAUNCHER_SINGLE_DAMAGE = 120;
+float ROCKETLAUNCHER_SINGLE_FORCE = 120;
 float ROCKETLAUNCHER_SINGLE_RADIUS = 150;
 float ROCKETLAUNCHER_SINGLE_REFIRE = 0.8;
-float ROCKETLAUNCHER_TRIPLE_ROCKET = 120;
+float ROCKETLAUNCHER_TRIPLE_DAMAGE = 120;
+float ROCKETLAUNCHER_TRIPLE_FORCE = 120;
 float ROCKETLAUNCHER_TRIPLE_RADIUS = 150;
 float ROCKETLAUNCHER_TRIPLE_REFIRE = 0.8;
 float THUNDERBOLT_CELL_HEALTH = 30;
@@ -980,7 +985,7 @@
 			w_muzzleflash(shotorg, 2);
 			//FireBullets(self, self, 1, 5, PLASMASHOTGUN_SHELL * 0.1, PLASMASHOTGUN_SHELL * 0.1, 0, 0, shotdir * 10000, 0.05, "PLASMASHOTGUN", DT_SHOTGUN, Obituary_PlasmaShotgun);
 			//FireBullets(self, self, 0, 5, PLASMASHOTGUN_SHELL * 0.1, PLASMASHOTGUN_SHELL * 0.1, 0, 0, shotdir * 10000, 0.05, "PLASMASHOTGUN", DT_SHOTGUN, Obituary_PlasmaShotgun);
-			FirePlasma(self, shotorg, shotdir * 10000, PLASMASHOTGUN_SHELL + PLASMASHOTGUN_CELL * PLASMASHOTGUN_CELLS, PLASMASHOTGUN_RADIUS, "PLASMASHOTGUN", Obituary_PlasmaShotgun);
+			FirePlasma(self, shotorg, shotdir * 10000, PLASMASHOTGUN_SHELL + PLASMASHOTGUN_CELL * PLASMASHOTGUN_CELLS, PLASMASHOTGUN_SHELL + PLASMASHOTGUN_CELL * PLASMASHOTGUN_CELLS, PLASMASHOTGUN_RADIUS, "PLASMASHOTGUN", Obituary_PlasmaShotgun);
 			/*
 			f = 0.2;
 			v = shotdir * 10000 + randomvec() * 500;
@@ -1260,8 +1265,8 @@
 			self.wfiretime = time;
 			Inventory_AdjustQuantity(self, "rockets", -1);
 			w_muzzleflash(shotorg, 1);
-			//LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, 80, 300, GRENADE_IMPACT, 2.5, "NAILGUNGRENADE", Obituary_NailgunGrenade);
-			LaunchMine(shotorg, shotdir * 1000 + v_up * 200, self, 200, 70, 20, 10, MINE_LASERTRIP, 60, "LASERTRIPMINE", Obituary_NailgunMine);
+			//LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, 80, 80, 300, GRENADE_IMPACT, 2.5, "NAILGUNGRENADE", Obituary_NailgunGrenade);
+			LaunchMine(shotorg, shotdir * 1000 + v_up * 200, self, 200, 200, 70, 20, 10, MINE_LASERTRIP, 60, "LASERTRIPMINE", Obituary_NailgunMine);
 			wsetanim(WANIM_FIRE2, 0, 0, 0.6);
 		}
 		return TRUE;
@@ -1415,7 +1420,7 @@
 				a = Inventory_Quantity(self, "rockets");
 			Inventory_AdjustQuantity(self, "rockets", 0 - a);
 			w_muzzleflash(shotorg, 3);
-			LaunchMine(shotorg, shotdir * 1000 + v_up * 200, self, a * 100, 350, 20, 10, MINE_PROXIMITY, 60, "PROXIMITYMINE", Obituary_ProximityMine);
+			LaunchMine(shotorg, shotdir * 1000 + v_up * 200, self, a * 100, a * 100, 350, 20, 10, MINE_PROXIMITY, 60, "PROXIMITYMINE", Obituary_ProximityMine);
 			wsetanim(WANIM_FIRE2, 0, 0, 0.6);
 		}
 		return TRUE;
@@ -1456,7 +1461,7 @@
 		precache_model("progs/grenade.mdl");
 		precache_sound("weapons/grenade.wav");
 		precache_sound("weapons/bounce.wav");
-		registerweapon(6, "Grenade Launcher", w_grenadelauncher, "grenadelauncher", VWEP_GRENADE_LAUNCHER, "progs/v_dprock.mdl", IT_ROCKETS, 0, 2000, GRENADELAUNCHER_ROCKET / GRENADELAUNCHER_REFIRE, WANIMTYPE_ROCKET);
+		registerweapon(6, "Grenade Launcher", w_grenadelauncher, "grenadelauncher", VWEP_GRENADE_LAUNCHER, "progs/v_dprock.mdl", IT_ROCKETS, 0, 2000, GRENADELAUNCHER_DAMAGE / GRENADELAUNCHER_REFIRE, WANIMTYPE_ROCKET);
 		return TRUE;
 	}
 	if (request == WR_HASAMMO)
@@ -1504,9 +1509,9 @@
 			Inventory_AdjustQuantity(self, "rockets", -1);
 			w_muzzleflash(shotorg, 2);
 			if (self.button0)
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER_ROCKET, GRENADELAUNCHER_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER_DAMAGE, GRENADELAUNCHER_FORCE, GRENADELAUNCHER_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade);
 			else
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER_ROCKET, GRENADELAUNCHER_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER_DAMAGE, GRENADELAUNCHER_FORCE, GRENADELAUNCHER_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade);
 			wsetanim(WANIM_FIRE1, 1, 6, GRENADELAUNCHER_REFIRE);
 		}
 		return TRUE;
@@ -1540,7 +1545,7 @@
 		precache_model("progs/v_dprock2.mdl");
 		precache_model("progs/missile.mdl");
 		precache_sound("weapons/sgun1.wav");
-		registerweapon(7, "Rocket Launcher", w_rocketlauncher, "rocketlauncher", VWEP_ROCKET_LAUNCHER, "progs/v_dprock2.mdl", IT_ROCKETS, 0, 2000, ROCKETLAUNCHER_SINGLE_ROCKET / ROCKETLAUNCHER_SINGLE_REFIRE, WANIMTYPE_ROCKET);
+		registerweapon(7, "Rocket Launcher", w_rocketlauncher, "rocketlauncher", VWEP_ROCKET_LAUNCHER, "progs/v_dprock2.mdl", IT_ROCKETS, 0, 2000, ROCKETLAUNCHER_SINGLE_DAMAGE / ROCKETLAUNCHER_SINGLE_REFIRE, WANIMTYPE_ROCKET);
 		return TRUE;
 	}
 	if (request == WR_HASAMMO)
@@ -1599,21 +1604,24 @@
 			sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
 			self.flags = self.flags - (self.flags & FL_ONGROUND);
 			self.velocity = self.velocity - shotdir * 450;
-			Inventory_AdjustQuantity(self, "rockets", -1);
-			w_muzzleflash(shotorg, 4);
-			LaunchMissile(shotorg, shotdir * 3000, self, ROCKETLAUNCHER_TRIPLE_ROCKET, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket);
-			spiralmissile_orbitentity = newmis;
+			if (Inventory_Quantity(self, "rockets") >= 1)
+			{
+				Inventory_AdjustQuantity(self, "rockets", -1);
+				w_muzzleflash(shotorg, 4);
+				LaunchMissile(shotorg, shotdir * 3000, self, ROCKETLAUNCHER_TRIPLE_DAMAGE, ROCKETLAUNCHER_TRIPLE_FORCE, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket);
+				spiralmissile_orbitentity = newmis;
+			}
 			if (Inventory_Quantity(self, "rockets") >= 1)
 			{
 				Inventory_AdjustQuantity(self, "rockets", -1);
 				w_muzzleflash(shotorg + v_right * 8, 4);
-				LaunchSpiralMissile(shotorg, shotdir, self, ROCKETLAUNCHER_TRIPLE_ROCKET, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket, -12);
-				if (Inventory_Quantity(self, "rockets") >= 1)
-				{
-					Inventory_AdjustQuantity(self, "rockets", -1);
-					w_muzzleflash(shotorg - v_right * 8, 4);
-					LaunchSpiralMissile(shotorg, shotdir, self, ROCKETLAUNCHER_TRIPLE_ROCKET, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket, 12);
-				}
+				LaunchSpiralMissile(shotorg, shotdir, self, ROCKETLAUNCHER_TRIPLE_DAMAGE, ROCKETLAUNCHER_TRIPLE_FORCE, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket, -12);
+			}
+			if (Inventory_Quantity(self, "rockets") >= 1)
+			{
+				Inventory_AdjustQuantity(self, "rockets", -1);
+				w_muzzleflash(shotorg - v_right * 8, 4);
+				LaunchSpiralMissile(shotorg, shotdir, self, ROCKETLAUNCHER_TRIPLE_DAMAGE, ROCKETLAUNCHER_TRIPLE_FORCE, ROCKETLAUNCHER_TRIPLE_RADIUS, "ROCKET", Obituary_Rocket, 12);
 			}
 			wsetanim(WANIM_FIRE1, 1, 6, ROCKETLAUNCHER_TRIPLE_REFIRE);
 			return TRUE;
@@ -1625,7 +1633,7 @@
 			sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
 			Inventory_AdjustQuantity(self, "rockets", -1);
 			w_muzzleflash(shotorg, 4);
-			LaunchMissile(shotorg, shotdir * 5000, self, ROCKETLAUNCHER_SINGLE_ROCKET, ROCKETLAUNCHER_SINGLE_RADIUS, "ROCKET", Obituary_Rocket);
+			LaunchMissile(shotorg, shotdir * 5000, self, ROCKETLAUNCHER_SINGLE_DAMAGE, ROCKETLAUNCHER_SINGLE_FORCE, ROCKETLAUNCHER_SINGLE_RADIUS, "ROCKET", Obituary_Rocket);
 			wsetanim(WANIM_FIRE1, 1, 6, ROCKETLAUNCHER_SINGLE_REFIRE);
 			return TRUE;
 		}
@@ -1693,13 +1701,13 @@
 				{
 					if (cells > PLASMARIFLE_SUPER_CELLS)
 						cells = PLASMARIFLE_SUPER_CELLS;
-					FirePlasma(self, shotorg, shotdir * 25000, PLASMARIFLE_SUPER_CELL * cells, PLASMARIFLE_SUPER_RADIUS, "PLASMARIFLE", Obituary_PlasmaRifle);
+					FirePlasma(self, shotorg, shotdir * 25000, PLASMARIFLE_SUPER_CELL * cells, PLASMARIFLE_SUPER_CELL * cells, PLASMARIFLE_SUPER_RADIUS, "PLASMARIFLE", Obituary_PlasmaRifle);
 				}
 				else
 				{
 					if (cells > PLASMARIFLE_NORMAL_CELLS)
 						cells = PLASMARIFLE_NORMAL_CELLS;
-					FirePlasma(self, shotorg, shotdir * 25000, PLASMARIFLE_NORMAL_CELL * cells, PLASMARIFLE_NORMAL_RADIUS, "PLASMARIFLE", Obituary_PlasmaRifle);
+					FirePlasma(self, shotorg, shotdir * 25000, PLASMARIFLE_NORMAL_CELL * cells, PLASMARIFLE_NORMAL_CELL * cells, PLASMARIFLE_NORMAL_RADIUS, "PLASMARIFLE", Obituary_PlasmaRifle);
 				}
 				Inventory_AdjustQuantity(self, "cells", 0 - cells);
 				/*
@@ -2038,7 +2046,7 @@
 			self.wfiretime = time;
 			Inventory_AdjustQuantity(self, "cells", 0 - cells);
 			w_muzzleflash(shotorg, 4);
-			FirePlasmaBall(self, shotorg, shotdir * 1000, cells * PLASMAWAVE_SINGLE_CELL * 20, PLASMAWAVE_SINGLE_BURNRADIUS, "PLASMAWAVE", Obituary_PlasmaWaveShot);
+			FirePlasmaBall(self, shotorg, shotdir * 1000, cells * PLASMAWAVE_SINGLE_CELL * 20, cells * PLASMAWAVE_SINGLE_CELL * 20, PLASMAWAVE_SINGLE_BURNRADIUS, "PLASMAWAVE", Obituary_PlasmaWaveShot);
 			wsetanim(WANIM_FIRE1, 0, 0, PLASMAWAVE_SINGLE_REFIRE);
 			return TRUE;
 		}
@@ -2071,7 +2079,7 @@
 			{
 				shots = shots - 1;
 				makevectors(ang);
-				FirePlasmaBall(self, shotorg, v_forward * 1000, damage, PLASMAWAVE_WAVE_BURNRADIUS, "PLASMAWAVE", Obituary_PlasmaWaveOverload);
+				FirePlasmaBall(self, shotorg, v_forward * 1000, damage, damage, PLASMAWAVE_WAVE_BURNRADIUS, "PLASMAWAVE", Obituary_PlasmaWaveOverload);
 				ang = ang + '0 1 0' * PLASMAWAVE_WAVE_SPREADANGLEPERSHOT;
 			}
 			wsetanim(WANIM_FIRE1, 0, 0, PLASMAWAVE_WAVE_REFIRE - PLASMAWAVE_WAVE_CHARGETIME);
@@ -2188,10 +2196,12 @@
 float CHAINSAW_REFIRE = 0.1;
 
 float HANDGRENADE_DAMAGE = 120;
+float HANDGRENADE_FORCE = 120;
 float HANDGRENADE_RADIUS = 200;
 float HANDGRENADE_REFIRE = 0.9;
 
 float HOPPER_DAMAGE = 120;
+float HOPPER_FORCE = 120;
 float HOPPER_RADIUS = 200;
 float HOPPER_REFIRE = 0.6;
 
@@ -2224,11 +2234,13 @@
 float JACKHAMMER_SINGLEREFIRE = 0.5;
 
 float GRENADELAUNCHER2_DAMAGE = 120;
+float GRENADELAUNCHER2_FORCE = 120;
 float GRENADELAUNCHER2_AMMO = 3;
 float GRENADELAUNCHER2_RADIUS = 200;
 float GRENADELAUNCHER2_REFIRE = 0.6;
 
 float BACKPACKMORTAR_DAMAGE = 100;
+float BACKPACKMORTAR_FORCE = 100;
 float BACKPACKMORTAR_AMMO = 3;
 float BACKPACKMORTAR_RADIUS = 250;
 float BACKPACKMORTAR_REFIRE = 0.6;
@@ -2259,8 +2271,6 @@
 	if (request == WR_REGISTER)
 	{
 		precache_model("progs/v_axe.mdl");
-		precache_model("progs/spike.mdl");
-		precache_sound("weapons/rocket1i.wav");
 		//registerweapon(1, "Axe", w_axe, "axe", VWEP_AXE, "progs/v_axe.mdl", 0, 0, 2000, AXE_DAMAGE / AXE_REFIRE, WANIMTYPE_SHOTGUN);
 		registerweapon(1, "Axe", w_axe, "pistol", VWEP_AXE, "progs/v_axe.mdl", 0, 0, 2000, AXE_DAMAGE / AXE_REFIRE, WANIMTYPE_SHOTGUN);
 		return TRUE;
@@ -2538,9 +2548,9 @@
 			Inventory_AdjustQuantity(self, "rockets", -1);
 			w_muzzleflash(shotorg, 2);
 			if (self.button0)
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HOPPER_DAMAGE, HOPPER_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "HOPPER", Obituary_Hopper);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HOPPER_DAMAGE, HOPPER_FORCE, HOPPER_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "HOPPER", Obituary_Hopper);
 			else
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HOPPER_DAMAGE, HOPPER_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "HOPPER", Obituary_Hopper);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HOPPER_DAMAGE, HOPPER_FORCE, HOPPER_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "HOPPER", Obituary_Hopper);
 			wsetanim(WANIM_FIRE1, 1, 6, HOPPER_REFIRE);
 		}
 		return TRUE;
@@ -2623,9 +2633,9 @@
 			Inventory_AdjustQuantity(self, "rockets", -1);
 			w_muzzleflash(shotorg, 2);
 			if (self.button0)
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HANDGRENADE_DAMAGE, HANDGRENADE_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade3);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HANDGRENADE_DAMAGE, HANDGRENADE_FORCE, HANDGRENADE_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade3);
 			else
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HANDGRENADE_DAMAGE, HANDGRENADE_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade3);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, HANDGRENADE_DAMAGE, HANDGRENADE_FORCE, HANDGRENADE_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade3);
 			wsetanim(WANIM_FIRE1, 1, 6, HANDGRENADE_REFIRE);
 		}
 		return TRUE;
@@ -3325,9 +3335,9 @@
 			Inventory_AdjustQuantity(self, "rockets", 0 - f);
 			w_muzzleflash(shotorg, 2);
 			if (self.button0)
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER2_DAMAGE * f, GRENADELAUNCHER2_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade2);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER2_DAMAGE * f, GRENADELAUNCHER2_FORCE * f, GRENADELAUNCHER2_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade2);
 			else
-				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER2_DAMAGE * f, GRENADELAUNCHER2_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade2);
+				LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, GRENADELAUNCHER2_DAMAGE * f, GRENADELAUNCHER2_FORCE * f, GRENADELAUNCHER2_RADIUS, GRENADE_IMMUNETODAMAGE, 3, "GRENADE", Obituary_Grenade2);
 			wsetanim(WANIM_FIRE1, 1, 6, GRENADELAUNCHER_REFIRE);
 		}
 		return TRUE;
@@ -3418,9 +3428,9 @@
 			{
 				v = shotdir * 200 + v_up * 600 + randomvec() * f * 30;
 				if (self.button3)
-					LaunchGrenade(shotorg, v, self, BACKPACKMORTAR_DAMAGE, BACKPACKMORTAR_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "BACKPACKMORTAR", Obituary_BackpackMortar);
+					LaunchGrenade(shotorg, v, self, BACKPACKMORTAR_DAMAGE, BACKPACKMORTAR_FORCE, BACKPACKMORTAR_RADIUS, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "BACKPACKMORTAR", Obituary_BackpackMortar);
 				else
-					LaunchGrenade(shotorg, v, self, BACKPACKMORTAR_DAMAGE, BACKPACKMORTAR_RADIUS, GRENADE_IMMUNETODAMAGE, 1.5, "BACKPACKMORTAR", Obituary_BackpackMortar);
+					LaunchGrenade(shotorg, v, self, BACKPACKMORTAR_DAMAGE, BACKPACKMORTAR_FORCE, BACKPACKMORTAR_RADIUS, GRENADE_IMMUNETODAMAGE, 1.5, "BACKPACKMORTAR", Obituary_BackpackMortar);
 				f = f - 1;
 			}
 			wsetanim(WANIM_FIRE1, 1, 6, BACKPACKMORTAR_REFIRE);
@@ -3622,7 +3632,7 @@
 void() PlasmaChargeExplode =
 {
 	fightdone = time + 1; // delay stuff until fighting is over
-	BecomeExplosion(self, self.dmg, self.dmg2, self.deathtype, '-1 0 0', self.effects & EF_BLUE, self.obitfunc1);
+	BecomeExplosion(self, self.dmg, self.count2, self.dmg2, self.deathtype, '-1 0 0', self.effects & EF_BLUE, self.obitfunc1);
 };
 
 /*
@@ -3665,7 +3675,7 @@
 		remove(self);
 };
 
-void(vector org, vector vel, entity own, float damg, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchPlasmaCharge =
+void(vector org, vector vel, entity own, float damg, float force, float blastradius, string dethtype, void(entity t, entity a, string m, float dtyp) obitfunc) LaunchPlasmaCharge =
 {
 	fightdone = time + 1; // delay stuff until fighting is over
 	newmis = spawn ();
@@ -3688,20 +3698,24 @@
 	//newmis.health = 40;     // can be detonated inflight
 	newmis.cnt = time + 15; // 15 seconds max flight time
 	newmis.dmg = damg;
+	newmis.count2 = force;
 	newmis.dmg2 = blastradius;
 	newmis.wait = time;
 	newmis.effects = EF_LOWPRECISION;
 
 	if (own.items & IT_QUAD)
 	{
-		newmis.dmg = newmis.dmg * 4;
 		newmis.effects = newmis.effects | EF_BLUE;
+		newmis.dmg = newmis.dmg * 4;
+		newmis.count2 = newmis.count2 * 4;
 	}
 
 	setmodel (newmis, "progs/plasmashot.spr32");
 	setsize (newmis, '0 0 0', '0 0 0');
 	setorigin (newmis, org);
-	newmis.scale = blastradius / 100;
+	newmis.scale = damg / 200;
+	if (newmis.scale < 0.25)
+		newmis.scale = 0.25;
 };
 
 void(entity targ, entity attacker, string dmsg, float dtype) Obituary_PCRifleCharge =
@@ -3748,27 +3762,49 @@
 		Obituary_Fallback(targ, attacker, dmsg, dtype);
 };
 
+/*
+float PCRIFLE_CHARGE_STARTFREECELLS = 0;
+float PCRIFLE_CHARGE_FREECELLS = 0;
+float PCRIFLE_CHARGE_CELLS = 30;
+float PCRIFLE_CHARGE_BASEDAMAGE = 20;
+float PCRIFLE_CHARGE_CELLDAMAGE = 13;
+float PCRIFLE_CHARGE_BASEFORCE = 0;
+float PCRIFLE_CHARGE_CELLFORCE = 20;
+float PCRIFLE_CHARGE_BASERADIUS = 150;
+float PCRIFLE_CHARGE_CELLRADIUS = 0;
+float PCRIFLE_CHARGE_REFIRE = 0.2;
+float PCRIFLE_CHARGE_BASEKICKBACK = 0;
+float PCRIFLE_CHARGE_CELLKICKBACK = 0;
+float PCRIFLE_CHARGE_CELLTIME = 0.1;
+float PCRIFLE_CHARGE_BASEMUZZLEFLASH = 0;
+float PCRIFLE_CHARGE_CELLMUZZLEFLASH = 0;
+float PCRIFLE_CHARGE_VELOCITY = 5000;
+*/
 float PCRIFLE_CHARGE_STARTFREECELLS = 0;
 float PCRIFLE_CHARGE_FREECELLS = 0;
-float PCRIFLE_CHARGE_CELLS = 5;
-float PCRIFLE_CHARGE_BASEDAMAGE = 60;
-float PCRIFLE_CHARGE_CELLDAMAGE = 20;
-float PCRIFLE_CHARGE_BASERADIUS = 5;
-float PCRIFLE_CHARGE_CELLRADIUS = 20;
-float PCRIFLE_CHARGE_REFIRE = 0.1;
+float PCRIFLE_CHARGE_CELLS = 0;
+float PCRIFLE_CHARGE_BASEDAMAGE = 90;
+float PCRIFLE_CHARGE_CELLDAMAGE = 0;
+float PCRIFLE_CHARGE_BASEFORCE = 90;
+float PCRIFLE_CHARGE_CELLFORCE = 0;
+float PCRIFLE_CHARGE_BASERADIUS = 150;
+float PCRIFLE_CHARGE_CELLRADIUS = 0;
+float PCRIFLE_CHARGE_REFIRE = 0.8;
 float PCRIFLE_CHARGE_BASEKICKBACK = 0;
 float PCRIFLE_CHARGE_CELLKICKBACK = 0;
 float PCRIFLE_CHARGE_CELLTIME = 0.1;
 float PCRIFLE_CHARGE_BASEMUZZLEFLASH = 0;
-float PCRIFLE_CHARGE_CELLMUZZLEFLASH = 2;
+float PCRIFLE_CHARGE_CELLMUZZLEFLASH = 0;
 float PCRIFLE_CHARGE_VELOCITY = 5000;
-float PCRIFLE_SHRED_DAMAGE = 12;
+float PCRIFLE_SHRED_DAMAGE = 9;
 float PCRIFLE_SHRED_SUPERDAMAGE = 30;
 float PCRIFLE_SHRED_KICKBACK = 0;
 float PCRIFLE_SHRED_SUPERKICKBACK = 0;
-float PCRIFLE_SHRED_REFIRE = 0.05;
+float PCRIFLE_SHRED_REFIRE = 0.1;
+float PCRIFLE_SHRED_MUZZLEFLASH = 2;
 float PCRIFLE_SHRED_VELOCITY = 10000;
 
+/*
 float(float request) w_pcrifle =
 {
 	local float cells, shots, damage;
@@ -3779,6 +3815,8 @@
 		precache_model("progs/plasmashot.spr32");
 		precache_sound("plasma/plasma.wav");
 		precache_sound("plasma/plasexpl.wav");
+		precache_model("progs/spike.mdl");
+		precache_sound("weapons/rocket1i.wav");
 		registerweapon(1, "PCRifle", w_pcrifle, "pistol", VWEP_LIGHTNING, "progs/v_dplight.mdl", IT_SHELLS, 0, 500, 9999, WANIMTYPE_LIGHTNING);
 		return TRUE;
 	}
@@ -3798,15 +3836,13 @@
 	{
 		if (self.wanim_id == WANIM_FIRE1)
 		{
-			/*
-			if (self.button3)
-			//if (Inventory_Quantity(self, "nails") >= 1)
-			{
-				// note that wburst is > 0 at this point, so the shred shots will wburst cells to supercharge
-				wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
-				return TRUE;
-			}
-			*/
+			//if (self.button3)
+			////if (Inventory_Quantity(self, "nails") >= 1)
+			//{
+			//	// note that wburst is > 0 at this point, so the shred shots will wburst cells to supercharge
+			//	wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
+			//	return TRUE;
+			//}
 			if (self.button0)
 			{
 				if (self.wburst < PCRIFLE_CHARGE_CELLS)
@@ -3828,8 +3864,8 @@
 				self.flags = self.flags - (self.flags & FL_ONGROUND);
 				self.wfiretime = time;
 				w_muzzleflash(shotorg, PCRIFLE_CHARGE_BASEMUZZLEFLASH + self.wburst * PCRIFLE_CHARGE_CELLMUZZLEFLASH);
-				//FirePlasma(self, shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
-				LaunchPlasmaCharge(shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, self, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+				//FirePlasma(self, shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASEFORCE + self.wburst * PCRIFLE_CHARGE_CELLFORCE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+				LaunchPlasmaCharge(shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, self, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASEFORCE + self.wburst * PCRIFLE_CHARGE_CELLFORCE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
 				self.wburst = 0;
 				wsetanim(WANIM_FIRE3, 0, 0, PCRIFLE_CHARGE_REFIRE);
 				return TRUE;
@@ -3843,7 +3879,7 @@
 				W_Hostile();
 				sound(self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
 				W_SetupShot();
-				w_muzzleflash(shotorg, 2);
+				w_muzzleflash(shotorg, PCRIFLE_SHRED_MUZZLEFLASH);
 				//Inventory_AdjustQuantity(self, "nails", -1);
 				if (self.wburst > 0)
 				{
@@ -3860,13 +3896,11 @@
 				}
 				return TRUE;
 			}
-			/*
-			if (self.button0)
-			{
-				wsetanim(WANIM_FIRE1, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
-				return TRUE;
-			}
-			*/
+			//if (self.button0)
+			//{
+			//	wsetanim(WANIM_FIRE1, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+			//	return TRUE;
+			//}
 			wsetanim(WANIM_READY, 0, 0, 0);
 			return TRUE;
 		}
@@ -3948,6 +3982,418 @@
 	}
 	return TRUE;
 };
+*/
+/*
+float(float request) w_pcrifle =
+{
+	local float cells, shots, damage;
+	local vector ang;
+	if (request == WR_REGISTER)
+	{
+		precache_model("progs/v_dplight.mdl");
+		precache_model("progs/plasmashot.spr32");
+		precache_sound("plasma/plasma.wav");
+		precache_sound("plasma/plasexpl.wav");
+		precache_model("progs/spike.mdl");
+		precache_sound("weapons/rocket1i.wav");
+		registerweapon(1, "PCRifle", w_pcrifle, "pistol", VWEP_LIGHTNING, "progs/v_dplight.mdl", IT_SHELLS, 0, 500, 9999, WANIMTYPE_LIGHTNING);
+		return TRUE;
+	}
+	if (request == WR_HASAMMO)
+		return TRUE;
+	if (request == WR_SETUP)
+	{
+		wsetanim(WANIM_RAISE, 6, -2, 0.2);
+		return TRUE;
+	}
+	if (request == WR_INSTANTSETUP)
+	{
+		self.wburst = PCRIFLE_CHARGE_FREECELLS - 1; // immediate +1 from the animation code
+		wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+		return TRUE;
+	}
+	if (request == WR_ANIMATIONFRAME)
+	{
+		if (self.wanim_id == WANIM_READY)
+		{
+			if (self.wburst < PCRIFLE_CHARGE_CELLS)
+			//if (self.wburst < PCRIFLE_CHARGE_FREECELLS || Inventory_Quantity(self, "shells") >= 1)
+			{
+				//if (self.wburst >= PCRIFLE_CHARGE_FREECELLS)
+				//	Inventory_AdjustQuantity(self, "shells", -1);
+				self.wburst = self.wburst + 1;
+				sound(self, CHAN_WEAPON, "plasma/plasexpl.wav", 0.5, ATTN_STATIC);
+			}
+			if (self.button3)
+			//if (Inventory_Quantity(self, "nails") >= 1)
+			{
+				// note that wburst is > 0 at this point, so the shred shots will wburst cells to supercharge
+				self.wburst = 0;
+				wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
+				return TRUE;
+			}
+			if (self.button0)
+			{
+				W_Hostile();
+				sound(self, CHAN_WEAPON, "plasma/plasma.wav", 1, ATTN_NORM);
+				self.velocity = self.velocity - shotdir * (PCRIFLE_CHARGE_BASEKICKBACK + self.wburst * PCRIFLE_CHARGE_CELLKICKBACK);
+				self.flags = self.flags - (self.flags & FL_ONGROUND);
+				self.wfiretime = time;
+				w_muzzleflash(shotorg, PCRIFLE_CHARGE_BASEMUZZLEFLASH + self.wburst * PCRIFLE_CHARGE_CELLMUZZLEFLASH);
+				//FirePlasma(self, shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASEFORCE + self.wburst * PCRIFLE_CHARGE_CELLFORCE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+				LaunchPlasmaCharge(shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, self, PCRIFLE_CHARGE_BASEDAMAGE + self.wburst * PCRIFLE_CHARGE_CELLDAMAGE, PCRIFLE_CHARGE_BASEFORCE + self.wburst * PCRIFLE_CHARGE_CELLFORCE, PCRIFLE_CHARGE_BASERADIUS + self.wburst * PCRIFLE_CHARGE_CELLRADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+				self.wburst = 0;
+				wsetanim(WANIM_FIRE3, 0, 0, PCRIFLE_CHARGE_REFIRE);
+				return TRUE;
+			}
+			if (self.switchweaponclass != self.weaponclass)
+			{
+				wsetanim(WANIM_LOWER, 5, 2, 0.2);
+				return TRUE;
+			}
+			return TRUE;
+		}
+		else if (self.wanim_id == WANIM_FIRE2)
+		{
+			if (self.button3)
+			//if (Inventory_Quantity(self, "nails"))
+			{
+				W_Hostile();
+				sound(self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
+				W_SetupShot();
+				w_muzzleflash(shotorg, PCRIFLE_SHRED_MUZZLEFLASH);
+				//Inventory_AdjustQuantity(self, "nails", -1);
+				if (self.wburst > 0)
+				{
+					self.wburst = self.wburst - 1;
+					self.velocity = self.velocity - shotdir * PCRIFLE_SHRED_KICKBACK;
+					self.flags = self.flags - (self.flags & FL_ONGROUND);
+					FireBullets(self, self, 1, 1, PCRIFLE_SHRED_SUPERDAMAGE, PCRIFLE_SHRED_SUPERDAMAGE, 0, 0, shotdir * PCRIFLE_SHRED_VELOCITY, 0, "PCRIFLE", DT_NAIL, Obituary_PCRifleShred);
+				}
+				else
+				{
+					self.velocity = self.velocity - shotdir * PCRIFLE_SHRED_SUPERKICKBACK;
+					self.flags = self.flags - (self.flags & FL_ONGROUND);
+					FireBullets(self, self, 1, 1, PCRIFLE_SHRED_DAMAGE, PCRIFLE_SHRED_DAMAGE, 0, 0, shotdir * PCRIFLE_SHRED_VELOCITY, 0, "PCRIFLE", DT_NAIL, Obituary_PCRifleShred);
+				}
+				return TRUE;
+			}
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+			return TRUE;
+		}
+		return TRUE;
+	}
+	if (request != WR_FRAME)
+		return FALSE;
+	wanimate();
+	//if (self.wburst)
+		self.currentammo = self.wburst;
+	//else if (self.wanim_id == WANIM_FIRE2)
+	//	self.currentammo = Inventory_Quantity(self, "nails");
+	//else
+	//	self.currentammo = Inventory_Quantity(self, "shells");
+	if (self.aimtarg) // bot target
+	{
+		if (time > self.altfirechecktimeout)
+		{
+			self.altfirechecktimeout = time + 0.1 + random() * 0.2;
+			if (time > self.altfiretimeout)
+			if (random() < 0.2)
+				self.altfiretimeout = time + 0.5 + random() * 0.5;
+		}
+		if (time < self.altfiretimeout)
+			self.button3 = w_directattackaim(3000, 1);
+		else
+			self.button0 = w_directattackaim(5000, 1);
+	}
+	if (self.wanim_id == WANIM_RAISE)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_LOWER)
+	{
+		if (time >= self.wanim_endtime)
+			wswitch();
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_READY)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_FIRE2)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_FIRE3)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+		return TRUE;
+	}
+	return TRUE;
+};
+*/
+float(float request) w_pcrifle =
+{
+	local float cells, shots, damage;
+	local vector ang;
+	if (request == WR_REGISTER)
+	{
+		precache_model("progs/v_dplight.mdl");
+		precache_model("progs/plasmashot.spr32");
+		precache_sound("plasma/plasma.wav");
+		precache_sound("plasma/plasexpl.wav");
+		precache_model("progs/spike.mdl");
+		precache_sound("weapons/rocket1i.wav");
+		registerweapon(1, "PCRifle", w_pcrifle, "pistol", VWEP_LIGHTNING, "progs/v_dplight.mdl", IT_SHELLS, 0, 500, 9999, WANIMTYPE_LIGHTNING);
+		return TRUE;
+	}
+	if (request == WR_HASAMMO)
+		return TRUE;
+	if (request == WR_SETUP)
+	{
+		wsetanim(WANIM_RAISE, 6, -2, 0.2);
+		return TRUE;
+	}
+	if (request == WR_INSTANTSETUP)
+	{
+		wsetanim(WANIM_READY, 0, 0, 0);
+		return TRUE;
+	}
+	if (request == WR_ANIMATIONFRAME)
+	{
+		if (self.wanim_id == WANIM_FIRE2)
+		{
+			if (self.button3)
+			//if (Inventory_Quantity(self, "nails"))
+			{
+				W_Hostile();
+				sound(self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
+				W_SetupShot();
+				w_muzzleflash(shotorg, PCRIFLE_SHRED_MUZZLEFLASH);
+				//Inventory_AdjustQuantity(self, "nails", -1);
+				if (self.wburst > 0)
+				{
+					self.wburst = self.wburst - 1;
+					self.velocity = self.velocity - shotdir * PCRIFLE_SHRED_KICKBACK;
+					self.flags = self.flags - (self.flags & FL_ONGROUND);
+					FireBullets(self, self, 1, 1, PCRIFLE_SHRED_SUPERDAMAGE, PCRIFLE_SHRED_SUPERDAMAGE, 0, 0, shotdir * PCRIFLE_SHRED_VELOCITY, 0, "PCRIFLE", DT_NAIL, Obituary_PCRifleShred);
+				}
+				else
+				{
+					self.velocity = self.velocity - shotdir * PCRIFLE_SHRED_SUPERKICKBACK;
+					self.flags = self.flags - (self.flags & FL_ONGROUND);
+					FireBullets(self, self, 1, 1, PCRIFLE_SHRED_DAMAGE, PCRIFLE_SHRED_DAMAGE, 0, 0, shotdir * PCRIFLE_SHRED_VELOCITY, 0, "PCRIFLE", DT_NAIL, Obituary_PCRifleShred);
+				}
+				return TRUE;
+			}
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+			return TRUE;
+		}
+		return TRUE;
+	}
+	if (request != WR_FRAME)
+		return FALSE;
+	wanimate();
+	self.currentammo = 0;
+	//if (self.wanim_id == WANIM_FIRE2)
+	//	self.currentammo = Inventory_Quantity(self, "nails");
+	//else
+	//	self.currentammo = Inventory_Quantity(self, "shells");
+	if (self.aimtarg) // bot target
+	{
+		if (time > self.altfirechecktimeout)
+		{
+			self.altfirechecktimeout = time + 0.1 + random() * 0.2;
+			if (time > self.altfiretimeout)
+			if (random() < 0.2)
+				self.altfiretimeout = time + 0.5 + random() * 0.5;
+		}
+		if (time < self.altfiretimeout)
+			self.button3 = w_directattackaim(3000, 1);
+		else
+			self.button0 = w_directattackaim(5000, 1);
+	}
+	if (self.wanim_id == WANIM_RAISE)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 0, 0, 0);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_LOWER)
+	{
+		if (time >= self.wanim_endtime)
+			wswitch();
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_READY)
+	{
+		if (self.button3)
+		//if (Inventory_Quantity(self, "nails") >= 1)
+		{
+			wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
+			return TRUE;
+		}
+		if (self.button0)
+		{
+			W_Hostile();
+			sound(self, CHAN_WEAPON, "plasma/plasma.wav", 1, ATTN_NORM);
+			self.velocity = self.velocity - shotdir * (PCRIFLE_CHARGE_BASEKICKBACK + self.wburst * PCRIFLE_CHARGE_CELLKICKBACK);
+			self.flags = self.flags - (self.flags & FL_ONGROUND);
+			self.wfiretime = time;
+			w_muzzleflash(shotorg, PCRIFLE_CHARGE_BASEMUZZLEFLASH);
+			//FirePlasma(self, shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, PCRIFLE_CHARGE_BASEDAMAGE, PCRIFLE_CHARGE_BASEFORCE, PCRIFLE_CHARGE_BASERADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+			LaunchPlasmaCharge(shotorg, shotdir * PCRIFLE_CHARGE_VELOCITY, self, PCRIFLE_CHARGE_BASEDAMAGE, PCRIFLE_CHARGE_BASEFORCE, PCRIFLE_CHARGE_BASERADIUS, "PCRIFLE", Obituary_PCRifleCharge);
+			wsetanim(WANIM_FIRE3, 0, 0, PCRIFLE_CHARGE_REFIRE);
+			return TRUE;
+		}
+		if (self.switchweaponclass != self.weaponclass)
+		{
+			wsetanim(WANIM_LOWER, 5, 2, 0.2);
+			return TRUE;
+		}
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_FIRE2)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_FIRE2, 1, 4, 4 * PCRIFLE_SHRED_REFIRE);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_FIRE3)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 1, 4, 4 * PCRIFLE_CHARGE_CELLTIME);
+		return TRUE;
+	}
+	return TRUE;
+};
+
+
+float MISSILELAUNCHER_SINGLE_DAMAGE = 300;
+float MISSILELAUNCHER_SINGLE_FORCE = 150;
+float MISSILELAUNCHER_SINGLE_RADIUS = 200;
+float MISSILELAUNCHER_SINGLE_REFIRE = 0.3;
+float MISSILELAUNCHER_SHOCKWAVE_DAMAGE = 20;
+float MISSILELAUNCHER_SHOCKWAVE_FORCE = 300;
+float MISSILELAUNCHER_SHOCKWAVE_RADIUS = 300;
+float MISSILELAUNCHER_SHOCKWAVE_REFIRE = 0.3;
+
+void(entity targ, entity attacker, string dmsg, float dtype) Obituary_Missile =
+{
+	if (dtype == DTYPE_PLAYER)
+	{
+		deathstring1 = targ.netname;
+		deathstring2 = " was blasted by a missile from ";
+		deathstring3 = attacker.netname;
+		deathstring4 = "";
+		if (targ.bodyhealth < 1)
+			deathstring2 = " was obliterated by ";
+	}
+	else
+		Obituary_Fallback(targ, attacker, dmsg, dtype);
+};
+
+float(float request) w_missilelauncher =
+{
+	if (request == WR_REGISTER)
+	{
+		precache_model("progs/v_dprock2.mdl");
+		precache_model("progs/missile.mdl");
+		precache_model("progs/flame2.mdl");
+		precache_sound("weapons/sgun1.wav");
+		registerweapon(2, "Missile Launcher", w_missilelauncher, "pistol", VWEP_ROCKET_LAUNCHER, "progs/v_dprock2.mdl", IT_ROCKETS, 0, 2000, 9998, WANIMTYPE_ROCKET);
+		return TRUE;
+	}
+	if (request == WR_HASAMMO)
+		return Inventory_Quantity(self, "rockets") > 0;
+	if (request == WR_SETUP)
+	{
+		wsetanim(WANIM_RAISE, 8, -2, 0.2);
+		return TRUE;
+	}
+	if (request == WR_INSTANTSETUP)
+	{
+		wsetanim(WANIM_READY, 0, 0, 0);
+		return TRUE;
+	}
+	if (request != WR_FRAME)
+		return FALSE;
+	wanimate();
+	self.currentammo = Inventory_Quantity(self, "rockets");
+	if (self.aimtarg) // bot target
+	{
+		if (time > self.altfirechecktimeout)
+		{
+			self.altfirechecktimeout = time + 0.1 + random() * 0.2;
+			if (time > self.altfiretimeout)
+			if (random() < 0.2)
+				self.altfiretimeout = time + 0.5 + random() * 0.5;
+		}
+		if (time < self.altfiretimeout)
+			self.button3 = w_directattackaim(3000, 1);
+		else
+			self.button0 = w_directattackaim(5000, 1);
+	}
+	if (self.wanim_id == WANIM_RAISE)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 0, 0, 0);
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_LOWER)
+	{
+		if (time >= self.wanim_endtime)
+			wswitch();
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_READY)
+	{
+		if (self.switchweaponclass != self.weaponclass)
+		{
+			wsetanim(WANIM_LOWER, 7, 2, 0.2);
+			return TRUE;
+		}
+		if (self.button3)
+		if (Inventory_Quantity(self, "rockets") > 0)
+		{
+			W_Hostile();
+			sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
+			self.flags = self.flags - (self.flags & FL_ONGROUND);
+			Inventory_AdjustQuantity(self, "rockets", -1);
+			w_muzzleflash(shotorg, 0);
+			LaunchMissile(shotorg, shotdir * 10000, self, MISSILELAUNCHER_SHOCKWAVE_DAMAGE, MISSILELAUNCHER_SHOCKWAVE_FORCE, MISSILELAUNCHER_SHOCKWAVE_RADIUS, "MISSILE", Obituary_Missile);
+			wsetanim(WANIM_FIRE1, 1, 6, MISSILELAUNCHER_SHOCKWAVE_REFIRE);
+			return TRUE;
+		}
+		if (self.button0)
+		if (Inventory_Quantity(self, "rockets") > 0)
+		{
+			W_Hostile();
+			sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
+			Inventory_AdjustQuantity(self, "rockets", -1);
+			w_muzzleflash(shotorg, 0);
+			LaunchMissile(shotorg, shotdir * 5000, self, MISSILELAUNCHER_SINGLE_DAMAGE, MISSILELAUNCHER_SINGLE_FORCE, MISSILELAUNCHER_SINGLE_RADIUS, "MISSILE", Obituary_Missile);
+			//newmis.th_gib = MissileExplodeFireballs;
+			wsetanim(WANIM_FIRE1, 1, 6, MISSILELAUNCHER_SINGLE_REFIRE);
+			return TRUE;
+		}
+		return TRUE;
+	}
+	if (self.wanim_id == WANIM_FIRE1)
+	{
+		if (time >= self.wanim_endtime)
+			wsetanim(WANIM_READY, 0, 0, 0);
+		return TRUE;
+	}
+	return TRUE;
+};
 
 void() grapple_precache;
 void() W_Precache =
@@ -3961,38 +4407,43 @@
 	grapple_precache();
 
 	if (cvar("temp1") & 8388608)
+	{
 		w_pcrifle(WR_REGISTER);
+		w_missilelauncher(WR_REGISTER);
+	}
 	else
+	{
 		w_axe(WR_REGISTER);
-	//w_chainsaw(WR_REGISTER);
-	//w_pistol(WR_REGISTER);
-	//w_shotgun(WR_REGISTER);
-	//w_plasmashotgun(WR_REGISTER);
-	w_prickler(WR_REGISTER);
-	//w_dbshotgun(WR_REGISTER);
-	w_scattergun(WR_REGISTER);
-	if (cvar("registered"))
-		w_laserrifle(WR_REGISTER);
-	w_nailgun(WR_REGISTER);
-	w_supernailgun(WR_REGISTER);
-	//w_grenadelauncher(WR_REGISTER);
-	w_backpackmortar(WR_REGISTER);
-	//w_rocketlauncher(WR_REGISTER);
-	w_jackhammer(WR_REGISTER);
-	w_thunderbolt(WR_REGISTER);
-	w_plasmarifle(WR_REGISTER);
-	w_plasmawave(WR_REGISTER);
-
-	//w_handgrenade(WR_REGISTER);
-	//w_hopper(WR_REGISTER);
-	//w_rifle(WR_REGISTER);
-	//w_machinegun(WR_REGISTER);
-	//w_vulcan(WR_REGISTER);
-	//w_executioner(WR_REGISTER);
-	//w_jackhammer(WR_REGISTER);
-	//w_grenadelauncher2(WR_REGISTER);
-	//w_backpackmortar(WR_REGISTER);
-	//w_incinerator(WR_REGISTER);
-	//w_railgun(WR_REGISTER);
+		//w_chainsaw(WR_REGISTER);
+		//w_pistol(WR_REGISTER);
+		//w_shotgun(WR_REGISTER);
+		//w_plasmashotgun(WR_REGISTER);
+		w_prickler(WR_REGISTER);
+		//w_dbshotgun(WR_REGISTER);
+		w_scattergun(WR_REGISTER);
+		if (cvar("registered"))
+			w_laserrifle(WR_REGISTER);
+		w_nailgun(WR_REGISTER);
+		w_supernailgun(WR_REGISTER);
+		//w_grenadelauncher(WR_REGISTER);
+		w_backpackmortar(WR_REGISTER);
+		//w_rocketlauncher(WR_REGISTER);
+		w_jackhammer(WR_REGISTER);
+		w_thunderbolt(WR_REGISTER);
+		w_plasmarifle(WR_REGISTER);
+		w_plasmawave(WR_REGISTER);
+	
+		//w_handgrenade(WR_REGISTER);
+		//w_hopper(WR_REGISTER);
+		//w_rifle(WR_REGISTER);
+		//w_machinegun(WR_REGISTER);
+		//w_vulcan(WR_REGISTER);
+		//w_executioner(WR_REGISTER);
+		//w_jackhammer(WR_REGISTER);
+		//w_grenadelauncher2(WR_REGISTER);
+		//w_backpackmortar(WR_REGISTER);
+		//w_incinerator(WR_REGISTER);
+		//w_railgun(WR_REGISTER);
+	}
 };
 
Index: dpmod/qc/xplowall.qc
diff -u dpmod/qc/xplowall.qc:1.1.1.1 dpmod/qc/xplowall.qc:1.2
--- dpmod/qc/xplowall.qc:1.1.1.1	Thu Sep 19 15:07:24 2002
+++ dpmod/qc/xplowall.qc	Thu Jan 29 19:08:13 2004
@@ -60,7 +60,7 @@
 	{
 		t3 = FALSE; // spawn rubble from each explosion
 		self.cnt2 = self.cnt2 - 1;
-		Explosion(v, self.owner, self.owner.dmg, self.owner.dmg, self.owner.deathtype, '0 0 0', FALSE, Obituary_Generic);
+		Explosion(v, self.owner, self.owner.dmg, self.owner.dmg, self.owner.dmg, self.owner.deathtype, '0 0 0', FALSE, Obituary_Generic);
 	}
 	t2 = floor(self.cnt);
 	self.cnt = self.cnt + self.count;


More information about the twilight-commits mailing list