X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=367d9c86a0599f457e3f60b350026b0add452921;hb=6dcf13dbf0a0bb994eb2566f5ed8e619875879db;hp=b614987d76fbedfdee17a5c7a0741d3c8b038811;hpb=f3282d01b23eac85b49bab357ceba3a0b2f708e0;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index b614987d7..367d9c86a 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -12,9 +12,14 @@ */ #include "angband.h" +#include "floor.h" #include "object-hook.h" #include "melee.h" #include "player-status.h" +#include "projection.h" +#include "spells-summon.h" +#include "quest.h" + /*! テレポート先探索の試行数 / Maximum number of tries for teleporting */ #define MAX_TRIES 100 @@ -119,13 +124,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 +224,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)) @@ -752,7 +747,7 @@ void teleport_level(MONSTER_IDX m_idx) * @param x コンソールX座標 * @return 選択されたダンジョンID */ -DUNGEON_IDX choose_dungeon(cptr note, POSITION y, POSITION x) +DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x) { DUNGEON_IDX select_dungeon; DUNGEON_IDX i; @@ -833,7 +828,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 +836,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 +852,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 +958,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 @@ -991,22 +1015,17 @@ bool apply_disenchant(BIT_FLAGS mode) return (FALSE); } - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - /* Artifacts have 71% chance to resist */ if (object_is_artifact(o_ptr) && (randint0(100) < 71)) { #ifdef JP -msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); + msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); #else - msg_format("Your %s (%c) resist%s disenchantment!", - o_name, index_to_label(t), - ((o_ptr->number != 1) ? "" : "s")); + msg_format("Your %s (%c) resist%s disenchantment!", o_name, index_to_label(t), + ((o_ptr->number != 1) ? "" : "s")); #endif - - return (TRUE); } @@ -1037,20 +1056,15 @@ msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); (to_a != o_ptr->to_a) || (pval != o_ptr->pval)) { #ifdef JP - msg_format("%s(%c)は劣化してしまった!", - o_name, index_to_label(t) ); + msg_format("%s(%c)は劣化してしまった!", o_name, index_to_label(t) ); #else - msg_format("Your %s (%c) %s disenchanted!", - o_name, index_to_label(t), - ((o_ptr->number != 1) ? "were" : "was")); + msg_format("Your %s (%c) %s disenchanted!", o_name, index_to_label(t), + ((o_ptr->number != 1) ? "were" : "was")); #endif chg_virtue(V_HARMONY, 1); chg_virtue(V_ENCHANT, -2); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - p_ptr->window |= (PW_EQUIP | PW_PLAYER); calc_android_exp(); @@ -1203,7 +1217,7 @@ void brand_weapon(int brand_type) { OBJECT_IDX item; object_type *o_ptr; - cptr q, s; + concptr q, s; /* Assume enchant weapon */ @@ -1212,20 +1226,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 */ @@ -1236,7 +1238,7 @@ void brand_weapon(int brand_type) !((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) && !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE))) { - cptr act = NULL; + concptr act = NULL; /* Let's get the name before it is changed... */ GAME_TEXT o_name[MAX_NLEN]; @@ -1653,8 +1655,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); @@ -1912,7 +1914,7 @@ bool alchemy(void) GAME_TEXT o_name[MAX_NLEN]; char out_val[MAX_NLEN+40]; - cptr q, s; + concptr q, s; /* Hack -- force destruction */ if (command_arg > 0) force = TRUE; @@ -1920,20 +1922,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 +1935,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); @@ -1986,12 +1975,8 @@ bool alchemy(void) msg_format(_("%sを$%d の金に変えた。", "You turn %s to %ld coins worth of gold."), o_name, price); p_ptr->au += price; - - /* Redraw gold */ p_ptr->redraw |= (PR_GOLD); - p_ptr->window |= (PW_PLAYER); - } /* Eliminate the item (from the pack) */ @@ -2062,7 +2047,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 +2122,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(); @@ -2170,7 +2150,7 @@ bool enchant_spell(HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) bool okay = FALSE; object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; /* Assume enchant weapon */ item_tester_hook = object_allow_enchant_weapon; @@ -2181,19 +2161,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 +2200,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; + concptr q, s; /* Enchant weapon/armour */ item_tester_hook = item_tester_hook_nameless_weapon_armour; @@ -2242,18 +2211,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 +2250,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 +2259,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); @@ -2373,13 +2330,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); @@ -2409,7 +2360,7 @@ bool ident_spell(bool only_equip) OBJECT_IDX item; object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; bool old_known; if (only_equip) @@ -2433,19 +2384,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); @@ -2487,34 +2427,23 @@ bool mundane_spell(bool only_equip) { OBJECT_IDX item; object_type *o_ptr; - cptr q, s; + concptr q, s; if (only_equip) item_tester_hook = object_is_weapon_armour_ammo; 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 */ @@ -2547,7 +2476,7 @@ bool identify_fully(bool only_equip) OBJECT_IDX item; object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; bool old_known; if (only_equip) @@ -2571,19 +2500,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); @@ -2650,7 +2568,7 @@ bool recharge(int power) bool fail = FALSE; byte fail_type = 1; - cptr q, s; + concptr q, s; GAME_TEXT o_name[MAX_NLEN]; /* Only accept legal items */ @@ -2659,19 +2577,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 +2821,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 */ @@ -2934,7 +2840,7 @@ bool bless_weapon(void) object_type *o_ptr; BIT_FLAGS flgs[TR_FLAG_SIZE]; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; /* Bless only weapons */ item_tester_hook = object_is_weapon; @@ -2942,24 +2848,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 +2901,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 +2961,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; @@ -3103,7 +2989,7 @@ bool pulish_shield(void) object_type *o_ptr; BIT_FLAGS flgs[TR_FLAG_SIZE]; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; /* Assume enchant weapon */ item_tester_tval = TV_SHIELD; @@ -3111,24 +2997,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) && @@ -3256,7 +3128,7 @@ bool potion_smash_effect(MONSTER_IDX who, POSITION y, POSITION x, KIND_OBJECT_ID dt = GF_DARK; angry = TRUE; break; - case SV_POTION_CONFUSION: /* Booze */ + case SV_POTION_BOOZE: /* Booze */ dt = GF_OLD_CONF; angry = TRUE; break; @@ -3320,8 +3192,7 @@ bool potion_smash_effect(MONSTER_IDX who, POSITION y, POSITION x, KIND_OBJECT_ID /* Do nothing */ ; } - (void)project(who, radius, y, x, dam, dt, - (PROJECT_JUMP | PROJECT_ITEM | PROJECT_KILL), -1); + (void)project(who, radius, y, x, dam, dt, (PROJECT_JUMP | PROJECT_ITEM | PROJECT_KILL), -1); /* XXX those potions that explode need to become "known" */ return angry; @@ -3345,8 +3216,6 @@ void display_spell_list(void) GAME_TEXT name[MAX_NLEN]; char out_val[160]; - - /* Erase window */ clear_from(0); /* They have too many spells to list */ @@ -3827,7 +3696,7 @@ void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_LEN y SPELL_IDX spell; int exp_level, increment = 64; const magic_type *s_ptr; - cptr comment; + concptr comment; char info[80]; char out_val[160]; byte line_attr; @@ -3990,7 +3859,7 @@ bool rustproof(void) OBJECT_IDX item; object_type *o_ptr; GAME_TEXT o_name[MAX_NLEN]; - cptr q, s; + concptr q, s; /* Select a piece of armour */ item_tester_hook = object_is_armour; @@ -3998,19 +3867,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)); @@ -4050,7 +3908,6 @@ bool curse_armor(void) GAME_TEXT o_name[MAX_NLEN]; - /* Curse the body armor */ o_ptr = &inventory[INVEN_BODY]; @@ -4064,11 +3921,11 @@ bool curse_armor(void) { /* Cool */ #ifdef JP -msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", -"恐怖の暗黒オーラ", "防具", o_name); + msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", + "恐怖の暗黒オーラ", "防具", o_name); #else msg_format("A %s tries to %s, but your %s resists the effects!", - "terrible black aura", "surround your armor", o_name); + "terrible black aura", "surround your armor", o_name); #endif } @@ -4097,13 +3954,7 @@ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返し /* Break it */ o_ptr->ident |= (IDENT_BROKEN); - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Recalculate mana */ - p_ptr->update |= (PU_MANA); - + p_ptr->update |= (PU_BONUS | PU_MANA); p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); } @@ -4163,13 +4014,7 @@ 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 */ - p_ptr->update |= (PU_MANA); - + p_ptr->update |= (PU_BONUS | PU_MANA); p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); } @@ -4242,7 +4087,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]; @@ -4251,8 +4096,7 @@ static IDX poly_r_idx(MONRACE_IDX r_idx) DEPTH lev1, lev2; /* Hack -- Uniques/Questors never polymorph */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags1 & RF1_QUESTOR)) + if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags1 & RF1_QUESTOR)) return (r_idx); /* Allowable range of "levels" for resulting monster */ @@ -4370,12 +4214,10 @@ bool polymorph_monster(POSITION y, POSITION x) } else if (back_m.hold_o_idx) /* Failed (paranoia) */ { - /* Delete objects */ for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { /* Acquire next object */ next_o_idx = o_list[this_o_idx].next_o_idx; - delete_object_idx(this_o_idx); } } @@ -4475,7 +4317,7 @@ bool eat_magic(int power) bool fail = FALSE; byte fail_type = 1; - cptr q, s; + concptr q, s; GAME_TEXT o_name[MAX_NLEN]; item_tester_hook = item_tester_hook_recharge; @@ -4483,16 +4325,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 +4562,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; @@ -4888,4 +4722,49 @@ bool shock_power(void) } } return TRUE; +} + +bool booze(player_type *creature_ptr) +{ + bool ident = FALSE; + if (creature_ptr->pclass != CLASS_MONK) chg_virtue(V_HARMONY, -1); + else if (!creature_ptr->resist_conf) creature_ptr->special_attack |= ATTACK_SUIKEN; + if (!creature_ptr->resist_conf) + { + if (set_confused(randint0(20) + 15)) + { + ident = TRUE; + } + } + + if (!creature_ptr->resist_chaos) + { + if (one_in_(2)) + { + if (set_image(creature_ptr->image + randint0(150) + 150)) + { + ident = TRUE; + } + } + if (one_in_(13) && (creature_ptr->pclass != CLASS_MONK)) + { + ident = TRUE; + if (one_in_(3)) lose_all_info(); + else wiz_dark(); + (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); + wiz_dark(); + msg_print(_("知らない場所で目が醒めた。頭痛がする。", "You wake up somewhere with a sore head...")); + msg_print(_("何も思い出せない。どうやってここへ来たのかも分からない!", "You can't remember a thing, or how you got here!")); + } + } + return ident; +} + +bool detonation(player_type *creature_ptr) +{ + msg_print(_("体の中で激しい爆発が起きた!", "Massive explosions rupture your body!")); + take_hit(DAMAGE_NOESCAPE, damroll(50, 20), _("爆発の薬", "a potion of Detonation"), -1); + (void)set_stun(creature_ptr->stun + 75); + (void)set_cut(creature_ptr->cut + 5000); + return TRUE; } \ No newline at end of file