Пример #1
0
int calcHitBonus(CharData *ch) {
    int bonus = 0;
    
    if(GET_CON(ch) > 18)
        bonus += (GET_CON(ch) - 18)*5;

    if(affected_by_spell(ch, SPELL_REGENERATE))
        bonus += spell_level(ch, SPELL_REGENERATE) + GET_MAX_HIT(ch)/8;        
    
    if(IS_DEFENDER(ch))
        bonus += 30 + 10*GET_ADVANCE_LEVEL(ch);
    
    return bonus;
}
Пример #2
0
int calcMoveBonus(CharData *ch) {
    int bonus = 0;

    if (affected_by_spell(ch, SKILL_ADRENALINE))
        bonus += GET_LEVEL(ch);
    
    if(GET_RACE(ch) == RACE_STROLL)
        bonus += 20 + GET_LEVEL(ch)/2;
    
    if( GET_DEX(ch) > 18 )
        bonus += (GET_DEX(ch) - 18)*3;

    if(affected_by_spell(ch, SPELL_REGENERATE))
        bonus += spell_level(ch, SPELL_REGENERATE)/3 + GET_MAX_MOVE(ch)/6;
    
    return bonus;
}
Пример #3
0
/* Hitpoint gain per game hour */
int hit_gain(CharData * ch)
{    
    // Character is messed
    if (IN_ROOM(ch) == -1) return 0;

    // Delusion health deflates fairly quickly
    if(affected_by_spell(ch, SKILL_DELUSION))
        return -(GET_MAX_HIT(ch) * spell_level(ch, SKILL_DELUSION) / 9);

    /* Are they rotting away ? */
    if (!IS_NPC(ch) && IS_UNDEAD(ch)) {
        return ( (GET_LEVEL(ch) < 50) && (ch->desc) ) ? -GET_LEVEL(ch) : 0;
    }

    /* Race calculations */
    /* vampires don't regenerate in sunlight, unless they're shadow sphered */
    if (!IS_NPC(ch) && IS_VAMPIRE(ch) &&
            IS_SUNLIGHT(IN_ROOM(ch)) && !IS_AFFECTED(ch, AFF_SHADOW_SPHERE))
        return 0;

    if(!IS_NPC(ch)) {
        int suffer = 0;

        if(ROOM_FLAGGED(ch->in_room, ROOM_SUFFER) && ( GET_LEVEL(ch) < LVL_IMMORT ))
            suffer = 1;
        else if(!GET_COND(ch, THIRST) && IS_AMARA(ch))
            suffer = 1;
        else if (IS_IZARTI(ch) && IS_EVIL(ch))
            suffer = 1;
        else if (IS_DEMON(ch) && IS_GOOD(ch))
            suffer = 1;

        if(suffer == 1) {
            if(percentSuccess(2))
                damage(ch, ch, -SUFFER_RATE, TYPE_ROOM_SUFFER);
            return 0;
        }
    }

    int base = calcHitBase(ch);
    int multiplier = calcHitMulti(ch);
    int bonus = calcHitBonus(ch);

    int gain = base*multiplier/100 + bonus;
    return (gain);
}/* hit_gain */
Пример #4
0
void regen_update( void ) {
    CharData *i, *next_char;
    int hit, mana, move;
    int vivify_level;

    for( i = character_list; i; i = next_char )
    {
        next_char = i->next;

        if(affected_by_spell(i, SKILL_EMACIATED) && (GET_COND(i, HUNGER) != 0 || IS_VAMPIRE(i)) && GET_COND(i, THIRST) != 0) {
            if(!affected_by_spell(i, SKILL_EMACIATED_MANA) && !affected_by_spell(i, SKILL_EMACIATED_HIT))
                affect_from_char(i, SKILL_EMACIATED);
            else if(percentSuccess(4)) {
                affect_from_char(i, SKILL_EMACIATED_MANA);
                affect_from_char(i, SKILL_EMACIATED_HIT);
            }
        }

        // Dwarves sober up 3x faster than most races (unless they drink more...)
        if(IS_DWARF(i) && !number(0, 35))
            gain_condition(i, DRUNK, -1);

        vivify_level = spell_level(i, SPELL_VIVIFY);
        affect_from_char(i, SPELL_VIVIFY);
        if(GET_POS(i) <= POS_MEDITATING) {
            add_affect(i, i, SPELL_VIVIFY, MIN(vivify_level + 1, 100), APPLY_NONE, 0, -1,
                    0, FALSE, FALSE, FALSE, FALSE);
        }

        if(GET_POS(i) >= POS_MORTALLYW)
        {
            hit = hit_gain(i);
            mana = mana_gain(i);
            move = move_gain(i);

            if(affected_by_spell(i, SPELL_VIVIFY)) {
                if(hit > 0)
                    hit += spell_level(i, SPELL_VIVIFY) * GET_MAX_HIT(i)/600;
                if(mana > 0)
                    mana += spell_level(i, SPELL_VIVIFY) * GET_MAX_MANA(i)/600;
                if(move > 0)
                    move += spell_level(i, SPELL_VIVIFY) * GET_MAX_MOVE(i)/600;
            }

            // Regeneration is increased on pvp holidays.  If you're incapactitated, you will
            // eventually recover.
            if(pvpHoliday(i)) {
                if (GET_POS(i) < POS_SLEEPING)
                    hit = 20;
                else {
                    hit  = (hit  > 0) ? hit *3 : 20;
                    mana = (mana > 0) ? mana*2 : 40;
                    move = (move > 0) ? move*2 : 40;
                }
            }
                

            // 72 seconds per tick...
            if(hit < 0 || GET_HIT(i) < GET_MAX_HIT(i)) {
                if(hit>0)
                    GET_HIT(i) += hit/72 + (hit % 72 > number(0, 71)? 1:0);
                else
                    GET_HIT(i)  = MAX(GET_HIT(i) + hit/72 + (-hit % 72 > number(0, 71)?-1:0), -9);
            }
            else {
                int surplus = (GET_HIT(i) - GET_MAX_HIT(i));
                GET_HIT(i) -= surplus / 72 + (surplus % 72 > number(0, 71)? 1:0);
            }


            if(mana>0)
                GET_MANA(i) = MAX(MIN(GET_MANA(i) + mana/72 + (mana % 72 > number(0, 71)?1:0), GET_MAX_MANA(i)), 0);
            else
                GET_MANA(i) = MIN(GET_MANA(i) + mana/72 + (-mana % 72 > number(0, 71)?-1:0), GET_MAX_MANA(i));

            if(move>0)
                GET_MOVE(i) = MIN(GET_MOVE(i) + move/72 + (move % 72 > number(0, 71)?1:0), GET_MAX_MOVE(i));
            else
                GET_MOVE(i) = MAX(MIN(GET_MOVE(i) + move/72 + (-move % 72 > number(0, 71)?-1:0), GET_MAX_MOVE(i)), 0);

            update_pos(i);
        }
    }
}
Пример #5
0
/* SPELLS AND SKILLS.  This area defines which spells are assigned to which
 * classes, and the minimum level the character must be to use the spell or
 * skill. */
