OSDN Git Service

[fix] #41503 超能力者でゲームを開始しようとするとクラッシュ
[hengband/hengband.git] / src / view / display-lore-attacks.c
1 #include "view/display-lore-attacks.h"
2 #include "lore/combat-types-setter.h"
3 #include "lore/lore-calculator.h"
4 #include "monster-attack/monster-attack-types.h"
5 #include "monster-race/race-flags1.h"
6 #ifdef JP
7 #include "locale/japanese.h"
8 #endif
9
10 #ifdef JP
11 static void display_monster_blows_jp(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
12 {
13     if (attack_numbers == 0) {
14         hooked_roff(format("%^sは", wd_he[lore_ptr->msex]));
15     }
16
17     if (d1 && d2 && (lore_ptr->know_everything || know_damage(lore_ptr->r_idx, m))) {
18         hooked_roff(format(" %dd%d ", d1, d2));
19         hooked_roff("のダメージで");
20     }
21
22     if (!lore_ptr->p)
23         lore_ptr->p = "何か奇妙なことをする";
24
25     /* XXしてYYし/XXしてYYする/XXし/XXする */
26     if (lore_ptr->q != NULL)
27         jverb(lore_ptr->p, lore_ptr->jverb_buf, JVERB_TO);
28     else if (attack_numbers != lore_ptr->count - 1)
29         jverb(lore_ptr->p, lore_ptr->jverb_buf, JVERB_AND);
30     else
31         strcpy(lore_ptr->jverb_buf, lore_ptr->p);
32
33     hooked_roff(lore_ptr->jverb_buf);
34     if (lore_ptr->q) {
35         if (attack_numbers != lore_ptr->count - 1)
36             jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
37         else
38             strcpy(lore_ptr->jverb_buf, lore_ptr->q);
39         hooked_roff(lore_ptr->jverb_buf);
40     }
41
42     if (attack_numbers != lore_ptr->count - 1)
43         hooked_roff("、");
44 }
45 #else
46
47 static void display_monster_blows_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
48 {
49     if (attack_numbers == 0) {
50         hooked_roff(format("%^s can ", wd_he[lore_ptr->msex]));
51     } else if (attack_numbers < lore_ptr->count - 1) {
52         hooked_roff(", ");
53     } else {
54         hooked_roff(", and ");
55     }
56
57     if (lore_ptr->p == NULL)
58         lore_ptr->p = "do something weird";
59
60     hooked_roff(lore_ptr->p);
61     if (lore_ptr->q != NULL) {
62         hooked_roff(" to ");
63         hooked_roff(lore_ptr->q);
64         if (d1 && d2 && (lore_ptr->know_everything || know_damage(lore_ptr->r_idx, m))) {
65             hooked_roff(" with damage");
66             hooked_roff(format(" %dd%d", d1, d2));
67         }
68     }
69 }
70 #endif
71
72 void display_monster_blows(lore_type *lore_ptr, int m, int attack_numbers)
73 {
74     int d1 = lore_ptr->r_ptr->blow[m].d_dice;
75     int d2 = lore_ptr->r_ptr->blow[m].d_side;
76     void (*display_monster_blows_pf)(lore_type *, int, int, int, int) = _(display_monster_blows_jp, display_monster_blows_en);
77     (*display_monster_blows_pf)(lore_ptr, attack_numbers, d1, d2, m);
78 }
79
80 void display_monster_attacks(lore_type *lore_ptr)
81 {
82     const int max_attack_numbers = 4;
83     for (int m = 0; m < max_attack_numbers; m++) {
84         if (!lore_ptr->r_ptr->blow[m].method || (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT))
85             continue;
86
87         if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
88             lore_ptr->count++;
89     }
90
91     int attack_numbers = 0;
92     for (int m = 0; m < max_attack_numbers; m++) {
93         if (!lore_ptr->r_ptr->blow[m].method || (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT)
94             || (((lore_ptr->r_ptr->r_blows[m] == 0) && !lore_ptr->know_everything)))
95             continue;
96
97         set_monster_blow_method(lore_ptr, m);
98         set_monster_blow_effect(lore_ptr, m);
99         display_monster_blows(lore_ptr, m, attack_numbers);
100         attack_numbers++;
101     }
102
103     if (attack_numbers > 0) {
104         hooked_roff(_("。", ".  "));
105     } else if (lore_ptr->flags1 & RF1_NEVER_BLOW) {
106         hooked_roff(format(_("%^sは物理的な攻撃方法を持たない。", "%^s has no physical attacks.  "), wd_he[lore_ptr->msex]));
107     } else {
108         hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack.  "), wd_his[lore_ptr->msex]));
109     }
110 }