X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=5708c21eab462565078cf566017ccb84d3f93873;hb=8620c39af3503155b45750511c88d1a4569e7c1f;hp=b614987d76fbedfdee17a5c7a0741d3c8b038811;hpb=f3282d01b23eac85b49bab357ceba3a0b2f708e0;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index b614987d7..5708c21ea 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -119,13 +119,8 @@ bool teleport_away(MONSTER_IDX m_idx, POSITION dis, BIT_FLAGS mode) /* Forget the counter target */ reset_target(m_ptr); - /* Update the monster (new location) */ update_monster(m_idx, TRUE); - - /* Redraw the old grid */ lite_spot(oy, ox); - - /* Redraw the new grid */ lite_spot(ny, nx); if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) @@ -224,13 +219,8 @@ void teleport_monster_to(MONSTER_IDX m_idx, POSITION ty, POSITION tx, int power, m_ptr->fy = ny; m_ptr->fx = nx; - /* Update the monster (new location) */ update_monster(m_idx, TRUE); - - /* Redraw the old grid */ lite_spot(oy, ox); - - /* Redraw the new grid */ lite_spot(ny, nx); if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) @@ -833,7 +823,7 @@ DUNGEON_IDX choose_dungeon(cptr note, POSITION y, POSITION x) * @param turns 発動までのターン数 * @return 常にTRUEを返す */ -bool recall_player(TIME_EFFECT turns) +bool recall_player(player_type *creature_ptr, TIME_EFFECT turns) { /* * TODO: Recall the player to the last @@ -841,13 +831,13 @@ bool recall_player(TIME_EFFECT turns) */ /* Ironman option */ - if (p_ptr->inside_arena || ironman_downward) + if (creature_ptr->inside_arena || ironman_downward) { msg_print(_("何も起こらなかった。", "Nothing happens.")); return TRUE; } - if (dun_level && (max_dlv[dungeon_type] > dun_level) && !p_ptr->inside_quest && !p_ptr->word_recall) + if (dun_level && (max_dlv[dungeon_type] > dun_level) && !creature_ptr->inside_quest && !creature_ptr->word_recall) { if (get_check(_("ここは最深到達階より浅い階です。この階に戻って来ますか? ", "Reset recall depth? "))) { @@ -857,37 +847,66 @@ bool recall_player(TIME_EFFECT turns) } } - if (!p_ptr->word_recall) + if (!creature_ptr->word_recall) { if (!dun_level) { DUNGEON_IDX select_dungeon; select_dungeon = choose_dungeon(_("に帰還", "recall"), 2, 14); if (!select_dungeon) return FALSE; - p_ptr->recall_dungeon = select_dungeon; + creature_ptr->recall_dungeon = select_dungeon; } - p_ptr->word_recall = turns; + creature_ptr->word_recall = turns; msg_print(_("回りの大気が張りつめてきた...", "The air about you becomes charged...")); - p_ptr->redraw |= (PR_STATUS); + creature_ptr->redraw |= (PR_STATUS); } else { - p_ptr->word_recall = 0; + creature_ptr->word_recall = 0; msg_print(_("張りつめた大気が流れ去った...", "A tension leaves the air around you...")); - p_ptr->redraw |= (PR_STATUS); + creature_ptr->redraw |= (PR_STATUS); } return TRUE; } -/*! - * @brief 帰還用メインルーチン - * @return 常にTRUEを返す - */ -bool word_of_recall(void) +bool free_level_recall(player_type *creature_ptr) { - return(recall_player(randint0(21) + 15)); + DUNGEON_IDX select_dungeon; + DEPTH max_depth; + QUANTITY amt; + + select_dungeon = choose_dungeon(_("にテレポート", "teleport"), 4, 0); + + if (!select_dungeon) return FALSE; + + max_depth = d_info[select_dungeon].maxdepth; + + /* Limit depth in Angband */ + if (select_dungeon == DUNGEON_ANGBAND) + { + if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98; + else if (quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99; + } + amt = get_quantity(format(_("%sの何階にテレポートしますか?", "Teleport to which level of %s? "), + d_name + d_info[select_dungeon].name), (QUANTITY)max_depth); + + if (amt > 0) + { + creature_ptr->word_recall = 1; + creature_ptr->recall_dungeon = select_dungeon; + max_dlv[creature_ptr->recall_dungeon] = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt)); + if (record_maxdepth) + do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower")); + + msg_print(_("回りの大気が張りつめてきた...", "The air about you becomes charged...")); + + creature_ptr->redraw |= (PR_STATUS); + return TRUE; + } + return FALSE; } + /*! * @brief フロア・リセット処理 * @return リセット処理が実際に行われたらTRUEを返す @@ -934,7 +953,7 @@ bool reset_recall(void) do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, _("フロア・リセットで", "using a scroll of reset recall")); /* Accept request */ #ifdef JP -msg_format("%sの帰還レベルを %d 階にセット。", d_name+d_info[select_dungeon].name, dummy, dummy * 50); + msg_format("%sの帰還レベルを %d 階にセット。", d_name+d_info[select_dungeon].name, dummy, dummy * 50); #else msg_format("Recall depth set to level %d (%d').", dummy, dummy * 50); #endif @@ -1047,8 +1066,6 @@ msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); chg_virtue(V_HARMONY, 1); chg_virtue(V_ENCHANT, -2); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); p_ptr->window |= (PW_EQUIP | PW_PLAYER); @@ -1212,20 +1229,8 @@ void brand_weapon(int brand_type) q = _("どの武器を強化しますか? ", "Enchant which weapon? "); s = _("強化できる武器がない。", "You have nothing to enchant."); - if (!get_item(&item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) return; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - + o_ptr = choose_object(&item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; /* you can never modify artifacts / ego-items */ /* you can never modify cursed items */ @@ -1653,8 +1658,8 @@ void fetch(DIRECTION dir, WEIGHT wgt, bool require_los) cave[p_ptr->y][p_ptr->x].o_idx = i; /* 'move' it */ o_ptr->next_o_idx = 0; - o_ptr->iy = (byte)p_ptr->y; - o_ptr->ix = (byte)p_ptr->x; + o_ptr->iy = p_ptr->y; + o_ptr->ix = p_ptr->x; object_desc(o_name, o_ptr, OD_NAME_ONLY); msg_format(_("%^sがあなたの足元に飛んできた。", "%^s flies through the air to your feet."), o_name); @@ -1920,20 +1925,8 @@ bool alchemy(void) q = _("どのアイテムを金に変えますか?", "Turn which item to gold? "); s = _("金に変えられる物がありません。", "You have nothing to turn to gold."); - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - + o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR)); + if (!o_ptr) return (FALSE); /* See how many items */ if (o_ptr->number > 1) @@ -1945,7 +1938,6 @@ bool alchemy(void) if (amt <= 0) return FALSE; } - old_number = o_ptr->number; o_ptr->number = amt; object_desc(o_name, o_ptr, 0); @@ -2062,7 +2054,6 @@ bool enchant(object_type *o_ptr, int n, int eflag) bool a = object_is_artifact(o_ptr); bool force = (eflag & ENCH_FORCE); - /* Large piles resist enchantment */ prob = o_ptr->number * 100; @@ -2138,12 +2129,8 @@ bool enchant(object_type *o_ptr, int n, int eflag) /* Failure */ if (!res) return (FALSE); - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - /* Combine / Reorder the pack (later) */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - + p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER); p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); calc_android_exp(); @@ -2181,19 +2168,8 @@ bool enchant_spell(HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) q = _("どのアイテムを強化しますか? ", "Enchant which item? "); s = _("強化できるアイテムがない。", "You have nothing to enchant."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return (FALSE); object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP @@ -2231,10 +2207,10 @@ bool enchant_spell(HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) bool artifact_scroll(void) { OBJECT_IDX item; - bool okay = FALSE; - object_type *o_ptr; + bool okay = FALSE; + object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + cptr q, s; /* Enchant weapon/armour */ item_tester_hook = item_tester_hook_nameless_weapon_armour; @@ -2242,18 +2218,8 @@ bool artifact_scroll(void) q = _("どのアイテムを強化しますか? ", "Enchant which item? "); s = _("強化できるアイテムがない。", "You have nothing to enchant."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return (FALSE); object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP @@ -2291,8 +2257,7 @@ bool artifact_scroll(void) #ifdef JP msg_format("%sは既に強化されています!", o_name ); #else - msg_format("The %s %s already %s!", - o_name, ((o_ptr->number > 1) ? "are" : "is"), + msg_format("The %s %s already %s!", o_name, ((o_ptr->number > 1) ? "are" : "is"), ((o_ptr->number > 1) ? "customized items" : "a customized item")); #endif } @@ -2301,21 +2266,20 @@ bool artifact_scroll(void) { if (o_ptr->number > 1) { + msg_print(_("複数のアイテムに魔法をかけるだけのエネルギーはありません!", "Not enough energy to enchant more than one object!")); #ifdef JP - msg_print("複数のアイテムに魔法をかけるだけのエネルギーはありません!"); msg_format("%d 個の%sが壊れた!",(o_ptr->number)-1, o_name); #else - msg_print("Not enough enough energy to enchant more than one object!"); msg_format("%d of your %s %s destroyed!",(o_ptr->number)-1, o_name, (o_ptr->number>2?"were":"was")); #endif if (item >= 0) { - inven_item_increase(item, 1-(o_ptr->number)); + inven_item_increase(item, 1 - (o_ptr->number)); } else { - floor_item_increase(0-item, 1-(o_ptr->number)); + floor_item_increase(0 - item, 1 - (o_ptr->number)); } } okay = create_artifact(o_ptr, TRUE); @@ -2374,12 +2338,7 @@ bool identify_item(object_type *o_ptr) /* Player touches it */ o_ptr->marked |= OM_TOUCHED; - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Combine / Reorder the pack (later) */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - + p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER); p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); strcpy(record_o_name, o_name); @@ -2433,19 +2392,8 @@ bool ident_spell(bool only_equip) s = _("鑑定するべきアイテムがない。", "You have nothing to identify."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return (FALSE); old_known = identify_item(o_ptr); @@ -2494,27 +2442,16 @@ bool mundane_spell(bool only_equip) q = _("どれを使いますか?", "Use which item? "); s = _("使えるものがありません。", "You have nothing you can use."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return (FALSE); msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!")); { POSITION iy = o_ptr->iy; /* Y-position on map, or zero */ POSITION ix = o_ptr->ix; /* X-position on map, or zero */ - s16b next_o_idx = o_ptr->next_o_idx; /* Next object in stack (if any) */ + OBJECT_IDX next_o_idx = o_ptr->next_o_idx; /* Next object in stack (if any) */ byte marked = o_ptr->marked; /* Object is marked */ - s16b weight = o_ptr->number * o_ptr->weight; + WEIGHT weight = o_ptr->number * o_ptr->weight; u16b inscription = o_ptr->inscription; /* Wipe it clean */ @@ -2571,19 +2508,8 @@ bool identify_fully(bool only_equip) s = _("*鑑定*するべきアイテムがない。", "You have nothing to *identify*."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return (FALSE); old_known = identify_item(o_ptr); @@ -2659,19 +2585,8 @@ bool recharge(int power) q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? "); s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge."); - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return (FALSE); - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR)); + if (!o_ptr) return (FALSE); /* Get the object kind. */ k_ptr = &k_info[o_ptr->k_idx]; @@ -2914,8 +2829,7 @@ bool recharge(int power) } /* Combine / Reorder the pack (later) */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - + p_ptr->update |= (PU_COMBINE | PU_REORDER); p_ptr->window |= (PW_INVEN); /* Something was done */ @@ -2942,24 +2856,10 @@ bool bless_weapon(void) q = _("どのアイテムを祝福しますか?", "Bless which weapon? "); s = _("祝福できる武器がありません。", "You have weapon to bless."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) - return FALSE; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return FALSE; object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - /* Extract the flags */ object_flags(o_ptr, flgs); if (object_is_cursed(o_ptr)) @@ -3009,8 +2909,7 @@ bool bless_weapon(void) if (have_flag(flgs, TR_BLESSED)) { #ifdef JP -msg_format("%s は既に祝福されている。", - o_name ); + msg_format("%s は既に祝福されている。", o_name); #else msg_format("%s %s %s blessed already.", ((item >= 0) ? "Your" : "The"), o_name, @@ -3070,22 +2969,17 @@ msg_format("%s は既に祝福されている。", msg_print(_("周囲が凡庸な雰囲気で満ちた...", "There is a static feeling in the air...")); #ifdef JP -msg_format("%s は劣化した!", - o_name ); + msg_format("%s は劣化した!", o_name); #else - msg_format("%s %s %s disenchanted!", - ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "were" : "was")); + msg_format("%s %s %s disenchanted!", ((item >= 0) ? "Your" : "The"), o_name, + ((o_ptr->number > 1) ? "were" : "was")); #endif } } - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - p_ptr->window |= (PW_EQUIP | PW_PLAYER); - calc_android_exp(); return TRUE; @@ -3111,24 +3005,10 @@ bool pulish_shield(void) q = _("どの盾を磨きますか?", "Pulish which weapon? "); s = _("磨く盾がありません。", "You have weapon to pulish."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) - return FALSE; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return FALSE; object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - /* Extract the flags */ object_flags(o_ptr, flgs); if (o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && @@ -3990,7 +3870,7 @@ bool rustproof(void) OBJECT_IDX item; object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + cptr q, s; /* Select a piece of armour */ item_tester_hook = object_is_armour; @@ -3998,19 +3878,8 @@ bool rustproof(void) q = _("どの防具に錆止めをしますか?", "Rustproof which piece of armour? "); s = _("錆止めできるものがありません。", "You have nothing to rustproof."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return FALSE; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return FALSE; object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); @@ -4097,8 +3966,6 @@ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返し /* Break it */ o_ptr->ident |= (IDENT_BROKEN); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ @@ -4163,8 +4030,6 @@ bool curse_weapon_object(bool force, object_type *o_ptr) /* Break it */ o_ptr->ident |= (IDENT_BROKEN); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ @@ -4242,7 +4107,7 @@ bool brand_bolts(void) * @details * Note that this function is one of the more "dangerous" ones... */ -static IDX poly_r_idx(MONRACE_IDX r_idx) +static MONRACE_IDX poly_r_idx(MONRACE_IDX r_idx) { monster_race *r_ptr = &r_info[r_idx]; @@ -4483,16 +4348,8 @@ bool eat_magic(int power) q = _("どのアイテムから魔力を吸収しますか?", "Drain which item? "); s = _("魔力を吸収できるアイテムがありません。", "You have nothing to drain."); - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE; - - if (item >= 0) - { - o_ptr = &inventory[item]; - } - else - { - o_ptr = &o_list[0 - item]; - } + o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR)); + if (!o_ptr) return FALSE; k_ptr = &k_info[o_ptr->k_idx]; lev = k_info[o_ptr->k_idx].level; @@ -4728,7 +4585,7 @@ bool eat_magic(int power) /* Redraw mana and hp */ p_ptr->redraw |= (PR_MANA); - p_ptr->notice |= (PN_COMBINE | PN_REORDER); + p_ptr->update |= (PU_COMBINE | PU_REORDER); p_ptr->window |= (PW_INVEN); return TRUE;