void init_spell_levels(void)
{
  /* ADEPTS */
  spell_level(SPELL_MAGIC_MISSILE, CLASS_ADEPT, 1);
  spell_level(SPELL_DETECT_INVIS, CLASS_ADEPT, 2);
  spell_level(SPELL_DETECT_MAGIC, CLASS_ADEPT, 2);
  spell_level(SPELL_CHILL_TOUCH, CLASS_ADEPT, 3);
  spell_level(SPELL_INFRAVISION, CLASS_ADEPT, 3);
  spell_level(SPELL_INVISIBLE, CLASS_ADEPT, 4);
  spell_level(SPELL_ARMOR, CLASS_ADEPT, 4);
  spell_level(SPELL_BURNING_HANDS, CLASS_ADEPT, 5);
  spell_level(SPELL_LOCATE_OBJECT, CLASS_ADEPT, 6);
  spell_level(SPELL_STRENGTH, CLASS_ADEPT, 6);
  spell_level(SPELL_SHOCKING_GRASP, CLASS_ADEPT, 7);
  spell_level(SPELL_SLEEP, CLASS_ADEPT, 8);
  spell_level(SPELL_LIGHTNING_BOLT, CLASS_ADEPT, 9);
  spell_level(SPELL_BLINDNESS, CLASS_ADEPT, 9);
  spell_level(SPELL_DETECT_POISON, CLASS_ADEPT, 10);
  spell_level(SPELL_COLOR_SPRAY, CLASS_ADEPT, 11);
  spell_level(SPELL_ENERGY_DRAIN, CLASS_ADEPT, 13);
  spell_level(SPELL_CURSE, CLASS_ADEPT, 14);
  spell_level(SPELL_POISON, CLASS_ADEPT, 14);
  spell_level(SPELL_FIREBALL, CLASS_ADEPT, 15);
  spell_level(SPELL_CHARM, CLASS_ADEPT, 16);
  spell_level(SPELL_IDENTIFY, CLASS_ADEPT, 20);
  spell_level(SPELL_FLY, CLASS_ADEPT, 22);
  spell_level(SPELL_ENCHANT_WEAPON, CLASS_ADEPT, 26);
  spell_level(SPELL_CLONE, CLASS_ADEPT, 30);

  /* MEDICS */
  spell_level(SPELL_CURE_LIGHT, CLASS_MEDIC, 1);
  spell_level(SPELL_ARMOR, CLASS_MEDIC, 1);
  spell_level(SPELL_CREATE_FOOD, CLASS_MEDIC, 2);
  spell_level(SPELL_CREATE_WATER, CLASS_MEDIC, 2);
  spell_level(SPELL_DETECT_POISON, CLASS_MEDIC, 3);
  spell_level(SPELL_DETECT_ALIGN, CLASS_MEDIC, 4);
  spell_level(SPELL_CURE_BLIND, CLASS_MEDIC, 4);
  spell_level(SPELL_BLESS, CLASS_MEDIC, 5);
  spell_level(SPELL_DETECT_INVIS, CLASS_MEDIC, 6);
  spell_level(SPELL_BLINDNESS, CLASS_MEDIC, 6);
  spell_level(SPELL_INFRAVISION, CLASS_MEDIC, 7);
  spell_level(SPELL_PROT_FROM_EVIL, CLASS_MEDIC, 8);
  spell_level(SPELL_POISON, CLASS_MEDIC, 8);
  spell_level(SPELL_GROUP_ARMOR, CLASS_MEDIC, 9);
  spell_level(SPELL_CURE_CRITIC, CLASS_MEDIC, 9);
  spell_level(SPELL_SUMMON, CLASS_MEDIC, 10);
  spell_level(SPELL_REMOVE_POISON, CLASS_MEDIC, 10);
  spell_level(SPELL_IDENTIFY, CLASS_MEDIC, 11);
  spell_level(SPELL_WORD_OF_RECALL, CLASS_MEDIC, 12);
  spell_level(SPELL_DARKNESS, CLASS_MEDIC, 12);
  spell_level(SPELL_EARTHQUAKE, CLASS_MEDIC, 12);
  spell_level(SPELL_DISPEL_EVIL, CLASS_MEDIC, 14);
  spell_level(SPELL_DISPEL_GOOD, CLASS_MEDIC, 14);
  spell_level(SPELL_SANCTUARY, CLASS_MEDIC, 15);
  spell_level(SPELL_CALL_LIGHTNING, CLASS_MEDIC, 15);
  spell_level(SPELL_HEAL, CLASS_MEDIC, 16);
  spell_level(SPELL_CONTROL_WEATHER, CLASS_MEDIC, 17);
  spell_level(SPELL_SENSE_LIFE, CLASS_MEDIC, 18);
  spell_level(SPELL_HARM, CLASS_MEDIC, 19);
  spell_level(SPELL_GROUP_HEAL, CLASS_MEDIC, 22);
  spell_level(SPELL_REMOVE_CURSE, CLASS_MEDIC, 26);

  /* BANDITS */
  spell_level(SKILL_SNEAK, CLASS_BANDIT, 1);
  spell_level(SKILL_PICK_LOCK, CLASS_BANDIT, 2);
  spell_level(SKILL_BACKSTAB, CLASS_BANDIT, 3);
  spell_level(SKILL_STEAL, CLASS_BANDIT, 4);
  spell_level(SKILL_HIDE, CLASS_BANDIT, 5);
  spell_level(SKILL_TRACK, CLASS_BANDIT, 6);

  /* SOLDIERS */
  spell_level(SKILL_KICK, CLASS_SOLDIER, 1);
  spell_level(SKILL_RESCUE, CLASS_SOLDIER, 3);
  spell_level(SKILL_TRACK, CLASS_SOLDIER, 9);
  spell_level(SKILL_BASH, CLASS_SOLDIER, 12);
  spell_level(SKILL_WHIRLWIND, CLASS_SOLDIER, 16);
}