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.128 by root, Sun Jan 7 02:39:14 2007 UTC vs.
Revision 1.160 by elmex, Wed Jan 31 14:11:02 2007 UTC

99 99
100////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 100//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
101 101
102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104#if 0
105attachable *attachable::rc_first;
106
107attachable::attachable ()
108{
109 refcnt = 0;
110 rc_next = rc_first;
111 rc_first = this;
112}
113#endif
114
115attachable::~attachable () 104attachable::~attachable ()
116{ 105{
117 assert (!(flags & F_BORROWED));//D//TODO//remove when stable
118#if 0
119 assert (!rc_next);
120 assert (!refcnt); 106 assert (!self);
121#endif 107 assert (!cb);
108}
109
110int
111attachable::refcnt_cnt () const
112{
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 }
132}
133
134void
135attachable::optimise ()
136{
137 if (self
138 && SvREFCNT (self) == 1
139 && !HvTOTALKEYS (self))
140 sever_self ();
122} 141}
123 142
124// check wether the object really is dead 143// check wether the object really is dead
125void 144void
126attachable::do_check () 145attachable::do_check ()
127{ 146{
128 if (refcnt > 0) 147 if (refcnt_cnt () > 0)
129 return; 148 return;
130 149
131 // try to unborrow the refcnt from perl 150 destroy ();
132 if (flags & F_BORROWED) 151}
152
153void
154attachable::do_destroy ()
155{
156 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
157
158 if (cb)
133 { 159 {
134 assert (self);//D//TODO//remove when stable
135 flags &= ~F_BORROWED;
136 refcnt_inc ();
137 SvREFCNT_dec (self); 160 SvREFCNT_dec (cb);
161 cb = 0;
138 } 162 }
139 163
140 if (refcnt > 0 || self)
141 return;
142
143 destroy ();
144}
145
146void
147attachable::do_destroy ()
148{
149 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
150
151 if (self) 164 if (self)
152 hv_clear (self); 165 sever_self ();
153 166
154 //TODO: call generic destroy callback
155 mortals.push_back (this); 167 mortals.push_back (this);
156} 168}
157 169
158void 170void
159attachable::destroy () 171attachable::destroy ()
163 175
164 flags |= F_DESTROYED; 176 flags |= F_DESTROYED;
165 do_destroy (); 177 do_destroy ();
166} 178}
167 179
180void
168void attachable::check_mortals () 181attachable::check_mortals ()
169{ 182{
170 for (int i = 0; i < mortals.size (); ) 183 static int i = 0;
184
185 for (;;)
171 { 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
172 attachable *obj = mortals [i]; 197 attachable *obj = mortals [i];
173 198
174 obj->refcnt_chk (); // unborrow from perl, if necessary 199 obj->refcnt_chk (); // unborrow from perl, if necessary
175 200
201 //if (obj->refcnt > 0 || obj->self)
176 if (obj->refcnt || obj->self) 202 if (obj->refcnt || obj->self)
177 { 203 {
178#if 0 204//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
179 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
180 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
181#endif
182
183 ++i; // further delay freeing 205 ++i; // further delay freeing
206
207 if (!(i & 0x3ff))
208 break;
184 }//D 209 }
185 else 210 else
186 { 211 {
187 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
188 mortals.erase (i); 212 mortals.erase (i);
189 delete obj; 213 delete obj;
190 } 214 }
191 } 215 }
192} 216}
217 241
218static int 242static int
219attachable_free (pTHX_ SV *sv, MAGIC *mg) 243attachable_free (pTHX_ SV *sv, MAGIC *mg)
220{ 244{
221 attachable *at = (attachable *)mg->mg_ptr; 245 attachable *at = (attachable *)mg->mg_ptr;
222 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable 246
247 //TODO: check if transaction behaviour is really required here
248 if (SV *self = (SV *)at->self)
249 {
223 at->self = 0; 250 at->self = 0;
251 SvREFCNT_dec (self);
252 }
253
224 // 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
225 //at->refcnt_chk (); 255 //at->refcnt_chk ();
226 return 0; 256 return 0;
227} 257}
228 258
237 if (!obj->self) 267 if (!obj->self)
238 { 268 {
239 obj->self = newHV (); 269 obj->self = newHV ();
240 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);
241 271
242 // borrow the refcnt from the object 272 // now bless the object _once_
243 obj->flags |= attachable::F_BORROWED; 273 return sv_bless (newRV_inc ((SV *)obj->self), stash);
244 obj->refcnt_dec ();
245 } 274 }
275 else
276 {
277 SV *sv = newRV_inc ((SV *)obj->self);
246 278
247 return sv_bless (newRV_inc ((SV *)obj->self), stash); 279 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
280 SvAMAGIC_on (sv);
281
282 return sv;
283 }
248} 284}
249 285
250static void 286static void
251clearSVptr (SV *sv) 287clearSVptr (SV *sv)
252{ 288{
305inline 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); }
306 342
307inline SV *to_sv (object & v) { return to_sv (&v); } 343inline SV *to_sv (object & v) { return to_sv (&v); }
308inline SV *to_sv (living & v) { return to_sv (&v); } 344inline SV *to_sv (living & v) { return to_sv (&v); }
309 345
310//TODO:
311inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 346inline SV *to_sv (facetile * v) { return to_sv (v->name); }
312inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 347inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
313 348
314inline SV *to_sv (UUID v) 349inline SV *to_sv (UUID v)
315{ 350{
316 char buf[128]; 351 char buf[128];
317 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 352 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
318 return newSVpv (buf, 0); 353 return newSVpv (buf, 0);
319} 354}
320 355
321inline 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; }
322inline 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; }
341inline 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"); }
342inline 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"); }
343inline 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"); }
344inline 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"); }
345 380
346inline 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)]; }
347inline 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)); }
348 383
349template<class T> 384template<class T>
350inline 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; }
351 386
352template<int N> 387template<int N>
487{ 522{
488 if (!ext->cb) 523 if (!ext->cb)
489 ext->cb = newAV (); 524 ext->cb = newAV ();
490 525
491 return newRV_inc ((SV *)ext->cb); 526 return newRV_inc ((SV *)ext->cb);
492}
493
494#if 0
495void attachable::clear ()
496{
497 if (self)
498 {
499 // disconnect Perl from C, to avoid crashes
500 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
501
502 // clear the perl hash, might or might not be a good idea
503 hv_clear ((HV *)SvRV ((SV *)self));
504
505 SvREFCNT_dec (self);
506 self = 0;
507 }
508
509 if (cb)
510 {
511 SvREFCNT_dec (cb);
512 cb = 0;
513 }
514
515 attach = 0;
516}
517#endif
518
519void attachable::optimise ()
520{
521 if (self
522 && SvREFCNT (self) == 1
523 && !HvTOTALKEYS (self))
524 {
525 flags &= ~F_BORROWED;
526 refcnt_inc ();
527 SvREFCNT_dec ((SV *)self);
528 }
529} 527}
530 528
531///////////////////////////////////////////////////////////////////////////// 529/////////////////////////////////////////////////////////////////////////////
532 530
533extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 531extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
829} 827}
830 828
831///////////////////////////////////////////////////////////////////////////// 829/////////////////////////////////////////////////////////////////////////////
832 830
833void 831void
834maptile::emergency_save () 832cfperl_emergency_save ()
835{ 833{
836 CALL_BEGIN (0); 834 CALL_BEGIN (0);
837 CALL_CALL ("cf::map::emergency_save", G_VOID); 835 CALL_CALL ("cf::emergency_save", G_VOID);
838 CALL_END; 836 CALL_END;
839} 837}
840 838
841maptile * 839maptile *
842maptile::find_sync (const char *path, maptile *origin) 840maptile::find_sync (const char *path, maptile *origin)
843{ 841{
844 CALL_BEGIN (2); 842 CALL_BEGIN (2);
845 CALL_ARG (path); 843 CALL_ARG (path);
846 CALL_ARG (origin); 844 CALL_ARG (origin);
847 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);
848 866
849 maptile *retval; 867 maptile *retval;
850 868
851 if (count) 869 if (count)
852 sv_to (POPs, retval); 870 sv_to (POPs, retval);
905void 923void
906iw::alloc () 924iw::alloc ()
907{ 925{
908 pe = GEventAPI->new_idle (0, 0); 926 pe = GEventAPI->new_idle (0, 0);
909 927
928 WaREENTRANT_off (pe);
910 pe->base.callback = (void *)iw_dispatch; 929 pe->base.callback = (void *)iw_dispatch;
911 pe->base.ext_data = (void *)this; 930 pe->base.ext_data = (void *)this;
912} 931}
913 932
914static void iow_dispatch (pe_event *ev) 933static void iow_dispatch (pe_event *ev)
920void 939void
921iow::alloc () 940iow::alloc ()
922{ 941{
923 pe = GEventAPI->new_io (0, 0); 942 pe = GEventAPI->new_io (0, 0);
924 943
944 WaREENTRANT_off (pe);
925 pe->base.callback = (void *)iow_dispatch; 945 pe->base.callback = (void *)iow_dispatch;
926 pe->base.ext_data = (void *)this; 946 pe->base.ext_data = (void *)this;
927 947
928 pe->fd = -1; 948 pe->fd = -1;
929 pe->poll = 0; 949 pe->poll = 0;
1257 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1277 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1258 const_iv (FLAG_IS_WATER) 1278 const_iv (FLAG_IS_WATER)
1259 const_iv (FLAG_CONTENT_ON_GEN) 1279 const_iv (FLAG_CONTENT_ON_GEN)
1260 const_iv (FLAG_IS_A_TEMPLATE) 1280 const_iv (FLAG_IS_A_TEMPLATE)
1261 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)
1262 1284
1263 const_iv (NDI_BLACK) 1285 const_iv (NDI_BLACK)
1264 const_iv (NDI_WHITE) 1286 const_iv (NDI_WHITE)
1265 const_iv (NDI_NAVY) 1287 const_iv (NDI_NAVY)
1266 const_iv (NDI_RED) 1288 const_iv (NDI_RED)
1451 const_iv (ATNR_BLIND) 1473 const_iv (ATNR_BLIND)
1452 const_iv (ATNR_INTERNAL) 1474 const_iv (ATNR_INTERNAL)
1453 const_iv (ATNR_LIFE_STEALING) 1475 const_iv (ATNR_LIFE_STEALING)
1454 const_iv (ATNR_DISEASE) 1476 const_iv (ATNR_DISEASE)
1455 1477
1456 const_iv (MAP_FLUSH)
1457 const_iv (MAP_PLAYER_UNIQUE)
1458 const_iv (MAP_BLOCK)
1459 const_iv (MAP_STYLE)
1460 const_iv (MAP_OVERLAY)
1461
1462 const_iv (MAP_IN_MEMORY) 1478 const_iv (MAP_IN_MEMORY)
1463 const_iv (MAP_SWAPPED) 1479 const_iv (MAP_SWAPPED)
1464 const_iv (MAP_LOADING) 1480 const_iv (MAP_LOADING)
1465 const_iv (MAP_SAVING) 1481 const_iv (MAP_SAVING)
1466 1482
1559} 1575}
1560 1576
1561NV floor (NV x) 1577NV floor (NV x)
1562 1578
1563NV 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
1564 1592
1565void server_tick () 1593void server_tick ()
1566 CODE: 1594 CODE:
1567 runtime = SvNVx (sv_runtime); 1595 runtime = SvNVx (sv_runtime);
1568 server_tick (); 1596 server_tick ();
1615 } 1643 }
1616 OUTPUT: RETVAL 1644 OUTPUT: RETVAL
1617 1645
1618void abort () 1646void abort ()
1619 1647
1648void fork_abort (char *cause = "cf::fork_abort")
1649
1650void cleanup (const char *cause, bool make_core = false)
1651
1620void emergency_save () 1652void emergency_save ()
1621 1653
1622void _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
1623 1661
1624#if _POSIX_MEMLOCK 1662#if _POSIX_MEMLOCK
1625 1663
1626int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1664int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1627 1665
1682 CODE: 1720 CODE:
1683 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1721 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1684 OUTPUT: 1722 OUTPUT:
1685 RETVAL 1723 RETVAL
1686 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
1687INCLUDE: $PERL genacc attachable ../include/cfperl.h | 1735INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1688 1736
1689MODULE = cf PACKAGE = cf::global 1737MODULE = cf PACKAGE = cf::global
1690 1738
1691int invoke (SV *klass, int event, ...) 1739int invoke (SV *klass, int event, ...)
1708 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1756 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1709 OUTPUT: RETVAL 1757 OUTPUT: RETVAL
1710 1758
1711SV *registry (object *op) 1759SV *registry (object *op)
1712 1760
1713void mortals () 1761int objects_size ()
1714 PPCODE: 1762 CODE:
1715 EXTEND (SP, object::mortals.size ());
1716 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1717 PUSHs (to_sv (*i));
1718
1719object *first ()
1720 CODE:
1721 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;
1722 OUTPUT: RETVAL 1779 OUTPUT: RETVAL
1723 1780
1724# missing properties 1781# missing properties
1725 1782
1726object *head (object *op) 1783object *head (object *op)
1727 PROTOTYPE: $ 1784 PROTOTYPE: $
1728 CODE: 1785 CODE:
1729 RETVAL = op->head ? op->head : op; 1786 RETVAL = op->head_ ();
1730 OUTPUT: RETVAL 1787 OUTPUT: RETVAL
1731 1788
1732int is_head (object *op) 1789int is_head (object *op)
1733 PROTOTYPE: $ 1790 PROTOTYPE: $
1734 CODE: 1791 CODE:
1735 RETVAL = !op->head; 1792 RETVAL = op->head_ () == op;
1736 OUTPUT: RETVAL 1793 OUTPUT: RETVAL
1737 1794
1738void 1795void
1739inv (object *obj) 1796inv (object *obj)
1740 PROTOTYPE: $ 1797 PROTOTYPE: $
1747 1804
1748void 1805void
1749set_animation (object *op, int idx) 1806set_animation (object *op, int idx)
1750 CODE: 1807 CODE:
1751 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
1752 1815
1753object *find_best_object_match (object *op, const char *match) 1816object *find_best_object_match (object *op, const char *match)
1754 1817
1755object *find_marked_object (object *op) 1818object *find_marked_object (object *op)
1756 1819
1831 1894
1832void drop (object *who, object *op) 1895void drop (object *who, object *op)
1833 1896
1834void pick_up (object *who, object *op) 1897void pick_up (object *who, object *op)
1835 1898
1836object *cf_object_insert_object (object *op, object *container)
1837
1838object *cf_object_insert_in_ob (object *ob, object *where)
1839
1840int cf_object_teleport (object *op, maptile *map, int x, int y) 1899int cf_object_teleport (object *op, maptile *map, int x, int y)
1841 1900
1842void update_object (object *op, int action) 1901void update_object (object *op, int action)
1843 1902
1844object *cf_create_object_by_name (const char *name) 1903object *cf_create_object_by_name (const char *name)
1962 2021
1963void esrv_update_item (object *op, int what, object *item) 2022void esrv_update_item (object *op, int what, object *item)
1964 C_ARGS: what, op, item 2023 C_ARGS: what, op, item
1965 2024
1966void clear_los (object *op) 2025void clear_los (object *op)
1967
1968int command_teleport (object *op, char *params)
1969 2026
1970int command_summon (object *op, char *params) 2027int command_summon (object *op, char *params)
1971 2028
1972int command_arrest (object *op, char *params) 2029int command_arrest (object *op, char *params)
1973 2030
2053list () 2110list ()
2054 PPCODE: 2111 PPCODE:
2055 for_all_players (pl) 2112 for_all_players (pl)
2056 XPUSHs (sv_2mortal (to_sv (pl))); 2113 XPUSHs (sv_2mortal (to_sv (pl)));
2057 2114
2058bool
2059peaceful (player *pl, bool new_setting = 0)
2060 PROTOTYPE: $;$
2061 CODE:
2062 RETVAL = pl->peaceful;
2063 if (items > 1)
2064 pl->peaceful = new_setting;
2065 OUTPUT:
2066 RETVAL
2067
2068living *
2069orig_stats (player *pl)
2070 CODE:
2071 RETVAL = &pl->orig_stats;
2072 OUTPUT: RETVAL
2073
2074living *
2075last_stats (player *pl)
2076 CODE:
2077 RETVAL = &pl->last_stats;
2078 OUTPUT: RETVAL
2079
2080 2115
2081MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2116MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2082 2117
2083int invoke (maptile *map, int event, ...) 2118int invoke (maptile *map, int event, ...)
2084 CODE: 2119 CODE:
2113 for_all_players (pl) 2148 for_all_players (pl)
2114 if (pl->ob && pl->ob->map == THIS) 2149 if (pl->ob && pl->ob->map == THIS)
2115 PUSHs (sv_2mortal (to_sv (pl->ob))); 2150 PUSHs (sv_2mortal (to_sv (pl->ob)));
2116 } 2151 }
2117 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
2118void 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)
2119 2172
2120int out_of_map (maptile *map, int x, int y) 2173int out_of_map (maptile *map, int x, int y)
2121 2174
2122void 2175void
2138 2191
2139object* 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)
2140 C_ARGS: str, map, nx, ny 2193 C_ARGS: str, map, nx, ny
2141 2194
2142void 2195void
2143cf_map_normalise (maptile *map, int x, int y) 2196get_map_flags (maptile *map, int x, int y)
2144 PPCODE: 2197 PPCODE:
2145{ 2198{
2146 maptile *nmap = 0; 2199 maptile *nmap = 0;
2147 I16 nx = 0, ny = 0; 2200 I16 nx = 0, ny = 0;
2148 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2201 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2203 2256
2204void fix_walls (maptile *map, int x, int y) 2257void fix_walls (maptile *map, int x, int y)
2205 2258
2206void fix_walls_around (maptile *map, int x, int y) 2259void fix_walls_around (maptile *map, int x, int y)
2207 2260
2208const char *
2209region_name (maptile *m)
2210 CODE:
2211 RETVAL = get_name_of_region_for_map (m);
2212 OUTPUT: RETVAL
2213
2214# worst xs function of my life 2261# worst xs function of my life
2215maptile * 2262bool
2216_create_random_map (\ 2263_create_random_map (\
2217 char *path,\ 2264 maptile *self,\
2218 char *wallstyle,\ 2265 char *wallstyle,\
2219 char *wall_name,\ 2266 char *wall_name,\
2220 char *floorstyle,\ 2267 char *floorstyle,\
2221 char *monsterstyle,\ 2268 char *monsterstyle,\
2222 char *treasurestyle,\ 2269 char *treasurestyle,\
2226 char *origin_map,\ 2273 char *origin_map,\
2227 char *final_map,\ 2274 char *final_map,\
2228 char *exitstyle,\ 2275 char *exitstyle,\
2229 char *this_map,\ 2276 char *this_map,\
2230 char *exit_on_final_map,\ 2277 char *exit_on_final_map,\
2231 int Xsize,\ 2278 int xsize,\
2232 int Ysize,\ 2279 int ysize,\
2233 int expand2x,\ 2280 int expand2x,\
2234 int layoutoptions1,\ 2281 int layoutoptions1,\
2235 int layoutoptions2,\ 2282 int layoutoptions2,\
2236 int layoutoptions3,\ 2283 int layoutoptions3,\
2237 int symmetry,\ 2284 int symmetry,\
2242 int dungeon_depth,\ 2289 int dungeon_depth,\
2243 int decoroptions,\ 2290 int decoroptions,\
2244 int orientation,\ 2291 int orientation,\
2245 int origin_y,\ 2292 int origin_y,\
2246 int origin_x,\ 2293 int origin_x,\
2247 int random_seed,\ 2294 U32 random_seed,\
2248 val64 total_map_hp,\ 2295 val64 total_map_hp,\
2249 int map_layout_style,\ 2296 int map_layout_style,\
2250 int treasureoptions,\ 2297 int treasureoptions,\
2251 int symmetry_used,\ 2298 int symmetry_used,\
2252 region *region\ 2299 region *region,\
2300 char *custom\
2253) 2301)
2254 CODE: 2302 CODE:
2255{ 2303{
2256 random_map_params rmp; 2304 random_map_params rmp;
2257 2305
2267 assign (rmp.exit_on_final_map, exit_on_final_map); 2315 assign (rmp.exit_on_final_map, exit_on_final_map);
2268 2316
2269 rmp.origin_map = origin_map; 2317 rmp.origin_map = origin_map;
2270 rmp.final_map = final_map; 2318 rmp.final_map = final_map;
2271 rmp.this_map = this_map; 2319 rmp.this_map = this_map;
2272 rmp.Xsize = Xsize; 2320 rmp.xsize = xsize;
2273 rmp.Ysize = Ysize; 2321 rmp.ysize = ysize;
2274 rmp.expand2x = expand2x; 2322 rmp.expand2x = expand2x;
2275 rmp.layoutoptions1 = layoutoptions1; 2323 rmp.layoutoptions1 = layoutoptions1;
2276 rmp.layoutoptions2 = layoutoptions2; 2324 rmp.layoutoptions2 = layoutoptions2;
2277 rmp.layoutoptions3 = layoutoptions3; 2325 rmp.layoutoptions3 = layoutoptions3;
2278 rmp.symmetry = symmetry; 2326 rmp.symmetry = symmetry;
2289 rmp.total_map_hp = total_map_hp; 2337 rmp.total_map_hp = total_map_hp;
2290 rmp.map_layout_style = map_layout_style; 2338 rmp.map_layout_style = map_layout_style;
2291 rmp.treasureoptions = treasureoptions; 2339 rmp.treasureoptions = treasureoptions;
2292 rmp.symmetry_used = symmetry_used; 2340 rmp.symmetry_used = symmetry_used;
2293 rmp.region = region; 2341 rmp.region = region;
2342 rmp.custom = custom;
2294 2343
2295 RETVAL = generate_random_map (path, &rmp); 2344 RETVAL = self->generate_random_map (&rmp);
2296} 2345}
2297 OUTPUT: 2346 OUTPUT:
2298 RETVAL 2347 RETVAL
2299 2348
2300MODULE = cf PACKAGE = cf::arch 2349MODULE = cf PACKAGE = cf::arch
2332 OUTPUT: RETVAL 2381 OUTPUT: RETVAL
2333 2382
2334region *find (char *name) 2383region *find (char *name)
2335 PROTOTYPE: $ 2384 PROTOTYPE: $
2336 CODE: 2385 CODE:
2337 RETVAL = get_region_by_name (name); 2386 RETVAL = region::find (name);
2338 OUTPUT: RETVAL 2387 OUTPUT: RETVAL
2339 2388
2340INCLUDE: $PERL genacc region ../include/map.h | 2389INCLUDE: $PERL genacc region ../include/map.h |
2341 2390
2342MODULE = cf PACKAGE = cf::living 2391MODULE = cf PACKAGE = cf::living

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines