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.132 by root, Mon Jan 8 20:59:15 2007 UTC vs.
Revision 1.160 by elmex, Wed Jan 31 14:11:02 2007 UTC

101 101
102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104attachable::~attachable () 104attachable::~attachable ()
105{ 105{
106 assert (!(flags & F_BORROWED)); 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 flags &= ~F_BORROWED;
123 refcnt_inc ();
124 SvREFCNT_dec ((SV *)self); 160 SvREFCNT_dec (cb);
161 cb = 0;
125 } 162 }
126}
127
128// check wether the object really is dead
129void
130attachable::do_check ()
131{
132 if (refcnt > 0)
133 return;
134
135 optimise ();
136 163
137 if (self) 164 if (self)
138 { 165 sever_self ();
139 if (refcnt + SvREFCNT (self) > 0)
140 return;
141
142 if (flags & F_BORROWED)
143 {
144 flags &= ~F_BORROWED;
145 refcnt_inc ();
146 SvREFCNT_dec (self);
147 }
148
149 if (self)
150 if (refcnt + SvREFCNT (self) > 0)
151 return;
152 }
153
154 if (refcnt > 0)
155 return;
156
157 destroy ();
158}
159
160void
161attachable::do_destroy ()
162{
163 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
164
165 if (self)
166 hv_clear (self);
167 166
168 mortals.push_back (this); 167 mortals.push_back (this);
169} 168}
170 169
171void 170void
179} 178}
180 179
181void 180void
182attachable::check_mortals () 181attachable::check_mortals ()
183{ 182{
184 for (int i = 0; i < mortals.size (); ) 183 static int i = 0;
184
185 for (;;)
185 { 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
186 attachable *obj = mortals [i]; 197 attachable *obj = mortals [i];
187 198
188 obj->refcnt_chk (); // unborrow from perl, if necessary 199 obj->refcnt_chk (); // unborrow from perl, if necessary
189 200
201 //if (obj->refcnt > 0 || obj->self)
190 if (obj->refcnt || obj->self) 202 if (obj->refcnt || obj->self)
191 { 203 {
192#if 0 204//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
193 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
194 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
195#endif
196
197 ++i; // further delay freeing 205 ++i; // further delay freeing
206
207 if (!(i & 0x3ff))
208 break;
198 }//D 209 }
199 else 210 else
200 { 211 {
201 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
202 mortals.erase (i); 212 mortals.erase (i);
203 delete obj; 213 delete obj;
204 } 214 }
205 } 215 }
206} 216}
231 241
232static int 242static int
233attachable_free (pTHX_ SV *sv, MAGIC *mg) 243attachable_free (pTHX_ SV *sv, MAGIC *mg)
234{ 244{
235 attachable *at = (attachable *)mg->mg_ptr; 245 attachable *at = (attachable *)mg->mg_ptr;
236 assert (!(at->flags & attachable::F_BORROWED)); 246
247 //TODO: check if transaction behaviour is really required here
248 if (SV *self = (SV *)at->self)
249 {
237 at->self = 0; 250 at->self = 0;
251 SvREFCNT_dec (self);
252 }
253
238 // 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
239 //at->refcnt_chk (); 255 //at->refcnt_chk ();
240 return 0; 256 return 0;
241} 257}
242 258
251 if (!obj->self) 267 if (!obj->self)
252 { 268 {
253 obj->self = newHV (); 269 obj->self = newHV ();
254 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);
255 271
256 // borrow the refcnt from the object
257 obj->flags |= attachable::F_BORROWED;
258 obj->refcnt_dec ();
259
260 // now bless the object _once_ 272 // now bless the object _once_
261 return sv_bless (newRV_inc ((SV *)obj->self), stash); 273 return sv_bless (newRV_inc ((SV *)obj->self), stash);
262 } 274 }
263 else 275 else
276 {
264 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 }
265} 284}
266 285
267static void 286static void
268clearSVptr (SV *sv) 287clearSVptr (SV *sv)
269{ 288{
322inline 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); }
323 342
324inline SV *to_sv (object & v) { return to_sv (&v); } 343inline SV *to_sv (object & v) { return to_sv (&v); }
325inline SV *to_sv (living & v) { return to_sv (&v); } 344inline SV *to_sv (living & v) { return to_sv (&v); }
326 345
327//TODO:
328inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 346inline SV *to_sv (facetile * v) { return to_sv (v->name); }
329inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 347inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
330 348
331inline SV *to_sv (UUID v) 349inline SV *to_sv (UUID v)
332{ 350{
333 char buf[128]; 351 char buf[128];
334 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 352 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
335 return newSVpv (buf, 0); 353 return newSVpv (buf, 0);
336} 354}
337 355
338inline 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; }
339inline 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; }
358inline 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"); }
359inline 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"); }
360inline 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"); }
361inline 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"); }
362 380
363inline 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)]; }
364inline 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)); }
365 383
366template<class T> 384template<class T>
367inline 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; }
368 386
369template<int N> 387template<int N>
505 if (!ext->cb) 523 if (!ext->cb)
506 ext->cb = newAV (); 524 ext->cb = newAV ();
507 525
508 return newRV_inc ((SV *)ext->cb); 526 return newRV_inc ((SV *)ext->cb);
509} 527}
510
511#if 0
512void attachable::clear ()
513{
514 if (self)
515 {
516 // disconnect Perl from C, to avoid crashes
517 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
518
519 // clear the perl hash, might or might not be a good idea
520 hv_clear ((HV *)SvRV ((SV *)self));
521
522 SvREFCNT_dec (self);
523 self = 0;
524 }
525
526 if (cb)
527 {
528 SvREFCNT_dec (cb);
529 cb = 0;
530 }
531
532 attach = 0;
533}
534#endif
535 528
536///////////////////////////////////////////////////////////////////////////// 529/////////////////////////////////////////////////////////////////////////////
537 530
538extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 531extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
539{ 532{
834} 827}
835 828
836///////////////////////////////////////////////////////////////////////////// 829/////////////////////////////////////////////////////////////////////////////
837 830
838void 831void
839maptile::emergency_save () 832cfperl_emergency_save ()
840{ 833{
841 CALL_BEGIN (0); 834 CALL_BEGIN (0);
842 CALL_CALL ("cf::map::emergency_save", G_VOID); 835 CALL_CALL ("cf::emergency_save", G_VOID);
843 CALL_END; 836 CALL_END;
844} 837}
845 838
846maptile * 839maptile *
847maptile::find_sync (const char *path, maptile *origin) 840maptile::find_sync (const char *path, maptile *origin)
848{ 841{
849 CALL_BEGIN (2); 842 CALL_BEGIN (2);
850 CALL_ARG (path); 843 CALL_ARG (path);
851 CALL_ARG (origin); 844 CALL_ARG (origin);
852 CALL_CALL ("cf::map::find_sync", G_SCALAR); 845 CALL_CALL ("cf::map::find_sync", G_SCALAR);
846
847 maptile *retval;
848
849 if (count)
850 sv_to (POPs, retval);
851 else
852 retval = 0;
853
854 CALL_END;
855
856 return retval;
857}
858
859maptile *
860maptile::find_async (const char *path, maptile *origin)
861{
862 CALL_BEGIN (2);
863 CALL_ARG (path);
864 CALL_ARG (origin);
865 CALL_CALL ("cf::map::find_async", G_SCALAR);
853 866
854 maptile *retval; 867 maptile *retval;
855 868
856 if (count) 869 if (count)
857 sv_to (POPs, retval); 870 sv_to (POPs, retval);
910void 923void
911iw::alloc () 924iw::alloc ()
912{ 925{
913 pe = GEventAPI->new_idle (0, 0); 926 pe = GEventAPI->new_idle (0, 0);
914 927
928 WaREENTRANT_off (pe);
915 pe->base.callback = (void *)iw_dispatch; 929 pe->base.callback = (void *)iw_dispatch;
916 pe->base.ext_data = (void *)this; 930 pe->base.ext_data = (void *)this;
917} 931}
918 932
919static void iow_dispatch (pe_event *ev) 933static void iow_dispatch (pe_event *ev)
925void 939void
926iow::alloc () 940iow::alloc ()
927{ 941{
928 pe = GEventAPI->new_io (0, 0); 942 pe = GEventAPI->new_io (0, 0);
929 943
944 WaREENTRANT_off (pe);
930 pe->base.callback = (void *)iow_dispatch; 945 pe->base.callback = (void *)iow_dispatch;
931 pe->base.ext_data = (void *)this; 946 pe->base.ext_data = (void *)this;
932 947
933 pe->fd = -1; 948 pe->fd = -1;
934 pe->poll = 0; 949 pe->poll = 0;
1262 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1277 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1263 const_iv (FLAG_IS_WATER) 1278 const_iv (FLAG_IS_WATER)
1264 const_iv (FLAG_CONTENT_ON_GEN) 1279 const_iv (FLAG_CONTENT_ON_GEN)
1265 const_iv (FLAG_IS_A_TEMPLATE) 1280 const_iv (FLAG_IS_A_TEMPLATE)
1266 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)
1267 1284
1268 const_iv (NDI_BLACK) 1285 const_iv (NDI_BLACK)
1269 const_iv (NDI_WHITE) 1286 const_iv (NDI_WHITE)
1270 const_iv (NDI_NAVY) 1287 const_iv (NDI_NAVY)
1271 const_iv (NDI_RED) 1288 const_iv (NDI_RED)
1456 const_iv (ATNR_BLIND) 1473 const_iv (ATNR_BLIND)
1457 const_iv (ATNR_INTERNAL) 1474 const_iv (ATNR_INTERNAL)
1458 const_iv (ATNR_LIFE_STEALING) 1475 const_iv (ATNR_LIFE_STEALING)
1459 const_iv (ATNR_DISEASE) 1476 const_iv (ATNR_DISEASE)
1460 1477
1461 const_iv (MAP_FLUSH)
1462 const_iv (MAP_PLAYER_UNIQUE)
1463 const_iv (MAP_BLOCK)
1464 const_iv (MAP_STYLE)
1465 const_iv (MAP_OVERLAY)
1466
1467 const_iv (MAP_IN_MEMORY) 1478 const_iv (MAP_IN_MEMORY)
1468 const_iv (MAP_SWAPPED) 1479 const_iv (MAP_SWAPPED)
1469 const_iv (MAP_LOADING) 1480 const_iv (MAP_LOADING)
1470 const_iv (MAP_SAVING) 1481 const_iv (MAP_SAVING)
1471 1482
1564} 1575}
1565 1576
1566NV floor (NV x) 1577NV floor (NV x)
1567 1578
1568NV 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
1569 1592
1570void server_tick () 1593void server_tick ()
1571 CODE: 1594 CODE:
1572 runtime = SvNVx (sv_runtime); 1595 runtime = SvNVx (sv_runtime);
1573 server_tick (); 1596 server_tick ();
1620 } 1643 }
1621 OUTPUT: RETVAL 1644 OUTPUT: RETVAL
1622 1645
1623void abort () 1646void abort ()
1624 1647
1648void fork_abort (char *cause = "cf::fork_abort")
1649
1650void cleanup (const char *cause, bool make_core = false)
1651
1625void emergency_save () 1652void emergency_save ()
1626 1653
1627void _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
1628 1661
1629#if _POSIX_MEMLOCK 1662#if _POSIX_MEMLOCK
1630 1663
1631int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1664int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1632 1665
1687 CODE: 1720 CODE:
1688 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1721 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1689 OUTPUT: 1722 OUTPUT:
1690 RETVAL 1723 RETVAL
1691 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
1692INCLUDE: $PERL genacc attachable ../include/cfperl.h | 1735INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1693 1736
1694MODULE = cf PACKAGE = cf::global 1737MODULE = cf PACKAGE = cf::global
1695 1738
1696int invoke (SV *klass, int event, ...) 1739int invoke (SV *klass, int event, ...)
1713 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1756 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1714 OUTPUT: RETVAL 1757 OUTPUT: RETVAL
1715 1758
1716SV *registry (object *op) 1759SV *registry (object *op)
1717 1760
1718void mortals () 1761int objects_size ()
1719 PPCODE: 1762 CODE:
1720 EXTEND (SP, object::mortals.size ());
1721 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1722 PUSHs (to_sv (*i));
1723
1724object *first ()
1725 CODE:
1726 RETVAL = object::first; 1763 RETVAL = objects.size ();
1764 OUTPUT: RETVAL
1765
1766object *objects (U32 index)
1767 CODE:
1768 RETVAL = index < objects.size () ? objects [index] : 0;
1769 OUTPUT: RETVAL
1770
1771int actives_size ()
1772 CODE:
1773 RETVAL = actives.size ();
1774 OUTPUT: RETVAL
1775
1776object *actives (U32 index)
1777 CODE:
1778 RETVAL = index < actives.size () ? actives [index] : 0;
1727 OUTPUT: RETVAL 1779 OUTPUT: RETVAL
1728 1780
1729# missing properties 1781# missing properties
1730 1782
1731object *head (object *op) 1783object *head (object *op)
1732 PROTOTYPE: $ 1784 PROTOTYPE: $
1733 CODE: 1785 CODE:
1734 RETVAL = op->head ? op->head : op; 1786 RETVAL = op->head_ ();
1735 OUTPUT: RETVAL 1787 OUTPUT: RETVAL
1736 1788
1737int is_head (object *op) 1789int is_head (object *op)
1738 PROTOTYPE: $ 1790 PROTOTYPE: $
1739 CODE: 1791 CODE:
1740 RETVAL = !op->head; 1792 RETVAL = op->head_ () == op;
1741 OUTPUT: RETVAL 1793 OUTPUT: RETVAL
1742 1794
1743void 1795void
1744inv (object *obj) 1796inv (object *obj)
1745 PROTOTYPE: $ 1797 PROTOTYPE: $
1752 1804
1753void 1805void
1754set_animation (object *op, int idx) 1806set_animation (object *op, int idx)
1755 CODE: 1807 CODE:
1756 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
1757 1815
1758object *find_best_object_match (object *op, const char *match) 1816object *find_best_object_match (object *op, const char *match)
1759 1817
1760object *find_marked_object (object *op) 1818object *find_marked_object (object *op)
1761 1819
1836 1894
1837void drop (object *who, object *op) 1895void drop (object *who, object *op)
1838 1896
1839void pick_up (object *who, object *op) 1897void pick_up (object *who, object *op)
1840 1898
1841object *cf_object_insert_object (object *op, object *container)
1842
1843object *cf_object_insert_in_ob (object *ob, object *where)
1844
1845int cf_object_teleport (object *op, maptile *map, int x, int y) 1899int cf_object_teleport (object *op, maptile *map, int x, int y)
1846 1900
1847void update_object (object *op, int action) 1901void update_object (object *op, int action)
1848 1902
1849object *cf_create_object_by_name (const char *name) 1903object *cf_create_object_by_name (const char *name)
1967 2021
1968void esrv_update_item (object *op, int what, object *item) 2022void esrv_update_item (object *op, int what, object *item)
1969 C_ARGS: what, op, item 2023 C_ARGS: what, op, item
1970 2024
1971void clear_los (object *op) 2025void clear_los (object *op)
1972
1973int command_teleport (object *op, char *params)
1974 2026
1975int command_summon (object *op, char *params) 2027int command_summon (object *op, char *params)
1976 2028
1977int command_arrest (object *op, char *params) 2029int command_arrest (object *op, char *params)
1978 2030
2096 for_all_players (pl) 2148 for_all_players (pl)
2097 if (pl->ob && pl->ob->map == THIS) 2149 if (pl->ob && pl->ob->map == THIS)
2098 PUSHs (sv_2mortal (to_sv (pl->ob))); 2150 PUSHs (sv_2mortal (to_sv (pl->ob)));
2099 } 2151 }
2100 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
2101void 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)
2102 2172
2103int out_of_map (maptile *map, int x, int y) 2173int out_of_map (maptile *map, int x, int y)
2104 2174
2105void 2175void
2121 2191
2122object* 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)
2123 C_ARGS: str, map, nx, ny 2193 C_ARGS: str, map, nx, ny
2124 2194
2125void 2195void
2126cf_map_normalise (maptile *map, int x, int y) 2196get_map_flags (maptile *map, int x, int y)
2127 PPCODE: 2197 PPCODE:
2128{ 2198{
2129 maptile *nmap = 0; 2199 maptile *nmap = 0;
2130 I16 nx = 0, ny = 0; 2200 I16 nx = 0, ny = 0;
2131 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2201 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2186 2256
2187void fix_walls (maptile *map, int x, int y) 2257void fix_walls (maptile *map, int x, int y)
2188 2258
2189void fix_walls_around (maptile *map, int x, int y) 2259void fix_walls_around (maptile *map, int x, int y)
2190 2260
2191const char *
2192region_name (maptile *m)
2193 CODE:
2194 RETVAL = get_name_of_region_for_map (m);
2195 OUTPUT: RETVAL
2196
2197# worst xs function of my life 2261# worst xs function of my life
2198maptile * 2262bool
2199_create_random_map (\ 2263_create_random_map (\
2200 char *path,\ 2264 maptile *self,\
2201 char *wallstyle,\ 2265 char *wallstyle,\
2202 char *wall_name,\ 2266 char *wall_name,\
2203 char *floorstyle,\ 2267 char *floorstyle,\
2204 char *monsterstyle,\ 2268 char *monsterstyle,\
2205 char *treasurestyle,\ 2269 char *treasurestyle,\
2209 char *origin_map,\ 2273 char *origin_map,\
2210 char *final_map,\ 2274 char *final_map,\
2211 char *exitstyle,\ 2275 char *exitstyle,\
2212 char *this_map,\ 2276 char *this_map,\
2213 char *exit_on_final_map,\ 2277 char *exit_on_final_map,\
2214 int Xsize,\ 2278 int xsize,\
2215 int Ysize,\ 2279 int ysize,\
2216 int expand2x,\ 2280 int expand2x,\
2217 int layoutoptions1,\ 2281 int layoutoptions1,\
2218 int layoutoptions2,\ 2282 int layoutoptions2,\
2219 int layoutoptions3,\ 2283 int layoutoptions3,\
2220 int symmetry,\ 2284 int symmetry,\
2225 int dungeon_depth,\ 2289 int dungeon_depth,\
2226 int decoroptions,\ 2290 int decoroptions,\
2227 int orientation,\ 2291 int orientation,\
2228 int origin_y,\ 2292 int origin_y,\
2229 int origin_x,\ 2293 int origin_x,\
2230 int random_seed,\ 2294 U32 random_seed,\
2231 val64 total_map_hp,\ 2295 val64 total_map_hp,\
2232 int map_layout_style,\ 2296 int map_layout_style,\
2233 int treasureoptions,\ 2297 int treasureoptions,\
2234 int symmetry_used,\ 2298 int symmetry_used,\
2235 region *region\ 2299 region *region,\
2300 char *custom\
2236) 2301)
2237 CODE: 2302 CODE:
2238{ 2303{
2239 random_map_params rmp; 2304 random_map_params rmp;
2240 2305
2250 assign (rmp.exit_on_final_map, exit_on_final_map); 2315 assign (rmp.exit_on_final_map, exit_on_final_map);
2251 2316
2252 rmp.origin_map = origin_map; 2317 rmp.origin_map = origin_map;
2253 rmp.final_map = final_map; 2318 rmp.final_map = final_map;
2254 rmp.this_map = this_map; 2319 rmp.this_map = this_map;
2255 rmp.Xsize = Xsize; 2320 rmp.xsize = xsize;
2256 rmp.Ysize = Ysize; 2321 rmp.ysize = ysize;
2257 rmp.expand2x = expand2x; 2322 rmp.expand2x = expand2x;
2258 rmp.layoutoptions1 = layoutoptions1; 2323 rmp.layoutoptions1 = layoutoptions1;
2259 rmp.layoutoptions2 = layoutoptions2; 2324 rmp.layoutoptions2 = layoutoptions2;
2260 rmp.layoutoptions3 = layoutoptions3; 2325 rmp.layoutoptions3 = layoutoptions3;
2261 rmp.symmetry = symmetry; 2326 rmp.symmetry = symmetry;
2272 rmp.total_map_hp = total_map_hp; 2337 rmp.total_map_hp = total_map_hp;
2273 rmp.map_layout_style = map_layout_style; 2338 rmp.map_layout_style = map_layout_style;
2274 rmp.treasureoptions = treasureoptions; 2339 rmp.treasureoptions = treasureoptions;
2275 rmp.symmetry_used = symmetry_used; 2340 rmp.symmetry_used = symmetry_used;
2276 rmp.region = region; 2341 rmp.region = region;
2342 rmp.custom = custom;
2277 2343
2278 RETVAL = generate_random_map (path, &rmp); 2344 RETVAL = self->generate_random_map (&rmp);
2279} 2345}
2280 OUTPUT: 2346 OUTPUT:
2281 RETVAL 2347 RETVAL
2282 2348
2283MODULE = cf PACKAGE = cf::arch 2349MODULE = cf PACKAGE = cf::arch
2315 OUTPUT: RETVAL 2381 OUTPUT: RETVAL
2316 2382
2317region *find (char *name) 2383region *find (char *name)
2318 PROTOTYPE: $ 2384 PROTOTYPE: $
2319 CODE: 2385 CODE:
2320 RETVAL = get_region_by_name (name); 2386 RETVAL = region::find (name);
2321 OUTPUT: RETVAL 2387 OUTPUT: RETVAL
2322 2388
2323INCLUDE: $PERL genacc region ../include/map.h | 2389INCLUDE: $PERL genacc region ../include/map.h |
2324 2390
2325MODULE = cf PACKAGE = cf::living 2391MODULE = cf PACKAGE = cf::living

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines