… | |
… | |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
467 | fprintf (fp, "oid %d\n", idx); |
467 | fprintf (fp, "oid %d\n", idx); |
468 | } |
468 | } |
469 | } |
469 | } |
470 | |
470 | |
471 | object_thawer::object_thawer (FILE *fp, const char *filename) |
471 | object_thawer::object_thawer (const char *filename) |
472 | { |
472 | { |
473 | this->fp = fp; |
|
|
474 | av = 0; |
473 | av = 0; |
|
|
474 | fp = 0; |
475 | |
475 | |
476 | if (!filename) |
476 | if (!filename) |
477 | return; |
477 | return; |
478 | |
478 | |
479 | dSP; |
479 | fp = fopen (filename, "r"); |
480 | ENTER; |
480 | if (!fp) |
481 | SAVETMPS; |
|
|
482 | PUSHMARK (SP); |
|
|
483 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
484 | PUTBACK; |
|
|
485 | |
|
|
486 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
487 | { |
481 | { |
488 | SPAGAIN; |
482 | LOG (llevError, "object_thawer: unable to open '%s': %s.\n", filename, strerror (errno)); |
489 | SV *sv = POPs; |
483 | return; |
490 | if (SvROK (sv)) |
|
|
491 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
492 | } |
484 | } |
493 | |
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 | |
494 | FREETMPS; |
503 | FREETMPS; |
495 | 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); |
496 | } |
521 | } |
497 | |
522 | |
498 | 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) |
499 | { |
524 | { |
500 | if (!av || oid < 0) // this is actually an error of sorts |
525 | if (!av || oid < 0) // this is actually an error of sorts |
… | |
… | |
517 | reattach (type, obj); |
542 | reattach (type, obj); |
518 | } |
543 | } |
519 | |
544 | |
520 | object_thawer::~object_thawer () |
545 | object_thawer::~object_thawer () |
521 | { |
546 | { |
|
|
547 | if (fp) fclose (fp); |
522 | if (av) SvREFCNT_dec ((AV *)av); |
548 | if (av) SvREFCNT_dec ((AV *)av); |
523 | } |
549 | } |
524 | |
550 | |
525 | ///////////////////////////////////////////////////////////////////////////// |
551 | ///////////////////////////////////////////////////////////////////////////// |
526 | |
552 | |
… | |
… | |
1407 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1433 | prop (CFAPI_INT, MAP_PROP_WINDDIR) |
1408 | prop (CFAPI_INT, MAP_PROP_SKY) |
1434 | prop (CFAPI_INT, MAP_PROP_SKY) |
1409 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1435 | prop (CFAPI_INT, MAP_PROP_WPARTX) |
1410 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1436 | prop (CFAPI_INT, MAP_PROP_WPARTY) |
1411 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1437 | prop (CFAPI_STRING, MAP_PROP_MESSAGE) |
1412 | prop (CFAPI_PMAP, MAP_PROP_NEXT) |
|
|
1413 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1438 | prop (CFAPI_PREGION, MAP_PROP_REGION) |
1414 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_ABOVE) |
|
|
1415 | prop (CFAPI_POBJECT, OBJECT_PROP_OB_BELOW) |
|
|
1416 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1439 | prop (CFAPI_POBJECT, OBJECT_PROP_NEXT_ACTIVE_OB) |
1417 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1440 | prop (CFAPI_POBJECT, OBJECT_PROP_PREV_ACTIVE_OB) |
1418 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1441 | prop (CFAPI_POBJECT, OBJECT_PROP_INVENTORY) |
1419 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1442 | prop (CFAPI_POBJECT, OBJECT_PROP_ENVIRONMENT) |
1420 | prop (CFAPI_POBJECT, OBJECT_PROP_HEAD) |
|
|
1421 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1443 | prop (CFAPI_POBJECT, OBJECT_PROP_CONTAINER) |
1422 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1444 | prop (CFAPI_PMAP, OBJECT_PROP_MAP) |
1423 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1445 | prop (CFAPI_INT, OBJECT_PROP_COUNT) |
1424 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1446 | prop (CFAPI_INT, OBJECT_PROP_REFCOUNT) |
1425 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
1447 | prop (CFAPI_STRING, OBJECT_PROP_NAME) |
… | |
… | |
1649 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1671 | RETVAL = newSVpv (resist_plus[atnr], 0); |
1650 | else |
1672 | else |
1651 | XSRETURN_UNDEF; |
1673 | XSRETURN_UNDEF; |
1652 | OUTPUT: RETVAL |
1674 | OUTPUT: RETVAL |
1653 | |
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 | |
1654 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1683 | MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ |
1655 | |
1684 | |
1656 | int invoke (object *op, int event, ...) |
1685 | int invoke (object *op, int event, ...) |
1657 | CODE: |
1686 | CODE: |
1658 | 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"); |
… | |
… | |
1663 | |
1692 | |
1664 | SV *registry (object *op) |
1693 | SV *registry (object *op) |
1665 | CODE: |
1694 | CODE: |
1666 | RETVAL = registry_of (op); |
1695 | RETVAL = registry_of (op); |
1667 | 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: |
1668 | RETVAL |
1714 | RETVAL |
1669 | |
1715 | |
1670 | SV * |
1716 | SV * |
1671 | get_property (object *obj, int type, int idx) |
1717 | get_property (object *obj, int type, int idx) |
1672 | CODE: |
1718 | CODE: |
… | |
… | |
1752 | |
1798 | |
1753 | int need_identify (const object *obj); |
1799 | int need_identify (const object *obj); |
1754 | |
1800 | |
1755 | int apply_shop_mat (object *shop_mat, object *op); |
1801 | int apply_shop_mat (object *shop_mat, object *op); |
1756 | |
1802 | |
1757 | 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 |
1758 | |
1808 | |
1759 | void cf_object_apply (object *op, object *author, int flags = 0) |
1809 | void cf_object_apply (object *op, object *author, int flags = 0) |
1760 | |
1810 | |
1761 | void cf_object_apply_below (object *op) |
1811 | void cf_object_apply_below (object *op) |
1762 | |
1812 | |
… | |
… | |
2093 | OUTPUT: RETVAL |
2143 | OUTPUT: RETVAL |
2094 | |
2144 | |
2095 | |
2145 | |
2096 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2146 | MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ |
2097 | |
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 | |
2098 | int invoke (mapstruct *map, int event, ...) |
2160 | int invoke (mapstruct *map, int event, ...) |
2099 | CODE: |
2161 | CODE: |
2100 | 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"); |
2101 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2163 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2102 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
2164 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
… | |
… | |
2129 | |
2191 | |
2130 | mapstruct *new (int width, int height) |
2192 | mapstruct *new (int width, int height) |
2131 | PROTOTYPE: |
2193 | PROTOTYPE: |
2132 | CODE: |
2194 | CODE: |
2133 | { |
2195 | { |
2134 | int unused_type; |
2196 | RETVAL = get_empty_map (width, height); |
2135 | RETVAL = (mapstruct*) map_get_map (&unused_type, 0, width, height); |
|
|
2136 | } |
2197 | } |
2137 | OUTPUT: |
2198 | OUTPUT: |
2138 | RETVAL |
2199 | RETVAL |
2139 | |
2200 | |
2140 | void delete_map (mapstruct *map) |
2201 | void delete_map (mapstruct *map) |
… | |
… | |
2155 | XSRETURN_UNDEF; |
2216 | XSRETURN_UNDEF; |
2156 | RETVAL = map->tile_path [dir]; |
2217 | RETVAL = map->tile_path [dir]; |
2157 | OUTPUT: |
2218 | OUTPUT: |
2158 | RETVAL |
2219 | RETVAL |
2159 | |
2220 | |
2160 | mapstruct *cf_map_get_map (char *name) |
2221 | mapstruct *ready_map_name (char *name, int flags = 0) |
2161 | PROTOTYPE: $ |
2222 | PROTOTYPE: $;$ |
2162 | ALIAS: map = 0 |
2223 | ALIAS: |
|
|
2224 | find = 0 |
|
|
2225 | get_map = 1 |
2163 | |
2226 | |
2164 | mapstruct *has_been_loaded (char *name) |
2227 | mapstruct *has_been_loaded (char *name) |
2165 | PROTOTYPE: $ |
2228 | PROTOTYPE: $ |
2166 | |
|
|
2167 | mapstruct *cf_map_get_first () |
|
|
2168 | PROTOTYPE: |
|
|
2169 | ALIAS: first = 0 |
|
|
2170 | |
2229 | |
2171 | # whoever "designed" the plug-in api should have wasted |
2230 | # whoever "designed" the plug-in api should have wasted |
2172 | # his/her time with staying away from the project - would have |
2231 | # his/her time with staying away from the project - would have |
2173 | # saved others a lot of time, without doubt. |
2232 | # saved others a lot of time, without doubt. |
2174 | void set_path (mapstruct *where, char *path) |
2233 | void set_path (mapstruct *where, char *path) |
… | |
… | |
2188 | RETVAL |
2247 | RETVAL |
2189 | |
2248 | |
2190 | void set_unique (mapstruct *map, bool unique) |
2249 | void set_unique (mapstruct *map, bool unique) |
2191 | CODE: |
2250 | CODE: |
2192 | 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))); |
2193 | |
2265 | |
2194 | 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) |
2195 | |
2267 | |
2196 | 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) |
2197 | |
2269 | |
… | |
… | |
2258 | 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; |
2259 | 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; |
2260 | } |
2332 | } |
2261 | OUTPUT: |
2333 | OUTPUT: |
2262 | RETVAL |
2334 | RETVAL |
2263 | |
|
|
2264 | # "deserialise" perl map data into the map # TODO# compatibility cruft, remove |
|
|
2265 | void |
|
|
2266 | _set_obs (mapstruct *map, SV *sv) |
|
|
2267 | CODE: |
|
|
2268 | { |
|
|
2269 | object *o; |
|
|
2270 | AV *av; |
|
|
2271 | int x, y; |
|
|
2272 | AV *obs = (AV *)SvRV (sv); |
|
|
2273 | |
|
|
2274 | for (y = 0; y < MAP_HEIGHT (map); y++) |
|
|
2275 | for (x = 0; x < MAP_WIDTH (map); x++) |
|
|
2276 | { |
|
|
2277 | sv = *av_fetch (obs, x + y * MAP_HEIGHT (map), 1); |
|
|
2278 | |
|
|
2279 | if (!SvROK (sv)) |
|
|
2280 | continue; |
|
|
2281 | |
|
|
2282 | av = (AV *)SvRV (sv); |
|
|
2283 | |
|
|
2284 | for (o = GET_MAP_OB (map, x, y); o; o = o->above) |
|
|
2285 | { |
|
|
2286 | sv = av_shift (av); |
|
|
2287 | |
|
|
2288 | if (SvROK (sv)) |
|
|
2289 | { |
|
|
2290 | sv_magic ((SV *)SvRV (sv), 0, PERL_MAGIC_ext, (char *)o, 0); |
|
|
2291 | SVptr_cache_set (o, sv); |
|
|
2292 | } |
|
|
2293 | } |
|
|
2294 | } |
|
|
2295 | } |
|
|
2296 | |
2335 | |
2297 | |
2336 | |
2298 | MODULE = cf PACKAGE = cf::arch |
2337 | MODULE = cf PACKAGE = cf::arch |
2299 | |
2338 | |
2300 | archetype *first() |
2339 | archetype *first() |