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.153 by root, Fri Jan 26 20:59:57 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::optimise ()
118{
119 if (self
120 && SvREFCNT (self) == 1
121 && !HvTOTALKEYS (self))
122 {
123 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
124 assert (!self);
125 }
122} 126}
123 127
124// check wether the object really is dead 128// check wether the object really is dead
125void 129void
126attachable::do_check () 130attachable::do_check ()
127{ 131{
128 if (refcnt > 0) 132 if (refcnt_cnt () > 0)
129 return; 133 return;
130 134
131 // try to unborrow the refcnt from perl 135 destroy ();
132 if (flags & F_BORROWED) 136}
137
138void
139attachable::do_destroy ()
140{
141 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
142
143 if (cb)
133 { 144 {
134 assert (self);//D//TODO//remove when stable
135 flags &= ~F_BORROWED;
136 refcnt_inc ();
137 SvREFCNT_dec (self); 145 SvREFCNT_dec (cb);
146 cb = 0;
138 } 147 }
139 148
140 if (refcnt > 0 || self) 149 if (self)
141 return; 150 {
151 hv_clear (self);
152 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
153 // self is now 0
154 assert (!self);//D//TODO remove soon
155 }
142 156
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); 157 mortals.push_back (this);
153} 158}
154 159
155void 160void
156attachable::destroy () 161attachable::destroy ()
160 165
161 flags |= F_DESTROYED; 166 flags |= F_DESTROYED;
162 do_destroy (); 167 do_destroy ();
163} 168}
164 169
170void
165void attachable::check_mortals () 171attachable::check_mortals ()
166{ 172{
167 for (int i = 0; i < mortals.size (); ) 173 static int i = 0;
174
175 for (;;)
168 { 176 {
177 if (i >= mortals.size ())
178 {
179 i = 0;
180
181 if (mortals.size () > 1000)
182 fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ());
183
184 break;
185 }
186
169 attachable *obj = mortals [i]; 187 attachable *obj = mortals [i];
170 188
171 obj->refcnt_chk (); // unborrow from perl, if necessary 189 obj->refcnt_chk (); // unborrow from perl, if necessary
172 190
191 //if (obj->refcnt > 0 || obj->self)
173 if (obj->refcnt || obj->self) 192 if (obj->refcnt || obj->self)
174 { 193 {
175#if 0 194//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 195 ++i; // further delay freeing
196
197 if (!(i & 0x3ff))
198 break;
181 }//D 199 }
182 else 200 else
183 { 201 {
184 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
185 mortals.erase (i); 202 mortals.erase (i);
186 delete obj; 203 delete obj;
187 } 204 }
188 } 205 }
189} 206}
214 231
215static int 232static int
216attachable_free (pTHX_ SV *sv, MAGIC *mg) 233attachable_free (pTHX_ SV *sv, MAGIC *mg)
217{ 234{
218 attachable *at = (attachable *)mg->mg_ptr; 235 attachable *at = (attachable *)mg->mg_ptr;
219 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable 236
237 //TODO: check if transaction behaviour is really required here
238 if (SV *self = (SV *)at->self)
239 {
220 at->self = 0; 240 at->self = 0;
241 SvREFCNT_dec (self);
242 }
243
221 // next line makes sense, but most objects still have refcnt 0 by default 244 // next line makes sense, but most objects still have refcnt 0 by default
222 //at->refcnt_chk (); 245 //at->refcnt_chk ();
223 return 0; 246 return 0;
224} 247}
225 248
234 if (!obj->self) 257 if (!obj->self)
235 { 258 {
236 obj->self = newHV (); 259 obj->self = newHV ();
237 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 260 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
238 261
239 // borrow the refcnt from the object 262 // now bless the object _once_
240 obj->flags |= attachable::F_BORROWED; 263 return sv_bless (newRV_inc ((SV *)obj->self), stash);
241 obj->refcnt_dec ();
242 } 264 }
265 else
266 {
267 SV *sv = newRV_inc ((SV *)obj->self);
243 268
244 return sv_bless (newRV_inc ((SV *)obj->self), stash); 269 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
270 SvAMAGIC_on (sv);
271
272 return sv;
273 }
245} 274}
246 275
247static void 276static void
248clearSVptr (SV *sv) 277clearSVptr (SV *sv)
249{ 278{
302inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 331inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
303 332
304inline SV *to_sv (object & v) { return to_sv (&v); } 333inline SV *to_sv (object & v) { return to_sv (&v); }
305inline SV *to_sv (living & v) { return to_sv (&v); } 334inline SV *to_sv (living & v) { return to_sv (&v); }
306 335
307//TODO:
308inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 336inline SV *to_sv (facetile * v) { return to_sv (v->name); }
309inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 337inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
310 338
311inline SV *to_sv (UUID v) 339inline SV *to_sv (UUID v)
312{ 340{
313 char buf[128]; 341 char buf[128];
333inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 361inline 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"); } 362inline 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"); } 363inline 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"); } 364inline 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"); } 365inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
366inline 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"); } 367inline 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"); } 368inline 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"); } 369inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
341 370
342inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 371inline 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 372inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
344 373
345template<class T> 374template<class T>
346inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 375inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
347 376
348template<int N> 377template<int N>
483{ 512{
484 if (!ext->cb) 513 if (!ext->cb)
485 ext->cb = newAV (); 514 ext->cb = newAV ();
486 515
487 return newRV_inc ((SV *)ext->cb); 516 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} 517}
526 518
527///////////////////////////////////////////////////////////////////////////// 519/////////////////////////////////////////////////////////////////////////////
528 520
529extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 521extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
825} 817}
826 818
827///////////////////////////////////////////////////////////////////////////// 819/////////////////////////////////////////////////////////////////////////////
828 820
829void 821void
830maptile::emergency_save () 822cfperl_emergency_save ()
831{ 823{
832 CALL_BEGIN (0); 824 CALL_BEGIN (0);
833 CALL_CALL ("cf::map::emergency_save", G_VOID); 825 CALL_CALL ("cf::emergency_save", G_VOID);
834 CALL_END; 826 CALL_END;
835} 827}
836 828
837maptile * 829maptile *
838maptile::load_map_sync (const char *path, maptile *origin) 830maptile::find_sync (const char *path, maptile *origin)
839{ 831{
840 CALL_BEGIN (2); 832 CALL_BEGIN (2);
841 CALL_ARG (path); 833 CALL_ARG (path);
842 CALL_ARG (origin); 834 CALL_ARG (origin);
843 CALL_CALL ("cf::map::load_map_sync", G_SCALAR); 835 CALL_CALL ("cf::map::find_sync", G_SCALAR);
844 836
845 maptile *retval; 837 maptile *retval;
846 838
847 if (count) 839 if (count)
848 sv_to (POPs, retval); 840 sv_to (POPs, retval);
850 retval = 0; 842 retval = 0;
851 843
852 CALL_END; 844 CALL_END;
853 845
854 return retval; 846 return retval;
847}
848
849maptile *
850maptile::find_async (const char *path, maptile *origin)
851{
852 CALL_BEGIN (2);
853 CALL_ARG (path);
854 CALL_ARG (origin);
855 CALL_CALL ("cf::map::find_async", G_SCALAR);
856
857 maptile *retval;
858
859 if (count)
860 sv_to (POPs, retval);
861 else
862 retval = 0;
863
864 CALL_END;
865
866 return retval;
867}
868
869void
870maptile::do_load_sync ()
871{
872 CALL_BEGIN (1);
873 CALL_ARG (this);
874 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
875 CALL_END;
855} 876}
856 877
857void 878void
858maptile::change_all_map_light (int change) 879maptile::change_all_map_light (int change)
859{ 880{
892void 913void
893iw::alloc () 914iw::alloc ()
894{ 915{
895 pe = GEventAPI->new_idle (0, 0); 916 pe = GEventAPI->new_idle (0, 0);
896 917
918 WaREENTRANT_off (pe);
897 pe->base.callback = (void *)iw_dispatch; 919 pe->base.callback = (void *)iw_dispatch;
898 pe->base.ext_data = (void *)this; 920 pe->base.ext_data = (void *)this;
899} 921}
900 922
901static void iow_dispatch (pe_event *ev) 923static void iow_dispatch (pe_event *ev)
907void 929void
908iow::alloc () 930iow::alloc ()
909{ 931{
910 pe = GEventAPI->new_io (0, 0); 932 pe = GEventAPI->new_io (0, 0);
911 933
934 WaREENTRANT_off (pe);
912 pe->base.callback = (void *)iow_dispatch; 935 pe->base.callback = (void *)iow_dispatch;
913 pe->base.ext_data = (void *)this; 936 pe->base.ext_data = (void *)this;
914 937
915 pe->fd = -1; 938 pe->fd = -1;
916 pe->poll = 0; 939 pe->poll = 0;
1244 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1267 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1245 const_iv (FLAG_IS_WATER) 1268 const_iv (FLAG_IS_WATER)
1246 const_iv (FLAG_CONTENT_ON_GEN) 1269 const_iv (FLAG_CONTENT_ON_GEN)
1247 const_iv (FLAG_IS_A_TEMPLATE) 1270 const_iv (FLAG_IS_A_TEMPLATE)
1248 const_iv (FLAG_IS_BUILDABLE) 1271 const_iv (FLAG_IS_BUILDABLE)
1272 const_iv (FLAG_DESTROY_ON_DEATH)
1273 const_iv (FLAG_NO_MAP_SAVE)
1249 1274
1250 const_iv (NDI_BLACK) 1275 const_iv (NDI_BLACK)
1251 const_iv (NDI_WHITE) 1276 const_iv (NDI_WHITE)
1252 const_iv (NDI_NAVY) 1277 const_iv (NDI_NAVY)
1253 const_iv (NDI_RED) 1278 const_iv (NDI_RED)
1438 const_iv (ATNR_BLIND) 1463 const_iv (ATNR_BLIND)
1439 const_iv (ATNR_INTERNAL) 1464 const_iv (ATNR_INTERNAL)
1440 const_iv (ATNR_LIFE_STEALING) 1465 const_iv (ATNR_LIFE_STEALING)
1441 const_iv (ATNR_DISEASE) 1466 const_iv (ATNR_DISEASE)
1442 1467
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) 1468 const_iv (MAP_IN_MEMORY)
1450 const_iv (MAP_SWAPPED) 1469 const_iv (MAP_SWAPPED)
1451 const_iv (MAP_LOADING) 1470 const_iv (MAP_LOADING)
1452 const_iv (MAP_SAVING) 1471 const_iv (MAP_SAVING)
1453 1472
1466 const_iv (ST_SETUP) 1485 const_iv (ST_SETUP)
1467 const_iv (ST_PLAYING) 1486 const_iv (ST_PLAYING)
1468 const_iv (ST_CUSTOM) 1487 const_iv (ST_CUSTOM)
1469 1488
1470 const_iv (ST_CHANGE_CLASS) 1489 const_iv (ST_CHANGE_CLASS)
1471 const_iv (ST_CONFIRM_QUIT)
1472 const_iv (ST_GET_PARTY_PASSWORD)
1473 1490
1474 const_iv (IO_HEADER) 1491 const_iv (IO_HEADER)
1475 const_iv (IO_OBJECTS) 1492 const_iv (IO_OBJECTS)
1476 const_iv (IO_UNIQUES) 1493 const_iv (IO_UNIQUES)
1477 1494
1531 1548
1532void _global_reattach () 1549void _global_reattach ()
1533 CODE: 1550 CODE:
1534{ 1551{
1535 // reattach to all attachable objects in the game. 1552 // reattach to all attachable objects in the game.
1536 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1553 for_all_clients (ns)
1537 (*i)->reattach (); 1554 ns->reattach ();
1538 1555
1539 for_all_players (pl) 1556 for_all_players (pl)
1540 pl->reattach (); 1557 pl->reattach ();
1541 1558
1542 //TODO 1559 //TODO
1543 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1560 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1544 // i->second->reattach (); 1561 // i->second->reattach ();
1545 1562
1546 for (object *op = object::first; op; op = op->next) 1563 for_all_objects (op)
1547 op->reattach (); 1564 op->reattach ();
1548} 1565}
1549 1566
1550NV floor (NV x) 1567NV floor (NV x)
1551 1568
1552NV ceil (NV x) 1569NV ceil (NV x)
1570
1571NV rndm (...)
1572 CODE:
1573 switch (items)
1574 {
1575 case 0: RETVAL = rndm (); break;
1576 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1577 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1578 default: croak ("cf::rndm requires none, one or two parameters."); break;
1579 }
1580 OUTPUT:
1581 RETVAL
1553 1582
1554void server_tick () 1583void server_tick ()
1555 CODE: 1584 CODE:
1556 runtime = SvNVx (sv_runtime); 1585 runtime = SvNVx (sv_runtime);
1557 server_tick (); 1586 server_tick ();
1604 } 1633 }
1605 OUTPUT: RETVAL 1634 OUTPUT: RETVAL
1606 1635
1607void abort () 1636void abort ()
1608 1637
1638void fork_abort (char *cause = "cf::fork_abort")
1639
1640void cleanup (const char *cause, bool make_core = false)
1641
1609void emergency_save () 1642void emergency_save ()
1643
1644UV sv_2watcher (SV *w)
1645 CODE:
1646 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1647 OUTPUT:
1648 RETVAL
1610 1649
1611void _exit (int status = 0) 1650void _exit (int status = 0)
1612 1651
1613#if _POSIX_MEMLOCK 1652#if _POSIX_MEMLOCK
1614 1653
1671 CODE: 1710 CODE:
1672 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1711 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1673 OUTPUT: 1712 OUTPUT:
1674 RETVAL 1713 RETVAL
1675 1714
1676#bool 1715int mortals_size ()
1677#destroyed (attachable *at) 1716 CODE:
1678# 1717 RETVAL = attachable::mortals.size ();
1679#void 1718 OUTPUT: RETVAL
1680#destroy (attachable *at) 1719
1720#object *mortals (U32 index)
1721# CODE:
1722# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1723# OUTPUT: RETVAL
1724
1725INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1681 1726
1682MODULE = cf PACKAGE = cf::global 1727MODULE = cf PACKAGE = cf::global
1683 1728
1684int invoke (SV *klass, int event, ...) 1729int invoke (SV *klass, int event, ...)
1685 CODE: 1730 CODE:
1701 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1746 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1702 OUTPUT: RETVAL 1747 OUTPUT: RETVAL
1703 1748
1704SV *registry (object *op) 1749SV *registry (object *op)
1705 1750
1706void mortals () 1751int objects_size ()
1707 PPCODE: 1752 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; 1753 RETVAL = objects.size ();
1754 OUTPUT: RETVAL
1755
1756object *objects (U32 index)
1757 CODE:
1758 RETVAL = index < objects.size () ? objects [index] : 0;
1759 OUTPUT: RETVAL
1760
1761int actives_size ()
1762 CODE:
1763 RETVAL = actives.size ();
1764 OUTPUT: RETVAL
1765
1766object *actives (U32 index)
1767 CODE:
1768 RETVAL = index < actives.size () ? actives [index] : 0;
1715 OUTPUT: RETVAL 1769 OUTPUT: RETVAL
1716 1770
1717# missing properties 1771# missing properties
1718 1772
1719object *head (object *op) 1773object *head (object *op)
1720 PROTOTYPE: $ 1774 PROTOTYPE: $
1721 CODE: 1775 CODE:
1722 RETVAL = op->head ? op->head : op; 1776 RETVAL = op->head_ ();
1723 OUTPUT: RETVAL 1777 OUTPUT: RETVAL
1724 1778
1725int is_head (object *op) 1779int is_head (object *op)
1726 PROTOTYPE: $ 1780 PROTOTYPE: $
1727 CODE: 1781 CODE:
1728 RETVAL = !op->head; 1782 RETVAL = op->head_ () == op;
1729 OUTPUT: RETVAL 1783 OUTPUT: RETVAL
1730 1784
1731void 1785void
1732inv (object *obj) 1786inv (object *obj)
1733 PROTOTYPE: $ 1787 PROTOTYPE: $
1824 1878
1825void drop (object *who, object *op) 1879void drop (object *who, object *op)
1826 1880
1827void pick_up (object *who, object *op) 1881void pick_up (object *who, object *op)
1828 1882
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) 1883int cf_object_teleport (object *op, maptile *map, int x, int y)
1834 1884
1835void update_object (object *op, int action) 1885void update_object (object *op, int action)
1836 1886
1837object *cf_create_object_by_name (const char *name) 1887object *cf_create_object_by_name (const char *name)
1956void esrv_update_item (object *op, int what, object *item) 2006void esrv_update_item (object *op, int what, object *item)
1957 C_ARGS: what, op, item 2007 C_ARGS: what, op, item
1958 2008
1959void clear_los (object *op) 2009void clear_los (object *op)
1960 2010
1961int command_teleport (object *op, char *params)
1962
1963int command_summon (object *op, char *params) 2011int command_summon (object *op, char *params)
1964 2012
1965int command_arrest (object *op, char *params) 2013int command_arrest (object *op, char *params)
1966 2014
1967int command_kick (object *op, char *params) 2015int command_kick (object *op, char *params)
1988 CODE: 2036 CODE:
1989 pl->ob->stats.hp = pl->ob->stats.maxhp; 2037 pl->ob->stats.hp = pl->ob->stats.maxhp;
1990 pl->ob->stats.sp = pl->ob->stats.maxsp; 2038 pl->ob->stats.sp = pl->ob->stats.maxsp;
1991 pl->ob->stats.grace = pl->ob->stats.maxgrace; 2039 pl->ob->stats.grace = pl->ob->stats.maxgrace;
1992 pl->orig_stats = pl->ob->stats; 2040 pl->orig_stats = pl->ob->stats;
1993
1994player *cf_player_find (char *name)
1995 PROTOTYPE: $
1996 2041
1997void cf_player_move (player *pl, int dir) 2042void cf_player_move (player *pl, int dir)
1998 2043
1999void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2044void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
2000 2045
2046 if (y) sv_to (y, pl->bed_y); 2091 if (y) sv_to (y, pl->bed_y);
2047 2092
2048void 2093void
2049list () 2094list ()
2050 PPCODE: 2095 PPCODE:
2051 for (player *pl = first_player; pl; pl = pl->next) 2096 for_all_players (pl)
2052 XPUSHs (sv_2mortal (to_sv (pl))); 2097 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 2098
2076 2099
2077MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2100MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2078 2101
2079int invoke (maptile *map, int event, ...) 2102int invoke (maptile *map, int event, ...)
2095 PROTOTYPE: 2118 PROTOTYPE:
2096 CODE: 2119 CODE:
2097 RETVAL = new maptile; 2120 RETVAL = new maptile;
2098 OUTPUT: 2121 OUTPUT:
2099 RETVAL 2122 RETVAL
2100
2101void
2102maptile::destroy ()
2103 2123
2104void 2124void
2105maptile::players () 2125maptile::players ()
2106 PPCODE: 2126 PPCODE:
2107 if (GIMME_V == G_SCALAR) 2127 if (GIMME_V == G_SCALAR)
2137 2157
2138object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2158object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2139 C_ARGS: str, map, nx, ny 2159 C_ARGS: str, map, nx, ny
2140 2160
2141void 2161void
2142cf_map_normalise (maptile *map, int x, int y) 2162get_map_flags (maptile *map, int x, int y)
2143 PPCODE: 2163 PPCODE:
2144{ 2164{
2145 maptile *nmap = 0; 2165 maptile *nmap = 0;
2146 I16 nx = 0, ny = 0; 2166 I16 nx = 0, ny = 0;
2147 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2167 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2209 CODE: 2229 CODE:
2210 RETVAL = get_name_of_region_for_map (m); 2230 RETVAL = get_name_of_region_for_map (m);
2211 OUTPUT: RETVAL 2231 OUTPUT: RETVAL
2212 2232
2213# worst xs function of my life 2233# worst xs function of my life
2214maptile * 2234bool
2215_create_random_map (\ 2235_create_random_map (\
2216 char *path,\ 2236 maptile *self,\
2217 char *wallstyle,\ 2237 char *wallstyle,\
2218 char *wall_name,\ 2238 char *wall_name,\
2219 char *floorstyle,\ 2239 char *floorstyle,\
2220 char *monsterstyle,\ 2240 char *monsterstyle,\
2221 char *treasurestyle,\ 2241 char *treasurestyle,\
2225 char *origin_map,\ 2245 char *origin_map,\
2226 char *final_map,\ 2246 char *final_map,\
2227 char *exitstyle,\ 2247 char *exitstyle,\
2228 char *this_map,\ 2248 char *this_map,\
2229 char *exit_on_final_map,\ 2249 char *exit_on_final_map,\
2230 int Xsize,\ 2250 int xsize,\
2231 int Ysize,\ 2251 int ysize,\
2232 int expand2x,\ 2252 int expand2x,\
2233 int layoutoptions1,\ 2253 int layoutoptions1,\
2234 int layoutoptions2,\ 2254 int layoutoptions2,\
2235 int layoutoptions3,\ 2255 int layoutoptions3,\
2236 int symmetry,\ 2256 int symmetry,\
2241 int dungeon_depth,\ 2261 int dungeon_depth,\
2242 int decoroptions,\ 2262 int decoroptions,\
2243 int orientation,\ 2263 int orientation,\
2244 int origin_y,\ 2264 int origin_y,\
2245 int origin_x,\ 2265 int origin_x,\
2246 int random_seed,\ 2266 U32 random_seed,\
2247 val64 total_map_hp,\ 2267 val64 total_map_hp,\
2248 int map_layout_style,\ 2268 int map_layout_style,\
2249 int treasureoptions,\ 2269 int treasureoptions,\
2250 int symmetry_used,\ 2270 int symmetry_used,\
2251 region *region\ 2271 region *region,\
2272 char *custom\
2252) 2273)
2253 CODE: 2274 CODE:
2254{ 2275{
2255 random_map_params rmp; 2276 random_map_params rmp;
2256 2277
2266 assign (rmp.exit_on_final_map, exit_on_final_map); 2287 assign (rmp.exit_on_final_map, exit_on_final_map);
2267 2288
2268 rmp.origin_map = origin_map; 2289 rmp.origin_map = origin_map;
2269 rmp.final_map = final_map; 2290 rmp.final_map = final_map;
2270 rmp.this_map = this_map; 2291 rmp.this_map = this_map;
2271 rmp.Xsize = Xsize; 2292 rmp.xsize = xsize;
2272 rmp.Ysize = Ysize; 2293 rmp.ysize = ysize;
2273 rmp.expand2x = expand2x; 2294 rmp.expand2x = expand2x;
2274 rmp.layoutoptions1 = layoutoptions1; 2295 rmp.layoutoptions1 = layoutoptions1;
2275 rmp.layoutoptions2 = layoutoptions2; 2296 rmp.layoutoptions2 = layoutoptions2;
2276 rmp.layoutoptions3 = layoutoptions3; 2297 rmp.layoutoptions3 = layoutoptions3;
2277 rmp.symmetry = symmetry; 2298 rmp.symmetry = symmetry;
2288 rmp.total_map_hp = total_map_hp; 2309 rmp.total_map_hp = total_map_hp;
2289 rmp.map_layout_style = map_layout_style; 2310 rmp.map_layout_style = map_layout_style;
2290 rmp.treasureoptions = treasureoptions; 2311 rmp.treasureoptions = treasureoptions;
2291 rmp.symmetry_used = symmetry_used; 2312 rmp.symmetry_used = symmetry_used;
2292 rmp.region = region; 2313 rmp.region = region;
2314 rmp.custom = custom;
2293 2315
2294 RETVAL = generate_random_map (path, &rmp); 2316 RETVAL = self->generate_random_map (&rmp);
2295} 2317}
2296 OUTPUT: 2318 OUTPUT:
2297 RETVAL 2319 RETVAL
2298 2320
2299MODULE = cf PACKAGE = cf::arch 2321MODULE = cf PACKAGE = cf::arch
2375 char *buf = SvPVbyte (packet, len); 2397 char *buf = SvPVbyte (packet, len);
2376 2398
2377 THIS->send_packet (buf, len); 2399 THIS->send_packet (buf, len);
2378} 2400}
2379 2401
2380void
2381client::destroy ()
2382

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines