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.428 by root, Mon Aug 10 03:05:30 2015 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2006,2007,2008,2009,2010,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2006,2007,2008,2009,2010,2012,2015 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * 5 *
6 * Deliantra is free software: you can redistribute it and/or modify it under 6 * Deliantra is free software: you can redistribute it and/or modify it under
7 * the terms of the Affero GNU General Public License as published by the 7 * the terms of the Affero GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your 8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version. 9 * option) any later version.
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: @
1786 EXTEND (SP, 5*2); 1785 EXTEND (SP, 5*2);
1787 PUSHs (sv_2mortal (newSVpv ("slice_alloc", 0))); PUSHs (sv_2mortal (newSVuv (slice_alloc))); 1786 PUSHs (sv_2mortal (newSVpv ("slice_alloc", 0))); PUSHs (sv_2mortal (newSVuv (slice_alloc)));
1788 PUSHs (sv_2mortal (newSVpv ("shstr_alloc", 0))); PUSHs (sv_2mortal (newSVuv (shstr_alloc))); 1787 PUSHs (sv_2mortal (newSVpv ("shstr_alloc", 0))); PUSHs (sv_2mortal (newSVuv (shstr_alloc)));
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)));
1792} 1790}
1793
1794int find_animation (utf8_string text)
1795 PROTOTYPE: $
1796 1791
1797int random_roll (int min, int max, object *op, int goodbad); 1792int random_roll (int min, int max, object *op, int goodbad);
1798 1793
1799const_utf8_string cost_string_from_value(uint64 cost, int approx = 0) 1794const_utf8_string cost_string_from_value(uint64 cost, int approx = 0)
1800 1795
1801int exp_to_level (val64 exp) 1796int exp_to_level (val64 exp)
1802 1797
1803val64 level_to_min_exp (int level) 1798val64 level_to_min_exp (int level)
1799
1800const_utf8_string
1801spellpathnames (int idx)
1802 CODE:
1803 RETVAL = spellpathnames [idx];
1804 OUTPUT: RETVAL
1804 1805
1805SV * 1806SV *
1806attacktype_name (int atnr) 1807attacktype_name (int atnr)
1807 CODE: 1808 CODE:
1808 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS) 1809 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS)
1832 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS) 1833 RETVAL = IN_RANGE_EXC (atnr, 0, NROFATTACKS)
1833 ? newSVpv (change_resist_msg [atnr], 0) 1834 ? newSVpv (change_resist_msg [atnr], 0)
1834 : &PL_sv_undef; 1835 : &PL_sv_undef;
1835 OUTPUT: RETVAL 1836 OUTPUT: RETVAL
1836 1837
1838int
1839skill_flags (int idx)
1840 CODE:
1841 if (idx < 0 || idx >= array_length (skill_flags))
1842 croak ("skill_flags: index out of bounds");
1843 RETVAL = skill_flags [idx];
1844 OUTPUT: RETVAL
1845
1837UUID 1846UUID
1838uuid_cur () 1847uuid_cur ()
1839 CODE: 1848 CODE:
1840 RETVAL = UUID::cur; 1849 RETVAL = UUID::cur;
1841 OUTPUT: 1850 OUTPUT: RETVAL
1842 RETVAL
1843 1851
1844UUID 1852UUID
1845uuid_gen () 1853uuid_gen ()
1846 CODE: 1854 CODE:
1847 RETVAL = UUID::gen (); 1855 RETVAL = UUID::gen ();
1848 OUTPUT: 1856 OUTPUT: RETVAL
1849 RETVAL
1850 1857
1851val64 1858val64
1852uuid_seq (UUID uuid) 1859uuid_seq (UUID uuid)
1853 CODE: 1860 CODE:
1854 RETVAL = uuid.seq; 1861 RETVAL = uuid.seq;
1855 OUTPUT: 1862 OUTPUT: RETVAL
1856 RETVAL
1857 1863
1858UUID 1864UUID
1859uuid_str (val64 seq) 1865uuid_str (val64 seq)
1860 CODE: 1866 CODE:
1861 RETVAL.seq = seq; 1867 RETVAL.seq = seq;
1862 OUTPUT: 1868 OUTPUT: RETVAL
1863 RETVAL
1864 1869
1865void 1870void
1866coin_names () 1871coin_names ()
1867 PPCODE: 1872 PPCODE:
1868 EXTEND (SP, NUM_COINS); 1873 EXTEND (SP, NUM_COINS);
1880load_resource_file_ (octet_string filename) 1885load_resource_file_ (octet_string filename)
1881 1886
1882void 1887void
1883fix_weight () 1888fix_weight ()
1884 1889
1890utf8_string
1891expand_cfpod (int hintmode, int gender, const_utf8_string cfpod)
1892 PPCODE:
1893 XPUSHs (to_sv (player::expand_cfpod (hintmode, gender, cfpod)));
1894
1885MODULE = cf PACKAGE = cf::attachable 1895MODULE = cf PACKAGE = cf::attachable
1886 1896
1887int 1897int
1888valid (SV *obj) 1898valid (SV *obj)
1889 CODE: 1899 CODE:
1890 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); 1900 RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext);
1891 OUTPUT: 1901 OUTPUT: RETVAL
1892 RETVAL
1893 1902
1894bool should_invoke (attachable *obj, int event) 1903bool should_invoke (attachable *obj, int event)
1895 CODE: 1904 CODE:
1896 RETVAL = obj->should_invoke ((event_type)event); 1905 RETVAL = obj->should_invoke ((event_type)event);
1897 OUTPUT: RETVAL 1906 OUTPUT: RETVAL
1979 case 0: RETVAL = body_locations[slot].name ; break; 1988 case 0: RETVAL = body_locations[slot].name ; break;
1980 case 1: RETVAL = body_locations[slot].use_name ; break; 1989 case 1: RETVAL = body_locations[slot].use_name ; break;
1981 case 2: RETVAL = body_locations[slot].nonuse_name; break; 1990 case 2: RETVAL = body_locations[slot].nonuse_name; break;
1982 } 1991 }
1983} 1992}
1984 OUTPUT: 1993 OUTPUT: RETVAL
1985 RETVAL
1986 1994
1987# missing properties 1995# missing properties
1988 1996
1989object *head (object *op) 1997object *head (object *op)
1990 PROTOTYPE: $ 1998 PROTOTYPE: $
2026 if (ix) 2034 if (ix)
2027 op->slot[slot].used = value; 2035 op->slot[slot].used = value;
2028 else 2036 else
2029 op->slot[slot].info = value; 2037 op->slot[slot].info = value;
2030} 2038}
2031 OUTPUT: 2039 OUTPUT: RETVAL
2032 RETVAL
2033 2040
2034object *find_best_object_match (object *op, utf8_string match) 2041object *find_best_object_match (object *op, utf8_string match)
2035 2042
2036int apply_shop_mat (object *shop_mat, object *op); 2043int apply_shop_mat (object *shop_mat, object *op);
2037 2044
2038int move (object *op, int dir, object *originator = op) 2045int move (object *op, int dir, object *originator = op)
2039 CODE: 2046 CODE:
2040 RETVAL = op->move (dir, originator); 2047 RETVAL = op->move (dir, originator);
2041 OUTPUT: 2048 OUTPUT: RETVAL
2042 RETVAL
2043 2049
2044void apply_below (object *op) 2050void apply_below (object *op)
2045 CODE: 2051 CODE:
2046 player_apply_below (op); 2052 player_apply_below (op);
2047 2053
2111int convert_item (object *item, object *converter) 2117int convert_item (object *item, object *converter)
2112 2118
2113void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags); 2119void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags);
2114 2120
2115MODULE = cf PACKAGE = cf::object PREFIX = cf_ 2121MODULE = 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 2122
2120object *new (utf8_string archetype = 0) 2123object *new (utf8_string archetype = 0)
2121 PROTOTYPE: ;$ 2124 PROTOTYPE: ;$
2122 CODE: 2125 CODE:
2123 RETVAL = archetype 2126 RETVAL = archetype
2124 ? archetype::get (archetype) 2127 ? archetype::get (archetype)
2125 : object::create (); 2128 : object::create ();
2126 OUTPUT: 2129 OUTPUT: RETVAL
2127 RETVAL
2128 2130
2129object *generate (utf8_string arch, object *creator) 2131object *generate (utf8_string arch, object *creator)
2130 CODE: 2132 CODE:
2131 object *obj = archetype::get (arch); 2133 object *obj = archetype::get (arch);
2132 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL); 2134 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL);
2133 RETVAL = obj; 2135 RETVAL = obj;
2134 OUTPUT: 2136 OUTPUT: RETVAL
2135 RETVAL
2136 2137
2137object *find_object (U32 tag) 2138object *find_object (U32 tag)
2138 2139
2139object *find_object_uuid (UUID i) 2140object *find_object_uuid (UUID i)
2140 2141
2146 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y); 2147 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y);
2147 2148
2148 if (RETVAL->destroyed ()) 2149 if (RETVAL->destroyed ())
2149 RETVAL = 0; 2150 RETVAL = 0;
2150} 2151}
2151 OUTPUT: 2152 OUTPUT: RETVAL
2152 RETVAL
2153 2153
2154shstr 2154shstr
2155object::kv_get (shstr key) 2155object::kv_get (shstr key)
2156 CODE: 2156 CODE:
2157 RETVAL = THIS->kv.get (key); 2157 RETVAL = THIS->kv.get (key);
2158 OUTPUT: 2158 OUTPUT: RETVAL
2159 RETVAL
2160 2159
2161void 2160void
2162object::kv_del (shstr key) 2161object::kv_del (shstr key)
2163 CODE: 2162 CODE:
2164 THIS->kv.del (key); 2163 THIS->kv.del (key);
2263#d# TODO: replace by blocked_los accessor, fix code using this 2262#d# TODO: replace by blocked_los accessor, fix code using this
2264bool 2263bool
2265cell_visible (player *pl, int dx, int dy) 2264cell_visible (player *pl, int dx, int dy)
2266 CODE: 2265 CODE:
2267 RETVAL = pl->blocked_los (dx, dy) != LOS_BLOCKED; 2266 RETVAL = pl->blocked_los (dx, dy) != LOS_BLOCKED;
2268 OUTPUT: 2267 OUTPUT: RETVAL
2269 RETVAL
2270 2268
2271void 2269void
2272send (player *pl, SV *packet) 2270send (player *pl, SV *packet)
2273 CODE: 2271 CODE:
2274{ 2272{
2350outdoor_darkness (int darkness = 0) 2348outdoor_darkness (int darkness = 0)
2351 CODE: 2349 CODE:
2352 RETVAL = maptile::outdoor_darkness; 2350 RETVAL = maptile::outdoor_darkness;
2353 if (items) 2351 if (items)
2354 maptile::outdoor_darkness = darkness; 2352 maptile::outdoor_darkness = darkness;
2355 OUTPUT: 2353 OUTPUT: RETVAL
2356 RETVAL
2357 2354
2358void 2355void
2359maptile::instantiate () 2356maptile::instantiate ()
2360 2357
2361maptile *new () 2358maptile *new ()
2362 PROTOTYPE: 2359 PROTOTYPE:
2363 CODE: 2360 CODE:
2364 RETVAL = new maptile; 2361 RETVAL = new maptile;
2365 OUTPUT: 2362 OUTPUT: RETVAL
2366 RETVAL
2367 2363
2368void 2364void
2369maptile::players () 2365maptile::players ()
2370 PPCODE: 2366 PPCODE:
2371 if (GIMME_V == G_SCALAR) 2367 if (GIMME_V == G_SCALAR)
2391 croak ("maptile::add_underlay: palette must be arrayref"); 2387 croak ("maptile::add_underlay: palette must be arrayref");
2392 2388
2393 palette = SvRV (palette); 2389 palette = SvRV (palette);
2394 2390
2395 STRLEN idxlen; 2391 STRLEN idxlen;
2396 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen); 2392 const uint8 *idx = (const uint8 *)SvPVbyte (data, idxlen);
2397 2393
2398 for (int x = 0; x < THIS->width; ++x) 2394 for (int x = 0; x < THIS->width; ++x)
2399 for (int y = 0; y < THIS->height; ++y) 2395 for (int y = 0; y < THIS->height; ++y)
2400 { 2396 {
2401 for (object *op = THIS->at (x, y).bot; op; op = op->above) 2397 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2441 croak ("maptile::set_regiondata: palette must be arrayref"); 2437 croak ("maptile::set_regiondata: palette must be arrayref");
2442 2438
2443 palette = SvRV (palette); 2439 palette = SvRV (palette);
2444 2440
2445 STRLEN idxlen; 2441 STRLEN idxlen;
2446 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen); 2442 const uint8 *idx = (const uint8 *)SvPVbyte (data, idxlen);
2447 2443
2448 region_ptr *regionmap = new region_ptr [av_len ((AV *)palette) + 1]; 2444 region_ptr *regionmap = new region_ptr [av_len ((AV *)palette) + 1];
2449 uint8_t *regions = salloc<uint8_t> (THIS->size ()); 2445 uint8 *regions = salloc<uint8_t> (THIS->size ());
2450 2446
2451 for (int i = av_len ((AV *)palette) + 1; i--; ) 2447 for (int i = av_len ((AV *)palette) + 1; i--; )
2452 regionmap [i] = region::find (cfSvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1))); 2448 regionmap [i] = region::find (cfSvPVutf8_nolen (*av_fetch ((AV *)palette, i, 1)));
2453 2449
2454 for (int y = 0; y < THIS->height; ++y) 2450 for (int y = 0; y < THIS->height; ++y)
2506 if (!pos.move (dir).normalise ()) 2502 if (!pos.move (dir).normalise ())
2507 XSRETURN_UNDEF; 2503 XSRETURN_UNDEF;
2508 2504
2509 RETVAL = &*pos; 2505 RETVAL = &*pos;
2510} 2506}
2511 OUTPUT: 2507 OUTPUT: RETVAL
2512 RETVAL
2513 2508
2514void 2509void
2515at (maptile *map, unsigned int x, unsigned int y, int dir = 0) 2510at (maptile *map, unsigned int x, unsigned int y, int dir = 0)
2516 PROTOTYPE: $$$;$ 2511 PROTOTYPE: $$$;$
2517 PPCODE: 2512 PPCODE:
2558# worst xs function of my life 2553# worst xs function of my life
2559bool 2554bool
2560_create_random_map (maptile *self, SV *options) 2555_create_random_map (maptile *self, SV *options)
2561 CODE: 2556 CODE:
2562{ 2557{
2563 random_map_params rmp ((HV *)SvRV (options)); 2558 random_map_params rmp ((HV *)SvRV (options));
2564 RETVAL = self->generate_random_map (&rmp); 2559 RETVAL = self->generate_random_map (&rmp);
2565} 2560}
2566 OUTPUT: 2561 OUTPUT: RETVAL
2567 RETVAL
2568 2562
2569MODULE = cf PACKAGE = cf::mapspace 2563MODULE = cf PACKAGE = cf::mapspace
2570 2564
2571INCLUDE: $PERL $srcdir/genacc mapspace $srcdir/../include/map.h | 2565INCLUDE: $PERL $srcdir/genacc mapspace $srcdir/../include/map.h |
2572 2566
2579 2573
2580archetype *archetypes (U32 index) 2574archetype *archetypes (U32 index)
2581 CODE: 2575 CODE:
2582 RETVAL = index < archetypes.size () ? archetypes [index] : 0; 2576 RETVAL = index < archetypes.size () ? archetypes [index] : 0;
2583 OUTPUT: RETVAL 2577 OUTPUT: RETVAL
2578
2579int skillvec_size ()
2580 CODE:
2581 RETVAL = skillvec.size ();
2582 OUTPUT: RETVAL
2583
2584archetype *skillvec (U32 index)
2585 CODE:
2586 RETVAL = index < skillvec.size () ? (archetype *)(object *)skillvec [index] : 0;
2587 OUTPUT: RETVAL
2588
2589void
2590find_by_type (int type)
2591 PPCODE:
2592 for_all_archetypes (arch)
2593 if (arch->type == type)
2594 XPUSHs (sv_2mortal (to_sv (arch)));
2584 2595
2585INCLUDE: $PERL $srcdir/genacc archetype $srcdir/../include/object.h | 2596INCLUDE: $PERL $srcdir/genacc archetype $srcdir/../include/object.h |
2586 2597
2587MODULE = cf PACKAGE = cf::party 2598MODULE = cf PACKAGE = cf::party
2588 2599
2681 if (RETVAL) 2692 if (RETVAL)
2682 { 2693 {
2683 THIS->send_face (RETVAL, pri); 2694 THIS->send_face (RETVAL, pri);
2684 THIS->flush_fx (); 2695 THIS->flush_fx ();
2685 } 2696 }
2686 OUTPUT: 2697 OUTPUT: RETVAL
2687 RETVAL
2688 2698
2689int 2699int
2690client::fx_want (int idx, int value = -1) 2700client::fx_want (int idx, int value = -1)
2691 CODE: 2701 CODE:
2692 if (0 < idx && idx < FT_NUM) 2702 if (0 < idx && idx < FT_NUM)
2695 if (items > 2) 2705 if (items > 2)
2696 THIS->fx_want [idx] = value; 2706 THIS->fx_want [idx] = value;
2697 } 2707 }
2698 else 2708 else
2699 RETVAL = 0; 2709 RETVAL = 0;
2700 OUTPUT: 2710 OUTPUT: RETVAL
2701 RETVAL
2702 2711
2703MODULE = cf PACKAGE = cf::sound PREFIX = sound_ 2712MODULE = cf PACKAGE = cf::sound PREFIX = sound_
2704 2713
2705faceidx sound_find (utf8_string name) 2714faceidx sound_find (utf8_string name)
2706 2715
2753 case 2: f->magicmap = value; break; 2762 case 2: f->magicmap = value; break;
2754 case 3: f->smooth = value; break; 2763 case 3: f->smooth = value; break;
2755 case 4: f->smoothlevel = value; break; 2764 case 4: f->smoothlevel = value; break;
2756 } 2765 }
2757 2766
2758void set_data (faceidx idx, int faceset, SV *data, SV *chksum) 2767void set_csum (faceidx idx, int faceset, SV *chksum)
2759 CODE: 2768 CODE:
2760{ 2769{
2761 faceinfo *f = face_info (idx); assert (f); 2770 faceinfo *f = face_info (idx); assert (f);
2762 facedata *d = f->face + faceset; 2771 facedata *d = f->face + faceset;
2763 sv_to (data, d->data);
2764 STRLEN clen; 2772 STRLEN clen;
2765 char *cdata = SvPVbyte (chksum, clen); 2773 char *cdata = SvPVbyte (chksum, clen);
2766 clen = min (CHKSUM_MAXLEN, clen);
2767 2774
2775 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)); 2776 assert (("cf::face::set_data must be called with a non-empty checksum", clen));
2769 2777
2770 if (clen != d->chksum_len || memcmp (d->chksum, cdata, clen)) 2778 if (clen != d->chksum_len || memcmp (d->chksum, cdata, clen))
2771 { 2779 {
2772 d->chksum_len = clen; 2780 d->chksum_len = clen;
2773 memcpy (d->chksum, cdata, clen); 2781 memcpy (d->chksum, cdata, clen);
2774 2782
2775 // invalidate existing client face info 2783 // invalidate existing client face info
2776 for_all_clients (ns) 2784 for_all_clients (ns)
2777 if (ns->faceset == faceset) 2785 ns->invalidate_face (idx);
2778 {
2779 ns->faces_sent [idx] = false;
2780 ns->force_newmap = true;
2781 }
2782 } 2786 }
2783} 2787}
2784 2788
2785int get_data_size (faceidx idx, int faceset = 0) 2789SV *mangle_csum (SV *chksum)
2786 CODE: 2790 CODE:
2787 facedata *d = face_data (idx, faceset); 2791 STRLEN len;
2788 if (!d) XSRETURN_UNDEF; 2792 char *data = SvPVbyte (chksum, len);
2789 RETVAL = d->data.size (); 2793 RETVAL = newSVpvn (data, min (len, CHKSUM_MAXLEN));
2790 OUTPUT: 2794 OUTPUT: RETVAL
2791 RETVAL
2792 2795
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) 2796SV *get_csum (faceidx idx, int faceset = 0)
2802 CODE: 2797 CODE:
2803 facedata *d = face_data (idx, faceset); 2798 facedata *d = face_data (idx, faceset);
2804 if (!d) XSRETURN_UNDEF; 2799 if (!d) XSRETURN_UNDEF;
2805 RETVAL = newSVpvn ((char *)d->chksum, d->chksum_len); 2800 RETVAL = newSVpvn ((char *)d->chksum, d->chksum_len);
2806 OUTPUT: 2801 OUTPUT: RETVAL
2807 RETVAL
2808 2802
2809int get_type (faceidx idx) 2803int get_type (faceidx idx)
2810 CODE: 2804 CODE:
2811 faceinfo *f = face_info (idx); 2805 faceinfo *f = face_info (idx);
2812 if (!f) XSRETURN_UNDEF; 2806 if (!f) XSRETURN_UNDEF;
2813 RETVAL = f->type; 2807 RETVAL = f->type;
2814 OUTPUT: 2808 OUTPUT: RETVAL
2815 RETVAL
2816 2809
2817SV *get_data (faceidx idx, int faceset = 0) 2810SV *get_name (faceidx idx)
2818 CODE: 2811 CODE:
2819 facedata *d = face_data (idx, faceset); 2812 faceinfo *f = face_info (idx);
2820 if (!d) XSRETURN_UNDEF; 2813 if (!f) XSRETURN_UNDEF;
2821 RETVAL = newSVpvn (d->data, d->data.size ()); 2814 RETVAL = to_sv (f->name);
2822 OUTPUT: 2815 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 2816
2833void invalidate (faceidx idx) 2817void invalidate (faceidx idx)
2834 CODE: 2818 CODE:
2835 for_all_clients (ns) 2819 for_all_clients (ns)
2836 ns->invalidate_face (idx); 2820 ns->invalidate_face (idx);
2900bool 2884bool
2901errors_are_fatal (bool fatal) 2885errors_are_fatal (bool fatal)
2902 CODE: 2886 CODE:
2903 RETVAL = object_thawer::errors_are_fatal; 2887 RETVAL = object_thawer::errors_are_fatal;
2904 object_thawer::errors_are_fatal = fatal; 2888 object_thawer::errors_are_fatal = fatal;
2905 OUTPUT: 2889 OUTPUT: RETVAL
2906 RETVAL
2907 2890
2908SV * 2891SV *
2909new_from_file (char *klass, octet_string path) 2892new_from_file (char *klass, octet_string path)
2910 CODE: 2893 CODE:
2911 object_thawer *f = new object_thawer (path); 2894 object_thawer *f = new object_thawer (path);
2937 XPUSHs (sv_2mortal (newSVpv_utf8 (self->get_str ()))); 2920 XPUSHs (sv_2mortal (newSVpv_utf8 (self->get_str ())));
2938 2921
2939 self->skip (); 2922 self->skip ();
2940 } 2923 }
2941 2924
2925MODULE = cf PACKAGE = cf::treasurelist
2926
2927# quick hack, because I didn't want to implement accessors for treasurelist.
2928# this asks for even more autogen, actually.
2929
2930void
2931expand (treasurelist *list)
2932 PPCODE:
2933 EXTEND (SP, 3);
2934 PUSHs (sv_2mortal (to_sv (list->name)));
2935 PUSHs (sv_2mortal (to_sv (list->total_chance)));
2936 AV *av = newAV ();
2937 PUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
2938 for (treasure *item = list->items; item; item = item->next)
2939 {
2940 AV *iav = newAV ();
2941 av_push (av, newRV_noinc ((SV *)iav));
2942
2943 av_extend (iav, 7);
2944 av_push (iav, to_sv (item->item));
2945 av_push (iav, to_sv (item->name));
2946 av_push (iav, to_sv (item->change_arch.name));
2947 av_push (iav, to_sv (item->change_arch.title));
2948 av_push (iav, to_sv (item->change_arch.slaying));
2949 av_push (iav, to_sv (item->chance));
2950 av_push (iav, to_sv (item->nrof));
2951 av_push (iav, to_sv (item->magic));
2952 }
2953
2942MODULE = cf PACKAGE = cf::layout 2954MODULE = cf PACKAGE = cf::layout
2943 2955
2944INCLUDE: $PERL $srcdir/genacc layout $srcdir/../include/rmg.h | 2956INCLUDE: $PERL $srcdir/genacc layout $srcdir/../include/rmg.h |
2945 2957

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines