ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/cfperl.xs
(Generate patch)

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.135 by root, Wed Jan 10 01:16:54 2007 UTC vs.
Revision 1.160 by elmex, Wed Jan 31 14:11:02 2007 UTC

102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104attachable::~attachable () 104attachable::~attachable ()
105{ 105{
106 assert (!self); 106 assert (!self);
107 assert (!cb);
107} 108}
108 109
109int 110int
110attachable::refcnt_cnt () const 111attachable::refcnt_cnt () const
111{ 112{
112 return refcnt + (self ? SvREFCNT (self) : 0); 113 return refcnt + (self ? SvREFCNT (self) - 1 : 0);
114}
115
116void
117attachable::sever_self ()
118{
119 if (HV *self = this->self)
120 {
121 // keep a refcount because sv_unmagic might call attachable_free,
122 // which might clear self, causing sv_unmagic to crash on a now
123 // invalid object.
124 SvREFCNT_inc (self);
125 hv_clear (self);
126 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
127 SvREFCNT_dec (self);
128
129 // self *must* be null now because thats sv_unmagic's job.
130 assert (!this->self);
131 }
113} 132}
114 133
115void 134void
116attachable::optimise () 135attachable::optimise ()
117{ 136{
118 if (self 137 if (self
119 && SvREFCNT (self) == 1 138 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self)) 139 && !HvTOTALKEYS (self))
140 sever_self ();
141}
142
143// check wether the object really is dead
144void
145attachable::do_check ()
146{
147 if (refcnt_cnt () > 0)
148 return;
149
150 destroy ();
151}
152
153void
154attachable::do_destroy ()
155{
156 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
157
158 if (cb)
121 { 159 {
122 refcnt_inc ();
123 SvREFCNT_dec ((SV *)self); 160 SvREFCNT_dec (cb);
161 cb = 0;
124 } 162 }
125}
126
127// check wether the object really is dead
128void
129attachable::do_check ()
130{
131 if (refcnt > 0 || refcnt_cnt () > 0)
132 return;
133
134 destroy ();
135 163
136 if (self) 164 if (self)
137 { 165 sever_self ();
138 hv_clear (self);
139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
140 SvREFCNT_dec (self);
141 self = 0;
142 }
143}
144
145void
146attachable::do_destroy ()
147{
148 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
149
150 if (self)
151 hv_clear (self);
152 166
153 mortals.push_back (this); 167 mortals.push_back (this);
154} 168}
155 169
156void 170void
164} 178}
165 179
166void 180void
167attachable::check_mortals () 181attachable::check_mortals ()
168{ 182{
169 for (int i = 0; i < mortals.size (); ) 183 static int i = 0;
184
185 for (;;)
170 { 186 {
187 if (i >= mortals.size ())
188 {
189 i = 0;
190
191 if (mortals.size () > 1000)
192 fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ());
193
194 break;
195 }
196
171 attachable *obj = mortals [i]; 197 attachable *obj = mortals [i];
172 198
173 obj->refcnt_chk (); // unborrow from perl, if necessary 199 obj->refcnt_chk (); // unborrow from perl, if necessary
174 200
201 //if (obj->refcnt > 0 || obj->self)
175 if (obj->refcnt || obj->self) 202 if (obj->refcnt || obj->self)
176 { 203 {
177#if 0 204//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
178 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
179 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
180#endif
181
182 ++i; // further delay freeing 205 ++i; // further delay freeing
206
207 if (!(i & 0x3ff))
208 break;
183 }//D 209 }
184 else 210 else
185 { 211 {
186 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
187 mortals.erase (i); 212 mortals.erase (i);
188 delete obj; 213 delete obj;
189 } 214 }
190 } 215 }
191} 216}
216 241
217static int 242static int
218attachable_free (pTHX_ SV *sv, MAGIC *mg) 243attachable_free (pTHX_ SV *sv, MAGIC *mg)
219{ 244{
220 attachable *at = (attachable *)mg->mg_ptr; 245 attachable *at = (attachable *)mg->mg_ptr;
246
247 //TODO: check if transaction behaviour is really required here
248 if (SV *self = (SV *)at->self)
249 {
221 at->self = 0; 250 at->self = 0;
251 SvREFCNT_dec (self);
252 }
253
222 // next line makes sense, but most objects still have refcnt 0 by default 254 // next line makes sense, but most objects still have refcnt 0 by default
223 //at->refcnt_chk (); 255 //at->refcnt_chk ();
224 return 0; 256 return 0;
225} 257}
226 258
235 if (!obj->self) 267 if (!obj->self)
236 { 268 {
237 obj->self = newHV (); 269 obj->self = newHV ();
238 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 270 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
239 271
240 // borrow the refcnt from the object
241 // it is important thta no refcnt_chk is being executed here
242 obj->refcnt_dec ();
243
244 // now bless the object _once_ 272 // now bless the object _once_
245 return sv_bless (newRV_inc ((SV *)obj->self), stash); 273 return sv_bless (newRV_inc ((SV *)obj->self), stash);
246 } 274 }
247 else 275 else
276 {
248 return newRV_inc ((SV *)obj->self); 277 SV *sv = newRV_inc ((SV *)obj->self);
278
279 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
280 SvAMAGIC_on (sv);
281
282 return sv;
283 }
249} 284}
250 285
251static void 286static void
252clearSVptr (SV *sv) 287clearSVptr (SV *sv)
253{ 288{
306inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 341inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
307 342
308inline SV *to_sv (object & v) { return to_sv (&v); } 343inline SV *to_sv (object & v) { return to_sv (&v); }
309inline SV *to_sv (living & v) { return to_sv (&v); } 344inline SV *to_sv (living & v) { return to_sv (&v); }
310 345
311//TODO:
312inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 346inline SV *to_sv (facetile * v) { return to_sv (v->name); }
313inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 347inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
314 348
315inline SV *to_sv (UUID v) 349inline SV *to_sv (UUID v)
316{ 350{
317 char buf[128]; 351 char buf[128];
318 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 352 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
319 return newSVpv (buf, 0); 353 return newSVpv (buf, 0);
320} 354}
321 355
322inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; } 356inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; }
323inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; } 357inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; }
342inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 376inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
343inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 377inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
344inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 378inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
345inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 379inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
346 380
347inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 381inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
348inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 382inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
349 383
350template<class T> 384template<class T>
351inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 385inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
352 386
353template<int N> 387template<int N>
489 if (!ext->cb) 523 if (!ext->cb)
490 ext->cb = newAV (); 524 ext->cb = newAV ();
491 525
492 return newRV_inc ((SV *)ext->cb); 526 return newRV_inc ((SV *)ext->cb);
493} 527}
494
495#if 0
496void attachable::clear ()
497{
498 if (self)
499 {
500 // disconnect Perl from C, to avoid crashes
501 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
502
503 // clear the perl hash, might or might not be a good idea
504 hv_clear ((HV *)SvRV ((SV *)self));
505
506 SvREFCNT_dec (self);
507 self = 0;
508 }
509
510 if (cb)
511 {
512 SvREFCNT_dec (cb);
513 cb = 0;
514 }
515
516 attach = 0;
517}
518#endif
519 528
520///////////////////////////////////////////////////////////////////////////// 529/////////////////////////////////////////////////////////////////////////////
521 530
522extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 531extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
523{ 532{
914void 923void
915iw::alloc () 924iw::alloc ()
916{ 925{
917 pe = GEventAPI->new_idle (0, 0); 926 pe = GEventAPI->new_idle (0, 0);
918 927
928 WaREENTRANT_off (pe);
919 pe->base.callback = (void *)iw_dispatch; 929 pe->base.callback = (void *)iw_dispatch;
920 pe->base.ext_data = (void *)this; 930 pe->base.ext_data = (void *)this;
921} 931}
922 932
923static void iow_dispatch (pe_event *ev) 933static void iow_dispatch (pe_event *ev)
929void 939void
930iow::alloc () 940iow::alloc ()
931{ 941{
932 pe = GEventAPI->new_io (0, 0); 942 pe = GEventAPI->new_io (0, 0);
933 943
944 WaREENTRANT_off (pe);
934 pe->base.callback = (void *)iow_dispatch; 945 pe->base.callback = (void *)iow_dispatch;
935 pe->base.ext_data = (void *)this; 946 pe->base.ext_data = (void *)this;
936 947
937 pe->fd = -1; 948 pe->fd = -1;
938 pe->poll = 0; 949 pe->poll = 0;
1266 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1277 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1267 const_iv (FLAG_IS_WATER) 1278 const_iv (FLAG_IS_WATER)
1268 const_iv (FLAG_CONTENT_ON_GEN) 1279 const_iv (FLAG_CONTENT_ON_GEN)
1269 const_iv (FLAG_IS_A_TEMPLATE) 1280 const_iv (FLAG_IS_A_TEMPLATE)
1270 const_iv (FLAG_IS_BUILDABLE) 1281 const_iv (FLAG_IS_BUILDABLE)
1282 const_iv (FLAG_DESTROY_ON_DEATH)
1283 const_iv (FLAG_NO_MAP_SAVE)
1271 1284
1272 const_iv (NDI_BLACK) 1285 const_iv (NDI_BLACK)
1273 const_iv (NDI_WHITE) 1286 const_iv (NDI_WHITE)
1274 const_iv (NDI_NAVY) 1287 const_iv (NDI_NAVY)
1275 const_iv (NDI_RED) 1288 const_iv (NDI_RED)
1460 const_iv (ATNR_BLIND) 1473 const_iv (ATNR_BLIND)
1461 const_iv (ATNR_INTERNAL) 1474 const_iv (ATNR_INTERNAL)
1462 const_iv (ATNR_LIFE_STEALING) 1475 const_iv (ATNR_LIFE_STEALING)
1463 const_iv (ATNR_DISEASE) 1476 const_iv (ATNR_DISEASE)
1464 1477
1465 const_iv (MAP_FLUSH)
1466 const_iv (MAP_PLAYER_UNIQUE)
1467 const_iv (MAP_BLOCK)
1468 const_iv (MAP_STYLE)
1469 const_iv (MAP_OVERLAY)
1470
1471 const_iv (MAP_IN_MEMORY) 1478 const_iv (MAP_IN_MEMORY)
1472 const_iv (MAP_SWAPPED) 1479 const_iv (MAP_SWAPPED)
1473 const_iv (MAP_LOADING) 1480 const_iv (MAP_LOADING)
1474 const_iv (MAP_SAVING) 1481 const_iv (MAP_SAVING)
1475 1482
1568} 1575}
1569 1576
1570NV floor (NV x) 1577NV floor (NV x)
1571 1578
1572NV ceil (NV x) 1579NV ceil (NV x)
1580
1581NV rndm (...)
1582 CODE:
1583 switch (items)
1584 {
1585 case 0: RETVAL = rndm (); break;
1586 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1587 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1588 default: croak ("cf::rndm requires none, one or two parameters."); break;
1589 }
1590 OUTPUT:
1591 RETVAL
1573 1592
1574void server_tick () 1593void server_tick ()
1575 CODE: 1594 CODE:
1576 runtime = SvNVx (sv_runtime); 1595 runtime = SvNVx (sv_runtime);
1577 server_tick (); 1596 server_tick ();
1624 } 1643 }
1625 OUTPUT: RETVAL 1644 OUTPUT: RETVAL
1626 1645
1627void abort () 1646void abort ()
1628 1647
1648void fork_abort (char *cause = "cf::fork_abort")
1649
1629void cleanup (const char *cause, bool make_core = false) 1650void cleanup (const char *cause, bool make_core = false)
1630 1651
1631void emergency_save () 1652void emergency_save ()
1632 1653
1633void _exit (int status = 0) 1654void _exit (int status = EXIT_SUCCESS)
1655
1656UV sv_2watcher (SV *w)
1657 CODE:
1658 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1659 OUTPUT:
1660 RETVAL
1634 1661
1635#if _POSIX_MEMLOCK 1662#if _POSIX_MEMLOCK
1636 1663
1637int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1664int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1638 1665
1693 CODE: 1720 CODE:
1694 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1721 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1695 OUTPUT: 1722 OUTPUT:
1696 RETVAL 1723 RETVAL
1697 1724
1725int mortals_size ()
1726 CODE:
1727 RETVAL = attachable::mortals.size ();
1728 OUTPUT: RETVAL
1729
1730#object *mortals (U32 index)
1731# CODE:
1732# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1733# OUTPUT: RETVAL
1734
1698INCLUDE: $PERL genacc attachable ../include/cfperl.h | 1735INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1699 1736
1700MODULE = cf PACKAGE = cf::global 1737MODULE = cf PACKAGE = cf::global
1701 1738
1702int invoke (SV *klass, int event, ...) 1739int invoke (SV *klass, int event, ...)
1719 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1756 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1720 OUTPUT: RETVAL 1757 OUTPUT: RETVAL
1721 1758
1722SV *registry (object *op) 1759SV *registry (object *op)
1723 1760
1724void mortals ()
1725 PPCODE:
1726 EXTEND (SP, object::mortals.size ());
1727 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1728 PUSHs (to_sv (*i));
1729
1730int objects_size () 1761int objects_size ()
1731 CODE: 1762 CODE:
1732 RETVAL = objects.size (); 1763 RETVAL = objects.size ();
1733 OUTPUT: RETVAL 1764 OUTPUT: RETVAL
1734 1765
1773 1804
1774void 1805void
1775set_animation (object *op, int idx) 1806set_animation (object *op, int idx)
1776 CODE: 1807 CODE:
1777 SET_ANIMATION (op, idx); 1808 SET_ANIMATION (op, idx);
1809
1810int
1811num_animations (object *op)
1812 CODE:
1813 RETVAL = NUM_ANIMATIONS (op);
1814 OUTPUT: RETVAL
1778 1815
1779object *find_best_object_match (object *op, const char *match) 1816object *find_best_object_match (object *op, const char *match)
1780 1817
1781object *find_marked_object (object *op) 1818object *find_marked_object (object *op)
1782 1819
1857 1894
1858void drop (object *who, object *op) 1895void drop (object *who, object *op)
1859 1896
1860void pick_up (object *who, object *op) 1897void pick_up (object *who, object *op)
1861 1898
1862object *cf_object_insert_object (object *op, object *container)
1863
1864object *cf_object_insert_in_ob (object *ob, object *where)
1865
1866int cf_object_teleport (object *op, maptile *map, int x, int y) 1899int cf_object_teleport (object *op, maptile *map, int x, int y)
1867 1900
1868void update_object (object *op, int action) 1901void update_object (object *op, int action)
1869 1902
1870object *cf_create_object_by_name (const char *name) 1903object *cf_create_object_by_name (const char *name)
1988 2021
1989void esrv_update_item (object *op, int what, object *item) 2022void esrv_update_item (object *op, int what, object *item)
1990 C_ARGS: what, op, item 2023 C_ARGS: what, op, item
1991 2024
1992void clear_los (object *op) 2025void clear_los (object *op)
1993
1994int command_teleport (object *op, char *params)
1995 2026
1996int command_summon (object *op, char *params) 2027int command_summon (object *op, char *params)
1997 2028
1998int command_arrest (object *op, char *params) 2029int command_arrest (object *op, char *params)
1999 2030
2117 for_all_players (pl) 2148 for_all_players (pl)
2118 if (pl->ob && pl->ob->map == THIS) 2149 if (pl->ob && pl->ob->map == THIS)
2119 PUSHs (sv_2mortal (to_sv (pl->ob))); 2150 PUSHs (sv_2mortal (to_sv (pl->ob)));
2120 } 2151 }
2121 2152
2153void
2154maptile::set_regiondata (SV *data, SV *plt)
2155 CODE:
2156{
2157 if (!SvROK (plt) || SvTYPE (SvRV (plt)) != SVt_PVAV)
2158 croak ("maptile::set_regiondata needs arrayref as plt arg");
2159
2160 AV *av = (AV *)SvRV (plt);
2161
2162 region **regionmap = (region **)malloc ((av_len (av) + 1) * sizeof (region *));
2163
2164 for (int i = av_len (av) + 1; i--; )
2165 regionmap [i] = region::find (SvPVutf8_nolen (*av_fetch (av, i, 1)));
2166
2167 THIS->regions = salloc<uint8_t> (THIS->size (), (uint8_t *)SvPVbyte_nolen (data));
2168 THIS->regionmap = regionmap;
2169}
2170
2122void play_sound_map (maptile *map, int x, int y, int sound_num) 2171void play_sound_map (maptile *map, int x, int y, int sound_num)
2123 2172
2124int out_of_map (maptile *map, int x, int y) 2173int out_of_map (maptile *map, int x, int y)
2125 2174
2126void 2175void
2142 2191
2143object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2192object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2144 C_ARGS: str, map, nx, ny 2193 C_ARGS: str, map, nx, ny
2145 2194
2146void 2195void
2147cf_map_normalise (maptile *map, int x, int y) 2196get_map_flags (maptile *map, int x, int y)
2148 PPCODE: 2197 PPCODE:
2149{ 2198{
2150 maptile *nmap = 0; 2199 maptile *nmap = 0;
2151 I16 nx = 0, ny = 0; 2200 I16 nx = 0, ny = 0;
2152 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2201 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2207 2256
2208void fix_walls (maptile *map, int x, int y) 2257void fix_walls (maptile *map, int x, int y)
2209 2258
2210void fix_walls_around (maptile *map, int x, int y) 2259void fix_walls_around (maptile *map, int x, int y)
2211 2260
2212const char *
2213region_name (maptile *m)
2214 CODE:
2215 RETVAL = get_name_of_region_for_map (m);
2216 OUTPUT: RETVAL
2217
2218# worst xs function of my life 2261# worst xs function of my life
2219maptile * 2262bool
2220_create_random_map (\ 2263_create_random_map (\
2221 char *path,\ 2264 maptile *self,\
2222 char *wallstyle,\ 2265 char *wallstyle,\
2223 char *wall_name,\ 2266 char *wall_name,\
2224 char *floorstyle,\ 2267 char *floorstyle,\
2225 char *monsterstyle,\ 2268 char *monsterstyle,\
2226 char *treasurestyle,\ 2269 char *treasurestyle,\
2230 char *origin_map,\ 2273 char *origin_map,\
2231 char *final_map,\ 2274 char *final_map,\
2232 char *exitstyle,\ 2275 char *exitstyle,\
2233 char *this_map,\ 2276 char *this_map,\
2234 char *exit_on_final_map,\ 2277 char *exit_on_final_map,\
2235 int Xsize,\ 2278 int xsize,\
2236 int Ysize,\ 2279 int ysize,\
2237 int expand2x,\ 2280 int expand2x,\
2238 int layoutoptions1,\ 2281 int layoutoptions1,\
2239 int layoutoptions2,\ 2282 int layoutoptions2,\
2240 int layoutoptions3,\ 2283 int layoutoptions3,\
2241 int symmetry,\ 2284 int symmetry,\
2246 int dungeon_depth,\ 2289 int dungeon_depth,\
2247 int decoroptions,\ 2290 int decoroptions,\
2248 int orientation,\ 2291 int orientation,\
2249 int origin_y,\ 2292 int origin_y,\
2250 int origin_x,\ 2293 int origin_x,\
2251 int random_seed,\ 2294 U32 random_seed,\
2252 val64 total_map_hp,\ 2295 val64 total_map_hp,\
2253 int map_layout_style,\ 2296 int map_layout_style,\
2254 int treasureoptions,\ 2297 int treasureoptions,\
2255 int symmetry_used,\ 2298 int symmetry_used,\
2256 region *region\ 2299 region *region,\
2300 char *custom\
2257) 2301)
2258 CODE: 2302 CODE:
2259{ 2303{
2260 random_map_params rmp; 2304 random_map_params rmp;
2261 2305
2271 assign (rmp.exit_on_final_map, exit_on_final_map); 2315 assign (rmp.exit_on_final_map, exit_on_final_map);
2272 2316
2273 rmp.origin_map = origin_map; 2317 rmp.origin_map = origin_map;
2274 rmp.final_map = final_map; 2318 rmp.final_map = final_map;
2275 rmp.this_map = this_map; 2319 rmp.this_map = this_map;
2276 rmp.Xsize = Xsize; 2320 rmp.xsize = xsize;
2277 rmp.Ysize = Ysize; 2321 rmp.ysize = ysize;
2278 rmp.expand2x = expand2x; 2322 rmp.expand2x = expand2x;
2279 rmp.layoutoptions1 = layoutoptions1; 2323 rmp.layoutoptions1 = layoutoptions1;
2280 rmp.layoutoptions2 = layoutoptions2; 2324 rmp.layoutoptions2 = layoutoptions2;
2281 rmp.layoutoptions3 = layoutoptions3; 2325 rmp.layoutoptions3 = layoutoptions3;
2282 rmp.symmetry = symmetry; 2326 rmp.symmetry = symmetry;
2293 rmp.total_map_hp = total_map_hp; 2337 rmp.total_map_hp = total_map_hp;
2294 rmp.map_layout_style = map_layout_style; 2338 rmp.map_layout_style = map_layout_style;
2295 rmp.treasureoptions = treasureoptions; 2339 rmp.treasureoptions = treasureoptions;
2296 rmp.symmetry_used = symmetry_used; 2340 rmp.symmetry_used = symmetry_used;
2297 rmp.region = region; 2341 rmp.region = region;
2342 rmp.custom = custom;
2298 2343
2299 RETVAL = generate_random_map (path, &rmp); 2344 RETVAL = self->generate_random_map (&rmp);
2300} 2345}
2301 OUTPUT: 2346 OUTPUT:
2302 RETVAL 2347 RETVAL
2303 2348
2304MODULE = cf PACKAGE = cf::arch 2349MODULE = cf PACKAGE = cf::arch
2336 OUTPUT: RETVAL 2381 OUTPUT: RETVAL
2337 2382
2338region *find (char *name) 2383region *find (char *name)
2339 PROTOTYPE: $ 2384 PROTOTYPE: $
2340 CODE: 2385 CODE:
2341 RETVAL = get_region_by_name (name); 2386 RETVAL = region::find (name);
2342 OUTPUT: RETVAL 2387 OUTPUT: RETVAL
2343 2388
2344INCLUDE: $PERL genacc region ../include/map.h | 2389INCLUDE: $PERL genacc region ../include/map.h |
2345 2390
2346MODULE = cf PACKAGE = cf::living 2391MODULE = cf PACKAGE = cf::living

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines