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; }
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; }
/* 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 */
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); } } }
/* 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); }