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.125 by root, Thu Jan 4 00:53:54 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) 164 if (self)
141 return; 165 sever_self ();
142 166
143 destroy ();
144}
145
146void
147attachable::do_destroy ()
148{
149 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
150
151 //TODO: call generic destroy callback
152 mortals.push_back (this); 167 mortals.push_back (this);
153} 168}
154 169
155void 170void
156attachable::destroy () 171attachable::destroy ()
160 175
161 flags |= F_DESTROYED; 176 flags |= F_DESTROYED;
162 do_destroy (); 177 do_destroy ();
163} 178}
164 179
180void
165void attachable::check_mortals () 181attachable::check_mortals ()
166{ 182{
167 for (int i = 0; i < mortals.size (); ) 183 static int i = 0;
184
185 for (;;)
168 { 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
169 attachable *obj = mortals [i]; 197 attachable *obj = mortals [i];
170 198
171 obj->refcnt_chk (); // unborrow from perl, if necessary 199 obj->refcnt_chk (); // unborrow from perl, if necessary
172 200
201 //if (obj->refcnt > 0 || obj->self)
173 if (obj->refcnt || obj->self) 202 if (obj->refcnt || obj->self)
174 { 203 {
175#if 0 204//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
176 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
177 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
178#endif
179
180 ++i; // further delay freeing 205 ++i; // further delay freeing
206
207 if (!(i & 0x3ff))
208 break;
181 }//D 209 }
182 else 210 else
183 { 211 {
184 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
185 mortals.erase (i); 212 mortals.erase (i);
186 delete obj; 213 delete obj;
187 } 214 }
188 } 215 }
189} 216}
214 241
215static int 242static int
216attachable_free (pTHX_ SV *sv, MAGIC *mg) 243attachable_free (pTHX_ SV *sv, MAGIC *mg)
217{ 244{
218 attachable *at = (attachable *)mg->mg_ptr; 245 attachable *at = (attachable *)mg->mg_ptr;
219 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 {
220 at->self = 0; 250 at->self = 0;
251 SvREFCNT_dec (self);
252 }
253
221 // 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
222 //at->refcnt_chk (); 255 //at->refcnt_chk ();
223 return 0; 256 return 0;
224} 257}
225 258
234 if (!obj->self) 267 if (!obj->self)
235 { 268 {
236 obj->self = newHV (); 269 obj->self = newHV ();
237 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);
238 271
239 // borrow the refcnt from the object 272 // now bless the object _once_
240 obj->flags |= attachable::F_BORROWED; 273 return sv_bless (newRV_inc ((SV *)obj->self), stash);
241 obj->refcnt_dec ();
242 } 274 }
275 else
276 {
277 SV *sv = newRV_inc ((SV *)obj->self);
243 278
244 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 }
245} 284}
246 285
247static void 286static void
248clearSVptr (SV *sv) 287clearSVptr (SV *sv)
249{ 288{
302inline 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); }
303 342
304inline SV *to_sv (object & v) { return to_sv (&v); } 343inline SV *to_sv (object & v) { return to_sv (&v); }
305inline SV *to_sv (living & v) { return to_sv (&v); } 344inline SV *to_sv (living & v) { return to_sv (&v); }
306 345
307//TODO:
308inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 346inline SV *to_sv (facetile * v) { return to_sv (v->name); }
309inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 347inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
310 348
311inline SV *to_sv (UUID v) 349inline SV *to_sv (UUID v)
312{ 350{
313 char buf[128]; 351 char buf[128];
314 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 352 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
315 return newSVpv (buf, 0); 353 return newSVpv (buf, 0);
316} 354}
317 355
318inline 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; }
319inline 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; }
333inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 371inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); }
334inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); } 372inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); }
335inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); } 373inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); }
336inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); } 374inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); }
337inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); } 375inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
376inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
338inline 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"); }
339inline 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"); }
340inline 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"); }
341 380
342inline 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)]; }
343inline 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)); }
344 383
345template<class T> 384template<class T>
346inline 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; }
347 386
348template<int N> 387template<int N>
483{ 522{
484 if (!ext->cb) 523 if (!ext->cb)
485 ext->cb = newAV (); 524 ext->cb = newAV ();
486 525
487 return newRV_inc ((SV *)ext->cb); 526 return newRV_inc ((SV *)ext->cb);
488}
489
490#if 0
491void attachable::clear ()
492{
493 if (self)
494 {
495 // disconnect Perl from C, to avoid crashes
496 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
497
498 // clear the perl hash, might or might not be a good idea
499 hv_clear ((HV *)SvRV ((SV *)self));
500
501 SvREFCNT_dec (self);
502 self = 0;
503 }
504
505 if (cb)
506 {
507 SvREFCNT_dec (cb);
508 cb = 0;
509 }
510
511 attach = 0;
512}
513#endif
514
515void attachable::optimise ()
516{
517 if (self
518 && SvREFCNT (self) == 1
519 && !HvTOTALKEYS (self))
520 {
521 flags &= ~F_BORROWED;
522 refcnt_inc ();
523 SvREFCNT_dec ((SV *)self);
524 }
525} 527}
526 528
527///////////////////////////////////////////////////////////////////////////// 529/////////////////////////////////////////////////////////////////////////////
528 530
529extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 531extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
825} 827}
826 828
827///////////////////////////////////////////////////////////////////////////// 829/////////////////////////////////////////////////////////////////////////////
828 830
829void 831void
830maptile::emergency_save () 832cfperl_emergency_save ()
831{ 833{
832 CALL_BEGIN (0); 834 CALL_BEGIN (0);
833 CALL_CALL ("cf::map::emergency_save", G_VOID); 835 CALL_CALL ("cf::emergency_save", G_VOID);
834 CALL_END; 836 CALL_END;
835} 837}
836 838
837maptile * 839maptile *
838maptile::load_map_sync (const char *path, maptile *origin) 840maptile::find_sync (const char *path, maptile *origin)
839{ 841{
840 CALL_BEGIN (2); 842 CALL_BEGIN (2);
841 CALL_ARG (path); 843 CALL_ARG (path);
842 CALL_ARG (origin); 844 CALL_ARG (origin);
843 CALL_CALL ("cf::map::load_map_sync", G_SCALAR); 845 CALL_CALL ("cf::map::find_sync", G_SCALAR);
844 846
845 maptile *retval; 847 maptile *retval;
846 848
847 if (count) 849 if (count)
848 sv_to (POPs, retval); 850 sv_to (POPs, retval);
850 retval = 0; 852 retval = 0;
851 853
852 CALL_END; 854 CALL_END;
853 855
854 return retval; 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);
866
867 maptile *retval;
868
869 if (count)
870 sv_to (POPs, retval);
871 else
872 retval = 0;
873
874 CALL_END;
875
876 return retval;
877}
878
879void
880maptile::do_load_sync ()
881{
882 CALL_BEGIN (1);
883 CALL_ARG (this);
884 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
885 CALL_END;
855} 886}
856 887
857void 888void
858maptile::change_all_map_light (int change) 889maptile::change_all_map_light (int change)
859{ 890{
892void 923void
893iw::alloc () 924iw::alloc ()
894{ 925{
895 pe = GEventAPI->new_idle (0, 0); 926 pe = GEventAPI->new_idle (0, 0);
896 927
928 WaREENTRANT_off (pe);
897 pe->base.callback = (void *)iw_dispatch; 929 pe->base.callback = (void *)iw_dispatch;
898 pe->base.ext_data = (void *)this; 930 pe->base.ext_data = (void *)this;
899} 931}
900 932
901static void iow_dispatch (pe_event *ev) 933static void iow_dispatch (pe_event *ev)
907void 939void
908iow::alloc () 940iow::alloc ()
909{ 941{
910 pe = GEventAPI->new_io (0, 0); 942 pe = GEventAPI->new_io (0, 0);
911 943
944 WaREENTRANT_off (pe);
912 pe->base.callback = (void *)iow_dispatch; 945 pe->base.callback = (void *)iow_dispatch;
913 pe->base.ext_data = (void *)this; 946 pe->base.ext_data = (void *)this;
914 947
915 pe->fd = -1; 948 pe->fd = -1;
916 pe->poll = 0; 949 pe->poll = 0;
1244 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1277 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1245 const_iv (FLAG_IS_WATER) 1278 const_iv (FLAG_IS_WATER)
1246 const_iv (FLAG_CONTENT_ON_GEN) 1279 const_iv (FLAG_CONTENT_ON_GEN)
1247 const_iv (FLAG_IS_A_TEMPLATE) 1280 const_iv (FLAG_IS_A_TEMPLATE)
1248 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)
1249 1284
1250 const_iv (NDI_BLACK) 1285 const_iv (NDI_BLACK)
1251 const_iv (NDI_WHITE) 1286 const_iv (NDI_WHITE)
1252 const_iv (NDI_NAVY) 1287 const_iv (NDI_NAVY)
1253 const_iv (NDI_RED) 1288 const_iv (NDI_RED)
1438 const_iv (ATNR_BLIND) 1473 const_iv (ATNR_BLIND)
1439 const_iv (ATNR_INTERNAL) 1474 const_iv (ATNR_INTERNAL)
1440 const_iv (ATNR_LIFE_STEALING) 1475 const_iv (ATNR_LIFE_STEALING)
1441 const_iv (ATNR_DISEASE) 1476 const_iv (ATNR_DISEASE)
1442 1477
1443 const_iv (MAP_FLUSH)
1444 const_iv (MAP_PLAYER_UNIQUE)
1445 const_iv (MAP_BLOCK)
1446 const_iv (MAP_STYLE)
1447 const_iv (MAP_OVERLAY)
1448
1449 const_iv (MAP_IN_MEMORY) 1478 const_iv (MAP_IN_MEMORY)
1450 const_iv (MAP_SWAPPED) 1479 const_iv (MAP_SWAPPED)
1451 const_iv (MAP_LOADING) 1480 const_iv (MAP_LOADING)
1452 const_iv (MAP_SAVING) 1481 const_iv (MAP_SAVING)
1453 1482
1466 const_iv (ST_SETUP) 1495 const_iv (ST_SETUP)
1467 const_iv (ST_PLAYING) 1496 const_iv (ST_PLAYING)
1468 const_iv (ST_CUSTOM) 1497 const_iv (ST_CUSTOM)
1469 1498
1470 const_iv (ST_CHANGE_CLASS) 1499 const_iv (ST_CHANGE_CLASS)
1471 const_iv (ST_CONFIRM_QUIT)
1472 const_iv (ST_GET_PARTY_PASSWORD)
1473 1500
1474 const_iv (IO_HEADER) 1501 const_iv (IO_HEADER)
1475 const_iv (IO_OBJECTS) 1502 const_iv (IO_OBJECTS)
1476 const_iv (IO_UNIQUES) 1503 const_iv (IO_UNIQUES)
1477 1504
1531 1558
1532void _global_reattach () 1559void _global_reattach ()
1533 CODE: 1560 CODE:
1534{ 1561{
1535 // reattach to all attachable objects in the game. 1562 // reattach to all attachable objects in the game.
1536 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1563 for_all_clients (ns)
1537 (*i)->reattach (); 1564 ns->reattach ();
1538 1565
1539 for_all_players (pl) 1566 for_all_players (pl)
1540 pl->reattach (); 1567 pl->reattach ();
1541 1568
1542 //TODO 1569 //TODO
1543 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1570 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1544 // i->second->reattach (); 1571 // i->second->reattach ();
1545 1572
1546 for (object *op = object::first; op; op = op->next) 1573 for_all_objects (op)
1547 op->reattach (); 1574 op->reattach ();
1548} 1575}
1549 1576
1550NV floor (NV x) 1577NV floor (NV x)
1551 1578
1552NV 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
1553 1592
1554void server_tick () 1593void server_tick ()
1555 CODE: 1594 CODE:
1556 runtime = SvNVx (sv_runtime); 1595 runtime = SvNVx (sv_runtime);
1557 server_tick (); 1596 server_tick ();
1604 } 1643 }
1605 OUTPUT: RETVAL 1644 OUTPUT: RETVAL
1606 1645
1607void abort () 1646void abort ()
1608 1647
1648void fork_abort (char *cause = "cf::fork_abort")
1649
1650void cleanup (const char *cause, bool make_core = false)
1651
1609void emergency_save () 1652void emergency_save ()
1610 1653
1611void _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
1612 1661
1613#if _POSIX_MEMLOCK 1662#if _POSIX_MEMLOCK
1614 1663
1615int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1664int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1616 1665
1671 CODE: 1720 CODE:
1672 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1721 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1673 OUTPUT: 1722 OUTPUT:
1674 RETVAL 1723 RETVAL
1675 1724
1676#bool 1725int mortals_size ()
1677#destroyed (attachable *at) 1726 CODE:
1678# 1727 RETVAL = attachable::mortals.size ();
1679#void 1728 OUTPUT: RETVAL
1680#destroy (attachable *at) 1729
1730#object *mortals (U32 index)
1731# CODE:
1732# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1733# OUTPUT: RETVAL
1734
1735INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1681 1736
1682MODULE = cf PACKAGE = cf::global 1737MODULE = cf PACKAGE = cf::global
1683 1738
1684int invoke (SV *klass, int event, ...) 1739int invoke (SV *klass, int event, ...)
1685 CODE: 1740 CODE:
1701 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1756 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1702 OUTPUT: RETVAL 1757 OUTPUT: RETVAL
1703 1758
1704SV *registry (object *op) 1759SV *registry (object *op)
1705 1760
1706void mortals () 1761int objects_size ()
1707 PPCODE: 1762 CODE:
1708 EXTEND (SP, object::mortals.size ());
1709 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1710 PUSHs (to_sv (*i));
1711
1712object *first ()
1713 CODE:
1714 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;
1715 OUTPUT: RETVAL 1779 OUTPUT: RETVAL
1716 1780
1717# missing properties 1781# missing properties
1718 1782
1719object *head (object *op) 1783object *head (object *op)
1720 PROTOTYPE: $ 1784 PROTOTYPE: $
1721 CODE: 1785 CODE:
1722 RETVAL = op->head ? op->head : op; 1786 RETVAL = op->head_ ();
1723 OUTPUT: RETVAL 1787 OUTPUT: RETVAL
1724 1788
1725int is_head (object *op) 1789int is_head (object *op)
1726 PROTOTYPE: $ 1790 PROTOTYPE: $
1727 CODE: 1791 CODE:
1728 RETVAL = !op->head; 1792 RETVAL = op->head_ () == op;
1729 OUTPUT: RETVAL 1793 OUTPUT: RETVAL
1730 1794
1731void 1795void
1732inv (object *obj) 1796inv (object *obj)
1733 PROTOTYPE: $ 1797 PROTOTYPE: $
1740 1804
1741void 1805void
1742set_animation (object *op, int idx) 1806set_animation (object *op, int idx)
1743 CODE: 1807 CODE:
1744 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
1745 1815
1746object *find_best_object_match (object *op, const char *match) 1816object *find_best_object_match (object *op, const char *match)
1747 1817
1748object *find_marked_object (object *op) 1818object *find_marked_object (object *op)
1749 1819
1824 1894
1825void drop (object *who, object *op) 1895void drop (object *who, object *op)
1826 1896
1827void pick_up (object *who, object *op) 1897void pick_up (object *who, object *op)
1828 1898
1829object *cf_object_insert_object (object *op, object *container)
1830
1831object *cf_object_insert_in_ob (object *ob, object *where)
1832
1833int cf_object_teleport (object *op, maptile *map, int x, int y) 1899int cf_object_teleport (object *op, maptile *map, int x, int y)
1834 1900
1835void update_object (object *op, int action) 1901void update_object (object *op, int action)
1836 1902
1837object *cf_create_object_by_name (const char *name) 1903object *cf_create_object_by_name (const char *name)
1956void esrv_update_item (object *op, int what, object *item) 2022void esrv_update_item (object *op, int what, object *item)
1957 C_ARGS: what, op, item 2023 C_ARGS: what, op, item
1958 2024
1959void clear_los (object *op) 2025void clear_los (object *op)
1960 2026
1961int command_teleport (object *op, char *params)
1962
1963int command_summon (object *op, char *params) 2027int command_summon (object *op, char *params)
1964 2028
1965int command_arrest (object *op, char *params) 2029int command_arrest (object *op, char *params)
1966 2030
1967int command_kick (object *op, char *params) 2031int command_kick (object *op, char *params)
1988 CODE: 2052 CODE:
1989 pl->ob->stats.hp = pl->ob->stats.maxhp; 2053 pl->ob->stats.hp = pl->ob->stats.maxhp;
1990 pl->ob->stats.sp = pl->ob->stats.maxsp; 2054 pl->ob->stats.sp = pl->ob->stats.maxsp;
1991 pl->ob->stats.grace = pl->ob->stats.maxgrace; 2055 pl->ob->stats.grace = pl->ob->stats.maxgrace;
1992 pl->orig_stats = pl->ob->stats; 2056 pl->orig_stats = pl->ob->stats;
1993
1994player *cf_player_find (char *name)
1995 PROTOTYPE: $
1996 2057
1997void cf_player_move (player *pl, int dir) 2058void cf_player_move (player *pl, int dir)
1998 2059
1999void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2060void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
2000 2061
2046 if (y) sv_to (y, pl->bed_y); 2107 if (y) sv_to (y, pl->bed_y);
2047 2108
2048void 2109void
2049list () 2110list ()
2050 PPCODE: 2111 PPCODE:
2051 for (player *pl = first_player; pl; pl = pl->next) 2112 for_all_players (pl)
2052 XPUSHs (sv_2mortal (to_sv (pl))); 2113 XPUSHs (sv_2mortal (to_sv (pl)));
2053
2054bool
2055peaceful (player *pl, bool new_setting = 0)
2056 PROTOTYPE: $;$
2057 CODE:
2058 RETVAL = pl->peaceful;
2059 if (items > 1)
2060 pl->peaceful = new_setting;
2061 OUTPUT:
2062 RETVAL
2063
2064living *
2065orig_stats (player *pl)
2066 CODE:
2067 RETVAL = &pl->orig_stats;
2068 OUTPUT: RETVAL
2069
2070living *
2071last_stats (player *pl)
2072 CODE:
2073 RETVAL = &pl->last_stats;
2074 OUTPUT: RETVAL
2075 2114
2076 2115
2077MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2116MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2078 2117
2079int invoke (maptile *map, int event, ...) 2118int invoke (maptile *map, int event, ...)
2095 PROTOTYPE: 2134 PROTOTYPE:
2096 CODE: 2135 CODE:
2097 RETVAL = new maptile; 2136 RETVAL = new maptile;
2098 OUTPUT: 2137 OUTPUT:
2099 RETVAL 2138 RETVAL
2100
2101void
2102maptile::destroy ()
2103 2139
2104void 2140void
2105maptile::players () 2141maptile::players ()
2106 PPCODE: 2142 PPCODE:
2107 if (GIMME_V == G_SCALAR) 2143 if (GIMME_V == G_SCALAR)
2112 for_all_players (pl) 2148 for_all_players (pl)
2113 if (pl->ob && pl->ob->map == THIS) 2149 if (pl->ob && pl->ob->map == THIS)
2114 PUSHs (sv_2mortal (to_sv (pl->ob))); 2150 PUSHs (sv_2mortal (to_sv (pl->ob)));
2115 } 2151 }
2116 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
2117void 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)
2118 2172
2119int out_of_map (maptile *map, int x, int y) 2173int out_of_map (maptile *map, int x, int y)
2120 2174
2121void 2175void
2137 2191
2138object* 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)
2139 C_ARGS: str, map, nx, ny 2193 C_ARGS: str, map, nx, ny
2140 2194
2141void 2195void
2142cf_map_normalise (maptile *map, int x, int y) 2196get_map_flags (maptile *map, int x, int y)
2143 PPCODE: 2197 PPCODE:
2144{ 2198{
2145 maptile *nmap = 0; 2199 maptile *nmap = 0;
2146 I16 nx = 0, ny = 0; 2200 I16 nx = 0, ny = 0;
2147 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2201 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2202 2256
2203void fix_walls (maptile *map, int x, int y) 2257void fix_walls (maptile *map, int x, int y)
2204 2258
2205void fix_walls_around (maptile *map, int x, int y) 2259void fix_walls_around (maptile *map, int x, int y)
2206 2260
2207const char *
2208region_name (maptile *m)
2209 CODE:
2210 RETVAL = get_name_of_region_for_map (m);
2211 OUTPUT: RETVAL
2212
2213# worst xs function of my life 2261# worst xs function of my life
2214maptile * 2262bool
2215_create_random_map (\ 2263_create_random_map (\
2216 char *path,\ 2264 maptile *self,\
2217 char *wallstyle,\ 2265 char *wallstyle,\
2218 char *wall_name,\ 2266 char *wall_name,\
2219 char *floorstyle,\ 2267 char *floorstyle,\
2220 char *monsterstyle,\ 2268 char *monsterstyle,\
2221 char *treasurestyle,\ 2269 char *treasurestyle,\
2225 char *origin_map,\ 2273 char *origin_map,\
2226 char *final_map,\ 2274 char *final_map,\
2227 char *exitstyle,\ 2275 char *exitstyle,\
2228 char *this_map,\ 2276 char *this_map,\
2229 char *exit_on_final_map,\ 2277 char *exit_on_final_map,\
2230 int Xsize,\ 2278 int xsize,\
2231 int Ysize,\ 2279 int ysize,\
2232 int expand2x,\ 2280 int expand2x,\
2233 int layoutoptions1,\ 2281 int layoutoptions1,\
2234 int layoutoptions2,\ 2282 int layoutoptions2,\
2235 int layoutoptions3,\ 2283 int layoutoptions3,\
2236 int symmetry,\ 2284 int symmetry,\
2241 int dungeon_depth,\ 2289 int dungeon_depth,\
2242 int decoroptions,\ 2290 int decoroptions,\
2243 int orientation,\ 2291 int orientation,\
2244 int origin_y,\ 2292 int origin_y,\
2245 int origin_x,\ 2293 int origin_x,\
2246 int random_seed,\ 2294 U32 random_seed,\
2247 val64 total_map_hp,\ 2295 val64 total_map_hp,\
2248 int map_layout_style,\ 2296 int map_layout_style,\
2249 int treasureoptions,\ 2297 int treasureoptions,\
2250 int symmetry_used,\ 2298 int symmetry_used,\
2251 region *region\ 2299 region *region,\
2300 char *custom\
2252) 2301)
2253 CODE: 2302 CODE:
2254{ 2303{
2255 random_map_params rmp; 2304 random_map_params rmp;
2256 2305
2266 assign (rmp.exit_on_final_map, exit_on_final_map); 2315 assign (rmp.exit_on_final_map, exit_on_final_map);
2267 2316
2268 rmp.origin_map = origin_map; 2317 rmp.origin_map = origin_map;
2269 rmp.final_map = final_map; 2318 rmp.final_map = final_map;
2270 rmp.this_map = this_map; 2319 rmp.this_map = this_map;
2271 rmp.Xsize = Xsize; 2320 rmp.xsize = xsize;
2272 rmp.Ysize = Ysize; 2321 rmp.ysize = ysize;
2273 rmp.expand2x = expand2x; 2322 rmp.expand2x = expand2x;
2274 rmp.layoutoptions1 = layoutoptions1; 2323 rmp.layoutoptions1 = layoutoptions1;
2275 rmp.layoutoptions2 = layoutoptions2; 2324 rmp.layoutoptions2 = layoutoptions2;
2276 rmp.layoutoptions3 = layoutoptions3; 2325 rmp.layoutoptions3 = layoutoptions3;
2277 rmp.symmetry = symmetry; 2326 rmp.symmetry = symmetry;
2288 rmp.total_map_hp = total_map_hp; 2337 rmp.total_map_hp = total_map_hp;
2289 rmp.map_layout_style = map_layout_style; 2338 rmp.map_layout_style = map_layout_style;
2290 rmp.treasureoptions = treasureoptions; 2339 rmp.treasureoptions = treasureoptions;
2291 rmp.symmetry_used = symmetry_used; 2340 rmp.symmetry_used = symmetry_used;
2292 rmp.region = region; 2341 rmp.region = region;
2342 rmp.custom = custom;
2293 2343
2294 RETVAL = generate_random_map (path, &rmp); 2344 RETVAL = self->generate_random_map (&rmp);
2295} 2345}
2296 OUTPUT: 2346 OUTPUT:
2297 RETVAL 2347 RETVAL
2298 2348
2299MODULE = cf PACKAGE = cf::arch 2349MODULE = cf PACKAGE = cf::arch
2331 OUTPUT: RETVAL 2381 OUTPUT: RETVAL
2332 2382
2333region *find (char *name) 2383region *find (char *name)
2334 PROTOTYPE: $ 2384 PROTOTYPE: $
2335 CODE: 2385 CODE:
2336 RETVAL = get_region_by_name (name); 2386 RETVAL = region::find (name);
2337 OUTPUT: RETVAL 2387 OUTPUT: RETVAL
2338 2388
2339INCLUDE: $PERL genacc region ../include/map.h | 2389INCLUDE: $PERL genacc region ../include/map.h |
2340 2390
2341MODULE = cf PACKAGE = cf::living 2391MODULE = cf PACKAGE = cf::living
2375 char *buf = SvPVbyte (packet, len); 2425 char *buf = SvPVbyte (packet, len);
2376 2426
2377 THIS->send_packet (buf, len); 2427 THIS->send_packet (buf, len);
2378} 2428}
2379 2429
2380void
2381client::destroy ()
2382

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines