ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/random_map.C
(Generate patch)

Comparing deliantra/server/random_maps/random_map.C (file contents):
Revision 1.62 by root, Sat Jul 3 01:12:45 2010 UTC vs.
Revision 1.63 by root, Sat Jul 3 01:49:18 2010 UTC

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
34noinline SV * 34random_map_params::random_map_params ()
35random_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
42noinline const_utf8_string 39random_map_params::random_map_params (HV *hv)
43random_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
49noinline IV 43 assign (wall_name, get_str ("wall_name"));
50random_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
56noinline UV 45 xsize = get_iv ("xsize");
57random_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
63noinline NV 64random_map_params::~random_map_params ()
64random_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
70noinline void
71random_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
81noinline void
82random_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
87void
88random_map_params::set (const char *option, IV value) const
89{
90 set (option, newSViv (value));
91}
92
93void
94random_map_params::set (const char *option, UV value) const
95{
96 set (option, newSVuv (value));
97}
98
99void
100random_map_params::set (const char *option, NV value) const
101{
102 set (option, newSVnv (value));
103}
104
105void
106random_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
123shstr_tmp 69shstr_tmp
124random_map_params::as_shstr () const 70random_map_params::as_shstr () const
125{ 71{
152 } 98 }
153 99
154 return shstr (buf); 100 return shstr (buf);
155} 101}
156 102
157random_map_params::~random_map_params () 103noinline SV *
104random_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
111noinline const_utf8_string
112random_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
118noinline IV
119random_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
125noinline UV
126random_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
132noinline NV
133random_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
139noinline void
140random_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
150noinline void
151random_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
156void
157random_map_params::set (const char *option, IV value) const
158{
159 set (option, newSViv (value));
160}
161
162void
163random_map_params::set (const char *option, UV value) const
164{
165 set (option, newSVuv (value));
166}
167
168void
169random_map_params::set (const char *option, NV value) const
170{
171 set (option, newSVnv (value));
172}
173
174void
175random_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
162bool 192bool
163maptile::generate_random_map (random_map_params *RP) 193maptile::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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines