… | |
… | |
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 |
|
|
319 | |
|
|
320 | if (self) |
318 | if (self) |
321 | { |
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)); |
|
|
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 |
322 | hv_clear ((HV *)SvRV ((SV *)self)); |
330 | hv_clear ((HV *)SvRV ((SV *)self)); |
323 | sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext); |
331 | |
324 | SvREFCNT_dec (self); |
332 | SvREFCNT_dec (self); |
|
|
333 | self = 0; |
325 | } |
334 | } |
326 | |
335 | |
327 | if (cb) |
336 | if (cb) |
328 | { |
337 | { |
329 | SvREFCNT_dec (cb); |
338 | SvREFCNT_dec (cb); |
… | |
… | |
351 | SvREFCNT_dec ((SV *)self); |
360 | SvREFCNT_dec ((SV *)self); |
352 | self = 0; |
361 | self = 0; |
353 | } |
362 | } |
354 | } |
363 | } |
355 | |
364 | |
356 | void |
365 | void attachable_base::instantiate (data_type type, void *obj) |
357 | object::instantiate_ () |
|
|
358 | { |
366 | { |
359 | dSP; |
367 | dSP; |
360 | ENTER; |
368 | ENTER; |
361 | SAVETMPS; |
369 | SAVETMPS; |
362 | PUSHMARK (SP); |
370 | PUSHMARK (SP); |
363 | EXTEND (SP, 2); |
371 | EXTEND (SP, 2); |
364 | PUSHs (sv_2mortal (newSVdt (DT_OBJECT, static_cast<object *>(this)))); |
372 | PUSHs (sv_2mortal (newSVdt (type, obj))); |
365 | PUSHs (sv_2mortal (newSVpv (attach, 0))); |
373 | PUSHs (sv_2mortal (newSVpv (attach, 0))); |
|
|
374 | |
|
|
375 | free_string (attach); |
|
|
376 | attach = 0; |
|
|
377 | |
366 | PUTBACK; |
378 | PUTBACK; |
367 | call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL); |
379 | call_pv ("cf::instantiate", G_DISCARD | G_VOID | G_EVAL); |
368 | FREETMPS; |
380 | FREETMPS; |
369 | LEAVE; |
381 | LEAVE; |
370 | |
382 | |
371 | 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 | } |
372 | } |
388 | } |
373 | |
389 | |
374 | ///////////////////////////////////////////////////////////////////////////// |
390 | ///////////////////////////////////////////////////////////////////////////// |
375 | |
391 | |
376 | void reattach (data_type type, void *obj) |
392 | void reattach (data_type type, void *obj) |
377 | { |
393 | { |
|
|
394 | //TODO only do this when the object has _attachment's |
|
|
395 | |
378 | dSP; |
396 | dSP; |
379 | ENTER; |
397 | ENTER; |
380 | SAVETMPS; |
398 | SAVETMPS; |
381 | PUSHMARK (SP); |
399 | PUSHMARK (SP); |
382 | XPUSHs (sv_2mortal (newSVdt (type, obj))); |
400 | XPUSHs (sv_2mortal (newSVdt (type, obj))); |
… | |
… | |
448 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
449 | fprintf (fp, "oid %d\n", idx); |
467 | fprintf (fp, "oid %d\n", idx); |
450 | } |
468 | } |
451 | } |
469 | } |
452 | |
470 | |
453 | object_thawer::object_thawer (FILE *fp, const char *filename) |
471 | object_thawer::object_thawer (const char *filename) |
454 | { |
472 | { |
455 | this->fp = fp; |
|
|
456 | av = 0; |
473 | av = 0; |
|
|
474 | fp = 0; |
457 | |
475 | |
458 | if (!filename) |
476 | if (!filename) |
459 | return; |
477 | return; |
460 | |
478 | |
461 | dSP; |
479 | fp = fopen (filename, "r"); |
462 | ENTER; |
480 | if (!fp) |
463 | SAVETMPS; |
|
|
464 | PUSHMARK (SP); |
|
|
465 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
466 | PUTBACK; |
|
|
467 | |
|
|
468 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
469 | { |
481 | { |
470 | SPAGAIN; |
482 | LOG (llevError, "object_thawer: unable to open '%s': %s.\n", filename, strerror (errno)); |
471 | SV *sv = POPs; |
483 | return; |
472 | if (SvROK (sv)) |
|
|
473 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
474 | } |
484 | } |
475 | |
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 | |
476 | FREETMPS; |
503 | FREETMPS; |
477 | 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); |
478 | } |
521 | } |
479 | |
522 | |
480 | 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) |
481 | { |
524 | { |
482 | if (!av || oid < 0) // this is actually an error of sorts |
525 | if (!av || oid < 0) // this is actually an error of sorts |
… | |
… | |
499 | reattach (type, obj); |
542 | reattach (type, obj); |
500 | } |
543 | } |
501 | |
544 | |
502 | object_thawer::~object_thawer () |
545 | object_thawer::~object_thawer () |
503 | { |
546 | { |
|
|
547 | if (fp) fclose (fp); |
504 | if (av) SvREFCNT_dec ((AV *)av); |
548 | if (av) SvREFCNT_dec ((AV *)av); |
505 | } |
549 | } |
506 | |
550 | |
507 | ///////////////////////////////////////////////////////////////////////////// |
551 | ///////////////////////////////////////////////////////////////////////////// |
508 | |
552 | |
… | |
… | |
1389 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1433 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1390 | prop (CFAPI_INT, MAP_PROP_SKY) |
1434 | prop (CFAPI_INT, MAP_PROP_SKY) |
1391 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1435 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1392 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1436 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1393 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1437 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1394 | prop (CFAPI_PMAP, MAP_PROP_NEXT) |
|
|
1395 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1438 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1396 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_ABOVE) |
|
|
1397 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_BELOW) |
|
|
1398 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1439 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1399 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1440 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1400 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1441 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1401 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1442 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1402 | prop (CFAPI_POBJECT, OBJECT_PROP_HEAD) |
|
|
1403 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1443 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1404 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1444 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1405 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1445 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1406 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1446 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1407 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
1447 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
… | |
… | |
1587 | const char *cost_string_from_value(uint64 cost, int approx = 0) |
1627 | const char *cost_string_from_value(uint64 cost, int approx = 0) |
1588 | |
1628 | |
1589 | int invoke (int event, ...) |
1629 | int invoke (int event, ...) |
1590 | CODE: |
1630 | CODE: |
1591 | 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"); |
1592 | 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))); |
1593 | RETVAL = INVOKE_((event_type)event, ARG_AV (av)); |
1634 | RETVAL = INVOKE_((event_type)event, ARG_AV (av)); |
1594 | OUTPUT: RETVAL |
1635 | OUTPUT: RETVAL |
1595 | |
1636 | |
1596 | int |
1637 | int |
1597 | exp_to_level (val64 exp) |
1638 | exp_to_level (val64 exp) |
… | |
… | |
1630 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1671 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1631 | else |
1672 | else |
1632 | XSRETURN_UNDEF; |
1673 | XSRETURN_UNDEF; |
1633 | OUTPUT: RETVAL |
1674 | OUTPUT: RETVAL |
1634 | |
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 | |
1635 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1683 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1636 | |
1684 | |
1637 | int invoke (object *op, int event, ...) |
1685 | int invoke (object *op, int event, ...) |
1638 | CODE: |
1686 | CODE: |
1639 | 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"); |
1640 | 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))); |
1641 | RETVAL = INVOKE_((event_type)event, ARG_OBJECT (op), ARG_AV (av)); |
1690 | RETVAL = INVOKE_((event_type)event, ARG_OBJECT (op), ARG_AV (av)); |
1642 | OUTPUT: RETVAL |
1691 | OUTPUT: RETVAL |
1643 | |
1692 | |
1644 | SV *registry (object *op) |
1693 | SV *registry (object *op) |
1645 | CODE: |
1694 | CODE: |
1646 | RETVAL = registry_of (op); |
1695 | RETVAL = registry_of (op); |
1647 | 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: |
1648 | RETVAL |
1714 | RETVAL |
1649 | |
1715 | |
1650 | SV * |
1716 | SV * |
1651 | get_property (object *obj, int type, int idx) |
1717 | get_property (object *obj, int type, int idx) |
1652 | CODE: |
1718 | CODE: |
… | |
… | |
1732 | |
1798 | |
1733 | int need_identify (const object *obj); |
1799 | int need_identify (const object *obj); |
1734 | |
1800 | |
1735 | int apply_shop_mat (object *shop_mat, object *op); |
1801 | int apply_shop_mat (object *shop_mat, object *op); |
1736 | |
1802 | |
1737 | 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 |
1738 | |
1808 | |
1739 | void cf_object_apply (object *op, object *author, int flags = 0) |
1809 | void cf_object_apply (object *op, object *author, int flags = 0) |
1740 | |
1810 | |
1741 | void cf_object_apply_below (object *op) |
1811 | void cf_object_apply_below (object *op) |
1742 | |
1812 | |
… | |
… | |
1935 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
2005 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
1936 | |
2006 | |
1937 | int invoke (player *pl, int event, ...) |
2007 | int invoke (player *pl, int event, ...) |
1938 | CODE: |
2008 | CODE: |
1939 | 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"); |
1940 | 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))); |
1941 | RETVAL = INVOKE_((event_type)event, ARG_PLAYER (pl), ARG_AV (av)); |
2012 | RETVAL = INVOKE_((event_type)event, ARG_PLAYER (pl), ARG_AV (av)); |
1942 | OUTPUT: RETVAL |
2013 | OUTPUT: RETVAL |
1943 | |
2014 | |
1944 | SV *registry (player *pl) |
2015 | SV *registry (player *pl) |
1945 | CODE: |
2016 | CODE: |
… | |
… | |
2072 | OUTPUT: RETVAL |
2143 | OUTPUT: RETVAL |
2073 | |
2144 | |
2074 | |
2145 | |
2075 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2146 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2076 | |
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 | |
2077 | int invoke (mapstruct *map, int event, ...) |
2160 | int invoke (mapstruct *map, int event, ...) |
2078 | CODE: |
2161 | CODE: |
2079 | 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"); |
2080 | 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))); |
2081 | RETVAL = INVOKE_((event_type)event, ARG_MAP (map), ARG_AV (av)); |
2165 | RETVAL = INVOKE_((event_type)event, ARG_MAP (map), ARG_AV (av)); |
2082 | OUTPUT: |
2166 | OUTPUT: RETVAL |
2083 | RETVAL |
|
|
2084 | |
2167 | |
2085 | SV *registry (mapstruct *map) |
2168 | SV *registry (mapstruct *map) |
2086 | CODE: |
2169 | CODE: |
2087 | RETVAL = registry_of (map); |
2170 | RETVAL = registry_of (map); |
2088 | OUTPUT: |
2171 | OUTPUT: |
… | |
… | |
2108 | |
2191 | |
2109 | mapstruct *new (int width, int height) |
2192 | mapstruct *new (int width, int height) |
2110 | PROTOTYPE: |
2193 | PROTOTYPE: |
2111 | CODE: |
2194 | CODE: |
2112 | { |
2195 | { |
2113 | int unused_type; |
2196 | RETVAL = get_empty_map (width, height); |
2114 | RETVAL = (mapstruct*) map_get_map (&unused_type, 0, width, height); |
|
|
2115 | } |
2197 | } |
2116 | OUTPUT: |
2198 | OUTPUT: |
2117 | RETVAL |
2199 | RETVAL |
2118 | |
2200 | |
2119 | void delete_map (mapstruct *map) |
2201 | void delete_map (mapstruct *map) |
… | |
… | |
2134 | XSRETURN_UNDEF; |
2216 | XSRETURN_UNDEF; |
2135 | RETVAL = map->tile_path [dir]; |
2217 | RETVAL = map->tile_path [dir]; |
2136 | OUTPUT: |
2218 | OUTPUT: |
2137 | RETVAL |
2219 | RETVAL |
2138 | |
2220 | |
2139 | mapstruct *cf_map_get_map (char *name) |
2221 | mapstruct *ready_map_name (char *name, int flags = 0) |
2140 | PROTOTYPE: $ |
2222 | PROTOTYPE: $;$ |
2141 | ALIAS: map = 0 |
2223 | ALIAS: |
|
|
2224 | find = 0 |
|
|
2225 | get_map = 1 |
2142 | |
2226 | |
2143 | mapstruct *has_been_loaded (char *name) |
2227 | mapstruct *has_been_loaded (char *name) |
2144 | PROTOTYPE: $ |
2228 | PROTOTYPE: $ |
2145 | |
|
|
2146 | mapstruct *cf_map_get_first () |
|
|
2147 | PROTOTYPE: |
|
|
2148 | ALIAS: first = 0 |
|
|
2149 | |
2229 | |
2150 | # whoever "designed" the plug-in api should have wasted |
2230 | # whoever "designed" the plug-in api should have wasted |
2151 | # his/her time with staying away from the project - would have |
2231 | # his/her time with staying away from the project - would have |
2152 | # saved others a lot of time, without doubt. |
2232 | # saved others a lot of time, without doubt. |
2153 | void set_path (mapstruct *where, char *path) |
2233 | void set_path (mapstruct *where, char *path) |
… | |
… | |
2167 | RETVAL |
2247 | RETVAL |
2168 | |
2248 | |
2169 | void set_unique (mapstruct *map, bool unique) |
2249 | void set_unique (mapstruct *map, bool unique) |
2170 | CODE: |
2250 | CODE: |
2171 | 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))); |
2172 | |
2265 | |
2173 | 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) |
2174 | |
2267 | |
2175 | 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) |
2176 | |
2269 | |
… | |
… | |
2237 | 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; |
2238 | 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; |
2239 | } |
2332 | } |
2240 | OUTPUT: |
2333 | OUTPUT: |
2241 | RETVAL |
2334 | RETVAL |
2242 | |
|
|
2243 | # "deserialise" perl map data into the map # TODO# compatibility cruft, remove |
|
|
2244 | void |
|
|
2245 | _set_obs (mapstruct *map, SV *sv) |
|
|
2246 | CODE: |
|
|
2247 | { |
|
|
2248 | object *o; |
|
|
2249 | AV *av; |
|
|
2250 | int x, y; |
|
|
2251 | AV *obs = (AV *)SvRV (sv); |
|
|
2252 | |
|
|
2253 | for (y = 0; y < MAP_HEIGHT (map); y++) |
|
|
2254 | for (x = 0; x < MAP_WIDTH (map); x++) |
|
|
2255 | { |
|
|
2256 | sv = *av_fetch (obs, x + y * MAP_HEIGHT (map), 1); |
|
|
2257 | |
|
|
2258 | if (!SvROK (sv)) |
|
|
2259 | continue; |
|
|
2260 | |
|
|
2261 | av = (AV *)SvRV (sv); |
|
|
2262 | |
|
|
2263 | for (o = GET_MAP_OB (map, x, y); o; o = o->above) |
|
|
2264 | { |
|
|
2265 | sv = av_shift (av); |
|
|
2266 | |
|
|
2267 | if (SvROK (sv)) |
|
|
2268 | { |
|
|
2269 | sv_magic ((SV *)SvRV (sv), 0, PERL_MAGIC_ext, (char *)o, 0); |
|
|
2270 | SVptr_cache_set (o, sv); |
|
|
2271 | } |
|
|
2272 | } |
|
|
2273 | } |
|
|
2274 | } |
|
|
2275 | |
2335 | |
2276 | |
2336 | |
2277 | MODULE = cf PACKAGE = cf::arch |
2337 | MODULE = cf PACKAGE = cf::arch |
2278 | |
2338 | |
2279 | archetype *first() |
2339 | archetype *first() |