OSDN Git Service

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