static void _reconnaissance_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Reconnaissance"); break; case SPELL_DESC: var_set_string(res, "Quickly scout nearby terrain for enemies, traps and loot."); break; case SPELL_CAST: map_area(DETECT_RAD_MAP); detect_all(DETECT_RAD_DEFAULT); var_set_bool(res, TRUE); break; default: default_spell(cmd, res); break; } }
/* * Do an effect, given an object. * Boost is the extent to which skill surpasses difficulty, used as % boost. It * ranges from 0 to 138. */ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam, int boost) { int py = p_ptr->py; int px = p_ptr->px; int dam, chance, dur; if (effect < 1 || effect > EF_MAX) { msg("Bad effect passed to do_effect(). Please report this bug."); return FALSE; } switch (effect) { case EF_POISON: { inc_timed(TMD_POISONED, damroll(2, 7) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_BLIND: { inc_timed(TMD_BLIND, damroll(4, 25) + 75, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SCARE: { inc_timed(TMD_AFRAID, randint0(10) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_CONFUSE: { inc_timed(TMD_CONFUSED, damroll(4, 5) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_HALLUC: { inc_timed(TMD_IMAGE, randint0(250) + 250, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_PARALYZE: { inc_timed(TMD_PARALYZED, randint0(5) + 5, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SLOW: { if (inc_timed(TMD_SLOW, randint1(25) + 15, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_POISON: { if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_BLINDNESS: { if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_PARANOIA: { if (clear_timed(TMD_AFRAID, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CONFUSION: { if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_MIND: { if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; if (clear_timed(TMD_AFRAID, TRUE)) *ident = TRUE; if (clear_timed(TMD_IMAGE, TRUE)) *ident = TRUE; if (!of_has(p_ptr->state.flags, OF_RES_CONFU) && inc_timed(TMD_OPP_CONF, damroll(4, 10), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_BODY: { if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_LIGHT: { if (hp_player(20)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (dec_timed(TMD_CUT, 20, TRUE)) *ident = TRUE; if (dec_timed(TMD_CONFUSED, 20, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_SERIOUS: { if (hp_player(40)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CRITICAL: { if (hp_player(60)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; if (clear_timed(TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL: { int amt = (p_ptr->mhp * 35) / 100; if (amt < 300) amt = 300; if (hp_player(amt)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; if (clear_timed(TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL2: { if (hp_player(1200)) *ident = TRUE; if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; if (clear_timed(TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_TEMP: { if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_CONFUSED, TRUE)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL1: { if (hp_player(500)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL2: { if (hp_player(1000)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL3: { if (hp_player(500)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_GAIN_EXP: { if (p_ptr->exp < PY_MAX_EXP) { msg("You feel more experienced."); player_exp_gain(p_ptr, 100000L); *ident = TRUE; } return TRUE; } case EF_LOSE_EXP: { if (!check_state(OF_HOLD_LIFE, p_ptr->state.flags) && (p_ptr->exp > 0)) { msg("You feel your memories fade."); player_exp_lose(p_ptr, p_ptr->exp / 4, FALSE); *ident = TRUE; } *ident = TRUE; wieldeds_notice_flag(OF_HOLD_LIFE); return TRUE; } case EF_RESTORE_EXP: { if (restore_level()) *ident = TRUE; return TRUE; } case EF_RESTORE_MANA: { if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } return TRUE; } case EF_GAIN_STR: case EF_GAIN_INT: case EF_GAIN_WIS: case EF_GAIN_DEX: case EF_GAIN_CON: case EF_GAIN_CHR: { int stat = effect - EF_GAIN_STR; if (do_inc_stat(stat)) *ident = TRUE; return TRUE; } case EF_GAIN_ALL: { if (do_inc_stat(A_STR)) *ident = TRUE; if (do_inc_stat(A_INT)) *ident = TRUE; if (do_inc_stat(A_WIS)) *ident = TRUE; if (do_inc_stat(A_DEX)) *ident = TRUE; if (do_inc_stat(A_CON)) *ident = TRUE; if (do_inc_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_BRAWN: { /* Pick a random stat to decrease other than strength */ int stat = randint0(A_MAX-1) + 1; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_STR); *ident = TRUE; } return TRUE; } case EF_INTELLECT: { /* Pick a random stat to decrease other than intelligence */ int stat = randint0(A_MAX-1); if (stat >= A_INT) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_INT); *ident = TRUE; } return TRUE; } case EF_CONTEMPLATION: { /* Pick a random stat to decrease other than wisdom */ int stat = randint0(A_MAX-1); if (stat >= A_WIS) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_WIS); *ident = TRUE; } return TRUE; } case EF_TOUGHNESS: { /* Pick a random stat to decrease other than constitution */ int stat = randint0(A_MAX-1); if (stat >= A_CON) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_CON); *ident = TRUE; } return TRUE; } case EF_NIMBLENESS: { /* Pick a random stat to decrease other than dexterity */ int stat = randint0(A_MAX-1); if (stat >= A_DEX) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_DEX); *ident = TRUE; } return TRUE; } case EF_PLEASING: { /* Pick a random stat to decrease other than charisma */ int stat = randint0(A_MAX-1); if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_CHR); *ident = TRUE; } return TRUE; } case EF_LOSE_STR: case EF_LOSE_INT: case EF_LOSE_WIS: case EF_LOSE_DEX: case EF_LOSE_CON: case EF_LOSE_CHR: { int stat = effect - EF_LOSE_STR; take_hit(damroll(5, 5), "stat drain"); (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_LOSE_CON2: { take_hit(damroll(10, 10), "poisonous food"); (void)do_dec_stat(A_CON, FALSE); *ident = TRUE; return TRUE; } case EF_RESTORE_STR: case EF_RESTORE_INT: case EF_RESTORE_WIS: case EF_RESTORE_DEX: case EF_RESTORE_CON: case EF_RESTORE_CHR: { int stat = effect - EF_RESTORE_STR; if (do_res_stat(stat)) *ident = TRUE; return TRUE; } case EF_CURE_NONORLYBIG: { msg("You feel life flow through your body!"); restore_level(); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_IMAGE, TRUE); (void)clear_timed(TMD_STUN, TRUE); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_AMNESIA, TRUE); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; /* Recalculate max. hitpoints */ update_stuff(); hp_player(5000); *ident = TRUE; return TRUE; } case EF_RESTORE_ALL: { /* Life, above, also gives these effects */ if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_RESTORE_ST_LEV: { if (restore_level()) *ident = TRUE; if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_TMD_INFRA: { if (inc_timed(TMD_SINFRA, 100 + damroll(4, 25), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_SINVIS: { if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (inc_timed(TMD_SINVIS, 12 + damroll(2, 6), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_ESP: { if (clear_timed(TMD_BLIND, TRUE)) *ident = TRUE; if (inc_timed(TMD_TELEPATHY, 12 + damroll(6, 6), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT: { msg("An image of your surroundings forms in your mind..."); wiz_light(); *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT2: { msg("You begin to feel more enlightened..."); message_flush(); wiz_light(); (void)do_inc_stat(A_INT); (void)do_inc_stat(A_WIS); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); (void)detect_treasure(TRUE); identify_pack(); *ident = TRUE; return TRUE; } case EF_HERO: { dur = randint1(25) + 25; if (hp_player(10)) *ident = TRUE; if (clear_timed(TMD_AFRAID, TRUE)) *ident = TRUE; if (inc_timed(TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_HERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHERO: { dur = randint1(25) + 25; if (hp_player(30)) *ident = TRUE; if (clear_timed(TMD_AFRAID, TRUE)) *ident = TRUE; if (inc_timed(TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ACID: { if (inc_timed(TMD_OPP_ACID, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ELEC: { if (inc_timed(TMD_OPP_ELEC, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_FIRE: { if (inc_timed(TMD_OPP_FIRE, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_COLD: { if (inc_timed(TMD_OPP_COLD, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_POIS: { if (inc_timed(TMD_OPP_POIS, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ALL: { if (inc_timed(TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_OPP_POIS, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_DETECT_TREASURE: { if (detect_treasure(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_TRAP: { if (detect_traps(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_DOORSTAIR: { if (detect_doorstairs(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_INVIS: { if (detect_monsters_invis(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_EVIL: { if (detect_monsters_evil(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_ALL: { if (detect_all(aware)) *ident = TRUE; return TRUE; } case EF_ENCHANT_TOHIT: { *ident = TRUE; return enchant_spell(1, 0, 0); } case EF_ENCHANT_TODAM: { *ident = TRUE; return enchant_spell(0, 1, 0); } case EF_ENCHANT_WEAPON: { *ident = TRUE; return enchant_spell(randint1(3), randint1(3), 0); } case EF_ENCHANT_ARMOR: { *ident = TRUE; return enchant_spell(0, 0, 1); } case EF_ENCHANT_ARMOR2: { *ident = TRUE; return enchant_spell(0, 0, randint1(3) + 2); } case EF_RESTORE_ITEM: { *ident = TRUE; return restore_item(); } case EF_IDENTIFY: { *ident = TRUE; if (!ident_spell()) return FALSE; return TRUE; } case EF_REMOVE_CURSE: { if (remove_curse()) { if (!p_ptr->timed[TMD_BLIND]) msg("The air around your body glows blue for a moment..."); else msg("You feel as if someone is watching over you."); *ident = TRUE; } return TRUE; } case EF_REMOVE_CURSE2: { remove_all_curse(); *ident = TRUE; return TRUE; } case EF_LIGHT: { if (light_area(damroll(2, 8), 2)) *ident = TRUE; return TRUE; } case EF_SUMMON_MON: { int i; sound(MSG_SUM_MONSTER); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, 0, 1)) *ident = TRUE; } return TRUE; } case EF_SUMMON_UNDEAD: { int i; sound(MSG_SUM_UNDEAD); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, S_UNDEAD, 1)) *ident = TRUE; } return TRUE; } case EF_TELE_PHASE: { teleport_player(10); *ident = TRUE; return TRUE; } case EF_TELE_LONG: { teleport_player(100); *ident = TRUE; return TRUE; } case EF_TELE_LEVEL: { (void)teleport_player_level(); *ident = TRUE; return TRUE; } case EF_CONFUSING: { if (p_ptr->confusing == 0) { msg("Your hands begin to glow."); p_ptr->confusing = TRUE; *ident = TRUE; } return TRUE; } case EF_MAPPING: { map_area(); *ident = TRUE; return TRUE; } case EF_RUNE: { warding_glyph(); *ident = TRUE; return TRUE; } case EF_ACQUIRE: { acquirement(py, px, p_ptr->depth, 1, TRUE); *ident = TRUE; return TRUE; } case EF_ACQUIRE2: { acquirement(py, px, p_ptr->depth, randint1(2) + 1, TRUE); *ident = TRUE; return TRUE; } case EF_ANNOY_MON: { msg("There is a high pitched humming noise."); aggravate_monsters(0); *ident = TRUE; return TRUE; } case EF_CREATE_TRAP: { /* Hack -- no traps in the town */ if (p_ptr->depth == 0) return TRUE; trap_creation(); msg("You hear a low-pitched whistling sound."); *ident = TRUE; return TRUE; } case EF_DESTROY_TDOORS: { if (destroy_doors_touch()) *ident = TRUE; return TRUE; } case EF_RECHARGE: { *ident = TRUE; if (!recharge(60)) return FALSE; return TRUE; } case EF_BANISHMENT: { *ident = TRUE; if (!banishment()) return FALSE; return TRUE; } case EF_DARKNESS: { if (!check_state(OF_RES_DARK, p_ptr->state.flags)) (void)inc_timed(TMD_BLIND, 3 + randint1(5), TRUE, TRUE); unlight_area(10, 3); wieldeds_notice_flag(OF_RES_DARK); *ident = TRUE; return TRUE; } case EF_PROTEVIL: { if (inc_timed(TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SATISFY: { if (set_food(PY_FOOD_MAX - 1)) *ident = TRUE; return TRUE; } case EF_CURSE_WEAPON: { if (curse_weapon()) *ident = TRUE; return TRUE; } case EF_CURSE_ARMOR: { if (curse_armor()) *ident = TRUE; return TRUE; } case EF_BLESSING: { if (inc_timed(TMD_BLESSED, randint1(12) + 6, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING2: { if (inc_timed(TMD_BLESSED, randint1(24) + 12, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING3: { if (inc_timed(TMD_BLESSED, randint1(48) + 24, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RECALL: { set_recall(); *ident = TRUE; return TRUE; } case EF_DEEP_DESCENT: { int i, target_depth = p_ptr->depth; /* Calculate target depth */ for (i = 2; i > 0; i--) { if (is_quest(target_depth)) break; if (target_depth >= MAX_DEPTH - 1) break; target_depth++; } if (target_depth > p_ptr->depth) { msgt(MSG_TPLEVEL, "You sink through the floor..."); dungeon_change_level(target_depth); *ident = TRUE; return TRUE; } else { msgt(MSG_TPLEVEL, "You sense a malevolent presence blocking passage to the levels below."); *ident = TRUE; return FALSE; } } case EF_LOSHASTE: { if (speed_monsters()) *ident = TRUE; return TRUE; } case EF_LOSSLEEP: { if (sleep_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSSLOW: { if (slow_monsters()) *ident = TRUE; return TRUE; } case EF_LOSCONF: { if (confuse_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSKILL: { (void)mass_banishment(); *ident = TRUE; return TRUE; } case EF_EARTHQUAKES: { earthquake(py, px, 10); *ident = TRUE; return TRUE; } case EF_DESTRUCTION2: { destroy_area(py, px, 15, TRUE); *ident = TRUE; return TRUE; } case EF_ILLUMINATION: { if (light_area(damroll(2, 15), 3)) *ident = TRUE; return TRUE; } case EF_CLAIRVOYANCE: { *ident = TRUE; wiz_light(); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); return TRUE; } case EF_PROBING: { *ident = probing(); return TRUE; } case EF_STONE_TO_MUD: { if (wall_to_mud(dir)) *ident = TRUE; return TRUE; } case EF_CONFUSE2: { *ident = TRUE; confuse_monster(dir, 20, aware); return TRUE; } case EF_BIZARRE: { *ident = TRUE; ring_of_power(dir); return TRUE; } case EF_STAR_BALL: { int i; *ident = TRUE; for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], (150 * (100 + boost) / 100), 3); return TRUE; } case EF_RAGE_BLESS_RESIST: { dur = randint1(50) + 50; *ident = TRUE; (void)hp_player(30); (void)clear_timed(TMD_AFRAID, TRUE); (void)inc_timed(TMD_BOLD, dur, TRUE, TRUE); (void)inc_timed(TMD_SHERO, dur, TRUE, TRUE); (void)inc_timed(TMD_BLESSED, randint1(50) + 50, TRUE, TRUE); (void)inc_timed(TMD_OPP_ACID, randint1(50) + 50, TRUE, TRUE); (void)inc_timed(TMD_OPP_ELEC, randint1(50) + 50, TRUE, TRUE); (void)inc_timed(TMD_OPP_FIRE, randint1(50) + 50, TRUE, TRUE); (void)inc_timed(TMD_OPP_COLD, randint1(50) + 50, TRUE, TRUE); (void)inc_timed(TMD_OPP_POIS, randint1(50) + 50, TRUE, TRUE); return TRUE; } case EF_SLEEPII: { *ident = TRUE; sleep_monsters_touch(aware); return TRUE; } case EF_RESTORE_LIFE: { *ident = TRUE; restore_level(); return TRUE; } case EF_MISSILE: { *ident = TRUE; dam = damroll(3, 4) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_MISSILE, dir, dam); return TRUE; } case EF_DISPEL_EVIL: { *ident = TRUE; dam = p_ptr->lev * 5 * (100 + boost) / 100; dispel_evil(dam); return TRUE; } case EF_DISPEL_EVIL60: { dam = 60 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_UNDEAD: { dam = 60 * (100 + boost) / 100; if (dispel_undead(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_ALL: { dam = 120 * (100 + boost) / 100; if (dispel_monsters(dam)) *ident = TRUE; return TRUE; } case EF_HASTE: { if (!p_ptr->timed[TMD_FAST]) { if (set_timed(TMD_FAST, damroll(2, 10) + 20, TRUE)) *ident = TRUE; } else { (void)inc_timed(TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE1: { if (!p_ptr->timed[TMD_FAST]) { if (set_timed(TMD_FAST, randint1(20) + 20, TRUE)) *ident = TRUE; } else { (void)inc_timed(TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE2: { if (!p_ptr->timed[TMD_FAST]) { if (set_timed(TMD_FAST, randint1(75) + 75, TRUE)) *ident = TRUE; } else { (void)inc_timed(TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_FIRE_BOLT: { *ident = TRUE; dam = damroll(9, 8) * (100 + boost) / 100; fire_bolt(GF_FIRE, dir, dam); return TRUE; } case EF_FIRE_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT3: { dam = damroll(16, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT72: { dam = 72 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_FIRE_BALL: { dam = 144 * (100 + boost) / 100; fire_ball(GF_FIRE, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_FIRE_BALL2: { dam = 120 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_FIRE_BALL200: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_COLD_BOLT: { dam = damroll(6, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt_or_beam(beam, GF_COLD, dir, dam); return TRUE; } case EF_COLD_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_COLD, dir, dam); return TRUE; } case EF_COLD_BALL2: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_COLD_BALL50: { dam = 50 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL100: { dam = 100 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL160: { dam = 160 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_ACID_BOLT: { dam = damroll(5, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ACID, dir, dam); return TRUE; } case EF_ACID_BOLT2: { dam = damroll(10, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BOLT3: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BALL: { dam = 120 * (100 + boost) / 100; fire_ball(GF_ACID, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BOLT: { dam = damroll(6, 6) * (100 + boost) / 100; *ident = TRUE; fire_beam(GF_ELEC, dir, dam); return TRUE; } case EF_ELEC_BALL: { dam = 64 * (100 + boost) / 100; fire_ball(GF_ELEC, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BALL2: { dam = 250 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 3); return TRUE; } case EF_ARROW: { dam = 150 * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ARROW, dir, dam); return TRUE; } case EF_REM_FEAR_POIS: { *ident = TRUE; (void)clear_timed(TMD_AFRAID, TRUE); (void)clear_timed(TMD_POISONED, TRUE); return TRUE; } case EF_STINKING_CLOUD: { dam = 12 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_POIS, dir, dam, 3); return TRUE; } case EF_DRAIN_LIFE1: { dam = 90 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE2: { dam = 120 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE3: { dam = 150 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE4: { dam = 250 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_FIREBRAND: { *ident = TRUE; if (!brand_bolts()) return FALSE; return TRUE; } case EF_MANA_BOLT: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt(GF_MANA, dir, dam); *ident = TRUE; return TRUE; } case EF_MON_HEAL: { if (heal_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_HASTE: { if (speed_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SLOW: { if (slow_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_CONFUSE: { if (confuse_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_MON_SLEEP: { if (sleep_monster(dir, aware)) *ident = TRUE; return TRUE; } case EF_MON_CLONE: { if (clone_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SCARE: { if (fear_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_LIGHT_LINE: { msg("A line of shimmering blue light appears."); light_line(dir); *ident = TRUE; return TRUE; } case EF_TELE_OTHER: { if (teleport_monster(dir)) *ident = TRUE; return TRUE; } case EF_DISARMING: { if (disarm_trap(dir)) *ident = TRUE; return TRUE; } case EF_TDOOR_DEST: { if (destroy_door(dir)) *ident = TRUE; return TRUE; } case EF_POLYMORPH: { if (poly_monster(dir)) *ident = TRUE; return TRUE; } case EF_STARLIGHT: { int i; if (!p_ptr->timed[TMD_BLIND]) msg("Light shoots in all directions!"); for (i = 0; i < 8; i++) light_line(ddd[i]); *ident = TRUE; return TRUE; } case EF_STARLIGHT2: { int k; for (k = 0; k < 8; k++) strong_light_line(ddd[k]); *ident = TRUE; return TRUE; } case EF_BERSERKER: { dur = randint1(50) + 50; if (inc_timed(TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (inc_timed(TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_WONDER: { if (effect_wonder(dir, randint1(100) + p_ptr->lev / 5, beam)) *ident = TRUE; return TRUE; } case EF_WAND_BREATH: { /* table of random ball effects and their damages */ const int breath_types[] = { GF_ACID, 200, GF_ELEC, 160, GF_FIRE, 200, GF_COLD, 160, GF_POIS, 120 }; /* pick a random (type, damage) tuple in the table */ int which = 2 * randint0(sizeof(breath_types) / (2 * sizeof(int))); fire_ball(breath_types[which], dir, breath_types[which + 1], 3); *ident = TRUE; return TRUE; } case EF_STAFF_MAGI: { if (do_res_stat(A_INT)) *ident = TRUE; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; *ident = TRUE; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); } return TRUE; } case EF_STAFF_HOLY: { dam = 120 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; if (inc_timed(TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; if (clear_timed(TMD_AFRAID, TRUE)) *ident = TRUE; if (hp_player(50)) *ident = TRUE; if (clear_timed(TMD_STUN, TRUE)) *ident = TRUE; if (clear_timed(TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_DRINK_BREATH: { const int breath_types[] = { GF_FIRE, 80, GF_COLD, 80, }; int which = 2 * randint0(N_ELEMENTS(breath_types) / 2); fire_ball(breath_types[which], dir, breath_types[which + 1], 2); *ident = TRUE; return TRUE; } case EF_DRINK_GOOD: { msg("You feel less thirsty."); *ident = TRUE; return TRUE; } case EF_DRINK_DEATH: { msg("A feeling of Death flows through your body."); take_hit(5000, "a potion of Death"); *ident = TRUE; return TRUE; } case EF_DRINK_RUIN: { msg("Your nerves and muscles feel weak and lifeless!"); take_hit(damroll(10, 10), "a potion of Ruination"); player_stat_dec(p_ptr, A_DEX, TRUE); player_stat_dec(p_ptr, A_WIS, TRUE); player_stat_dec(p_ptr, A_CON, TRUE); player_stat_dec(p_ptr, A_STR, TRUE); player_stat_dec(p_ptr, A_CHR, TRUE); player_stat_dec(p_ptr, A_INT, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_DETONATE: { msg("Massive explosions rupture your body!"); take_hit(damroll(50, 20), "a potion of Detonation"); (void)inc_timed(TMD_STUN, 75, TRUE, TRUE); (void)inc_timed(TMD_CUT, 5000, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_SALT: { msg("The potion makes you vomit!"); (void)set_food(PY_FOOD_STARVE - 1); (void)clear_timed(TMD_POISONED, TRUE); (void)inc_timed(TMD_PARALYZED, 4, TRUE, FALSE); *ident = TRUE; return TRUE; } case EF_FOOD_GOOD: { msg("That tastes good."); *ident = TRUE; return TRUE; } case EF_FOOD_WAYBREAD: { msg("That tastes good."); (void)clear_timed(TMD_POISONED, TRUE); (void)hp_player(damroll(4, 8)); *ident = TRUE; return TRUE; } case EF_SHROOM_EMERGENCY: { (void)set_timed(TMD_IMAGE, rand_spread(250, 50), TRUE); (void)set_timed(TMD_OPP_FIRE, rand_spread(30, 10), TRUE); (void)set_timed(TMD_OPP_COLD, rand_spread(30, 10), TRUE); (void)hp_player(200); *ident = TRUE; return TRUE; } case EF_SHROOM_TERROR: { if (set_timed(TMD_TERROR, rand_spread(100, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_STONE: { if (set_timed(TMD_STONESKIN, rand_spread(80, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_DEBILITY: { int stat = one_in_(2) ? A_STR : A_CON; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_SHROOM_SPRINTING: { if (inc_timed(TMD_SPRINT, 100, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_PURGING: { (void)set_food(PY_FOOD_FAINT - 1); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (clear_timed(TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_RING_ACID: { dam = 70 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ACID, dir, dam, 2); inc_timed(TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_FLAMES: { dam = 80 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); inc_timed(TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_ICE: { dam = 75 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); inc_timed(TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_LIGHTNING: { dam = 85 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 2); inc_timed(TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_DRAGON_BLUE: { dam = 100 * (100 + boost) / 100; msgt(MSG_BR_ELEC, "You breathe lightning."); fire_ball(GF_ELEC, dir, dam, 2); return TRUE; } case EF_DRAGON_GREEN: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_GAS, "You breathe poison gas."); fire_ball(GF_POIS, dir, dam, 2); return TRUE; } case EF_DRAGON_RED: { dam = 200 * (100 + boost) / 100; msgt(MSG_BR_FIRE, "You breathe fire."); fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_DRAGON_MULTIHUED: { static const struct { int msg_sound; const char *msg; int typ; } mh[] = { { MSG_BR_ELEC, "lightning", GF_ELEC }, { MSG_BR_FROST, "frost", GF_COLD }, { MSG_BR_ACID, "acid", GF_ACID }, { MSG_BR_GAS, "poison gas", GF_POIS }, { MSG_BR_FIRE, "fire", GF_FIRE } }; int chance = randint0(5); dam = 250 * (100 + boost) / 100; msgt(mh[chance].msg_sound, "You breathe %s.", mh[chance].msg); fire_ball(mh[chance].typ, dir, dam, 2); return TRUE; } case EF_DRAGON_BRONZE: { dam = 120 * (100 + boost) / 100; msgt(MSG_BR_CONF, "You breathe confusion."); fire_ball(GF_CONFU, dir, dam, 2); return TRUE; } case EF_DRAGON_GOLD: { dam = 130 * (100 + boost) / 100; msgt(MSG_BR_SOUND, "You breathe sound."); fire_ball(GF_SOUND, dir, dam, 2); return TRUE; } case EF_DRAGON_CHAOS: { dam = 220 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_CHAOS : MSG_BR_DISEN), "You breathe %s.", ((chance == 1 ? "chaos" : "disenchantment"))); fire_ball((chance == 1 ? GF_CHAOS : GF_DISEN), dir, dam, 2); return TRUE; } case EF_DRAGON_LAW: { dam = 230 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_SOUND : MSG_BR_SHARDS), "You breathe %s.", ((chance == 1 ? "sound" : "shards"))); fire_ball((chance == 1 ? GF_SOUND : GF_SHARD), dir, dam, 2); return TRUE; } case EF_DRAGON_BALANCE: { dam = 250 * (100 + boost) / 100; chance = randint0(4); msg("You breathe %s.", ((chance == 1) ? "chaos" : ((chance == 2) ? "disenchantment" : ((chance == 3) ? "sound" : "shards")))); fire_ball(((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISEN : ((chance == 3) ? GF_SOUND : GF_SHARD))), dir, dam, 2); return TRUE; } case EF_DRAGON_SHINING: { dam = 200 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 0 ? MSG_BR_LIGHT : MSG_BR_DARK), "You breathe %s.", ((chance == 0 ? "light" : "darkness"))); fire_ball((chance == 0 ? GF_LIGHT : GF_DARK), dir, dam, 2); return TRUE; } case EF_DRAGON_POWER: { dam = 300 * (100 + boost) / 100; msgt(MSG_BR_ELEMENTS, "You breathe the elements."); fire_ball(GF_MISSILE, dir, dam, 2); return TRUE; } case EF_TRAP_DOOR: { msg("You fall through a trap door!"); if (check_state(OF_FEATHER, p_ptr->state.flags)) { msg("You float gently down to the next level."); } else { take_hit(damroll(2, 8), "a trap"); } wieldeds_notice_flag(OF_FEATHER); dungeon_change_level(p_ptr->depth + 1); return TRUE; } case EF_TRAP_PIT: { msg("You fall into a pit!"); if (check_state(OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the bottom of the pit."); } else { take_hit(damroll(2, 6), "a trap"); } wieldeds_notice_flag(OF_FEATHER); return TRUE; } case EF_TRAP_PIT_SPIKES: { msg("You fall into a spiked pit!"); if (check_state(OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { int dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled!"); dam *= 2; (void)inc_timed(TMD_CUT, randint1(dam), TRUE, TRUE); } take_hit(dam, "a trap"); } wieldeds_notice_flag(OF_FEATHER); return TRUE; } case EF_TRAP_PIT_POISON: { msg("You fall into a spiked pit!"); if (check_state(OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { int dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled on poisonous spikes!"); (void)inc_timed(TMD_CUT, randint1(dam * 2), TRUE, TRUE); (void)inc_timed(TMD_POISONED, randint1(dam * 4), TRUE, TRUE); } take_hit(dam, "a trap"); } wieldeds_notice_flag(OF_FEATHER); return TRUE; } case EF_TRAP_RUNE_SUMMON: { int i; int num = 2 + randint1(3); msgt(MSG_SUM_MONSTER, "You are enveloped in a cloud of smoke!"); /* Remove trap */ cave->info[py][px] &= ~(CAVE_MARK); cave_set_feat(cave, py, px, FEAT_FLOOR); for (i = 0; i < num; i++) (void)summon_specific(py, px, p_ptr->depth, 0, 1); break; } case EF_TRAP_RUNE_TELEPORT: { msg("You hit a teleport trap!"); teleport_player(100); return TRUE; } case EF_TRAP_SPOT_FIRE: { int dam; msg("You are enveloped in flames!"); dam = damroll(4, 6); dam = adjust_dam(GF_FIRE, dam, RANDOMISE, check_for_resist(GF_FIRE, p_ptr->state.flags, TRUE)); if (dam) { take_hit(dam, "a fire trap"); inven_damage(GF_FIRE, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_SPOT_ACID: { int dam; msg("You are splashed with acid!"); dam = damroll(4, 6); dam = adjust_dam(GF_ACID, dam, RANDOMISE, check_for_resist(GF_ACID, p_ptr->state.flags, TRUE)); if (dam) { take_hit(dam, "an acid trap"); inven_damage(GF_ACID, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_DART_SLOW: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(damroll(1, 4), "a trap"); (void)inc_timed(TMD_SLOW, randint0(20) + 20, TRUE, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_STR: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(damroll(1, 4), "a trap"); (void)do_dec_stat(A_STR, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_DEX: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(damroll(1, 4), "a trap"); (void)do_dec_stat(A_DEX, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_CON: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(damroll(1, 4), "a trap"); (void)do_dec_stat(A_CON, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_GAS_BLIND: { msg("You are surrounded by a black gas!"); (void)inc_timed(TMD_BLIND, randint0(50) + 25, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_CONFUSE: { msg("You are surrounded by a gas of scintillating colors!"); (void)inc_timed(TMD_CONFUSED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_POISON: { msg("You are surrounded by a pungent green gas!"); (void)inc_timed(TMD_POISONED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_SLEEP: { msg("You are surrounded by a strange white mist!"); (void)inc_timed(TMD_PARALYZED, randint0(10) + 5, TRUE, TRUE); return TRUE; } case EF_XXX: case EF_MAX: break; } /* Not used */ msg("Effect not handled."); return FALSE; }
/* * Activate a wielded object. Wielded objects never stack. * And even if they did, activatable objects never stack. * * Currently, only (some) artifacts, and Dragon Scale Mail, can be activated. * But one could, for example, easily make an activatable "Ring of Plasma". * * Note that it always takes a turn to activate an artifact, even if * the user hits "escape" at the "direction" prompt. */ static bool activate_object(object_type *o_ptr, bool *ident) { int k, dir, i, chance; /* Check the recharge */ if (o_ptr->timeout) { msg_print("It whines, glows and fades..."); return FALSE; } /* Activate the artifact */ message(MSG_ZAP, 0, "You activate it..."); /* Artifacts */ if (o_ptr->name1) { artifact_type *a_ptr = &a_info[o_ptr->name1]; char o_name[80]; /* Get the basic name of the object */ object_desc(o_name, sizeof(o_name), o_ptr, FALSE, 0); switch (a_ptr->activation) { case ACT_ILLUMINATION: { msg_format("The %s wells with clear light...", o_name); lite_area(damroll(2, 15), 3); break; } case ACT_MAGIC_MAP: { msg_format("The %s shines brightly...", o_name); map_area(); break; } case ACT_CLAIRVOYANCE: { msg_format("The %s glows a deep green...", o_name); wiz_lite(); (void)detect_traps(); (void)detect_doors(); (void)detect_stairs(); break; } case ACT_PROT_EVIL: { msg_format("The %s lets out a shrill wail...", o_name); k = 3 * p_ptr->lev; (void)set_protevil(p_ptr->protevil + randint(25) + k); break; } case ACT_DISP_EVIL: { msg_format("The %s floods the area with goodness...", o_name); dispel_evil(p_ptr->lev * 5); break; } case ACT_HASTE2: { msg_format("The %s glows brightly...", o_name); if (!p_ptr->fast) { (void)set_fast(randint(75) + 75); } else { (void)set_fast(p_ptr->fast + 5); } break; } case ACT_FIRE3: { msg_format("The %s glows deep red...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_FIRE, dir, 120, 3); break; } case ACT_FROST5: { msg_format("The %s glows bright white...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 200, 3); break; } case ACT_ELEC2: { msg_format("The %s glows deep blue...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_ELEC, dir, 250, 3); break; } case ACT_BIZZARE: { msg_format("The %s glows intensely black...", o_name); if (!get_aim_dir(&dir)) return FALSE; ring_of_power(dir); break; } case ACT_STAR_BALL: { msg_format("Your %s is surrounded by lightning...", o_name); for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], 150, 3); break; } case ACT_RAGE_BLESS_RESIST: { msg_format("Your %s glows many colours...", o_name); (void)hp_player(30); (void)set_afraid(0); (void)set_shero(p_ptr->shero + randint(50) + 50); (void)set_blessed(p_ptr->blessed + randint(50) + 50); (void)set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50); (void)set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50); (void)set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50); (void)set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50); (void)set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50); break; } case ACT_HEAL2: { msg_format("Your %s glows a bright white...", o_name); msg_print("You feel much better..."); (void)hp_player(1000); (void)set_cut(0); break; } case ACT_PHASE: { msg_format("Your %s twists space around you...", o_name); teleport_player(10); break; } case ACT_BANISHMENT: { msg_format("Your %s glows deep blue...", o_name); (void)banishment(); break; } case ACT_TRAP_DOOR_DEST: { msg_format("Your %s glows bright red...", o_name); destroy_doors_touch(); break; } case ACT_DETECT: { msg_format("Your %s glows bright white...", o_name); msg_print("An image forms in your mind..."); detect_all(); break; } case ACT_HEAL1: { msg_format("Your %s glows deep blue...", o_name); msg_print("You feel a warm tingling inside..."); (void)hp_player(500); (void)set_cut(0); break; } case ACT_RESIST: { msg_format("Your %s glows many colours...", o_name); (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); break; } case ACT_SLEEP: { msg_format("Your %s glows deep blue...", o_name); sleep_monsters_touch(); break; } case ACT_RECHARGE1: { msg_format("Your %s glows bright yellow...", o_name); recharge(60); break; } case ACT_TELEPORT: { msg_format("Your %s twists space around you...", o_name); teleport_player(100); break; } case ACT_RESTORE_LIFE: { msg_format("Your %s glows a deep red...", o_name); restore_level(); break; } case ACT_MISSILE: { msg_format("Your %s glows extremely brightly...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_MISSILE, dir, damroll(2, 6)); break; } case ACT_FIRE1: { msg_format("Your %s is covered in fire...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_FIRE, dir, damroll(9, 8)); break; } case ACT_FROST1: { msg_format("Your %s is covered in frost...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_COLD, dir, damroll(6, 8)); break; } case ACT_LIGHTNING_BOLT: { msg_format("Your %s is covered in sparks...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ELEC, dir, damroll(4, 8)); break; } case ACT_ACID1: { msg_format("Your %s is covered in acid...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ACID, dir, damroll(5, 8)); break; } case ACT_ARROW: { msg_format("Your %s grows magical spikes...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ARROW, dir, 150); break; } case ACT_HASTE1: { msg_format("Your %s glows bright green...", o_name); if (!p_ptr->fast) { (void)set_fast(randint(20) + 20); } else { (void)set_fast(p_ptr->fast + 5); } break; } case ACT_REM_FEAR_POIS: { msg_format("Your %s glows deep blue...", o_name); (void)set_afraid(0); (void)set_poisoned(0); break; } case ACT_STINKING_CLOUD: { msg_format("Your %s throbs deep green...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_POIS, dir, 12, 3); break; } case ACT_FROST2: { msg_format("Your %s is covered in frost...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 48, 2); break; } case ACT_FROST4: { msg_format("Your %s glows a pale blue...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_COLD, dir, damroll(12, 8)); break; } case ACT_FROST3: { msg_format("Your %s glows a intense blue...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 100, 2); break; } case ACT_FIRE2: { msg_format("Your %s rages in fire...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_FIRE, dir, 72, 2); break; } case ACT_DRAIN_LIFE2: { msg_format("Your %s glows black...", o_name); if (!get_aim_dir(&dir)) return FALSE; drain_life(dir, 120); break; } case ACT_STONE_TO_MUD: { msg_format("Your %s pulsates...", o_name); if (!get_aim_dir(&dir)) return FALSE; wall_to_mud(dir); break; } case ACT_MASS_BANISHMENT: { msg_format("Your %s lets out a long, shrill note...", o_name); (void)mass_banishment(); break; } case ACT_CURE_WOUNDS: { msg_format("Your %s radiates deep purple...", o_name); hp_player(damroll(4, 8)); (void)set_cut((p_ptr->cut / 2) - 50); break; } case ACT_TELE_AWAY: { msg_format("Your %s glows deep red...", o_name); if (!get_aim_dir(&dir)) return FALSE; teleport_monster(dir); break; } case ACT_WOR: { msg_format("Your %s glows soft white...", o_name); set_recall(); break; } case ACT_CONFUSE: { msg_format("Your %s glows in scintillating colours...", o_name); if (!get_aim_dir(&dir)) return FALSE; confuse_monster(dir, 20); break; } case ACT_IDENTIFY: { msg_format("Your %s glows yellow...", o_name); if (!ident_spell()) return FALSE; break; } case ACT_PROBE: { msg_format("Your %s glows brightly...", o_name); probing(); break; } case ACT_DRAIN_LIFE1: { msg_format("Your %s glows white...", o_name); if (!get_aim_dir(&dir)) return FALSE; drain_life(dir, 90); break; } case ACT_FIREBRAND: { msg_format("Your %s glows deep red...", o_name); (void)brand_bolts(); break; } case ACT_STARLIGHT: { msg_format("Your %s glows with the light of a thousand stars...", o_name); for (k = 0; k < 8; k++) strong_lite_line(ddd[k]); break; } case ACT_MANA_BOLT: { msg_format("Your %s glows white...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_MANA, dir, damroll(12, 8)); break; } case ACT_BERSERKER: { msg_format("Your %s glows in anger...", o_name); set_shero(p_ptr->shero + randint(50) + 50); break; } } /* Set the recharge time */ if (a_ptr->randtime) o_ptr->timeout = a_ptr->time + (byte)randint(a_ptr->randtime); else o_ptr->timeout = a_ptr->time; /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); /* Done */ return FALSE; } /* Hack -- Dragon Scale Mail can be activated as well */ if (o_ptr->tval == TV_DRAG_ARMOR) { /* Get a direction for breathing (or abort) */ if (!get_aim_dir(&dir)) return FALSE; /* Branch on the sub-type */ switch (o_ptr->sval) { case SV_DRAGON_BLUE: { msg_print("You breathe lightning."); fire_ball(GF_ELEC, dir, 100, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_WHITE: { msg_print("You breathe frost."); fire_ball(GF_COLD, dir, 110, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_BLACK: { msg_print("You breathe acid."); fire_ball(GF_ACID, dir, 130, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_GREEN: { msg_print("You breathe poison gas."); fire_ball(GF_POIS, dir, 150, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_RED: { msg_print("You breathe fire."); fire_ball(GF_FIRE, dir, 200, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_MULTIHUED: { chance = rand_int(5); msg_format("You breathe %s.", ((chance == 1) ? "lightning" : ((chance == 2) ? "frost" : ((chance == 3) ? "acid" : ((chance == 4) ? "poison gas" : "fire"))))); fire_ball(((chance == 1) ? GF_ELEC : ((chance == 2) ? GF_COLD : ((chance == 3) ? GF_ACID : ((chance == 4) ? GF_POIS : GF_FIRE)))), dir, 250, 2); o_ptr->timeout = rand_int(225) + 225; break; } case SV_DRAGON_BRONZE: { msg_print("You breathe confusion."); fire_ball(GF_CONFUSION, dir, 120, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_GOLD: { msg_print("You breathe sound."); fire_ball(GF_SOUND, dir, 130, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_CHAOS: { chance = rand_int(2); msg_format("You breathe %s.", ((chance == 1 ? "chaos" : "disenchantment"))); fire_ball((chance == 1 ? GF_CHAOS : GF_DISENCHANT), dir, 220, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_LAW: { chance = rand_int(2); msg_format("You breathe %s.", ((chance == 1 ? "sound" : "shards"))); fire_ball((chance == 1 ? GF_SOUND : GF_SHARD), dir, 230, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_BALANCE: { chance = rand_int(4); msg_format("You breathe %s.", ((chance == 1) ? "chaos" : ((chance == 2) ? "disenchantment" : ((chance == 3) ? "sound" : "shards")))); fire_ball(((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISENCHANT : ((chance == 3) ? GF_SOUND : GF_SHARD))), dir, 250, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_SHINING: { chance = rand_int(2); msg_format("You breathe %s.", ((chance == 0 ? "light" : "darkness"))); fire_ball((chance == 0 ? GF_LITE : GF_DARK), dir, 200, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_POWER: { msg_print("You breathe the elements."); fire_ball(GF_MISSILE, dir, 300, 2); o_ptr->timeout = rand_int(300) + 300; break; } } /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); /* Success */ return FALSE; } /* Hack -- some Rings can be activated for double resist and element ball */ if (o_ptr->tval == TV_RING) { /* Get a direction for firing (or abort) */ if (!get_aim_dir(&dir)) return FALSE; /* Branch on the sub-type */ switch (o_ptr->sval) { case SV_RING_ACID: { fire_ball(GF_ACID, dir, 70, 2); set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_FLAMES: { fire_ball(GF_FIRE, dir, 80, 2); set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_ICE: { fire_ball(GF_COLD, dir, 75, 2); set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_LIGHTNING: { fire_ball(GF_ELEC, dir, 85, 2); set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } } /* Window stuff */ p_ptr->window |= (PW_EQUIP); /* Success */ return FALSE; } /* Mistake */ msg_print("Oops. That object cannot be activated."); /* Not used up */ return (FALSE); }
static bool zap_rod(object_type *o_ptr, bool *ident) { int chance, dir, lev; /* Get a direction (unless KNOWN not to need it) */ if ((o_ptr->sval >= SV_ROD_MIN_DIRECTION) || !object_aware_p(o_ptr)) { /* Get a direction, allow cancel */ if (!get_aim_dir(&dir)) return FALSE; } /* Take a turn */ p_ptr->energy_use = 100; /* Not identified yet */ *ident = FALSE; /* Extract the item level */ lev = k_info[o_ptr->k_idx].level; /* Base chance of success */ chance = p_ptr->skill_dev; /* Confusion hurts skill */ if (p_ptr->confused) chance = chance / 2; /* High level objects are harder */ chance = chance - ((lev > 50) ? 50 : lev); /* Give everyone a (slight) chance */ if ((chance < USE_DEVICE) && (rand_int(USE_DEVICE - chance + 1) == 0)) { chance = USE_DEVICE; } /* Roll for usage */ if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) { if (flush_failure) flush(); msg_print("You failed to use the rod properly."); return FALSE; } /* Still charging */ if (o_ptr->pval) { if (flush_failure) flush(); msg_print("The rod is still charging."); return FALSE; } /* Sound */ sound(MSG_ZAP); /* Analyze the rod */ switch (o_ptr->sval) { case SV_ROD_DETECT_TRAP: { if (detect_traps()) *ident = TRUE; o_ptr->pval = 50; break; } case SV_ROD_DETECT_DOOR: { if (detect_doors()) *ident = TRUE; if (detect_stairs()) *ident = TRUE; o_ptr->pval = 70; break; } case SV_ROD_IDENTIFY: { *ident = TRUE; if (ident_spell()) o_ptr->pval = 10; break; } case SV_ROD_RECALL: { set_recall(); *ident = TRUE; o_ptr->pval = 60; break; } case SV_ROD_ILLUMINATION: { if (lite_area(damroll(2, 8), 2)) *ident = TRUE; o_ptr->pval = 30; break; } case SV_ROD_MAPPING: { map_area(); *ident = TRUE; o_ptr->pval = 99; break; } case SV_ROD_DETECTION: { detect_all(); *ident = TRUE; o_ptr->pval = 99; break; } case SV_ROD_PROBING: { probing(); *ident = TRUE; o_ptr->pval = 50; break; } case SV_ROD_CURING: { if (set_blind(0)) *ident = TRUE; if (set_poisoned(0)) *ident = TRUE; if (set_confused(0)) *ident = TRUE; if (set_stun(0)) *ident = TRUE; if (set_cut(0)) *ident = TRUE; o_ptr->pval = 999; break; } case SV_ROD_HEALING: { if (hp_player(500)) *ident = TRUE; if (set_stun(0)) *ident = TRUE; if (set_cut(0)) *ident = TRUE; o_ptr->pval = 999; break; } case SV_ROD_RESTORATION: { if (restore_level()) *ident = TRUE; if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; o_ptr->pval = 999; break; } case SV_ROD_SPEED: { if (!p_ptr->fast) { if (set_fast(randint(30) + 15)) *ident = TRUE; } else { (void)set_fast(p_ptr->fast + 5); } o_ptr->pval = 99; break; } case SV_ROD_TELEPORT_AWAY: { if (teleport_monster(dir)) *ident = TRUE; o_ptr->pval = 25; break; } case SV_ROD_DISARMING: { if (disarm_trap(dir)) *ident = TRUE; o_ptr->pval = 30; break; } case SV_ROD_LITE: { msg_print("A line of blue shimmering light appears."); lite_line(dir); *ident = TRUE; o_ptr->pval = 9; break; } case SV_ROD_SLEEP_MONSTER: { if (sleep_monster(dir)) *ident = TRUE; o_ptr->pval = 18; break; } case SV_ROD_SLOW_MONSTER: { if (slow_monster(dir)) *ident = TRUE; o_ptr->pval = 20; break; } case SV_ROD_DRAIN_LIFE: { if (drain_life(dir, 150)) *ident = TRUE; o_ptr->pval = 23; break; } case SV_ROD_POLYMORPH: { if (poly_monster(dir)) *ident = TRUE; o_ptr->pval = 25; break; } case SV_ROD_ACID_BOLT: { fire_bolt_or_beam(10, GF_ACID, dir, damroll(12, 8)); *ident = TRUE; o_ptr->pval = 12; break; } case SV_ROD_ELEC_BOLT: { fire_bolt_or_beam(10, GF_ELEC, dir, damroll(6, 6)); *ident = TRUE; o_ptr->pval = 11; break; } case SV_ROD_FIRE_BOLT: { fire_bolt_or_beam(10, GF_FIRE, dir, damroll(16, 8)); *ident = TRUE; o_ptr->pval = 15; break; } case SV_ROD_COLD_BOLT: { fire_bolt_or_beam(10, GF_COLD, dir, damroll(10, 8)); *ident = TRUE; o_ptr->pval = 13; break; } case SV_ROD_ACID_BALL: { fire_ball(GF_ACID, dir, 120, 2); *ident = TRUE; o_ptr->pval = 27; break; } case SV_ROD_ELEC_BALL: { fire_ball(GF_ELEC, dir, 64, 2); *ident = TRUE; o_ptr->pval = 23; break; } case SV_ROD_FIRE_BALL: { fire_ball(GF_FIRE, dir, 144, 2); *ident = TRUE; o_ptr->pval = 30; break; } case SV_ROD_COLD_BALL: { fire_ball(GF_COLD, dir, 96, 2); *ident = TRUE; o_ptr->pval = 25; break; } } return TRUE; }
/* * Ask for and parse a "debug command" * * The "p_ptr->command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; struct keypress cmd; const monster_race *r_ptr; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd.code) { /* Ignore */ case ESCAPE: case ' ': case KC_ENTER: { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_wiz_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Make the player powerful */ case 'A': { do_cmd_wiz_advance(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { wiz_create_item(); break; } /* Create an artifact */ case 'C': { if (p_ptr->command_arg > 0) { wiz_create_artifact(p_ptr->command_arg); } else { char name[80] = ""; int a_idx = -1; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Create which artifact? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if an a_idx was entered */ a_idx = get_idx_from_name(name); /* If not, find the artifact with that name */ if (a_idx < 1) a_idx = lookup_artifact_name(name); /* Did we find a valid artifact? */ if (a_idx != -1) wiz_create_artifact(a_idx); else msg("No artifact found."); } /* Reload the screen */ screen_load(); } break; } /* Detect everything */ case 'd': { detect_all(TRUE); break; } /* Test for disconnected dungeon */ case 'D': { disconnect_stats(); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } case 'f': { stats_collect(); break; } /* Good Objects */ case 'g': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, FALSE); break; } /* GF demo */ case 'G': { wiz_gf_demo(); break; } /* Hitpoint rerating */ case 'h': { do_cmd_rerate(); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Learn about objects */ case 'l': { do_cmd_wiz_learn(); break; } case 'L': do_cmd_keylog(); break; /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Summon which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); p_ptr->redraw |= (PR_MAP | PR_MONLIST); /* Reload the screen */ screen_load(); } } if (r_idx > 0) do_cmd_wiz_named(r_idx, TRUE); else msg("No monster found."); break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Monster pit stats */ case 'P': { pit_stats(); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Get full recall for a monster */ case 'r': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { struct keypress sym; const char *prompt = "Full recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 1; i < z_info->r_max; i++) { r_ptr = &r_info[i]; cheat_monster_lore(r_ptr, &l_list[i]); } break; } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); } /* Reload the screen */ screen_load(); } else { /* Assume user aborts */ break; } } /* Did we find a valid monster? */ if (r_idx > 0) { r_ptr = &r_info[r_idx]; cheat_monster_lore(r_ptr, &l_list[r_idx]); } else msg("No monster found."); break; } /* Summon Random Monster(s) */ case 's': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; } /* Collect stats (S) */ case 'S': { stats_collect(); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Create a trap */ case 'T': { if (cave->feat[p_ptr->py][p_ptr->px] != FEAT_FLOOR) msg("You can't place a trap there!"); else if (p_ptr->depth == 0) msg("You can't place a trap in the town!"); else cave_set_feat(cave, p_ptr->py, p_ptr->px, FEAT_INVIS); break; } /* Un-hide all monsters */ case 'u': { detect_monsters_entire_level(); break; } /* Very Good Objects */ case 'v': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, TRUE); break; } case 'V': { wiz_test_kind(p_ptr->command_arg); break; } /* Wizard Light the Level */ case 'w': { wiz_light(TRUE); break; } /* Wipe recall for a monster */ case 'W': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { struct keypress sym; const char *prompt = "Wipe recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 1; i < z_info->r_max; i++) { r_ptr = &r_info[i]; wipe_monster_lore(r_ptr, &l_list[i]); } break; } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); } /* Reload the screen */ screen_load(); } else { /* Assume user aborts */ break; } } /* Did we find a valid monster? */ if (r_idx > 0) { r_ptr = &r_info[r_idx]; wipe_monster_lore(r_ptr, &l_list[r_idx]); } else msg("No monster found."); break; } /* Increase Experience */ case 'x': { if (p_ptr->command_arg) { player_exp_gain(p_ptr, p_ptr->command_arg); } else { player_exp_gain(p_ptr, p_ptr->exp + 1); } break; } /* Zap Monsters (Banishment) */ case 'z': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = MAX_SIGHT; do_cmd_wiz_zap(p_ptr->command_arg); break; } /* Hack */ case '_': { do_cmd_wiz_hack_ben(); break; } /* Oops */ default: { msg("That is not a valid debug command."); break; } } }
/* * Ask for and parse a "debug command" * * The "p_ptr->command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; char cmd; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd) { /* Ignore */ case ESCAPE: case ' ': case '\n': case '\r': { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { wiz_create_item(); break; } /* Create an artifact */ case 'C': { wiz_create_artifact(p_ptr->command_arg); break; } /* Detect everything */ case 'd': { detect_all(); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } /* View item info */ case 'f': { (void)identify_fully(); break; } /* Good Objects */ case 'g': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, FALSE); break; } /* Hitpoint rerating */ case 'h': { do_cmd_rerate(); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Self-Knowledge */ case 'k': { self_knowledge(); break; } /* Learn about objects */ case 'l': { do_cmd_wiz_learn(); break; } /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { do_cmd_wiz_named(p_ptr->command_arg, TRUE); break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Summon Random Monster(s) */ case 's': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Un-hide all monsters */ case 'u': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 255; do_cmd_wiz_unhide(p_ptr->command_arg); break; } /* Very Good Objects */ case 'v': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, TRUE); break; } /* Wizard Light the Level */ case 'w': { wiz_lite(); break; } /* Increase Experience */ case 'x': { if (p_ptr->command_arg) { gain_exp(p_ptr->command_arg); } else { gain_exp(p_ptr->exp + 1); } break; } /* Zap Monsters (Genocide) */ case 'z': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = MAX_SIGHT; do_cmd_wiz_zap(p_ptr->command_arg); break; } /* Oops */ default: { msg_print("That is not a valid debug command."); break; } } }
/*! * @brief デバッグコマンドを選択する処理のメインルーチン / * Ask for and parse a "debug command" * The "command_arg" may have been set. * @return なし */ void do_cmd_debug(void) { int x, y, i; char cmd; /* Get a "debug command" */ get_com("Debug Command: ", &cmd, FALSE); /* Analyze the command */ switch (cmd) { /* Nothing */ case ESCAPE: case ' ': case '\n': case '\r': break; #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': do_cmd_spoilers(); break; #endif /* ALLOW_SPOILERS */ /* Hack -- Help */ case '?': do_cmd_help(); break; /* Cure all maladies */ case 'a': do_cmd_wiz_cure_all(); break; /* Know alignment */ case 'A': msg_format("Your alignment is %d.", p_ptr->align); break; /* Teleport to target */ case 'b': do_cmd_wiz_bamf(); break; case 'B': battle_monsters(); break; /* Create any object */ case 'c': wiz_create_item(); break; /* Create a named artifact */ case 'C': wiz_create_named_art(); break; /* Detect everything */ case 'd': detect_all(DETECT_RAD_ALL * 3); break; /* Dimension_door */ case 'D': wiz_dimension_door(); break; /* Edit character */ case 'e': do_cmd_wiz_change(); break; /* Blue Mage Only */ case 'E': if (p_ptr->pclass == CLASS_BLUE_MAGE) { do_cmd_wiz_blue_mage(); } break; /* View item info */ case 'f': identify_fully(FALSE); break; /* Create desired feature */ case 'F': do_cmd_wiz_create_feature(); break; /* Good Objects */ case 'g': if (command_arg <= 0) command_arg = 1; acquirement(p_ptr->y, p_ptr->x, command_arg, FALSE, FALSE, TRUE); break; /* Hitpoint rerating */ case 'h': do_cmd_rerate(TRUE); break; #ifdef MONSTER_HORDES case 'H': do_cmd_summon_horde(); break; #endif /* MONSTER_HORDES */ /* Identify */ case 'i': (void)ident_spell(FALSE); break; /* Go up or down in the dungeon */ case 'j': do_cmd_wiz_jump(); break; /* Self-Knowledge */ case 'k': self_knowledge(); break; /* Learn about objects */ case 'l': do_cmd_wiz_learn(); break; /* Magic Mapping */ case 'm': map_area(DETECT_RAD_ALL * 3); break; /* Mutation */ case 'M': (void)gain_random_mutation(command_arg); break; /* Reset Class */ case 'R': (void)do_cmd_wiz_reset_class(); break; /* Specific reward */ case 'r': (void)gain_level_reward(command_arg); break; /* Summon _friendly_ named monster */ case 'N': do_cmd_wiz_named_friendly(command_arg); break; /* Summon Named Monster */ case 'n': do_cmd_wiz_named(command_arg); break; /* Dump option bits usage */ case 'O': do_cmd_dump_options(); break; /* Object playing routines */ case 'o': do_cmd_wiz_play(); break; /* Phase Door */ case 'p': teleport_player(10, 0L); break; /* Complete a Quest -KMW- */ case 'q': if(p_ptr->inside_quest) { if (quest[p_ptr->inside_quest].status == QUEST_STATUS_TAKEN) { complete_quest(p_ptr->inside_quest); break; } } else { msg_print("No current quest"); msg_print(NULL); } break; /* Make every dungeon square "known" to test streamers -KMW- */ case 'u': for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { cave[y][x].info |= (CAVE_GLOW | CAVE_MARK); } } wiz_lite(FALSE); break; /* Summon Random Monster(s) */ case 's': if (command_arg <= 0) command_arg = 1; do_cmd_wiz_summon(command_arg); break; /* Special(Random Artifact) Objects */ case 'S': if (command_arg <= 0) command_arg = 1; acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, TRUE, TRUE); break; /* Teleport */ case 't': teleport_player(100, 0L); break; /* Very Good Objects */ case 'v': if (command_arg <= 0) command_arg = 1; acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, FALSE, TRUE); break; /* Wizard Light the Level */ case 'w': wiz_lite((bool)(p_ptr->pclass == CLASS_NINJA)); break; /* Increase Experience */ case 'x': gain_exp(command_arg ? command_arg : (p_ptr->exp + 1)); break; /* Zap Monsters (Genocide) */ case 'z': do_cmd_wiz_zap(); break; /* Zap Monsters (Omnicide) */ case 'Z': do_cmd_wiz_zap_all(); break; /* Hack -- whatever I desire */ case '_': do_cmd_wiz_hack_ben(); break; /* Not a Wizard Command */ default: msg_print("That is not a valid debug command."); break; } }
/* * Activate a wielded object. Wielded objects never stack. * And even if they did, activatable objects never stack. * * Currently, only (some) artifacts, and Dragon Scale Mail, can be activated. * But one could, for example, easily make an activatable "Ring of Plasma". * * Note that it always takes a turn to activate an artifact, even if * the user hits "escape" at the "direction" prompt. */ static bool activate_object(object_type *o_ptr, bool *ident) { int k, dir, i, chance, rod; char o_name[80]; /* Get the basic name of the object */ rod = object_desc(o_name, sizeof(o_name), o_ptr, FALSE, 0, PAD_IMEN); /* Check the recharge */ if (o_ptr->timeout) { msg_format("Он%s светится и затухает...", (rod == ROD_M ? "" : rod == ROD_F ? "а" : rod == ROD_N ? "о" : "и")); return FALSE; } /* Activate the artifact */ message(MSG_ZAP, 0, "Вы активируете его..."); /* Artifacts */ if (o_ptr->name1) { artifact_type *a_ptr = &a_info[o_ptr->name1]; switch (a_ptr->activation) { case ACT_ILLUMINATION: { msg_format("%s озаряется чистым светом...", o_name); lite_area(damroll(2, 15), 3); break; } case ACT_MAGIC_MAP: { msg_format("%s ярко сверкает...", o_name); map_area(); break; } case ACT_CLAIRVOYANCE: { msg_format("%s светится глубоким зеленым...", o_name); wiz_lite(); (void)detect_traps(); (void)detect_doors(); (void)detect_stairs(); break; } case ACT_PROT_EVIL: { msg_format("%s издает протяжный стон...", o_name); k = 3 * p_ptr->lev; (void)set_protevil(p_ptr->protevil + randint(25) + k); break; } case ACT_DISP_EVIL: { msg_format("%s заполняет подземелье добром...", o_name); dispel_evil(p_ptr->lev * 5); break; } case ACT_HASTE2: { msg_format("%s ярко светится...", o_name); if (!p_ptr->fast) { (void)set_fast(randint(75) + 75); } else { (void)set_fast(p_ptr->fast + 5); } break; } case ACT_FIRE3: { msg_format("%s светится глубоким красным...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_FIRE, dir, 120, 3); break; } case ACT_FROST5: { msg_format("%s светится ярко-белым...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 200, 3); break; } case ACT_ELEC2: { msg_format("%s светится глубоким синим...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_ELEC, dir, 250, 3); break; } case ACT_BIZZARE: { msg_format("%s светится черным...", o_name); if (!get_aim_dir(&dir)) return FALSE; ring_of_power(dir); break; } case ACT_STAR_BALL: { msg_format("%s окружается молнией...", o_name); for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], 150, 3); break; } case ACT_RAGE_BLESS_RESIST: { msg_format("%s светится всеми цветами...", o_name); (void)hp_player(30); (void)set_afraid(0); (void)set_shero(p_ptr->shero + randint(50) + 50); (void)set_blessed(p_ptr->blessed + randint(50) + 50); (void)set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50); (void)set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50); (void)set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50); (void)set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50); (void)set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50); break; } case ACT_HEAL2: { msg_format("%s светится ярким белым...", o_name); msg_print("Вы чувствуете себя намного лучше..."); (void)hp_player(1000); (void)set_cut(0); break; } case ACT_PHASE: { msg_format("%s искривляет пространство вокруг вас...", o_name); teleport_player(10); break; } case ACT_BANISHMENT: { msg_format("%s светится угрожающим синим...", o_name); if (!banishment()) return FALSE; break; } case ACT_TRAP_DOOR_DEST: { msg_format("%s светится ярко-красным...", o_name); destroy_doors_touch(); break; } case ACT_DETECT: { msg_format("%s светится лучистым белым...", o_name); msg_print("Изображение формируется в вашей голове..."); detect_all(); break; } case ACT_HEAL1: { msg_format("%s светится спокойным синим...", o_name); msg_print("Вы чувствуете теплое покалывание..."); (void)hp_player(500); (void)set_cut(0); break; } case ACT_RESIST: { msg_format("%s светится цветами радуги...", o_name); (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); break; } case ACT_SLEEP: { msg_format("%s светится ярко-синим...", o_name); sleep_monsters_touch(); break; } case ACT_RECHARGE1: { msg_format("%s светится ярко-желтым...", o_name); recharge(60); break; } case ACT_TELEPORT: { msg_format("%s распрямляет пространство вокруг вас...", o_name); teleport_player(100); break; } case ACT_RESTORE_LIFE: { msg_format("%s светится спокойным красным...", o_name); restore_level(); break; } case ACT_MISSILE: { msg_format("%s ярко горит...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_MISSILE, dir, damroll(2, 6)); break; } case ACT_FIRE1: { msg_format("%s покрывается пламенем...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_FIRE, dir, damroll(9, 8)); break; } case ACT_FROST1: { msg_format("%s излучает холод...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_COLD, dir, damroll(6, 8)); break; } case ACT_LIGHTNING_BOLT: { msg_format("%s сыплет искрамиs...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ELEC, dir, damroll(4, 8)); break; } case ACT_ACID1: { msg_format("%s покрывается кислотой...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ACID, dir, damroll(5, 8)); break; } case ACT_ARROW: { msg_format("%s покрывается шипами...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_ARROW, dir, 150); break; } case ACT_HASTE1: { msg_format("%s светится ярко-зеленым...", o_name); if (!p_ptr->fast) { (void)set_fast(randint(20) + 20); } else { (void)set_fast(p_ptr->fast + 5); } break; } case ACT_REM_FEAR_POIS: { msg_format("%s вспыхивает синим...", o_name); (void)set_afraid(0); (void)set_poisoned(0); break; } case ACT_STINKING_CLOUD: { msg_format("%s светится ядовито-зеленым...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_POIS, dir, 12, 3); break; } case ACT_FROST2: { msg_format("%s покрывается инеем...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 48, 2); break; } case ACT_FROST4: { msg_format("%s горит бледно-синим...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_COLD, dir, damroll(12, 8)); break; } case ACT_FROST3: { msg_format("%s светится насыщенным синим...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 100, 2); break; } case ACT_FIRE2: { msg_format("%s пылает огнем...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_FIRE, dir, 72, 2); break; } case ACT_DRAIN_LIFE2: { msg_format("%s светится черным...", o_name); if (!get_aim_dir(&dir)) return FALSE; drain_life(dir, 120); break; } case ACT_STONE_TO_MUD: { msg_format("%s пульсирует...", o_name); if (!get_aim_dir(&dir)) return FALSE; wall_to_mud(dir); break; } case ACT_MASS_BANISHMENT: { msg_format("%s издает протяжную ноту...", o_name); (void)mass_banishment(); break; } case ACT_CURE_WOUNDS: { msg_format("%s светится глубоким фиолетовым...", o_name); hp_player(damroll(4, 8)); (void)set_cut((p_ptr->cut / 2) - 50); break; } case ACT_TELE_AWAY: { msg_format("%s вспыхивает глубоким красным...", o_name); if (!get_aim_dir(&dir)) return FALSE; teleport_monster(dir); break; } case ACT_WOR: { msg_format("%s светится мягким белым...", o_name); set_recall(); break; } case ACT_CONFUSE: { msg_format("%s светится странными цветами...", o_name); if (!get_aim_dir(&dir)) return FALSE; confuse_monster(dir, 20); break; } case ACT_IDENTIFY: { msg_format("%s вспыхивает желтым...", o_name); if (!ident_spell()) return FALSE; break; } case ACT_PROBE: { msg_format("%s ярко загорается...", o_name); probing(); break; } case ACT_DRAIN_LIFE1: { msg_format("%s горит белым...", o_name); if (!get_aim_dir(&dir)) return FALSE; drain_life(dir, 90); break; } case ACT_FIREBRAND: { msg_format("%s светится огненно-красным...", o_name); (void)brand_bolts(); break; } case ACT_STARLIGHT: { msg_format("%s вспыхивает светом тысячи звезд...", o_name); for (k = 0; k < 8; k++) strong_lite_line(ddd[k]); break; } case ACT_MANA_BOLT: { msg_format("%s светится белым...", o_name); if (!get_aim_dir(&dir)) return FALSE; fire_bolt(GF_MANA, dir, damroll(12, 8)); break; } case ACT_BERSERKER: { msg_format("%s горит яростью...", o_name); set_shero(p_ptr->shero + randint(50) + 50); break; } } /* Set the recharge time */ if (a_ptr->randtime) o_ptr->timeout = a_ptr->time + (byte)randint(a_ptr->randtime); else o_ptr->timeout = a_ptr->time; /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); /* Done */ return FALSE; } /* Hack -- Dragon Scale Mail can be activated as well */ if (o_ptr->tval == TV_DRAG_ARMOR) { /* Get a direction for breathing (or abort) */ if (!get_aim_dir(&dir)) return FALSE; /* Branch on the sub-type */ switch (o_ptr->sval) { case SV_DRAGON_BLUE: { msg_print("Вы дышите молнией."); fire_ball(GF_ELEC, dir, 100, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_WHITE: { msg_print("Вы дышите холодом."); fire_ball(GF_COLD, dir, 110, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_BLACK: { msg_print("Вы дышите кислотой."); fire_ball(GF_ACID, dir, 130, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_GREEN: { msg_print("Вы дышите ядовитым газом."); fire_ball(GF_POIS, dir, 150, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_RED: { msg_print("Вы дышите огнем."); fire_ball(GF_FIRE, dir, 200, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_MULTIHUED: { chance = rand_int(5); msg_format("Вы дышите %s.", ((chance == 1) ? "молнией" : ((chance == 2) ? "холодом" : ((chance == 3) ? "кислотой" : ((chance == 4) ? "ядовитым газом" : "огнем"))))); fire_ball(((chance == 1) ? GF_ELEC : ((chance == 2) ? GF_COLD : ((chance == 3) ? GF_ACID : ((chance == 4) ? GF_POIS : GF_FIRE)))), dir, 250, 2); o_ptr->timeout = rand_int(225) + 225; break; } case SV_DRAGON_BRONZE: { msg_print("Вы дышите контузией."); fire_ball(GF_CONFUSION, dir, 120, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_GOLD: { msg_print("Вы дышите звуком."); fire_ball(GF_SOUND, dir, 130, 2); o_ptr->timeout = rand_int(450) + 450; break; } case SV_DRAGON_CHAOS: { chance = rand_int(2); msg_format("Вы дышите %s.", ((chance == 1 ? "хаосом" : "антимагией"))); fire_ball((chance == 1 ? GF_CHAOS : GF_DISENCHANT), dir, 220, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_LAW: { chance = rand_int(2); msg_format("Вы дышите %s.", ((chance == 1 ? "звуком" : "осколками"))); fire_ball((chance == 1 ? GF_SOUND : GF_SHARD), dir, 230, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_BALANCE: { chance = rand_int(4); msg_format("Вы дышите %s.", ((chance == 1) ? "хаосом" : ((chance == 2) ? "антимагией" : ((chance == 3) ? "звуком" : "осколками")))); fire_ball(((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISENCHANT : ((chance == 3) ? GF_SOUND : GF_SHARD))), dir, 250, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_SHINING: { chance = rand_int(2); msg_format("Вы дышите %s.", ((chance == 0 ? "светом" : "темнотой"))); fire_ball((chance == 0 ? GF_LITE : GF_DARK), dir, 200, 2); o_ptr->timeout = rand_int(300) + 300; break; } case SV_DRAGON_POWER: { msg_print("Вы дышите элементами."); fire_ball(GF_MISSILE, dir, 300, 2); o_ptr->timeout = rand_int(300) + 300; break; } } /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); /* Success */ return FALSE; } /* Hack -- some Rings can be activated for double resist and element ball */ if (o_ptr->tval == TV_RING) { /* Get a direction for firing (or abort) */ if (!get_aim_dir(&dir)) return FALSE; /* Branch on the sub-type */ switch (o_ptr->sval) { case SV_RING_ACID: { fire_ball(GF_ACID, dir, 70, 2); set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_FLAMES: { fire_ball(GF_FIRE, dir, 80, 2); set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_ICE: { fire_ball(GF_COLD, dir, 75, 2); set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } case SV_RING_LIGHTNING: { fire_ball(GF_ELEC, dir, 85, 2); set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; break; } } /* Window stuff */ p_ptr->window |= (PW_EQUIP); /* Success */ return FALSE; } /* Mistake */ msg_print("Oops. That object cannot be activated."); /* Not used up */ return (FALSE); }
/* * do_cmd_mind calls this function if the player's class * is 'explorer'. */ static bool cast_explorer_spell(int spell) { /* this will vary based on the spells, and what they depend on */ int b = 0; int plev = p_ptr->lev; int px = p_ptr->px; int py = p_ptr->py; /* spell code */ switch (spell) { case 0: lite_room (py, px); break; case 1: if (plev > 44) wiz_lite(); else if (plev > 19) map_area(); if (plev < 30) { b = detect_monsters_normal(); if (plev > 14) b |= detect_monsters_invis(); if (plev > 4) { b |= detect_traps(); b |= detect_doors(); } } else { b = detect_all(); } if (plev > 24) { (void)set_tim_esp(p_ptr->tim_esp + plev); } if (!b) msg_print("You feel safe."); break; case 2: teleport_player(plev); break; case 3: (void)set_food(PY_FOOD_MAX - 1); break; case 4: ident_spell(); break; case 5: set_recall(); break; case 6: (void)recharge(30); break; case 7: alchemy(); break; case 8: { int time = randint(plev) + plev; (void)set_oppose_acid(p_ptr->oppose_acid + time); (void)set_oppose_elec(p_ptr->oppose_elec + time); (void)set_oppose_fire(p_ptr->oppose_fire + time); (void)set_oppose_cold(p_ptr->oppose_cold + time); (void)set_oppose_pois(p_ptr->oppose_pois + time); break; } case 9: break; case 10: break; case 11: break; case 12: break; case 13: break; case 14: break; case 15: break; case 16: break; case 17: break; case 18: break; case 19: break; case 20: break; } return TRUE; }
/* * Ask for and parse a "debug command" * * The "p_ptr->command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; char cmd; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd) { /* Ignore */ case ESCAPE: case ' ': case '\n': case '\r': { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_wiz_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { wiz_create_item(); break; } /* Create an artifact */ case 'C': { if (p_ptr->command_arg > 0) { wiz_create_artifact(p_ptr->command_arg); } else { char name[80] = ""; int a_idx = -1; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Create which artifact? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if an a_idx was entered */ a_idx = get_idx_from_name(name); /* If not, find the artifact with that name */ if (a_idx < 1) a_idx = lookup_artifact_name(name); /* Did we find a valid artifact? */ if (a_idx != -1) wiz_create_artifact(a_idx); } /* Reload the screen */ screen_load(); } break; } /* Detect everything */ case 'd': { detect_all(TRUE); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } case 'f': { stats_collect(); break; } /* Good Objects */ case 'g': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, FALSE); break; } /* Hitpoint rerating */ case 'h': { do_cmd_rerate(); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Learn about objects */ case 'l': { do_cmd_wiz_learn(); break; } /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { if (p_ptr->command_arg > 0) { do_cmd_wiz_named(p_ptr->command_arg, TRUE); } else { char name[80] = ""; s16b r_idx; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Summon which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); /* Did we find a valid monster? */ if (r_idx != -1) do_cmd_wiz_named(r_idx, TRUE); } p_ptr->redraw |= (PR_MAP | PR_MONLIST); /* Reload the screen */ screen_load(); } break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Summon Random Monster(s) */ case 's': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Create a trap */ case 'T': { cave_set_feat(p_ptr->py, p_ptr->px, FEAT_INVIS); break; } /* Un-hide all monsters */ case 'u': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 255; do_cmd_wiz_unhide(p_ptr->command_arg); break; } /* Very Good Objects */ case 'v': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, TRUE); break; } case 'V': { wiz_test_kind(p_ptr->command_arg); break; } /* Wizard Light the Level */ case 'w': { wiz_light(); break; } /* Increase Experience */ case 'x': { if (p_ptr->command_arg) { gain_exp(p_ptr->command_arg); } else { gain_exp(p_ptr->exp + 1); } break; } /* Zap Monsters (Banishment) */ case 'z': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = MAX_SIGHT; do_cmd_wiz_zap(p_ptr->command_arg); break; } /* Hack */ case '_': { do_cmd_wiz_hack_ben(); break; } /* Oops */ default: { msg_print("That is not a valid debug command."); break; } } }
/* * Ask for and parse a "debug command" * * The "p_ptr->command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; char cmd; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd) { /* Ignore */ case ESCAPE: case ' ': case '\n': case '\r': { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; wiz_create_item(p_ptr->command_arg); break; } /* Create an artefact */ case 'C': { char prompt[80]; char buf[80]; sprintf(prompt, "%s", "Index: "); sprintf(buf, "%d", 0); if(term_get_string(prompt, buf, 0)) wiz_create_artefact( atoi(buf) ); break; } /* Detect everything */ case 'd': { detect_all_doors_traps(); detect_all(); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } /* Forget items and map and monster memory */ case 'f': { do_cmd_wiz_forget(); break; } /* Good Objects */ case 'g': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, FALSE); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Self-Knowledge */ case 'k': { self_knowledge(); break; } /* Wizard Look */ case 'l': { do_cmd_wiz_look(); break; } /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { char prompt[80]; char buf[80]; sprintf(prompt, "%s", "Index: "); sprintf(buf, "%d", 0); if(term_get_string(prompt, buf, 0)) do_cmd_wiz_named(atoi(buf), TRUE); break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Debug Options */ case 'O': { screen_save(); do_cmd_options_aux(6, "Debug Options"); screen_load(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Summon Random Monster(s) */ case 's': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Un-hide all monsters */ case 'u': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 255; do_cmd_wiz_unhide(p_ptr->command_arg); break; } /* Very Good Objects */ case 'v': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, TRUE); break; } /* Wizard Light the Level */ case 'w': { wiz_light(); break; } /* Increase Experience */ case 'x': { if (p_ptr->command_arg) { gain_exp(p_ptr->command_arg); } else { gain_exp(p_ptr->exp); } break; } /* Zap Monsters (Banishment) */ case 'z': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = MAX_SIGHT; do_cmd_wiz_zap(p_ptr->command_arg); break; } /* Oops */ default: { msg_print("That is not a valid debug command."); break; } } }
/* * Generates a random dungeon level -RAK- * * Hack -- regenerate any "overflow" levels */ void generate_cave(void) { int num; /* Fill the arrays of floors and walls in the good proportions */ set_floor_and_wall(dungeon_type); /* Generate */ for (num = 0; TRUE; num++) { bool okay = TRUE; cptr why = NULL; clear_cave(); /* Build the arena -KMW- */ if (p_ptr->inside_arena) { arena_gen(); } /* Build the battle -KMW- */ else if (p_ptr->inside_battle) { battle_gen(); } /* Enter a special quest level from the wilderness (QUEST_ENTER(id)) */ else if (enter_quest) { quests_generate(enter_quest); enter_quest = 0; } /* Build the town */ else if (!dun_level) { /* Make the wilderness */ if (p_ptr->wild_mode) wilderness_gen_small(); else wilderness_gen(); } /* Build a real level, possibly a quest level. * The quest level might want to generate itself * or it might simply need to 'place quest monsters' */ else { quest_ptr q; quests_on_generate(dungeon_type, dun_level); q = quests_get_current(); if (q && (q->flags & QF_GENERATE)) quest_generate(q); else { okay = level_gen(&why); if (okay && q) okay = quest_post_generate(q); } } if (o_max >= max_o_idx) { why = "too many objects"; okay = FALSE; } else if (m_max >= max_m_idx) { why = "too many monsters"; okay = FALSE; } if (okay) break; if (why) msg_format("Generation restarted (%s)", why); wipe_o_list(); wipe_m_list(); } glow_deep_lava_and_bldg(); p_ptr->enter_dungeon = FALSE; wipe_generate_cave_flags(); #if 0 wiz_lite(FALSE); detect_all(255); if (1) { int i, ct = 0; char buf[MAX_NLEN]; for (i = 0; i < max_o_idx; i++) { if (!o_list[i].k_idx) continue; ct++; identify_item(&o_list[i]); o_list[i].ident |= IDENT_MENTAL; if (o_list[i].name1 || o_list[i].name2) { object_desc(buf, &o_list[i], 0); msg_print(buf); } } msg_format("Objects=%d", ct); } { int i; int lvl = 0, ct = 0, uniques = 0, ct_drops = 0; for (i = 1; i < max_m_idx; i++) { monster_type *m_ptr = &m_list[i]; monster_race *r_ptr; if (!m_ptr->r_idx) continue; r_ptr = real_r_ptr(m_ptr); ct++; ct_drops += m_ptr->drop_ct; lvl += r_ptr->level; if (r_ptr->flags1 & RF1_UNIQUE) uniques++; } msg_format("DL=%d, Monsters=%d, Drops=%d, <ML>= %d, Uniques=%d", dun_level, ct, ct_drops, lvl/MAX(ct, 1), uniques); for (i = 0; i < ct_drops; i++) { object_type forge; char buf[MAX_NLEN]; make_object(&forge, 0); /* TODO: DROP_GOOD? */ /*if (forge.name1 || forge.name2)*/ if (forge.curse_flags) { identify_item(&forge); forge.ident |= IDENT_MENTAL; object_desc(buf, &forge, 0); msg_print(buf); } } } #endif }
void _precognition_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Precognition"); break; case SPELL_DESC: { if (p_ptr->lev < 5) var_set_string(res, "Detects visible monsters in your vicinity."); else if (p_ptr->lev < 15) var_set_string(res, "Detects visible monsters, traps, and doors in your vicinity."); else if (p_ptr->lev < 20) var_set_string(res, "Detects monsters, traps, and doors in your vicinity."); else if (p_ptr->lev < 25) var_set_string(res, "Detects monsters, traps, and doors in your vicinity and maps nearby area."); else if (p_ptr->lev < 30) var_set_string(res, "Detects monsters, traps, and doors in your vicinity and maps nearby area. Grants temporary ESP."); else if (p_ptr->lev < 40) var_set_string(res, "Detects monsters, traps, doors, stairs and objects in your vicinity and maps nearby area. Grants temporary ESP."); else if (p_ptr->lev < 45) var_set_string(res, "Detects monsters, traps, doors, stairs and objects in your vicinity and maps nearby area."); else var_set_string(res, "Detects monsters, traps, doors, stairs and objects in your vicinity and maps the entire level."); break; } case SPELL_SPOIL_DESC: var_set_string(res, "Detects monsters (L1), traps and doors (L5), invisible monsters (L15) and items (L30). Gives magic mapping (L20) and telepathy (L25). Enlightens level (L45)."); break; case SPELL_CAST: { int b = 0; if (p_ptr->lev > 44) { virtue_add(VIRTUE_KNOWLEDGE, 1); virtue_add(VIRTUE_ENLIGHTENMENT, 1); wiz_lite(p_ptr->tim_superstealth > 0); } else if (p_ptr->lev > 19) map_area(DETECT_RAD_MAP); if (p_ptr->lev < 30) { b = detect_monsters_normal(DETECT_RAD_DEFAULT); if (p_ptr->lev > 14) b |= detect_monsters_invis(DETECT_RAD_DEFAULT); if (p_ptr->lev > 4) { b |= detect_traps(DETECT_RAD_DEFAULT, TRUE); b |= detect_doors(DETECT_RAD_DEFAULT); } } else { b = detect_all(DETECT_RAD_DEFAULT); } if ((p_ptr->lev > 24) && (p_ptr->lev < 40)) set_tim_esp(p_ptr->lev + randint1(p_ptr->lev), FALSE); if (!b) msg_print("You feel safe."); var_set_bool(res, TRUE); break; } case SPELL_COST_EXTRA: { int n = 0; if (p_ptr->lev >= 45) n += 9; else if (p_ptr->lev >= 30) n += 4; else if (p_ptr->lev >= 25) n += 3; else if (p_ptr->lev >= 20) n += 1; else if (p_ptr->lev >= 15) n += 0; else if (p_ptr->lev >= 5) n += 0; var_set_int(res, n); break; } default: default_spell(cmd, res); break; } }
/* * Ask for and parse a "debug command" * The "command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; int x, y; char cmd; /* Get a "debug command" */ (void)get_com("Debug Command: ", &cmd); /* Analyze the command */ switch (cmd) { /* Nothing */ case ESCAPE: case ' ': case '\n': case '\r': break; #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': do_cmd_spoilers(); break; #endif /* ALLOW_SPOILERS */ #ifdef MATLAB case '=': output_monster_matlab(); break; #endif /* MATLAB */ /* Hack -- Help */ case '?': screen_save(); (void)show_file("wizard.txt", NULL, 0 , 0); screen_load(); break; /* Cure all maladies */ case 'a': do_cmd_wiz_cure_all(); break; /* Know alignment */ case 'A': msg_format("Your alignment is %d.", p_ptr->align); break; /* Teleport to target */ case 'b': do_cmd_wiz_bamf(); break; /* Create any object */ case 'c': wiz_create_item(); break; /* Create a named artifact */ case 'C': /* wiz_create_named_art(p_ptr->command_arg);*/ break; /* Detect everything */ case 'd': (void)detect_all(); break; /* Edit character */ case 'e': do_cmd_wiz_change(); break; /* View item info */ case 'f': (void)identify_fully(); break; /* Create feature */ case 'F': if (p_ptr->command_arg > 0) do_cmd_wiz_feature(p_ptr->command_arg); break; /* Good Objects */ case 'g': if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, FALSE, TRUE); break; /* Hitpoint rerating */ case 'h': do_cmd_rerate(); break; #ifdef MONSTER_HORDES case 'H': do_cmd_summon_horde(); break; #endif /* MONSTER_HORDES */ /* Identify */ case 'i': (void)ident_spell(); break; /* Fields Integrity */ case 'I': (void)test_field_data_integrity(); break; /* Go up or down in the dungeon */ case 'j': do_cmd_wiz_jump(); break; /* Test compression code */ case 'J': /* test_compress_module(); */ break; /* Self-Knowledge */ case 'k': self_knowledge(); break; /* Learn about objects */ case 'l': do_cmd_wiz_learn(); break; /* Lose Mutation */ case 'L': (void)lose_mutation(p_ptr->command_arg); break; /* Magic Mapping */ case 'm': map_area(); break; /* Gain Mutation */ case 'M': (void)gain_mutation(p_ptr->command_arg); break; /* Specific reward */ case 'r': (void)gain_level_reward(p_ptr->command_arg); break; /* Summon _friendly_ named monster */ case 'N': do_cmd_wiz_named_friendly(p_ptr->command_arg, TRUE); break; /* Summon Named Monster */ case 'n': do_cmd_wiz_named(p_ptr->command_arg, TRUE); break; /* Object playing routines */ case 'o': do_cmd_wiz_play(); break; /* Phase Door */ case 'p': teleport_player(10); break; #if 0 /* Complete a Quest -KMW- */ case 'q': { for (i = 0; i < max_quests; i++) { if (p_ptr->quest[i].status == QUEST_STATUS_TAKEN) { p_ptr->quest[i].status++; msg_print("Completed Quest"); msg_print(NULL); break; } } if (i == max_quests) { msg_print("No current quest"); msg_print(NULL); } break; } #endif /* Make every dungeon square "known" to test streamers -KMW- */ case 'u': { for (y = min_hgt; y < max_hgt; y++) { for (x = min_wid; x < max_wid; x++) { area(y, x)->info |= (CAVE_GLOW | CAVE_MARK); } } wiz_lite(); break; } /* Summon Random Monster(s) */ case 's': if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; /* Teleport */ case 't': teleport_player(100); break; /* Very Good Objects */ case 'v': if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->command_arg, TRUE, TRUE); break; /* Wizard Light the Level */ case 'w': if (p_ptr->depth) { wiz_lite(); } else { learn_map(); } break; case 'W': test_decision_tree(); break; /* Increase Experience */ case 'x': if (p_ptr->command_arg) { gain_exp(p_ptr->command_arg); } else { gain_exp(p_ptr->exp + 1); } break; /* Zap Monsters (Genocide) */ case 'z': do_cmd_wiz_zap(); break; case 'Z': do_cmd_wiz_zap_all(); break; /* Hack -- whatever I desire */ case '_': do_cmd_wiz_hack_ben(); break; #ifdef USE_SCRIPT /* Hack -- activate a script */ case '@': do_cmd_wiz_script(); break; #endif /* USE_SCRIPT */ /* Not a Wizard Command */ default: msg_print("That is not a valid debug command."); break; } }
/* * do_cmd_mind calls this function if the player's class * is 'Medium'. */ static bool cast_medium_spell(int spell) { /* this will vary based on the spells, and what they depend on */ int b = 0; int dir; int plev = p_ptr->lev; /* spell code */ switch (spell) { case 0: /* Mindblast */ if (!get_aim_dir(&dir)) return FALSE; if (randint(100) < plev * 2) (void)fire_bolt_or_beam(100, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15))); else (void)fire_ball(GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0); break; case 1: if (plev > 44) wiz_lite(); else if (plev > 19) map_area(); if (plev < 30) { b = detect_monsters_normal(); if (plev > 14) b |= detect_monsters_invis(); if (plev > 4) { b |= detect_traps(); b |= detect_doors(); } } else { b = detect_all(); } if (plev > 24) { (void)set_tim_esp(p_ptr->tim_esp + plev); } if (!b) msg_print("You feel safe."); break; case 2: /* Minor displace */ teleport_player(plev); break; case 3: /* Major displace */ teleport_player(plev * 5); break; case 4: /* Psychic Disturbance */ msg_print("You disturb specters from beyond the veil!"); (void)project(-1, 2 + plev / 8, p_ptr->py, p_ptr->px, damroll((plev / 2), plev), GF_CONFUSION, PROJECT_KILL); break; case 5: /* spirit blast --- not 'true' TK */ if (!get_aim_dir(&dir)) return FALSE; (void)fire_ball(GF_SOUND, dir, damroll(8 + ((plev - 5) / 4), 8), (plev > 20 ? (plev - 20) / 8 + 1 : 0)); break; case 6: /* Character Armour */ (void)set_shield(p_ptr->shield + plev); if (plev > 14) (void)set_oppose_acid(p_ptr->oppose_acid + plev); if (plev > 19) (void)set_oppose_fire(p_ptr->oppose_fire + plev); if (plev > 24) (void)set_oppose_cold(p_ptr->oppose_cold + plev); if (plev > 29) (void)set_oppose_elec(p_ptr->oppose_elec + plev); if (plev > 34) (void)set_oppose_pois(p_ptr->oppose_pois + plev); break; case 7: ident_spell(); break; case 8: if (!get_aim_dir(&dir)) return FALSE; (void)fire_bolt(GF_DOMINATION, dir, damroll((plev / 2), (3 + plev / 3))); break; case 9: /* Soul Purge */ msg_print("The anguish of the dead emanates from your brain!"); (void)project(-1, 2 + plev / 10, p_ptr->py, p_ptr->px, damroll(plev, 4), GF_PSI, PROJECT_KILL); break; case 10: /* Adrenaline */ (void)set_afraid(0); (void)set_stun(0); /* * Only heal when Adrenalin Channeling is not active. We check * that by checking if the player isn't fast and 'heroed' atm. */ if (!p_ptr->fast || !(p_ptr->hero || p_ptr->shero)) { (void)hp_player(plev); } b = 10 + randint((plev * 3) / 2); if (plev < 35) (void)set_hero(p_ptr->hero + b); else (void)set_shero(p_ptr->shero + b); if (!p_ptr->fast) { /* Haste */ (void)set_fast(b); } else { (void)set_fast(p_ptr->fast + b); } break; case 11: /* Psychic Drain Turned into MEGA-STUN*/ if (!get_aim_dir(&dir)) return FALSE; b = damroll(plev * 2, 3); /* This is always a radius-0 ball now */ if (fire_ball(GF_STUN, dir, b, 0)) p_ptr->energy -= randint(150); break; case 12: /* Entropic Blast */ msg_print ("A wave of pure entropic force blasts out from your spirit!"); (void)project(-1, 3 + plev / 10, p_ptr->py, p_ptr->px, plev * (plev > 39 ? 4 : 3), GF_FORCE, PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID); break; default: msg_print("Unknown Mindcrafter power!"); } return TRUE; }
static bool cast_priest_spell(int spell, int dir) { int py = p_ptr->py; int px = p_ptr->px; int plev = p_ptr->lev; int amt; switch (spell) { case PRAYER_DETECT_EVIL: { (void)detect_monsters_evil(TRUE); break; } case PRAYER_CURE_LIGHT_WOUNDS: { (void)heal_player(15, 15); (void)dec_timed(TMD_CUT, 20, TRUE); (void)dec_timed(TMD_CONFUSED, 20, TRUE); (void)clear_timed(TMD_BLIND, TRUE); break; } case PRAYER_BLESS: { (void)inc_timed(TMD_BLESSED, randint1(12) + 12, TRUE); break; } case PRAYER_REMOVE_FEAR: { (void)clear_timed(TMD_AFRAID, TRUE); break; } case PRAYER_CALL_LIGHT: { (void)light_area(damroll(2, (plev / 2)), (plev / 10) + 1); break; } case PRAYER_FIND_TRAPS_DOORS: { (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); break; } case PRAYER_SLOW_POISON: { (void)set_timed(TMD_POISONED, p_ptr->timed[TMD_POISONED] / 2, TRUE); break; } case PRAYER_SCARE_MONSTER: { (void)fear_monster(dir, plev, TRUE); break; } case PRAYER_PORTAL: { teleport_player(plev * 3); break; } case PRAYER_CURE_SERIOUS_WOUNDS: { (void)heal_player(20, 25); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); break; } case PRAYER_CHANT: { (void)inc_timed(TMD_BLESSED, randint1(24) + 24, TRUE); break; } case PRAYER_SANCTUARY: { (void)sleep_monsters_touch(TRUE); break; } case PRAYER_SATISFY_HUNGER: { (void)set_food(PY_FOOD_MAX - 1); break; } case PRAYER_REMOVE_CURSE: { remove_curse(); break; } case PRAYER_RESIST_HEAT_COLD: { (void)inc_timed(TMD_OPP_FIRE, randint1(10) + 10, TRUE); (void)inc_timed(TMD_OPP_COLD, randint1(10) + 10, TRUE); break; } case PRAYER_NEUTRALIZE_POISON: { (void)clear_timed(TMD_POISONED, TRUE); break; } case PRAYER_ORB_OF_DRAINING: { fire_ball(GF_HOLY_ORB, dir, (damroll(3, 6) + plev + (plev / (player_has(PF_BLESS_WEAPON) ? 2 : 4))), ((plev < 30) ? 2 : 3)); break; } case PRAYER_CURE_CRITICAL_WOUNDS: { (void)heal_player(25, 30); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_AMNESIA, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_STUN, TRUE); break; } case PRAYER_SENSE_INVISIBLE: { (void)inc_timed(TMD_SINVIS, randint1(24) + 24, TRUE); break; } case PRAYER_PROTECTION_FROM_EVIL: { (void)inc_timed(TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE); break; } case PRAYER_EARTHQUAKE: { earthquake(py, px, 10); break; } case PRAYER_SENSE_SURROUNDINGS: { map_area(); break; } case PRAYER_CURE_MORTAL_WOUNDS: { (void)heal_player(30, 50); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_AMNESIA, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_STUN, TRUE); break; } case PRAYER_TURN_UNDEAD: { (void)turn_undead(TRUE); break; } case PRAYER_PRAYER: { (void)inc_timed(TMD_BLESSED, randint1(48) + 48, TRUE); break; } case PRAYER_DISPEL_UNDEAD: { (void)dispel_undead(randint1(plev * 3)); break; } case PRAYER_HEAL: { amt = (p_ptr->mhp * 35) / 100; if (amt < 300) amt = 300; (void)hp_player(amt); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_AMNESIA, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_STUN, TRUE); break; } case PRAYER_DISPEL_EVIL: { (void)dispel_evil(randint1(plev * 3)); break; } case PRAYER_GLYPH_OF_WARDING: { warding_glyph(); break; } case PRAYER_HOLY_WORD: { (void)dispel_evil(randint1(plev * 4)); (void)hp_player(1000); (void)clear_timed(TMD_AFRAID, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_STUN, TRUE); (void)clear_timed(TMD_CUT, TRUE); break; } case PRAYER_DETECT_MONSTERS: { (void)detect_monsters_normal(TRUE); break; } case PRAYER_DETECTION: { (void)detect_all(TRUE); break; } case PRAYER_PERCEPTION: { return ident_spell(); } case PRAYER_PROBING: { (void)probing(); break; } case PRAYER_CLAIRVOYANCE: { wiz_light(); break; } case PRAYER_CURE_SERIOUS_WOUNDS2: { (void)heal_player(20, 25); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); break; } case PRAYER_CURE_MORTAL_WOUNDS2: { (void)heal_player(30, 50); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_AMNESIA, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_STUN, TRUE); break; } case PRAYER_HEALING: { (void)hp_player(2000); (void)clear_timed(TMD_STUN, TRUE); (void)clear_timed(TMD_CUT, TRUE); break; } case PRAYER_RESTORATION: { (void)do_res_stat(A_STR); (void)do_res_stat(A_INT); (void)do_res_stat(A_WIS); (void)do_res_stat(A_DEX); (void)do_res_stat(A_CON); (void)do_res_stat(A_CHR); break; } case PRAYER_REMEMBRANCE: { (void)restore_level(); break; } case PRAYER_DISPEL_UNDEAD2: { (void)dispel_undead(randint1(plev * 4)); break; } case PRAYER_DISPEL_EVIL2: { (void)dispel_evil(randint1(plev * 4)); break; } case PRAYER_BANISH_EVIL: { if (banish_evil(100)) { msg("The power of your god banishes evil!"); } break; } case PRAYER_WORD_OF_DESTRUCTION: { destroy_area(py, px, 15, TRUE); break; } case PRAYER_ANNIHILATION: { drain_life(dir, 200); break; } case PRAYER_UNBARRING_WAYS: { (void)destroy_doors_touch(); break; } case PRAYER_RECHARGING: { return recharge(15); } case PRAYER_DISPEL_CURSE: { (void)remove_all_curse(); break; } case PRAYER_ENCHANT_WEAPON: { return enchant_spell(randint0(4) + 1, randint0(4) + 1, 0); } case PRAYER_ENCHANT_ARMOUR: { return enchant_spell(0, 0, randint0(3) + 2); } case PRAYER_ELEMENTAL_BRAND: { brand_weapon(); break; } case PRAYER_BLINK: { teleport_player(10); break; } case PRAYER_TELEPORT_SELF: { teleport_player(plev * 8); break; } case PRAYER_TELEPORT_OTHER: { (void)teleport_monster(dir); break; } case PRAYER_TELEPORT_LEVEL: { (void)teleport_player_level(); break; } case PRAYER_WORD_OF_RECALL: { set_recall(); break; } case PRAYER_ALTER_REALITY: { msg("The world changes!"); /* Leaving */ p_ptr->leaving = TRUE; break; } } /* Success */ return (TRUE); }
static bool zap_rod(object_type *o_ptr, bool *ident) { int chance, dir, lev; bool used_charge = TRUE; object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Get a direction (unless KNOWN not to need it) */ if ((o_ptr->sval >= SV_ROD_MIN_DIRECTION) || !object_aware_p(o_ptr)) { /* Get a direction, allow cancel */ if (!get_aim_dir(&dir)) return FALSE; } /* Take a turn */ p_ptr->energy_use = 100; /* Not identified yet */ *ident = FALSE; /* Extract the item level */ lev = k_info[o_ptr->k_idx].level; /* Base chance of success */ chance = p_ptr->skill_dev; /* Confusion hurts skill */ if (p_ptr->confused) chance = chance / 2; /* High level objects are harder */ chance = chance - ((lev > 50) ? 50 : lev); /* Give everyone a (slight) chance */ if ((chance < USE_DEVICE) && (rand_int(USE_DEVICE - chance + 1) == 0)) { chance = USE_DEVICE; } /* Roll for usage */ if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) { if (flush_failure) flush(); msg_print("Вы не смогли использовать жезл."); return FALSE; } /* Still charging? */ if (o_ptr->timeout > (o_ptr->pval - k_ptr->pval)) { if (flush_failure) flush(); if (o_ptr->number == 1) msg_print("Жезл все еще заряжается."); else msg_print("Все жезлы все еще заряжаются."); return FALSE; } /* Sound */ sound(MSG_ZAP); /* Analyze the rod */ switch (o_ptr->sval) { case SV_ROD_DETECT_TRAP: { if (detect_traps()) *ident = TRUE; break; } case SV_ROD_DETECT_DOOR: { if (detect_doors()) *ident = TRUE; if (detect_stairs()) *ident = TRUE; break; } case SV_ROD_IDENTIFY: { *ident = TRUE; if (ident_spell()) used_charge = FALSE; break; } case SV_ROD_RECALL: { set_recall(); *ident = TRUE; break; } case SV_ROD_ILLUMINATION: { if (lite_area(damroll(2, 8), 2)) *ident = TRUE; break; } case SV_ROD_MAPPING: { map_area(); *ident = TRUE; break; } case SV_ROD_DETECTION: { detect_all(); *ident = TRUE; break; } case SV_ROD_PROBING: { probing(); *ident = TRUE; break; } case SV_ROD_CURING: { if (set_blind(0)) *ident = TRUE; if (set_poisoned(0)) *ident = TRUE; if (set_confused(0)) *ident = TRUE; if (set_stun(0)) *ident = TRUE; if (set_cut(0)) *ident = TRUE; break; } case SV_ROD_HEALING: { if (hp_player(500)) *ident = TRUE; if (set_stun(0)) *ident = TRUE; if (set_cut(0)) *ident = TRUE; break; } case SV_ROD_RESTORATION: { if (restore_level()) *ident = TRUE; if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; break; } case SV_ROD_SPEED: { if (!p_ptr->fast) { if (set_fast(randint(30) + 15)) *ident = TRUE; } else { (void)set_fast(p_ptr->fast + 5); } break; } case SV_ROD_TELEPORT_AWAY: { if (teleport_monster(dir)) *ident = TRUE; break; } case SV_ROD_DISARMING: { if (disarm_trap(dir)) *ident = TRUE; break; } case SV_ROD_LITE: { msg_print("Появляется коридор синего мерцающего света."); lite_line(dir); *ident = TRUE; break; } case SV_ROD_SLEEP_MONSTER: { if (sleep_monster(dir)) *ident = TRUE; break; } case SV_ROD_SLOW_MONSTER: { if (slow_monster(dir)) *ident = TRUE; break; } case SV_ROD_DRAIN_LIFE: { if (drain_life(dir, 150)) *ident = TRUE; break; } case SV_ROD_POLYMORPH: { if (poly_monster(dir)) *ident = TRUE; break; } case SV_ROD_ACID_BOLT: { fire_bolt_or_beam(10, GF_ACID, dir, damroll(12, 8)); *ident = TRUE; break; } case SV_ROD_ELEC_BOLT: { fire_bolt_or_beam(10, GF_ELEC, dir, damroll(6, 6)); *ident = TRUE; break; } case SV_ROD_FIRE_BOLT: { fire_bolt_or_beam(10, GF_FIRE, dir, damroll(16, 8)); *ident = TRUE; break; } case SV_ROD_COLD_BOLT: { fire_bolt_or_beam(10, GF_COLD, dir, damroll(10, 8)); *ident = TRUE; break; } case SV_ROD_ACID_BALL: { fire_ball(GF_ACID, dir, 120, 2); *ident = TRUE; break; } case SV_ROD_ELEC_BALL: { fire_ball(GF_ELEC, dir, 64, 2); *ident = TRUE; break; } case SV_ROD_FIRE_BALL: { fire_ball(GF_FIRE, dir, 144, 2); *ident = TRUE; break; } case SV_ROD_COLD_BALL: { fire_ball(GF_COLD, dir, 96, 2); *ident = TRUE; break; } } /* Drain the charge */ if (used_charge) o_ptr->timeout += k_ptr->pval; return TRUE; }