--- deliantra/server/plugins/cfperl/cfperl.xs 2006/03/06 22:59:26 1.28 +++ deliantra/server/plugins/cfperl/cfperl.xs 2006/03/06 23:31:54 1.29 @@ -128,8 +128,14 @@ return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1)); } +static void +SVptr_cache_set (void *ptr, SV *sv) +{ + hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); +} + static SV * -SVptr_cached (void *ptr) +SVptr_cache_get (void *ptr) { SV **he = hv_fetch (obj_cache, (char *)&ptr, sizeof (ptr), 0); @@ -144,14 +150,15 @@ if (!ptr) return &PL_sv_undef; - sv = SVptr_cached (ptr); + sv = SVptr_cache_get (ptr); if (!sv) { HV *hv = newHV (); sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); sv = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); - hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); + + SVptr_cache_set (ptr, sv); } return newSVsv (sv); @@ -1566,6 +1573,7 @@ OUTPUT: RETVAL +# "serialise" map perl data into a ref void _get_obs (mapstruct *map) PPCODE: @@ -1582,7 +1590,7 @@ for (o = GET_MAP_OB (map, x, y); o; o = o->above) { - SV *sv = SVptr_cached (o); + SV *sv = SVptr_cache_get (o); if (sv && HvFILL (SvRV (sv))) { @@ -1604,6 +1612,39 @@ SvREFCNT_dec (obs); } +# "deserialise" perl map data into the map +void +_set_obs (mapstruct *map, SV *sv) + CODE: +{ + object *o; + AV *av; + int x, y; + AV *obs = (AV *)SvRV (sv); + + for (y = 0; y < MAP_HEIGHT (map); y++) + for (x = 0; x < MAP_WIDTH (map); x++) + { + sv = *av_fetch (obs, x + y * MAP_HEIGHT (map), 1); + + if (!SvROK (sv)) + continue; + + av = (AV *)SvRV (sv); + + for (o = GET_MAP_OB (map, x, y); o; o = o->above) + { + sv = av_shift (av); + + if (SvROK (sv)) + { + sv_magic ((SV *)SvRV (sv), 0, PERL_MAGIC_ext, (char *)o, 0); + SVptr_cache_set (o, sv); + } + } + } +} + MODULE = cf PACKAGE = cf::arch PREFIX = cf_archetype_ archetype *cf_archetype_get_first()