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.144 by root, Fri Jan 19 15:55:27 2007 UTC vs.
Revision 1.168 by root, Thu Feb 15 03:19:02 2007 UTC

29#include <plugin_common.h> 29#include <plugin_common.h>
30#include <sounds.h> 30#include <sounds.h>
31#include <cstdarg> 31#include <cstdarg>
32#include <sproto.h> 32#include <sproto.h>
33 33
34#include "loader.h"
34#include "cfperl.h" 35#include "cfperl.h"
35#include "shstr.h" 36#include "shstr.h"
36 37
37#include <unistd.h> 38#include <unistd.h>
38#if _POSIX_MEMLOCK 39#if _POSIX_MEMLOCK
102unordered_vector<attachable *> attachable::mortals; 103unordered_vector<attachable *> attachable::mortals;
103 104
104attachable::~attachable () 105attachable::~attachable ()
105{ 106{
106 assert (!self); 107 assert (!self);
108 assert (!cb);
107} 109}
108 110
109int 111int
110attachable::refcnt_cnt () const 112attachable::refcnt_cnt () const
111{ 113{
112 return refcnt + (self ? SvREFCNT (self) : 0); 114 return refcnt + (self ? SvREFCNT (self) - 1 : 0);
115}
116
117void
118attachable::sever_self ()
119{
120 if (HV *self = this->self)
121 {
122 // keep a refcount because sv_unmagic might call attachable_free,
123 // which might clear self, causing sv_unmagic to crash on a now
124 // invalid object.
125 SvREFCNT_inc (self);
126 hv_clear (self);
127 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
128 SvREFCNT_dec (self);
129
130 // self *must* be null now because thats sv_unmagic's job.
131 assert (!this->self);
132 flags |= 0x80; // severed //D
133 }
113} 134}
114 135
115void 136void
116attachable::optimise () 137attachable::optimise ()
117{ 138{
118 if (self 139 if (self
119 && SvREFCNT (self) == 1 140 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self)) 141 && !HvTOTALKEYS (self))
142 flags |= 0x40,//D
143 sever_self ();
144}
145
146// check wether the object really is dead
147void
148attachable::do_check ()
149{
150 if (refcnt_cnt () > 0)
151 return;
152
153 destroy ();
154}
155
156void
157attachable::do_destroy ()
158{
159 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
160
161 if (cb)
121 { 162 {
122 refcnt_inc ();
123 SvREFCNT_dec ((SV *)self); 163 SvREFCNT_dec (cb);
164 cb = 0;
124 } 165 }
125}
126
127// check wether the object really is dead
128void
129attachable::do_check ()
130{
131 if (refcnt > 0 || refcnt_cnt () > 0)
132 return;
133
134 destroy ();
135 166
136 if (self) 167 if (self)
137 { 168 sever_self ();
138 hv_clear (self);
139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
140 SvREFCNT_dec (self);
141 self = 0;
142 }
143}
144 169
145void 170 flags |= 0x20; //D
146attachable::do_destroy ()
147{
148 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
149
150 if (self)
151 hv_clear (self);
152
153 mortals.push_back (this); 171 mortals.push_back (this);
154} 172}
155 173
156void 174void
157attachable::destroy () 175attachable::destroy ()
164} 182}
165 183
166void 184void
167attachable::check_mortals () 185attachable::check_mortals ()
168{ 186{
169 for (int i = 0; i < mortals.size (); ) 187 static int i = 0;
188
189 for (;;)
170 { 190 {
191 if (i >= mortals.size ())
192 {
193 i = 0;
194
195 if (mortals.size () > 1000)
196 fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ());
197
198 break;
199 }
200
171 attachable *obj = mortals [i]; 201 attachable *obj = mortals [i];
172 202
173 obj->refcnt_chk (); // unborrow from perl, if necessary 203 obj->refcnt_chk (); // unborrow from perl, if necessary
174 204
205 //if (obj->refcnt > 0 || obj->self)
175 if (obj->refcnt || obj->self) 206 if (obj->refcnt || obj->self)
176 { 207 {
177#if 0 208//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
178 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
179 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
180#endif
181
182 ++i; // further delay freeing 209 ++i; // further delay freeing
210
211 if (!(i & 0x3ff))
212 break;
183 }//D 213 }
184 else 214 else
185 { 215 {
186 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
187 mortals.erase (i); 216 mortals.erase (i);
188 delete obj; 217 delete obj;
189 } 218 }
190 } 219 }
191} 220}
216 245
217static int 246static int
218attachable_free (pTHX_ SV *sv, MAGIC *mg) 247attachable_free (pTHX_ SV *sv, MAGIC *mg)
219{ 248{
220 attachable *at = (attachable *)mg->mg_ptr; 249 attachable *at = (attachable *)mg->mg_ptr;
250
251 //TODO: check if transaction behaviour is really required here
252 if (SV *self = (SV *)at->self)
253 {
221 at->self = 0; 254 at->self = 0;
255 SvREFCNT_dec (self);
256 }
257
222 // next line makes sense, but most objects still have refcnt 0 by default 258 // next line makes sense, but most objects still have refcnt 0 by default
223 //at->refcnt_chk (); 259 //at->refcnt_chk ();
224 return 0; 260 return 0;
225} 261}
226 262
234 270
235 if (!obj->self) 271 if (!obj->self)
236 { 272 {
237 obj->self = newHV (); 273 obj->self = newHV ();
238 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 274 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
239 275 obj->flags |= (obj->flags & 0xc0) << 8;
240 // borrow the refcnt from the object 276 obj->flags &= ~0xc0;//D
241 // it is important thta no refcnt_chk is being executed here 277 obj->flags |= 0x10;//D
242 obj->refcnt_dec ();
243 278
244 // now bless the object _once_ 279 // now bless the object _once_
245 return sv_bless (newRV_inc ((SV *)obj->self), stash); 280 return sv_bless (newRV_inc ((SV *)obj->self), stash);
246 } 281 }
247 else 282 else
313inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 348inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
314 349
315inline SV *to_sv (object & v) { return to_sv (&v); } 350inline SV *to_sv (object & v) { return to_sv (&v); }
316inline SV *to_sv (living & v) { return to_sv (&v); } 351inline SV *to_sv (living & v) { return to_sv (&v); }
317 352
318inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 353inline SV *to_sv (facetile * v) { return to_sv (v->name); }
319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 354inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
320 355
321inline SV *to_sv (UUID v) 356inline SV *to_sv (UUID v)
322{ 357{
323 char buf[128]; 358 char buf[128];
324 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 359 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
325 return newSVpv (buf, 0); 360 return newSVpv (buf, 0);
326} 361}
327 362
328inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; } 363inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; }
329inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; } 364inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; }
348inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 383inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
349inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 384inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
350inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 385inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
351inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 386inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
352 387
353inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } 388inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
354inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } 389inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
355 390
356template<class T> 391template<class T>
357inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 392inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
358 393
576 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) 611 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl))
577 { 612 {
578 printf ("unable to initialize perl-interpreter, aborting.\n"); 613 printf ("unable to initialize perl-interpreter, aborting.\n");
579 exit (EXIT_FAILURE); 614 exit (EXIT_FAILURE);
580 } 615 }
616
617 {
618 dSP;
619
620 PUSHMARK (SP);
621 PUTBACK;
622 call_pv ("cf::init", G_DISCARD | G_VOID);
623 }
581} 624}
582 625
583void cfperl_main () 626void cfperl_main ()
584{ 627{
585 dSP; 628 dSP;
806 CALL_BEGIN (0); 849 CALL_BEGIN (0);
807 CALL_CALL ("cf::emergency_save", G_VOID); 850 CALL_CALL ("cf::emergency_save", G_VOID);
808 CALL_END; 851 CALL_END;
809} 852}
810 853
854void
855cfperl_cleanup (int make_core)
856{
857 CALL_BEGIN (1);
858 CALL_ARG (make_core);
859 CALL_CALL ("cf::post_cleanup", G_VOID);
860 CALL_END;
861}
862
811maptile * 863maptile *
812maptile::find_sync (const char *path, maptile *origin) 864maptile::find_sync (const char *path, maptile *origin)
813{ 865{
814 CALL_BEGIN (2); 866 CALL_BEGIN (2);
815 CALL_ARG (path); 867 CALL_ARG (path);
895void 947void
896iw::alloc () 948iw::alloc ()
897{ 949{
898 pe = GEventAPI->new_idle (0, 0); 950 pe = GEventAPI->new_idle (0, 0);
899 951
952 WaREENTRANT_off (pe);
900 pe->base.callback = (void *)iw_dispatch; 953 pe->base.callback = (void *)iw_dispatch;
901 pe->base.ext_data = (void *)this; 954 pe->base.ext_data = (void *)this;
902} 955}
903 956
904static void iow_dispatch (pe_event *ev) 957static void iow_dispatch (pe_event *ev)
910void 963void
911iow::alloc () 964iow::alloc ()
912{ 965{
913 pe = GEventAPI->new_io (0, 0); 966 pe = GEventAPI->new_io (0, 0);
914 967
968 WaREENTRANT_off (pe);
915 pe->base.callback = (void *)iow_dispatch; 969 pe->base.callback = (void *)iow_dispatch;
916 pe->base.ext_data = (void *)this; 970 pe->base.ext_data = (void *)this;
917 971
918 pe->fd = -1; 972 pe->fd = -1;
919 pe->poll = 0; 973 pe->poll = 0;
1248 const_iv (FLAG_IS_WATER) 1302 const_iv (FLAG_IS_WATER)
1249 const_iv (FLAG_CONTENT_ON_GEN) 1303 const_iv (FLAG_CONTENT_ON_GEN)
1250 const_iv (FLAG_IS_A_TEMPLATE) 1304 const_iv (FLAG_IS_A_TEMPLATE)
1251 const_iv (FLAG_IS_BUILDABLE) 1305 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH) 1306 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE) 1307 const_iv (FLAG_NO_MAP_SAVE)
1254 1308
1255 const_iv (NDI_BLACK) 1309 const_iv (NDI_BLACK)
1256 const_iv (NDI_WHITE) 1310 const_iv (NDI_WHITE)
1257 const_iv (NDI_NAVY) 1311 const_iv (NDI_NAVY)
1258 const_iv (NDI_RED) 1312 const_iv (NDI_RED)
1443 const_iv (ATNR_BLIND) 1497 const_iv (ATNR_BLIND)
1444 const_iv (ATNR_INTERNAL) 1498 const_iv (ATNR_INTERNAL)
1445 const_iv (ATNR_LIFE_STEALING) 1499 const_iv (ATNR_LIFE_STEALING)
1446 const_iv (ATNR_DISEASE) 1500 const_iv (ATNR_DISEASE)
1447 1501
1448 const_iv (MAP_FLUSH)
1449 const_iv (MAP_PLAYER_UNIQUE)
1450 const_iv (MAP_BLOCK)
1451 const_iv (MAP_STYLE)
1452 const_iv (MAP_OVERLAY)
1453
1454 const_iv (MAP_IN_MEMORY) 1502 const_iv (MAP_IN_MEMORY)
1455 const_iv (MAP_SWAPPED) 1503 const_iv (MAP_SWAPPED)
1456 const_iv (MAP_LOADING) 1504 const_iv (MAP_LOADING)
1457 const_iv (MAP_SAVING) 1505 const_iv (MAP_SAVING)
1458 1506
1625 1673
1626void cleanup (const char *cause, bool make_core = false) 1674void cleanup (const char *cause, bool make_core = false)
1627 1675
1628void emergency_save () 1676void emergency_save ()
1629 1677
1630void _exit (int status = 0) 1678void _exit (int status = EXIT_SUCCESS)
1679
1680UV sv_2watcher (SV *w)
1681 CODE:
1682 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1683 OUTPUT:
1684 RETVAL
1631 1685
1632#if _POSIX_MEMLOCK 1686#if _POSIX_MEMLOCK
1633 1687
1634int mlockall (int flags = MCL_CURRENT | MCL_FUTURE) 1688int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1635 1689
1681 RETVAL = newSVpv (resist_plus[atnr], 0); 1735 RETVAL = newSVpv (resist_plus[atnr], 0);
1682 else 1736 else
1683 XSRETURN_UNDEF; 1737 XSRETURN_UNDEF;
1684 OUTPUT: RETVAL 1738 OUTPUT: RETVAL
1685 1739
1740bool
1741load_regions (const char *filename)
1742 CODE:
1743 RETVAL = loader_region ().load (filename);
1744 OUTPUT: RETVAL
1745
1686MODULE = cf PACKAGE = cf::attachable 1746MODULE = cf PACKAGE = cf::attachable
1687 1747
1688int 1748int
1689valid (SV *obj) 1749valid (SV *obj)
1690 CODE: 1750 CODE:
1691 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1751 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1692 OUTPUT: 1752 OUTPUT:
1693 RETVAL 1753 RETVAL
1754
1755void
1756debug_trace (attachable *obj, bool on = true)
1757 CODE:
1758 obj->flags &= ~attachable::F_DEBUG_TRACE;
1759 if (on)
1760 obj->flags |= attachable::F_DEBUG_TRACE;
1761
1762int mortals_size ()
1763 CODE:
1764 RETVAL = attachable::mortals.size ();
1765 OUTPUT: RETVAL
1766
1767#object *mortals (U32 index)
1768# CODE:
1769# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1770# OUTPUT: RETVAL
1694 1771
1695INCLUDE: $PERL genacc attachable ../include/cfperl.h | 1772INCLUDE: $PERL genacc attachable ../include/cfperl.h |
1696 1773
1697MODULE = cf PACKAGE = cf::global 1774MODULE = cf PACKAGE = cf::global
1698 1775
1716 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1793 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1717 OUTPUT: RETVAL 1794 OUTPUT: RETVAL
1718 1795
1719SV *registry (object *op) 1796SV *registry (object *op)
1720 1797
1721void mortals ()
1722 PPCODE:
1723 EXTEND (SP, object::mortals.size ());
1724 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1725 PUSHs (to_sv (*i));
1726
1727int objects_size () 1798int objects_size ()
1728 CODE: 1799 CODE:
1729 RETVAL = objects.size (); 1800 RETVAL = objects.size ();
1730 OUTPUT: RETVAL 1801 OUTPUT: RETVAL
1731 1802
1771void 1842void
1772set_animation (object *op, int idx) 1843set_animation (object *op, int idx)
1773 CODE: 1844 CODE:
1774 SET_ANIMATION (op, idx); 1845 SET_ANIMATION (op, idx);
1775 1846
1847int
1848num_animations (object *op)
1849 CODE:
1850 RETVAL = NUM_ANIMATIONS (op);
1851 OUTPUT: RETVAL
1852
1776object *find_best_object_match (object *op, const char *match) 1853object *find_best_object_match (object *op, const char *match)
1777 1854
1778object *find_marked_object (object *op) 1855object *find_marked_object (object *op)
1779 1856
1780int need_identify (object *obj); 1857int need_identify (object *obj);
1792 manual_apply (applied, applier, flags); 1869 manual_apply (applied, applier, flags);
1793 1870
1794void apply_below (object *op) 1871void apply_below (object *op)
1795 CODE: 1872 CODE:
1796 player_apply_below (op); 1873 player_apply_below (op);
1874
1875int cast_heal (object *op, object *caster, object *spell, int dir = 0)
1797 1876
1798object *cf_object_present_archname_inside (object *op, char *whatstr) 1877object *cf_object_present_archname_inside (object *op, char *whatstr)
1799 1878
1800int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0) 1879int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0)
1801 1880
2016 pl->orig_stats = pl->ob->stats; 2095 pl->orig_stats = pl->ob->stats;
2017 2096
2018void cf_player_move (player *pl, int dir) 2097void cf_player_move (player *pl, int dir)
2019 2098
2020void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2099void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
2021
2022player *first ()
2023 CODE:
2024 RETVAL = first_player;
2025 OUTPUT: RETVAL
2026 2100
2027bool 2101bool
2028cell_visible (player *pl, int dx, int dy) 2102cell_visible (player *pl, int dx, int dy)
2029 CODE: 2103 CODE:
2030 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2 2104 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2
2107 EXTEND (SP, THIS->players); 2181 EXTEND (SP, THIS->players);
2108 for_all_players (pl) 2182 for_all_players (pl)
2109 if (pl->ob && pl->ob->map == THIS) 2183 if (pl->ob && pl->ob->map == THIS)
2110 PUSHs (sv_2mortal (to_sv (pl->ob))); 2184 PUSHs (sv_2mortal (to_sv (pl->ob)));
2111 } 2185 }
2186
2187void
2188maptile::add_underlay (SV *data, int offset, int stride, SV *palette)
2189 CODE:
2190{
2191 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2192 croak ("maptile::add_underlay: palette must be arrayref");
2193
2194 palette = SvRV (palette);
2195
2196 STRLEN idxlen;
2197 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2198
2199 for (int x = 0; x < THIS->width; ++x)
2200 for (int y = 0; y < THIS->height; ++y)
2201 {
2202 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2203 if (op->flag [FLAG_IS_FLOOR])
2204 goto skip_space;
2205
2206 {
2207 int offs = offset + y * stride + x;
2208 if (IN_RANGE_EXC (offs, 0, idxlen))
2209 {
2210 if (SV **elem = av_fetch ((AV *)palette, idx [offs], 0))
2211 {
2212 object *ob = get_archetype (SvPVutf8_nolen (*elem));
2213 ob->flag [FLAG_NO_MAP_SAVE] = true;
2214 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY);
2215 }
2216 }
2217 }
2218
2219 skip_space: ;
2220 }
2221}
2222
2223void
2224maptile::set_regiondata (SV *data, int offset, int stride, SV *palette)
2225 CODE:
2226{
2227 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2228 croak ("maptile::set_regiondata: palette must be arrayref");
2229
2230 palette = SvRV (palette);
2231
2232 STRLEN idxlen;
2233 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2234
2235 region **regionmap = (region **)malloc (
2236 (av_len ((AV *)palette) + 1) * sizeof (region *));
2237 uint8_t *regions = salloc<uint8_t> (THIS->size ());
2238
2239 for (int i = av_len ((AV *)palette) + 1; i--; )
2240 regionmap [i] = region::find (
2241 SvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1)));
2242
2243 for (int y = 0; y < THIS->height; ++y)
2244 memcpy (regions + y * THIS->width, idx + offset + y * stride, THIS->width);
2245
2246 sfree (THIS->regions, THIS->size ());
2247 free (THIS->regionmap);
2248
2249 THIS->regions = regions;
2250 THIS->regionmap = regionmap;
2251}
2112 2252
2113void play_sound_map (maptile *map, int x, int y, int sound_num) 2253void play_sound_map (maptile *map, int x, int y, int sound_num)
2114 2254
2115int out_of_map (maptile *map, int x, int y) 2255int out_of_map (maptile *map, int x, int y)
2116 2256
2198 2338
2199void fix_walls (maptile *map, int x, int y) 2339void fix_walls (maptile *map, int x, int y)
2200 2340
2201void fix_walls_around (maptile *map, int x, int y) 2341void fix_walls_around (maptile *map, int x, int y)
2202 2342
2203const char *
2204region_name (maptile *m)
2205 CODE:
2206 RETVAL = get_name_of_region_for_map (m);
2207 OUTPUT: RETVAL
2208
2209# worst xs function of my life 2343# worst xs function of my life
2210bool 2344bool
2211_create_random_map (\ 2345_create_random_map (\
2212 maptile *self,\ 2346 maptile *self,\
2213 char *wallstyle,\ 2347 char *wallstyle,\
2221 char *origin_map,\ 2355 char *origin_map,\
2222 char *final_map,\ 2356 char *final_map,\
2223 char *exitstyle,\ 2357 char *exitstyle,\
2224 char *this_map,\ 2358 char *this_map,\
2225 char *exit_on_final_map,\ 2359 char *exit_on_final_map,\
2226 int Xsize,\ 2360 int xsize,\
2227 int Ysize,\ 2361 int ysize,\
2228 int expand2x,\ 2362 int expand2x,\
2229 int layoutoptions1,\ 2363 int layoutoptions1,\
2230 int layoutoptions2,\ 2364 int layoutoptions2,\
2231 int layoutoptions3,\ 2365 int layoutoptions3,\
2232 int symmetry,\ 2366 int symmetry,\
2237 int dungeon_depth,\ 2371 int dungeon_depth,\
2238 int decoroptions,\ 2372 int decoroptions,\
2239 int orientation,\ 2373 int orientation,\
2240 int origin_y,\ 2374 int origin_y,\
2241 int origin_x,\ 2375 int origin_x,\
2242 int random_seed,\ 2376 U32 random_seed,\
2243 val64 total_map_hp,\ 2377 val64 total_map_hp,\
2244 int map_layout_style,\ 2378 int map_layout_style,\
2245 int treasureoptions,\ 2379 int treasureoptions,\
2246 int symmetry_used,\ 2380 int symmetry_used,\
2247 region *region,\ 2381 region *region,\
2263 assign (rmp.exit_on_final_map, exit_on_final_map); 2397 assign (rmp.exit_on_final_map, exit_on_final_map);
2264 2398
2265 rmp.origin_map = origin_map; 2399 rmp.origin_map = origin_map;
2266 rmp.final_map = final_map; 2400 rmp.final_map = final_map;
2267 rmp.this_map = this_map; 2401 rmp.this_map = this_map;
2268 rmp.Xsize = Xsize; 2402 rmp.xsize = xsize;
2269 rmp.Ysize = Ysize; 2403 rmp.ysize = ysize;
2270 rmp.expand2x = expand2x; 2404 rmp.expand2x = expand2x;
2271 rmp.layoutoptions1 = layoutoptions1; 2405 rmp.layoutoptions1 = layoutoptions1;
2272 rmp.layoutoptions2 = layoutoptions2; 2406 rmp.layoutoptions2 = layoutoptions2;
2273 rmp.layoutoptions3 = layoutoptions3; 2407 rmp.layoutoptions3 = layoutoptions3;
2274 rmp.symmetry = symmetry; 2408 rmp.symmetry = symmetry;
2320 2454
2321INCLUDE: $PERL genacc partylist ../include/player.h | 2455INCLUDE: $PERL genacc partylist ../include/player.h |
2322 2456
2323MODULE = cf PACKAGE = cf::region 2457MODULE = cf PACKAGE = cf::region
2324 2458
2325region *first () 2459void
2326 PROTOTYPE: 2460list ()
2327 CODE: 2461 PPCODE:
2328 RETVAL = first_region; 2462 for_all_regions (rgn)
2329 OUTPUT: RETVAL 2463 XPUSHs (sv_2mortal (to_sv (rgn)));
2330 2464
2331region *find (char *name) 2465region *find (char *name)
2332 PROTOTYPE: $ 2466 PROTOTYPE: $
2333 CODE: 2467 CODE:
2334 RETVAL = get_region_by_name (name); 2468 RETVAL = region::find (name);
2469 OUTPUT: RETVAL
2470
2471region *find_fuzzy (char *name)
2472 PROTOTYPE: $
2473 CODE:
2474 RETVAL = region::find_fuzzy (name);
2335 OUTPUT: RETVAL 2475 OUTPUT: RETVAL
2336 2476
2337INCLUDE: $PERL genacc region ../include/map.h | 2477INCLUDE: $PERL genacc region ../include/map.h |
2338 2478
2339MODULE = cf PACKAGE = cf::living 2479MODULE = cf PACKAGE = cf::living

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines