void hellfire_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Hellfire"); break; case SPELL_DESC: var_set_string(res, "Fires a powerful ball of evil power directly from the bowels of hell. Good monsters are especially susceptible."); break; case SPELL_INFO: var_set_string(res, info_damage(0, 0, spell_power(666))); break; case SPELL_CAST: { int dir = 0; var_set_bool(res, FALSE); if (get_aim_dir(&dir)) { fire_ball(GF_HELL_FIRE, dir, spell_power(666), 3); if (!demon_is_(DEMON_BALROG)) take_hit(DAMAGE_USELIFE, 20 + randint1(30), "the strain of casting Hellfire", -1); var_set_bool(res, TRUE); } break; } default: default_spell(cmd, res); break; } }
/**************************************************************** * Sexy ****************************************************************/ static void _sexy_birth(void) { if ( p_ptr->prace != RACE_MON_SWORD && !demon_is_(DEMON_BALROG) ) { object_type forge = {0}; object_prep(&forge, lookup_kind(TV_HAFTED, SV_WHIP)); if (p_ptr->pclass == CLASS_RUNE_KNIGHT) rune_add(&forge, RUNE_ABSORPTION, FALSE); py_birth_obj(&forge); } }
int res_pct_aux(int which, int count) { int result = 0; int idx = count; if (count < 0) idx *= -1; if (idx >= _MAX_PCTS) idx = _MAX_PCTS-1; if (res_is_low(which)) result = _lo_pcts[idx]; else result = _hi_pcts[idx]; if (count < 0) result *= -1; else if (result < 100) { if (which == RES_CONF) { if (prace_is_(RACE_TONBERRY) || demon_is_(DEMON_CYBERDEMON)) result = (result + 1) / 2; } if (which == RES_LITE) { if (prace_is_(RACE_VAMPIRE) || prace_is_(RACE_MON_VAMPIRE) || prace_is_(MIMIC_VAMPIRE)) result = (result + 1) / 2; } if (which == RES_FIRE) { if (prace_is_(RACE_ENT)) result = result * 7 / 10; } if (which == RES_ELEC) { if (prace_is_(RACE_ANDROID)) result = result * 7 / 10; } } return result; }
static _blow_info_t _get_blow_info(int hand) { _blow_info_t result = {0}; int arm = hand / 2; object_type *o_ptr = equip_obj(p_ptr->weapon_info[hand].slot); if (!o_ptr) return result; /* TODO: Use race_ptr and class_ptr instead of this giant switch ... */ switch (p_ptr->pclass) { case CLASS_WARRIOR: result.num = 600; result.wgt = 70; result.mul = 50 + p_ptr->lev/2; break; case CLASS_MAULER: result.num = 175; result.wgt = 280; result.mul = 75; break; case CLASS_BERSERKER: result.num = 600; result.wgt = 70; result.mul = 75; break; case CLASS_RAGE_MAGE: result.num = 300; result.wgt = 70; result.mul = 30; break; case CLASS_MAGE: case CLASS_NECROMANCER: case CLASS_BLOOD_MAGE: case CLASS_HIGH_MAGE: case CLASS_BLUE_MAGE: result.num = 400; result.wgt = 100; result.mul = 20; break; case CLASS_WARLOCK: result.num = 400; result.wgt = 100; result.mul = 35; switch (p_ptr->psubclass) { case WARLOCK_DRAGONS: if ( p_ptr->riding && (object_is_(o_ptr, TV_POLEARM, SV_LANCE) || object_is_(o_ptr, TV_POLEARM, SV_HEAVY_LANCE)) ) { result.mul = 65; } break; case WARLOCK_ANGELS: case WARLOCK_DEMONS: result.num = 450; break; case WARLOCK_HOUNDS: result.num = 475; break; case WARLOCK_GIANTS: result.wgt = 200; result.mul = 50 + p_ptr->lev/5; result.num = 500; break; } break; case CLASS_PSION: result.num = 400; result.wgt = 100; result.mul = 30; break; case CLASS_PRIEST: case CLASS_MAGIC_EATER: case CLASS_MINDCRAFTER: result.num = 500; result.wgt = 100; result.mul = 35; break; case CLASS_DEVICEMASTER: result.num = 400; result.wgt = 100; result.mul = 35; if (p_ptr->psubclass == DEVICEMASTER_POTIONS || p_ptr->psubclass == DEVICEMASTER_SCROLLS) result.num = 500; break; case CLASS_ROGUE: result.num = 525; result.wgt = 40; result.mul = 30; if (o_ptr->weight < 50) result.num = 600; break; case CLASS_SCOUT: result.num = 400; result.wgt = 70; result.mul = 25; break; case CLASS_RANGER: result.num = 500; result.wgt = 70; result.mul = 40; break; case CLASS_PALADIN: case CLASS_SAMURAI: result.num = 550; result.wgt = 70; result.mul = 45; break; case CLASS_MYSTIC: result.num = 100; result.wgt = 100; result.mul = 10; break; case CLASS_WEAPONSMITH: case CLASS_RUNE_KNIGHT: result.num = 525; result.wgt = 150; result.mul = 55; break; case CLASS_WEAPONMASTER: result.num = weaponmaster_get_max_blows(o_ptr, hand); result.wgt = 70; result.mul = 50; break; case CLASS_WARRIOR_MAGE: case CLASS_RED_MAGE: result.num = 525; result.wgt = 70; result.mul = 30; break; case CLASS_CHAOS_WARRIOR: result.num = 550; result.wgt = 70; result.mul = 45; break; case CLASS_MONK: result.num = 500; result.wgt = 60; result.mul = 30; break; case CLASS_TOURIST: case CLASS_TIME_LORD: result.num = 400; result.wgt = 100; result.mul = 30; break; case CLASS_ARCHAEOLOGIST: result.num = 400; result.wgt = 70; result.mul = 30; if (archaeologist_is_favored_weapon(o_ptr)) { result.num = 500; result.mul = 40; } break; case CLASS_BLOOD_KNIGHT: result.num = 300; result.wgt = 150; result.mul = 30; break; case CLASS_DUELIST: result.num = 100; result.wgt = 70; result.mul = 40; break; case CLASS_IMITATOR: result.num = 550; result.wgt = 70; result.mul = 40; break; case CLASS_WILD_TALENT: result.num = 450; result.wgt = 70; result.mul = 40; break; case CLASS_BEASTMASTER: result.num = 500; result.wgt = 70; result.mul = 35; break; case CLASS_CAVALRY: { u32b flgs[TR_FLAG_SIZE]; object_flags(o_ptr, flgs); if (p_ptr->riding && have_flag(flgs, TR_RIDING)) {result.num = 550; result.wgt = 70; result.mul = 65;} else {result.num = 500; result.wgt = 100; result.mul = 35;} break; } case CLASS_SORCERER: result.num = 100; result.wgt = 1; result.mul = 10; break; case CLASS_ARCHER: case CLASS_BARD: result.num = 450; result.wgt = 70; result.mul = 20; break; case CLASS_FORCETRAINER: result.num = 400; result.wgt = 60; result.mul = 20; break; case CLASS_MIRROR_MASTER: case CLASS_SNIPER: result.num = 400; result.wgt = 100; result.mul = 30; break; case CLASS_NINJA: result.num = 425; result.wgt = 20; result.mul = 10; break; case CLASS_MONSTER: result.num = 500; result.wgt = 70; result.mul = 50; if (prace_is_(RACE_MON_LICH)) { result.num = 400; result.mul = 30; } else if (prace_is_(RACE_MON_POSSESSOR)) { result.num = 400; } else if (prace_is_(RACE_MON_MIMIC)) { result.num = 400; } else if (prace_is_(RACE_MON_TROLL)) { result.num = 550; } else if (prace_is_(RACE_MON_GIANT)) { result.num = 550; result.mul = 50 + p_ptr->lev/5; result.wgt = 200; if (giant_is_(GIANT_HRU) && p_ptr->lev >= 40) result.mul = 80; } else if ( prace_is_(RACE_MON_JELLY) || demon_is_(DEMON_KHORNE) ) { result.num = 600; result.mul = 50 + p_ptr->lev/5; } else if (prace_is_(RACE_MON_LEPRECHAUN)) { result.num = 300; result.mul = 20; } else if (prace_is_(RACE_MON_SWORD)) { result.num = 525; if (p_ptr->lev >= 45) /* Death Scythes retaliate! */ result.num = 300; } else if (prace_is_(RACE_MON_GOLEM)) { result.num = 100; } break; } if (hex_spelling(HEX_XTRA_MIGHT) || hex_spelling(HEX_BUILDING) || p_ptr->tim_building_up) { result.wgt /= 2; result.mul += 20; } /* Xorns and Mariliths have multiple sets of arms */ if (arm > 0) result.num -= 100; if (result.num < 100) result.num = 100; if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_POISON_NEEDLE) result.num = 100; return result; }