X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd-activate.c;h=e84a0031f3ef79ac6abe819f61dd01827eefae8a;hb=e4ff3bb031398f9c1ce37283c8b8b792bf5269cc;hp=707e12a01223171e7753d2ff31d60b34b07d43ac;hpb=e660c9c8e83cde2b3d646699fa9ac3f27d6dfe54;p=hengband%2Fhengband.git diff --git a/src/cmd-activate.c b/src/cmd-activate.c index 707e12a01..e84a0031f 100644 --- a/src/cmd-activate.c +++ b/src/cmd-activate.c @@ -7,18 +7,56 @@ */ #include "angband.h" +#include "util.h" + #include "cmd-activate.h" +#include "cmd-basic.h" +#include "floor.h" #include "object-hook.h" -#include "spells-summon.h" #include "sort.h" -#include "projection.h" #include "artifact.h" #include "avatar.h" +#include "spells.h" +#include "spells-summon.h" #include "spells-status.h" #include "spells-object.h" #include "spells-floor.h" +#include "player-effects.h" #include "realm-hex.h" #include "player-status.h" +#include "player-damage.h" +#include "monster-status.h" +#include "files.h" +#include "objectkind.h" +#include "object-ego.h" +#include "grid.h" +#include "targeting.h" +#include "realm-song.h" +#include "player-race.h" +#include "player-class.h" +#include "view-mainwindow.h" + +/*! + * @brief 装備耐性に準じたブレス効果の選択テーブル / + * Define flags, effect type, name for dragon breath activation + */ +const dragonbreath_type dragonbreath_info[] = { + { TR_RES_ACID, GF_ACID, _("酸", "acid") }, + { TR_RES_ELEC, GF_ELEC, _("電撃", "lightning") }, + { TR_RES_FIRE, GF_FIRE, _("火炎", "fire") }, + { TR_RES_COLD, GF_COLD, _("冷気", "cold") }, + { TR_RES_POIS, GF_POIS, _("毒", "poison") }, + { TR_RES_LITE, GF_LITE, _("閃光", "light") }, + { TR_RES_DARK, GF_DARK, _("暗黒", "dark") }, + { TR_RES_SHARDS, GF_SHARDS, _("破片", "shard") }, + { TR_RES_CONF, GF_CONFUSION, _("混乱", "confusion") }, + { TR_RES_SOUND, GF_SOUND, _("轟音", "sound") }, + { TR_RES_NEXUS, GF_NEXUS, _("因果混乱", "nexus") }, + { TR_RES_NETHER, GF_NETHER, _("地獄", "nether") }, + { TR_RES_CHAOS, GF_CHAOS, _("カオス", "chaos") }, + { TR_RES_DISEN, GF_DISENCHANT, _("劣化", "disenchant") }, + { 0, 0, NULL } +}; /*! * @brief アイテムの発動効果テーブル / @@ -294,45 +332,6 @@ const activation_type activation_info[] = }; /*! -* @brief ペット入りモンスターボールをソートするための比較関数 -* @param u 所持品配列の参照ポインタ -* @param v 未使用 -* @param a 所持品ID1 -* @param b 所持品ID2 -* @return 1の方が大であればTRUE -*/ -static bool ang_sort_comp_pet(vptr u, vptr v, int a, int b) -{ - u16b *who = (u16b*)(u); - - int w1 = who[a]; - int w2 = who[b]; - - monster_type *m_ptr1 = &m_list[w1]; - monster_type *m_ptr2 = &m_list[w2]; - monster_race *r_ptr1 = &r_info[m_ptr1->r_idx]; - monster_race *r_ptr2 = &r_info[m_ptr2->r_idx]; - - /* Unused */ - (void)v; - - if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE; - if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE; - - if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return TRUE; - if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return FALSE; - - if (r_ptr1->level > r_ptr2->level) return TRUE; - if (r_ptr2->level > r_ptr1->level) return FALSE; - - if (m_ptr1->hp > m_ptr2->hp) return TRUE; - if (m_ptr2->hp > m_ptr1->hp) return FALSE; - - return w1 <= w2; -} - - -/*! * @brief 装備を発動するコマンドのサブルーチン / * Activate a wielded object. Wielded objects never stack. * And even if they did, activatable objects never stack. @@ -342,11 +341,11 @@ static bool ang_sort_comp_pet(vptr u, vptr v, int a, int b) *
  * 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
