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.116 by root, Sat Dec 30 10:16:11 2006 UTC vs.
Revision 1.173 by root, Mon Mar 5 19:54:49 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); } 354inline SV *to_sv (facetile * 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); }
305 356
306inline SV *to_sv (UUID v) 357inline SV *to_sv (UUID v)
307{ 358{
308 char buf[128]; 359 char buf[128];
309 snprintf (buf, 128, "<1,%" PRIx64 ">", v.seq); 360 snprintf (buf, 128, "<1.%" PRIx64 ">", v.seq);
310 return newSVpv (buf, 0); 361 return newSVpv (buf, 0);
311} 362}
312 363
313inline void sv_to (SV *sv, shstr &v) { v = SvOK (sv) ? SvPV_nolen (sv) : 0; } 364inline 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; } 365inline 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"); } 379inline 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"); } 380inline 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"); } 381inline 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"); } 382inline 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"); } 383inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)(attachable *)SvPTR_ornull (sv, "cf::map"); }
384inline 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"); } 385inline 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"); } 386inline 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"); } 387inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
336 388
337inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 389inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
338inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 390inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
339 391
340template<class T> 392template<class T>
341inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 393inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
342 394
343template<int N> 395template<int N>
478{ 530{
479 if (!ext->cb) 531 if (!ext->cb)
480 ext->cb = newAV (); 532 ext->cb = newAV ();
481 533
482 return newRV_inc ((SV *)ext->cb); 534 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} 535}
521 536
522///////////////////////////////////////////////////////////////////////////// 537/////////////////////////////////////////////////////////////////////////////
523 538
524extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 539extern "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)) 612 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl))
598 { 613 {
599 printf ("unable to initialize perl-interpreter, aborting.\n"); 614 printf ("unable to initialize perl-interpreter, aborting.\n");
600 exit (EXIT_FAILURE); 615 exit (EXIT_FAILURE);
601 } 616 }
617
618 {
619 dSP;
620
621 PUSHMARK (SP);
622 PUTBACK;
623 call_pv ("cf::init", G_DISCARD | G_VOID);
624 }
602} 625}
603 626
604void cfperl_main () 627void cfperl_main ()
605{ 628{
606 dSP; 629 dSP;
820} 843}
821 844
822///////////////////////////////////////////////////////////////////////////// 845/////////////////////////////////////////////////////////////////////////////
823 846
824void 847void
825maptile::emergency_save () 848cfperl_emergency_save ()
826{ 849{
827 CALL_BEGIN (0); 850 CALL_BEGIN (0);
828 CALL_CALL ("cf::map::emergency_save", G_VOID); 851 CALL_CALL ("cf::emergency_save", G_VOID);
829 CALL_END; 852 CALL_END;
830} 853}
831 854
855void
856cfperl_cleanup (int make_core)
857{
858 CALL_BEGIN (1);
859 CALL_ARG (make_core);
860 CALL_CALL ("cf::post_cleanup", G_VOID);
861 CALL_END;
862}
863
832maptile * 864maptile *
833maptile::find_map (const char *path, maptile *origin) 865maptile::find_sync (const char *path, maptile *origin)
834{ 866{
835 CALL_BEGIN (2); 867 CALL_BEGIN (2);
836 CALL_ARG (path); 868 CALL_ARG (path);
837 CALL_ARG (origin); 869 CALL_ARG (origin);
838 CALL_CALL ("cf::map::find_map", G_SCALAR); 870 CALL_CALL ("cf::map::find_sync", G_SCALAR);
839 871
840 maptile *retval; 872 maptile *retval;
841 873
842 if (count) 874 if (count)
843 sv_to (POPs, retval); 875 sv_to (POPs, retval);
847 CALL_END; 879 CALL_END;
848 880
849 return retval; 881 return retval;
850} 882}
851 883
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 * 884maptile *
862maptile::customise_for (object *op) 885maptile::find_async (const char *path, maptile *origin)
863{ 886{
864 CALL_BEGIN (2); 887 CALL_BEGIN (2);
865 CALL_ARG (this); 888 CALL_ARG (path);
866 CALL_ARG (op); 889 CALL_ARG (origin);
867 CALL_CALL ("cf::map::customise_for", G_SCALAR); 890 CALL_CALL ("cf::map::find_async", G_SCALAR);
868 891
869 maptile *retval; 892 maptile *retval;
870 893
871 if (count) 894 if (count)
872 sv_to (POPs, retval); 895 sv_to (POPs, retval);
873 else 896 else
874 retval = 0; 897 retval = 0;
875 898
876 CALL_END; 899 CALL_END;
877 900
878 return retval ? retval : this; 901 return retval;
902}
903
904void
905maptile::do_load_sync ()
906{
907 CALL_BEGIN (1);
908 CALL_ARG (this);
909 CALL_CALL ("cf::map::do_load_sync", G_SCALAR);
910 CALL_END;
879} 911}
880 912
881void 913void
882maptile::change_all_map_light (int change) 914maptile::change_all_map_light (int change)
883{ 915{
903///////////////////////////////////////////////////////////////////////////// 935/////////////////////////////////////////////////////////////////////////////
904 936
905struct EventAPI *watcher_base::GEventAPI; 937struct EventAPI *watcher_base::GEventAPI;
906struct CoroAPI *coroapi::GCoroAPI; 938struct CoroAPI *coroapi::GCoroAPI;
907 939
940int coroapi::cede_counter;
941
908static void iw_dispatch (pe_event *ev) 942static void iw_dispatch (pe_event *ev)
909{ 943{
910 iw *w = (iw *)ev->ext_data; 944 iw *w = (iw *)ev->ext_data;
911 w->call (*w); 945 w->call (*w);
912} 946}
914void 948void
915iw::alloc () 949iw::alloc ()
916{ 950{
917 pe = GEventAPI->new_idle (0, 0); 951 pe = GEventAPI->new_idle (0, 0);
918 952
953 WaREENTRANT_off (pe);
919 pe->base.callback = (void *)iw_dispatch; 954 pe->base.callback = (void *)iw_dispatch;
920 pe->base.ext_data = (void *)this; 955 pe->base.ext_data = (void *)this;
921} 956}
922 957
923static void iow_dispatch (pe_event *ev) 958static void iow_dispatch (pe_event *ev)
929void 964void
930iow::alloc () 965iow::alloc ()
931{ 966{
932 pe = GEventAPI->new_io (0, 0); 967 pe = GEventAPI->new_io (0, 0);
933 968
969 WaREENTRANT_off (pe);
934 pe->base.callback = (void *)iow_dispatch; 970 pe->base.callback = (void *)iow_dispatch;
935 pe->base.ext_data = (void *)this; 971 pe->base.ext_data = (void *)this;
936 972
937 pe->fd = -1; 973 pe->fd = -1;
938 pe->poll = 0; 974 pe->poll = 0;
1266 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1302 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1267 const_iv (FLAG_IS_WATER) 1303 const_iv (FLAG_IS_WATER)
1268 const_iv (FLAG_CONTENT_ON_GEN) 1304 const_iv (FLAG_CONTENT_ON_GEN)
1269 const_iv (FLAG_IS_A_TEMPLATE) 1305 const_iv (FLAG_IS_A_TEMPLATE)
1270 const_iv (FLAG_IS_BUILDABLE) 1306 const_iv (FLAG_IS_BUILDABLE)
1307 const_iv (FLAG_DESTROY_ON_DEATH)
1308 const_iv (FLAG_NO_MAP_SAVE)
1271 1309
1272 const_iv (NDI_BLACK) 1310 const_iv (NDI_BLACK)
1273 const_iv (NDI_WHITE) 1311 const_iv (NDI_WHITE)
1274 const_iv (NDI_NAVY) 1312 const_iv (NDI_NAVY)
1275 const_iv (NDI_RED) 1313 const_iv (NDI_RED)
1317 const_iv (P_BLOCKSVIEW) 1355 const_iv (P_BLOCKSVIEW)
1318 const_iv (P_PLAYER) 1356 const_iv (P_PLAYER)
1319 const_iv (P_NO_MAGIC) 1357 const_iv (P_NO_MAGIC)
1320 const_iv (P_IS_ALIVE) 1358 const_iv (P_IS_ALIVE)
1321 const_iv (P_NO_CLERIC) 1359 const_iv (P_NO_CLERIC)
1322 const_iv (P_NEED_UPDATE)
1323 const_iv (P_OUT_OF_MAP) 1360 const_iv (P_OUT_OF_MAP)
1324 const_iv (P_NEW_MAP) 1361 const_iv (P_NEW_MAP)
1362 const_iv (P_UPTODATE)
1325 1363
1326 const_iv (UP_OBJ_INSERT) 1364 const_iv (UP_OBJ_INSERT)
1327 const_iv (UP_OBJ_REMOVE) 1365 const_iv (UP_OBJ_REMOVE)
1328 const_iv (UP_OBJ_CHANGE) 1366 const_iv (UP_OBJ_CHANGE)
1329 const_iv (UP_OBJ_FACE) 1367 const_iv (UP_OBJ_FACE)
1460 const_iv (ATNR_BLIND) 1498 const_iv (ATNR_BLIND)
1461 const_iv (ATNR_INTERNAL) 1499 const_iv (ATNR_INTERNAL)
1462 const_iv (ATNR_LIFE_STEALING) 1500 const_iv (ATNR_LIFE_STEALING)
1463 const_iv (ATNR_DISEASE) 1501 const_iv (ATNR_DISEASE)
1464 1502
1465 const_iv (MAP_FLUSH)
1466 const_iv (MAP_PLAYER_UNIQUE)
1467 const_iv (MAP_BLOCK)
1468 const_iv (MAP_STYLE)
1469 const_iv (MAP_OVERLAY)
1470
1471 const_iv (MAP_IN_MEMORY) 1503 const_iv (MAP_IN_MEMORY)
1472 const_iv (MAP_SWAPPED) 1504 const_iv (MAP_SWAPPED)
1473 const_iv (MAP_LOADING) 1505 const_iv (MAP_LOADING)
1474 const_iv (MAP_SAVING) 1506 const_iv (MAP_SAVING)
1475 1507
1488 const_iv (ST_SETUP) 1520 const_iv (ST_SETUP)
1489 const_iv (ST_PLAYING) 1521 const_iv (ST_PLAYING)
1490 const_iv (ST_CUSTOM) 1522 const_iv (ST_CUSTOM)
1491 1523
1492 const_iv (ST_CHANGE_CLASS) 1524 const_iv (ST_CHANGE_CLASS)
1493 const_iv (ST_CONFIRM_QUIT)
1494 const_iv (ST_GET_PARTY_PASSWORD)
1495 1525
1496 const_iv (IO_HEADER) 1526 const_iv (IO_HEADER)
1497 const_iv (IO_OBJECTS) 1527 const_iv (IO_OBJECTS)
1498 const_iv (IO_UNIQUES) 1528 const_iv (IO_UNIQUES)
1529
1530 // random map generator
1531 const_iv (LAYOUT_NONE)
1532 const_iv (LAYOUT_ONION)
1533 const_iv (LAYOUT_MAZE)
1534 const_iv (LAYOUT_SPIRAL)
1535 const_iv (LAYOUT_ROGUELIKE)
1536 const_iv (LAYOUT_SNAKE)
1537 const_iv (LAYOUT_SQUARE_SPIRAL)
1538
1539 const_iv (RMOPT_RANDOM)
1540 const_iv (RMOPT_CENTERED)
1541 const_iv (RMOPT_LINEAR)
1542 const_iv (RMOPT_BOTTOM_C)
1543 const_iv (RMOPT_BOTTOM_R)
1544 const_iv (RMOPT_IRR_SPACE)
1545 const_iv (RMOPT_WALL_OFF)
1546 const_iv (RMOPT_WALLS_ONLY)
1547 const_iv (RMOPT_NO_DOORS)
1548
1549 const_iv (SYMMETRY_RANDOM)
1550 const_iv (SYMMETRY_NONE)
1551 const_iv (SYMMETRY_X)
1552 const_iv (SYMMETRY_Y)
1553 const_iv (SYMMETRY_XY)
1499 }; 1554 };
1500 1555
1501 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 1556 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1502 newCONSTSUB (stash_cf, (char *)civ->name, newSViv (civ->iv)); 1557 newCONSTSUB (stash_cf, (char *)civ->name, newSViv (civ->iv));
1503 1558
1528 1583
1529void _global_reattach () 1584void _global_reattach ()
1530 CODE: 1585 CODE:
1531{ 1586{
1532 // reattach to all attachable objects in the game. 1587 // reattach to all attachable objects in the game.
1533 for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) 1588 for_all_clients (ns)
1534 (*i)->reattach (); 1589 ns->reattach ();
1535 1590
1536 for_all_players (pl) 1591 for_all_players (pl)
1537 pl->reattach (); 1592 pl->reattach ();
1538 1593
1539 //TODO 1594 //TODO
1540 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i) 1595 //for (map_container::iterator i = maps.begin (); i != maps.end (); ++i)
1541 // i->second->reattach (); 1596 // i->second->reattach ();
1542 1597
1543 for (object *op = object::first; op; op = op->next) 1598 for_all_objects (op)
1544 op->reattach (); 1599 op->reattach ();
1545} 1600}
1546 1601
1547NV floor (NV x) 1602NV floor (NV x)
1548 1603
1549NV ceil (NV x) 1604NV ceil (NV x)
1605
1606NV rndm (...)
1607 CODE:
1608 switch (items)
1609 {
1610 case 0: RETVAL = rndm (); break;
1611 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1612 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1613 default: croak ("cf::rndm requires none, one or two parameters."); break;
1614 }
1615 OUTPUT:
1616 RETVAL
1550 1617
1551void server_tick () 1618void server_tick ()
1552 CODE: 1619 CODE:
1553 runtime = SvNVx (sv_runtime); 1620 runtime = SvNVx (sv_runtime);
1554 server_tick (); 1621 server_tick ();
1599 case 5: RETVAL = settings.playerdir; break; 1666 case 5: RETVAL = settings.playerdir; break;
1600 case 6: RETVAL = settings.datadir ; break; 1667 case 6: RETVAL = settings.datadir ; break;
1601 } 1668 }
1602 OUTPUT: RETVAL 1669 OUTPUT: RETVAL
1603 1670
1671void abort ()
1672
1673void fork_abort (char *cause = "cf::fork_abort")
1674
1675void cleanup (const char *cause, bool make_core = false)
1676
1604void emergency_save () 1677void emergency_save ()
1605 1678
1606void _exit (int status = 0) 1679void _exit (int status = EXIT_SUCCESS)
1680
1681UV sv_2watcher (SV *w)
1682 CODE:
1683 RETVAL = (UV)GEventAPI->sv_2watcher (w);
1684 OUTPUT:
1685 RETVAL
1686
1687#if _POSIX_MEMLOCK
1688
1689int mlockall (int flags = MCL_CURRENT | MCL_FUTURE)
1690
1691int munlockall ()
1692
1693#endif
1607 1694
1608int find_animation (char *text) 1695int find_animation (char *text)
1609 PROTOTYPE: $ 1696 PROTOTYPE: $
1610 1697
1611int random_roll (int min, int max, object *op, int goodbad); 1698int random_roll (int min, int max, object *op, int goodbad);
1649 RETVAL = newSVpv (resist_plus[atnr], 0); 1736 RETVAL = newSVpv (resist_plus[atnr], 0);
1650 else 1737 else
1651 XSRETURN_UNDEF; 1738 XSRETURN_UNDEF;
1652 OUTPUT: RETVAL 1739 OUTPUT: RETVAL
1653 1740
1741bool
1742load_resource_file (const char *filename)
1743
1654MODULE = cf PACKAGE = cf::attachable 1744MODULE = cf PACKAGE = cf::attachable
1655 1745
1656int 1746int
1657valid (SV *obj) 1747valid (SV *obj)
1658 CODE: 1748 CODE:
1659 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1749 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1660 OUTPUT: 1750 OUTPUT:
1661 RETVAL 1751 RETVAL
1662 1752
1663#bool
1664#destroyed (attachable *at)
1665#
1666#void 1753void
1667#destroy (attachable *at) 1754debug_trace (attachable *obj, bool on = true)
1755 CODE:
1756 obj->flags &= ~attachable::F_DEBUG_TRACE;
1757 if (on)
1758 obj->flags |= attachable::F_DEBUG_TRACE;
1759
1760int mortals_size ()
1761 CODE:
1762 RETVAL = attachable::mortals.size ();
1763 OUTPUT: RETVAL
1764
1765#object *mortals (U32 index)
1766# CODE:
1767# RETVAL = index < attachable::mortals.size () ? attachable::mortals [index] : 0;
1768# OUTPUT: RETVAL
1769
1770INCLUDE: $PERL $srcdir/genacc attachable ../include/cfperl.h |
1668 1771
1669MODULE = cf PACKAGE = cf::global 1772MODULE = cf PACKAGE = cf::global
1670 1773
1671int invoke (SV *klass, int event, ...) 1774int invoke (SV *klass, int event, ...)
1672 CODE: 1775 CODE:
1676 RETVAL = gbl_ev.invoke ((event_type)event, ARG_AV (av), DT_END); 1779 RETVAL = gbl_ev.invoke ((event_type)event, ARG_AV (av), DT_END);
1677 OUTPUT: RETVAL 1780 OUTPUT: RETVAL
1678 1781
1679MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ 1782MODULE = cf PACKAGE = cf::object PREFIX = cf_object_
1680 1783
1681INCLUDE: $PERL genacc object ../include/object.h | 1784INCLUDE: $PERL $srcdir/genacc object ../include/object.h |
1682 1785
1683int invoke (object *op, int event, ...) 1786int invoke (object *op, int event, ...)
1684 CODE: 1787 CODE:
1685 if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT"); 1788 if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT");
1686 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 1789 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
1688 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END); 1791 RETVAL = op->invoke ((event_type)event, ARG_AV (av), DT_END);
1689 OUTPUT: RETVAL 1792 OUTPUT: RETVAL
1690 1793
1691SV *registry (object *op) 1794SV *registry (object *op)
1692 1795
1693void mortals () 1796int objects_size ()
1694 PPCODE: 1797 CODE:
1695 EXTEND (SP, object::mortals.size ());
1696 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1697 PUSHs (to_sv (*i));
1698
1699object *first ()
1700 CODE:
1701 RETVAL = object::first; 1798 RETVAL = objects.size ();
1799 OUTPUT: RETVAL
1800
1801object *objects (U32 index)
1802 CODE:
1803 RETVAL = index < objects.size () ? objects [index] : 0;
1804 OUTPUT: RETVAL
1805
1806int actives_size ()
1807 CODE:
1808 RETVAL = actives.size ();
1809 OUTPUT: RETVAL
1810
1811object *actives (U32 index)
1812 CODE:
1813 RETVAL = index < actives.size () ? actives [index] : 0;
1702 OUTPUT: RETVAL 1814 OUTPUT: RETVAL
1703 1815
1704# missing properties 1816# missing properties
1705 1817
1706object *head (object *op) 1818object *head (object *op)
1707 PROTOTYPE: $ 1819 PROTOTYPE: $
1708 CODE: 1820 CODE:
1709 RETVAL = op->head ? op->head : op; 1821 RETVAL = op->head_ ();
1710 OUTPUT: RETVAL 1822 OUTPUT: RETVAL
1711 1823
1712int is_head (object *op) 1824int is_head (object *op)
1713 PROTOTYPE: $ 1825 PROTOTYPE: $
1714 CODE: 1826 CODE:
1715 RETVAL = !op->head; 1827 RETVAL = op->head_ () == op;
1716 OUTPUT: RETVAL 1828 OUTPUT: RETVAL
1717 1829
1718void 1830void
1719inv (object *obj) 1831inv (object *obj)
1720 PROTOTYPE: $ 1832 PROTOTYPE: $
1728void 1840void
1729set_animation (object *op, int idx) 1841set_animation (object *op, int idx)
1730 CODE: 1842 CODE:
1731 SET_ANIMATION (op, idx); 1843 SET_ANIMATION (op, idx);
1732 1844
1845int
1846num_animations (object *op)
1847 CODE:
1848 RETVAL = NUM_ANIMATIONS (op);
1849 OUTPUT: RETVAL
1850
1733object *find_best_object_match (object *op, const char *match) 1851object *find_best_object_match (object *op, const char *match)
1734 1852
1735object *find_marked_object (object *op) 1853object *find_marked_object (object *op)
1736 1854
1737int need_identify (object *obj); 1855int need_identify (object *obj);
1738 1856
1739int apply_shop_mat (object *shop_mat, object *op); 1857int apply_shop_mat (object *shop_mat, object *op);
1858
1859int move_player (object *op, int dir)
1860 CODE:
1861 RETVAL = move_player (op, dir);
1862 OUTPUT:
1863 RETVAL
1740 1864
1741int move (object *op, int dir, object *originator = op) 1865int move (object *op, int dir, object *originator = op)
1742 CODE: 1866 CODE:
1743 RETVAL = move_ob (op, dir, originator); 1867 RETVAL = move_ob (op, dir, originator);
1744 OUTPUT: 1868 OUTPUT:
1749 manual_apply (applied, applier, flags); 1873 manual_apply (applied, applier, flags);
1750 1874
1751void apply_below (object *op) 1875void apply_below (object *op)
1752 CODE: 1876 CODE:
1753 player_apply_below (op); 1877 player_apply_below (op);
1878
1879int cast_heal (object *op, object *caster, object *spell, int dir = 0)
1754 1880
1755object *cf_object_present_archname_inside (object *op, char *whatstr) 1881object *cf_object_present_archname_inside (object *op, char *whatstr)
1756 1882
1757int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0) 1883int cf_object_transfer (object *op, int x, int y, int r = 0, object_ornull *orig = 0)
1758 1884
1811 1937
1812void drop (object *who, object *op) 1938void drop (object *who, object *op)
1813 1939
1814void pick_up (object *who, object *op) 1940void pick_up (object *who, object *op)
1815 1941
1816object *cf_object_insert_object (object *op, object *container)
1817
1818object *cf_object_insert_in_ob (object *ob, object *where)
1819
1820int cf_object_teleport (object *op, maptile *map, int x, int y) 1942int cf_object_teleport (object *op, maptile *map, int x, int y)
1821 1943
1822void update_object (object *op, int action) 1944void update_object (object *op, int action)
1823 1945
1824object *cf_create_object_by_name (const char *name) 1946object *cf_create_object_by_name (const char *name)
1917 RETVAL = op->contr; 2039 RETVAL = op->contr;
1918 OUTPUT: RETVAL 2040 OUTPUT: RETVAL
1919 2041
1920void check_score (object *op) 2042void check_score (object *op)
1921 2043
1922void cf_player_message (object *obj, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE) 2044void message (object *op, char *txt, int flags = NDI_ORANGE | NDI_UNIQUE)
2045 CODE:
2046 new_draw_info (flags, 0, op, txt);
1923 2047
1924object *cf_player_send_inventory (object *op) 2048object *cf_player_send_inventory (object *op)
1925 2049
1926char *cf_player_get_ip (object *op) 2050char *cf_player_get_ip (object *op)
1927 ALIAS: ip = 0 2051 ALIAS: ip = 0
1941void esrv_update_item (object *op, int what, object *item) 2065void esrv_update_item (object *op, int what, object *item)
1942 C_ARGS: what, op, item 2066 C_ARGS: what, op, item
1943 2067
1944void clear_los (object *op) 2068void clear_los (object *op)
1945 2069
1946int command_teleport (object *op, char *params)
1947
1948int command_summon (object *op, char *params) 2070int command_summon (object *op, char *params)
1949 2071
1950int command_arrest (object *op, char *params) 2072int command_arrest (object *op, char *params)
1951 2073
1952int command_kick (object *op, char *params)
1953
1954int command_banish (object *op, char *params) 2074int command_banish (object *op, char *params)
1955 2075
1956 2076
1957MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ 2077MODULE = cf PACKAGE = cf::player PREFIX = cf_player_
1958 2078
1959INCLUDE: $PERL genacc player ../include/player.h | 2079INCLUDE: $PERL $srcdir/genacc player ../include/player.h |
1960 2080
1961int invoke (player *pl, int event, ...) 2081int invoke (player *pl, int event, ...)
1962 CODE: 2082 CODE:
1963 if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); 2083 if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER");
1964 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 2084 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
1974 pl->ob->stats.hp = pl->ob->stats.maxhp; 2094 pl->ob->stats.hp = pl->ob->stats.maxhp;
1975 pl->ob->stats.sp = pl->ob->stats.maxsp; 2095 pl->ob->stats.sp = pl->ob->stats.maxsp;
1976 pl->ob->stats.grace = pl->ob->stats.maxgrace; 2096 pl->ob->stats.grace = pl->ob->stats.maxgrace;
1977 pl->orig_stats = pl->ob->stats; 2097 pl->orig_stats = pl->ob->stats;
1978 2098
1979player *cf_player_find (char *name)
1980 PROTOTYPE: $
1981
1982void cf_player_move (player *pl, int dir) 2099void cf_player_move (player *pl, int dir)
1983 2100
1984void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0); 2101void play_sound_player_only (player *pl, int soundnum, int x = 0, int y = 0);
1985
1986player *first ()
1987 CODE:
1988 RETVAL = first_player;
1989 OUTPUT: RETVAL
1990 2102
1991bool 2103bool
1992cell_visible (player *pl, int dx, int dy) 2104cell_visible (player *pl, int dx, int dy)
1993 CODE: 2105 CODE:
1994 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2 2106 RETVAL = FABS (dx) <= pl->ns->mapx / 2 && FABS (dy) <= pl->ns->mapy / 2
2031 if (y) sv_to (y, pl->bed_y); 2143 if (y) sv_to (y, pl->bed_y);
2032 2144
2033void 2145void
2034list () 2146list ()
2035 PPCODE: 2147 PPCODE:
2036 for (player *pl = first_player; pl; pl = pl->next) 2148 for_all_players (pl)
2037 XPUSHs (sv_2mortal (to_sv (pl))); 2149 XPUSHs (sv_2mortal (to_sv (pl)));
2038
2039bool
2040peaceful (player *pl, bool new_setting = 0)
2041 PROTOTYPE: $;$
2042 CODE:
2043 RETVAL = pl->peaceful;
2044 if (items > 1)
2045 pl->peaceful = new_setting;
2046 OUTPUT:
2047 RETVAL
2048
2049living *
2050orig_stats (player *pl)
2051 CODE:
2052 RETVAL = &pl->orig_stats;
2053 OUTPUT: RETVAL
2054
2055living *
2056last_stats (player *pl)
2057 CODE:
2058 RETVAL = &pl->last_stats;
2059 OUTPUT: RETVAL
2060 2150
2061 2151
2062MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2152MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2063 2153
2064int invoke (maptile *map, int event, ...) 2154int invoke (maptile *map, int event, ...)
2069 RETVAL = map->invoke ((event_type)event, ARG_AV (av), DT_END); 2159 RETVAL = map->invoke ((event_type)event, ARG_AV (av), DT_END);
2070 OUTPUT: RETVAL 2160 OUTPUT: RETVAL
2071 2161
2072SV *registry (maptile *map) 2162SV *registry (maptile *map)
2073 2163
2074INCLUDE: $PERL genacc maptile ../include/map.h | 2164INCLUDE: $PERL $srcdir/genacc maptile ../include/map.h |
2075 2165
2076void 2166void
2077maptile::instantiate () 2167maptile::instantiate ()
2078 2168
2079maptile *new () 2169maptile *new ()
2082 RETVAL = new maptile; 2172 RETVAL = new maptile;
2083 OUTPUT: 2173 OUTPUT:
2084 RETVAL 2174 RETVAL
2085 2175
2086void 2176void
2087maptile::destroy () 2177maptile::players ()
2178 PPCODE:
2179 if (GIMME_V == G_SCALAR)
2180 XPUSHs (sv_2mortal (to_sv (THIS->players)));
2181 else if (GIMME_V == G_ARRAY)
2182 {
2183 EXTEND (SP, THIS->players);
2184 for_all_players (pl)
2185 if (pl->ob && pl->ob->map == THIS)
2186 PUSHs (sv_2mortal (to_sv (pl->ob)));
2187 }
2188
2189void
2190maptile::add_underlay (SV *data, int offset, int stride, SV *palette)
2191 CODE:
2192{
2193 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2194 croak ("maptile::add_underlay: palette must be arrayref");
2195
2196 palette = SvRV (palette);
2197
2198 STRLEN idxlen;
2199 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2200
2201 for (int x = 0; x < THIS->width; ++x)
2202 for (int y = 0; y < THIS->height; ++y)
2203 {
2204 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2205 if (op->flag [FLAG_IS_FLOOR])
2206 goto skip_space;
2207
2208 {
2209 int offs = offset + y * stride + x;
2210 if (IN_RANGE_EXC (offs, 0, idxlen))
2211 {
2212 if (SV **elem = av_fetch ((AV *)palette, idx [offs], 0))
2213 {
2214 object *ob = get_archetype (SvPVutf8_nolen (*elem));
2215 ob->flag [FLAG_NO_MAP_SAVE] = true;
2216 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY);
2217 }
2218 }
2219 }
2220
2221 skip_space: ;
2222 }
2223}
2224
2225void
2226maptile::set_regiondata (SV *data, int offset, int stride, SV *palette)
2227 CODE:
2228{
2229 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2230 croak ("maptile::set_regiondata: palette must be arrayref");
2231
2232 palette = SvRV (palette);
2233
2234 STRLEN idxlen;
2235 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2236
2237 region **regionmap = (region **)malloc (
2238 (av_len ((AV *)palette) + 1) * sizeof (region *));
2239 uint8_t *regions = salloc<uint8_t> (THIS->size ());
2240
2241 for (int i = av_len ((AV *)palette) + 1; i--; )
2242 regionmap [i] = region::find (
2243 SvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1)));
2244
2245 for (int y = 0; y < THIS->height; ++y)
2246 memcpy (regions + y * THIS->width, idx + offset + y * stride, THIS->width);
2247
2248 sfree (THIS->regions, THIS->size ());
2249 free (THIS->regionmap);
2250
2251 THIS->regions = regions;
2252 THIS->regionmap = regionmap;
2253}
2088 2254
2089void play_sound_map (maptile *map, int x, int y, int sound_num) 2255void play_sound_map (maptile *map, int x, int y, int sound_num)
2090 2256
2091int out_of_map (maptile *map, int x, int y) 2257int out_of_map (maptile *map, int x, int y)
2092 2258
2109 2275
2110object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2276object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2111 C_ARGS: str, map, nx, ny 2277 C_ARGS: str, map, nx, ny
2112 2278
2113void 2279void
2114cf_map_normalise (maptile *map, int x, int y) 2280get_map_flags (maptile *map, int x, int y)
2115 PPCODE: 2281 PPCODE:
2116{ 2282{
2117 maptile *nmap = 0; 2283 maptile *nmap = 0;
2118 I16 nx = 0, ny = 0; 2284 I16 nx = 0, ny = 0;
2119 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2285 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2168 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break; 2334 case 4: RETVAL = newSVuv ( GET_MAP_MOVE_BLOCK (obj, x, y)); break;
2169 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break; 2335 case 5: RETVAL = newSVuv ( GET_MAP_MOVE_SLOW (obj, x, y)); break;
2170 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; 2336 case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break;
2171 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; 2337 case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break;
2172 } 2338 }
2173 OUTPUT: 2339 OUTPUT: RETVAL
2340
2341void fix_walls (maptile *map, int x, int y)
2342
2343void fix_walls_around (maptile *map, int x, int y)
2344
2345# worst xs function of my life
2346bool
2347_create_random_map (\
2348 maptile *self,\
2349 char *wallstyle,\
2350 char *wall_name,\
2351 char *floorstyle,\
2352 char *monsterstyle,\
2353 char *treasurestyle,\
2354 char *layoutstyle,\
2355 char *doorstyle,\
2356 char *decorstyle,\
2357 char *origin_map,\
2358 char *final_map,\
2359 char *exitstyle,\
2360 char *this_map,\
2361 char *exit_on_final_map,\
2362 int xsize,\
2363 int ysize,\
2364 int expand2x,\
2365 int layoutoptions1,\
2366 int layoutoptions2,\
2367 int layoutoptions3,\
2368 int symmetry,\
2369 int difficulty,\
2370 int difficulty_given,\
2371 float difficulty_increase,\
2372 int dungeon_level,\
2373 int dungeon_depth,\
2374 int decoroptions,\
2375 int orientation,\
2376 int origin_y,\
2377 int origin_x,\
2378 U32 random_seed,\
2379 val64 total_map_hp,\
2380 int map_layout_style,\
2381 int treasureoptions,\
2382 int symmetry_used,\
2383 region *region,\
2384 char *custom\
2385)
2386 CODE:
2387{
2388 random_map_params rmp;
2389
2390 assign (rmp.wallstyle , wallstyle);
2391 assign (rmp.wall_name , wall_name);
2392 assign (rmp.floorstyle , floorstyle);
2393 assign (rmp.monsterstyle , monsterstyle);
2394 assign (rmp.treasurestyle , treasurestyle);
2395 assign (rmp.layoutstyle , layoutstyle);
2396 assign (rmp.doorstyle , doorstyle);
2397 assign (rmp.decorstyle , decorstyle);
2398 assign (rmp.exitstyle , exitstyle);
2399 assign (rmp.exit_on_final_map, exit_on_final_map);
2400
2401 rmp.origin_map = origin_map;
2402 rmp.final_map = final_map;
2403 rmp.this_map = this_map;
2404 rmp.xsize = xsize;
2405 rmp.ysize = ysize;
2406 rmp.expand2x = expand2x;
2407 rmp.layoutoptions1 = layoutoptions1;
2408 rmp.layoutoptions2 = layoutoptions2;
2409 rmp.layoutoptions3 = layoutoptions3;
2410 rmp.symmetry = symmetry;
2411 rmp.difficulty = difficulty;
2412 rmp.difficulty_given = difficulty_given;
2413 rmp.difficulty_increase = difficulty_increase;
2414 rmp.dungeon_level = dungeon_level;
2415 rmp.dungeon_depth = dungeon_depth;
2416 rmp.decoroptions = decoroptions;
2417 rmp.orientation = orientation;
2418 rmp.origin_y = origin_y;
2419 rmp.origin_x = origin_x;
2420 rmp.random_seed = random_seed;
2421 rmp.total_map_hp = total_map_hp;
2422 rmp.map_layout_style = map_layout_style;
2423 rmp.treasureoptions = treasureoptions;
2424 rmp.symmetry_used = symmetry_used;
2425 rmp.region = region;
2426 rmp.custom = custom;
2427
2428 RETVAL = self->generate_random_map (&rmp);
2429}
2430 OUTPUT:
2174 RETVAL 2431 RETVAL
2175
2176void fix_walls (maptile *map, int x, int y)
2177
2178void fix_walls_around (maptile *map, int x, int y)
2179 2432
2180MODULE = cf PACKAGE = cf::arch 2433MODULE = cf PACKAGE = cf::arch
2181 2434
2182archetype *find (const char *name) 2435archetype *find (const char *name)
2183 CODE: 2436 CODE:
2189 PROTOTYPE: 2442 PROTOTYPE:
2190 CODE: 2443 CODE:
2191 RETVAL = first_archetype; 2444 RETVAL = first_archetype;
2192 OUTPUT: RETVAL 2445 OUTPUT: RETVAL
2193 2446
2194INCLUDE: $PERL genacc archetype ../include/object.h | 2447INCLUDE: $PERL $srcdir/genacc archetype ../include/object.h |
2195 2448
2196MODULE = cf PACKAGE = cf::party 2449MODULE = cf PACKAGE = cf::party
2197 2450
2198partylist *first () 2451partylist *first ()
2199 PROTOTYPE: 2452 PROTOTYPE:
2200 CODE: 2453 CODE:
2201 RETVAL = get_firstparty (); 2454 RETVAL = get_firstparty ();
2202 OUTPUT: RETVAL 2455 OUTPUT: RETVAL
2203 2456
2204partylist *next (partylist *party) 2457INCLUDE: $PERL $srcdir/genacc partylist ../include/player.h |
2458
2459MODULE = cf PACKAGE = cf::region
2460
2461void
2462list ()
2463 PPCODE:
2464 for_all_regions (rgn)
2465 XPUSHs (sv_2mortal (to_sv (rgn)));
2466
2467region *find (char *name)
2468 PROTOTYPE: $
2205 CODE: 2469 CODE:
2206 RETVAL = party->next; 2470 RETVAL = region::find (name);
2207 OUTPUT: RETVAL 2471 OUTPUT: RETVAL
2208 2472
2209const char *name (partylist *party) 2473region *find_fuzzy (char *name)
2474 PROTOTYPE: $
2210 CODE: 2475 CODE:
2211 RETVAL = party->partyname; 2476 RETVAL = region::find_fuzzy (name);
2212 OUTPUT: RETVAL 2477 OUTPUT: RETVAL
2213 2478
2214const char *password (partylist *party) 2479INCLUDE: $PERL $srcdir/genacc region ../include/map.h |
2215 CODE:
2216 RETVAL = party->passwd;
2217 OUTPUT: RETVAL
2218
2219MODULE = cf PACKAGE = cf::region
2220
2221region *first ()
2222 PROTOTYPE:
2223 CODE:
2224 RETVAL = first_region;
2225 OUTPUT: RETVAL
2226
2227region *next (region *reg)
2228 CODE:
2229 RETVAL = reg->next;
2230 OUTPUT: RETVAL
2231
2232const char *name (region *reg)
2233 CODE:
2234 RETVAL = reg->name;
2235 OUTPUT: RETVAL
2236
2237region *parent (region *reg)
2238 CODE:
2239 RETVAL = reg->parent;
2240 OUTPUT: RETVAL
2241
2242const char *longname (region *reg)
2243 CODE:
2244 RETVAL = reg->longname;
2245 OUTPUT: RETVAL
2246
2247const char *msg (region *reg)
2248 CODE:
2249 RETVAL = reg->msg;
2250 OUTPUT: RETVAL
2251 2480
2252MODULE = cf PACKAGE = cf::living 2481MODULE = cf PACKAGE = cf::living
2253 2482
2254INCLUDE: $PERL genacc living ../include/living.h | 2483INCLUDE: $PERL $srcdir/genacc living ../include/living.h |
2255 2484
2256MODULE = cf PACKAGE = cf::settings 2485MODULE = cf PACKAGE = cf::settings
2257 2486
2258INCLUDE: $PERL genacc Settings ../include/global.h | 2487INCLUDE: $PERL $srcdir/genacc Settings ../include/global.h |
2259 2488
2260MODULE = cf PACKAGE = cf::client 2489MODULE = cf PACKAGE = cf::client
2261 2490
2262INCLUDE: $PERL genacc client ../include/client.h | 2491INCLUDE: $PERL $srcdir/genacc client ../include/client.h |
2263 2492
2264int invoke (client *ns, int event, ...) 2493int invoke (client *ns, int event, ...)
2265 CODE: 2494 CODE:
2266 if (KLASS_OF (event) != KLASS_CLIENT) croak ("event class must be CLIENT"); 2495 if (KLASS_OF (event) != KLASS_CLIENT) croak ("event class must be CLIENT");
2267 AV *av = (AV *)sv_2mortal ((SV *)newAV ()); 2496 AV *av = (AV *)sv_2mortal ((SV *)newAV ());
2286 char *buf = SvPVbyte (packet, len); 2515 char *buf = SvPVbyte (packet, len);
2287 2516
2288 THIS->send_packet (buf, len); 2517 THIS->send_packet (buf, len);
2289} 2518}
2290 2519
2291void
2292client::destroy ()
2293

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines