… | |
… | |
29 | #include <rproto.h> |
29 | #include <rproto.h> |
30 | #include <sproto.h> |
30 | #include <sproto.h> |
31 | |
31 | |
32 | #define CEDE coroapi::cede_to_tick () |
32 | #define CEDE coroapi::cede_to_tick () |
33 | |
33 | |
34 | noinline SV * |
34 | random_map_params::random_map_params () |
35 | random_map_params::get_sv (const char *option) const |
|
|
36 | { |
35 | { |
37 | SV **he = hv_fetch (hv, option, strlen (option), 0); |
36 | hv = newHV (); |
38 | |
|
|
39 | return he ? *he : 0; |
|
|
40 | } |
37 | } |
41 | |
38 | |
42 | noinline const_utf8_string |
39 | random_map_params::random_map_params (HV *hv) |
43 | random_map_params::get_str (const char *option, const_utf8_string fallback) const |
|
|
44 | { |
40 | { |
45 | SV *sv = get_sv (option); |
41 | this->hv = (HV *)SvREFCNT_inc_NN ((SV *)hv); |
46 | return sv ? cfSvPVutf8_nolen (sv) : fallback; |
|
|
47 | } |
|
|
48 | |
42 | |
49 | noinline IV |
43 | assign (wall_name, get_str ("wall_name")); |
50 | random_map_params::get_iv (const char *option, IV fallback) const |
|
|
51 | { |
|
|
52 | SV *sv = get_sv (option); |
|
|
53 | return sv ? SvIV (sv) : fallback; |
|
|
54 | } |
|
|
55 | |
44 | |
56 | noinline UV |
45 | xsize = get_iv ("xsize"); |
57 | random_map_params::get_uv (const char *option, UV fallback) const |
46 | ysize = get_iv ("ysize"); |
58 | { |
47 | expand2x = get_iv ("expand2x"); |
59 | SV *sv = get_sv (option); |
48 | layoutoptions1 = get_iv ("layoutoptions1"); |
60 | return sv ? SvUV (sv) : fallback; |
49 | layoutoptions2 = get_iv ("layoutoptions2"); |
|
|
50 | layoutoptions3 = get_iv ("layoutoptions3"); |
|
|
51 | symmetry = get_iv ("symmetry"); |
|
|
52 | difficulty = get_iv ("difficulty"); |
|
|
53 | difficulty_given = get_iv ("difficulty_given"); |
|
|
54 | difficulty_increase = get_nv ("difficulty_increase"); |
|
|
55 | dungeon_level = get_iv ("dungeon_level"); |
|
|
56 | dungeon_depth = get_iv ("dungeon_depth"); |
|
|
57 | orientation = get_iv ("orientation"); |
|
|
58 | random_seed = get_uv ("random_seed"); |
|
|
59 | total_map_hp = get_nv ("total_map_hp"); // actually val64, but I am too lazy |
|
|
60 | map_layout_style = get_iv ("map_layout_style"); |
|
|
61 | symmetry_used = get_iv ("symmetry_used"); |
61 | } |
62 | } |
62 | |
63 | |
63 | noinline NV |
64 | random_map_params::~random_map_params () |
64 | random_map_params::get_nv (const char *option, NV fallback) const |
|
|
65 | { |
65 | { |
66 | SV *sv = get_sv (option); |
|
|
67 | return sv ? SvNV (sv) : fallback; |
|
|
68 | } |
|
|
69 | |
|
|
70 | noinline void |
|
|
71 | random_map_params::set (const char *option, SV *value) const |
|
|
72 | { |
|
|
73 | int len = strlen (option); |
|
|
74 | |
|
|
75 | if (value) |
|
|
76 | hv_store (hv, option, len, value, 0); |
|
|
77 | else |
|
|
78 | hv_delete (hv, option, len, G_DISCARD); |
|
|
79 | } |
|
|
80 | |
|
|
81 | noinline void |
|
|
82 | random_map_params::set (const char *option, const_utf8_string value) const |
|
|
83 | { |
|
|
84 | set (option, value && *value ? newSVpvn_utf8 (value, strlen (value), 1) : 0); |
|
|
85 | } |
|
|
86 | |
|
|
87 | void |
|
|
88 | random_map_params::set (const char *option, IV value) const |
|
|
89 | { |
|
|
90 | set (option, newSViv (value)); |
|
|
91 | } |
|
|
92 | |
|
|
93 | void |
|
|
94 | random_map_params::set (const char *option, UV value) const |
|
|
95 | { |
|
|
96 | set (option, newSVuv (value)); |
|
|
97 | } |
|
|
98 | |
|
|
99 | void |
|
|
100 | random_map_params::set (const char *option, NV value) const |
|
|
101 | { |
|
|
102 | set (option, newSVnv (value)); |
|
|
103 | } |
|
|
104 | |
|
|
105 | void |
|
|
106 | random_map_params::hv_clone () |
|
|
107 | { |
|
|
108 | HV *copy = newHV (); |
|
|
109 | |
|
|
110 | hv_iterinit (hv); |
|
|
111 | |
|
|
112 | // does not work for utf-8 keys |
|
|
113 | while (HE *he = hv_iternext (hv)) |
|
|
114 | { |
|
|
115 | STRLEN klen; const char *key = HePV (he, klen); |
|
|
116 | hv_store (copy, key, klen, newSVsv (HeVAL (he)), HeHASH (he)); |
|
|
117 | } |
|
|
118 | |
|
|
119 | SvREFCNT_dec (hv); |
66 | SvREFCNT_dec (hv); |
120 | hv = copy; |
|
|
121 | } |
67 | } |
122 | |
68 | |
123 | shstr_tmp |
69 | shstr_tmp |
124 | random_map_params::as_shstr () const |
70 | random_map_params::as_shstr () const |
125 | { |
71 | { |
… | |
… | |
152 | } |
98 | } |
153 | |
99 | |
154 | return shstr (buf); |
100 | return shstr (buf); |
155 | } |
101 | } |
156 | |
102 | |
157 | random_map_params::~random_map_params () |
103 | noinline SV * |
|
|
104 | random_map_params::get_sv (const char *option) const |
158 | { |
105 | { |
|
|
106 | SV **he = hv_fetch (hv, option, strlen (option), 0); |
|
|
107 | |
|
|
108 | return he ? *he : 0; |
|
|
109 | } |
|
|
110 | |
|
|
111 | noinline const_utf8_string |
|
|
112 | random_map_params::get_str (const char *option, const_utf8_string fallback) const |
|
|
113 | { |
|
|
114 | SV *sv = get_sv (option); |
|
|
115 | return sv ? cfSvPVutf8_nolen (sv) : fallback; |
|
|
116 | } |
|
|
117 | |
|
|
118 | noinline IV |
|
|
119 | random_map_params::get_iv (const char *option, IV fallback) const |
|
|
120 | { |
|
|
121 | SV *sv = get_sv (option); |
|
|
122 | return sv ? SvIV (sv) : fallback; |
|
|
123 | } |
|
|
124 | |
|
|
125 | noinline UV |
|
|
126 | random_map_params::get_uv (const char *option, UV fallback) const |
|
|
127 | { |
|
|
128 | SV *sv = get_sv (option); |
|
|
129 | return sv ? SvUV (sv) : fallback; |
|
|
130 | } |
|
|
131 | |
|
|
132 | noinline NV |
|
|
133 | random_map_params::get_nv (const char *option, NV fallback) const |
|
|
134 | { |
|
|
135 | SV *sv = get_sv (option); |
|
|
136 | return sv ? SvNV (sv) : fallback; |
|
|
137 | } |
|
|
138 | |
|
|
139 | noinline void |
|
|
140 | random_map_params::set (const char *option, SV *value) const |
|
|
141 | { |
|
|
142 | int len = strlen (option); |
|
|
143 | |
|
|
144 | if (value) |
|
|
145 | hv_store (hv, option, len, value, 0); |
|
|
146 | else |
|
|
147 | hv_delete (hv, option, len, G_DISCARD); |
|
|
148 | } |
|
|
149 | |
|
|
150 | noinline void |
|
|
151 | random_map_params::set (const char *option, const_utf8_string value) const |
|
|
152 | { |
|
|
153 | set (option, value && *value ? newSVpvn_utf8 (value, strlen (value), 1) : 0); |
|
|
154 | } |
|
|
155 | |
|
|
156 | void |
|
|
157 | random_map_params::set (const char *option, IV value) const |
|
|
158 | { |
|
|
159 | set (option, newSViv (value)); |
|
|
160 | } |
|
|
161 | |
|
|
162 | void |
|
|
163 | random_map_params::set (const char *option, UV value) const |
|
|
164 | { |
|
|
165 | set (option, newSVuv (value)); |
|
|
166 | } |
|
|
167 | |
|
|
168 | void |
|
|
169 | random_map_params::set (const char *option, NV value) const |
|
|
170 | { |
|
|
171 | set (option, newSVnv (value)); |
|
|
172 | } |
|
|
173 | |
|
|
174 | void |
|
|
175 | random_map_params::hv_clone () |
|
|
176 | { |
|
|
177 | HV *copy = newHV (); |
|
|
178 | |
|
|
179 | hv_iterinit (hv); |
|
|
180 | |
|
|
181 | // does not work for utf-8 keys |
|
|
182 | while (HE *he = hv_iternext (hv)) |
|
|
183 | { |
|
|
184 | STRLEN klen; const char *key = HePV (he, klen); |
|
|
185 | hv_store (copy, key, klen, newSVsv (HeVAL (he)), HeHASH (he)); |
|
|
186 | } |
|
|
187 | |
159 | SvREFCNT_dec (hv); |
188 | SvREFCNT_dec (hv); |
|
|
189 | hv = copy; |
160 | } |
190 | } |
161 | |
191 | |
162 | bool |
192 | bool |
163 | maptile::generate_random_map (random_map_params *RP) |
193 | maptile::generate_random_map (random_map_params *RP) |
164 | { |
194 | { |
… | |
… | |
245 | |
275 | |
246 | /* allocate the map and set the floor */ |
276 | /* allocate the map and set the floor */ |
247 | make_map_floor (maze, RP->get_str ("floorstyle", ""), RP); |
277 | make_map_floor (maze, RP->get_str ("floorstyle", ""), RP); |
248 | |
278 | |
249 | /* set region */ |
279 | /* set region */ |
250 | default_region = RP->region; |
280 | default_region = region::find (RP->get_str ("region", 0)); |
251 | |
281 | |
252 | CEDE; |
282 | CEDE; |
253 | |
283 | |
254 | place_specials_in_map (this, maze, RP); |
284 | place_specials_in_map (this, maze, RP); |
255 | |
285 | |