2 * @brief プレーヤーのHP/MP、アイテム、お金・明かりの残りターン、充填魔力を盗んだり減少させたりする処理
7 #include "monster-attack/monster-eating.h"
8 #include "floor/floor.h"
9 #include "inventory/inventory-object.h"
10 #include "mind/mind-mirror-master.h"
11 #include "monster/monster-status.h"
12 #include "object/object-flavor.h"
13 #include "object/object-generator.h"
14 #include "object/object-hook.h"
15 #include "object/object-mark-types.h"
16 #include "object/object-info.h"
17 #include "player/avatar.h"
18 #include "player/mimic-info-table.h"
19 #include "player/player-effects.h"
20 #include "view/display-messages.h"
21 #include "world/world-object.h"
23 void process_eat_gold(player_type *target_ptr, monap_type *monap_ptr)
25 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
26 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
28 monap_ptr->blinked = TRUE;
33 PRICE gold = (target_ptr->au / 10) + randint1(25);
38 gold = (target_ptr->au / 20) + randint1(3000);
40 if (gold > target_ptr->au)
41 gold = target_ptr->au;
43 target_ptr->au -= gold;
45 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
46 } else if (target_ptr->au > 0) {
47 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
48 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
49 chg_virtue(target_ptr, V_SACRIFICE, 1);
51 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
52 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
53 chg_virtue(target_ptr, V_SACRIFICE, 2);
56 target_ptr->redraw |= (PR_GOLD);
57 target_ptr->window |= (PW_PLAYER);
58 monap_ptr->blinked = TRUE;
62 * @brief 盗み打撃の時にアイテムが盗まれるかどうかを判定する
63 * @param target_ptr プレーヤーへの参照ポインタ
64 * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
65 * @return 盗まれたらTRUE、何も盗まれなかったらFALSE
67 bool check_eat_item(player_type *target_ptr, monap_type *monap_ptr)
69 if (monster_confused_remaining(monap_ptr->m_ptr))
72 if (target_ptr->is_dead || check_multishadow(target_ptr))
75 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
76 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
77 monap_ptr->blinked = TRUE;
78 monap_ptr->obvious = TRUE;
86 * @brief プレーヤーが持っているアイテムをモンスターに移す
87 * @param target_ptr プレーヤーへの参照ポインタ
88 * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
91 static void move_item_to_monster(player_type *target_ptr, monap_type *monap_ptr, const OBJECT_IDX o_idx)
97 j_ptr = &target_ptr->current_floor_ptr->o_list[o_idx];
98 object_copy(j_ptr, monap_ptr->o_ptr);
100 if ((monap_ptr->o_ptr->tval == TV_ROD) || (monap_ptr->o_ptr->tval == TV_WAND)) {
101 j_ptr->pval = monap_ptr->o_ptr->pval / monap_ptr->o_ptr->number;
102 monap_ptr->o_ptr->pval -= j_ptr->pval;
105 j_ptr->marked = OM_TOUCHED;
106 j_ptr->held_m_idx = monap_ptr->m_idx;
107 j_ptr->next_o_idx = monap_ptr->m_ptr->hold_o_idx;
108 monap_ptr->m_ptr->hold_o_idx = o_idx;
113 * @param target_ptr プレーヤーへの参照ポインタ
114 * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
116 * @details eatとあるがお金や食べ物と違ってなくならない、盗んだモンスターを倒せば取り戻せる
118 void process_eat_item(player_type *target_ptr, monap_type *monap_ptr)
120 for (int i = 0; i < 10; i++) {
122 INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
123 monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
124 if (!monap_ptr->o_ptr->k_idx)
127 if (object_is_artifact(monap_ptr->o_ptr))
130 object_desc(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, OD_OMIT_PREFIX);
132 msg_format("%s(%c)を%s盗まれた!", monap_ptr->o_name, index_to_label(i_idx), ((monap_ptr->o_ptr->number > 1) ? "一つ" : ""));
134 msg_format("%sour %s (%c) was stolen!", ((monap_ptr->o_ptr->number > 1) ? "One of y" : "Y"), monap_ptr->o_name, index_to_label(i_idx));
136 chg_virtue(target_ptr, V_SACRIFICE, 1);
137 o_idx = o_pop(target_ptr->current_floor_ptr);
138 move_item_to_monster(target_ptr, monap_ptr, o_idx);
139 inven_item_increase(target_ptr, i_idx, -1);
140 inven_item_optimize(target_ptr, i_idx);
141 monap_ptr->obvious = TRUE;
142 monap_ptr->blinked = TRUE;
147 void process_eat_food(player_type *target_ptr, monap_type *monap_ptr)
149 for (int i = 0; i < 10; i++) {
150 INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
151 monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
152 if (!monap_ptr->o_ptr->k_idx)
155 if ((monap_ptr->o_ptr->tval != TV_FOOD) && !((monap_ptr->o_ptr->tval == TV_CORPSE) && (monap_ptr->o_ptr->sval)))
158 object_desc(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
160 msg_format("%s(%c)を%s食べられてしまった!", monap_ptr->o_name, index_to_label(i_idx), ((monap_ptr->o_ptr->number > 1) ? "一つ" : ""));
162 msg_format("%sour %s (%c) was eaten!", ((monap_ptr->o_ptr->number > 1) ? "One of y" : "Y"), monap_ptr->o_name, index_to_label(i_idx));
164 inven_item_increase(target_ptr, i_idx, -1);
165 inven_item_optimize(target_ptr, i_idx);
166 monap_ptr->obvious = TRUE;
171 void process_eat_lite(player_type *target_ptr, monap_type *monap_ptr)
173 if ((monap_ptr->o_ptr->xtra4 <= 0) || object_is_fixed_artifact(monap_ptr->o_ptr))
176 monap_ptr->o_ptr->xtra4 -= (s16b)(250 + randint1(250));
177 if (monap_ptr->o_ptr->xtra4 < 1)
178 monap_ptr->o_ptr->xtra4 = 1;
180 if (!target_ptr->blind) {
181 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
182 monap_ptr->obvious = TRUE;
185 target_ptr->window |= (PW_EQUIP);
189 * @brief モンスターからの攻撃による充填魔力吸収処理
190 * @param target_ptr プレーヤーへの参照ポインタ
191 * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
192 * @return 吸収されたらTRUE、されなかったらFALSE
194 bool process_un_power(player_type *target_ptr, monap_type *monap_ptr)
196 if (((monap_ptr->o_ptr->tval != TV_STAFF) && (monap_ptr->o_ptr->tval != TV_WAND)) || (monap_ptr->o_ptr->pval == 0))
199 int heal = monap_ptr->rlev * monap_ptr->o_ptr->pval;
200 if (monap_ptr->o_ptr->tval == TV_STAFF)
201 heal *= monap_ptr->o_ptr->number;
203 heal = MIN(heal, monap_ptr->m_ptr->maxhp - monap_ptr->m_ptr->hp);
204 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
205 monap_ptr->obvious = TRUE;
206 monap_ptr->m_ptr->hp += (HIT_POINT)heal;
207 if (target_ptr->health_who == monap_ptr->m_idx)
208 target_ptr->redraw |= (PR_HEALTH);
210 if (target_ptr->riding == monap_ptr->m_idx)
211 target_ptr->redraw |= (PR_UHEALTH);
213 monap_ptr->o_ptr->pval = 0;
214 target_ptr->update |= (PU_COMBINE | PU_REORDER);
215 target_ptr->window |= (PW_INVEN);
219 bool check_drain_hp(player_type *target_ptr, const s32b d)
221 bool resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
222 if (target_ptr->mimic_form)
223 return (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) != 0 ? TRUE : resist_drain;
225 switch (target_ptr->prace) {
239 void process_drain_life(player_type *target_ptr, monap_type *monap_ptr, const bool resist_drain)
241 if ((monap_ptr->damage <= 5) || resist_drain)
244 bool did_heal = monap_ptr->m_ptr->hp < monap_ptr->m_ptr->maxhp;
245 monap_ptr->m_ptr->hp += damroll(4, monap_ptr->damage / 6);
246 if (monap_ptr->m_ptr->hp > monap_ptr->m_ptr->maxhp)
247 monap_ptr->m_ptr->hp = monap_ptr->m_ptr->maxhp;
249 if (target_ptr->health_who == monap_ptr->m_idx)
250 target_ptr->redraw |= (PR_HEALTH);
252 if (target_ptr->riding == monap_ptr->m_idx)
253 target_ptr->redraw |= (PR_UHEALTH);
255 if (monap_ptr->m_ptr->ml && did_heal)
256 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), monap_ptr->m_name);
259 void process_drain_mana(player_type *target_ptr, monap_type *monap_ptr)
261 if (check_multishadow(target_ptr)) {
262 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
266 monap_ptr->do_cut = 0;
267 target_ptr->csp -= monap_ptr->damage;
268 if (target_ptr->csp < 0) {
270 target_ptr->csp_frac = 0;
273 target_ptr->redraw |= (PR_MANA);