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.414 by root, Tue Oct 30 17:07:50 2012 UTC vs.
Revision 1.427 by root, Tue Nov 20 14:50:17 2012 UTC

92 92
93static SV 93static SV
94 *cv_cf_do_invoke, 94 *cv_cf_do_invoke,
95 *cv_cf__can_merge, 95 *cv_cf__can_merge,
96 *cv_cf_client_send_msg, 96 *cv_cf_client_send_msg,
97 *cv_cf_ix,
97 *cv_cf_tick, 98 *cv_cf_tick,
98 *cv_cf_match_match; 99 *cv_cf_match_match;
99 100
100#ifndef newSVpv_utf8 101#ifndef newSVpv_utf8
101static SV * 102static SV *
1157 CALL_ARG (originator); 1158 CALL_ARG (originator);
1158 CALL_CALL ("cf::mapscript::activate", G_VOID); 1159 CALL_CALL ("cf::mapscript::activate", G_VOID);
1159 CALL_END; 1160 CALL_END;
1160} 1161}
1161 1162
1163void cfperl_ix (client *ns, int set, faceidx idx, int pri)
1164{
1165 CALL_BEGIN (3);
1166 CALL_ARG (ns);
1167 CALL_ARG (set);
1168 CALL_ARG (idx);
1169 CALL_ARG (pri);
1170 CALL_CALL (cv_cf_ix, G_VOID);
1171 CALL_END;
1172}
1173
1162player * 1174player *
1163player::find (const_utf8_string name) 1175player::find (const_utf8_string name)
1164{ 1176{
1165 CALL_BEGIN (1); 1177 CALL_BEGIN (1);
1166 CALL_ARG (name); 1178 CALL_ARG (name);
1260 CALL_ARG (y); 1272 CALL_ARG (y);
1261 CALL_CALL ("cf::object::player::goto", G_VOID); 1273 CALL_CALL ("cf::object::player::goto", G_VOID);
1262 CALL_END; 1274 CALL_END;
1263} 1275}
1264 1276
1265const_utf8_string 1277const_utf8_string
1266object::ref () const 1278object::ref () const
1267{ 1279{
1268 if (type == PLAYER) 1280 if (type == PLAYER)
1269 return format ("player/<1.%llx>/%s", (unsigned long long)uuid.seq, &name); 1281 return format ("player/<1.%llx>/%s", (unsigned long long)uuid.seq, &name);
1270 else 1282 else
1436_connect_to_perl_2 () 1448_connect_to_perl_2 ()
1437{ 1449{
1438 cv_cf_do_invoke = (SV *)get_cv ("cf::do_invoke" , 0); assert (cv_cf_do_invoke); 1450 cv_cf_do_invoke = (SV *)get_cv ("cf::do_invoke" , 0); assert (cv_cf_do_invoke);
1439 cv_cf__can_merge = (SV *)get_cv ("cf::_can_merge" , 0); assert (cv_cf__can_merge); 1451 cv_cf__can_merge = (SV *)get_cv ("cf::_can_merge" , 0); assert (cv_cf__can_merge);
1440 cv_cf_client_send_msg = (SV *)get_cv ("cf::client::send_msg", 0); assert (cv_cf_client_send_msg); 1452 cv_cf_client_send_msg = (SV *)get_cv ("cf::client::send_msg", 0); assert (cv_cf_client_send_msg);
1453 cv_cf_ix = (SV *)get_cv ("cf::face::ix" , 0); assert (cv_cf_ix);
1441 cv_cf_tick = (SV *)get_cv ("cf::tick" , 0); assert (cv_cf_tick); 1454 cv_cf_tick = (SV *)get_cv ("cf::tick" , 0); assert (cv_cf_tick);
1442 cv_cf_match_match = (SV *)get_cv ("cf::match::match" , 0); assert (cv_cf_match_match); 1455 cv_cf_match_match = (SV *)get_cv ("cf::match::match" , 0); assert (cv_cf_match_match);
1443} 1456}
1444 1457
1445MODULE = cf PACKAGE = cf PREFIX = cf_ 1458MODULE = cf PACKAGE = cf PREFIX = cf_
1450 I_CORO_API (PACKAGE); coroapi::GCoroAPI = GCoroAPI; 1463 I_CORO_API (PACKAGE); coroapi::GCoroAPI = GCoroAPI;
1451 1464
1452 _connect_to_perl_1 (); 1465 _connect_to_perl_1 ();
1453 1466
1454 newCONSTSUB (stash_cf, "VERSION", newSVpv (VERSION, sizeof (VERSION) - 1)); 1467 newCONSTSUB (stash_cf, "VERSION", newSVpv (VERSION, sizeof (VERSION) - 1));
1455
1456 //{
1457 // require_pv ("Time::HiRes");
1458 //
1459 // SV **svp = hv_fetch (PL_modglobal, "Time::NVtime", 12, 0);
1460 // if (!svp) croak ("Time::HiRes is required");
1461 // if (!SvIOK(*svp)) croak ("Time::NVtime isn’t a function pointer");
1462 // coroapi::time = INT2PTR (double(*)(), SvIV(*svp));
1463 //}
1464 1468
1465 static const struct { 1469 static const struct {
1466 const char *name; 1470 const char *name;
1467 IV iv; 1471 IV iv;
1468 } *civ, const_iv[] = { 1472 } *civ, const_iv[] = {
1579 1583
1580void init_dynamic () 1584void init_dynamic ()
1581 1585
1582void load_settings () 1586void load_settings ()
1583 1587
1584void reload_exp_table () 1588void _reload_exp_table ()
1585 1589
1586void reload_materials () 1590void _reload_materials ()
1587 1591
1588void init_uuid () 1592void init_uuid ()
1589 CODE: 1593 CODE:
1590 UUID::init (); 1594 UUID::init ();
1591 1595
1602 coroapi::cede_to_tick (); 1606 coroapi::cede_to_tick ();
1603 1607
1604NV till_tick () 1608NV till_tick ()
1605 CODE: 1609 CODE:
1606 RETVAL = SvNVX (sv_next_tick) - now (); 1610 RETVAL = SvNVX (sv_next_tick) - now ();
1607 OUTPUT: 1611 OUTPUT: RETVAL
1608 RETVAL
1609 1612
1610int tick_inhibit () 1613int tick_inhibit ()
1611 CODE: 1614 CODE:
1612 RETVAL = tick_inhibit; 1615 RETVAL = tick_inhibit;
1613 OUTPUT: 1616 OUTPUT: RETVAL
1614 RETVAL
1615 1617
1616void tick_inhibit_inc () 1618void tick_inhibit_inc ()
1617 CODE: 1619 CODE:
1618 ++tick_inhibit; 1620 ++tick_inhibit;
1619 1621
1655NV rndm (...) 1657NV rndm (...)
1656 ALIAS: 1658 ALIAS:
1657 rmg_rndm = 1 1659 rmg_rndm = 1
1658 CODE: 1660 CODE:
1659{ 1661{
1660 rand_gen &gen = ix ? rmg_rndm : rndm; 1662 rand_gen &gen = ix ? rmg_rndm : rndm;
1661 switch (items) 1663 switch (items)
1662 { 1664 {
1663 case 0: RETVAL = gen (); break; 1665 case 0: RETVAL = gen (); break;
1664 case 1: RETVAL = gen (SvUV (ST (0))); break; 1666 case 1: RETVAL = gen (SvUV (ST (0))); break;
1665 case 2: RETVAL = gen (SvIV (ST (0)), SvIV (ST (1))); break; 1667 case 2: RETVAL = gen (SvIV (ST (0)), SvIV (ST (1))); break;
1666 default: croak ("cf::rndm requires zero, one or two parameters."); break; 1668 default: croak ("cf::rndm requires zero, one or two parameters."); break;
1667 } 1669 }
1668} 1670}
1669 OUTPUT: 1671 OUTPUT: RETVAL
1670 RETVAL
1671 1672
1672NV clamp (NV value, NV min_value, NV max_value) 1673NV clamp (NV value, NV min_value, NV max_value)
1673 CODE: 1674 CODE:
1674 RETVAL = clamp (value, min_value, max_value); 1675 RETVAL = clamp (value, min_value, max_value);
1675 OUTPUT: 1676 OUTPUT: RETVAL
1676 RETVAL
1677 1677
1678NV lerp (NV value, NV min_in, NV max_in, NV min_out, NV max_out) 1678NV lerp (NV value, NV min_in, NV max_in, NV min_out, NV max_out)
1679 CODE: 1679 CODE:
1680 RETVAL = lerp (value, min_in, max_in, min_out, max_out); 1680 RETVAL = lerp (value, min_in, max_in, min_out, max_out);
1681 OUTPUT: 1681 OUTPUT: RETVAL
1682 RETVAL
1683 1682
1684const char *ordinal (int i) 1683const char *ordinal (int i)
1685 1684
1686void weaken (...) 1685void weaken (...)
1687 PROTOTYPE: @ 1686 PROTOTYPE: @
1789 PUSHs (sv_2mortal (newSVpv ("objects" , 0))); PUSHs (sv_2mortal (newSVuv (objects.size () * sizeof (object)))); 1788 PUSHs (sv_2mortal (newSVpv ("objects" , 0))); PUSHs (sv_2mortal (newSVuv (objects.size () * sizeof (object))));
1790 PUSHs (sv_2mortal (newSVpv ("sv_count" , 0))); PUSHs (sv_2mortal (newSVuv (PL_sv_count))); 1789 PUSHs (sv_2mortal (newSVpv ("sv_count" , 0))); PUSHs (sv_2mortal (newSVuv (PL_sv_count)));
1791 PUSHs (sv_2mortal (newSVpv ("sv_objcount", 0))); PUSHs (sv_2mortal (newSVuv (PL_sv_objcount))); 1790 PUSHs (sv_2mortal (newSVpv ("sv_objcount", 0))); PUSHs (sv_2mortal (newSVuv (PL_sv_objcount)));
1792} 1791}
1793 1792
1794int find_animation (utf8_string text)
1795 PROTOTYPE: $
1796
1797int random_roll (int min, int max, object *op, int goodbad); 1793int random_roll (int min, int max, object *op, int goodbad);
1798 1794
1799const_utf8_string cost_string_from_value(uint64 cost, int approx = 0) 1795const_utf8_string cost_string_from_value(uint64 cost, int approx = 0)
1800 1796
1801int exp_to_level (val64 exp) 1797int exp_to_level (val64 exp)
1802 1798
1803val64 level_to_min_exp (int level) 1799val64 level_to_min_exp (int level)
1800
1801const_utf8_string
1802spellpathnames (int idx)
1803 CODE:
1804 RETVAL = spellpathnames [idx];
1805 OUTPUT: RETVAL
1804 1806
1805SV * 1807SV *
1806attacktype_name (int atnr) 1808attacktype_name (int atnr)
1807 CODE: 1809 CODE:
1808 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS) 1810 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS)
1832 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS) 1834 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS)
1833 ? newSVpv (change_resist_msg [atnr], 0) 1835 ? newSVpv (change_resist_msg [atnr], 0)
1834 : &PL_sv_undef; 1836 : &PL_sv_undef;
1835 OUTPUT: RETVAL 1837 OUTPUT: RETVAL
1836 1838
1839int
1840skill_flags (int idx)
1841 CODE:
1842 if (idx < 0 || idx >= array_length (skill_flags))
1843 croak ("skill_flags: index out of bounds");
1844 RETVAL = skill_flags [idx];
1845 OUTPUT: RETVAL
1846
1837UUID 1847UUID
1838uuid_cur () 1848uuid_cur ()
1839 CODE: 1849 CODE:
1840 RETVAL = UUID::cur; 1850 RETVAL = UUID::cur;
1841 OUTPUT: 1851 OUTPUT: RETVAL
1842 RETVAL
1843 1852
1844UUID 1853UUID
1845uuid_gen () 1854uuid_gen ()
1846 CODE: 1855 CODE:
1847 RETVAL = UUID::gen (); 1856 RETVAL = UUID::gen ();
1848 OUTPUT: 1857 OUTPUT: RETVAL
1849 RETVAL
1850 1858
1851val64 1859val64
1852uuid_seq (UUID uuid) 1860uuid_seq (UUID uuid)
1853 CODE: 1861 CODE:
1854 RETVAL = uuid.seq; 1862 RETVAL = uuid.seq;
1855 OUTPUT: 1863 OUTPUT: RETVAL
1856 RETVAL
1857 1864
1858UUID 1865UUID
1859uuid_str (val64 seq) 1866uuid_str (val64 seq)
1860 CODE: 1867 CODE:
1861 RETVAL.seq = seq; 1868 RETVAL.seq = seq;
1862 OUTPUT: 1869 OUTPUT: RETVAL
1863 RETVAL
1864 1870
1865void 1871void
1866coin_names () 1872coin_names ()
1867 PPCODE: 1873 PPCODE:
1868 EXTEND (SP, NUM_COINS); 1874 EXTEND (SP, NUM_COINS);
1880load_resource_file_ (octet_string filename) 1886load_resource_file_ (octet_string filename)
1881 1887
1882void 1888void
1883fix_weight () 1889fix_weight ()
1884 1890
1891utf8_string
1892expand_cfpod (int hintmode, int gender, const_utf8_string cfpod)
1893 PPCODE:
1894 XPUSHs (to_sv (player::expand_cfpod (hintmode, gender, cfpod)));
1895
1885MODULE = cf PACKAGE = cf::attachable 1896MODULE = cf PACKAGE = cf::attachable
1886 1897
1887int 1898int
1888valid (SV *obj) 1899valid (SV *obj)
1889 CODE: 1900 CODE:
1890 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1901 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1891 OUTPUT: 1902 OUTPUT: RETVAL
1892 RETVAL
1893 1903
1894bool should_invoke (attachable *obj, int event) 1904bool should_invoke (attachable *obj, int event)
1895 CODE: 1905 CODE:
1896 RETVAL = obj->should_invoke ((event_type)event); 1906 RETVAL = obj->should_invoke ((event_type)event);
1897 OUTPUT: RETVAL 1907 OUTPUT: RETVAL
1979 case 0: RETVAL = body_locations[slot].name ; break; 1989 case 0: RETVAL = body_locations[slot].name ; break;
1980 case 1: RETVAL = body_locations[slot].use_name ; break; 1990 case 1: RETVAL = body_locations[slot].use_name ; break;
1981 case 2: RETVAL = body_locations[slot].nonuse_name; break; 1991 case 2: RETVAL = body_locations[slot].nonuse_name; break;
1982 } 1992 }
1983} 1993}
1984 OUTPUT: 1994 OUTPUT: RETVAL
1985 RETVAL
1986 1995
1987# missing properties 1996# missing properties
1988 1997
1989object *head (object *op) 1998object *head (object *op)
1990 PROTOTYPE: $ 1999 PROTOTYPE: $
2026 if (ix) 2035 if (ix)
2027 op->slot[slot].used = value; 2036 op->slot[slot].used = value;
2028 else 2037 else
2029 op->slot[slot].info = value; 2038 op->slot[slot].info = value;
2030} 2039}
2031 OUTPUT: 2040 OUTPUT: RETVAL
2032 RETVAL
2033 2041
2034object *find_best_object_match (object *op, utf8_string match) 2042object *find_best_object_match (object *op, utf8_string match)
2035 2043
2036int apply_shop_mat (object *shop_mat, object *op); 2044int apply_shop_mat (object *shop_mat, object *op);
2037 2045
2038int move (object *op, int dir, object *originator = op) 2046int move (object *op, int dir, object *originator = op)
2039 CODE: 2047 CODE:
2040 RETVAL = op->move (dir, originator); 2048 RETVAL = op->move (dir, originator);
2041 OUTPUT: 2049 OUTPUT: RETVAL
2042 RETVAL
2043 2050
2044void apply_below (object *op) 2051void apply_below (object *op)
2045 CODE: 2052 CODE:
2046 player_apply_below (op); 2053 player_apply_below (op);
2047 2054
2111int convert_item (object *item, object *converter) 2118int convert_item (object *item, object *converter)
2112 2119
2113void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags); 2120void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags);
2114 2121
2115MODULE = cf PACKAGE = cf::object PREFIX = cf_ 2122MODULE = cf PACKAGE = cf::object PREFIX = cf_
2116
2117# no clean way to get an object from an archetype - stupid idiotic
2118# dumb kludgy misdesigned plug-in api slowly gets on my nerves.
2119 2123
2120object *new (utf8_string archetype = 0) 2124object *new (utf8_string archetype = 0)
2121 PROTOTYPE: ;$ 2125 PROTOTYPE: ;$
2122 CODE: 2126 CODE:
2123 RETVAL = archetype 2127 RETVAL = archetype
2124 ? archetype::get (archetype) 2128 ? archetype::get (archetype)
2125 : object::create (); 2129 : object::create ();
2126 OUTPUT: 2130 OUTPUT: RETVAL
2127 RETVAL
2128 2131
2129object *generate (utf8_string arch, object *creator) 2132object *generate (utf8_string arch, object *creator)
2130 CODE: 2133 CODE:
2131 object *obj = archetype::get (arch); 2134 object *obj = archetype::get (arch);
2132 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL); 2135 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL);
2133 RETVAL = obj; 2136 RETVAL = obj;
2134 OUTPUT: 2137 OUTPUT: RETVAL
2135 RETVAL
2136 2138
2137object *find_object (U32 tag) 2139object *find_object (U32 tag)
2138 2140
2139object *find_object_uuid (UUID i) 2141object *find_object_uuid (UUID i)
2140 2142
2146 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y); 2148 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y);
2147 2149
2148 if (RETVAL->destroyed ()) 2150 if (RETVAL->destroyed ())
2149 RETVAL = 0; 2151 RETVAL = 0;
2150} 2152}
2151 OUTPUT: 2153 OUTPUT: RETVAL
2152 RETVAL
2153 2154
2154shstr 2155shstr
2155object::kv_get (shstr key) 2156object::kv_get (shstr key)
2156 CODE: 2157 CODE:
2157 RETVAL = THIS->kv.get (key); 2158 RETVAL = THIS->kv.get (key);
2158 OUTPUT: 2159 OUTPUT: RETVAL
2159 RETVAL
2160 2160
2161void 2161void
2162object::kv_del (shstr key) 2162object::kv_del (shstr key)
2163 CODE: 2163 CODE:
2164 THIS->kv.del (key); 2164 THIS->kv.del (key);
2263#d# TODO: replace by blocked_los accessor, fix code using this 2263#d# TODO: replace by blocked_los accessor, fix code using this
2264bool 2264bool
2265cell_visible (player *pl, int dx, int dy) 2265cell_visible (player *pl, int dx, int dy)
2266 CODE: 2266 CODE:
2267 RETVAL = pl->blocked_los (dx, dy) != LOS_BLOCKED; 2267 RETVAL = pl->blocked_los (dx, dy) != LOS_BLOCKED;
2268 OUTPUT: 2268 OUTPUT: RETVAL
2269 RETVAL
2270 2269
2271void 2270void
2272send (player *pl, SV *packet) 2271send (player *pl, SV *packet)
2273 CODE: 2272 CODE:
2274{ 2273{
2350outdoor_darkness (int darkness = 0) 2349outdoor_darkness (int darkness = 0)
2351 CODE: 2350 CODE:
2352 RETVAL = maptile::outdoor_darkness; 2351 RETVAL = maptile::outdoor_darkness;
2353 if (items) 2352 if (items)
2354 maptile::outdoor_darkness = darkness; 2353 maptile::outdoor_darkness = darkness;
2355 OUTPUT: 2354 OUTPUT: RETVAL
2356 RETVAL
2357 2355
2358void 2356void
2359maptile::instantiate () 2357maptile::instantiate ()
2360 2358
2361maptile *new () 2359maptile *new ()
2362 PROTOTYPE: 2360 PROTOTYPE:
2363 CODE: 2361 CODE:
2364 RETVAL = new maptile; 2362 RETVAL = new maptile;
2365 OUTPUT: 2363 OUTPUT: RETVAL
2366 RETVAL
2367 2364
2368void 2365void
2369maptile::players () 2366maptile::players ()
2370 PPCODE: 2367 PPCODE:
2371 if (GIMME_V == G_SCALAR) 2368 if (GIMME_V == G_SCALAR)
2391 croak ("maptile::add_underlay: palette must be arrayref"); 2388 croak ("maptile::add_underlay: palette must be arrayref");
2392 2389
2393 palette = SvRV (palette); 2390 palette = SvRV (palette);
2394 2391
2395 STRLEN idxlen; 2392 STRLEN idxlen;
2396 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen); 2393 const uint8 *idx = (const uint8 *)SvPVbyte (data, idxlen);
2397 2394
2398 for (int x = 0; x < THIS->width; ++x) 2395 for (int x = 0; x < THIS->width; ++x)
2399 for (int y = 0; y < THIS->height; ++y) 2396 for (int y = 0; y < THIS->height; ++y)
2400 { 2397 {
2401 for (object *op = THIS->at (x, y).bot; op; op = op->above) 2398 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2441 croak ("maptile::set_regiondata: palette must be arrayref"); 2438 croak ("maptile::set_regiondata: palette must be arrayref");
2442 2439
2443 palette = SvRV (palette); 2440 palette = SvRV (palette);
2444 2441
2445 STRLEN idxlen; 2442 STRLEN idxlen;
2446 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen); 2443 const uint8 *idx = (const uint8 *)SvPVbyte (data, idxlen);
2447 2444
2448 region_ptr *regionmap = new region_ptr [av_len ((AV *)palette) + 1]; 2445 region_ptr *regionmap = new region_ptr [av_len ((AV *)palette) + 1];
2449 uint8_t *regions = salloc<uint8_t> (THIS->size ()); 2446 uint8 *regions = salloc<uint8_t> (THIS->size ());
2450 2447
2451 for (int i = av_len ((AV *)palette) + 1; i--; ) 2448 for (int i = av_len ((AV *)palette) + 1; i--; )
2452 regionmap [i] = region::find (cfSvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1))); 2449 regionmap [i] = region::find (cfSvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1)));
2453 2450
2454 for (int y = 0; y < THIS->height; ++y) 2451 for (int y = 0; y < THIS->height; ++y)
2506 if (!pos.move (dir).normalise ()) 2503 if (!pos.move (dir).normalise ())
2507 XSRETURN_UNDEF; 2504 XSRETURN_UNDEF;
2508 2505
2509 RETVAL = &*pos; 2506 RETVAL = &*pos;
2510} 2507}
2511 OUTPUT: 2508 OUTPUT: RETVAL
2512 RETVAL
2513 2509
2514void 2510void
2515at (maptile *map, unsigned int x, unsigned int y, int dir = 0) 2511at (maptile *map, unsigned int x, unsigned int y, int dir = 0)
2516 PROTOTYPE: $$$;$ 2512 PROTOTYPE: $$$;$
2517 PPCODE: 2513 PPCODE:
2558# worst xs function of my life 2554# worst xs function of my life
2559bool 2555bool
2560_create_random_map (maptile *self, SV *options) 2556_create_random_map (maptile *self, SV *options)
2561 CODE: 2557 CODE:
2562{ 2558{
2563 random_map_params rmp ((HV *)SvRV (options)); 2559 random_map_params rmp ((HV *)SvRV (options));
2564 RETVAL = self->generate_random_map (&rmp); 2560 RETVAL = self->generate_random_map (&rmp);
2565} 2561}
2566 OUTPUT: 2562 OUTPUT: RETVAL
2567 RETVAL
2568 2563
2569MODULE = cf PACKAGE = cf::mapspace 2564MODULE = cf PACKAGE = cf::mapspace
2570 2565
2571INCLUDE: $PERL $srcdir/genacc mapspace $srcdir/../include/map.h | 2566INCLUDE: $PERL $srcdir/genacc mapspace $srcdir/../include/map.h |
2572 2567
2579 2574
2580archetype *archetypes (U32 index) 2575archetype *archetypes (U32 index)
2581 CODE: 2576 CODE:
2582 RETVAL = index < archetypes.size () ? archetypes [index] : 0; 2577 RETVAL = index < archetypes.size () ? archetypes [index] : 0;
2583 OUTPUT: RETVAL 2578 OUTPUT: RETVAL
2579
2580int skillvec_size ()
2581 CODE:
2582 RETVAL = skillvec.size ();
2583 OUTPUT: RETVAL
2584
2585archetype *skillvec (U32 index)
2586 CODE:
2587 RETVAL = index < skillvec.size () ? (archetype *)(object *)skillvec [index] : 0;
2588 OUTPUT: RETVAL
2589
2590void
2591find_by_type (int type)
2592 PPCODE:
2593 for_all_archetypes (arch)
2594 if (arch->type == type)
2595 XPUSHs (sv_2mortal (to_sv (arch)));
2584 2596
2585INCLUDE: $PERL $srcdir/genacc archetype $srcdir/../include/object.h | 2597INCLUDE: $PERL $srcdir/genacc archetype $srcdir/../include/object.h |
2586 2598
2587MODULE = cf PACKAGE = cf::party 2599MODULE = cf PACKAGE = cf::party
2588 2600
2681 if (RETVAL) 2693 if (RETVAL)
2682 { 2694 {
2683 THIS->send_face (RETVAL, pri); 2695 THIS->send_face (RETVAL, pri);
2684 THIS->flush_fx (); 2696 THIS->flush_fx ();
2685 } 2697 }
2686 OUTPUT: 2698 OUTPUT: RETVAL
2687 RETVAL
2688 2699
2689int 2700int
2690client::fx_want (int idx, int value = -1) 2701client::fx_want (int idx, int value = -1)
2691 CODE: 2702 CODE:
2692 if (0 < idx && idx < FT_NUM) 2703 if (0 < idx && idx < FT_NUM)
2695 if (items > 2) 2706 if (items > 2)
2696 THIS->fx_want [idx] = value; 2707 THIS->fx_want [idx] = value;
2697 } 2708 }
2698 else 2709 else
2699 RETVAL = 0; 2710 RETVAL = 0;
2700 OUTPUT: 2711 OUTPUT: RETVAL
2701 RETVAL
2702 2712
2703MODULE = cf PACKAGE = cf::sound PREFIX = sound_ 2713MODULE = cf PACKAGE = cf::sound PREFIX = sound_
2704 2714
2705faceidx sound_find (utf8_string name) 2715faceidx sound_find (utf8_string name)
2706 2716
2753 case 2: f->magicmap = value; break; 2763 case 2: f->magicmap = value; break;
2754 case 3: f->smooth = value; break; 2764 case 3: f->smooth = value; break;
2755 case 4: f->smoothlevel = value; break; 2765 case 4: f->smoothlevel = value; break;
2756 } 2766 }
2757 2767
2758void set_data (faceidx idx, int faceset, SV *data, SV *chksum) 2768void set_csum (faceidx idx, int faceset, SV *chksum)
2759 CODE: 2769 CODE:
2760{ 2770{
2761 faceinfo *f = face_info (idx); assert (f); 2771 faceinfo *f = face_info (idx); assert (f);
2762 facedata *d = f->face + faceset; 2772 facedata *d = f->face + faceset;
2763 sv_to (data, d->data);
2764 STRLEN clen; 2773 STRLEN clen;
2765 char *cdata = SvPVbyte (chksum, clen); 2774 char *cdata = SvPVbyte (chksum, clen);
2766 clen = min (CHKSUM_MAXLEN, clen);
2767 2775
2776 assert (("cf::face::set_data called with too long checksum", clen <= CHKSUM_MAXLEN));
2768 assert (("cf::face::set_data must be called with a non-empty checksum", clen)); 2777 assert (("cf::face::set_data must be called with a non-empty checksum", clen));
2769 2778
2770 if (clen != d->chksum_len || memcmp (d->chksum, cdata, clen)) 2779 if (clen != d->chksum_len || memcmp (d->chksum, cdata, clen))
2771 { 2780 {
2772 d->chksum_len = clen; 2781 d->chksum_len = clen;
2773 memcpy (d->chksum, cdata, clen); 2782 memcpy (d->chksum, cdata, clen);
2774 2783
2775 // invalidate existing client face info 2784 // invalidate existing client face info
2776 for_all_clients (ns) 2785 for_all_clients (ns)
2777 if (ns->faceset == faceset) 2786 ns->invalidate_face (idx);
2778 {
2779 ns->faces_sent [idx] = false;
2780 ns->force_newmap = true;
2781 }
2782 } 2787 }
2783} 2788}
2784 2789
2785int get_data_size (faceidx idx, int faceset = 0) 2790SV *mangle_csum (SV *chksum)
2786 CODE: 2791 CODE:
2787 facedata *d = face_data (idx, faceset); 2792 STRLEN len;
2788 if (!d) XSRETURN_UNDEF; 2793 char *data = SvPVbyte (chksum, len);
2789 RETVAL = d->data.size (); 2794 RETVAL = newSVpvn (data, min (len, CHKSUM_MAXLEN));
2790 OUTPUT: 2795 OUTPUT: RETVAL
2791 RETVAL
2792 2796
2793void set_meta (faceidx idx, SV *sv)
2794 CODE:
2795{
2796 faceinfo *f = face_info (idx); assert (f);
2797 SvREFCNT_dec (f->meta_hv);
2798 f->meta_hv = SvOK (sv) ? (HV *)SvREFCNT_inc (SvRV (sv)) : 0;
2799}
2800
2801SV *get_chksum (faceidx idx, int faceset = 0) 2797SV *get_csum (faceidx idx, int faceset = 0)
2802 CODE: 2798 CODE:
2803 facedata *d = face_data (idx, faceset); 2799 facedata *d = face_data (idx, faceset);
2804 if (!d) XSRETURN_UNDEF; 2800 if (!d) XSRETURN_UNDEF;
2805 RETVAL = newSVpvn ((char *)d->chksum, d->chksum_len); 2801 RETVAL = newSVpvn ((char *)d->chksum, d->chksum_len);
2806 OUTPUT: 2802 OUTPUT: RETVAL
2807 RETVAL
2808 2803
2809int get_type (faceidx idx) 2804int get_type (faceidx idx)
2810 CODE: 2805 CODE:
2811 faceinfo *f = face_info (idx); 2806 faceinfo *f = face_info (idx);
2812 if (!f) XSRETURN_UNDEF; 2807 if (!f) XSRETURN_UNDEF;
2813 RETVAL = f->type; 2808 RETVAL = f->type;
2814 OUTPUT: 2809 OUTPUT: RETVAL
2815 RETVAL
2816 2810
2817SV *get_data (faceidx idx, int faceset = 0) 2811SV *get_name (faceidx idx)
2818 CODE: 2812 CODE:
2819 facedata *d = face_data (idx, faceset); 2813 faceinfo *f = face_info (idx);
2820 if (!d) XSRETURN_UNDEF; 2814 if (!f) XSRETURN_UNDEF;
2821 RETVAL = newSVpvn (d->data, d->data.size ()); 2815 RETVAL = to_sv (f->name);
2822 OUTPUT: 2816 OUTPUT: RETVAL
2823 RETVAL
2824
2825SV *get_meta (faceidx idx)
2826 CODE:
2827 faceinfo *f = face_info (idx); assert (f);
2828 if (!f || !f->meta_hv) XSRETURN_UNDEF;
2829 RETVAL = newRV_inc ((SV *)f->meta_hv);
2830 OUTPUT:
2831 RETVAL
2832 2817
2833void invalidate (faceidx idx) 2818void invalidate (faceidx idx)
2834 CODE: 2819 CODE:
2835 for_all_clients (ns) 2820 for_all_clients (ns)
2836 ns->invalidate_face (idx); 2821 ns->invalidate_face (idx);
2900bool 2885bool
2901errors_are_fatal (bool fatal) 2886errors_are_fatal (bool fatal)
2902 CODE: 2887 CODE:
2903 RETVAL = object_thawer::errors_are_fatal; 2888 RETVAL = object_thawer::errors_are_fatal;
2904 object_thawer::errors_are_fatal = fatal; 2889 object_thawer::errors_are_fatal = fatal;
2905 OUTPUT: 2890 OUTPUT: RETVAL
2906 RETVAL
2907 2891
2908SV * 2892SV *
2909new_from_file (char *klass, octet_string path) 2893new_from_file (char *klass, octet_string path)
2910 CODE: 2894 CODE:
2911 object_thawer *f = new object_thawer (path); 2895 object_thawer *f = new object_thawer (path);
2937 XPUSHs (sv_2mortal (newSVpv_utf8 (self->get_str ()))); 2921 XPUSHs (sv_2mortal (newSVpv_utf8 (self->get_str ())));
2938 2922
2939 self->skip (); 2923 self->skip ();
2940 } 2924 }
2941 2925
2926MODULE = cf PACKAGE = cf::treasurelist
2927
2928# quick hack, because I didn't want to implement accessors for treasurelist.
2929# this asks for even more autogen, actually.
2930
2931void
2932expand (treasurelist *list)
2933 PPCODE:
2934 EXTEND (SP, 3);
2935 PUSHs (sv_2mortal (to_sv (list->name)));
2936 PUSHs (sv_2mortal (to_sv (list->total_chance)));
2937 AV *av = newAV ();
2938 PUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
2939 for (treasure *item = list->items; item; item = item->next)
2940 {
2941 AV *iav = newAV ();
2942 av_push (av, newRV_noinc ((SV *)iav));
2943
2944 av_extend (iav, 7);
2945 av_push (iav, to_sv (item->item));
2946 av_push (iav, to_sv (item->name));
2947 av_push (iav, to_sv (item->change_arch.name));
2948 av_push (iav, to_sv (item->change_arch.title));
2949 av_push (iav, to_sv (item->change_arch.slaying));
2950 av_push (iav, to_sv (item->chance));
2951 av_push (iav, to_sv (item->nrof));
2952 av_push (iav, to_sv (item->magic));
2953 }
2954
2942MODULE = cf PACKAGE = cf::layout 2955MODULE = cf PACKAGE = cf::layout
2943 2956
2944INCLUDE: $PERL $srcdir/genacc layout $srcdir/../include/rmg.h | 2957INCLUDE: $PERL $srcdir/genacc layout $srcdir/../include/rmg.h |
2945 2958

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines