/* source file -- AD&D, 2nd Edition Ability Scores */ #include "ability.h" /* member variables */ int *actual; /* permanent ability scores */ int *effect; /* temporary ability scores */ /* static function declarations */ static int check_score(int ab, int sc); static string query_stat_string(int sc); void create() { int i; actual = ({ 0, 0, 0, 0, 0, 0 }); effect = ({ 0, 0, 0, 0, 0, 0 }); for (i = 0; i < NUM_AS; actual[i++] = random(16) + 3); reset_all_stats(); } int query_real_stat(int ab) { if (ab < STR || ab > CHA) return 0; return (actual[ab]); } int set_real_stat(int ab, int sc) { if (ab < STR || ab > CHA) return 0; return (actual[ab] = check_score(ab, sc)); } int adjust_real_stat(int ab, int adj) { if (ab < STR || ab > CHA) return 0; if (!adj) return (actual[ab]); if (ab == STR && actual[ab] < 0) actual[ab] = adj > 0 ? 18 : 19; return (actual[ab] = check_score(ab, actual[ab] + adj)); } int query_stat(int ab) { if (ab < STR || ab > CHA) return 0; return (effect[ab]); } int set_stat(int ab, int sc) { if (ab < STR || ab > CHA) return 0; return (effect[ab] = check_score(ab, sc)); } int adjust_stat(int ab, int adj) { if (ab < STR || ab > CHA) return 0; if (!adj) return (effect[ab]); if (ab == STR && effect[ab] < 0) effect[ab] = adj > 0 ? 18 : 19; return (effect[ab] = check_score(ab, effect[ab] + adj)); } int reset_stat(int ab) { if (ab < STR || ab > CHA) return 0; return (effect[ab] = actual[ab]); } void reset_all_stats() { int i; for (i = 0; i < NUM_AS; i++) reset_stat(i); } static int check_score(int ab, int sc) { if (ab == STR && sc < 0) if (sc < -100) return -100; else return (sc); if (sc < 1) return 1; if (sc > 25) return 25; return (sc); } string query_ability_name(int ab) { switch (ab) { case STR: return "Strength"; case DEX: return "Dexterity"; case CON: return "Constitution"; case INT: return "Intelligence"; case WIS: return "Wisdom"; case CHA: return "Charisma"; default: return 0; } } string query_real_stat_string(int ab) { if (ab < STR || ab > CHA) return 0; return (query_stat_string(actual[ab])); } string query_stat_string(int ab) { if (ab < STR || ab > CHA) return 0; return (query_stat_string(effect[ab])); } static string query_stat_string(int sc) { if (sc > -100 && sc < 0) return ("18/" + sc + ""); else if (sc == -100) return ("18/00"); else if (sc > 0 && sc < 26) return (sc + ""); else return (check_score(DEX, sc) + ""); }