1 #include "permanent-resistances.h"
2 #include "player-personality.h"
6 * @brief プレーヤーの職業による耐性フラグを返す
7 * @param creature_ptr プレーヤーへの参照ポインタ
8 * @param flags 耐性フラグの配列
11 static void add_class_flags(player_type *creature_ptr, BIT_FLAGS *flags)
13 switch (creature_ptr->pclass)
17 if (creature_ptr->lev > 29)
18 add_flag(flags, TR_RES_FEAR);
19 if (creature_ptr->lev > 44)
20 add_flag(flags, TR_REGEN);
26 if (creature_ptr->lev > 29)
27 add_flag(flags, TR_RES_FEAR);
33 if (creature_ptr->lev > 39)
34 add_flag(flags, TR_RES_FEAR);
38 case CLASS_CHAOS_WARRIOR:
40 if (creature_ptr->lev > 29)
41 add_flag(flags, TR_RES_CHAOS);
42 if (creature_ptr->lev > 39)
43 add_flag(flags, TR_RES_FEAR);
48 case CLASS_FORCETRAINER:
50 if ((creature_ptr->lev > 9) && !heavy_armor(creature_ptr))
51 add_flag(flags, TR_SPEED);
52 if ((creature_ptr->lev > 24) && !heavy_armor(creature_ptr))
53 add_flag(flags, TR_FREE_ACT);
59 if (heavy_armor(creature_ptr))
61 add_flag(flags, TR_SPEED);
65 if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || creature_ptr->migite) &&
66 (!creature_ptr->inventory_list[INVEN_LARM].k_idx || creature_ptr->hidarite))
67 add_flag(flags, TR_SPEED);
68 if (creature_ptr->lev > 24)
69 add_flag(flags, TR_FREE_ACT);
72 add_flag(flags, TR_SLOW_DIGEST);
73 add_flag(flags, TR_RES_FEAR);
74 if (creature_ptr->lev > 19)
75 add_flag(flags, TR_RES_POIS);
76 if (creature_ptr->lev > 24)
77 add_flag(flags, TR_SUST_DEX);
78 if (creature_ptr->lev > 29)
79 add_flag(flags, TR_SEE_INVIS);
83 case CLASS_MINDCRAFTER:
85 if (creature_ptr->lev > 9)
86 add_flag(flags, TR_RES_FEAR);
87 if (creature_ptr->lev > 19)
88 add_flag(flags, TR_SUST_WIS);
89 if (creature_ptr->lev > 29)
90 add_flag(flags, TR_RES_CONF);
91 if (creature_ptr->lev > 39)
92 add_flag(flags, TR_TELEPATHY);
98 add_flag(flags, TR_RES_SOUND);
101 case CLASS_BERSERKER:
103 add_flag(flags, TR_SUST_STR);
104 add_flag(flags, TR_SUST_DEX);
105 add_flag(flags, TR_SUST_CON);
106 add_flag(flags, TR_REGEN);
107 add_flag(flags, TR_FREE_ACT);
108 add_flag(flags, TR_SPEED);
109 if (creature_ptr->lev > 39)
110 add_flag(flags, TR_REFLECT);
114 case CLASS_MIRROR_MASTER:
116 if (creature_ptr->lev > 39)
117 add_flag(flags, TR_REFLECT);
128 * @brief 特定の種族に擬態中の耐性フラグを返す
129 * @param creature_ptr プレーヤーへの参照ポインタ
130 * @param flags 耐性フラグの配列
133 static void add_mimic_form_flags(player_type *creature_ptr, BIT_FLAGS *flags)
135 switch (creature_ptr->mimic_form)
138 add_flag(flags, TR_HOLD_EXP);
139 add_flag(flags, TR_RES_CHAOS);
140 add_flag(flags, TR_RES_NETHER);
141 add_flag(flags, TR_RES_FIRE);
142 add_flag(flags, TR_SEE_INVIS);
143 add_flag(flags, TR_SPEED);
145 case MIMIC_DEMON_LORD:
146 add_flag(flags, TR_HOLD_EXP);
147 add_flag(flags, TR_RES_CHAOS);
148 add_flag(flags, TR_RES_NETHER);
149 add_flag(flags, TR_RES_FIRE);
150 add_flag(flags, TR_RES_COLD);
151 add_flag(flags, TR_RES_ELEC);
152 add_flag(flags, TR_RES_ACID);
153 add_flag(flags, TR_RES_POIS);
154 add_flag(flags, TR_RES_CONF);
155 add_flag(flags, TR_RES_DISEN);
156 add_flag(flags, TR_RES_NEXUS);
157 add_flag(flags, TR_RES_FEAR);
158 add_flag(flags, TR_IM_FIRE);
159 add_flag(flags, TR_SH_FIRE);
160 add_flag(flags, TR_SEE_INVIS);
161 add_flag(flags, TR_TELEPATHY);
162 add_flag(flags, TR_LEVITATION);
163 add_flag(flags, TR_SPEED);
166 add_flag(flags, TR_HOLD_EXP);
167 add_flag(flags, TR_RES_DARK);
168 add_flag(flags, TR_RES_NETHER);
169 if (creature_ptr->pclass != CLASS_NINJA)
170 add_flag(flags, TR_LITE_1);
171 add_flag(flags, TR_RES_POIS);
172 add_flag(flags, TR_RES_COLD);
173 add_flag(flags, TR_SEE_INVIS);
174 add_flag(flags, TR_SPEED);
181 * @brief 種族ベースの耐性フラグを返す
182 * @param creature_ptr プレーヤーへの参照ポインタ
183 * @param flags 耐性フラグの配列
186 static void add_race_flags(player_type *creature_ptr, BIT_FLAGS *flags)
188 switch (creature_ptr->prace)
192 add_flag(flags, TR_RES_LITE);
197 add_flag(flags, TR_HOLD_EXP);
202 add_flag(flags, TR_FREE_ACT);
207 add_flag(flags, TR_RES_BLIND);
212 add_flag(flags, TR_RES_DARK);
215 case RACE_HALF_TROLL:
217 add_flag(flags, TR_SUST_STR);
218 if (creature_ptr->lev <= 14)
221 add_flag(flags, TR_REGEN);
222 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_BERSERKER))
223 add_flag(flags, TR_SLOW_DIGEST);
229 add_flag(flags, TR_SUST_CON);
230 add_flag(flags, TR_REGEN);
235 add_flag(flags, TR_RES_LITE);
236 add_flag(flags, TR_SEE_INVIS);
241 add_flag(flags, TR_RES_FEAR);
246 add_flag(flags, TR_SUST_STR);
247 add_flag(flags, TR_RES_DARK);
250 case RACE_HALF_GIANT:
252 add_flag(flags, TR_RES_SHARDS);
253 add_flag(flags, TR_SUST_STR);
256 case RACE_HALF_TITAN:
258 add_flag(flags, TR_RES_CHAOS);
263 add_flag(flags, TR_RES_SOUND);
268 add_flag(flags, TR_RES_ACID);
269 if (creature_ptr->lev > 19)
270 add_flag(flags, TR_IM_ACID);
276 add_flag(flags, TR_RES_CONF);
277 add_flag(flags, TR_RES_ACID);
278 if (creature_ptr->lev > 9)
279 add_flag(flags, TR_SPEED);
285 add_flag(flags, TR_RES_POIS);
290 add_flag(flags, TR_RES_DISEN);
291 add_flag(flags, TR_RES_DARK);
296 add_flag(flags, TR_RES_DARK);
297 if (creature_ptr->lev > 19)
298 add_flag(flags, TR_SEE_INVIS);
304 add_flag(flags, TR_LEVITATION);
305 if (creature_ptr->lev > 4)
306 add_flag(flags, TR_RES_FIRE);
307 if (creature_ptr->lev > 9)
308 add_flag(flags, TR_RES_COLD);
309 if (creature_ptr->lev > 14)
310 add_flag(flags, TR_RES_ACID);
311 if (creature_ptr->lev > 19)
312 add_flag(flags, TR_RES_ELEC);
313 if (creature_ptr->lev > 34)
314 add_flag(flags, TR_RES_POIS);
318 case RACE_MIND_FLAYER:
320 add_flag(flags, TR_SUST_INT);
321 add_flag(flags, TR_SUST_WIS);
322 if (creature_ptr->lev > 14)
323 add_flag(flags, TR_SEE_INVIS);
324 if (creature_ptr->lev > 29)
325 add_flag(flags, TR_TELEPATHY);
331 add_flag(flags, TR_RES_FIRE);
332 if (creature_ptr->lev > 9)
333 add_flag(flags, TR_SEE_INVIS);
338 add_flag(flags, TR_SEE_INVIS);
339 add_flag(flags, TR_FREE_ACT);
340 add_flag(flags, TR_RES_POIS);
341 add_flag(flags, TR_SLOW_DIGEST);
342 if (creature_ptr->lev > 34)
343 add_flag(flags, TR_HOLD_EXP);
349 add_flag(flags, TR_SEE_INVIS);
350 add_flag(flags, TR_RES_SHARDS);
351 add_flag(flags, TR_HOLD_EXP);
352 add_flag(flags, TR_RES_POIS);
353 if (creature_ptr->lev > 9)
354 add_flag(flags, TR_RES_COLD);
360 add_flag(flags, TR_SEE_INVIS);
361 add_flag(flags, TR_HOLD_EXP);
362 add_flag(flags, TR_RES_NETHER);
363 add_flag(flags, TR_RES_POIS);
364 add_flag(flags, TR_SLOW_DIGEST);
365 if (creature_ptr->lev > 4)
366 add_flag(flags, TR_RES_COLD);
372 add_flag(flags, TR_HOLD_EXP);
373 add_flag(flags, TR_RES_DARK);
374 add_flag(flags, TR_RES_NETHER);
375 if (creature_ptr->pclass != CLASS_NINJA)
376 add_flag(flags, TR_LITE_1);
378 add_flag(flags, TR_RES_POIS);
379 add_flag(flags, TR_RES_COLD);
384 add_flag(flags, TR_LEVITATION);
385 add_flag(flags, TR_FREE_ACT);
386 add_flag(flags, TR_RES_COLD);
387 add_flag(flags, TR_SEE_INVIS);
388 add_flag(flags, TR_HOLD_EXP);
389 add_flag(flags, TR_RES_NETHER);
390 add_flag(flags, TR_RES_POIS);
391 add_flag(flags, TR_SLOW_DIGEST);
392 if (creature_ptr->lev > 34)
393 add_flag(flags, TR_TELEPATHY);
399 add_flag(flags, TR_RES_LITE);
400 add_flag(flags, TR_LEVITATION);
401 if (creature_ptr->lev > 9)
402 add_flag(flags, TR_SPEED);
408 add_flag(flags, TR_RES_SOUND);
409 add_flag(flags, TR_RES_CONF);
414 add_flag(flags, TR_LEVITATION);
415 add_flag(flags, TR_SEE_INVIS);
420 add_flag(flags, TR_RES_FIRE);
421 add_flag(flags, TR_RES_NETHER);
422 add_flag(flags, TR_HOLD_EXP);
423 if (creature_ptr->lev > 9)
424 add_flag(flags, TR_SEE_INVIS);
430 add_flag(flags, TR_SUST_CON);
435 add_flag(flags, TR_LEVITATION);
440 add_flag(flags, TR_RES_CONF);
445 add_flag(flags, TR_FREE_ACT);
446 add_flag(flags, TR_RES_POIS);
447 add_flag(flags, TR_SLOW_DIGEST);
448 add_flag(flags, TR_HOLD_EXP);
458 * @brief 突然変異による耐性フラグを返す
459 * @param creature_ptr プレーヤーへの参照ポインタ
460 * @param flags 耐性フラグの配列
463 static void add_mutation_flags(player_type *creature_ptr, BIT_FLAGS *flags)
465 if (creature_ptr->muta3 == 0) return;
467 if (creature_ptr->muta3 & MUT3_FLESH_ROT)
468 remove_flag(flags, TR_REGEN);
469 if ((creature_ptr->muta3 & MUT3_XTRA_FAT) ||
470 (creature_ptr->muta3 & MUT3_XTRA_LEGS) ||
471 (creature_ptr->muta3 & MUT3_SHORT_LEG))
472 add_flag(flags, TR_SPEED);
473 if (creature_ptr->muta3 & MUT3_ELEC_TOUC)
474 add_flag(flags, TR_SH_ELEC);
475 if (creature_ptr->muta3 & MUT3_FIRE_BODY)
477 add_flag(flags, TR_SH_FIRE);
478 add_flag(flags, TR_LITE_1);
481 if (creature_ptr->muta3 & MUT3_WINGS)
482 add_flag(flags, TR_LEVITATION);
483 if (creature_ptr->muta3 & MUT3_FEARLESS)
484 add_flag(flags, TR_RES_FEAR);
485 if (creature_ptr->muta3 & MUT3_REGEN)
486 add_flag(flags, TR_REGEN);
487 if (creature_ptr->muta3 & MUT3_ESP)
488 add_flag(flags, TR_TELEPATHY);
489 if (creature_ptr->muta3 & MUT3_MOTION)
490 add_flag(flags, TR_FREE_ACT);
495 * @brief 性格による耐性フラグを返す
496 * @param creature_ptr プレーヤーへの参照ポインタ
497 * @param flags 耐性フラグの配列
500 static void add_personality_flags(player_type *creature_ptr, BIT_FLAGS *flags)
502 if (creature_ptr->pseikaku == SEIKAKU_SEXY)
503 add_flag(flags, TR_AGGRAVATE);
504 if (creature_ptr->pseikaku == SEIKAKU_CHARGEMAN)
505 add_flag(flags, TR_RES_CONF);
507 if (creature_ptr->pseikaku != SEIKAKU_MUNCHKIN) return;
509 add_flag(flags, TR_RES_BLIND);
510 add_flag(flags, TR_RES_CONF);
511 add_flag(flags, TR_HOLD_EXP);
512 if (creature_ptr->pclass != CLASS_NINJA)
513 add_flag(flags, TR_LITE_1);
514 if (creature_ptr->lev > 9)
515 add_flag(flags, TR_SPEED);
520 * @brief 剣術家の型による耐性フラグを返す
521 * @param creature_ptr プレーヤーへの参照ポインタ
522 * @param flags 耐性フラグの配列
525 static void add_kata_flags(player_type *creature_ptr, BIT_FLAGS *flags)
527 if (creature_ptr->special_defense & KATA_FUUJIN)
528 add_flag(flags, TR_REFLECT);
529 if (creature_ptr->special_defense & KAMAE_GENBU)
530 add_flag(flags, TR_REFLECT);
531 if (creature_ptr->special_defense & KAMAE_SUZAKU)
532 add_flag(flags, TR_LEVITATION);
533 if (creature_ptr->special_defense & KAMAE_SEIRYU)
535 add_flag(flags, TR_RES_FIRE);
536 add_flag(flags, TR_RES_COLD);
537 add_flag(flags, TR_RES_ACID);
538 add_flag(flags, TR_RES_ELEC);
539 add_flag(flags, TR_RES_POIS);
540 add_flag(flags, TR_LEVITATION);
541 add_flag(flags, TR_SH_FIRE);
542 add_flag(flags, TR_SH_ELEC);
543 add_flag(flags, TR_SH_COLD);
546 if ((creature_ptr->special_defense & KATA_MUSOU) == 0) return;
548 add_flag(flags, TR_RES_FEAR);
549 add_flag(flags, TR_RES_LITE);
550 add_flag(flags, TR_RES_DARK);
551 add_flag(flags, TR_RES_BLIND);
552 add_flag(flags, TR_RES_CONF);
553 add_flag(flags, TR_RES_SOUND);
554 add_flag(flags, TR_RES_SHARDS);
555 add_flag(flags, TR_RES_NETHER);
556 add_flag(flags, TR_RES_NEXUS);
557 add_flag(flags, TR_RES_CHAOS);
558 add_flag(flags, TR_RES_DISEN);
559 add_flag(flags, TR_REFLECT);
560 add_flag(flags, TR_HOLD_EXP);
561 add_flag(flags, TR_FREE_ACT);
562 add_flag(flags, TR_SH_FIRE);
563 add_flag(flags, TR_SH_ELEC);
564 add_flag(flags, TR_SH_COLD);
565 add_flag(flags, TR_LEVITATION);
566 add_flag(flags, TR_LITE_1);
567 add_flag(flags, TR_SEE_INVIS);
568 add_flag(flags, TR_TELEPATHY);
569 add_flag(flags, TR_SLOW_DIGEST);
570 add_flag(flags, TR_REGEN);
571 add_flag(flags, TR_SUST_STR);
572 add_flag(flags, TR_SUST_INT);
573 add_flag(flags, TR_SUST_WIS);
574 add_flag(flags, TR_SUST_DEX);
575 add_flag(flags, TR_SUST_CON);
576 add_flag(flags, TR_SUST_CHR);
581 * @brief プレイヤーの職業、種族に応じた耐性フラグを返す
582 * Prints ratings on certain abilities
583 * @param creature_ptr 参照元クリーチャーポインタ
584 * @param flags フラグを保管する配列
587 * Obtain the "flags" for the player as if he was an item
589 * xtra1.c周りと多重実装になっているのを何とかする
591 void player_flags(player_type *creature_ptr, BIT_FLAGS *flags)
593 for (int i = 0; i < TR_FLAG_SIZE; i++)
596 add_class_flags(creature_ptr, flags);
597 void(*race_flags_func)(player_type*, BIT_FLAGS*) = creature_ptr->mimic_form
598 ? add_mimic_form_flags
600 (*race_flags_func)(creature_ptr, flags);
602 add_mutation_flags(creature_ptr, flags);
603 add_personality_flags(creature_ptr, flags);
604 add_kata_flags(creature_ptr, flags);