/* estimates on a 0..9 scale how good a player is at something */ int competence_check(int attack) { int ability = 0; switch(attack) { case 1: /* melee */ ability += statmod(Player.str); case 2: /* missle */ ability += statmod(Player.dex); ability += Player.rank[LEGION]; ability += ((int) (Player.dmg / 10) - 1); break; case 3: /* spellcasting */ ability += statmod(Player.iq); ability += statmod(Player.pow); ability += Player.rank[CIRCLE]; ability += Player.rank[COLLEGE]; ability += Player.rank[PRIEST]; break; case 4: /* thieving */ ability += statmod(Player.dex); ability += statmod(Player.agi); ability += Player.rank[THIEVES]; break; case 5: /* escape */ ability += 2 * statmod(Player.agi); break; } ability += ((int) (Player.level / 5)); if (ability < 0) ability = 0; if (ability > 9) ability = 9; return(ability); }
/* This is to be called whenever anything might change player performance in melee, such as changing weapon, statistics, etc. */ void calc_melee(void) { calc_weight(); Player.maxweight = (Player.str * Player.agi * 10); Player.absorption = Player.status[PROTECTION]; Player.defense = 2 * statmod(Player.agi)+(Player.level/2); Player.hit = Player.level + statmod(Player.dex)+1; Player.dmg = statmod(Player.str)+3; Player.speed = 5 - min(4,(statmod(Player.agi)/2)); if (Player.status[HASTED] > 0) Player.speed = Player.speed / 2; if (Player.status[SLOWED] > 0) Player.speed = Player.speed * 2; if (Player.itemweight > 0) switch(Player.maxweight / Player.itemweight) { case 0: Player.speed+=6; break; case 1: Player.speed+=3; break; case 2: Player.speed+=2; break; case 3: Player.speed+=1; break; } if (Player.status[ACCURATE]) Player.hit+=20; if (Player.status[HERO]) Player.hit+=Player.dex; if (Player.status[HERO]) Player.dmg+=Player.str; if (Player.status[HERO]) Player.defense+=Player.agi; if (Player.status[HERO]) Player.speed=Player.speed / 2; Player.speed = max(1,min(25,Player.speed)); if (State.getMounted()) { Player.speed = 3; Player.hit += 10; Player.dmg += 10; } else if (Player.rank[MONKS] > 0) { /* monks are faster when not in armor or on horseback */ if (Player.possessions[O_ARMOR] == NULL) { Player.speed += (min(0,(Player.rank[MONKS] -1))); } } /* weapon */ /* have to check for used since it could be a 2h weapon just carried in one hand */ if (Player.possessions[O_WEAPON_HAND] != NULL) if (Player.possessions[O_WEAPON_HAND]->used && ((Player.possessions[O_WEAPON_HAND]->objchar==WEAPON)|| (Player.possessions[O_WEAPON_HAND]->objchar==MISSILEWEAPON))) { Player.hit += Player.possessions[O_WEAPON_HAND]->hit + Player.possessions[O_WEAPON_HAND]->plus; Player.dmg += Player.possessions[O_WEAPON_HAND]->dmg + Player.possessions[O_WEAPON_HAND]->plus; } if (Player.rank[MONKS] > 0) { /* monks */ /* aren't monks just obscene? PGM */ if (Player.possessions[O_WEAPON_HAND] == NULL) /*barehanded*/ { /* all monks get a bonus in unarmed combat */ Player.hit += ( Player.rank[MONKS] * Player.level ); Player.dmg += ( Player.rank[MONKS] * Player.level ); Player.defense += ( Player.rank[MONKS] * Player.level ); if (Player.rank[MONKS] == MONK_GRANDMASTER) { /* Grandmaster does 3x damage in unarmed combat. */ Player.dmg *= 3; } } } /* shield or defensive weapon */ if (Player.possessions[O_SHIELD] != NULL) { Player.defense += Player.possessions[O_SHIELD]->aux + Player.possessions[O_SHIELD]->plus; } /* armor */ if (Player.possessions[O_ARMOR] != NULL) { Player.absorption += Player.possessions[O_ARMOR]->dmg; Player.defense += Player.possessions[O_ARMOR]->plus - Player.possessions[O_ARMOR]->aux; } if (strlen(Player.combatManeuvers) > 2*maneuvers()) default_maneuvers(); comwinprint(); showflags(); dataprint(); }