+ * Note that it always takes a current_world_ptr->game_turn to activate an artifact, even if
  * the user hits "escape" at the "direction" prompt.
  * 
*/ -void do_cmd_activate_aux(INVENTORY_IDX item) +void exe_activate(player_type *user_ptr, INVENTORY_IDX item) { DIRECTION dir; DEPTH lev; @@ -354,22 +353,20 @@ void do_cmd_activate_aux(INVENTORY_IDX item) object_type *o_ptr; bool success; - /* Get the item (in the pack) */ if (item >= 0) { - o_ptr = &inventory[item]; + o_ptr = &user_ptr->inventory_list[item]; } /* Get the item (on the floor) */ else { - o_ptr = &o_list[0 - item]; + o_ptr = ¤t_floor_ptr->o_list[0 - item]; } - take_turn(p_ptr, 100); + take_turn(user_ptr, 100); - /* Extract the item level */ lev = k_info[o_ptr->k_idx].level; /* Hack -- use artifact level instead */ @@ -384,10 +381,10 @@ void do_cmd_activate_aux(INVENTORY_IDX item) else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) && o_ptr->name2) lev = e_info[o_ptr->name2].level; /* Base chance of success */ - chance = p_ptr->skill_dev; + chance = user_ptr->skill_dev; /* Confusion hurts skill */ - if (p_ptr->confused) chance = chance / 2; + if (user_ptr->confused) chance = chance / 2; fail = lev+5; if (chance > fail) fail -= (chance - fail)*2; @@ -395,9 +392,9 @@ void do_cmd_activate_aux(INVENTORY_IDX item) if (fail < USE_DEVICE) fail = USE_DEVICE; if (chance < USE_DEVICE) chance = USE_DEVICE; - if(cmd_limit_time_walk(p_ptr)) return; + if(cmd_limit_time_walk(user_ptr)) return; - if (p_ptr->pclass == CLASS_BERSERKER) success = FALSE; + if (user_ptr->pclass == CLASS_BERSERKER) success = FALSE; else if (chance > fail) { if (randint0(chance*2) < fail) success = FALSE; @@ -430,7 +427,7 @@ void do_cmd_activate_aux(INVENTORY_IDX item) ((o_ptr->sval == SV_LITE_TORCH) || (o_ptr->sval == SV_LITE_LANTERN))) { msg_print(_("燃料がない。", "It has no fuel.")); - free_turn(p_ptr); + free_turn(user_ptr); return; } @@ -444,7 +441,7 @@ void do_cmd_activate_aux(INVENTORY_IDX item) { (void)activate_artifact(o_ptr); - p_ptr->window |= (PW_INVEN | PW_EQUIP); + user_ptr->window |= (PW_INVEN | PW_EQUIP); /* Success */ return; @@ -453,40 +450,36 @@ void do_cmd_activate_aux(INVENTORY_IDX item) /* Special items */ else if (o_ptr->tval == TV_WHISTLE) { - if (music_singing_any()) stop_singing(p_ptr); + if (music_singing_any()) stop_singing(user_ptr); if (hex_spelling_any()) stop_hex_spell_all(); { - IDX pet_ctr, i; + MONSTER_IDX pet_ctr, i; MONSTER_IDX *who; int max_pet = 0; u16b dummy_why; /* Allocate the "who" array */ - C_MAKE(who, max_m_idx, MONSTER_IDX); + C_MAKE(who, current_floor_ptr->max_m_idx, MONSTER_IDX); /* Process the monsters (backwards) */ - for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--) + for (pet_ctr = current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--) { - if (is_pet(&m_list[pet_ctr]) && (p_ptr->riding != pet_ctr)) + if (is_pet(¤t_floor_ptr->m_list[pet_ctr]) && (user_ptr->riding != pet_ctr)) who[max_pet++] = pet_ctr; } - /* Select the sort method */ - ang_sort_comp = ang_sort_comp_pet; - ang_sort_swap = ang_sort_swap_hook; - - ang_sort(who, &dummy_why, max_pet); + ang_sort(who, &dummy_why, max_pet, ang_sort_comp_pet, ang_sort_swap_hook); /* Process the monsters (backwards) */ for (i = 0; i < max_pet; i++) { pet_ctr = who[i]; - teleport_monster_to(pet_ctr, p_ptr->y, p_ptr->x, 100, TELEPORT_PASSIVE); + teleport_monster_to(pet_ctr, user_ptr->y, user_ptr->x, 100, TELEPORT_PASSIVE); } /* Free the "who" array */ - C_KILL(who, max_m_idx, IDX); + C_KILL(who, current_floor_ptr->max_m_idx, MONSTER_IDX); } o_ptr->timeout = 100 + randint1(100); return; @@ -553,14 +546,14 @@ void do_cmd_activate_aux(INVENTORY_IDX item) { success = FALSE; if (!get_direction(&dir, FALSE, FALSE)) return; - if (monster_can_enter(p_ptr->y + ddy[dir], p_ptr->x + ddx[dir], &r_info[o_ptr->pval], 0)) + if (monster_can_enter(user_ptr->y + ddy[dir], user_ptr->x + ddx[dir], &r_info[o_ptr->pval], 0)) { - if (place_monster_aux(0, p_ptr->y + ddy[dir], p_ptr->x + ddx[dir], o_ptr->pval, (PM_FORCE_PET | PM_NO_KAGE))) + if (place_monster_aux(0, user_ptr->y + ddy[dir], user_ptr->x + ddx[dir], o_ptr->pval, (PM_FORCE_PET | PM_NO_KAGE))) { - if (o_ptr->xtra3) m_list[hack_m_idx_ii].mspeed = o_ptr->xtra3; - if (o_ptr->xtra5) m_list[hack_m_idx_ii].max_maxhp = o_ptr->xtra5; - if (o_ptr->xtra4) m_list[hack_m_idx_ii].hp = o_ptr->xtra4; - m_list[hack_m_idx_ii].maxhp = m_list[hack_m_idx_ii].max_maxhp; + if (o_ptr->xtra3) current_floor_ptr->m_list[hack_m_idx_ii].mspeed = o_ptr->xtra3; + if (o_ptr->xtra5) current_floor_ptr->m_list[hack_m_idx_ii].max_maxhp = o_ptr->xtra5; + if (o_ptr->xtra4) current_floor_ptr->m_list[hack_m_idx_ii].hp = o_ptr->xtra4; + current_floor_ptr->m_list[hack_m_idx_ii].maxhp = current_floor_ptr->m_list[hack_m_idx_ii].max_maxhp; if (o_ptr->inscription) { char buf[80]; @@ -602,7 +595,7 @@ void do_cmd_activate_aux(INVENTORY_IDX item) s--; #endif *s = '\0'; - m_list[hack_m_idx_ii].nickname = quark_add(buf); + current_floor_ptr->m_list[hack_m_idx_ii].nickname = quark_add(buf); t = quark_str(o_ptr->inscription); s = buf; while(*t && (*t != '#')) @@ -637,15 +630,15 @@ void do_cmd_activate_aux(INVENTORY_IDX item) * @brief 装備を発動するコマンドのメインルーチン / * @return なし */ -void do_cmd_activate(void) +void do_cmd_activate(player_type *user_ptr) { OBJECT_IDX item; concptr q, s; - if (p_ptr->wild_mode) return; - if (cmd_limit_arena(p_ptr)) return; + if (user_ptr->wild_mode) return; + if (cmd_limit_arena(user_ptr)) return; - if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN)) + if (user_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN)) { set_action(ACTION_NONE); } @@ -655,10 +648,10 @@ void do_cmd_activate(void) q = _("どのアイテムを始動させますか? ", "Activate which item? "); s = _("始動できるアイテムを装備していない。", "You have nothing to activate."); - if (!choose_object(&item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) return; + if (!choose_object(&item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT), 0)) return; /* Activate the item */ - do_cmd_activate_aux(item); + exe_activate(user_ptr, item); } /*! @@ -688,8 +681,6 @@ static bool activate_dragon_breath(object_type *o_ptr) n++; } } - - /* Paranoia */ if (n == 0) return FALSE; /* Stop speaking */ @@ -715,8 +706,6 @@ bool activate_artifact(object_type *o_ptr) DIRECTION dir; concptr name = k_name + k_info[o_ptr->k_idx].name; const activation_type* const act_ptr = find_activation_info(o_ptr); - - /* Paranoia */ if (!act_ptr) { /* Maybe forgot adding information to activation_info table ? */ msg_print("Activation information is not found."); @@ -892,7 +881,7 @@ bool activate_artifact(object_type *o_ptr) for (dummy = 0; dummy < 3; dummy++) { if (hypodynamic_bolt(dir, 50)) - hp_player(50); + hp_player(p_ptr, 50); } break; } @@ -917,7 +906,7 @@ bool activate_artifact(object_type *o_ptr) for (dummy = 0; dummy < 3; dummy++) { if (hypodynamic_bolt(dir, 100)) - hp_player(100); + hp_player(p_ptr, 100); } break; } @@ -1045,14 +1034,14 @@ bool activate_artifact(object_type *o_ptr) msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements.")); fire_breath(GF_MISSILE, dir, 300, 4); msg_print(_("鎧が様々な色に輝いた...", "Your armor glows many colours...")); - (void)set_afraid(0); - (void)set_hero(randint1(50) + 50, FALSE); - (void)hp_player(10); - (void)set_blessed(randint1(50) + 50, FALSE); - (void)set_oppose_acid(randint1(50) + 50, FALSE); - (void)set_oppose_elec(randint1(50) + 50, FALSE); - (void)set_oppose_fire(randint1(50) + 50, FALSE); - (void)set_oppose_cold(randint1(50) + 50, FALSE); + (void)set_afraid(p_ptr, 0); + (void)set_hero(p_ptr, randint1(50) + 50, FALSE); + (void)hp_player(p_ptr, 10); + (void)set_blessed(p_ptr, randint1(50) + 50, FALSE); + (void)set_oppose_acid(p_ptr, randint1(50) + 50, FALSE); + (void)set_oppose_elec(p_ptr, randint1(50) + 50, FALSE); + (void)set_oppose_fire(p_ptr, randint1(50) + 50, FALSE); + (void)set_oppose_cold(p_ptr, randint1(50) + 50, FALSE); (void)set_oppose_pois(randint1(50) + 50, FALSE); break; } @@ -1063,7 +1052,7 @@ bool activate_artifact(object_type *o_ptr) fire_breath(GF_FIRE, dir, 200, 2); if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES)) { - (void)set_oppose_fire(randint1(20) + 20, FALSE); + (void)set_oppose_fire(p_ptr, randint1(20) + 20, FALSE); } break; } @@ -1074,7 +1063,7 @@ bool activate_artifact(object_type *o_ptr) fire_breath(GF_COLD, dir, 200, 2); if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE)) { - (void)set_oppose_cold(randint1(20) + 20, FALSE); + (void)set_oppose_cold(p_ptr, randint1(20) + 20, FALSE); } break; } @@ -1103,7 +1092,7 @@ bool activate_artifact(object_type *o_ptr) case ACT_QUAKE: { - earthquake(p_ptr->y, p_ptr->x, 5); + earthquake(p_ptr->y, p_ptr->x, 5, 0); break; } @@ -1204,37 +1193,20 @@ bool activate_artifact(object_type *o_ptr) case ACT_SUMMON_ANIMAL: { - (void)summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'); + (void)summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET)); break; } case ACT_SUMMON_PHANTOM: { msg_print(_("幻霊を召喚した。", "You summon a phantasmal servant.")); - (void)summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'); + (void)summon_specific(-1, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET)); break; } case ACT_SUMMON_ELEMENTAL: - { - bool pet = one_in_(3); - BIT_FLAGS mode = 0L; - - if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP; - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), SUMMON_ELEMENTAL, mode, '\0')) - { - msg_print(_("エレメンタルが現れた...", "An elemental materializes...")); - if (pet) - msg_print(_("あなたに服従しているようだ。", "It seems obedient to you.")); - else - msg_print(_("それをコントロールできなかった!", "You fail to control it!")); - } - + if (!cast_summon_elemental(p_ptr, (plev * 3) / 2)) return FALSE; break; - } case ACT_SUMMON_DEMON: { @@ -1243,57 +1215,17 @@ bool activate_artifact(object_type *o_ptr) } case ACT_SUMMON_UNDEAD: - { - bool pet = one_in_(3); - int type; - BIT_FLAGS mode = 0L; - - type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD); - - if (!pet || ((plev > 24) && one_in_(3))) mode |= PM_ALLOW_GROUP; - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), type, mode, '\0')) - { - msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...", - "Cold winds begin to blow around you, carrying with them the stench of decay...")); - if (pet) - msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!", - "Ancient, long-dead forms arise from the ground to serve you!")); - else - msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!", - "'The dead arise... to punish you for disturbing them!'")); - } - + if (!cast_summon_undead(p_ptr, (plev * 3) / 2)) return FALSE; break; - } case ACT_SUMMON_HOUND: - { - BIT_FLAGS mode = PM_ALLOW_GROUP; - bool pet = !one_in_(5); - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((p_ptr->lev * 3) / 2), SUMMON_HOUND, mode, '\0')) - { - - if (pet) - msg_print(_("ハウンドがあなたの下僕として出現した。", - "A group of hounds appear as your servant.")); - else - msg_print(_("ハウンドはあなたに牙を向けている!", - "A group of hounds appear as your enemy!")); - } - + if (!cast_summon_hound(p_ptr, (plev * 3) / 2)) return FALSE; break; - } case ACT_SUMMON_DAWN: { msg_print(_("暁の師団を召喚した。", "You summon the Legion of the Dawn.")); - (void)summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, SUMMON_DAWN, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'); + (void)summon_specific(-1, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DAWN, (PM_ALLOW_GROUP | PM_FORCE_PET)); break; } @@ -1307,14 +1239,14 @@ bool activate_artifact(object_type *o_ptr) { msg_print(_("天国の歌が聞こえる...", "A heavenly choir sings...")); (void)cure_critical_wounds(777); - (void)set_hero(randint1(25) + 25, FALSE); + (void)set_hero(p_ptr, randint1(25) + 25, FALSE); break; } case ACT_CURE_LW: { - (void)set_afraid(0); - (void)hp_player(30); + (void)set_afraid(p_ptr, 0); + (void)hp_player(p_ptr, 30); break; } @@ -1328,8 +1260,8 @@ bool activate_artifact(object_type *o_ptr) case ACT_CURE_POISON: { msg_print(_("深青色に輝いている...", "It glows deep blue...")); - (void)set_afraid(0); - (void)set_poisoned(0); + (void)set_afraid(p_ptr, 0); + (void)set_poisoned(p_ptr, 0); break; } @@ -1396,17 +1328,17 @@ bool activate_artifact(object_type *o_ptr) { msg_format(_("%sから鋭い音が流れ出た...", "The %s lets out a shrill wail..."), name); k = 3 * p_ptr->lev; - (void)set_protevil(randint1(25) + k, FALSE); + (void)set_protevil(p_ptr, randint1(25) + k, FALSE); break; } case ACT_RESIST_ALL: { msg_print(_("様々な色に輝いている...", "It glows many colours...")); - (void)set_oppose_acid(randint1(40) + 40, FALSE); - (void)set_oppose_elec(randint1(40) + 40, FALSE); - (void)set_oppose_fire(randint1(40) + 40, FALSE); - (void)set_oppose_cold(randint1(40) + 40, FALSE); + (void)set_oppose_acid(p_ptr, randint1(40) + 40, FALSE); + (void)set_oppose_elec(p_ptr, randint1(40) + 40, FALSE); + (void)set_oppose_fire(p_ptr, randint1(40) + 40, FALSE); + (void)set_oppose_cold(p_ptr, randint1(40) + 40, FALSE); (void)set_oppose_pois(randint1(40) + 40, FALSE); break; } @@ -1414,14 +1346,14 @@ bool activate_artifact(object_type *o_ptr) case ACT_SPEED: { msg_print(_("明るく緑色に輝いている...", "It glows bright green...")); - (void)set_fast(randint1(20) + 20, FALSE); + (void)set_fast(p_ptr, randint1(20) + 20, FALSE); break; } case ACT_XTRA_SPEED: { msg_print(_("明るく輝いている...", "It glows brightly...")); - (void)set_fast(randint1(75) + 75, FALSE); + (void)set_fast(p_ptr, randint1(75) + 75, FALSE); break; } @@ -1433,7 +1365,7 @@ bool activate_artifact(object_type *o_ptr) case ACT_INVULN: { - (void)set_invuln(randint1(8) + 8, FALSE); + (void)set_invuln(p_ptr, randint1(8) + 8, FALSE); break; } @@ -1445,7 +1377,7 @@ bool activate_artifact(object_type *o_ptr) case ACT_HERO_SPEED: { - (void)set_fast(randint1(50) + 50, FALSE); + (void)set_fast(p_ptr, randint1(50) + 50, FALSE); (void)heroism(50); break; } @@ -1458,7 +1390,7 @@ bool activate_artifact(object_type *o_ptr) if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_ACID, dir, 100, 2); } - (void)set_oppose_acid(randint1(20) + 20, FALSE); + (void)set_oppose_acid(p_ptr, randint1(20) + 20, FALSE); break; } @@ -1470,7 +1402,7 @@ bool activate_artifact(object_type *o_ptr) if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_FIRE, dir, 100, 2); } - (void)set_oppose_fire(randint1(20) + 20, FALSE); + (void)set_oppose_fire(p_ptr, randint1(20) + 20, FALSE); break; } @@ -1482,7 +1414,7 @@ bool activate_artifact(object_type *o_ptr) if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_COLD, dir, 100, 2); } - (void)set_oppose_cold(randint1(20) + 20, FALSE); + (void)set_oppose_cold(p_ptr, randint1(20) + 20, FALSE); break; } @@ -1494,7 +1426,7 @@ bool activate_artifact(object_type *o_ptr) if (!get_aim_dir(&dir)) return FALSE; fire_ball(GF_ELEC, dir, 100, 2); } - (void)set_oppose_elec(randint1(20) + 20, FALSE); + (void)set_oppose_elec(p_ptr, randint1(20) + 20, FALSE); break; } @@ -1659,13 +1591,13 @@ bool activate_artifact(object_type *o_ptr) monster_race *r_ptr; msg_print(_("奇妙な場所が頭の中に浮かんだ...", "Some strange places show up in your mind. And you see ...")); /* Process the monsters (backwards) */ - for (i = m_max - 1; i >= 1; i--) + for (i = current_floor_ptr->m_max - 1; i >= 1; i--) { /* Access the monster */ - m_ptr = &m_list[i]; + m_ptr = ¤t_floor_ptr->m_list[i]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; r_ptr = &r_info[m_ptr->r_idx]; @@ -1694,8 +1626,6 @@ bool activate_artifact(object_type *o_ptr) if (get_check(_("この階を去りますか?", "Leave this level? "))) { if (autosave_l) do_cmd_save_game(TRUE); - - /* Leaving */ p_ptr->leaving = TRUE; } } @@ -1732,8 +1662,8 @@ bool activate_artifact(object_type *o_ptr) case ACT_SHIKOFUMI: { msg_print(_("力強く四股を踏んだ。", "You stamp. (as if you are in a ring.)")); - (void)set_afraid(0); - (void)set_hero(randint1(20) + 20, FALSE); + (void)set_afraid(p_ptr, 0); + (void)set_hero(p_ptr, randint1(20) + 20, FALSE); dispel_evil(p_ptr->lev * 3); break; } @@ -1754,66 +1684,22 @@ bool activate_artifact(object_type *o_ptr) case ACT_ULTIMATE_RESIST: { TIME_EFFECT v = randint1(25) + 25; - (void)set_afraid(0); - (void)set_hero(v, FALSE); - (void)hp_player(10); - (void)set_blessed(v, FALSE); - (void)set_oppose_acid(v, FALSE); - (void)set_oppose_elec(v, FALSE); - (void)set_oppose_fire(v, FALSE); - (void)set_oppose_cold(v, FALSE); + (void)set_afraid(p_ptr, 0); + (void)set_hero(p_ptr, v, FALSE); + (void)hp_player(p_ptr, 10); + (void)set_blessed(p_ptr, v, FALSE); + (void)set_oppose_acid(p_ptr, v, FALSE); + (void)set_oppose_elec(p_ptr, v, FALSE); + (void)set_oppose_fire(p_ptr, v, FALSE); + (void)set_oppose_cold(p_ptr, v, FALSE); (void)set_oppose_pois(v, FALSE); (void)set_ultimate_res(v, FALSE); break; } - - /* Unique activation */ case ACT_CAST_OFF: - { - INVENTORY_IDX inv; - int t; - OBJECT_IDX o_idx; - GAME_TEXT o_name[MAX_NLEN]; - object_type forge; - - /* Cast off activated item */ - for (inv = INVEN_RARM; inv <= INVEN_FEET; inv++) - { - if (o_ptr == &inventory[inv]) break; - } - - /* Paranoia */ - if (inv > INVEN_FEET) return FALSE; - - object_copy(&forge, o_ptr); - inven_item_increase(inv, (0 - o_ptr->number)); - inven_item_optimize(inv); - o_idx = drop_near(&forge, 0, p_ptr->y, p_ptr->x); - o_ptr = &o_list[o_idx]; - - object_desc(o_name, o_ptr, OD_NAME_ONLY); - msg_format(_("%sを脱ぎ捨てた。", "You cast off %s."), o_name); - - /* Get effects */ - msg_print(_("「燃え上がれ俺の小宇宙!」", "You say, 'Burn up my cosmo!")); - t = 20 + randint1(20); - (void)set_blind(p_ptr->blind + t); - (void)set_afraid(0); - (void)set_tim_esp(p_ptr->tim_esp + t, FALSE); - (void)set_tim_regen(p_ptr->tim_regen + t, FALSE); - (void)set_hero(p_ptr->hero + t, FALSE); - (void)set_blessed(p_ptr->blessed + t, FALSE); - (void)set_fast(p_ptr->fast + t, FALSE); - (void)set_shero(p_ptr->shero + t, FALSE); - if (p_ptr->pclass == CLASS_FORCETRAINER) - { - P_PTR_KI = plev * 5 + 190; - msg_print(_("気が爆発寸前になった。", "Your force are immediatly before explosion.")); - } - + cosmic_cast_off(p_ptr, o_ptr); break; - } case ACT_FALLING_STAR: { @@ -1843,7 +1729,7 @@ bool activate_artifact(object_type *o_ptr) msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name); take_hit(DAMAGE_LOSELIFE, damroll(3, 8), _("加速した疲労", "the strain of haste"), -1); t = 25 + randint1(25); - (void)set_fast(p_ptr->fast + t, FALSE); + (void)set_fast(p_ptr, p_ptr->fast + t, FALSE); break; } @@ -1927,38 +1813,3 @@ bool activate_artifact(object_type *o_ptr) return TRUE; } -/*! - * @brief 固定アーティファクト『ブラッディムーン』の特性を変更する。 - * @details スレイ2d2種、及びone_resistance()による耐性1d2種、pval2種を得る。 - * @param o_ptr 対象のオブジェクト構造体(ブラッディムーン)のポインタ - * @return なし - */ -void get_bloody_moon_flags(object_type *o_ptr) -{ - int dummy, i; - - for (i = 0; i < TR_FLAG_SIZE; i++) - o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i]; - - dummy = randint1(2) + randint1(2); - for (i = 0; i < dummy; i++) - { - int flag = randint0(26); - if (flag >= 20) add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20); - else if (flag == 19) add_flag(o_ptr->art_flags, TR_KILL_ANIMAL); - else if (flag == 18) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); - else add_flag(o_ptr->art_flags, TR_CHAOTIC + flag); - } - - dummy = randint1(2); - for (i = 0; i < dummy; i++) one_resistance(o_ptr); - - for (i = 0; i < 2; i++) - { - int tmp = randint0(11); - if (tmp < A_MAX) add_flag(o_ptr->art_flags, TR_STR + tmp); - else add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6); - } -} - -