diff --git a/quakec/fallout2/combat.qc b/quakec/fallout2/combat.qc index 3e20f9cd0..0e64e9930 100644 --- a/quakec/fallout2/combat.qc +++ b/quakec/fallout2/combat.qc @@ -346,6 +346,214 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage = self = oldself; }; +/* +============ +X_Damage + +The other damage function. + +============ +*/ + +void(entity targ, entity inflictor, entity attacker, float damage) X_Damage = +{ + local entity oldself; + local float save; + local float take, severity, helm; + local string attackerteam, targteam; + + + if (!targ.takedamage) + return; + +// used by buttons and triggers to set activator for target firing + damage_attacker = attacker; + + +// check for quad damage powerup on the attacker + if (attacker.super_damage_finished > time && inflictor.classname != "door") + if (deathmatch == 4) + damage = damage * 8; + else + damage = damage * 4; + + if (attacker.critical == 3)//attacker scored a headshot/critical + { + if (attacker.critical == 3) + { + severity = 0 + random()*20; + if (attacker.perk == 7) + severity = severity + 4; + + if (attacker.class == 3) + severity = severity + 2; + + if (severity >= 19) + damage = (damage * 3.0); + else if (severity >= 14) + damage = (damage * 2.5); + else + damage = (damage * 2.0); + + helm = targ.armortype; + if (targ.helmet == 0) + { + sound (targ, CHAN_BODY, "player/headshot.wav", 1, ATTN_NORM); + helm = 0; + } + if (targ.helmet == AS_STRAIGHT) + { + sound (targ, CHAN_BODY, "weapons/helmet.wav", 1, ATTN_NORM); + helm = 0.10; + } + if (targ.helmet == AS_SLIDING) + { + sound (targ, CHAN_BODY, "weapons/helmet.wav", 1, ATTN_NORM); + helm = 0.15; + } + + damage = (damage - (damage * helm)); + + makevectors (targ.v_angle); + } + } + + if (random()*4<=1) + sound (targ, CHAN_BODY, targ.armornoise, 1, ATTN_NORM); + +// add to the damage total for clients, which will be sent as a single +// message at the end of the frame +// FIXME: remove after combining shotgun blasts? + if (targ.flags & FL_CLIENT) + { + targ.dmg_take = targ.dmg_take + take; + targ.dmg_save = targ.dmg_save + save; + targ.dmg_inflictor = inflictor; + } + + damage_inflictor = inflictor; + +/* +// figure momentum add + if ( (inflictor != world) && (targ.movetype == MOVETYPE_WALK) ) + { + dir = targ.origin - (inflictor.absmin + inflictor.absmax) * 0.5; + dir = normalize(dir); + // Set kickback for smaller weapons +//Zoid -- use normal NQ kickback +// // Read: only if it's not yourself doing the damage +// if ( (damage < 60) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname != targ.netname)) +// targ.velocity = targ.velocity + dir * damage * 11; +// else + // Otherwise, these rules apply to rockets and grenades + // for blast velocity + targ.velocity = targ.velocity + dir * damage * 8; + + // Rocket Jump modifiers + if ( (rj > 1) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname == targ.netname)) + targ.velocity = targ.velocity + dir * damage * rj; + + }*/ + + + +// check for godmode or invincibility + if (targ.flags & FL_GODMODE) + return; + + if (targ.invincible_finished >= time) + { + if (self.invincible_sound < time) + { + sound (targ, CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM); + self.invincible_sound = time + 2; + } + return; + } + +// team play damage avoidance +//ZOID 12-13-96: self.team doesn't work in QW. Use keys + attackerteam = infokey(attacker, "team"); + targteam = infokey(targ, "team"); + + if ((teamplay == 1) && (targteam == attackerteam) && + (attacker.classname == "player") && (attackerteam != "") && + inflictor.classname !="door") + return; + + if ((teamplay == 3) && (targteam == attackerteam) && + (attacker.classname == "player") && (attackerteam != "") && + (targ != attacker)&& inflictor.classname !="door") + return; + + +// do the damage + //different sorts of armour simply subtract different ammounts + //this makes armor like the force armor good against many small rounds + //(SMG, shotguns, swords, etc) but useless against big damage (grenades) + //power armor, which has the best of both worlds, is also the heaviest :p + + switch(ToIID(targ.islot3)) + { + case IID_ARM_BROTHERHOOD: + take -= 1; + break; + case IID_ARM_FORCE: + take -= 2; + break; + case IID_ARM_LPOWER: + take -= 3; + break; + default: + break; + } + + + if (take <= 0) + { + take = 0; + sound (targ, CHAN_BODY, targ.armornoise, 1, ATTN_NORM); + return; + } + + + targ.health = targ.health - take; + + if (targ.health <= 0) + { + Killed (targ, attacker); + return; + } + +// react to the damage + oldself = self; + self = targ; + +/*SERVER + if ( (self.flags & FL_MONSTER) && attacker != world) + { + // get mad unless of the same class (except for soldiers) + if (self != attacker && attacker != self.enemy) + { + if ( (self.classname != attacker.classname) + || (self.classname == "monster" ) ) + { + if (self.enemy.classname == "player") + self.oldenemy = self.enemy; + self.enemy = attacker; + FoundTarget (); + } + } + } +*/ + if (self.th_pain) + { + self.th_pain (attacker, take); + } + + self = oldself; +}; + /* ============ T_RadiusDamage diff --git a/quakec/fallout2/inventory.qc b/quakec/fallout2/inventory.qc index 0fb15c0b5..860901273 100644 --- a/quakec/fallout2/inventory.qc +++ b/quakec/fallout2/inventory.qc @@ -31,8 +31,10 @@ float IID_WP_AK74 = 417; float IID_WP_DKS1 = 418; float IID_WP_MOONLIGHT = 419; float IID_WP_SA80 = 420; -float IID_WP_GAUSERIFLE = 421; +float IID_WP_GAUSERIFLE = 421; //2mm EC float IID_WP_PULSERIFLE = 422; +float IID_WP_FNFAL = 423; //.308 AP + //and ammo for those guns float IID_AM_NEEDLER = 507; @@ -468,6 +470,8 @@ string(float iid) GetItemVModel = return "progs/v_srifle.mdl"; if (iid == IID_WP_MOONLIGHT) return "progs/v_night.mdl"; + if (iid == IID_WP_FNFAL) + return "progs/v_rangem.mdl"; if (iid == IID_WP_SA80) @@ -534,6 +538,8 @@ string(float iid) GetItemWModel = return "progs/w_night.mdl"; if (iid == IID_WP_SA80) return "progs/w_sa80.mdl"; + if (iid == IID_WP_FNFAL) + return "progs/w_rangem.mdl"; if (iid == IID_WP_GAUSERIFLE) return "progs/w_gauss.mdl"; @@ -602,6 +608,8 @@ float(float iid) WeaponAmmoType = return IID_AM_556MM; if (iid == IID_WP_SA80) return IID_AM_556MM; + if (iid == IID_WP_FNFAL) + return IID_AM_762MM; if (iid == IID_WP_GAUSERIFLE) return IID_AM_2MMEC; @@ -649,6 +657,8 @@ float(float iid) WeaponMagQuant = return 10; if (iid == IID_WP_PULSERIFLE) return 40; + if (iid == IID_WP_FNFAL) + return 20; return 0; }; @@ -700,7 +710,9 @@ float(float iid) GetItemWeight = if (iid == IID_WP_GAUSERIFLE) return 9; if (iid == IID_WP_PULSERIFLE) - return 10; + return 12; + if (iid == IID_WP_FNFAL) + return 9; if (iid == IID_ARM_SHIRT) @@ -798,6 +810,8 @@ string(float iid) GetItemName = return "gauss rifle (2mm EC)"; if (iid == IID_WP_PULSERIFLE) return "laser carbine (energy)"; + if (iid == IID_WP_FNFAL) + return "fn-fal (7.62mm)"; @@ -806,17 +820,17 @@ string(float iid) GetItemName = if (iid == IID_AM_2MMEC) return "2mm EC ammo"; if (iid == IID_AM_10MM) - return "10mm ammo"; + return "10mm FMJ"; if (iid == IID_AM_556MM) - return "5.56mm ammo"; + return "5.56mm FMJ"; if (iid == IID_AM_5MMHIGHVEL) - return "5mm high-velocity ammo"; + return "5mm JHP"; if (iid == IID_AM_12GAUGESHELLS) return "12-guage shotgun shells"; if (iid == IID_AM_ENERGYCELL) return "small energy cell"; if (iid == IID_AM_762MM) - return "7.62mm ammo"; + return "7.62mm AP"; if (iid == IID_AM_44MAGNUM) return ".44 magnum ammo"; if (iid == IID_AM_45ACP) @@ -955,7 +969,8 @@ string(float iid) GetItemImage = return "grifle.jpg"; if (iid == IID_WP_PULSERIFLE) return "lcarbine.jpg"; - + if (iid == IID_WP_FNFAL) + return "fnfal.jpg"; if (iid == IID_AM_NEEDLER) @@ -1081,6 +1096,8 @@ float(string itname) ItemIDOfName = return IID_WP_MP7; if (itname == "rangemaster") return IID_WP_RANGEMASTER; + if (itname == "fnfal") + return IID_WP_FNFAL; if (itname == "ak-112") return IID_WP_AK112; if (itname == "ak-74") diff --git a/quakec/fallout2/menus.qc b/quakec/fallout2/menus.qc index 9eee3c0ba..eca112812 100644 --- a/quakec/fallout2/menus.qc +++ b/quakec/fallout2/menus.qc @@ -141,7 +141,7 @@ string () ShotgunString = */ string () RifleString = { - return ("rifles\n RIFLE | TYPE | WEIGHT | PRICE \n\n1‘ rangemaster 7mm 03 11$\n2‘ ak-112 5mm 04 21$\n3‘ remington .308 05 24$\n4‘ ak-74 5mm 04 27$\n5‘ moonlight .223 05 36$\n6‘ xl-70 5mm 05 23$\n7‘ plasma rifle 07 41$\n8‘ gauss rifle 2mm 08 51$\n"); + return ("rifles\n RIFLE | TYPE | WEIGHT | PRICE \n\n1‘ rangemaster 7mm 03 11$\n2‘ ak-112 5mm 04 21$\n3‘ remington .308 05 24$\n4‘ ak-74 5mm 04 27$\n5‘ moonlight .223 05 36$\n6‘ sa-80 5mm 05 32$\n7‘ plasma rifle 12 41$\n8‘ gauss rifle 2mm 07 32$\n9‘ fn-fal .308 09 25$\n"); }; string () ChemString = diff --git a/quakec/fallout2/mod_buy.qc b/quakec/fallout2/mod_buy.qc index 06f361bdf..8df8cd8c5 100644 --- a/quakec/fallout2/mod_buy.qc +++ b/quakec/fallout2/mod_buy.qc @@ -140,6 +140,8 @@ void(string type) ChangeAmmo = self.ammotype2 = type; }; +void() SetWeaponModel; + void (float wt, float cost, float wid) BuyWeapon = { local string itname; @@ -182,6 +184,8 @@ void (float wt, float cost, float wid) BuyWeapon = ammotype = WeaponAmmoType(wid);//load weapon with full ammo (may be changed) AddStackable(self, ammotype, ammocount*3); + + SetWeaponModel(); }; @@ -572,9 +576,9 @@ void() W_PlayerMenu = if (self.currentmenu == "shop_shotguns") { if (self.impulse == 1) - BuyWeapon(3, 3, IID_WP_PIPERIFLE); //weight, cost, item + BuyWeapon(3, 4, IID_WP_PIPERIFLE); //weight, cost, item if (self.impulse == 2) - BuyWeapon(4, 7, IID_WP_WINCHESTER); //weight, cost, item + BuyWeapon(4, 8, IID_WP_WINCHESTER); //weight, cost, item if (self.impulse == 3) BuyWeapon(5, 12, IID_WP_MOSSBERG); //weight, cost, item if (self.impulse == 4) @@ -597,9 +601,11 @@ void() W_PlayerMenu = if (self.impulse == 6) BuyWeapon(4, 32, IID_WP_SA80); //weight, cost, item if (self.impulse == 7) - BuyWeapon(7, 40, IID_WP_GAUSERIFLE); //weight, cost, item + BuyWeapon(12, 45, IID_WP_PULSERIFLE); //weight, cost, item if (self.impulse == 8) - BuyWeapon(10, 45, IID_WP_PULSERIFLE); //weight, cost, item + BuyWeapon(7, 32, IID_WP_GAUSERIFLE); //weight, cost, item + if (self.impulse == 9) + BuyWeapon(9, 25, IID_WP_FNFAL); //weight, cost, item return; } diff --git a/quakec/fallout2/weapons.qc b/quakec/fallout2/weapons.qc index 445a120a9..1fd1dd120 100644 --- a/quakec/fallout2/weapons.qc +++ b/quakec/fallout2/weapons.qc @@ -1073,7 +1073,7 @@ void() W_Attack = weap == IID_WP_VIBROBLADE || weap == IID_WP_POWERAXE) { - self.attack_finished = time + 0.25; + self.attack_finished = time + 0.50; player_knife1 (); } else if (weap == IID_WP_USP) @@ -1101,13 +1101,15 @@ void() W_Attack = else if (weap == IID_WP_AK112) FireAssaultRifle(14, 2, "weapons/ak112.wav", 4000, 0.09); else if (weap == IID_WP_AK74) - FireAssaultRifle(18, 2, "weapons/ak47.wav", 6000, 0.1); + FireAssaultRifle(18, 2, "weapons/ak47.wav", 4000, 0.1); else if (weap == IID_WP_DKS1) - FireAssaultRifle(30, 2, "weapons/dks-1.wav", 8000, 0.5); + FireAssaultRifle(24, 2, "weapons/dks-1.wav", 8000, 0.5); else if (weap == IID_WP_MOONLIGHT) - FireAssaultRifle(16, 2, "weapons/m4-nw.wav", 4000, 0.09); + FireAssaultRifle(14, 2, "weapons/m4-nw.wav", 4000, 0.09); else if (weap == IID_WP_SA80) FireAssaultRifle(17, 2, "weapons/sa80.wav", 4000, 0.08); + else if (weap == IID_WP_FNFAL) + FireAssaultRifle(12, 3, "weapons/fnfal.wav", 6000, 0.12); //float IID_WP_GAUSERIFLE = 421; //float IID_WP_PULSERIFLE = 422; @@ -2062,6 +2064,7 @@ void (float dam, float rec, string snd, float rng, float rate) FirePistol = if (trace_ent.solid == SOLID_BSP) SpawnWood (trace_ent, org, 1); + dam = dam + random()*dam; T_Damage (trace_ent, self, self, dam); self.critical = 0; @@ -2153,6 +2156,7 @@ void (float dam, float rec, string snd, float rng, float rate) FireSMG = if (trace_ent.solid == SOLID_BSP) SpawnWood (trace_ent, org, 1); + dam = dam + random()*dam; T_Damage (trace_ent, self, self, dam); self.critical = 0; @@ -2170,9 +2174,11 @@ void (float dam, float rec, string snd, float rng, float rate) FireSMG = void (float dam, float rec, string snd, float rng, float rate) FireAssaultRifle = { - local float hs, tmp, zdif, is_headshot, z; + local float weap, hs, tmp, zdif, is_headshot, z; local vector dir, source, targ, org, adjust, headshot_check; + weap = ToIID(self.(SlotField(self.current_slot))); + sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM); self.attack_finished = (time + rate); @@ -2271,7 +2277,12 @@ void (float dam, float rec, string snd, float rng, float rate) FireAssaultRifle if (trace_ent.solid == SOLID_BSP) SpawnWood (trace_ent, org, 1); - T_Damage (trace_ent, self, self, dam); + dam = dam + random()*dam; + + if (weap != IID_WP_DKS1 && weap != IID_WP_FNFAL) + T_Damage (trace_ent, self, self, dam); + else if (weap == IID_WP_DKS1 || weap == IID_WP_FNFAL) + X_Damage (trace_ent, self, self, dam); self.critical = 0; if (trace_ent.solid == SOLID_BSP) @@ -3722,6 +3733,7 @@ void (vector s_aim, float dam, float tmp, float ran) W_FireBuckshotSpread1 = self.critical = 3; } + T_Damage (trace_ent, self, self, dam); self.critical = 0; }