OSDN Git Service

[Refactor] #37353 使われていないVERIFY_SAVEFILEを削除 / Removed unused preprocessors VERIFY_SAV...
[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         s = strstr(base, "{Name}");
27         if (s)
28         {
29                 s[0] = '\0';
30                 v = format("%s%s%s", base, fullname, (s + 6));
31                 return v;
32         }
33
34         v = base;
35         return v;
36 }
37
38 void display_rumor(player_type *player_ptr, bool ex)
39 {
40         char rumor[1024];
41         int section = (ex && (randint0(3) == 0)) ? 1 : 0;
42         errr 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         if (strncmp(rumor, "R:", 2) != 0)
47         {
48                 msg_format("%s", rumor);
49                 return;
50         }
51
52         char *zz[4];
53         if (tokenize(rumor + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3)
54         {
55                 msg_print(_("この情報は間違っている。", "This information is wrong."));
56                 return;
57         }
58
59         concptr rumor_eff_format = NULL;
60         char fullname[1024] = "";
61         if (strcmp(zz[0], "ARTIFACT") == 0)
62         {
63                 ARTIFACT_IDX a_idx;
64                 artifact_type *a_ptr;
65                 while (TRUE)
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                 KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
74                 object_type forge;
75                 object_type *q_ptr = &forge;
76                 object_prep(q_ptr, k_idx);
77                 q_ptr->name1 = a_idx;
78                 q_ptr->ident = IDENT_STORE;
79                 object_desc(player_ptr, fullname, q_ptr, OD_NAME_ONLY);
80         }
81         else if (strcmp(zz[0], "MONSTER") == 0)
82         {
83                 monster_race *r_ptr;
84                 while (TRUE)
85                 {
86                         MONRACE_IDX 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                 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                 while (TRUE)
103                 {
104                         d_idx = rumor_num(zz[1], current_world_ptr->max_d_idx);
105                         d_ptr = &d_info[d_idx];
106                         if (d_ptr->name) break;
107                 }
108
109                 strcpy(fullname, d_name + d_ptr->name);
110
111                 if (!max_dlv[d_idx])
112                 {
113                         max_dlv[d_idx] = d_ptr->mindepth;
114                         rumor_eff_format = _("%sに帰還できるようになった。", "You can recall to %s.");
115                 }
116         }
117         else if (strcmp(zz[0], "TOWN") == 0)
118         {
119                 IDX t_idx;
120                 while (TRUE)
121                 {
122                         t_idx = rumor_num(zz[1], NO_TOWN);
123                         if (town_info[t_idx].name) break;
124                 }
125
126                 strcpy(fullname, town_info[t_idx].name);
127
128                 s32b visit = (1L << (t_idx - 1));
129                 if ((t_idx != SECRET_TOWN) && !(player_ptr->visit & visit))
130                 {
131                         player_ptr->visit |= visit;
132                         rumor_eff_format = _("%sに行ったことがある気がする。", "You feel you have been to %s.");
133                 }
134         }
135
136         concptr rumor_msg = rumor_bind_name(zz[2], fullname);
137         msg_print(rumor_msg);
138         if (rumor_eff_format)
139         {
140                 msg_print(NULL);
141                 msg_format(rumor_eff_format, fullname);
142         }
143 }