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.118 by root, Sat Dec 30 20:32:30 2006 UTC vs.
Revision 1.144 by root, Fri Jan 19 15:55:27 2007 UTC

32#include <sproto.h> 32#include <sproto.h>
33 33
34#include "cfperl.h" 34#include "cfperl.h"
35#include "shstr.h" 35#include "shstr.h"
36 36
37#include <unistd.h>
38#if _POSIX_MEMLOCK
39# include <sys/mman.h>
40#endif
41
37#include <EXTERN.h> 42#include <EXTERN.h>
38#include <perl.h> 43#include <perl.h>
39#include <XSUB.h> 44#include <XSUB.h>
40 45
41#include "CoroAPI.h" 46#include "CoroAPI.h"
94 99
95////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 100//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
96 101
97unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
98 103
99#if 0
100attachable *attachable::rc_first;
101
102attachable::attachable ()
103{
104 refcnt = 0;
105 rc_next = rc_first;
106 rc_first = this;
107}
108#endif
109
110attachable::~attachable () 104attachable::~attachable ()
111{ 105{
112 assert (!(flags & F_BORROWED));//D//TODO//remove when stable
113#if 0
114 assert (!rc_next);
115 assert (!refcnt); 106 assert (!self);
116#endif 107}
108
109int
110attachable::refcnt_cnt () const
111{
112 return refcnt + (self ? SvREFCNT (self) : 0);
113}
114
115void
116attachable::optimise ()
117{
118 if (self
119 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self))
121 {
122 refcnt_inc ();
123 SvREFCNT_dec ((SV *)self);
124 }
117} 125}
118 126
119// check wether the object really is dead 127// check wether the object really is dead
120void 128void
121attachable::do_check () 129attachable::do_check ()
122{ 130{
123 if (refcnt > 0) 131 if (refcnt > 0 || refcnt_cnt () > 0)
124 return; 132 return;
125 133
126 // try to unborrow the refcnt from perl 134 destroy ();
127 if (flags & F_BORROWED) 135
136 if (self)
128 { 137 {
129 assert (self);//D//TODO//remove when stable 138 hv_clear (self);
130 flags &= ~F_BORROWED; 139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
131 refcnt_inc ();
132 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
141 self = 0;
133 } 142 }
134
135 if (refcnt > 0 || self)
136 return;
137
138 destroy ();
139} 143}
140 144
141void 145void
142attachable::do_destroy () 146attachable::do_destroy ()
143{ 147{
144 invoke (EVENT_ATTACHABLE_DESTROY, DT_END); 148 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
145 149
146 //TODO: call generic destroy callback 150 if (self)
151 hv_clear (self);
152
147 mortals.push_back (this); 153 mortals.push_back (this);
148} 154}
149 155
150void 156void
151attachable::destroy () 157attachable::destroy ()
155 161
156 flags |= F_DESTROYED; 162 flags |= F_DESTROYED;
157 do_destroy (); 163 do_destroy ();
158} 164}
159 165
166void
160void attachable::check_mortals () 167attachable::check_mortals ()
161{ 168{
162 for (int i = 0; i < mortals.size (); ) 169 for (int i = 0; i < mortals.size (); )
163 { 170 {
164 attachable *obj = mortals [i]; 171 attachable *obj = mortals [i];
165 172
209 216
210static int 217static int
211attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
212{ 219{
213 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
214 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable
215 at->self = 0; 221 at->self = 0;
216 // next line makes sense, but most objects still have refcnt 0 by default 222 // next line makes sense, but most objects still have refcnt 0 by default
217 //at->refcnt_chk (); 223 //at->refcnt_chk ();
218 return 0; 224 return 0;
219} 225}
230 { 236 {
231 obj->self = newHV (); 237 obj->self = newHV ();
232 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 238 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
233 239
234 // borrow the refcnt from the object 240 // borrow the refcnt from the object
235 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
236 obj->refcnt_dec (); 242 obj->refcnt_dec ();
243
244 // now bless the object _once_
245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
237 } 246 }
247 else
248 {
249 SV *sv = newRV_inc ((SV *)obj->self);
238 250
239 return sv_bless (newRV_inc ((SV *)obj->self), stash); 251 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
252 SvAMAGIC_on (sv);
253
254 return sv;
255 }
240} 256}
241 257
242static void 258static void
243clearSVptr (SV *sv) 259clearSVptr (SV *sv)
244{ 260{
297inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 313inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
298 314
299inline SV *to_sv (object & v) { return to_sv (&v); } 315inline SV *to_sv (object & v) { return to_sv (&v); }
300inline SV *to_sv (living & v) { return to_sv (&v); } 316inline SV *to_sv (living & v) { return to_sv (&v); }
301 317
302//TODO:
303inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 318inline SV *to_sv (New_Face * v) { return to_sv (v->name); }
304inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
305 320
306inline SV *to_sv (UUID v) 321inline SV *to_sv (UUID v)
307{ 322{
328inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 343inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); }
329inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); } 344inline void sv_to (SV *sv, player * &v) { v = (player *)(attachable *)SvPTR_ornull (sv, "cf::player"); }
330inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); } 345inline void sv_to (SV *sv, object * &v) { v = (object *)(attachable *)SvPTR_ornull (sv, "cf::object"); }
331inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); } 346inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)(attachable *)SvPTR_ornull (sv, "cf::arch"); }
332inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); } 347inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
348inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
333inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 349inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
334inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 350inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
335inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 351inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
336 352
337inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 353inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
338inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 354inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
339 355
340template<class T> 356template<class T>
341inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 357inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
342 358
343template<int N> 359template<int N>
478{ 494{
479 if (!ext->cb) 495 if (!ext->cb)
480 ext->cb = newAV (); 496 ext->cb = newAV ();
481 497
482 return newRV_inc ((SV *)ext->cb); 498 return newRV_inc ((SV *)ext->cb);
483}
484
485#if 0
486void attachable::clear ()
487{
488 if (self)
489 {
490 // disconnect Perl from C, to avoid crashes
491 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
492
493 // clear the perl hash, might or might not be a good idea
494 hv_clear ((HV *)SvRV ((SV *)self));
495
496 SvREFCNT_dec (self);
497 self = 0;
498 }
499
500 if (cb)
501 {
502 SvREFCNT_dec (cb);
503 cb = 0;
504 }
505
506 attach = 0;
507}
508#endif
509
510void attachable::optimise ()
511{
512 if (self
513 && SvREFCNT (self) == 1
514 && !HvTOTALKEYS (self))
515 {
516 flags &= ~F_BORROWED;
517 refcnt_inc ();
518 SvREFCNT_dec ((SV *)self);
519 }
520} 499}
521 500
522///////////////////////////////////////////////////////////////////////////// 501/////////////////////////////////////////////////////////////////////////////
523 502
524extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 503extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
820} 799}
821 800
822///////////////////////////////////////////////////////////////////////////// 801/////////////////////////////////////////////////////////////////////////////
823 802
824void 803void
825maptile::emergency_save () 804cfperl_emergency_save ()
826{ 805{
827 CALL_BEGIN (0); 806 CALL_BEGIN (0);
828 CALL_CALL ("cf::map::emergency_save", G_VOID); 807 CALL_CALL ("cf::emergency_save", G_VOID);
829 CALL_END; 808 CALL_END;
830} 809}
831 810
832maptile * 811maptile *
833maptile::find_map (const char *path, maptile *origin) 812maptile::find_sync (const char *path, maptile *origin)
834{ 813{
835 CALL_BEGIN (2); 814 CALL_BEGIN (2);
836 CALL_ARG (path); 815 CALL_ARG (path);
837 CALL_ARG (origin); 816 CALL_ARG (origin);
838 CALL_CALL ("cf::map::find_map", G_SCALAR); 817 CALL_CALL ("cf::map::find_sync", G_SCALAR);
839 818
840 maptile *retval; 819 maptile *retval;
841 820
842 if (count) 821 if (count)
843 sv_to (POPs, retval); 822 sv_to (POPs, retval);
847 CALL_END; 826 CALL_END;
848 827
849 return retval; 828 return retval;
850} 829}
851 830
852void
853maptile::do_load ()
854{
855 CALL_BEGIN (1);
856 CALL_ARG (this);
857 CALL_CALL ("cf::map::do_load", G_VOID);
858 CALL_END;
859}
860
861maptile * 831maptile *
862maptile::customise_for (object *op) 832maptile::find_async (const char *path, maptile *origin)
863{ 833{
864 CALL_BEGIN (2); 834 CALL_BEGIN (2);
865 CALL_ARG (this); 835 CALL_ARG (path);
866 CALL_ARG (op); 836 CALL_ARG (origin);
867 CALL_CALL ("cf::map::customise_for", G_SCALAR); 837 CALL_CALL ("cf::map::find_async", G_SCALAR);
868 838
869 maptile *retval; 839 maptile *retval;
870 840
871 if (count) 841 if (count)
872 sv_to (POPs, retval); 842 sv_to (POPs, retval);
873 else 843 else
874 retval = 0; 844 retval = 0;
875 845
876 CALL_END; 846 CALL_END;
877 847
878 return retval ? retval : this; 848 return retval;
849}
850
851void
852maptile::do_load_sync ()
853{
854 CALL_BEGIN (1);
855 CALL_ARG (this);
856 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
857 CALL_END;
879} 858}
880 859
881void 860void
882maptile::change_all_map_light (int change) 861maptile::change_all_map_light (int change)
883{ 862{
902 881
903///////////////////////////////////////////////////////////////////////////// 882/////////////////////////////////////////////////////////////////////////////
904 883
905struct EventAPI *watcher_base::GEventAPI; 884struct EventAPI *watcher_base::GEventAPI;
906struct CoroAPI *coroapi::GCoroAPI; 885struct CoroAPI *coroapi::GCoroAPI;
886
887int coroapi::cede_counter;
907 888
908static void iw_dispatch (pe_event *ev) 889static void iw_dispatch (pe_event *ev)
909{ 890{
910 iw *w = (iw *)ev->ext_data; 891 iw *w = (iw *)ev->ext_data;
911 w->call (*w); 892 w->call (*w);
1266 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1247 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1267 const_iv (FLAG_IS_WATER) 1248 const_iv (FLAG_IS_WATER)
1268 const_iv (FLAG_CONTENT_ON_GEN) 1249 const_iv (FLAG_CONTENT_ON_GEN)
1269 const_iv (FLAG_IS_A_TEMPLATE) 1250 const_iv (FLAG_IS_A_TEMPLATE)
1270 const_iv (FLAG_IS_BUILDABLE) 1251 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE)
1271 1254
1272 const_iv (NDI_BLACK) 1255 const_iv (NDI_BLACK)
1273 const_iv (NDI_WHITE) 1256 const_iv (NDI_WHITE)
1274 const_iv (NDI_NAVY) 1257 const_iv (NDI_NAVY)
1275 const_iv (NDI_RED) 1258 const_iv (NDI_RED)
1317 const_iv (P_BLOCKSVIEW) 1300 const_iv (P_BLOCKSVIEW)
1318 const_iv (P_PLAYER) 1301 const_iv (P_PLAYER)
1319 const_iv (P_NO_MAGIC) 1302 const_iv (P_NO_MAGIC)
1320 const_iv (P_IS_ALIVE) 1303 const_iv (P_IS_ALIVE)
1321 const_iv (P_NO_CLERIC) 1304 const_iv (P_NO_CLERIC)
1322 const_iv (P_NEED_UPDATE)
1323 const_iv (P_OUT_OF_MAP) 1305 const_iv (P_OUT_OF_MAP)
1324 const_iv (P_NEW_MAP) 1306 const_iv (P_NEW_MAP)
1307 const_iv (P_UPTODATE)
1325 1308
1326 const_iv (UP_OBJ_INSERT) 1309 const_iv (UP_OBJ_INSERT)
1327 const_iv (UP_OBJ_REMOVE) 1310 const_iv (UP_OBJ_REMOVE)
1328 const_iv (UP_OBJ_CHANGE) 1311 const_iv (UP_OBJ_CHANGE)
1329 const_iv (UP_OBJ_FACE) 1312 const_iv (UP_OBJ_FACE)
1488 const_iv (ST_SETUP) 1471 const_iv (ST_SETUP)
1489 const_iv (ST_PLAYING) 1472 const_iv (ST_PLAYING)
1490 const_iv (ST_CUSTOM) 1473 const_iv (ST_CUSTOM)
1491 1474
1492 const_iv (ST_CHANGE_CLASS) 1475 const_iv (ST_CHANGE_CLASS)
1493 const_iv (ST_CONFIRM_QUIT)
1494 const_iv (ST_GET_PARTY_PASSWORD)
1495 1476
1496 const_iv (IO_HEADER) 1477 const_iv (IO_HEADER)
1497 const_iv (IO_OBJECTS) 1478 const_iv (IO_OBJECTS)
1498 const_iv (IO_UNIQUES) 1479 const_iv (IO_UNIQUES)
1499 1480
1553 1534
1554void _global_reattach () 1535void _global_reattach ()
1555 CODE: 1536 CODE:
1556{ 1537{
1557 // reattach to all attachable objects in the game. 1538 // reattach to all attachable objects in the game.
1558 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1539 for_all_clients (ns)
1559 (*i)->reattach (); 1540 ns->reattach ();
1560 1541
1561 for_all_players (pl) 1542 for_all_players (pl)
1562 pl->reattach (); 1543 pl->reattach ();
1563 1544
1564 //TODO 1545 //TODO
1565 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1546 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1566 // i->second->reattach (); 1547 // i->second->reattach ();
1567 1548
1568 for (object *op = object::first; op; op = op->next) 1549 for_all_objects (op)
1569 op->reattach (); 1550 op->reattach ();
1570} 1551}
1571 1552
1572NV floor (NV x) 1553NV floor (NV x)
1573 1554
1574NV ceil (NV x) 1555NV ceil (NV x)
1556
1557NV rndm (...)
1558 CODE:
1559 switch (items)
1560 {
1561 case 0: RETVAL = rndm (); break;
1562 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1563 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1564 default: croak ("cf::rndm requires none, one or two parameters."); break;
1565 }
1566 OUTPUT:
1567 RETVAL
1575 1568
1576void server_tick () 1569void server_tick ()
1577 CODE: 1570 CODE:
1578 runtime = SvNVx (sv_runtime); 1571 runtime = SvNVx (sv_runtime);
1579 server_tick (); 1572 server_tick ();
1624 case 5: RETVAL = settings.playerdir; break; 1617 case 5: RETVAL = settings.playerdir; break;
1625 case 6: RETVAL = settings.datadir ; break; 1618 case 6: RETVAL = settings.datadir ; break;
1626 } 1619 }
1627 OUTPUT: RETVAL 1620 OUTPUT: RETVAL
1628 1621
1622void abort ()
1623
1624void fork_abort (char *cause = "cf::fork_abort")
1625
1626void cleanup (const char *cause, bool make_core = false)
1627
1629void emergency_save () 1628void emergency_save ()
1630 1629
1631void _exit (int status = 0) 1630void _exit (int status = 0)
1631
1632#if _POSIX_MEMLOCK
1633
1634int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1635
1636int munlockall ()
1637
1638#endif
1632 1639
1633int find_animation (char *text) 1640int find_animation (char *text)
1634 PROTOTYPE: $ 1641 PROTOTYPE: $
1635 1642
1636int random_roll (int min, int max, object *op, int goodbad); 1643int random_roll (int min, int max, object *op, int goodbad);
1683 CODE: 1690 CODE:
1684 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1691 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1685 OUTPUT: 1692 OUTPUT:
1686 RETVAL 1693 RETVAL
1687 1694
1688#bool 1695INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1689#destroyed (attachable *at)
1690#
1691#void
1692#destroy (attachable *at)
1693 1696
1694MODULE = cf PACKAGE = cf::global 1697MODULE = cf PACKAGE = cf::global
1695 1698
1696int invoke (SV *klass, int event, ...) 1699int invoke (SV *klass, int event, ...)
1697 CODE: 1700 CODE:
1719 PPCODE: 1722 PPCODE:
1720 EXTEND (SP, object::mortals.size ()); 1723 EXTEND (SP, object::mortals.size ());
1721 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1724 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1722 PUSHs (to_sv (*i)); 1725 PUSHs (to_sv (*i));
1723 1726
1724object *first () 1727int objects_size ()
1725 CODE: 1728 CODE:
1726 RETVAL = object::first; 1729 RETVAL = objects.size ();
1730 OUTPUT: RETVAL
1731
1732object *objects (U32 index)
1733 CODE:
1734 RETVAL = index < objects.size () ? objects [index] : 0;
1735 OUTPUT: RETVAL
1736
1737int actives_size ()
1738 CODE:
1739 RETVAL = actives.size ();
1740 OUTPUT: RETVAL
1741
1742object *actives (U32 index)
1743 CODE:
1744 RETVAL = index < actives.size () ? actives [index] : 0;
1727 OUTPUT: RETVAL 1745 OUTPUT: RETVAL
1728 1746
1729# missing properties 1747# missing properties
1730 1748
1731object *head (object *op) 1749object *head (object *op)
1732 PROTOTYPE: $ 1750 PROTOTYPE: $
1733 CODE: 1751 CODE:
1734 RETVAL = op->head ? op->head : op; 1752 RETVAL = op->head_ ();
1735 OUTPUT: RETVAL 1753 OUTPUT: RETVAL
1736 1754
1737int is_head (object *op) 1755int is_head (object *op)
1738 PROTOTYPE: $ 1756 PROTOTYPE: $
1739 CODE: 1757 CODE:
1740 RETVAL = !op->head; 1758 RETVAL = op->head_ () == op;
1741 OUTPUT: RETVAL 1759 OUTPUT: RETVAL
1742 1760
1743void 1761void
1744inv (object *obj) 1762inv (object *obj)
1745 PROTOTYPE: $ 1763 PROTOTYPE: $
1836 1854
1837void drop (object *who, object *op) 1855void drop (object *who, object *op)
1838 1856
1839void pick_up (object *who, object *op) 1857void pick_up (object *who, object *op)
1840 1858
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) 1859int cf_object_teleport (object *op, maptile *map, int x, int y)
1846 1860
1847void update_object (object *op, int action) 1861void update_object (object *op, int action)
1848 1862
1849object *cf_create_object_by_name (const char *name) 1863object *cf_create_object_by_name (const char *name)
1942 RETVAL = op->contr; 1956 RETVAL = op->contr;
1943 OUTPUT: RETVAL 1957 OUTPUT: RETVAL
1944 1958
1945void check_score (object *op) 1959void check_score (object *op)
1946 1960
1947void cf_player_message (object *obj, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE) 1961void message (object *op, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE)
1962 CODE:
1963 new_draw_info (flags, 0, op, txt);
1948 1964
1949object *cf_player_send_inventory (object *op) 1965object *cf_player_send_inventory (object *op)
1950 1966
1951char *cf_player_get_ip (object *op) 1967char *cf_player_get_ip (object *op)
1952 ALIAS: ip = 0 1968 ALIAS: ip = 0
1965 1981
1966void esrv_update_item (object *op, int what, object *item) 1982void esrv_update_item (object *op, int what, object *item)
1967 C_ARGS: what, op, item 1983 C_ARGS: what, op, item
1968 1984
1969void clear_los (object *op) 1985void clear_los (object *op)
1970
1971int command_teleport (object *op, char *params)
1972 1986
1973int command_summon (object *op, char *params) 1987int command_summon (object *op, char *params)
1974 1988
1975int command_arrest (object *op, char *params) 1989int command_arrest (object *op, char *params)
1976 1990
1998 CODE: 2012 CODE:
1999 pl->ob->stats.hp = pl->ob->stats.maxhp; 2013 pl->ob->stats.hp = pl->ob->stats.maxhp;
2000 pl->ob->stats.sp = pl->ob->stats.maxsp; 2014 pl->ob->stats.sp = pl->ob->stats.maxsp;
2001 pl->ob->stats.grace = pl->ob->stats.maxgrace; 2015 pl->ob->stats.grace = pl->ob->stats.maxgrace;
2002 pl->orig_stats = pl->ob->stats; 2016 pl->orig_stats = pl->ob->stats;
2003
2004player *cf_player_find (char *name)
2005 PROTOTYPE: $
2006 2017
2007void cf_player_move (player *pl, int dir) 2018void cf_player_move (player *pl, int dir)
2008 2019
2009void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2020void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
2010 2021
2056 if (y) sv_to (y, pl->bed_y); 2067 if (y) sv_to (y, pl->bed_y);
2057 2068
2058void 2069void
2059list () 2070list ()
2060 PPCODE: 2071 PPCODE:
2061 for (player *pl = first_player; pl; pl = pl->next) 2072 for_all_players (pl)
2062 XPUSHs (sv_2mortal (to_sv (pl))); 2073 XPUSHs (sv_2mortal (to_sv (pl)));
2063
2064bool
2065peaceful (player *pl, bool new_setting = 0)
2066 PROTOTYPE: $;$
2067 CODE:
2068 RETVAL = pl->peaceful;
2069 if (items > 1)
2070 pl->peaceful = new_setting;
2071 OUTPUT:
2072 RETVAL
2073
2074living *
2075orig_stats (player *pl)
2076 CODE:
2077 RETVAL = &pl->orig_stats;
2078 OUTPUT: RETVAL
2079
2080living *
2081last_stats (player *pl)
2082 CODE:
2083 RETVAL = &pl->last_stats;
2084 OUTPUT: RETVAL
2085 2074
2086 2075
2087MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2076MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2088 2077
2089int invoke (maptile *map, int event, ...) 2078int invoke (maptile *map, int event, ...)
2105 PROTOTYPE: 2094 PROTOTYPE:
2106 CODE: 2095 CODE:
2107 RETVAL = new maptile; 2096 RETVAL = new maptile;
2108 OUTPUT: 2097 OUTPUT:
2109 RETVAL 2098 RETVAL
2110
2111void
2112maptile::destroy ()
2113 2099
2114void 2100void
2115maptile::players () 2101maptile::players ()
2116 PPCODE: 2102 PPCODE:
2117 if (GIMME_V == G_SCALAR) 2103 if (GIMME_V == G_SCALAR)
2147 2133
2148object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2134object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2149 C_ARGS: str, map, nx, ny 2135 C_ARGS: str, map, nx, ny
2150 2136
2151void 2137void
2152cf_map_normalise (maptile *map, int x, int y) 2138get_map_flags (maptile *map, int x, int y)
2153 PPCODE: 2139 PPCODE:
2154{ 2140{
2155 maptile *nmap = 0; 2141 maptile *nmap = 0;
2156 I16 nx = 0, ny = 0; 2142 I16 nx = 0, ny = 0;
2157 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2143 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2206 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break; 2192 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break;
2207 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break; 2193 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break;
2208 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; 2194 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break;
2209 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; 2195 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break;
2210 } 2196 }
2211 OUTPUT: 2197 OUTPUT: RETVAL
2212 RETVAL
2213 2198
2214void fix_walls (maptile *map, int x, int y) 2199void fix_walls (maptile *map, int x, int y)
2215 2200
2216void fix_walls_around (maptile *map, int x, int y) 2201void fix_walls_around (maptile *map, int x, int y)
2217 2202
2203const char *
2204region_name (maptile *m)
2205 CODE:
2206 RETVAL = get_name_of_region_for_map (m);
2207 OUTPUT: RETVAL
2208
2218# worst xs function of my life 2209# worst xs function of my life
2219maptile * 2210bool
2220_create_random_map (\ 2211_create_random_map (\
2221 char *path,\ 2212 maptile *self,\
2222 char *wallstyle,\ 2213 char *wallstyle,\
2223 char *wall_name,\ 2214 char *wall_name,\
2224 char *floorstyle,\ 2215 char *floorstyle,\
2225 char *monsterstyle,\ 2216 char *monsterstyle,\
2226 char *treasurestyle,\ 2217 char *treasurestyle,\
2251 int random_seed,\ 2242 int random_seed,\
2252 val64 total_map_hp,\ 2243 val64 total_map_hp,\
2253 int map_layout_style,\ 2244 int map_layout_style,\
2254 int treasureoptions,\ 2245 int treasureoptions,\
2255 int symmetry_used,\ 2246 int symmetry_used,\
2256 region *region\ 2247 region *region,\
2248 char *custom\
2257) 2249)
2258 CODE: 2250 CODE:
2259{ 2251{
2260 random_map_params rmp; 2252 random_map_params rmp;
2261 2253
2265 assign (rmp.monsterstyle , monsterstyle); 2257 assign (rmp.monsterstyle , monsterstyle);
2266 assign (rmp.treasurestyle , treasurestyle); 2258 assign (rmp.treasurestyle , treasurestyle);
2267 assign (rmp.layoutstyle , layoutstyle); 2259 assign (rmp.layoutstyle , layoutstyle);
2268 assign (rmp.doorstyle , doorstyle); 2260 assign (rmp.doorstyle , doorstyle);
2269 assign (rmp.decorstyle , decorstyle); 2261 assign (rmp.decorstyle , decorstyle);
2270 assign (rmp.origin_map , origin_map);
2271 assign (rmp.final_map , final_map);
2272 assign (rmp.exitstyle , exitstyle); 2262 assign (rmp.exitstyle , exitstyle);
2273 assign (rmp.this_map , this_map);
2274 assign (rmp.exit_on_final_map, exit_on_final_map); 2263 assign (rmp.exit_on_final_map, exit_on_final_map);
2275 2264
2265 rmp.origin_map = origin_map;
2266 rmp.final_map = final_map;
2267 rmp.this_map = this_map;
2276 rmp.Xsize = Xsize; 2268 rmp.Xsize = Xsize;
2277 rmp.Ysize = Ysize; 2269 rmp.Ysize = Ysize;
2278 rmp.expand2x = expand2x; 2270 rmp.expand2x = expand2x;
2279 rmp.layoutoptions1 = layoutoptions1; 2271 rmp.layoutoptions1 = layoutoptions1;
2280 rmp.layoutoptions2 = layoutoptions2; 2272 rmp.layoutoptions2 = layoutoptions2;
2293 rmp.total_map_hp = total_map_hp; 2285 rmp.total_map_hp = total_map_hp;
2294 rmp.map_layout_style = map_layout_style; 2286 rmp.map_layout_style = map_layout_style;
2295 rmp.treasureoptions = treasureoptions; 2287 rmp.treasureoptions = treasureoptions;
2296 rmp.symmetry_used = symmetry_used; 2288 rmp.symmetry_used = symmetry_used;
2297 rmp.region = region; 2289 rmp.region = region;
2290 rmp.custom = custom;
2298 2291
2299 RETVAL = generate_random_map (path, &rmp); 2292 RETVAL = self->generate_random_map (&rmp);
2300} 2293}
2301 OUTPUT: 2294 OUTPUT:
2302 RETVAL 2295 RETVAL
2303 2296
2304MODULE = cf PACKAGE = cf::arch 2297MODULE = cf PACKAGE = cf::arch
2323 PROTOTYPE: 2316 PROTOTYPE:
2324 CODE: 2317 CODE:
2325 RETVAL = get_firstparty (); 2318 RETVAL = get_firstparty ();
2326 OUTPUT: RETVAL 2319 OUTPUT: RETVAL
2327 2320
2328partylist *next (partylist *party) 2321INCLUDE: $PERL genacc partylist ../include/player.h |
2329 CODE:
2330 RETVAL = party->next;
2331 OUTPUT: RETVAL
2332
2333const char *name (partylist *party)
2334 CODE:
2335 RETVAL = party->partyname;
2336 OUTPUT: RETVAL
2337
2338const char *password (partylist *party)
2339 CODE:
2340 RETVAL = party->passwd;
2341 OUTPUT: RETVAL
2342 2322
2343MODULE = cf PACKAGE = cf::region 2323MODULE = cf PACKAGE = cf::region
2344 2324
2345region *first () 2325region *first ()
2346 PROTOTYPE: 2326 PROTOTYPE:
2347 CODE: 2327 CODE:
2348 RETVAL = first_region; 2328 RETVAL = first_region;
2349 OUTPUT: RETVAL 2329 OUTPUT: RETVAL
2350 2330
2351region *next (region *reg) 2331region *find (char *name)
2332 PROTOTYPE: $
2352 CODE: 2333 CODE:
2353 RETVAL = reg->next; 2334 RETVAL = get_region_by_name (name);
2354 OUTPUT: RETVAL 2335 OUTPUT: RETVAL
2355 2336
2356const char *name (region *reg) 2337INCLUDE: $PERL genacc region ../include/map.h |
2357 CODE:
2358 RETVAL = reg->name;
2359 OUTPUT: RETVAL
2360
2361region *parent (region *reg)
2362 CODE:
2363 RETVAL = reg->parent;
2364 OUTPUT: RETVAL
2365
2366const char *longname (region *reg)
2367 CODE:
2368 RETVAL = reg->longname;
2369 OUTPUT: RETVAL
2370
2371const char *msg (region *reg)
2372 CODE:
2373 RETVAL = reg->msg;
2374 OUTPUT: RETVAL
2375 2338
2376MODULE = cf PACKAGE = cf::living 2339MODULE = cf PACKAGE = cf::living
2377 2340
2378INCLUDE: $PERL genacc living ../include/living.h | 2341INCLUDE: $PERL genacc living ../include/living.h |
2379 2342
2410 char *buf = SvPVbyte (packet, len); 2373 char *buf = SvPVbyte (packet, len);
2411 2374
2412 THIS->send_packet (buf, len); 2375 THIS->send_packet (buf, len);
2413} 2376}
2414 2377
2415void
2416client::destroy ()
2417

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines