OSDN Git Service

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