2 #include "object/object-kind.h"
4 #include "spell/spells-type.h"
5 #include "spell/process-effect.h"
6 #include "effect/effect-characteristics.h"
9 * @brief アイテムが酸で破損するかどうかを判定する
10 * @param o_ptr アイテムの情報参照ポインタ
11 * @return 破損するならばTRUEを返す
12 * Note that amulets, rods, and high-level spell books are immune
13 * to "inventory damage" of any kind. Also sling ammo and shovels.
14 * Does a given class of objects (usually) hate acid?
15 * Note that acid can either melt or corrode something.
17 bool hates_acid(object_type *o_ptr)
19 /* Analyze the type */
42 /* Staffs/Scrolls are wood/paper */
69 * @brief アイテムが電撃で破損するかどうかを判定する /
70 * Does a given object (usually) hate electricity?
71 * @param o_ptr アイテムの情報参照ポインタ
72 * @return 破損するならばTRUEを返す
74 bool hates_elec(object_type *o_ptr)
90 * @brief アイテムが火炎で破損するかどうかを判定する /
91 * Does a given object (usually) hate fire?
92 * @param o_ptr アイテムの情報参照ポインタ
93 * @return 破損するならばTRUEを返す
95 * Hafted/Polearm weapons have wooden shafts.
96 * Arrows/Bows are mostly wooden.
98 bool hates_fire(object_type *o_ptr)
100 /* Analyze the type */
119 case TV_SORCERY_BOOK:
127 case TV_CRUSADE_BOOK:
129 case TV_HISSATSU_BOOK:
141 /* Staffs/Scrolls burn */
154 * @brief アイテムが冷気で破損するかどうかを判定する /
155 * Does a given object (usually) hate cold?
156 * @param o_ptr アイテムの情報参照ポインタ
157 * @return 破損するならばTRUEを返す
159 bool hates_cold(object_type *o_ptr)
176 * @brief アイテムが酸で破損するかどうかを判定する(メインルーチン) /
178 * @param o_ptr アイテムの情報参照ポインタ
179 * @return 破損するならばTRUEを返す
182 int set_acid_destroy(object_type *o_ptr)
184 BIT_FLAGS flgs[TR_FLAG_SIZE];
185 if (!hates_acid(o_ptr)) return FALSE;
186 object_flags(o_ptr, flgs);
187 if (have_flag(flgs, TR_IGNORE_ACID)) return FALSE;
193 * @brief アイテムが電撃で破損するかどうかを判定する(メインルーチン) /
195 * @param o_ptr アイテムの情報参照ポインタ
196 * @return 破損するならばTRUEを返す
199 int set_elec_destroy(object_type *o_ptr)
201 BIT_FLAGS flgs[TR_FLAG_SIZE];
202 if (!hates_elec(o_ptr)) return FALSE;
203 object_flags(o_ptr, flgs);
204 if (have_flag(flgs, TR_IGNORE_ELEC)) return FALSE;
210 * @brief アイテムが火炎で破損するかどうかを判定する(メインルーチン) /
212 * @param o_ptr アイテムの情報参照ポインタ
213 * @return 破損するならばTRUEを返す
216 int set_fire_destroy(object_type *o_ptr)
218 BIT_FLAGS flgs[TR_FLAG_SIZE];
219 if (!hates_fire(o_ptr)) return FALSE;
220 object_flags(o_ptr, flgs);
221 if (have_flag(flgs, TR_IGNORE_FIRE)) return FALSE;
227 * @brief アイテムが冷気で破損するかどうかを判定する(メインルーチン) /
229 * @param o_ptr アイテムの情報参照ポインタ
230 * @return 破損するならばTRUEを返す
233 int set_cold_destroy(object_type *o_ptr)
235 BIT_FLAGS flgs[TR_FLAG_SIZE];
236 if (!hates_cold(o_ptr)) return FALSE;
237 object_flags(o_ptr, flgs);
238 if (have_flag(flgs, TR_IGNORE_COLD)) return FALSE;
245 * Potions "smash open" and cause an area effect when
246 * @param who 薬破損の主体ID(プレイヤー所持アイテムが壊れた場合0、床上のアイテムの場合モンスターID)
249 * @param k_idx 破損した薬のアイテムID
250 * @return 薬を浴びたモンスターが起こるならばTRUEを返す
253 * (1) they are shattered while in the player's p_ptr->inventory_list,
254 * due to cold (etc) attacks;
255 * (2) they are thrown at a monster, or obstacle;
256 * (3) they are shattered by a "cold ball" or other such spell
257 * while lying on the floor.
260 * who --- who caused the potion to shatter (0=player)
261 * potions that smash on the floor are assumed to
262 * be caused by no-one (who = 1), as are those that
263 * shatter inside the player inventory.
264 * (Not anymore -- I changed this; TY)
265 * y, x --- coordinates of the potion (or player if
266 * the potion was in her inventory);
267 * o_ptr --- pointer to the potion object.
270 bool potion_smash_effect(player_type *owner_ptr, MONSTER_IDX who, POSITION y, POSITION x, KIND_OBJECT_IDX k_idx)
276 object_kind *k_ptr = &k_info[k_idx];
279 case SV_POTION_SALT_WATER:
280 case SV_POTION_SLIME_MOLD:
281 case SV_POTION_LOSE_MEMORIES:
282 case SV_POTION_DEC_STR:
283 case SV_POTION_DEC_INT:
284 case SV_POTION_DEC_WIS:
285 case SV_POTION_DEC_DEX:
286 case SV_POTION_DEC_CON:
287 case SV_POTION_DEC_CHR:
288 case SV_POTION_WATER: /* perhaps a 'water' attack? */
289 case SV_POTION_APPLE_JUICE:
292 case SV_POTION_INFRAVISION:
293 case SV_POTION_DETECT_INVIS:
294 case SV_POTION_SLOW_POISON:
295 case SV_POTION_CURE_POISON:
296 case SV_POTION_BOLDNESS:
297 case SV_POTION_RESIST_HEAT:
298 case SV_POTION_RESIST_COLD:
299 case SV_POTION_HEROISM:
300 case SV_POTION_BESERK_STRENGTH:
301 case SV_POTION_RES_STR:
302 case SV_POTION_RES_INT:
303 case SV_POTION_RES_WIS:
304 case SV_POTION_RES_DEX:
305 case SV_POTION_RES_CON:
306 case SV_POTION_RES_CHR:
307 case SV_POTION_INC_STR:
308 case SV_POTION_INC_INT:
309 case SV_POTION_INC_WIS:
310 case SV_POTION_INC_DEX:
311 case SV_POTION_INC_CON:
312 case SV_POTION_INC_CHR:
313 case SV_POTION_AUGMENTATION:
314 case SV_POTION_ENLIGHTENMENT:
315 case SV_POTION_STAR_ENLIGHTENMENT:
316 case SV_POTION_SELF_KNOWLEDGE:
317 case SV_POTION_EXPERIENCE:
318 case SV_POTION_RESISTANCE:
319 case SV_POTION_INVULNERABILITY:
320 case SV_POTION_NEW_LIFE:
321 /* All of the above potions have no effect when shattered */
323 case SV_POTION_SLOWNESS:
328 case SV_POTION_POISON:
333 case SV_POTION_BLINDNESS:
337 case SV_POTION_BOOZE:
341 case SV_POTION_SLEEP:
345 case SV_POTION_RUINATION:
346 case SV_POTION_DETONATIONS:
348 dam = damroll(25, 25);
351 case SV_POTION_DEATH:
353 dam = k_ptr->level * 10;
357 case SV_POTION_SPEED:
360 case SV_POTION_CURE_LIGHT:
364 case SV_POTION_CURE_SERIOUS:
368 case SV_POTION_CURE_CRITICAL:
369 case SV_POTION_CURING:
373 case SV_POTION_HEALING:
375 dam = damroll(10, 10);
377 case SV_POTION_RESTORE_EXP:
384 dam = damroll(50, 50);
387 case SV_POTION_STAR_HEALING:
389 dam = damroll(50, 50);
392 case SV_POTION_RESTORE_MANA:
394 dam = damroll(10, 10);
401 (void)project(owner_ptr, who, radius, y, x, dam, dt, (PROJECT_JUMP | PROJECT_ITEM | PROJECT_KILL), -1);
406 * @brief 矢弾を射撃した場合の破損確率を返す /
407 * Determines the odds of an object breaking when thrown at a monster
408 * @param o_ptr 矢弾のオブジェクト構造体参照ポインタ
411 * Note that artifacts never break, see the "drop_near()" function.
413 PERCENTAGE breakage_chance(player_type *owner_ptr, object_type *o_ptr, bool has_archer_bonus, SPELL_IDX snipe_type)
415 /* Examine the snipe type */
418 if (snipe_type == SP_KILL_WALL) return 100;
419 if (snipe_type == SP_EXPLODE) return 100;
420 if (snipe_type == SP_PIERCE) return 100;
421 if (snipe_type == SP_FINAL) return 100;
422 if (snipe_type == SP_NEEDLE) return 100;
423 if (snipe_type == SP_EVILNESS) return 40;
424 if (snipe_type == SP_HOLYNESS) return 40;
427 /* Examine the item type */
428 PERCENTAGE archer_bonus = (has_archer_bonus ? (PERCENTAGE)(owner_ptr->lev - 1) / 7 + 4 : 0);
445 /* Sometimes break */
450 return 20 - archer_bonus * 2;
455 return 10 - archer_bonus;