… | |
… | |
313 | return newRV_inc ((SV *)ext->cb); |
313 | return newRV_inc ((SV *)ext->cb); |
314 | } |
314 | } |
315 | |
315 | |
316 | void attachable_base::clear () |
316 | void attachable_base::clear () |
317 | { |
317 | { |
318 | //if (self) fprintf (stderr, "free_ob_self %p %s (%p,%p)\n", this, ((object *)this)->name, self, cb);//D |
318 | if (self) |
|
|
319 | { |
|
|
320 | if (cb) |
|
|
321 | if (SvROK (*av_fetch ((AV *)cb, EVENT_OBJECT_DESTROY, 1))) |
|
|
322 | INVOKE_OBJECT (DESTROY, static_cast<object *>(this)); |
|
|
323 | else if (SvROK (*av_fetch ((AV *)cb, EVENT_MAP_DESTROY, 1))) |
|
|
324 | INVOKE_MAP (DESTROY, static_cast<mapstruct *>(this)); |
319 | |
325 | |
|
|
326 | // disconnect Perl from C, to avoid crashes |
|
|
327 | sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext); |
|
|
328 | |
|
|
329 | // clear the perl hash, might or might not be a good idea |
|
|
330 | hv_clear ((HV *)SvRV ((SV *)self)); |
|
|
331 | |
320 | if (self) SvREFCNT_dec (self); |
332 | SvREFCNT_dec (self); |
|
|
333 | self = 0; |
|
|
334 | } |
|
|
335 | |
|
|
336 | if (cb) |
|
|
337 | { |
321 | if (cb) SvREFCNT_dec (cb); |
338 | SvREFCNT_dec (cb); |
|
|
339 | cb = 0; |
|
|
340 | } |
322 | |
341 | |
|
|
342 | if (attach) |
|
|
343 | { |
323 | if (attach) free_string (attach); |
344 | free_string (attach); |
324 | |
|
|
325 | self = 0; |
|
|
326 | cb = 0; |
|
|
327 | attach = 0; |
345 | attach = 0; |
|
|
346 | } |
328 | } |
347 | } |
329 | |
348 | |
330 | void attachable_base::optimise () |
349 | void attachable_base::optimise () |
331 | { |
350 | { |
332 | if (!self) |
351 | if (!self) |
… | |
… | |
341 | SvREFCNT_dec ((SV *)self); |
360 | SvREFCNT_dec ((SV *)self); |
342 | self = 0; |
361 | self = 0; |
343 | } |
362 | } |
344 | } |
363 | } |
345 | |
364 | |
346 | void |
365 | void attachable_base::instantiate (data_type type, void *obj) |
347 | object::instantiate_ () |
|
|
348 | { |
366 | { |
349 | dSP; |
367 | dSP; |
350 | ENTER; |
368 | ENTER; |
351 | SAVETMPS; |
369 | SAVETMPS; |
352 | PUSHMARK (SP); |
370 | PUSHMARK (SP); |
353 | EXTEND (SP, 2); |
371 | EXTEND (SP, 2); |
354 | PUSHs (sv_2mortal (newSVdt (DT_OBJECT, static_cast<object *>(this)))); |
372 | PUSHs (sv_2mortal (newSVdt (type, obj))); |
355 | PUSHs (sv_2mortal (newSVpv (attach, 0))); |
373 | PUSHs (sv_2mortal (newSVpv (attach, 0))); |
|
|
374 | |
|
|
375 | free_string (attach); |
|
|
376 | attach = 0; |
|
|
377 | |
356 | PUTBACK; |
378 | PUTBACK; |
357 | call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL); |
379 | call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL); |
358 | FREETMPS; |
380 | FREETMPS; |
359 | LEAVE; |
381 | LEAVE; |
360 | |
382 | |
361 | INVOKE_OBJECT (INSTANTIATE, this); |
383 | switch (type) |
|
|
384 | { |
|
|
385 | case DT_OBJECT: INVOKE_OBJECT (INSTANTIATE, obj); break; |
|
|
386 | case DT_MAP: INVOKE_MAP (INSTANTIATE, obj); break; |
|
|
387 | } |
362 | } |
388 | } |
363 | |
389 | |
364 | ///////////////////////////////////////////////////////////////////////////// |
390 | ///////////////////////////////////////////////////////////////////////////// |
365 | |
391 | |
366 | void reattach (data_type type, void *obj) |
392 | void reattach (data_type type, void *obj) |
367 | { |
393 | { |
|
|
394 | //TODO only do this when the object has _attachment's |
|
|
395 | |
368 | dSP; |
396 | dSP; |
369 | ENTER; |
397 | ENTER; |
370 | SAVETMPS; |
398 | SAVETMPS; |
371 | PUSHMARK (SP); |
399 | PUSHMARK (SP); |
372 | XPUSHs (sv_2mortal (newSVdt (type, obj))); |
400 | XPUSHs (sv_2mortal (newSVdt (type, obj))); |
… | |
… | |
438 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
439 | fprintf (fp, "oid %d\n", idx); |
467 | fprintf (fp, "oid %d\n", idx); |
440 | } |
468 | } |
441 | } |
469 | } |
442 | |
470 | |
443 | object_thawer::object_thawer (FILE *fp, const char *filename) |
471 | object_thawer::object_thawer (const char *filename) |
444 | { |
472 | { |
445 | this->fp = fp; |
|
|
446 | av = 0; |
473 | av = 0; |
|
|
474 | fp = 0; |
447 | |
475 | |
448 | if (!filename) |
476 | if (!filename) |
449 | return; |
477 | return; |
450 | |
478 | |
451 | dSP; |
479 | fp = fopen (filename, "r"); |
452 | ENTER; |
480 | if (!fp) |
453 | SAVETMPS; |
|
|
454 | PUSHMARK (SP); |
|
|
455 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
456 | PUTBACK; |
|
|
457 | |
|
|
458 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
459 | { |
481 | { |
460 | SPAGAIN; |
482 | LOG (llevError, "object_thawer: unable to open '%s': %s.\n", filename, strerror (errno)); |
461 | SV *sv = POPs; |
483 | return; |
462 | if (SvROK (sv)) |
|
|
463 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
464 | } |
484 | } |
465 | |
485 | |
|
|
486 | if (perl) |
|
|
487 | { |
|
|
488 | dSP; |
|
|
489 | ENTER; |
|
|
490 | SAVETMPS; |
|
|
491 | PUSHMARK (SP); |
|
|
492 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
493 | PUTBACK; |
|
|
494 | |
|
|
495 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
496 | { |
|
|
497 | SPAGAIN; |
|
|
498 | SV *sv = POPs; |
|
|
499 | if (SvROK (sv)) |
|
|
500 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
501 | } |
|
|
502 | |
466 | FREETMPS; |
503 | FREETMPS; |
467 | LEAVE; |
504 | LEAVE; |
|
|
505 | } |
|
|
506 | } |
|
|
507 | |
|
|
508 | // compatibility support, should be removed when no longer needed |
|
|
509 | int fprintf (object_freezer &freezer, const char *format, ...) |
|
|
510 | { |
|
|
511 | va_list ap; |
|
|
512 | |
|
|
513 | va_start (ap, format); |
|
|
514 | vfprintf (freezer.fp, format, ap); |
|
|
515 | va_end (ap); |
|
|
516 | } |
|
|
517 | |
|
|
518 | int fputs (const char *s, object_freezer &freezer) |
|
|
519 | { |
|
|
520 | fputs (s, freezer.fp); |
468 | } |
521 | } |
469 | |
522 | |
470 | void object_thawer::get (data_type type, void *obj, attachable_base *ext, int oid) |
523 | void object_thawer::get (data_type type, void *obj, attachable_base *ext, int oid) |
471 | { |
524 | { |
472 | if (!av || oid < 0) // this is actually an error of sorts |
525 | if (!av || oid < 0) // this is actually an error of sorts |
… | |
… | |
489 | reattach (type, obj); |
542 | reattach (type, obj); |
490 | } |
543 | } |
491 | |
544 | |
492 | object_thawer::~object_thawer () |
545 | object_thawer::~object_thawer () |
493 | { |
546 | { |
|
|
547 | if (fp) fclose (fp); |
494 | if (av) SvREFCNT_dec ((AV *)av); |
548 | if (av) SvREFCNT_dec ((AV *)av); |
495 | } |
549 | } |
496 | |
550 | |
497 | ///////////////////////////////////////////////////////////////////////////// |
551 | ///////////////////////////////////////////////////////////////////////////// |
498 | |
552 | |
… | |
… | |
1379 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1433 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1380 | prop (CFAPI_INT, MAP_PROP_SKY) |
1434 | prop (CFAPI_INT, MAP_PROP_SKY) |
1381 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1435 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1382 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1436 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1383 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1437 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1384 | prop (CFAPI_PMAP, MAP_PROP_NEXT) |
|
|
1385 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1438 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1386 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_ABOVE) |
|
|
1387 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_BELOW) |
|
|
1388 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1439 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1389 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1440 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1390 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1441 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1391 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1442 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1392 | prop (CFAPI_POBJECT, OBJECT_PROP_HEAD) |
|
|
1393 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1443 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1394 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1444 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1395 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1445 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1396 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1446 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1397 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
1447 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
… | |
… | |
1577 | const char *cost_string_from_value(uint64 cost, int approx = 0) |
1627 | const char *cost_string_from_value(uint64 cost, int approx = 0) |
1578 | |
1628 | |
1579 | int invoke (int event, ...) |
1629 | int invoke (int event, ...) |
1580 | CODE: |
1630 | CODE: |
1581 | if (KLASS_OF (event) != KLASS_GLOBAL) croak ("event class must be GLOBAL"); |
1631 | if (KLASS_OF (event) != KLASS_GLOBAL) croak ("event class must be GLOBAL"); |
1582 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); for (int i = 1; i < items; i++) av_push (av, ST (i)); |
1632 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
|
|
1633 | for (int i = 1; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
1583 | RETVAL = INVOKE_((event_type)event, ARG_AV (av)); |
1634 | RETVAL = INVOKE_((event_type)event, ARG_AV (av)); |
1584 | OUTPUT: RETVAL |
1635 | OUTPUT: RETVAL |
1585 | |
1636 | |
1586 | int |
1637 | int |
1587 | exp_to_level (val64 exp) |
1638 | exp_to_level (val64 exp) |
… | |
… | |
1620 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1671 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1621 | else |
1672 | else |
1622 | XSRETURN_UNDEF; |
1673 | XSRETURN_UNDEF; |
1623 | OUTPUT: RETVAL |
1674 | OUTPUT: RETVAL |
1624 | |
1675 | |
|
|
1676 | int |
|
|
1677 | _valid (SV *obj) |
|
|
1678 | CODE: |
|
|
1679 | RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); |
|
|
1680 | OUTPUT: |
|
|
1681 | RETVAL |
|
|
1682 | |
1625 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1683 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1626 | |
1684 | |
1627 | int invoke (object *op, int event, ...) |
1685 | int invoke (object *op, int event, ...) |
1628 | CODE: |
1686 | CODE: |
1629 | if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT"); |
1687 | if (KLASS_OF (event) != KLASS_OBJECT) croak ("event class must be OBJECT"); |
1630 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); for (int i = 2; i < items; i++) av_push (av, ST (i)); |
1688 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
|
|
1689 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
1631 | RETVAL = INVOKE_((event_type)event, ARG_OBJECT (op), ARG_AV (av)); |
1690 | RETVAL = INVOKE_((event_type)event, ARG_OBJECT (op), ARG_AV (av)); |
1632 | OUTPUT: RETVAL |
1691 | OUTPUT: RETVAL |
1633 | |
1692 | |
1634 | SV *registry (object *op) |
1693 | SV *registry (object *op) |
1635 | CODE: |
1694 | CODE: |
1636 | RETVAL = registry_of (op); |
1695 | RETVAL = registry_of (op); |
1637 | OUTPUT: |
1696 | OUTPUT: |
|
|
1697 | RETVAL |
|
|
1698 | |
|
|
1699 | object *head (object *op) |
|
|
1700 | PROTOTYPE: $ |
|
|
1701 | ALIAS: |
|
|
1702 | more = 1 |
|
|
1703 | above = 2 |
|
|
1704 | below = 3 |
|
|
1705 | CODE: |
|
|
1706 | switch (ix) |
|
|
1707 | { |
|
|
1708 | case 0: RETVAL = op->head ? op->head : op; break; // DOH! |
|
|
1709 | case 1: RETVAL = op->more; break; |
|
|
1710 | case 2: RETVAL = op->above; break; |
|
|
1711 | case 3: RETVAL = op->below; break; |
|
|
1712 | } |
|
|
1713 | OUTPUT: |
1638 | RETVAL |
1714 | RETVAL |
1639 | |
1715 | |
1640 | SV * |
1716 | SV * |
1641 | get_property (object *obj, int type, int idx) |
1717 | get_property (object *obj, int type, int idx) |
1642 | CODE: |
1718 | CODE: |
… | |
… | |
1722 | |
1798 | |
1723 | int need_identify (const object *obj); |
1799 | int need_identify (const object *obj); |
1724 | |
1800 | |
1725 | int apply_shop_mat (object *shop_mat, object *op); |
1801 | int apply_shop_mat (object *shop_mat, object *op); |
1726 | |
1802 | |
1727 | void cf_object_move (object *op, int dir, object *originator = op) |
1803 | int move (object *op, int dir, object *originator = op) |
|
|
1804 | CODE: |
|
|
1805 | RETVAL = move_ob (op, dir, originator); |
|
|
1806 | OUTPUT: |
|
|
1807 | RETVAL |
1728 | |
1808 | |
1729 | void cf_object_apply (object *op, object *author, int flags = 0) |
1809 | void cf_object_apply (object *op, object *author, int flags = 0) |
1730 | |
1810 | |
1731 | void cf_object_apply_below (object *op) |
1811 | void cf_object_apply_below (object *op) |
1732 | |
1812 | |
… | |
… | |
1925 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
2005 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
1926 | |
2006 | |
1927 | int invoke (player *pl, int event, ...) |
2007 | int invoke (player *pl, int event, ...) |
1928 | CODE: |
2008 | CODE: |
1929 | if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); |
2009 | if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); |
1930 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); for (int i = 2; i < items; i++) av_push (av, ST (i)); |
2010 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
|
|
2011 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
1931 | RETVAL = INVOKE_((event_type)event, ARG_PLAYER (pl), ARG_AV (av)); |
2012 | RETVAL = INVOKE_((event_type)event, ARG_PLAYER (pl), ARG_AV (av)); |
1932 | OUTPUT: RETVAL |
2013 | OUTPUT: RETVAL |
1933 | |
2014 | |
1934 | SV *registry (player *pl) |
2015 | SV *registry (player *pl) |
1935 | CODE: |
2016 | CODE: |
… | |
… | |
2062 | OUTPUT: RETVAL |
2143 | OUTPUT: RETVAL |
2063 | |
2144 | |
2064 | |
2145 | |
2065 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2146 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2066 | |
2147 | |
|
|
2148 | mapstruct *first () |
|
|
2149 | PROTOTYPE: |
|
|
2150 | CODE: |
|
|
2151 | RETVAL = first_map; |
|
|
2152 | OUTPUT: RETVAL |
|
|
2153 | |
|
|
2154 | mapstruct *next (mapstruct *map) |
|
|
2155 | PROTOTYPE: |
|
|
2156 | CODE: |
|
|
2157 | RETVAL = map->next; |
|
|
2158 | OUTPUT: RETVAL |
|
|
2159 | |
2067 | int invoke (mapstruct *map, int event, ...) |
2160 | int invoke (mapstruct *map, int event, ...) |
2068 | CODE: |
2161 | CODE: |
2069 | if (KLASS_OF (event) != KLASS_MAP) croak ("event class must be MAP"); |
2162 | if (KLASS_OF (event) != KLASS_MAP) croak ("event class must be MAP"); |
2070 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); for (int i = 2; i < items; i++) av_push (av, ST (i)); |
2163 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
|
|
2164 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
2071 | RETVAL = INVOKE_((event_type)event, ARG_MAP (map), ARG_AV (av)); |
2165 | RETVAL = INVOKE_((event_type)event, ARG_MAP (map), ARG_AV (av)); |
2072 | OUTPUT: |
2166 | OUTPUT: RETVAL |
2073 | RETVAL |
|
|
2074 | |
2167 | |
2075 | SV *registry (mapstruct *map) |
2168 | SV *registry (mapstruct *map) |
2076 | CODE: |
2169 | CODE: |
2077 | RETVAL = registry_of (map); |
2170 | RETVAL = registry_of (map); |
2078 | OUTPUT: |
2171 | OUTPUT: |
… | |
… | |
2098 | |
2191 | |
2099 | mapstruct *new (int width, int height) |
2192 | mapstruct *new (int width, int height) |
2100 | PROTOTYPE: |
2193 | PROTOTYPE: |
2101 | CODE: |
2194 | CODE: |
2102 | { |
2195 | { |
2103 | int unused_type; |
2196 | RETVAL = get_empty_map (width, height); |
2104 | RETVAL = (mapstruct*) map_get_map (&unused_type, 0, width, height); |
|
|
2105 | } |
2197 | } |
2106 | OUTPUT: |
2198 | OUTPUT: |
2107 | RETVAL |
2199 | RETVAL |
2108 | |
2200 | |
2109 | void delete_map (mapstruct *map) |
2201 | void delete_map (mapstruct *map) |
… | |
… | |
2124 | XSRETURN_UNDEF; |
2216 | XSRETURN_UNDEF; |
2125 | RETVAL = map->tile_path [dir]; |
2217 | RETVAL = map->tile_path [dir]; |
2126 | OUTPUT: |
2218 | OUTPUT: |
2127 | RETVAL |
2219 | RETVAL |
2128 | |
2220 | |
2129 | mapstruct *cf_map_get_map (char *name) |
2221 | mapstruct *ready_map_name (char *name, int flags = 0) |
2130 | PROTOTYPE: $ |
2222 | PROTOTYPE: $;$ |
2131 | ALIAS: map = 0 |
2223 | ALIAS: |
|
|
2224 | find = 0 |
|
|
2225 | get_map = 1 |
2132 | |
2226 | |
2133 | mapstruct *has_been_loaded (char *name) |
2227 | mapstruct *has_been_loaded (char *name) |
2134 | PROTOTYPE: $ |
2228 | PROTOTYPE: $ |
2135 | |
|
|
2136 | mapstruct *cf_map_get_first () |
|
|
2137 | PROTOTYPE: |
|
|
2138 | ALIAS: first = 0 |
|
|
2139 | |
2229 | |
2140 | # whoever "designed" the plug-in api should have wasted |
2230 | # whoever "designed" the plug-in api should have wasted |
2141 | # his/her time with staying away from the project - would have |
2231 | # his/her time with staying away from the project - would have |
2142 | # saved others a lot of time, without doubt. |
2232 | # saved others a lot of time, without doubt. |
2143 | void set_path (mapstruct *where, char *path) |
2233 | void set_path (mapstruct *where, char *path) |
… | |
… | |
2157 | RETVAL |
2247 | RETVAL |
2158 | |
2248 | |
2159 | void set_unique (mapstruct *map, bool unique) |
2249 | void set_unique (mapstruct *map, bool unique) |
2160 | CODE: |
2250 | CODE: |
2161 | map->unique = unique; |
2251 | map->unique = unique; |
|
|
2252 | |
|
|
2253 | void |
|
|
2254 | trigger (mapstruct *map, long connection, bool state = true) |
|
|
2255 | CODE: |
|
|
2256 | activate_connection (map, connection, state); |
|
|
2257 | |
|
|
2258 | void |
|
|
2259 | get_connection (mapstruct *map, long connection) |
|
|
2260 | PPCODE: |
|
|
2261 | oblinkpt *obp = get_connection_links (map, connection); |
|
|
2262 | if (obp) |
|
|
2263 | for (objectlink *ol = obp->link; ol; ol = ol->next) |
|
|
2264 | XPUSHs (sv_2mortal (newSVcfapi (CFAPI_POBJECT, ol->ob))); |
2162 | |
2265 | |
2163 | object *cf_map_insert_object_there (mapstruct *where, object *op, object *originator, int flags) |
2266 | object *cf_map_insert_object_there (mapstruct *where, object *op, object *originator, int flags) |
2164 | |
2267 | |
2165 | object *cf_map_insert_object (mapstruct *where, object* op, int x, int y) |
2268 | object *cf_map_insert_object (mapstruct *where, object* op, int x, int y) |
2166 | |
2269 | |
… | |
… | |
2227 | case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; |
2330 | case 6: RETVAL = newSVuv ( GET_MAP_MOVE_ON (obj, x, y)); break; |
2228 | case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; |
2331 | case 7: RETVAL = newSVuv ( GET_MAP_MOVE_OFF (obj, x, y)); break; |
2229 | } |
2332 | } |
2230 | OUTPUT: |
2333 | OUTPUT: |
2231 | RETVAL |
2334 | RETVAL |
2232 | |
|
|
2233 | # "deserialise" perl map data into the map # TODO# compatibility cruft, remove |
|
|
2234 | void |
|
|
2235 | _set_obs (mapstruct *map, SV *sv) |
|
|
2236 | CODE: |
|
|
2237 | { |
|
|
2238 | object *o; |
|
|
2239 | AV *av; |
|
|
2240 | int x, y; |
|
|
2241 | AV *obs = (AV *)SvRV (sv); |
|
|
2242 | |
|
|
2243 | for (y = 0; y < MAP_HEIGHT (map); y++) |
|
|
2244 | for (x = 0; x < MAP_WIDTH (map); x++) |
|
|
2245 | { |
|
|
2246 | sv = *av_fetch (obs, x + y * MAP_HEIGHT (map), 1); |
|
|
2247 | |
|
|
2248 | if (!SvROK (sv)) |
|
|
2249 | continue; |
|
|
2250 | |
|
|
2251 | av = (AV *)SvRV (sv); |
|
|
2252 | |
|
|
2253 | for (o = GET_MAP_OB (map, x, y); o; o = o->above) |
|
|
2254 | { |
|
|
2255 | sv = av_shift (av); |
|
|
2256 | |
|
|
2257 | if (SvROK (sv)) |
|
|
2258 | { |
|
|
2259 | sv_magic ((SV *)SvRV (sv), 0, PERL_MAGIC_ext, (char *)o, 0); |
|
|
2260 | SVptr_cache_set (o, sv); |
|
|
2261 | } |
|
|
2262 | } |
|
|
2263 | } |
|
|
2264 | } |
|
|
2265 | |
2335 | |
2266 | |
2336 | |
2267 | MODULE = cf PACKAGE = cf::arch |
2337 | MODULE = cf PACKAGE = cf::arch |
2268 | |
2338 | |
2269 | archetype *first() |
2339 | archetype *first() |