diff --git a/source/src/entity.h b/source/src/entity.h index 6b6cdbfc..f32470d3 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -62,7 +62,7 @@ struct itemstat { int add, start, max, sound; }; extern itemstat ammostats[NUMGUNS]; extern itemstat powerupstats[I_ARMOUR-I_HEALTH+1]; -struct guninfo { string modelname; short sound, reload, reloadtime, attackdelay, damage, projspeed, part, spread, recoil, magsize, mdl_kick_rot, mdl_kick_back, recoilincrease, recoilbase, maxrecoil, recoilbackfade, pushfactor; bool isauto; }; +struct guninfo { string modelname; short sound, reload, reloadtime, attackdelay, damage, armourignore, projspeed, part, spread, recoil, magsize, mdl_kick_rot, mdl_kick_back, recoilincrease, recoilbase, maxrecoil, recoilbackfade, pushfactor; bool isauto; }; extern guninfo guns[NUMGUNS]; static inline int reloadtime(int gun) { return guns[gun].reloadtime; } @@ -346,6 +346,7 @@ public: // just subtract damage here, can set death, etc. later in code calling this int dodamage(int damage, int gun) { + guninfo gi = guns[gun]; if(damage == INT_MAX) { damage = health; @@ -353,27 +354,29 @@ public: return damage; } - if(gun != GUN_KNIFE) + // 4-level armour - tiered approach: 16%, 33%, 37%, 41% + // Please update ./ac_website/htdocs/docs/introduction.html if this changes. + int armoursection = 0; + int ad = damage; + if(armour > 25) armoursection = 1; + if(armour > 50) armoursection = 2; + if(armour > 75) armoursection = 3; + switch(armoursection) { - // 4-level armour - tiered approach: 16%, 33%, 37%, 41% - // Please update ./ac_website/htdocs/docs/introduction.html if this changes. - int armoursection = 0; - int ad = damage; - if(armour > 25) armoursection = 1; - if(armour > 50) armoursection = 2; - if(armour > 75) armoursection = 3; - switch(armoursection) - { - case 0: ad = (int) (16.0f/25.0f * armour); break; // 16 - case 1: ad = (int) (17.0f/25.0f * armour) - 1; break; // 33 - case 2: ad = (int) (4.0f/25.0f * armour) + 25; break; // 37 - case 3: ad = (int) (4.0f/25.0f * armour) + 25; break; // 41 - default: break; - } - int rd = (int) (ad * damage/100.0f); - armour -= rd; - damage -= rd; + case 0: ad = (int) (16.0f/25.0f * armour); break; // 16 + case 1: ad = (int) (17.0f/25.0f * armour) - 1; break; // 33 + case 2: ad = (int) (4.0f/25.0f * armour) + 25; break; // 37 + case 3: ad = (int) (4.0f/25.0f * armour) + 25; break; // 41 + default: break; } + + + int ra = (int) (ad * damage/100.0f); + int rd = ra-(ra*(gi.armourignore/100.0f)); //Who cares about rounding errors anyways? + + armour -= ra; + damage -= rd; + health -= damage; return damage; } diff --git a/source/src/server.h b/source/src/server.h index e453adbe..f4b9c744 100644 --- a/source/src/server.h +++ b/source/src/server.h @@ -477,18 +477,18 @@ guninfo guns[NUMGUNS] = //mKR: mdl_kick_rot && mKB: mdl_kick_back //reI: recoilincrease && reB: recoilbase && reM: maxrecoil && reF: recoilbackfade //pFX: pushfactor - //modelname reload attackdelay projspeed spread magsize mKB reB reF isauto - // sound reloadtime damage part recoil mKR reI reM pFX - { "knife", S_KNIFE, S_NULL, 0, 500, 50, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, false }, - { "pistol", S_PISTOL, S_RPISTOL, 1400, 160, 18, 0, 0, 53, 10, 10, 6, 5, 6, 35, 58, 125, 1, false }, - { "carbine", S_CARBINE, S_RCARBINE, 1800, 720, 60, 0, 0, 10, 60, 10, 4, 4, 10, 60, 60, 150, 1, false }, - { "shotgun", S_SHOTGUN, S_RSHOTGUN, 2400, 800, 1, 0, 0, 1, 35, 7, 9, 9, 10, 140, 140, 125, 1, false }, // CAUTION dmg only sane for server! - { "subgun", S_SUBGUN, S_RSUBGUN, 1650, 80, 16, 0, 0, 45, 15, 30, 1, 2, 4, 30, 50, 188, 1, true }, - { "sniper", S_SNIPER, S_RSNIPER, 1950, 1500, 80, 0, 0, 50, 50, 5, 4, 4, 10, 85, 85, 100, 1, false }, // 2011may22:ft: dmg 82->80, spread 50 - { "assault", S_ASSAULT, S_RASSAULT, 2000, 120, 24, 0, 0, 18, 40, 15, 0, 2, 2, 22, 55, 115, 1, true }, - { "cpistol", S_PISTOL, S_RPISTOL, 1400, 120, 19, 0, 0, 35, 10, 15, 6, 5, 6, 35, 58, 125, 1, false }, // temporary - { "grenade", S_NULL, S_NULL, 1000, 650, 200, 20, 6, 1, 1, 1, 3, 1, 0, 0, 0, 0, 3, false }, - { "pistol", S_PISTOL, S_RAKIMBO, 1400, 80, 19, 0, 0, 50, 10, 20, 6, 5, 10, 10, 18, 115, 1, true }, + //modelname reload attackdelay armourignore part recoil mKR reI reM pFX + // sound reloadtime damage projspeed spread magsize mKB reB reF isauto + { "knife", S_KNIFE, S_NULL, 0, 500, 50, 100, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, false }, + { "pistol", S_PISTOL, S_RPISTOL, 1400, 160, 18, 0, 0, 0, 53, 10, 10, 6, 5, 6, 35, 58, 125, 1, false }, + { "carbine", S_CARBINE, S_RCARBINE, 1800, 720, 60, 50, 0, 0, 10, 60, 10, 4, 4, 10, 60, 60, 150, 1, false }, + { "shotgun", S_SHOTGUN, S_RSHOTGUN, 2400, 800, 1, 0, 0, 0, 1, 35, 7, 9, 9, 10, 140, 140, 125, 1, false }, // CAUTION dmg only sane for server! + { "subgun", S_SUBGUN, S_RSUBGUN, 1650, 80, 16, 0, 0, 0, 45, 15, 30, 1, 2, 4, 30, 50, 188, 1, true }, + { "sniper", S_SNIPER, S_RSNIPER, 1950, 1500, 80, 0, 0, 0, 50, 50, 5, 4, 4, 10, 85, 85, 100, 1, false }, // 2011may22:ft: dmg 82->80, spread 50 + { "assault", S_ASSAULT, S_RASSAULT, 2000, 120, 24, 0, 0, 0, 18, 40, 15, 0, 2, 2, 22, 55, 115, 1, true }, + { "cpistol", S_PISTOL, S_RPISTOL, 1400, 120, 19, 0, 0, 0, 35, 10, 15, 6, 5, 6, 35, 58, 125, 1, false }, // temporary + { "grenade", S_NULL, S_NULL, 1000, 650, 200, 0, 20, 6, 1, 1, 1, 3, 1, 0, 0, 0, 0, 3, false }, + { "pistol", S_PISTOL, S_RAKIMBO, 1400, 80, 19, 0, 0, 0, 50, 10, 20, 6, 5, 10, 10, 18, 115, 1, true }, }; const char *teamnames[TEAM_NUM+1] = {"CLA", "RVSF", "CLA-SPECT", "RVSF-SPECT", "SPECTATOR", "void"};