X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd-item.c;h=8fedc95b9314cb0ba0cbc88b21e74c1ff1c63d52;hb=9a051baa96688aa8d7f225bb9642d5cbcd165eaa;hp=63b498148b8058d3871bd3e6fe5ede5ffbab2138;hpb=8674986c7b8f2847f0ca79f3c63177a2cb5dc697;p=hengband%2Fhengband.git diff --git a/src/cmd-item.c b/src/cmd-item.c index 63b498148..8fedc95b9 100644 --- a/src/cmd-item.c +++ b/src/cmd-item.c @@ -21,8 +21,12 @@ #include "cmd-zaprod.h" #include "cmd-zapwand.h" -#include "player-item.h" #include "object-hook.h" +#include "sort.h" +#include "quest.h" +#include "artifact.h" +#include "avatar.h" +#include "player-status.h" /*! @@ -53,15 +57,10 @@ void do_cmd_inven(void) (p_ptr->total_weight * 100) / weight_limit()); #endif - - /* Get a command */ prt(out_val, 0, 0); - - /* Get a new command */ command_new = inkey(); screen_load(); - /* Process "Escape" */ if (command_new == ESCAPE) { @@ -112,15 +111,10 @@ void do_cmd_equip(void) (long int)((p_ptr->total_weight * 100) / weight_limit())); #endif - - /* Get a command */ prt(out_val, 0, 0); - - /* Get a new command */ command_new = inkey(); screen_load(); - /* Process "Escape" */ if (command_new == ESCAPE) { @@ -157,10 +151,10 @@ void do_cmd_wield(void) object_type *q_ptr; object_type *o_ptr; - cptr act; - cptr q, s; + concptr act; + concptr q, s; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; OBJECT_IDX need_switch_wielding = 0; @@ -189,7 +183,7 @@ void do_cmd_wield(void) case TV_SHIELD: case TV_CARD: /* Dual wielding */ - if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM)) + if (has_melee_weapon(INVEN_RARM) && has_melee_weapon(INVEN_LARM)) { /* Restrict the choices */ item_tester_hook = item_tester_hook_melee_weapon; @@ -197,11 +191,11 @@ void do_cmd_wield(void) /* Choose a weapon from the equipment only */ q = _("どちらの武器と取り替えますか?", "Replace which weapon? "); s = _("おっと。", "Oops."); - if (!get_item(&slot, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) return; + if (!choose_object(&slot, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) return; if (slot == INVEN_RARM) need_switch_wielding = INVEN_LARM; } - else if (buki_motteruka(INVEN_LARM)) slot = INVEN_RARM; + else if (has_melee_weapon(INVEN_LARM)) slot = INVEN_RARM; /* Both arms are already used by non-weapon */ else if (inventory[INVEN_RARM].k_idx && !object_is_melee_weapon(&inventory[INVEN_RARM]) && @@ -213,7 +207,7 @@ void do_cmd_wield(void) /* Choose a hand */ q = _("どちらの手に装備しますか?", "Equip which hand? "); s = _("おっと。", "Oops."); - if (!get_item(&slot, q, s, (USE_EQUIP))) return; + if (!choose_object(&slot, q, s, (USE_EQUIP))) return; } break; @@ -228,7 +222,7 @@ void do_cmd_wield(void) if (!get_check(_("二刀流で戦いますか?", "Dual wielding? "))) slot = INVEN_RARM; } - else if (!inventory[INVEN_RARM].k_idx && buki_motteruka(INVEN_LARM)) + else if (!inventory[INVEN_RARM].k_idx && has_melee_weapon(INVEN_LARM)) { if (!get_check(_("二刀流で戦いますか?", "Dual wielding? "))) slot = INVEN_LARM; } @@ -243,8 +237,8 @@ void do_cmd_wield(void) q = _("どちらの手に装備しますか?", "Equip which hand? "); s = _("おっと。", "Oops."); - if (!get_item(&slot, q, s, (USE_EQUIP))) return; - if ((slot == INVEN_LARM) && !buki_motteruka(INVEN_RARM)) + if (!choose_object(&slot, q, s, (USE_EQUIP))) return; + if ((slot == INVEN_LARM) && !has_melee_weapon(INVEN_RARM)) need_switch_wielding = INVEN_RARM; } break; @@ -265,7 +259,7 @@ void do_cmd_wield(void) /* Restrict the choices */ select_ring_slot = TRUE; - if (!get_item(&slot, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) + if (!choose_object(&slot, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT))) { select_ring_slot = FALSE; return; @@ -324,7 +318,7 @@ void do_cmd_wield(void) object_type *switch_o_ptr = &inventory[need_switch_wielding]; object_type object_tmp; object_type *otmp_ptr = &object_tmp; - char switch_name[MAX_NLEN]; + GAME_TEXT switch_name[MAX_NLEN]; object_desc(switch_name, switch_o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); @@ -384,24 +378,16 @@ void do_cmd_wield(void) /* Wear the new stuff */ object_copy(o_ptr, q_ptr); - /* Player touches it */ o_ptr->marked |= OM_TOUCHED; - /* Increase the weight */ p_ptr->total_weight += q_ptr->weight; /* Increment the equip counter by hand */ equip_cnt++; -#ifdef JP -#define STR_WIELD_RARM "%s(%c)を右手に装備した。" -#define STR_WIELD_LARM "%s(%c)を左手に装備した。" -#define STR_WIELD_ARMS "%s(%c)を両手で構えた。" -#else -#define STR_WIELD_RARM "You are wielding %s (%c) in your right hand." -#define STR_WIELD_LARM "You are wielding %s (%c) in your left hand." -#define STR_WIELD_ARMS "You are wielding %s (%c) with both hands." -#endif +#define STR_WIELD_RARM _("%s(%c)を右手に装備した。", "You are wielding %s (%c) in your right hand.") +#define STR_WIELD_LARM _("%s(%c)を左手に装備した。", "You are wielding %s (%c) in your left hand.") +#define STR_WIELD_ARMS _("%s(%c)を両手で構えた。", "You are wielding %s (%c) with both hands.") /* Where is the item now */ switch (slot) @@ -468,11 +454,11 @@ void do_cmd_wield(void) void kamaenaoshi(INVENTORY_IDX item) { object_type *o_ptr, *new_o_ptr; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; if (item == INVEN_RARM) { - if (buki_motteruka(INVEN_LARM)) + if (has_melee_weapon(INVEN_LARM)) { o_ptr = &inventory[INVEN_LARM]; object_desc(o_name, o_ptr, 0); @@ -502,7 +488,7 @@ void kamaenaoshi(INVENTORY_IDX item) o_ptr = &inventory[INVEN_RARM]; if (o_ptr->k_idx) object_desc(o_name, o_ptr, 0); - if (buki_motteruka(INVEN_RARM)) + if (has_melee_weapon(INVEN_RARM)) { if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); @@ -528,7 +514,7 @@ void do_cmd_takeoff(void) { OBJECT_IDX item; object_type *o_ptr; - cptr q, s; + concptr q, s; if (p_ptr->special_defense & KATA_MUSOU) { @@ -538,20 +524,8 @@ void do_cmd_takeoff(void) q = _("どれを装備からはずしますか? ", "Take off which item? "); s = _("はずせる装備がない。", "You are not wearing anything to take off."); - 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; /* Item is cursed */ if (object_is_cursed(o_ptr)) @@ -606,7 +580,7 @@ void do_cmd_drop(void) object_type *o_ptr; - cptr q, s; + concptr q, s; if (p_ptr->special_defense & KATA_MUSOU) { @@ -616,20 +590,8 @@ void do_cmd_drop(void) q = _("どのアイテムを落としますか? ", "Drop which item? "); s = _("落とせるアイテムを持っていない。", "You have nothing to drop."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | 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 | USE_INVEN | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; /* Hack -- Cannot remove cursed items */ if ((item >= INVEN_RARM) && object_is_cursed(o_ptr)) @@ -665,34 +627,6 @@ void do_cmd_drop(void) p_ptr->redraw |= (PR_EQUIPPY); } -/*! - * @brief オブジェクトが高位の魔法書かどうかを判定する - * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ - * @return オブジェクトが高位の魔法書ならばTRUEを返す - */ -static bool high_level_book(object_type *o_ptr) -{ - if ((o_ptr->tval == TV_LIFE_BOOK) || - (o_ptr->tval == TV_SORCERY_BOOK) || - (o_ptr->tval == TV_NATURE_BOOK) || - (o_ptr->tval == TV_CHAOS_BOOK) || - (o_ptr->tval == TV_DEATH_BOOK) || - (o_ptr->tval == TV_TRUMP_BOOK) || - (o_ptr->tval == TV_CRAFT_BOOK) || - (o_ptr->tval == TV_DAEMON_BOOK) || - (o_ptr->tval == TV_CRUSADE_BOOK) || - (o_ptr->tval == TV_MUSIC_BOOK) || - (o_ptr->tval == TV_HEX_BOOK)) - { - if (o_ptr->sval > 1) - return TRUE; - else - return FALSE; - } - - return FALSE; -} - /*! * @brief アイテムを破壊するコマンドのメインルーチン / Destroy an item @@ -710,10 +644,10 @@ void do_cmd_destroy(void) object_type forge; object_type *q_ptr = &forge; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; char out_val[MAX_NLEN+40]; - cptr q, s; + concptr q, s; if (p_ptr->special_defense & KATA_MUSOU) { @@ -726,19 +660,8 @@ void do_cmd_destroy(void) q = _("どのアイテムを壊しますか? ", "Destroy which item? "); s = _("壊せるアイテムを持っていない。", "You have nothing to destroy."); - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) 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_INVEN | USE_FLOOR)); + if (!o_ptr) return; /* Verify unless quantity given beforehand */ if (!force && (confirm_destroy || (object_value(o_ptr) > 0))) @@ -843,7 +766,7 @@ void do_cmd_destroy(void) floor_item_optimize(0 - item); } - if (high_level_book(q_ptr)) + if (item_tester_high_level_book(q_ptr)) { bool gain_expr = FALSE; @@ -876,12 +799,12 @@ void do_cmd_destroy(void) msg_print(_("更に経験を積んだような気がする。", "You feel more experienced.")); gain_exp(tester_exp * amt); } - if (high_level_book(q_ptr) && q_ptr->tval == TV_LIFE_BOOK) + if (item_tester_high_level_book(q_ptr) && q_ptr->tval == TV_LIFE_BOOK) { chg_virtue(V_UNLIFE, 1); chg_virtue(V_VITALITY, -1); } - else if (high_level_book(q_ptr) && q_ptr->tval == TV_DEATH_BOOK) + else if (item_tester_high_level_book(q_ptr) && q_ptr->tval == TV_DEATH_BOOK) { chg_virtue(V_UNLIFE, -1); chg_virtue(V_VITALITY, 1); @@ -912,27 +835,14 @@ void do_cmd_observe(void) { OBJECT_IDX item; object_type *o_ptr; - char o_name[MAX_NLEN]; - cptr q, s; - + GAME_TEXT o_name[MAX_NLEN]; + concptr q, s; q = _("どのアイテムを調べますか? ", "Examine which item? "); s = _("調べられるアイテムがない。", "You have nothing to examine."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | 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 | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; /* Require full knowledge */ if (!(o_ptr->ident & IDENT_MENTAL)) @@ -941,11 +851,8 @@ void do_cmd_observe(void) return; } - - /* Description */ object_desc(o_name, o_ptr, 0); msg_format(_("%sを調べている...", "Examining %s..."), o_name); - /* Describe it fully */ if (!screen_object(o_ptr, SCROBJ_FORCE_DETAIL)) msg_print(_("特に変わったところはないようだ。", "You see nothing special.")); } @@ -960,24 +867,13 @@ void do_cmd_uninscribe(void) { OBJECT_IDX item; object_type *o_ptr; - cptr q, s; + concptr q, s; q = _("どのアイテムの銘を消しますか? ", "Un-inscribe which item? "); s = _("銘を消せるアイテムがない。", "You have nothing to un-inscribe."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | 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 | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; /* Nothing to remove */ if (!o_ptr->inscription) @@ -992,7 +888,7 @@ void do_cmd_uninscribe(void) o_ptr->inscription = 0; /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); + p_ptr->update |= (PU_COMBINE); p_ptr->window |= (PW_INVEN | PW_EQUIP); @@ -1010,27 +906,16 @@ void do_cmd_uninscribe(void) void do_cmd_inscribe(void) { OBJECT_IDX item; - object_type *o_ptr; - char o_name[MAX_NLEN]; - char out_val[80]; - cptr q, s; + object_type *o_ptr; + GAME_TEXT o_name[MAX_NLEN]; + char out_val[80]; + concptr q, s; q = _("どのアイテムに銘を刻みますか? ", "Inscribe which item? "); s = _("銘を刻めるアイテムがない。", "You have nothing to inscribe."); - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | 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 | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; /* Describe the activity */ object_desc(o_name, o_ptr, OD_OMIT_INSCRIPTION); @@ -1055,7 +940,7 @@ void do_cmd_inscribe(void) o_ptr->inscription = quark_add(out_val); /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); + p_ptr->update |= (PU_COMBINE); p_ptr->window |= (PW_INVEN | PW_EQUIP); @@ -1065,27 +950,6 @@ void do_cmd_inscribe(void) } - -/*! - * @brief オブジェクトがランタンの燃料になるかどうかを判定する - * An "item_tester_hook" for refilling lanterns - * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ - * @return オブジェクトがランタンの燃料になるならばTRUEを返す - */ -static bool item_tester_refill_lantern(object_type *o_ptr) -{ - /* Flasks of oil are okay */ - if (o_ptr->tval == TV_FLASK) return (TRUE); - - /* Laterns are okay */ - if ((o_ptr->tval == TV_LITE) && - (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE); - - /* Assume not okay */ - return (FALSE); -} - - /*! * @brief ランタンに燃料を加えるコマンドのメインルーチン * Refill the players lamp (from the pack or floor) @@ -1098,33 +962,16 @@ static void do_cmd_refill_lamp(void) object_type *o_ptr; object_type *j_ptr; - cptr q, s; - + concptr q, s; /* Restrict the choices */ item_tester_hook = item_tester_refill_lantern; -#ifdef JP - q = "どの油つぼから注ぎますか? "; - s = "油つぼがない。"; -#else - q = "Refill with which flask? "; - s = "You have no flasks of oil."; -#endif - - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } + q = _("どの油つぼから注ぎますか? ", "Refill with which flask? "); + s = _("油つぼがない。", "You have no flasks of oil."); - /* 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; /* Take a partial turn */ p_ptr->energy_use = 50; @@ -1202,7 +1049,7 @@ static void do_cmd_refill_torch(void) object_type *o_ptr; object_type *j_ptr; - cptr q, s; + concptr q, s; /* Restrict the choices */ item_tester_hook = item_tester_refill_torch; @@ -1210,20 +1057,8 @@ static void do_cmd_refill_torch(void) q = _("どの松明で明かりを強めますか? ", "Refuel with which torch? "); s = _("他に松明がない。", "You have no extra torches."); - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) 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_INVEN | USE_FLOOR)); + if (!o_ptr) return; /* Take a partial turn */ p_ptr->energy_use = 50; @@ -1330,6 +1165,8 @@ void do_cmd_refill(void) */ void do_cmd_target(void) { + if (p_ptr->wild_mode) return; + /* Target set */ if (target_set(TARGET_KILL)) { @@ -1370,17 +1207,14 @@ void do_cmd_look(void) */ void do_cmd_locate(void) { - int dir, y1, x1, y2, x2; - - char tmp_val[80]; - - char out_val[160]; - - int wid, hgt; + DIRECTION dir; + POSITION y1, x1, y2, x2; + GAME_TEXT tmp_val[80]; + GAME_TEXT out_val[160]; + TERM_LEN wid, hgt; get_screen_size(&wid, &hgt); - /* Start at current panel */ y2 = y1 = panel_row_min; x2 = x1 = panel_col_min; @@ -1413,8 +1247,8 @@ void do_cmd_locate(void) } /* Prepare to ask which way to look */ - sprintf(out_val, _("マップ位置 [%d(%02d),%d(%02d)] (プレイヤーの%s) 方向?", - "Map sector [%d(%02d),%d(%02d)], which is%s your sector. Direction?"), + sprintf(out_val, _("マップ位置 [%ld(%02ld),%ld(%02ld)] (プレイヤーの%s) 方向?", + "Map sector [%ld(%02ld),%ld(%02ld)], which is%s your sector. Direction?"), y2 / (hgt / 2), y2 % (hgt / 2), x2 / (wid / 2), x2 % (wid / 2), tmp_val); @@ -1452,9 +1286,7 @@ void do_cmd_locate(void) verify_panel(); p_ptr->update |= (PU_MONSTERS); - p_ptr->redraw |= (PR_MAP); - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); handle_stuff(); } @@ -1475,7 +1307,6 @@ void do_cmd_locate(void) bool ang_sort_comp_hook(vptr u, vptr v, int a, int b) { u16b *who = (u16b*)(u); - u16b *why = (u16b*)(v); int w1 = who[a]; @@ -1657,7 +1488,7 @@ void do_cmd_query_symbol(void) prt(buf, 0, 0); /* Allocate the "who" array */ - C_MAKE(who, max_r_idx, IDX); + C_MAKE(who, max_r_idx, MONRACE_IDX); /* Collect matching monsters */ for (n = 0, i = 1; i < max_r_idx; i++) @@ -1724,8 +1555,6 @@ void do_cmd_query_symbol(void) /* Query */ query = inkey(); - - /* Restore */ prt(buf, 0, 0); why = 2; @@ -1802,7 +1631,6 @@ void do_cmd_query_symbol(void) /* Unrecall */ if (recall) { - /* Restore */ screen_load(); } @@ -1855,7 +1683,19 @@ void do_cmd_use(void) { OBJECT_IDX item; object_type *o_ptr; - cptr q, s; + concptr q, s; + + if (p_ptr->wild_mode) + { + return; + } + + if (p_ptr->inside_arena) + { + msg_print(_("アリーナが魔法を吸収した!", "The arena absorbs all attempted magic!")); + msg_print(NULL); + return; + } if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN)) { @@ -1867,18 +1707,8 @@ void do_cmd_use(void) q = _("どれを使いますか?", "Use which item? "); s = _("使えるものがありません。", "You have nothing to use."); - if (!get_item(&item, q, s, (USE_INVEN | USE_EQUIP | USE_FLOOR | 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_INVEN | USE_EQUIP | USE_FLOOR | IGNORE_BOTHHAND_SLOT)); + if (!o_ptr) return; switch (o_ptr->tval) { @@ -1953,7 +1783,7 @@ void do_cmd_use(void) case TV_ARROW: case TV_BOLT: { - do_cmd_fire_aux(item, &inventory[INVEN_BOW]); + exe_fire(item, &inventory[INVEN_BOW]); break; }