OSDN Git Service

[Refactor] #37353 targeting.h と japanese.h コミットし忘れ修正.
[hengband/hengband.git] / src / rumor.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "files.h"
5 #include "object-flavor.h"
6 #include "artifact.h"
7 #include "dungeon.h"
8 #include "monsterrace.h"
9 #include "floor-town.h"
10
11 /*
12  * Display a rumor and apply its effects
13  */
14
15 IDX rumor_num(char *zz, IDX max_idx)
16 {
17         if (strcmp(zz, "*") == 0) return randint1(max_idx - 1);
18         return (IDX)atoi(zz);
19 }
20
21 concptr rumor_bind_name(char *base, concptr fullname)
22 {
23         char *s, *v;
24
25         s = strstr(base, "{Name}");
26         if (s)
27         {
28                 s[0] = '\0';
29                 v = format("%s%s%s", base, fullname, (s + 6));
30         }
31         else
32         {
33                 v = base;
34         }
35
36         return v;
37 }
38
39 void display_rumor(bool ex)
40 {
41         errr err;
42         int section = 0;
43         char Rumor[1024];
44
45         if (ex)
46         {
47                 if (randint0(3) == 0) section = 1;
48         }
49
50         err = _(get_rnd_line_jonly("rumors_j.txt", section, Rumor, 10),
51                 get_rnd_line("rumors.txt", section, Rumor));
52         if (err) strcpy(Rumor, _("嘘の噂もある。", "Some rumors are wrong."));
53
54         err = TRUE;
55
56         if (strncmp(Rumor, "R:", 2) == 0)
57         {
58                 char *zz[4];
59                 concptr rumor_msg = NULL;
60                 concptr rumor_eff_format = NULL;
61                 char fullname[1024] = "";
62
63                 if (tokenize(Rumor + 2, 3, zz, TOKENIZE_CHECKQUOTE) == 3)
64                 {
65                         if (strcmp(zz[0], "ARTIFACT") == 0)
66                         {
67                                 IDX a_idx, k_idx;
68                                 object_type forge;
69                                 object_type *q_ptr = &forge;
70                                 artifact_type *a_ptr;
71
72                                 while (1)
73                                 {
74                                         a_idx = rumor_num(zz[1], max_a_idx);
75
76                                         a_ptr = &a_info[a_idx];
77                                         if (a_ptr->name) break;
78                                 }
79
80                                 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
81                                 object_prep(q_ptr, k_idx);
82                                 q_ptr->name1 = a_idx;
83                                 q_ptr->ident = IDENT_STORE;
84                                 object_desc(fullname, q_ptr, OD_NAME_ONLY);
85                         }
86                         else if (strcmp(zz[0], "MONSTER") == 0)
87                         {
88                                 MONRACE_IDX r_idx;
89                                 monster_race *r_ptr;
90
91                                 while (1)
92                                 {
93                                         r_idx = rumor_num(zz[1], max_r_idx);
94                                         r_ptr = &r_info[r_idx];
95                                         if (r_ptr->name) break;
96                                 }
97
98                                 strcpy(fullname, r_name + r_ptr->name);
99
100                                 /* Remember this monster */
101                                 if (!r_ptr->r_sights)
102                                 {
103                                         r_ptr->r_sights++;
104                                 }
105                         }
106                         else if (strcmp(zz[0], "DUNGEON") == 0)
107                         {
108                                 DUNGEON_IDX d_idx;
109                                 dungeon_type *d_ptr;
110
111                                 while (1)
112                                 {
113                                         d_idx = rumor_num(zz[1], max_d_idx);
114                                         d_ptr = &d_info[d_idx];
115                                         if (d_ptr->name) break;
116                                 }
117
118                                 strcpy(fullname, d_name + d_ptr->name);
119
120                                 if (!max_dlv[d_idx])
121                                 {
122                                         max_dlv[d_idx] = d_ptr->mindepth;
123                                         rumor_eff_format = _("%sに帰還できるようになった。", "You can recall to %s.");
124                                 }
125                         }
126                         else if (strcmp(zz[0], "TOWN") == 0)
127                         {
128                                 IDX t_idx;
129                                 s32b visit;
130
131                                 while (1)
132                                 {
133                                         t_idx = rumor_num(zz[1], NO_TOWN);
134                                         if (town_info[t_idx].name) break;
135                                 }
136
137                                 strcpy(fullname, town_info[t_idx].name);
138
139                                 visit = (1L << (t_idx - 1));
140                                 if ((t_idx != SECRET_TOWN) && !(p_ptr->visit & visit))
141                                 {
142                                         p_ptr->visit |= visit;
143                                         rumor_eff_format = _("%sに行ったことがある気がする。", "You feel you have been to %s.");
144                                 }
145                         }
146
147                         rumor_msg = rumor_bind_name(zz[2], fullname);
148                         msg_print(rumor_msg);
149                         if (rumor_eff_format)
150                         {
151                                 msg_print(NULL);
152                                 msg_format(rumor_eff_format, fullname);
153                         }
154                         err = FALSE;
155                 }
156                 /* error */
157                 if (err) msg_print(_("この情報は間違っている。", "This information is wrong."));
158         }
159         else
160         {
161                 msg_format("%s", Rumor);
162         }
163 }