OSDN Git Service

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