1 #include "market/building-recharger.h"
2 #include "autopick/autopick.h"
3 #include "core/asking-player.h"
4 #include "core/player-update-types.h"
5 #include "core/window-redrawer.h"
6 #include "flavor/flavor-describer.h"
7 #include "flavor/object-flavor-types.h"
8 #include "floor/floor-object.h"
9 #include "inventory/inventory-slot-types.h"
10 #include "market/building-util.h"
11 #include "object-enchant/special-object-flags.h"
12 #include "object-hook/hook-magic.h"
13 #include "object/item-tester-hooker.h"
14 #include "object/item-use-flags.h"
15 #include "perception/object-perception.h"
16 #include "spell-kind/spells-perception.h"
17 #include "system/baseitem-info.h"
18 #include "system/item-entity.h"
19 #include "system/player-type-definition.h"
20 #include "term/screen-processor.h"
21 #include "view/display-messages.h"
24 * @brief 魔道具の使用回数を回復させる施設のメインルーチン / Recharge rods, wands and staffs
26 * The player can select the number of charges to add\n
27 * (up to a limit), and the recharge never fails.\n
29 * The cost for rods depends on the level of the rod. The prices\n
30 * for recharging wands and staffs are dependent on the cost of\n
32 * @param player_ptr プレイヤーへの参照ポインタ
34 void building_recharge(PlayerType *player_ptr)
38 prt(_(" 再充填の費用はアイテムの種類によります。", " The prices of recharge depend on the type."), 6, 0);
40 concptr q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? ");
41 concptr s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge.");
45 o_ptr = choose_object(player_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), FuncItemTester(&ItemEntity::is_rechargeable));
51 k_ptr = &baseitems_info[o_ptr->bi_id];
54 * We don't want to give the player free info about
55 * the level of the item or the number of charges.
57 /* The item must be "known" */
58 char tmp_str[MAX_NLEN];
59 if (!o_ptr->is_known()) {
60 msg_format(_("充填する前に鑑定されている必要があります!", "The item must be identified first!"));
63 if ((player_ptr->au >= 50) && get_check(_("$50で鑑定しますか? ", "Identify for 50 gold? ")))
67 identify_item(player_ptr, o_ptr);
68 describe_flavor(player_ptr, tmp_str, o_ptr, 0);
69 msg_format(_("%s です。", "You have: %s."), tmp_str);
71 autopick_alter_item(player_ptr, item, false);
72 building_prt_gold(player_ptr);
78 DEPTH lev = baseitems_info[o_ptr->bi_id].level;
80 if (o_ptr->tval == ItemKindType::ROD) {
81 if (o_ptr->timeout > 0) {
82 price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
85 msg_format(_("それは再充填する必要はありません。", "That doesn't need to be recharged."));
88 } else if (o_ptr->tval == ItemKindType::STAFF) {
89 price = (baseitems_info[o_ptr->bi_id].cost / 10) * o_ptr->number;
90 price = std::max(10, price);
92 price = (baseitems_info[o_ptr->bi_id].cost / 10);
93 price = std::max(10, price);
96 if (o_ptr->tval == ItemKindType::WAND && (o_ptr->pval / o_ptr->number >= k_ptr->pval)) {
97 if (o_ptr->number > 1) {
98 msg_print(_("この魔法棒はもう充分に充填されています。", "These wands are already fully charged."));
100 msg_print(_("この魔法棒はもう充分に充填されています。", "This wand is already fully charged."));
104 } else if (o_ptr->tval == ItemKindType::STAFF && o_ptr->pval >= k_ptr->pval) {
105 if (o_ptr->number > 1) {
106 msg_print(_("この杖はもう充分に充填されています。", "These staffs are already fully charged."));
108 msg_print(_("この杖はもう充分に充填されています。", "This staff is already fully charged."));
114 if (player_ptr->au < price) {
115 describe_flavor(player_ptr, tmp_str, o_ptr, OD_NAME_ONLY);
117 msg_format("%sを再充填するには$%d 必要です!", tmp_str, price);
119 msg_format("You need %d gold to recharge %s!", price, tmp_str);
124 PARAMETER_VALUE charges;
125 if (o_ptr->tval == ItemKindType::ROD) {
127 if (get_check(format("そのロッドを$%d で再充填しますか?", price)))
129 if (get_check(format("Recharge the %s for %d gold? ", ((o_ptr->number > 1) ? "rods" : "rod"), price)))
139 if (o_ptr->tval == ItemKindType::STAFF) {
140 max_charges = k_ptr->pval - o_ptr->pval;
142 max_charges = o_ptr->number * k_ptr->pval - o_ptr->pval;
145 charges = (PARAMETER_VALUE)get_quantity(
146 format(_("一回分$%d で何回分充填しますか?", "Add how many charges for %d gold apiece? "), price), std::min(player_ptr->au / price, max_charges));
153 o_ptr->pval += charges;
154 o_ptr->ident &= ~(IDENT_EMPTY);
157 describe_flavor(player_ptr, tmp_str, o_ptr, 0);
159 msg_format("%sを$%d で再充填しました。", tmp_str, price);
161 msg_format("%^s %s recharged for %d gold.", tmp_str, ((o_ptr->number > 1) ? "were" : "was"), price);
163 player_ptr->update |= (PU_COMBINE | PU_REORDER);
164 player_ptr->window_flags |= (PW_INVEN);
165 player_ptr->au -= price;
169 * @brief 魔道具の使用回数を回復させる施設の一括処理向けサブルーチン / Recharge rods, wands and staffs
171 * The player can select the number of charges to add\n
172 * (up to a limit), and the recharge never fails.\n
174 * The cost for rods depends on the level of the rod. The prices\n
175 * for recharging wands and staffs are dependent on the cost of\n
177 * @param player_ptr プレイヤーへの参照ポインタ
179 void building_recharge_all(PlayerType *player_ptr)
183 prt(_(" 再充填の費用はアイテムの種類によります。", " The prices of recharge depend on the type."), 6, 0);
186 PRICE total_cost = 0;
187 for (INVENTORY_IDX i = 0; i < INVEN_PACK; i++) {
189 o_ptr = &player_ptr->inventory_list[i];
191 if ((o_ptr->tval < ItemKindType::STAFF) || (o_ptr->tval > ItemKindType::ROD)) {
194 if (!o_ptr->is_known()) {
198 DEPTH lev = baseitems_info[o_ptr->bi_id].level;
200 k_ptr = &baseitems_info[o_ptr->bi_id];
202 switch (o_ptr->tval) {
203 case ItemKindType::ROD:
204 price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
207 case ItemKindType::STAFF:
208 price = (baseitems_info[o_ptr->bi_id].cost / 10) * o_ptr->number;
209 price = std::max(10, price);
210 price = (k_ptr->pval - o_ptr->pval) * price;
213 case ItemKindType::WAND:
214 price = (baseitems_info[o_ptr->bi_id].cost / 10);
215 price = std::max(10, price);
216 price = (o_ptr->number * k_ptr->pval - o_ptr->pval) * price;
229 msg_print(_("充填する必要はありません。", "No need to recharge."));
234 if (player_ptr->au < total_cost) {
235 msg_format(_("すべてのアイテムを再充填するには$%d 必要です!", "You need %d gold to recharge all items!"), total_cost);
240 if (!get_check(format(_("すべてのアイテムを $%d で再充填しますか?", "Recharge all items for %d gold? "), total_cost))) {
244 for (INVENTORY_IDX i = 0; i < INVEN_PACK; i++) {
246 o_ptr = &player_ptr->inventory_list[i];
248 k_ptr = &baseitems_info[o_ptr->bi_id];
250 if ((o_ptr->tval < ItemKindType::STAFF) || (o_ptr->tval > ItemKindType::ROD)) {
254 if (!o_ptr->is_known()) {
255 identify_item(player_ptr, o_ptr);
256 autopick_alter_item(player_ptr, i, false);
259 switch (o_ptr->tval) {
260 case ItemKindType::ROD:
263 case ItemKindType::STAFF:
264 if (o_ptr->pval < k_ptr->pval) {
265 o_ptr->pval = k_ptr->pval;
268 o_ptr->ident &= ~(IDENT_EMPTY);
270 case ItemKindType::WAND:
271 if (o_ptr->pval < o_ptr->number * k_ptr->pval) {
272 o_ptr->pval = o_ptr->number * k_ptr->pval;
275 o_ptr->ident &= ~(IDENT_EMPTY);
283 msg_format(_("$%d で再充填しました。", "You pay %d gold."), total_cost);
285 player_ptr->update |= (PU_COMBINE | PU_REORDER);
286 player_ptr->window_flags |= (PW_INVEN);
287 player_ptr->au -= total_cost;