Пример #1
0
/* 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);
}
Пример #2
0
/* 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();
}