/* source file -- AD&D, 2nd Edition Ability Scores -- Game Effects */
/* strength effects */
static int str_index() {
int str;
str = this_player()->query_str();
if (str > -51 && str < 0)
return 25;
if (str > -76 && str < -50)
return 26;
if (str > -91 && str < -75)
return 27;
if (str > -100 && str < -90)
return 28;
if (str == -100)
return 29;
return (str - 1); /* str > 0 && str < 26 */
}
int to_hit_prob() {
return ( ({ -5,-3,-3,-2,-2,-1,-1,0,0,0,0,0,0,0,0,0,1,1,3,3,4,4,5,6,
7,1,2,2,2,3 }) [str_index()] );
}
int damage_adj() {
return ( ({ -4,-2,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,1,1,2,7,8,9,10,11,12,
14,3,3,4,5,6 }) [str_index()] );
}
int wgt_allow() {
return ( ({ 1,1,5,10,10,20,20,35,35,40,40,45,45,55,55,70,85,110,485,
535,635,785,935,1235,1535,135,160,185,235,335 })
[str_index()] );
}
int max_press() {
return ( ({ 3,5,10,25,25,55,55,90,90,115,115,140,140,170,170,195,
220,255,640,700,810,970,1130,1440,1750,280,305,330,380,480 })
[str_index()] );
}
int open_normal_doors() {
return ( ({ 1,1,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,11,16,17,17,18,18,
19,19,12,13,14,15,16 }) [str_index()] );
}
int open_special_doors() {
return ( ({ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,10,12,14,16,17,18,
0,0,0,3,6 }) [str_index()] );
}
int bnd_brs_lft_gts() {
return ( ({ 0,0,0,0,0,0,0,1,1,2,2,4,4,7,7,10,13,16,50,60,70,80,90,
95,99,20,25,30,35,40 }) [str_index()] );
}
/* dexterity effects */
int surprise_adj() {
return ( ({ -6,-4,-3,-2,-1,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,4,4,4,5,5 })
[(int)this_player()->query_dex() - 1] );
}
int missle_att_adj() { return (surprise_adj()); }
int defensive_adj() {
return ( ({ 5,5,4,3,2,1,0,0,0,0,0,0,0,0,-1,-2,-3,-4,-4,-4,-5,
-5,-5,-6,-6 }) [(int)this_player()->query_dex() - 1] );
}
/* constitution effects */
int hit_point_adj(int warrior) {
int con;
con = (int)this_player()->query_con();
if (!warrior && con > 16)
return 2;
return ( ({ -3,-2,-2,-1,-1,-1,0,0,0,0,0,0,0,0,1,2,3,4,5,5,6,6,6,7,7 })
[con - 1] );
}
int system_shock() {
return ( ({ 25,30,35,40,45,50,55,60,65,70,75,80,85,88,90,95,97,
99,99,99,99,99,99,99,100 }) [(int)this_player()->query_con() - 1] );
}
int resurrect_survival() {
return ( ({ 30,35,40,45,50,55,60,65,70,75,80,85,90,92,94,96,98,
100,100,100,100,100,100,100,100 }) [(int)this_player()->query_con() - 1] );
}
int poison_save()
{
switch (this_player()->query_con())
{
case 1: return -2;
case 2: return -1;
case 19: case 20: return 1;
case 21: case 22: return 2;
case 23: case 24: return 3;
case 25: return 4;
default: return 0;
}
}
int regeneration()
{
int con;
con = this_player()->query_con();
if (con > 19 && con < 26)
return (26 - con);
return 0;
}
/* intelligence effects */
int num_languages() {
return ( ({ 0,1,1,1,1,1,1,1,2,2,2,3,3,4,4,5,6,7,8,9,10,11,12,15,20 })
[(int)this_player()->query_int() - 1] );
}
int spell_level() {
return ( ({ 0,0,0,0,0,0,0,0,4,5,5,6,6,7,7,8,8,9,9,9,9,9,9,9,9 })
[(int)this_player()->query_int() - 1] );
}
int learn_spell() {
return ( ({ 0,0,0,0,0,0,0,0,35,40,45,50,55,60,65,70,75,85,95,
96,97,98,99,100,100 }) [(int)this_player()->query_int() - 1] );
}
int max_spells() { /* returns -1 for All Spells */
return ( ({ 0,0,0,0,0,0,0,0,6,7,7,7,9,9,11,11,14,18,
-1,-1,-1,-1,-1,-1,-1 }) [(int)this_player()->query_int() - 1] );
}
int illusion_immunity() {
int intl;
intl = this_player()->query_int();
if (intl > 18)
return (intl - 18);
return 0;
}
/* wisdom effects */
int magical_defense_adj() {
return ( ({ -6,-4,-3,-2,-1,-1,-1,0,0,0,0,0,0,0,1,2,3,4,4,4,4,
4,4,4,4 }) [(int)this_player()->query_wis() - 1] );
}
int spell_fail() {
return ( ({ 80,60,50,45,40,35,30,25,20,15,10,5,0,0,0,0,0,0,0,0,
0,0,0,0,0 }) [(int)this_player()->query_wis() - 1] );
}
void bonus_spells(int *spellTbl)
{ /* spellTbl is an array of 7 integers; spellTbl[0] is 1st level */
switch (this_player()->query_wis())
{
case 25: spellTbl[6]++, spellTbl[5]++;
case 24: spellTbl[5]++, spellTbl[5]++;
case 23: spellTbl[4]++, spellTbl[4]++;
case 22: spellTbl[3]++, spellTbl[4]++;
case 21: spellTbl[2]++, spellTbl[4]++;
case 20: spellTbl[1]++, spellTbl[3]++;
case 19: spellTbl[0]++, spellTbl[3]++;
case 18: spellTbl[3]++;
case 17: spellTbl[2]++;
case 16: spellTbl[1]++;
case 15: spellTbl[1]++;
case 14: spellTbl[0]++;
case 13: spellTbl[0]++;
default: break;
}
}
string *spell_immunity()
{
string *si;
si = ({ });
switch (this_player()->query_wis())
{
case 25:
si += ({ "antipathy-sympathy", "death spell", "mass charm" });
case 24:
si += ({ "geas", "mass suggestion", "rod of rulership" });
case 23:
si += ({ "chaos", "febblemind", "hold monster", "magic jar",
"quest" });
case 22:
si += ({ "charm monster", "confusion", "emotion", "fumble",
"suggestion" });
case 21:
si += ({ "fear" });
case 20:
si += ({ "forget", "hold person", "ray of enfeeblement",
"scare" });
case 19:
si += ({ "cause fear", "charm person", "command", "friends",
"hypnotism" });
default:
break;
}
return (si);
}
/* charaisma effects */
int num_henchmen() {
return ( ({ 0,1,1,1,2,2,3,3,4,4,4,5,5,6,7,8,10,15,20,25,30,35,
40,45,50 }) [(int)this_player()->query_cha() - 1] );
}
int loyalty_base() {
return ( ({ -8,-7,-6,-5,-4,-3,-2,-1,0,0,0,0,0,1,3,4,6,8,10,12,
14,16,18,20,20 }) [(int)this_player()->query_cha() - 1] );
}
int reaction_adj()
{
return ( ({ -7,-6,-5,-4,-3,-2,-1,0,0,0,0,0,1,2,3,5,6,7,8,9,10,
11,12,13,14 }) [(int)this_player()->query_cha() - 1] );
}
/* check functions */
int query_open_doors(int special) {
if (special)
return (random(20) < open_special_doors());
return (random(20) < open_normal_doors());
}
int query_bblg() { return (random(100) < bnd_brs_lft_gts()); }
int query_system_shock() { return (random(100) < system_shock()); }
int query_resurrect_survival() {
return (random(100) < resurrect_survival());
}
int query_learn_spell() { return (random(100) < learn_spell()); }
int query_illusion_immunity(int spell_level) {
return (spell_level <= illusion_immunity());
}
int query_spell_fail() { return (random(100) < spell_fail()); }
int query_spell_immunity(string spell_name) {
return (member_array(spell_name, spell_immunity()) != -1);
}