ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/time.C
(Generate patch)

Comparing deliantra/server/server/time.C (file contents):
Revision 1.72 by root, Thu Nov 8 19:43:29 2007 UTC vs.
Revision 1.91 by root, Sat Jun 27 03:51:05 2009 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 (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Deliantra is free software: you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
57 tmp->map = op->map; 57 tmp->map = op->map;
58 tmp->level = op->level; 58 tmp->level = op->level;
59 insert_ob_in_map (tmp, op->map, op, 0); 59 insert_ob_in_map (tmp, op->map, op, 0);
60 } 60 }
61 61
62 op->destroy (); 62 op->drop_and_destroy ();
63} 63}
64 64
65void 65void
66remove_door2 (object *op) 66remove_door2 (object *op)
67{ 67{
86 tmp->map = op->map; 86 tmp->map = op->map;
87 tmp->level = op->level; 87 tmp->level = op->level;
88 insert_ob_in_map (tmp, op->map, op, 0); 88 insert_ob_in_map (tmp, op->map, op, 0);
89 } 89 }
90 90
91 op->destroy (); 91 op->drop_and_destroy ();
92} 92}
93 93
94void 94void
95generate_monster (object *gen) 95generate_monster (object *gen)
96{ 96{
97 if (!gen->map) 97 if (!gen->map)
98 return; 98 return;
99 99
100 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1)) 100 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1))
101 return;
102
103 // sleeping generators won't generate, this will make monsters like
104 // centipedes not generate more centipedes when being asleep.
105 if (gen->flag [FLAG_SLEEP])
101 return; 106 return;
102 107
103 object *op; 108 object *op;
104 int dir; 109 int dir;
105 110
117 122
118 dir = find_free_spot (op, gen->map, gen->x, gen->y, 1, SIZEOFFREE1 + 1); 123 dir = find_free_spot (op, gen->map, gen->x, gen->y, 1, SIZEOFFREE1 + 1);
119 if (dir < 0) 124 if (dir < 0)
120 return; 125 return;
121 126
122 op = object_create_clone (op); 127 op = op->deep_clone ();
123 128
124 CLEAR_FLAG (op, FLAG_IS_A_TEMPLATE); 129 CLEAR_FLAG (op, FLAG_IS_A_TEMPLATE);
125 unflag_inv (op, FLAG_IS_A_TEMPLATE); 130 unflag_inv (op, FLAG_IS_A_TEMPLATE);
126 } 131 }
127 else if (gen->other_arch) 132 else if (gen->other_arch)
437 if (op->stats.sp == 1) 442 if (op->stats.sp == 1)
438 { 443 {
439 if (detected && last == 0) 444 if (detected && last == 0)
440 { 445 {
441 op->value = 1; 446 op->value = 1;
442 push_button (op); 447 push_button (op, tmp);
443 } 448 }
444 449
445 if (!detected && last == 1) 450 if (!detected && last == 1)
446 { 451 {
447 op->value = 0; 452 op->value = 0;
448 push_button (op); 453 push_button (op, tmp);
449 } 454 }
450 } 455 }
451 else 456 else
452 { /* in this case, we unset buttons */ 457 { /* in this case, we unset buttons */
453 if (detected && last == 1) 458 if (detected && last == 1)
454 { 459 {
455 op->value = 0; 460 op->value = 0;
456 push_button (op); 461 push_button (op, tmp);
457 } 462 }
458 463
459 if (!detected && last == 0) 464 if (!detected && last == 0)
460 { 465 {
461 op->value = 1; 466 op->value = 1;
462 push_button (op); 467 push_button (op, tmp);
463 } 468 }
464 } 469 }
465} 470}
466 471
467void 472void
480} 485}
481 486
482void 487void
483move_hole (object *op) 488move_hole (object *op)
484{ /* 1 = opening, 0 = closing */ 489{ /* 1 = opening, 0 = closing */
485 object *next, *tmp;
486
487 if (op->value) 490 if (op->value)
488 { /* We're opening */ 491 { /* We're opening */
489 if (--op->stats.wc <= 0) 492 if (--op->stats.wc <= 0)
490 { /* Opened, let's stop */ 493 { /* Opened, let's stop */
491 op->stats.wc = 0; 494 op->stats.wc = 0;
492 op->set_speed (0); 495 op->set_speed (0);
493 496
494 /* Hard coding this makes sense for holes I suppose */ 497 /* Hard coding this makes sense for holes I suppose */
495 op->move_on = MOVE_WALK; 498 op->move_on = MOVE_WALK;
496 for (tmp = op->above; tmp != NULL; tmp = next) 499 for (object *next, *tmp = op->above; tmp; tmp = next)
497 { 500 {
498 next = tmp->above; 501 next = tmp->above;
499 move_apply (op, tmp, tmp); 502 move_apply (op, tmp, tmp);
500 } 503 }
501 } 504 }
543 { 546 {
544 object *payload = op->inv; 547 object *payload = op->inv;
545 548
546 if (payload == NULL) 549 if (payload == NULL)
547 return NULL; 550 return NULL;
551
548 payload->remove (); 552 payload->remove ();
549 op->destroy (); 553 op->destroy ();
550 return payload; 554 return payload;
551 } 555 }
552 556
595 599
596 // restore original wc, dam, attacktype and slaying 600 // restore original wc, dam, attacktype and slaying
597 op->stats.wc = op->stats.sp; 601 op->stats.wc = op->stats.sp;
598 op->stats.dam = op->stats.hp; 602 op->stats.dam = op->stats.hp;
599 op->attacktype = op->stats.grace; 603 op->attacktype = op->stats.grace;
600
601 if (op->spellarg)
602 {
603 op->slaying = op->spellarg; 604 op->slaying = op->spellarg;
604 free (op->spellarg);
605 op->spellarg = 0;
606 }
607 else
608 op->slaying = 0;
609 605
610 /* Reset these to zero, so that object::can_merge will work properly */ 606 /* Reset these to defaults, so that object::can_merge will work properly */
611 op->spellarg = NULL; 607 op->spellarg = 0;
612 op->stats.sp = 0; 608 op->stats.sp = 0;
613 op->stats.hp = 0; 609 op->stats.hp = 0;
614 op->stats.grace = 0; 610 op->stats.grace = 0;
615 op->level = 0; 611 op->level = 0;
616 op->face = op->arch->face; 612 op->face = op->arch->face;
617 op->owner = NULL; /* So that stopped arrows will be saved */ 613 op->owner = 0;
614
618 update_object (op, UP_OBJ_CHANGE); 615 update_object (op, UP_OBJ_CHANGE);
616
619 return op; 617 return op;
620} 618}
621 619
622/* stop_arrow() - what to do when a non-living flying object 620/* stop_arrow() - what to do when a non-living flying object
623 * has to stop. Sept 96 - I added in thrown object code in 621 * has to stop. Sept 96 - I added in thrown object code in
632 if (INVOKE_OBJECT (STOP, op)) 630 if (INVOKE_OBJECT (STOP, op))
633 return; 631 return;
634 632
635 if (op->inv) 633 if (op->inv)
636 { 634 {
635 // replace this by straightforward drop to ground?
637 object *payload = op->inv; 636 object *payload = op->inv;
638 637
639 payload->remove ();
640 payload->owner = 0; 638 payload->owner = 0;
641 insert_ob_in_map (payload, op->map, payload, 0); 639 insert_ob_in_map (payload, op->map, payload, 0);
642 op->destroy (); 640 op->destroy ();
643 } 641 }
644 else 642 else
673 * is if the player throws a bomb - the bomb explodes on its own, 671 * is if the player throws a bomb - the bomb explodes on its own,
674 * but this object sticks around. We could handle the cleanup in the 672 * but this object sticks around. We could handle the cleanup in the
675 * bomb code, but there are potential other cases where that could happen, 673 * bomb code, but there are potential other cases where that could happen,
676 * and it is easy enough to clean it up here. 674 * and it is easy enough to clean it up here.
677 */ 675 */
678 if (op->inv == NULL) 676 if (!op->inv)
679 { 677 {
680 op->destroy (); 678 op->destroy ();
681 return; 679 return;
682 } 680 }
683 681
812 return; 810 return;
813 } 811 }
814 812
815 /* update object image for new facing */ 813 /* update object image for new facing */
816 /* many thrown objects *don't* have more than one face */ 814 /* many thrown objects *don't* have more than one face */
817 if (GET_ANIM_ID (op)) 815 if (op->has_anim ())
818 SET_ANIMATION (op, op->direction); 816 op->set_anim_frame (op->direction);
819 } /* object is reflected */ 817 } /* object is reflected */
820 } /* object ran into a wall */ 818 } /* object ran into a wall */
821 819
822 /* decrease the speed as it flies. 0.05 means a standard bow will shoot 820 /* decrease the speed as it flies. 0.05 means a standard bow will shoot
823 * about 17 squares. Tune as needed. 821 * about 17 squares. Tune as needed.
853 op->remove (); 851 op->remove ();
854 for (i = 0; i < op->stats.food; i++) 852 for (i = 0; i < op->stats.food; i++)
855 { 853 {
856 object *tmp = arch_to_object (op->other_arch); 854 object *tmp = arch_to_object (op->other_arch);
857 855
858 if (op->type == LAMP)
859 tmp->stats.food = op->stats.food - 1;
860
861 tmp->stats.hp = op->stats.hp; /* The only variable it keeps. */ 856 tmp->stats.hp = op->stats.hp; /* The only variable it keeps. */
857
862 if (env) 858 if (env)
863 {
864 tmp = env->insert (tmp); 859 env->insert (tmp);
865
866 /* If this object is the players inventory, we need to tell the
867 * client of the change. Insert_ob_in_map takes care of the
868 * updating the client, so we don't need to do that below.
869 */
870 if (object *pl = op->in_player ())
871 {
872 esrv_del_item (pl->contr, op->count);
873 esrv_send_item (pl, tmp);
874 }
875 }
876 else 860 else
877 { 861 {
878 j = find_first_free_spot (tmp, op->map, op->x, op->y); 862 j = find_first_free_spot (tmp, op->map, op->x, op->y);
879 if (j < 0) /* No free spot */ 863 if (j < 0) /* No free spot */
880 tmp->destroy (); 864 tmp->destroy ();
947 else 931 else
948 { 932 {
949 /* Random teleporter */ 933 /* Random teleporter */
950 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp))) 934 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp)))
951 return; 935 return;
936
952 teleport (head, TELEPORTER, tmp); 937 teleport (head, TELEPORTER, tmp);
953 } 938 }
954} 939}
955 940
956/* This object will teleport someone to a different map 941/* This object will teleport someone to a different map
1176 { 1161 {
1177 creator->stats.hp = -1; 1162 creator->stats.hp = -1;
1178 return; 1163 return;
1179 } 1164 }
1180 1165
1181 if (creator->inv != NULL) 1166 if (creator->inv)
1182 { 1167 {
1183 object *ob; 1168 object *ob;
1184 int i; 1169 int i;
1185 object *ob_to_copy; 1170 object *ob_to_copy;
1186 1171
1191 if (rndm (0, i) == 0) 1176 if (rndm (0, i) == 0)
1192 { 1177 {
1193 ob_to_copy = ob; 1178 ob_to_copy = ob;
1194 } 1179 }
1195 } 1180 }
1196 new_ob = object_create_clone (ob_to_copy); 1181 new_ob = ob_to_copy->deep_clone ();
1197 CLEAR_FLAG (new_ob, FLAG_IS_A_TEMPLATE); 1182 CLEAR_FLAG (new_ob, FLAG_IS_A_TEMPLATE);
1198 unflag_inv (new_ob, FLAG_IS_A_TEMPLATE); 1183 unflag_inv (new_ob, FLAG_IS_A_TEMPLATE);
1199 } 1184 }
1200 else 1185 else
1201 { 1186 {
1202 if (creator->other_arch == NULL) 1187 if (!creator->other_arch)
1203 { 1188 {
1204 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n", 1189 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n",
1205 &creator->name, &creator->map->path, creator->x, creator->y); 1190 &creator->name, &creator->map->path, creator->x, creator->y);
1206 return; 1191 return;
1207 } 1192 }
1224 insert_ob_in_map_at (new_ob, creator->map, creator, 0, creator->x, creator->y); 1209 insert_ob_in_map_at (new_ob, creator->map, creator, 0, creator->x, creator->y);
1225 if (QUERY_FLAG (new_ob, FLAG_FREED)) 1210 if (QUERY_FLAG (new_ob, FLAG_FREED))
1226 return; 1211 return;
1227 1212
1228 if (creator->slaying) 1213 if (creator->slaying)
1229 {
1230 new_ob->name = new_ob->title = creator->slaying; 1214 new_ob->name = new_ob->title = creator->slaying;
1231 }
1232} 1215}
1233 1216
1234/* move_marker --peterm@soda.csua.berkeley.edu 1217/* move_marker --peterm@soda.csua.berkeley.edu
1235 when moved, a marker will search for a player sitting above 1218 when moved, a marker will search for a player sitting above
1236 it, and insert an invisible, weightless force into him 1219 it, and insert an invisible, weightless force into him
1268 } 1251 }
1269 } 1252 }
1270 } 1253 }
1271} 1254}
1272 1255
1256// mapscript objects activate themselves (only) then their timer fires
1257// TODO: maybe they should simply trigger the link like any other object?
1258void
1259move_mapscript (object *op)
1260{
1261 op->set_speed (0);
1262 cfperl_mapscript_activate (op, true, op, 0);
1263}
1264
1265void move_lamp (object *op)
1266{
1267 // if the lamp/torch is off, we should disable it.
1268 if (!op->glow_radius)
1269 {
1270 op->set_speed (0);
1271 return;
1272 }
1273 else
1274 {
1275 // check whether the face might needs to be updated
1276 // (currently this is needed to have already switched on torches
1277 // on maps, as they just set the glow_radius in the archetype)
1278 if (op->other_arch
1279 && (
1280 (op->flag [FLAG_ANIMATE] != op->other_arch->flag [FLAG_ANIMATE])
1281 || (op->flag [FLAG_ANIMATE]
1282 ? (op->animation_id != op->other_arch->animation_id)
1283 : (op->face != op->other_arch->face))
1284 ))
1285 get_animation_from_arch (op, op->other_arch);
1286 }
1287
1288 // lamps and torches auf maps don't use up their fuel
1289 if (op->is_on_map ())
1290 return;
1291
1292 if (op->stats.food > 0)
1293 {
1294 op->stats.food--;
1295 return;
1296 }
1297
1298 apply_lamp (op, false);
1299}
1300
1273void 1301void
1274process_object (object *op) 1302process_object (object *op)
1275{ 1303{
1276 if (expect_false (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))) 1304 if (expect_false (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)))
1277 return; 1305 return;
1310 { 1338 {
1311 if (QUERY_FLAG (op, FLAG_APPLIED)) 1339 if (QUERY_FLAG (op, FLAG_APPLIED))
1312 remove_force (op); 1340 remove_force (op);
1313 else 1341 else
1314 { 1342 {
1315 /* If necessary, delete the item from the players inventory */ 1343 op->remove (); // TODO: really necessary?
1316 if (object *pl = op->in_player ())
1317 esrv_del_item (pl->contr, op->count);
1318
1319 op->remove ();
1320 1344
1321 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1345 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1322 make_sure_not_seen (op); 1346 make_sure_not_seen (op);
1323 1347
1324 op->destroy (); 1348 op->drop_and_destroy ();
1325 } 1349 }
1326 1350
1327 return; 1351 return;
1328 } 1352 }
1329 } 1353 }
1453 1477
1454 case PLAYER: 1478 case PLAYER:
1455 // players have their own speed-management, so undo the --speed_left 1479 // players have their own speed-management, so undo the --speed_left
1456 ++op->speed_left; 1480 ++op->speed_left;
1457 break; 1481 break;
1458 }
1459}
1460 1482
1483 case MAPSCRIPT:
1484 move_mapscript (op);
1485 break;
1486
1487 case LAMP:
1488 case TORCH:
1489 move_lamp (op);
1490 break;
1491 }
1492}
1493

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines