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.25 by root, Tue Aug 29 07:56:56 2006 UTC vs.
Revision 1.31 by root, Wed Aug 30 12:08:15 2006 UTC

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
471object_thawer::object_thawer (FILE *fp, const char *filename) 471object_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
509int 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
518int fputs (const char *s, object_freezer &freezer)
519{
520 fputs (s, freezer.fp);
496} 521}
497 522
498void object_thawer::get (data_type type, void *obj, attachable_base *ext, int oid) 523void 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
520object_thawer::~object_thawer () 545object_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
1676int
1677_valid (SV *obj)
1678 CODE:
1679 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1680 OUTPUT:
1681 RETVAL
1682
1654MODULE = cf PACKAGE = cf::object PREFIX = cf_object_ 1683MODULE = cf PACKAGE = cf::object PREFIX = cf_object_
1655 1684
1656int invoke (object *op, int event, ...) 1685int 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
1664SV *registry (object *op) 1693SV *registry (object *op)
1665 CODE: 1694 CODE:
1666 RETVAL = registry_of (op); 1695 RETVAL = registry_of (op);
1667 OUTPUT: 1696 OUTPUT:
1697 RETVAL
1698
1699object *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
1670SV * 1716SV *
1671get_property (object *obj, int type, int idx) 1717get_property (object *obj, int type, int idx)
1672 CODE: 1718 CODE:
1752 1798
1753int need_identify (const object *obj); 1799int need_identify (const object *obj);
1754 1800
1755int apply_shop_mat (object *shop_mat, object *op); 1801int apply_shop_mat (object *shop_mat, object *op);
1756 1802
1757void cf_object_move (object *op, int dir, object *originator = op) 1803int move (object *op, int dir, object *originator = op)
1804 CODE:
1805 RETVAL = move_ob (op, dir, originator);
1806 OUTPUT:
1807 RETVAL
1758 1808
1759void cf_object_apply (object *op, object *author, int flags = 0) 1809void cf_object_apply (object *op, object *author, int flags = 0)
1760 1810
1761void cf_object_apply_below (object *op) 1811void cf_object_apply_below (object *op)
1762 1812
2093 OUTPUT: RETVAL 2143 OUTPUT: RETVAL
2094 2144
2095 2145
2096MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 2146MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
2097 2147
2148mapstruct *first ()
2149 PROTOTYPE:
2150 CODE:
2151 RETVAL = first_map;
2152 OUTPUT: RETVAL
2153
2154mapstruct *next (mapstruct *map)
2155 PROTOTYPE:
2156 CODE:
2157 RETVAL = map->next;
2158 OUTPUT: RETVAL
2159
2098int invoke (mapstruct *map, int event, ...) 2160int 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
2130mapstruct *new (int width, int height) 2192mapstruct *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
2140void delete_map (mapstruct *map) 2201void 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
2160mapstruct *cf_map_get_map (char *name) 2221mapstruct *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
2164mapstruct *has_been_loaded (char *name) 2227mapstruct *has_been_loaded (char *name)
2165 PROTOTYPE: $ 2228 PROTOTYPE: $
2166
2167mapstruct *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.
2174void set_path (mapstruct *where, char *path) 2233void set_path (mapstruct *where, char *path)
2188 RETVAL 2247 RETVAL
2189 2248
2190void set_unique (mapstruct *map, bool unique) 2249void set_unique (mapstruct *map, bool unique)
2191 CODE: 2250 CODE:
2192 map->unique = unique; 2251 map->unique = unique;
2252
2253void
2254trigger (mapstruct *map, long connection, bool state = true)
2255 CODE:
2256 activate_connection (map, connection, state);
2257
2258void
2259get_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
2194object *cf_map_insert_object_there (mapstruct *where, object *op, object *originator, int flags) 2266object *cf_map_insert_object_there (mapstruct *where, object *op, object *originator, int flags)
2195 2267
2196object *cf_map_insert_object (mapstruct *where, object* op, int x, int y) 2268object *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
2265void
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
2298MODULE = cf PACKAGE = cf::arch 2337MODULE = cf PACKAGE = cf::arch
2299 2338
2300archetype *first() 2339archetype *first()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines