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.119 by root, Sun Dec 31 10:28:36 2006 UTC vs.
Revision 1.176 by root, Sun Mar 11 02:12:45 2007 UTC

4 4
5/* 5/*
6 * This code is placed under the GNU General Public Licence (GPL) 6 * This code is placed under the GNU General Public Licence (GPL)
7 * 7 *
8 * Copyright (C) 2001-2005 by Chachkoff Yann 8 * Copyright (C) 2001-2005 by Chachkoff Yann
9 * Copyright (C) 2006 by Marc Lehmann <cf@schmorp.de> 9 * Copyright (C) 2006,2007 by Marc Lehmann <cf@schmorp.de>
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by 12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or 13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version. 14 * (at your option) any later version.
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"
37
38#include <unistd.h>
39#if _POSIX_MEMLOCK
40# include <sys/mman.h>
41#endif
36 42
37#include <EXTERN.h> 43#include <EXTERN.h>
38#include <perl.h> 44#include <perl.h>
39#include <XSUB.h> 45#include <XSUB.h>
40 46
94 100
95////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 101//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
96 102
97unordered_vector<attachable *> attachable::mortals; 103unordered_vector<attachable *> attachable::mortals;
98 104
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 () 105attachable::~attachable ()
111{ 106{
112 assert (!(flags & F_BORROWED));//D//TODO//remove when stable 107 flags |=0x3300;//D
113#if 0
114 assert (!rc_next);
115 assert (!refcnt); 108 assert (!self);
116#endif 109 assert (!cb);
110}
111
112int
113attachable::refcnt_cnt () const
114{
115 return refcnt + (self ? SvREFCNT (self) - 1 : 0);
116}
117
118void
119attachable::sever_self ()
120{
121 if (HV *self = this->self)
122 {
123 // keep a refcount because sv_unmagic might call attachable_free,
124 // which might clear self, causing sv_unmagic to crash on a now
125 // invalid object.
126 SvREFCNT_inc (self);
127 hv_clear (self);
128 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
129 SvREFCNT_dec (self);
130
131 // self *must* be null now because thats sv_unmagic's job.
132 assert (!this->self);
133 flags |= 0x80; // severed //D
134 }
135}
136
137void
138attachable::optimise ()
139{
140 if (self
141 && SvREFCNT (self) == 1
142 && !HvTOTALKEYS (self))
143 flags |= 0x40,//D
144 sever_self ();
117} 145}
118 146
119// check wether the object really is dead 147// check wether the object really is dead
120void 148void
121attachable::do_check () 149attachable::do_check ()
122{ 150{
123 if (refcnt > 0) 151 if (refcnt_cnt () > 0)
124 return; 152 return;
125 153
126 // try to unborrow the refcnt from perl 154 destroy ();
127 if (flags & F_BORROWED) 155}
156
157void
158attachable::do_destroy ()
159{
160 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
161
162 if (cb)
128 { 163 {
129 assert (self);//D//TODO//remove when stable
130 flags &= ~F_BORROWED;
131 refcnt_inc ();
132 SvREFCNT_dec (self); 164 SvREFCNT_dec (cb);
165 cb = 0;
133 } 166 }
134 167
135 if (refcnt > 0 || self) 168 if (self)
136 return; 169 sever_self ();
137 170
138 destroy (); 171 flags |= 0x20; //D
139}
140
141void
142attachable::do_destroy ()
143{
144 invoke (EVENT_ATTACHABLE_DESTROY, DT_END);
145
146 //TODO: call generic destroy callback
147 mortals.push_back (this); 172 mortals.push_back (this);
148} 173}
149 174
150void 175void
151attachable::destroy () 176attachable::destroy ()
155 180
156 flags |= F_DESTROYED; 181 flags |= F_DESTROYED;
157 do_destroy (); 182 do_destroy ();
158} 183}
159 184
185void
160void attachable::check_mortals () 186attachable::check_mortals ()
161{ 187{
162 for (int i = 0; i < mortals.size (); ) 188 static int i = 0;
189
190 for (;;)
163 { 191 {
192 if (i >= mortals.size ())
193 {
194 i = 0;
195
196 if (mortals.size () > 1000)
197 fprintf (stderr, "mortal queue size (%d) exceeds 1000.\n", (int)mortals.size ());
198
199 break;
200 }
201
164 attachable *obj = mortals [i]; 202 attachable *obj = mortals [i];
165 203
166 obj->refcnt_chk (); // unborrow from perl, if necessary 204 obj->refcnt_chk (); // unborrow from perl, if necessary
167 205
206 //if (obj->refcnt > 0 || obj->self)
168 if (obj->refcnt || obj->self) 207 if (obj->refcnt || obj->self)
169 { 208 {
170#if 0 209//printf ("%p rc %d\n", obj, obj->refcnt_cnt ());//D
171 if (mortals.size() > 5)fprintf (stderr, "%d delaying %d:%p:%s %d (self %p:%d)\n", time(0),i, obj, typeid (*obj).name (),
172 obj->refcnt, obj->self, obj->self ? SvREFCNT(obj->self): - 1);//D
173#endif
174
175 ++i; // further delay freeing 210 ++i; // further delay freeing
211
212 if (!(i & 0x3ff))
213 break;
176 }//D 214 }
177 else 215 else
178 { 216 {
179 //Dfprintf (stderr, "deleteing %d:%p:%s\n", i, obj,typeid (*obj).name ());//D
180 mortals.erase (i); 217 mortals.erase (i);
181 delete obj; 218 delete obj;
182 } 219 }
183 } 220 }
184} 221}
209 246
210static int 247static int
211attachable_free (pTHX_ SV *sv, MAGIC *mg) 248attachable_free (pTHX_ SV *sv, MAGIC *mg)
212{ 249{
213 attachable *at = (attachable *)mg->mg_ptr; 250 attachable *at = (attachable *)mg->mg_ptr;
214 assert (!(at->flags & attachable::F_BORROWED));//D//TODO//remove when stable 251
252 //TODO: check if transaction behaviour is really required here
253 if (SV *self = (SV *)at->self)
254 {
215 at->self = 0; 255 at->self = 0;
256 SvREFCNT_dec (self);
257 }
258
216 // next line makes sense, but most objects still have refcnt 0 by default 259 // next line makes sense, but most objects still have refcnt 0 by default
217 //at->refcnt_chk (); 260 //at->refcnt_chk ();
218 return 0; 261 return 0;
219} 262}
220 263
228 271
229 if (!obj->self) 272 if (!obj->self)
230 { 273 {
231 obj->self = newHV (); 274 obj->self = newHV ();
232 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 275 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
276 obj->flags |= (obj->flags & 0xc0) << 8;
277 obj->flags &= ~0xc0;//D
278 obj->flags |= 0x10;//D
233 279
234 // borrow the refcnt from the object 280 // now bless the object _once_
235 obj->flags |= attachable::F_BORROWED; 281 return sv_bless (newRV_inc ((SV *)obj->self), stash);
236 obj->refcnt_dec ();
237 } 282 }
283 else
284 {
285 SV *sv = newRV_inc ((SV *)obj->self);
238 286
239 return sv_bless (newRV_inc ((SV *)obj->self), stash); 287 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
288 SvAMAGIC_on (sv);
289
290 return sv;
291 }
240} 292}
241 293
242static void 294static void
243clearSVptr (SV *sv) 295clearSVptr (SV *sv)
244{ 296{
297inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 349inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
298 350
299inline SV *to_sv (object & v) { return to_sv (&v); } 351inline SV *to_sv (object & v) { return to_sv (&v); }
300inline SV *to_sv (living & v) { return to_sv (&v); } 352inline SV *to_sv (living & v) { return to_sv (&v); }
301 353
302//TODO:
303inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 354//inline SV *to_sv (faceinfo * v) { return to_sv (v->name); }
304inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 355inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
356inline SV *to_sv (std::string & v) { return newSVpvn (v.data (), v.size ()); }
305 357
306inline SV *to_sv (UUID v) 358inline SV *to_sv (UUID v)
307{ 359{
308 char buf[128]; 360 char buf[128];
309 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 361 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
310 return newSVpv (buf, 0); 362 return newSVpv (buf, 0);
311} 363}
312 364
313inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; } 365inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; }
314inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; } 366inline void sv_to (SV *sv, char * &v) { free (v); v = SvOK (sv) ? strdup (SvPV_nolen (sv)) : 0; }
328inline void sv_to (SV *sv, client * &v) { v = (client *)(attachable *)SvPTR_ornull (sv, "cf::client"); } 380inline 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"); } 381inline 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"); } 382inline 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"); } 383inline 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"); } 384inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
385inline 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"); } 386inline 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"); } 387inline 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"); } 388inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
336 389
337inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 390//inline void sv_to (SV *sv, faceinfo * &v) { v = &faces [face_find (SvPV_nolen (sv), 0)]; }
338inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 391inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
339 392
340template<class T> 393template<class T>
341inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 394inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
342 395
343template<int N> 396template<int N>
346inline void sv_to (SV *sv, rangetype &v) { v = (rangetype) SvIV (sv); } 399inline void sv_to (SV *sv, rangetype &v) { v = (rangetype) SvIV (sv); }
347inline void sv_to (SV *sv, bowtype_t &v) { v = (bowtype_t) SvIV (sv); } 400inline void sv_to (SV *sv, bowtype_t &v) { v = (bowtype_t) SvIV (sv); }
348inline void sv_to (SV *sv, petmode_t &v) { v = (petmode_t) SvIV (sv); } 401inline void sv_to (SV *sv, petmode_t &v) { v = (petmode_t) SvIV (sv); }
349inline void sv_to (SV *sv, usekeytype &v) { v = (usekeytype) SvIV (sv); } 402inline void sv_to (SV *sv, usekeytype &v) { v = (usekeytype) SvIV (sv); }
350inline void sv_to (SV *sv, unapplymode &v) { v = (unapplymode) SvIV (sv); } 403inline void sv_to (SV *sv, unapplymode &v) { v = (unapplymode) SvIV (sv); }
404
405inline void sv_to (SV *sv, std::string &v)
406{
407 STRLEN len;
408 char *data = SvPVbyte (sv, len);
409 v.assign (data, len);
410}
351 411
352inline void sv_to (SV *sv, UUID &v) 412inline void sv_to (SV *sv, UUID &v)
353{ 413{
354 unsigned int version; 414 unsigned int version;
355 415
478{ 538{
479 if (!ext->cb) 539 if (!ext->cb)
480 ext->cb = newAV (); 540 ext->cb = newAV ();
481 541
482 return newRV_inc ((SV *)ext->cb); 542 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} 543}
521 544
522///////////////////////////////////////////////////////////////////////////// 545/////////////////////////////////////////////////////////////////////////////
523 546
524extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 547extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
597 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) 620 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl))
598 { 621 {
599 printf ("unable to initialize perl-interpreter, aborting.\n"); 622 printf ("unable to initialize perl-interpreter, aborting.\n");
600 exit (EXIT_FAILURE); 623 exit (EXIT_FAILURE);
601 } 624 }
625
626 {
627 dSP;
628
629 PUSHMARK (SP);
630 PUTBACK;
631 call_pv ("cf::init", G_DISCARD | G_VOID);
632 }
602} 633}
603 634
604void cfperl_main () 635void cfperl_main ()
605{ 636{
606 dSP; 637 dSP;
820} 851}
821 852
822///////////////////////////////////////////////////////////////////////////// 853/////////////////////////////////////////////////////////////////////////////
823 854
824void 855void
825maptile::emergency_save () 856cfperl_emergency_save ()
826{ 857{
827 CALL_BEGIN (0); 858 CALL_BEGIN (0);
828 CALL_CALL ("cf::map::emergency_save", G_VOID); 859 CALL_CALL ("cf::emergency_save", G_VOID);
829 CALL_END; 860 CALL_END;
830} 861}
831 862
863void
864cfperl_cleanup (int make_core)
865{
866 CALL_BEGIN (1);
867 CALL_ARG (make_core);
868 CALL_CALL ("cf::post_cleanup", G_VOID);
869 CALL_END;
870}
871
832maptile * 872maptile *
833maptile::load_map_sync (const char *path, maptile *origin) 873maptile::find_sync (const char *path, maptile *origin)
834{ 874{
835 CALL_BEGIN (2); 875 CALL_BEGIN (2);
836 CALL_ARG (path); 876 CALL_ARG (path);
837 CALL_ARG (origin); 877 CALL_ARG (origin);
838 CALL_CALL ("cf::map::load_map_sync", G_SCALAR); 878 CALL_CALL ("cf::map::find_sync", G_SCALAR);
839 879
840 maptile *retval; 880 maptile *retval;
841 881
842 if (count) 882 if (count)
843 sv_to (POPs, retval); 883 sv_to (POPs, retval);
845 retval = 0; 885 retval = 0;
846 886
847 CALL_END; 887 CALL_END;
848 888
849 return retval; 889 return retval;
890}
891
892maptile *
893maptile::find_async (const char *path, maptile *origin)
894{
895 CALL_BEGIN (2);
896 CALL_ARG (path);
897 CALL_ARG (origin);
898 CALL_CALL ("cf::map::find_async", G_SCALAR);
899
900 maptile *retval;
901
902 if (count)
903 sv_to (POPs, retval);
904 else
905 retval = 0;
906
907 CALL_END;
908
909 return retval;
910}
911
912void
913maptile::do_load_sync ()
914{
915 CALL_BEGIN (1);
916 CALL_ARG (this);
917 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
918 CALL_END;
850} 919}
851 920
852void 921void
853maptile::change_all_map_light (int change) 922maptile::change_all_map_light (int change)
854{ 923{
874///////////////////////////////////////////////////////////////////////////// 943/////////////////////////////////////////////////////////////////////////////
875 944
876struct EventAPI *watcher_base::GEventAPI; 945struct EventAPI *watcher_base::GEventAPI;
877struct CoroAPI *coroapi::GCoroAPI; 946struct CoroAPI *coroapi::GCoroAPI;
878 947
948int coroapi::cede_counter;
949
879static void iw_dispatch (pe_event *ev) 950static void iw_dispatch (pe_event *ev)
880{ 951{
881 iw *w = (iw *)ev->ext_data; 952 iw *w = (iw *)ev->ext_data;
882 w->call (*w); 953 w->call (*w);
883} 954}
885void 956void
886iw::alloc () 957iw::alloc ()
887{ 958{
888 pe = GEventAPI->new_idle (0, 0); 959 pe = GEventAPI->new_idle (0, 0);
889 960
961 WaREENTRANT_off (pe);
890 pe->base.callback = (void *)iw_dispatch; 962 pe->base.callback = (void *)iw_dispatch;
891 pe->base.ext_data = (void *)this; 963 pe->base.ext_data = (void *)this;
892} 964}
893 965
894static void iow_dispatch (pe_event *ev) 966static void iow_dispatch (pe_event *ev)
900void 972void
901iow::alloc () 973iow::alloc ()
902{ 974{
903 pe = GEventAPI->new_io (0, 0); 975 pe = GEventAPI->new_io (0, 0);
904 976
977 WaREENTRANT_off (pe);
905 pe->base.callback = (void *)iow_dispatch; 978 pe->base.callback = (void *)iow_dispatch;
906 pe->base.ext_data = (void *)this; 979 pe->base.ext_data = (void *)this;
907 980
908 pe->fd = -1; 981 pe->fd = -1;
909 pe->poll = 0; 982 pe->poll = 0;
1237 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1310 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1238 const_iv (FLAG_IS_WATER) 1311 const_iv (FLAG_IS_WATER)
1239 const_iv (FLAG_CONTENT_ON_GEN) 1312 const_iv (FLAG_CONTENT_ON_GEN)
1240 const_iv (FLAG_IS_A_TEMPLATE) 1313 const_iv (FLAG_IS_A_TEMPLATE)
1241 const_iv (FLAG_IS_BUILDABLE) 1314 const_iv (FLAG_IS_BUILDABLE)
1315 const_iv (FLAG_DESTROY_ON_DEATH)
1316 const_iv (FLAG_NO_MAP_SAVE)
1242 1317
1243 const_iv (NDI_BLACK) 1318 const_iv (NDI_BLACK)
1244 const_iv (NDI_WHITE) 1319 const_iv (NDI_WHITE)
1245 const_iv (NDI_NAVY) 1320 const_iv (NDI_NAVY)
1246 const_iv (NDI_RED) 1321 const_iv (NDI_RED)
1288 const_iv (P_BLOCKSVIEW) 1363 const_iv (P_BLOCKSVIEW)
1289 const_iv (P_PLAYER) 1364 const_iv (P_PLAYER)
1290 const_iv (P_NO_MAGIC) 1365 const_iv (P_NO_MAGIC)
1291 const_iv (P_IS_ALIVE) 1366 const_iv (P_IS_ALIVE)
1292 const_iv (P_NO_CLERIC) 1367 const_iv (P_NO_CLERIC)
1293 const_iv (P_NEED_UPDATE)
1294 const_iv (P_OUT_OF_MAP) 1368 const_iv (P_OUT_OF_MAP)
1295 const_iv (P_NEW_MAP) 1369 const_iv (P_NEW_MAP)
1370 const_iv (P_UPTODATE)
1296 1371
1297 const_iv (UP_OBJ_INSERT) 1372 const_iv (UP_OBJ_INSERT)
1298 const_iv (UP_OBJ_REMOVE) 1373 const_iv (UP_OBJ_REMOVE)
1299 const_iv (UP_OBJ_CHANGE) 1374 const_iv (UP_OBJ_CHANGE)
1300 const_iv (UP_OBJ_FACE) 1375 const_iv (UP_OBJ_FACE)
1431 const_iv (ATNR_BLIND) 1506 const_iv (ATNR_BLIND)
1432 const_iv (ATNR_INTERNAL) 1507 const_iv (ATNR_INTERNAL)
1433 const_iv (ATNR_LIFE_STEALING) 1508 const_iv (ATNR_LIFE_STEALING)
1434 const_iv (ATNR_DISEASE) 1509 const_iv (ATNR_DISEASE)
1435 1510
1436 const_iv (MAP_FLUSH)
1437 const_iv (MAP_PLAYER_UNIQUE)
1438 const_iv (MAP_BLOCK)
1439 const_iv (MAP_STYLE)
1440 const_iv (MAP_OVERLAY)
1441
1442 const_iv (MAP_IN_MEMORY) 1511 const_iv (MAP_IN_MEMORY)
1443 const_iv (MAP_SWAPPED) 1512 const_iv (MAP_SWAPPED)
1444 const_iv (MAP_LOADING) 1513 const_iv (MAP_LOADING)
1445 const_iv (MAP_SAVING) 1514 const_iv (MAP_SAVING)
1446 1515
1459 const_iv (ST_SETUP) 1528 const_iv (ST_SETUP)
1460 const_iv (ST_PLAYING) 1529 const_iv (ST_PLAYING)
1461 const_iv (ST_CUSTOM) 1530 const_iv (ST_CUSTOM)
1462 1531
1463 const_iv (ST_CHANGE_CLASS) 1532 const_iv (ST_CHANGE_CLASS)
1464 const_iv (ST_CONFIRM_QUIT)
1465 const_iv (ST_GET_PARTY_PASSWORD)
1466 1533
1467 const_iv (IO_HEADER) 1534 const_iv (IO_HEADER)
1468 const_iv (IO_OBJECTS) 1535 const_iv (IO_OBJECTS)
1469 const_iv (IO_UNIQUES) 1536 const_iv (IO_UNIQUES)
1470 1537
1524 1591
1525void _global_reattach () 1592void _global_reattach ()
1526 CODE: 1593 CODE:
1527{ 1594{
1528 // reattach to all attachable objects in the game. 1595 // reattach to all attachable objects in the game.
1529 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1596 for_all_clients (ns)
1530 (*i)->reattach (); 1597 ns->reattach ();
1531 1598
1532 for_all_players (pl) 1599 for_all_objects (op)
1533 pl->reattach ();
1534
1535 //TODO
1536 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1537 // i->second->reattach ();
1538
1539 for (object *op = object::first; op; op = op->next)
1540 op->reattach (); 1600 op->reattach ();
1541} 1601}
1542 1602
1543NV floor (NV x) 1603NV floor (NV x)
1544 1604
1545NV ceil (NV x) 1605NV ceil (NV x)
1606
1607NV rndm (...)
1608 CODE:
1609 switch (items)
1610 {
1611 case 0: RETVAL = rndm (); break;
1612 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1613 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1614 default: croak ("cf::rndm requires none, one or two parameters."); break;
1615 }
1616 OUTPUT:
1617 RETVAL
1546 1618
1547void server_tick () 1619void server_tick ()
1548 CODE: 1620 CODE:
1549 runtime = SvNVx (sv_runtime); 1621 runtime = SvNVx (sv_runtime);
1550 server_tick (); 1622 server_tick ();
1595 case 5: RETVAL = settings.playerdir; break; 1667 case 5: RETVAL = settings.playerdir; break;
1596 case 6: RETVAL = settings.datadir ; break; 1668 case 6: RETVAL = settings.datadir ; break;
1597 } 1669 }
1598 OUTPUT: RETVAL 1670 OUTPUT: RETVAL
1599 1671
1672void abort ()
1673
1674void fork_abort (char *cause = "cf::fork_abort")
1675
1676void cleanup (const char *cause, bool make_core = false)
1677
1600void emergency_save () 1678void emergency_save ()
1601 1679
1602void _exit (int status = 0) 1680void _exit (int status = EXIT_SUCCESS)
1681
1682UV sv_2watcher (SV *w)
1683 CODE:
1684 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1685 OUTPUT:
1686 RETVAL
1687
1688#if _POSIX_MEMLOCK
1689
1690int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1691
1692int munlockall ()
1693
1694#endif
1603 1695
1604int find_animation (char *text) 1696int find_animation (char *text)
1605 PROTOTYPE: $ 1697 PROTOTYPE: $
1606 1698
1607int random_roll (int min, int max, object *op, int goodbad); 1699int random_roll (int min, int max, object *op, int goodbad);
1645 RETVAL = newSVpv (resist_plus[atnr], 0); 1737 RETVAL = newSVpv (resist_plus[atnr], 0);
1646 else 1738 else
1647 XSRETURN_UNDEF; 1739 XSRETURN_UNDEF;
1648 OUTPUT: RETVAL 1740 OUTPUT: RETVAL
1649 1741
1742bool
1743load_resource_file (const char *filename)
1744
1650MODULE = cf PACKAGE = cf::attachable 1745MODULE = cf PACKAGE = cf::attachable
1651 1746
1652int 1747int
1653valid (SV *obj) 1748valid (SV *obj)
1654 CODE: 1749 CODE:
1655 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1750 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1656 OUTPUT: 1751 OUTPUT:
1657 RETVAL 1752 RETVAL
1658 1753
1659#bool
1660#destroyed (attachable *at)
1661#
1662#void 1754void
1663#destroy (attachable *at) 1755debug_trace (attachable *obj, bool on = true)
1756 CODE:
1757 obj->flags &= ~attachable::F_DEBUG_TRACE;
1758 if (on)
1759 obj->flags |= attachable::F_DEBUG_TRACE;
1760
1761int mortals_size ()
1762 CODE:
1763 RETVAL = attachable::mortals.size ();
1764 OUTPUT: RETVAL
1765
1766#object *mortals (U32 index)
1767# CODE:
1768# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1769# OUTPUT: RETVAL
1770
1771INCLUDE: $PERL $srcdir/genacc attachable ../include/cfperl.h |
1664 1772
1665MODULE = cf PACKAGE = cf::global 1773MODULE = cf PACKAGE = cf::global
1666 1774
1667int invoke (SV *klass, int event, ...) 1775int invoke (SV *klass, int event, ...)
1668 CODE: 1776 CODE:
1672 RETVAL = gbl_ev.invoke ((event_type)event, ARG_AV (av), DT_END); 1780 RETVAL = gbl_ev.invoke ((event_type)event, ARG_AV (av), DT_END);
1673 OUTPUT: RETVAL 1781 OUTPUT: RETVAL
1674 1782
1675MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ 1783MODULE = cf PACKAGE = cf::object PREFIX = cf_object_
1676 1784
1677INCLUDE: $PERL genacc object ../include/object.h | 1785INCLUDE: $PERL $srcdir/genacc object ../include/object.h |
1678 1786
1679int invoke (object *op, int event, ...) 1787int invoke (object *op, int event, ...)
1680 CODE: 1788 CODE:
1681 if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT"); 1789 if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT");
1682 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 1790 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
1684 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1792 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1685 OUTPUT: RETVAL 1793 OUTPUT: RETVAL
1686 1794
1687SV *registry (object *op) 1795SV *registry (object *op)
1688 1796
1689void mortals () 1797int objects_size ()
1690 PPCODE: 1798 CODE:
1691 EXTEND (SP, object::mortals.size ());
1692 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1693 PUSHs (to_sv (*i));
1694
1695object *first ()
1696 CODE:
1697 RETVAL = object::first; 1799 RETVAL = objects.size ();
1800 OUTPUT: RETVAL
1801
1802object *objects (U32 index)
1803 CODE:
1804 RETVAL = index < objects.size () ? objects [index] : 0;
1805 OUTPUT: RETVAL
1806
1807int actives_size ()
1808 CODE:
1809 RETVAL = actives.size ();
1810 OUTPUT: RETVAL
1811
1812object *actives (U32 index)
1813 CODE:
1814 RETVAL = index < actives.size () ? actives [index] : 0;
1698 OUTPUT: RETVAL 1815 OUTPUT: RETVAL
1699 1816
1700# missing properties 1817# missing properties
1701 1818
1702object *head (object *op) 1819object *head (object *op)
1703 PROTOTYPE: $ 1820 PROTOTYPE: $
1704 CODE: 1821 CODE:
1705 RETVAL = op->head ? op->head : op; 1822 RETVAL = op->head_ ();
1706 OUTPUT: RETVAL 1823 OUTPUT: RETVAL
1707 1824
1708int is_head (object *op) 1825int is_head (object *op)
1709 PROTOTYPE: $ 1826 PROTOTYPE: $
1710 CODE: 1827 CODE:
1711 RETVAL = !op->head; 1828 RETVAL = op->head_ () == op;
1712 OUTPUT: RETVAL 1829 OUTPUT: RETVAL
1713 1830
1714void 1831void
1715inv (object *obj) 1832inv (object *obj)
1716 PROTOTYPE: $ 1833 PROTOTYPE: $
1724void 1841void
1725set_animation (object *op, int idx) 1842set_animation (object *op, int idx)
1726 CODE: 1843 CODE:
1727 SET_ANIMATION (op, idx); 1844 SET_ANIMATION (op, idx);
1728 1845
1846int
1847num_animations (object *op)
1848 CODE:
1849 RETVAL = NUM_ANIMATIONS (op);
1850 OUTPUT: RETVAL
1851
1729object *find_best_object_match (object *op, const char *match) 1852object *find_best_object_match (object *op, const char *match)
1730 1853
1731object *find_marked_object (object *op) 1854object *find_marked_object (object *op)
1732 1855
1733int need_identify (object *obj); 1856int need_identify (object *obj);
1734 1857
1735int apply_shop_mat (object *shop_mat, object *op); 1858int apply_shop_mat (object *shop_mat, object *op);
1859
1860int move_player (object *op, int dir)
1861 CODE:
1862 RETVAL = move_player (op, dir);
1863 OUTPUT:
1864 RETVAL
1736 1865
1737int move (object *op, int dir, object *originator = op) 1866int move (object *op, int dir, object *originator = op)
1738 CODE: 1867 CODE:
1739 RETVAL = move_ob (op, dir, originator); 1868 RETVAL = move_ob (op, dir, originator);
1740 OUTPUT: 1869 OUTPUT:
1745 manual_apply (applied, applier, flags); 1874 manual_apply (applied, applier, flags);
1746 1875
1747void apply_below (object *op) 1876void apply_below (object *op)
1748 CODE: 1877 CODE:
1749 player_apply_below (op); 1878 player_apply_below (op);
1879
1880int cast_heal (object *op, object *caster, object *spell, int dir = 0)
1750 1881
1751object *cf_object_present_archname_inside (object *op, char *whatstr) 1882object *cf_object_present_archname_inside (object *op, char *whatstr)
1752 1883
1753int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0) 1884int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0)
1754 1885
1807 1938
1808void drop (object *who, object *op) 1939void drop (object *who, object *op)
1809 1940
1810void pick_up (object *who, object *op) 1941void pick_up (object *who, object *op)
1811 1942
1812object *cf_object_insert_object (object *op, object *container)
1813
1814object *cf_object_insert_in_ob (object *ob, object *where)
1815
1816int cf_object_teleport (object *op, maptile *map, int x, int y) 1943int cf_object_teleport (object *op, maptile *map, int x, int y)
1817 1944
1818void update_object (object *op, int action) 1945void update_object (object *op, int action)
1819 1946
1820object *cf_create_object_by_name (const char *name) 1947object *cf_create_object_by_name (const char *name)
1913 RETVAL = op->contr; 2040 RETVAL = op->contr;
1914 OUTPUT: RETVAL 2041 OUTPUT: RETVAL
1915 2042
1916void check_score (object *op) 2043void check_score (object *op)
1917 2044
1918void cf_player_message (object *obj, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE) 2045void message (object *op, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE)
2046 CODE:
2047 new_draw_info (flags, 0, op, txt);
1919 2048
1920object *cf_player_send_inventory (object *op) 2049object *cf_player_send_inventory (object *op)
1921 2050
1922char *cf_player_get_ip (object *op) 2051char *cf_player_get_ip (object *op)
1923 ALIAS: ip = 0 2052 ALIAS: ip = 0
1937void esrv_update_item (object *op, int what, object *item) 2066void esrv_update_item (object *op, int what, object *item)
1938 C_ARGS: what, op, item 2067 C_ARGS: what, op, item
1939 2068
1940void clear_los (object *op) 2069void clear_los (object *op)
1941 2070
1942int command_teleport (object *op, char *params)
1943
1944int command_summon (object *op, char *params) 2071int command_summon (object *op, char *params)
1945 2072
1946int command_arrest (object *op, char *params) 2073int command_arrest (object *op, char *params)
1947 2074
1948int command_kick (object *op, char *params)
1949
1950int command_banish (object *op, char *params)
1951
1952 2075
1953MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ 2076MODULE = cf PACKAGE = cf::player PREFIX = cf_player_
1954 2077
1955INCLUDE: $PERL genacc player ../include/player.h | 2078INCLUDE: $PERL $srcdir/genacc player ../include/player.h |
1956 2079
1957int invoke (player *pl, int event, ...) 2080int invoke (player *pl, int event, ...)
1958 CODE: 2081 CODE:
1959 if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); 2082 if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER");
1960 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 2083 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
1970 pl->ob->stats.hp = pl->ob->stats.maxhp; 2093 pl->ob->stats.hp = pl->ob->stats.maxhp;
1971 pl->ob->stats.sp = pl->ob->stats.maxsp; 2094 pl->ob->stats.sp = pl->ob->stats.maxsp;
1972 pl->ob->stats.grace = pl->ob->stats.maxgrace; 2095 pl->ob->stats.grace = pl->ob->stats.maxgrace;
1973 pl->orig_stats = pl->ob->stats; 2096 pl->orig_stats = pl->ob->stats;
1974 2097
1975player *cf_player_find (char *name)
1976 PROTOTYPE: $
1977
1978void cf_player_move (player *pl, int dir) 2098void cf_player_move (player *pl, int dir)
1979 2099
1980void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2100void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
1981
1982player *first ()
1983 CODE:
1984 RETVAL = first_player;
1985 OUTPUT: RETVAL
1986 2101
1987bool 2102bool
1988cell_visible (player *pl, int dx, int dy) 2103cell_visible (player *pl, int dx, int dy)
1989 CODE: 2104 CODE:
1990 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2 2105 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2
2027 if (y) sv_to (y, pl->bed_y); 2142 if (y) sv_to (y, pl->bed_y);
2028 2143
2029void 2144void
2030list () 2145list ()
2031 PPCODE: 2146 PPCODE:
2032 for (player *pl = first_player; pl; pl = pl->next) 2147 for_all_players (pl)
2033 XPUSHs (sv_2mortal (to_sv (pl))); 2148 XPUSHs (sv_2mortal (to_sv (pl)));
2034
2035bool
2036peaceful (player *pl, bool new_setting = 0)
2037 PROTOTYPE: $;$
2038 CODE:
2039 RETVAL = pl->peaceful;
2040 if (items > 1)
2041 pl->peaceful = new_setting;
2042 OUTPUT:
2043 RETVAL
2044
2045living *
2046orig_stats (player *pl)
2047 CODE:
2048 RETVAL = &pl->orig_stats;
2049 OUTPUT: RETVAL
2050
2051living *
2052last_stats (player *pl)
2053 CODE:
2054 RETVAL = &pl->last_stats;
2055 OUTPUT: RETVAL
2056 2149
2057 2150
2058MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2151MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2059 2152
2060int invoke (maptile *map, int event, ...) 2153int invoke (maptile *map, int event, ...)
2065 RETVAL = map->invoke ((event_type)event, ARG_AV (av), DT_END); 2158 RETVAL = map->invoke ((event_type)event, ARG_AV (av), DT_END);
2066 OUTPUT: RETVAL 2159 OUTPUT: RETVAL
2067 2160
2068SV *registry (maptile *map) 2161SV *registry (maptile *map)
2069 2162
2070INCLUDE: $PERL genacc maptile ../include/map.h | 2163INCLUDE: $PERL $srcdir/genacc maptile ../include/map.h |
2071 2164
2072void 2165void
2073maptile::instantiate () 2166maptile::instantiate ()
2074 2167
2075maptile *new () 2168maptile *new ()
2076 PROTOTYPE: 2169 PROTOTYPE:
2077 CODE: 2170 CODE:
2078 RETVAL = new maptile; 2171 RETVAL = new maptile;
2079 OUTPUT: 2172 OUTPUT:
2080 RETVAL 2173 RETVAL
2081
2082void
2083maptile::destroy ()
2084 2174
2085void 2175void
2086maptile::players () 2176maptile::players ()
2087 PPCODE: 2177 PPCODE:
2088 if (GIMME_V == G_SCALAR) 2178 if (GIMME_V == G_SCALAR)
2093 for_all_players (pl) 2183 for_all_players (pl)
2094 if (pl->ob && pl->ob->map == THIS) 2184 if (pl->ob && pl->ob->map == THIS)
2095 PUSHs (sv_2mortal (to_sv (pl->ob))); 2185 PUSHs (sv_2mortal (to_sv (pl->ob)));
2096 } 2186 }
2097 2187
2188void
2189maptile::add_underlay (SV *data, int offset, int stride, SV *palette)
2190 CODE:
2191{
2192 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2193 croak ("maptile::add_underlay: palette must be arrayref");
2194
2195 palette = SvRV (palette);
2196
2197 STRLEN idxlen;
2198 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2199
2200 for (int x = 0; x < THIS->width; ++x)
2201 for (int y = 0; y < THIS->height; ++y)
2202 {
2203 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2204 if (op->flag [FLAG_IS_FLOOR])
2205 goto skip_space;
2206
2207 {
2208 int offs = offset + y * stride + x;
2209 if (IN_RANGE_EXC (offs, 0, idxlen))
2210 {
2211 if (SV **elem = av_fetch ((AV *)palette, idx [offs], 0))
2212 {
2213 object *ob = get_archetype (SvPVutf8_nolen (*elem));
2214 ob->flag [FLAG_NO_MAP_SAVE] = true;
2215 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY);
2216 }
2217 }
2218 }
2219
2220 skip_space: ;
2221 }
2222}
2223
2224void
2225maptile::set_regiondata (SV *data, int offset, int stride, SV *palette)
2226 CODE:
2227{
2228 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2229 croak ("maptile::set_regiondata: palette must be arrayref");
2230
2231 palette = SvRV (palette);
2232
2233 STRLEN idxlen;
2234 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2235
2236 region **regionmap = (region **)malloc (
2237 (av_len ((AV *)palette) + 1) * sizeof (region *));
2238 uint8_t *regions = salloc<uint8_t> (THIS->size ());
2239
2240 for (int i = av_len ((AV *)palette) + 1; i--; )
2241 regionmap [i] = region::find (
2242 SvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1)));
2243
2244 for (int y = 0; y < THIS->height; ++y)
2245 memcpy (regions + y * THIS->width, idx + offset + y * stride, THIS->width);
2246
2247 sfree (THIS->regions, THIS->size ());
2248 free (THIS->regionmap);
2249
2250 THIS->regions = regions;
2251 THIS->regionmap = regionmap;
2252}
2253
2098void play_sound_map (maptile *map, int x, int y, int sound_num) 2254void play_sound_map (maptile *map, int x, int y, int sound_num)
2099 2255
2100int out_of_map (maptile *map, int x, int y) 2256int out_of_map (maptile *map, int x, int y)
2101 2257
2102void 2258void
2118 2274
2119object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2275object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2120 C_ARGS: str, map, nx, ny 2276 C_ARGS: str, map, nx, ny
2121 2277
2122void 2278void
2123cf_map_normalise (maptile *map, int x, int y) 2279get_map_flags (maptile *map, int x, int y)
2124 PPCODE: 2280 PPCODE:
2125{ 2281{
2126 maptile *nmap = 0; 2282 maptile *nmap = 0;
2127 I16 nx = 0, ny = 0; 2283 I16 nx = 0, ny = 0;
2128 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2284 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2177 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break; 2333 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break;
2178 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break; 2334 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break;
2179 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; 2335 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break;
2180 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; 2336 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break;
2181 } 2337 }
2182 OUTPUT: 2338 OUTPUT: RETVAL
2183 RETVAL
2184 2339
2185void fix_walls (maptile *map, int x, int y) 2340void fix_walls (maptile *map, int x, int y)
2186 2341
2187void fix_walls_around (maptile *map, int x, int y) 2342void fix_walls_around (maptile *map, int x, int y)
2188 2343
2189# worst xs function of my life 2344# worst xs function of my life
2190maptile * 2345bool
2191_create_random_map (\ 2346_create_random_map (\
2192 char *path,\ 2347 maptile *self,\
2193 char *wallstyle,\ 2348 char *wallstyle,\
2194 char *wall_name,\ 2349 char *wall_name,\
2195 char *floorstyle,\ 2350 char *floorstyle,\
2196 char *monsterstyle,\ 2351 char *monsterstyle,\
2197 char *treasurestyle,\ 2352 char *treasurestyle,\
2201 char *origin_map,\ 2356 char *origin_map,\
2202 char *final_map,\ 2357 char *final_map,\
2203 char *exitstyle,\ 2358 char *exitstyle,\
2204 char *this_map,\ 2359 char *this_map,\
2205 char *exit_on_final_map,\ 2360 char *exit_on_final_map,\
2206 int Xsize,\ 2361 int xsize,\
2207 int Ysize,\ 2362 int ysize,\
2208 int expand2x,\ 2363 int expand2x,\
2209 int layoutoptions1,\ 2364 int layoutoptions1,\
2210 int layoutoptions2,\ 2365 int layoutoptions2,\
2211 int layoutoptions3,\ 2366 int layoutoptions3,\
2212 int symmetry,\ 2367 int symmetry,\
2217 int dungeon_depth,\ 2372 int dungeon_depth,\
2218 int decoroptions,\ 2373 int decoroptions,\
2219 int orientation,\ 2374 int orientation,\
2220 int origin_y,\ 2375 int origin_y,\
2221 int origin_x,\ 2376 int origin_x,\
2222 int random_seed,\ 2377 U32 random_seed,\
2223 val64 total_map_hp,\ 2378 val64 total_map_hp,\
2224 int map_layout_style,\ 2379 int map_layout_style,\
2225 int treasureoptions,\ 2380 int treasureoptions,\
2226 int symmetry_used,\ 2381 int symmetry_used,\
2227 region *region\ 2382 region *region,\
2383 char *custom\
2228) 2384)
2229 CODE: 2385 CODE:
2230{ 2386{
2231 random_map_params rmp; 2387 random_map_params rmp;
2232 2388
2236 assign (rmp.monsterstyle , monsterstyle); 2392 assign (rmp.monsterstyle , monsterstyle);
2237 assign (rmp.treasurestyle , treasurestyle); 2393 assign (rmp.treasurestyle , treasurestyle);
2238 assign (rmp.layoutstyle , layoutstyle); 2394 assign (rmp.layoutstyle , layoutstyle);
2239 assign (rmp.doorstyle , doorstyle); 2395 assign (rmp.doorstyle , doorstyle);
2240 assign (rmp.decorstyle , decorstyle); 2396 assign (rmp.decorstyle , decorstyle);
2241 assign (rmp.origin_map , origin_map);
2242 assign (rmp.final_map , final_map);
2243 assign (rmp.exitstyle , exitstyle); 2397 assign (rmp.exitstyle , exitstyle);
2244 assign (rmp.this_map , this_map);
2245 assign (rmp.exit_on_final_map, exit_on_final_map); 2398 assign (rmp.exit_on_final_map, exit_on_final_map);
2246 2399
2400 rmp.origin_map = origin_map;
2401 rmp.final_map = final_map;
2402 rmp.this_map = this_map;
2247 rmp.Xsize = Xsize; 2403 rmp.xsize = xsize;
2248 rmp.Ysize = Ysize; 2404 rmp.ysize = ysize;
2249 rmp.expand2x = expand2x; 2405 rmp.expand2x = expand2x;
2250 rmp.layoutoptions1 = layoutoptions1; 2406 rmp.layoutoptions1 = layoutoptions1;
2251 rmp.layoutoptions2 = layoutoptions2; 2407 rmp.layoutoptions2 = layoutoptions2;
2252 rmp.layoutoptions3 = layoutoptions3; 2408 rmp.layoutoptions3 = layoutoptions3;
2253 rmp.symmetry = symmetry; 2409 rmp.symmetry = symmetry;
2264 rmp.total_map_hp = total_map_hp; 2420 rmp.total_map_hp = total_map_hp;
2265 rmp.map_layout_style = map_layout_style; 2421 rmp.map_layout_style = map_layout_style;
2266 rmp.treasureoptions = treasureoptions; 2422 rmp.treasureoptions = treasureoptions;
2267 rmp.symmetry_used = symmetry_used; 2423 rmp.symmetry_used = symmetry_used;
2268 rmp.region = region; 2424 rmp.region = region;
2425 rmp.custom = custom;
2269 2426
2270 RETVAL = generate_random_map (path, &rmp); 2427 RETVAL = self->generate_random_map (&rmp);
2271} 2428}
2272 OUTPUT: 2429 OUTPUT:
2273 RETVAL 2430 RETVAL
2274 2431
2275MODULE = cf PACKAGE = cf::arch 2432MODULE = cf PACKAGE = cf::arch
2284 PROTOTYPE: 2441 PROTOTYPE:
2285 CODE: 2442 CODE:
2286 RETVAL = first_archetype; 2443 RETVAL = first_archetype;
2287 OUTPUT: RETVAL 2444 OUTPUT: RETVAL
2288 2445
2289INCLUDE: $PERL genacc archetype ../include/object.h | 2446INCLUDE: $PERL $srcdir/genacc archetype ../include/object.h |
2290 2447
2291MODULE = cf PACKAGE = cf::party 2448MODULE = cf PACKAGE = cf::party
2292 2449
2293partylist *first () 2450partylist *first ()
2294 PROTOTYPE: 2451 PROTOTYPE:
2295 CODE: 2452 CODE:
2296 RETVAL = get_firstparty (); 2453 RETVAL = get_firstparty ();
2297 OUTPUT: RETVAL 2454 OUTPUT: RETVAL
2298 2455
2299INCLUDE: $PERL genacc partylist ../include/player.h | 2456INCLUDE: $PERL $srcdir/genacc partylist ../include/player.h |
2300 2457
2301MODULE = cf PACKAGE = cf::region 2458MODULE = cf PACKAGE = cf::region
2302 2459
2303region *first () 2460void
2461list ()
2462 PPCODE:
2463 for_all_regions (rgn)
2464 XPUSHs (sv_2mortal (to_sv (rgn)));
2465
2466region *find (char *name)
2304 PROTOTYPE: 2467 PROTOTYPE: $
2305 CODE: 2468 CODE:
2306 RETVAL = first_region; 2469 RETVAL = region::find (name);
2307 OUTPUT: RETVAL 2470 OUTPUT: RETVAL
2308 2471
2472region *find_fuzzy (char *name)
2473 PROTOTYPE: $
2474 CODE:
2475 RETVAL = region::find_fuzzy (name);
2476 OUTPUT: RETVAL
2477
2309INCLUDE: $PERL genacc region ../include/map.h | 2478INCLUDE: $PERL $srcdir/genacc region ../include/map.h |
2310 2479
2311MODULE = cf PACKAGE = cf::living 2480MODULE = cf PACKAGE = cf::living
2312 2481
2313INCLUDE: $PERL genacc living ../include/living.h | 2482INCLUDE: $PERL $srcdir/genacc living ../include/living.h |
2314 2483
2315MODULE = cf PACKAGE = cf::settings 2484MODULE = cf PACKAGE = cf::settings
2316 2485
2317INCLUDE: $PERL genacc Settings ../include/global.h | 2486INCLUDE: $PERL $srcdir/genacc Settings ../include/global.h |
2318 2487
2319MODULE = cf PACKAGE = cf::client 2488MODULE = cf PACKAGE = cf::client
2320 2489
2321INCLUDE: $PERL genacc client ../include/client.h | 2490INCLUDE: $PERL $srcdir/genacc client ../include/client.h |
2322 2491
2323int invoke (client *ns, int event, ...) 2492int invoke (client *ns, int event, ...)
2324 CODE: 2493 CODE:
2325 if (KLASS_OF (event) != KLASS_CLIENT) croak ("event class must be CLIENT"); 2494 if (KLASS_OF (event) != KLASS_CLIENT) croak ("event class must be CLIENT");
2326 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 2495 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
2345 char *buf = SvPVbyte (packet, len); 2514 char *buf = SvPVbyte (packet, len);
2346 2515
2347 THIS->send_packet (buf, len); 2516 THIS->send_packet (buf, len);
2348} 2517}
2349 2518
2350void 2519MODULE = cf PACKAGE = cf::face PREFIX = face_
2351client::destroy ()
2352 2520
2521INCLUDE: $PERL $srcdir/genacc faceset ../include/face.h |
2522
2523int face_find (const char *name, int defidx = 0)
2524
2525int alloc (const char *name)
2526 CODE:
2527{
2528 do
2529 {
2530 RETVAL = faces.size ();
2531 faces.resize (RETVAL + 1);
2532 face32.resize (RETVAL + 1);
2533 face64.resize (RETVAL + 1);
2534 }
2535 while (!RETVAL); // crude way to leave index 0
2536
2537 faces [RETVAL].name = name;
2538 facehash.insert (std::make_pair (faces [RETVAL].name, RETVAL));
2539
2540 if (!strcmp (name, BLANK_FACE_NAME)) blank_face = RETVAL;
2541 if (!strcmp (name, EMPTY_FACE_NAME)) empty_face = RETVAL;
2542}
2543 OUTPUT: RETVAL
2544
2545void set (int idx, int visibility, int magicmap)
2546 CODE:
2547 faces [idx].visibility = visibility;
2548 faces [idx].magicmap = magicmap;
2549
2550void set_data (int idx, int faceset, SV *data, SV *chksum)
2551 CODE:
2552 facedata *d = face_data (idx, faceset);
2553 assert (sv_len (chksum) == CHKSUM_SIZE);
2554 sv_to (data, d->data); memcpy (d->chksum, SvPVbyte_nolen (chksum), CHKSUM_SIZE);
2555

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines