OSDN Git Service

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