OSDN Git Service

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