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.402 by root, Sun May 1 13:18:24 2011 UTC vs.
Revision 1.407 by root, Sat Oct 15 00:58:14 2011 UTC

67static int tick_inhibit; 67static int tick_inhibit;
68static int tick_pending; 68static int tick_pending;
69 69
70global gbl_ev; 70global gbl_ev;
71static AV *cb_global, *cb_attachable, *cb_object, *cb_player, *cb_client, *cb_type, *cb_map; 71static AV *cb_global, *cb_attachable, *cb_object, *cb_player, *cb_client, *cb_type, *cb_map;
72static SV *sv_runtime, *sv_tick_start, *sv_next_tick, *sv_now; 72static SV *sv_runtime, *sv_tick_start, *sv_next_tick, *sv_now, *sv_server_tick;
73static AV *av_reflect; 73static AV *av_reflect;
74 74
75bitset<NUM_EVENT_TYPES> ev_want_event; 75bitset<NUM_EVENT_TYPES> ev_want_event;
76bitset<NUM_TYPES> ev_want_type; 76bitset<NUM_TYPES> ev_want_type;
77 77
253 { 253 {
254 static int last_mortalcount; 254 static int last_mortalcount;
255 if (mortals.size () != last_mortalcount) 255 if (mortals.size () != last_mortalcount)
256 { 256 {
257 last_mortalcount = mortals.size (); 257 last_mortalcount = mortals.size ();
258 LOG (llevInfo, "%d mortals.\n", (int)mortals.size ()); 258 object *specimen = is_a<object> (mortals [rndm (mortals.size ())]);
259
260 LOG (llevInfo, "%d mortals (random specimen: %s).\n",
261 (int)mortals.size (), specimen ? specimen->debug_desc () : "(not an object)");
259 262
260 if (0) 263 if (0)
261 { 264 {
262 for (int j = 0; j < mortals.size (); ++j)//D 265 for (int j = 0; j < mortals.size (); ++j)//D
263 fprintf (stderr, "%d:%s %p ", j, &((object *)mortals[j])->name, mortals[j]);//D 266 fprintf (stderr, "%d:%s %p ", j, &((object *)mortals[j])->name, mortals[j]);//D
1404 stash_cf_region_wrap = gv_stashpv ("cf::region::wrap", 1); 1407 stash_cf_region_wrap = gv_stashpv ("cf::region::wrap", 1);
1405 stash_cf_living_wrap = gv_stashpv ("cf::living::wrap", 1); 1408 stash_cf_living_wrap = gv_stashpv ("cf::living::wrap", 1);
1406 stash_cf_layout_wrap = gv_stashpv ("cf::layout::wrap", 1); 1409 stash_cf_layout_wrap = gv_stashpv ("cf::layout::wrap", 1);
1407 stash_ext_map_world = gv_stashpv ("ext::map_world" , 1); 1410 stash_ext_map_world = gv_stashpv ("ext::map_world" , 1);
1408 1411
1409 sv_now = get_sv ("cf::NOW" , 1); SvUPGRADE (sv_now , SVt_NV); 1412 sv_now = get_sv ("cf::NOW" , 1); SvUPGRADE (sv_now , SVt_NV);
1410 sv_runtime = get_sv ("cf::RUNTIME" , 1); SvUPGRADE (sv_runtime , SVt_NV); 1413 sv_runtime = get_sv ("cf::RUNTIME" , 1); SvUPGRADE (sv_runtime , SVt_NV);
1414 sv_server_tick = get_sv ("cf::SERVER_TICK", 1); SvUPGRADE (sv_server_tick, SVt_IV);
1411 sv_tick_start = get_sv ("cf::TICK_START", 1); SvUPGRADE (sv_tick_start, SVt_NV); 1415 sv_tick_start = get_sv ("cf::TICK_START" , 1); SvUPGRADE (sv_tick_start , SVt_NV);
1412 sv_next_tick = get_sv ("cf::NEXT_TICK" , 1); SvUPGRADE (sv_next_tick , SVt_NV); 1416 sv_next_tick = get_sv ("cf::NEXT_TICK" , 1); SvUPGRADE (sv_next_tick , SVt_NV);
1413 1417
1414 cb_global = get_av ("cf::CB_GLOBAL", 1); 1418 cb_global = get_av ("cf::CB_GLOBAL", 1);
1415 cb_attachable = get_av ("cf::CB_ATTACHABLE", 1); 1419 cb_attachable = get_av ("cf::CB_ATTACHABLE", 1);
1416 cb_object = get_av ("cf::CB_OBJECT", 1); 1420 cb_object = get_av ("cf::CB_OBJECT", 1);
1417 cb_player = get_av ("cf::CB_PLAYER", 1); 1421 cb_player = get_av ("cf::CB_PLAYER", 1);
1486 const_iv (SAVE_MODE) const_iv (SAVE_DIR_MODE) 1490 const_iv (SAVE_MODE) const_iv (SAVE_DIR_MODE)
1487 1491
1488 const_iv (SK_EXP_ADD_SKILL) const_iv (SK_EXP_TOTAL) const_iv (SK_EXP_NONE) 1492 const_iv (SK_EXP_ADD_SKILL) const_iv (SK_EXP_TOTAL) const_iv (SK_EXP_NONE)
1489 const_iv (SK_SUBTRACT_SKILL_EXP) const_iv (SK_EXP_SKILL_ONLY) 1493 const_iv (SK_SUBTRACT_SKILL_EXP) const_iv (SK_EXP_SKILL_ONLY)
1490 1494
1491 const_iv (MAP_ACTIVE) const_iv (MAP_SWAPPED) const_iv (MAP_LOADING) const_iv (MAP_SAVING)
1492 const_iv (MAP_INACTIVE)
1493
1494 const_iv (KLASS_ATTACHABLE) const_iv (KLASS_GLOBAL) const_iv (KLASS_OBJECT) 1495 const_iv (KLASS_ATTACHABLE) const_iv (KLASS_GLOBAL) const_iv (KLASS_OBJECT)
1495 const_iv (KLASS_CLIENT) const_iv (KLASS_PLAYER) const_iv (KLASS_MAP) 1496 const_iv (KLASS_CLIENT) const_iv (KLASS_PLAYER) const_iv (KLASS_MAP)
1496 1497
1497 const_iv (CS_QUERY_YESNO) const_iv (CS_QUERY_SINGLECHAR) const_iv (CS_QUERY_HIDEINPUT) 1498 const_iv (CS_QUERY_YESNO) const_iv (CS_QUERY_SINGLECHAR) const_iv (CS_QUERY_HIDEINPUT)
1498 1499
1613 { 1614 {
1614 ev_async_send (EV_DEFAULT, &tick_watcher); 1615 ev_async_send (EV_DEFAULT, &tick_watcher);
1615 coroapi::cede (); 1616 coroapi::cede ();
1616 } 1617 }
1617 1618
1618void server_tick () 1619void one_tick ()
1619 CODE: 1620 CODE:
1620{ 1621{
1621 ev_now_update (EV_DEFAULT); 1622 ev_now_update (EV_DEFAULT);
1622 NOW = ev_now (EV_DEFAULT); 1623 NOW = ev_now (EV_DEFAULT);
1623 SvNV_set (sv_now, NOW); SvNOK_only (sv_now); 1624 SvNV_set (sv_now, NOW); SvNOK_only (sv_now);
1624 SvNV_set (sv_tick_start, NOW); SvNOK_only (sv_tick_start); 1625 SvNV_set (sv_tick_start, NOW); SvNOK_only (sv_tick_start);
1625 runtime = SvNVX (sv_runtime); 1626 runtime = SvNVX (sv_runtime);
1626 1627
1628 one_tick ();
1629
1627 server_tick (); 1630 ++server_tick;
1631 SvUV_set (sv_server_tick, server_tick); SvIOK_only_UV (sv_server_tick);
1628 1632
1629 ev_now_update (EV_DEFAULT); 1633 ev_now_update (EV_DEFAULT);
1630 NOW = ev_now (EV_DEFAULT); 1634 NOW = ev_now (EV_DEFAULT);
1631 SvNV_set (sv_now, NOW); SvNOK_only (sv_now); 1635 SvNV_set (sv_now, NOW); SvNOK_only (sv_now);
1636
1632 runtime += TICK; 1637 runtime += TICK;
1633 SvNV_set (sv_runtime, runtime); SvNOK_only (sv_runtime); 1638 SvNV_set (sv_runtime, runtime); SvNOK_only (sv_runtime);
1634} 1639}
1635 1640
1636NV floor (NV x) 1641NV floor (NV x)
2103# dumb kludgy misdesigned plug-in api slowly gets on my nerves. 2108# dumb kludgy misdesigned plug-in api slowly gets on my nerves.
2104 2109
2105object *new (utf8_string archetype = 0) 2110object *new (utf8_string archetype = 0)
2106 PROTOTYPE: ;$ 2111 PROTOTYPE: ;$
2107 CODE: 2112 CODE:
2108 RETVAL = archetype ? get_archetype (archetype) : object::create (); 2113 RETVAL = archetype
2114 ? archetype::get (archetype)
2115 : object::create ();
2109 OUTPUT: 2116 OUTPUT:
2110 RETVAL 2117 RETVAL
2111 2118
2112object *generate (utf8_string arch, object *creator) 2119object *generate (utf8_string arch, object *creator)
2113 CODE: 2120 CODE:
2114 object *obj = get_archetype (arch); 2121 object *obj = archetype::get (arch);
2115 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL); 2122 fix_generated_item (obj, creator, 0, 0, GT_MINIMAL);
2116 RETVAL = obj; 2123 RETVAL = obj;
2117 OUTPUT: 2124 OUTPUT:
2118 RETVAL 2125 RETVAL
2119 2126
2129 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y); 2136 RETVAL = insert_ob_in_map_at (ob, where, orig, flag, x, y);
2130 2137
2131 if (RETVAL->destroyed ()) 2138 if (RETVAL->destroyed ())
2132 RETVAL = 0; 2139 RETVAL = 0;
2133} 2140}
2141 OUTPUT:
2142 RETVAL
2134 2143
2135shstr 2144shstr
2136object::kv_get (shstr key) 2145object::kv_get (shstr key)
2137 CODE: 2146 CODE:
2138 RETVAL = THIS->kv.get (key); 2147 RETVAL = THIS->kv.get (key);
2357 for_all_players (pl) 2366 for_all_players (pl)
2358 if (pl->ob && pl->ob->map == THIS) 2367 if (pl->ob && pl->ob->map == THIS)
2359 PUSHs (sv_2mortal (to_sv (pl->ob))); 2368 PUSHs (sv_2mortal (to_sv (pl->ob)));
2360 } 2369 }
2361 2370
2362#if 0
2363
2364void 2371void
2365maptile::add_quadland (int mx, int my, int mz, SV *biome_map, SV *biome_plt) 2372maptile::gen_quadmap (int x, int y, int z)
2366 CODE: 2373 CODE:
2367{ 2374 gen_quadmap (THIS, x * 50, y * 50, z);
2368 static frac_gen<vec2d> frac;
2369 2375
2376void
2377maptile::add_underlay (SV *data, int offset, int stride, SV *palette)
2378 CODE:
2379{
2370 if (!SvROK (biome_plt) || SvTYPE (SvRV (biome_plt)) != SVt_PVAV) 2380 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2371 croak ("maptile::add_quadland: biome_plt must be arrayref"); 2381 croak ("maptile::add_underlay: palette must be arrayref");
2372 2382
2373 biome_plt = SvRV (biome_plt); 2383 palette = SvRV (palette);
2374 2384
2385 STRLEN idxlen;
2375 const uint8_t *bmap = (const uint8_t *)SvPVbyte_nolen (biome_map); 2386 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2376 2387
2377 for (int x = 0; x < THIS->width; ++x) 2388 for (int x = 0; x < THIS->width; ++x)
2378 for (int y = 0; y < THIS->height; ++y) 2389 for (int y = 0; y < THIS->height; ++y)
2379 { 2390 {
2380 for (object *op = THIS->at (x, y).bot; op; op = op->above) 2391 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2381 if (op->flag [FLAG_IS_FLOOR]) 2392 if (op->flag [FLAG_IS_FLOOR])
2382 goto skip; 2393 goto skip;
2383 2394
2384 { 2395 {
2385 float fx = mx * THIS->width + x;
2386 float fy = my * THIS->height + y;
2387
2388 int temp = clamp (int (32 * frac.fBm (vec2d (fx * 0.001, fy * 0.001), 2) ) - 8, 0, 15);
2389 int rain = clamp (int (16 * frac.ridgedmultifractal (vec2d (fx * 0.01, fy * 0.01), 3, 1.03, 2)) - 8, 0, 15);
2390
2391 rain = lerp (rain, 0, 15, 0, temp);
2392 printf ("rain %d\n", temp);//D
2393
2394 int biome = bmap [rain * 16 + temp];
2395
2396 //printf ("%2d %2d => %s\n", temp, rain, SvPV_nolen (AvARRAY ((AV *)biome_plt)[biome]));//D
2397#if 1
2398 if (SV **elem = av_fetch ((AV *)biome_plt, bmap [rain * 16 + temp], 0))
2399 {
2400 object *ob = get_archetype (cfSvPVutf8_nolen (*elem));
2401 ob->flag [FLAG_NO_MAP_SAVE] = true;
2402 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY);
2403
2404 if (ob->randomitems && !ob->above)
2405 {
2406 ob->create_treasure (ob->randomitems);
2407
2408 for (object *op = ob->above; op; op = op->above)
2409 op->flag [FLAG_NO_MAP_SAVE] = true;
2410 }
2411 }
2412#endif
2413 }
2414 skip: ;
2415 }
2416}
2417
2418#endif
2419
2420void
2421maptile::add_underlay (SV *data, int offset, int stride, SV *palette)
2422 CODE:
2423{
2424 if (!SvROK (palette) || SvTYPE (SvRV (palette)) != SVt_PVAV)
2425 croak ("maptile::add_underlay: palette must be arrayref");
2426
2427 palette = SvRV (palette);
2428
2429 STRLEN idxlen;
2430 const uint8_t *idx = (const uint8_t *)SvPVbyte (data, idxlen);
2431
2432 for (int x = 0; x < THIS->width; ++x)
2433 for (int y = 0; y < THIS->height; ++y)
2434 {
2435 for (object *op = THIS->at (x, y).bot; op; op = op->above)
2436 if (op->flag [FLAG_IS_FLOOR])
2437 goto skip;
2438
2439 {
2440 int offs = offset + y * stride + x; 2396 int offs = offset + y * stride + x;
2441 2397
2442 if (IN_RANGE_EXC (offs, 0, idxlen)) 2398 if (IN_RANGE_EXC (offs, 0, idxlen))
2443 { 2399 {
2444 if (SV **elem = av_fetch ((AV *)palette, idx [offs], 0)) 2400 if (SV **elem = av_fetch ((AV *)palette, idx [offs], 0))
2445 { 2401 {
2446 object *ob = get_archetype (cfSvPVutf8_nolen (*elem)); 2402 object *ob = archetype::get (cfSvPVutf8_nolen (*elem));
2447 ob->flag [FLAG_NO_MAP_SAVE] = true; 2403 ob->flag [FLAG_NO_MAP_SAVE] = true;
2448 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY); 2404 THIS->insert (ob, x, y, 0, INS_ABOVE_FLOOR_ONLY);
2449 2405
2450 if (ob->randomitems && !ob->above) 2406 if (ob->randomitems && !ob->above)
2451 { 2407 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines