summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorenneract <trem.redman@gmail.com>2014-11-24 02:20:51 +0100
committerenneract <trem.redman@gmail.com>2014-11-24 02:20:51 +0100
commitb0a9981e09bbc7c30769f680a4e0ff17c9ea8239 (patch)
treed369ba2f0cebcf878ee32b420ec19a0786e9b4e8 /src/game
parentf4413207a03658c719987d02fdbb87443843f43b (diff)
Implement the Lightning Gun.
Diffstat (limited to 'src/game')
-rw-r--r--src/game/bg_misc.c25
-rw-r--r--src/game/bg_mod.h1
-rw-r--r--src/game/bg_public.h1
-rw-r--r--src/game/g_weapon.c49
-rw-r--r--src/game/tremulous.h8
5 files changed, 81 insertions, 3 deletions
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 742363d..efdc300 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -3575,6 +3575,31 @@ static const weaponAttributes_t bg_weapons[ ] =
TEAM_HUMANS //team_t team;
},
{
+ WP_LIGHTNING_GUN, //int weaponNum;
+ LIGHTNING_PRICE, //int price;
+ STAGE_GE_5, //int stages
+ SLOT_WEAPON, //int slots;
+ "lightning", //char *weaponName;
+ "[yefarms]Lightning Gun", //char *humanName;
+ "This is a lightning gun. It guns lightning.",
+ LIGHTNING_AMMO, //int maxAmmo;
+ 0, //int maxClips;
+ qfalse, //int infiniteAmmo;
+ qtrue, //int usesEnergy;
+ LIGHTNING_REPEAT, //int repeatRate1;
+ 0, //int repeatRate2;
+ 0, //int repeatRate3;
+ 0, //int reloadTime;
+ LIGHTNING_K_SCALE, //float knockbackScale;
+ qfalse, //qboolean hasAltMode;
+ qfalse, //qboolean hasThirdMode;
+ qfalse, //qboolean canZoom;
+ 90.0f, //float zoomFov;
+ qtrue, //qboolean purchasable;
+ qtrue, //qboolean longRanged;
+ TEAM_HUMANS //team_t team;
+ },
+ {
WP_LUCIFER_CANNON, //int weaponNum;
LCANNON_PRICE, //int price;
STAGE_GE_5, //int stages
diff --git a/src/game/bg_mod.h b/src/game/bg_mod.h
index 4929b32..6f09037 100644
--- a/src/game/bg_mod.h
+++ b/src/game/bg_mod.h
@@ -8,6 +8,7 @@ MOD( MOD_CHAINGUN ),
MOD( MOD_PRIFLE ),
MOD( MOD_MDRIVER ),
MOD( MOD_LASGUN ),
+MOD( MOD_LIGHTNING ),
MOD( MOD_LCANNON ),
MOD( MOD_LCANNON_SPLASH ),
MOD( MOD_FLAMER ),
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index c0b6381..18b0d2e 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -356,6 +356,7 @@ typedef enum
WP_CHAINGUN,
WP_FLAMER,
WP_PULSE_RIFLE,
+ WP_LIGHTNING_GUN,
WP_LUCIFER_CANNON,
WP_ROCKET_LAUNCHER,
WP_GRENADE,
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index d869fb1..1c333ab 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -819,9 +819,7 @@ void LCChargeFire( gentity_t *ent, qboolean secondary )
/*
======================================================================
-
-PULSE RIFLE
-
+ROCKET LAUNCHER
======================================================================
*/
@@ -830,6 +828,48 @@ void rocketLauncherFire( gentity_t *ent )
fire_rocket( ent, muzzle, forward );
}
+
+/*
+======================================================================
+LIGHTNING GUN
+======================================================================
+*/
+
+void lightningGunFire( gentity_t *ent )
+{
+ vec3_t start, end;
+ trace_t tr;
+ gentity_t *target;
+
+ VectorMA( muzzle, LIGHTNING_RANGE, forward, end );
+
+ G_UnlaggedOn( ent, muzzle, LIGHTNING_RANGE );
+ trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
+ G_UnlaggedOff( );
+
+ if( tr.fraction == 1.0f ||
+ tr.entityNum == ENTITYNUM_NONE ||
+ ( tr.surfaceFlags & SURF_NOIMPACT ) )
+ return;
+
+ target = g_entities + tr.entityNum;
+
+ if( target->s.eType == ET_PLAYER || target->s.eType == ET_BUILDABLE )
+ BloodSpurt( ent, target, &tr );
+ else
+ {
+ gentity_t *tent;
+
+ tent = G_TempEntity( tr.endpos, EV_MISSILE_MISS );
+ tent->s.eventParm = DirToByte( tr.plane.normal );
+ tent->s.weapon = ent->s.weapon;
+ tent->s.generic1 = ent->s.generic1;
+ }
+
+ G_Damage( target, ent, ent, forward, tr.endpos, LIGHTNING_DAMAGE, 0, MOD_LIGHTNING );
+}
+
+
/*
======================================================================
TESLA GENERATOR
@@ -1976,6 +2016,9 @@ void FireWeapon( gentity_t *ent )
case WP_ROCKET_LAUNCHER:
rocketLauncherFire( ent );
break;
+ case WP_LIGHTNING_GUN:
+ lightningGunFire( ent );
+ break;
case WP_GRENADE:
throwGrenade( ent );
break;
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index e7512d5..b42a7b4 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -514,6 +514,14 @@ TREMULOUS EDGE MOD SRC FILE
#define PRIFLE_SECONDARY_SPEED 800
#define PRIFLE_SECONDARY_REPEAT 400
+#define LIGHTNING_PRICE 500
+#define LIGHTNING_AMMO 500
+#define LIGHTNING_K_SCALE 500
+#define LIGHTNING_DPS 100 // damage per second
+#define LIGHTNING_REPEAT 50 // keep it as low as possible
+#define LIGHTNING_DAMAGE ( LIGHTNING_DPS * LIGHTNING_REPEAT / 1000 )
+#define LIGHTNING_RANGE 450
+
#define LCANNON_PRICE 600
#define LCANNON_AMMO 80
#define LCANNON_K_SCALE 1.0f