OSDN Git Service

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