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.129 by root, Sun Jan 7 21:54:59 2007 UTC vs.
Revision 1.144 by root, Fri Jan 19 15:55:27 2007 UTC

101 101
102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104attachable::~attachable () 104attachable::~attachable ()
105{ 105{
106 assert (!(flags & F_BORROWED)); 106 assert (!self);
107} 107}
108 108
109int
110attachable::refcnt_cnt () const
111{
112 return refcnt + (self ? SvREFCNT (self) : 0);
113}
114
115void
109void attachable::optimise () 116attachable::optimise ()
110{ 117{
111 if (self 118 if (self
112 && SvREFCNT (self) == 1 119 && SvREFCNT (self) == 1
113 && !HvTOTALKEYS (self)) 120 && !HvTOTALKEYS (self))
114 { 121 {
115 flags &= ~F_BORROWED;
116 refcnt_inc (); 122 refcnt_inc ();
117 SvREFCNT_dec ((SV *)self); 123 SvREFCNT_dec ((SV *)self);
118 } 124 }
119} 125}
120 126
121// check wether the object really is dead 127// check wether the object really is dead
122void 128void
123attachable::do_check () 129attachable::do_check ()
124{ 130{
125 if (refcnt > 0) 131 if (refcnt > 0 || refcnt_cnt () > 0)
126 return; 132 return;
127 133
128 optimise (); 134 destroy ();
129 135
130 if (self) 136 if (self)
131 { 137 {
132 if (refcnt + SvREFCNT (self) > 0) 138 hv_clear (self);
133 return; 139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
134
135 assert (flags & F_BORROWED);
136
137 flags &= ~F_BORROWED;
138 refcnt_inc ();
139 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
140 self = 0; 141 self = 0;
141 } 142 }
142
143 if (refcnt > 0)
144 return;
145
146 destroy ();
147} 143}
148 144
149void 145void
150attachable::do_destroy () 146attachable::do_destroy ()
151{ 147{
165 161
166 flags |= F_DESTROYED; 162 flags |= F_DESTROYED;
167 do_destroy (); 163 do_destroy ();
168} 164}
169 165
166void
170void attachable::check_mortals () 167attachable::check_mortals ()
171{ 168{
172 for (int i = 0; i < mortals.size (); ) 169 for (int i = 0; i < mortals.size (); )
173 { 170 {
174 attachable *obj = mortals [i]; 171 attachable *obj = mortals [i];
175 172
219 216
220static int 217static int
221attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
222{ 219{
223 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
224 assert (!(at->flags & attachable::F_BORROWED));
225 at->self = 0; 221 at->self = 0;
226 // 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
227 //at->refcnt_chk (); 223 //at->refcnt_chk ();
228 return 0; 224 return 0;
229} 225}
240 { 236 {
241 obj->self = newHV (); 237 obj->self = newHV ();
242 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);
243 239
244 // borrow the refcnt from the object 240 // borrow the refcnt from the object
245 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
246 obj->refcnt_dec (); 242 obj->refcnt_dec ();
247 243
248 // now bless the object _once_ 244 // now bless the object _once_
249 return sv_bless (newRV_inc ((SV *)obj->self), stash); 245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
250 } 246 }
251 else 247 else
248 {
252 return newRV_inc ((SV *)obj->self); 249 SV *sv = newRV_inc ((SV *)obj->self);
250
251 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
252 SvAMAGIC_on (sv);
253
254 return sv;
255 }
253} 256}
254 257
255static void 258static void
256clearSVptr (SV *sv) 259clearSVptr (SV *sv)
257{ 260{
310inline 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); }
311 314
312inline SV *to_sv (object & v) { return to_sv (&v); } 315inline SV *to_sv (object & v) { return to_sv (&v); }
313inline SV *to_sv (living & v) { return to_sv (&v); } 316inline SV *to_sv (living & v) { return to_sv (&v); }
314 317
315//TODO:
316inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 318inline SV *to_sv (New_Face * v) { return to_sv (v->name); }
317inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
318 320
319inline SV *to_sv (UUID v) 321inline SV *to_sv (UUID v)
320{ 322{
346inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 348inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
347inline 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"); }
348inline 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"); }
349inline 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"); }
350 352
351inline 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)]; }
352inline 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)); }
353 355
354template<class T> 356template<class T>
355inline 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; }
356 358
357template<int N> 359template<int N>
493 if (!ext->cb) 495 if (!ext->cb)
494 ext->cb = newAV (); 496 ext->cb = newAV ();
495 497
496 return newRV_inc ((SV *)ext->cb); 498 return newRV_inc ((SV *)ext->cb);
497} 499}
498
499#if 0
500void attachable::clear ()
501{
502 if (self)
503 {
504 // disconnect Perl from C, to avoid crashes
505 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
506
507 // clear the perl hash, might or might not be a good idea
508 hv_clear ((HV *)SvRV ((SV *)self));
509
510 SvREFCNT_dec (self);
511 self = 0;
512 }
513
514 if (cb)
515 {
516 SvREFCNT_dec (cb);
517 cb = 0;
518 }
519
520 attach = 0;
521}
522#endif
523 500
524///////////////////////////////////////////////////////////////////////////// 501/////////////////////////////////////////////////////////////////////////////
525 502
526extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 503extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
527{ 504{
822} 799}
823 800
824///////////////////////////////////////////////////////////////////////////// 801/////////////////////////////////////////////////////////////////////////////
825 802
826void 803void
827maptile::emergency_save () 804cfperl_emergency_save ()
828{ 805{
829 CALL_BEGIN (0); 806 CALL_BEGIN (0);
830 CALL_CALL ("cf::map::emergency_save", G_VOID); 807 CALL_CALL ("cf::emergency_save", G_VOID);
831 CALL_END; 808 CALL_END;
832} 809}
833 810
834maptile * 811maptile *
835maptile::find_sync (const char *path, maptile *origin) 812maptile::find_sync (const char *path, maptile *origin)
836{ 813{
837 CALL_BEGIN (2); 814 CALL_BEGIN (2);
838 CALL_ARG (path); 815 CALL_ARG (path);
839 CALL_ARG (origin); 816 CALL_ARG (origin);
840 CALL_CALL ("cf::map::find_sync", G_SCALAR); 817 CALL_CALL ("cf::map::find_sync", G_SCALAR);
818
819 maptile *retval;
820
821 if (count)
822 sv_to (POPs, retval);
823 else
824 retval = 0;
825
826 CALL_END;
827
828 return retval;
829}
830
831maptile *
832maptile::find_async (const char *path, maptile *origin)
833{
834 CALL_BEGIN (2);
835 CALL_ARG (path);
836 CALL_ARG (origin);
837 CALL_CALL ("cf::map::find_async", G_SCALAR);
841 838
842 maptile *retval; 839 maptile *retval;
843 840
844 if (count) 841 if (count)
845 sv_to (POPs, retval); 842 sv_to (POPs, retval);
1250 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1247 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1251 const_iv (FLAG_IS_WATER) 1248 const_iv (FLAG_IS_WATER)
1252 const_iv (FLAG_CONTENT_ON_GEN) 1249 const_iv (FLAG_CONTENT_ON_GEN)
1253 const_iv (FLAG_IS_A_TEMPLATE) 1250 const_iv (FLAG_IS_A_TEMPLATE)
1254 const_iv (FLAG_IS_BUILDABLE) 1251 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE)
1255 1254
1256 const_iv (NDI_BLACK) 1255 const_iv (NDI_BLACK)
1257 const_iv (NDI_WHITE) 1256 const_iv (NDI_WHITE)
1258 const_iv (NDI_NAVY) 1257 const_iv (NDI_NAVY)
1259 const_iv (NDI_RED) 1258 const_iv (NDI_RED)
1553 1552
1554NV floor (NV x) 1553NV floor (NV x)
1555 1554
1556NV ceil (NV x) 1555NV ceil (NV x)
1557 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
1568
1558void server_tick () 1569void server_tick ()
1559 CODE: 1570 CODE:
1560 runtime = SvNVx (sv_runtime); 1571 runtime = SvNVx (sv_runtime);
1561 server_tick (); 1572 server_tick ();
1562 1573
1608 } 1619 }
1609 OUTPUT: RETVAL 1620 OUTPUT: RETVAL
1610 1621
1611void abort () 1622void abort ()
1612 1623
1624void fork_abort (char *cause = "cf::fork_abort")
1625
1626void cleanup (const char *cause, bool make_core = false)
1627
1613void emergency_save () 1628void emergency_save ()
1614 1629
1615void _exit (int status = 0) 1630void _exit (int status = 0)
1616 1631
1617#if _POSIX_MEMLOCK 1632#if _POSIX_MEMLOCK
1707 PPCODE: 1722 PPCODE:
1708 EXTEND (SP, object::mortals.size ()); 1723 EXTEND (SP, object::mortals.size ());
1709 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1724 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1710 PUSHs (to_sv (*i)); 1725 PUSHs (to_sv (*i));
1711 1726
1712object *first () 1727int objects_size ()
1713 CODE: 1728 CODE:
1714 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;
1715 OUTPUT: RETVAL 1745 OUTPUT: RETVAL
1716 1746
1717# missing properties 1747# missing properties
1718 1748
1719object *head (object *op) 1749object *head (object *op)
1720 PROTOTYPE: $ 1750 PROTOTYPE: $
1721 CODE: 1751 CODE:
1722 RETVAL = op->head ? op->head : op; 1752 RETVAL = op->head_ ();
1723 OUTPUT: RETVAL 1753 OUTPUT: RETVAL
1724 1754
1725int is_head (object *op) 1755int is_head (object *op)
1726 PROTOTYPE: $ 1756 PROTOTYPE: $
1727 CODE: 1757 CODE:
1728 RETVAL = !op->head; 1758 RETVAL = op->head_ () == op;
1729 OUTPUT: RETVAL 1759 OUTPUT: RETVAL
1730 1760
1731void 1761void
1732inv (object *obj) 1762inv (object *obj)
1733 PROTOTYPE: $ 1763 PROTOTYPE: $
1824 1854
1825void drop (object *who, object *op) 1855void drop (object *who, object *op)
1826 1856
1827void pick_up (object *who, object *op) 1857void pick_up (object *who, object *op)
1828 1858
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) 1859int cf_object_teleport (object *op, maptile *map, int x, int y)
1834 1860
1835void update_object (object *op, int action) 1861void update_object (object *op, int action)
1836 1862
1837object *cf_create_object_by_name (const char *name) 1863object *cf_create_object_by_name (const char *name)
1955 1981
1956void esrv_update_item (object *op, int what, object *item) 1982void esrv_update_item (object *op, int what, object *item)
1957 C_ARGS: what, op, item 1983 C_ARGS: what, op, item
1958 1984
1959void clear_los (object *op) 1985void clear_los (object *op)
1960
1961int command_teleport (object *op, char *params)
1962 1986
1963int command_summon (object *op, char *params) 1987int command_summon (object *op, char *params)
1964 1988
1965int command_arrest (object *op, char *params) 1989int command_arrest (object *op, char *params)
1966 1990
2046list () 2070list ()
2047 PPCODE: 2071 PPCODE:
2048 for_all_players (pl) 2072 for_all_players (pl)
2049 XPUSHs (sv_2mortal (to_sv (pl))); 2073 XPUSHs (sv_2mortal (to_sv (pl)));
2050 2074
2051bool
2052peaceful (player *pl, bool new_setting = 0)
2053 PROTOTYPE: $;$
2054 CODE:
2055 RETVAL = pl->peaceful;
2056 if (items > 1)
2057 pl->peaceful = new_setting;
2058 OUTPUT:
2059 RETVAL
2060
2061living *
2062orig_stats (player *pl)
2063 CODE:
2064 RETVAL = &pl->orig_stats;
2065 OUTPUT: RETVAL
2066
2067living *
2068last_stats (player *pl)
2069 CODE:
2070 RETVAL = &pl->last_stats;
2071 OUTPUT: RETVAL
2072
2073 2075
2074MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2076MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2075 2077
2076int invoke (maptile *map, int event, ...) 2078int invoke (maptile *map, int event, ...)
2077 CODE: 2079 CODE:
2131 2133
2132object* 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)
2133 C_ARGS: str, map, nx, ny 2135 C_ARGS: str, map, nx, ny
2134 2136
2135void 2137void
2136cf_map_normalise (maptile *map, int x, int y) 2138get_map_flags (maptile *map, int x, int y)
2137 PPCODE: 2139 PPCODE:
2138{ 2140{
2139 maptile *nmap = 0; 2141 maptile *nmap = 0;
2140 I16 nx = 0, ny = 0; 2142 I16 nx = 0, ny = 0;
2141 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2143 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2203 CODE: 2205 CODE:
2204 RETVAL = get_name_of_region_for_map (m); 2206 RETVAL = get_name_of_region_for_map (m);
2205 OUTPUT: RETVAL 2207 OUTPUT: RETVAL
2206 2208
2207# worst xs function of my life 2209# worst xs function of my life
2208maptile * 2210bool
2209_create_random_map (\ 2211_create_random_map (\
2210 char *path,\ 2212 maptile *self,\
2211 char *wallstyle,\ 2213 char *wallstyle,\
2212 char *wall_name,\ 2214 char *wall_name,\
2213 char *floorstyle,\ 2215 char *floorstyle,\
2214 char *monsterstyle,\ 2216 char *monsterstyle,\
2215 char *treasurestyle,\ 2217 char *treasurestyle,\
2240 int random_seed,\ 2242 int random_seed,\
2241 val64 total_map_hp,\ 2243 val64 total_map_hp,\
2242 int map_layout_style,\ 2244 int map_layout_style,\
2243 int treasureoptions,\ 2245 int treasureoptions,\
2244 int symmetry_used,\ 2246 int symmetry_used,\
2245 region *region\ 2247 region *region,\
2248 char *custom\
2246) 2249)
2247 CODE: 2250 CODE:
2248{ 2251{
2249 random_map_params rmp; 2252 random_map_params rmp;
2250 2253
2282 rmp.total_map_hp = total_map_hp; 2285 rmp.total_map_hp = total_map_hp;
2283 rmp.map_layout_style = map_layout_style; 2286 rmp.map_layout_style = map_layout_style;
2284 rmp.treasureoptions = treasureoptions; 2287 rmp.treasureoptions = treasureoptions;
2285 rmp.symmetry_used = symmetry_used; 2288 rmp.symmetry_used = symmetry_used;
2286 rmp.region = region; 2289 rmp.region = region;
2290 rmp.custom = custom;
2287 2291
2288 RETVAL = generate_random_map (path, &rmp); 2292 RETVAL = self->generate_random_map (&rmp);
2289} 2293}
2290 OUTPUT: 2294 OUTPUT:
2291 RETVAL 2295 RETVAL
2292 2296
2293MODULE = cf PACKAGE = cf::arch 2297MODULE = cf PACKAGE = cf::arch

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines