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.79 by root, Sun Sep 28 15:49:08 2008 UTC vs.
Revision 1.86 by elmex, Tue Jan 13 12:07:42 2009 UTC

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
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
543 548
544 if (payload == NULL) 549 if (payload == NULL)
545 return NULL; 550 return NULL;
546 551
547 payload->remove (); 552 payload->remove ();
548 op->destroy (true); 553 op->destroy ();
549 return payload; 554 return payload;
550 } 555 }
551 556
552 case ARROW: 557 case ARROW:
553 if (op->has_active_speed ()) 558 if (op->has_active_speed ())
580fix_stopped_arrow (object *op) 585fix_stopped_arrow (object *op)
581{ 586{
582 if (rndm (0, 99) < op->stats.food) 587 if (rndm (0, 99) < op->stats.food)
583 { 588 {
584 /* Small chance of breaking */ 589 /* Small chance of breaking */
585 op->destroy (true); 590 op->destroy ();
586 return NULL; 591 return NULL;
587 } 592 }
588 593
589 op->set_speed (0); 594 op->set_speed (0);
590 op->direction = 0; 595 op->direction = 0;
631 if (INVOKE_OBJECT (STOP, op)) 636 if (INVOKE_OBJECT (STOP, op))
632 return; 637 return;
633 638
634 if (op->inv) 639 if (op->inv)
635 { 640 {
641 // replace this by straightforward drop to ground?
636 object *payload = op->inv; 642 object *payload = op->inv;
637 643
638 payload->remove ();
639 payload->owner = 0; 644 payload->owner = 0;
640 insert_ob_in_map (payload, op->map, payload, 0); 645 insert_ob_in_map (payload, op->map, payload, 0);
641 op->destroy (); 646 op->destroy ();
642 } 647 }
643 else 648 else
672 * is if the player throws a bomb - the bomb explodes on its own, 677 * is if the player throws a bomb - the bomb explodes on its own,
673 * but this object sticks around. We could handle the cleanup in the 678 * but this object sticks around. We could handle the cleanup in the
674 * bomb code, but there are potential other cases where that could happen, 679 * bomb code, but there are potential other cases where that could happen,
675 * and it is easy enough to clean it up here. 680 * and it is easy enough to clean it up here.
676 */ 681 */
677 if (op->inv == NULL) 682 if (!op->inv)
678 { 683 {
679 op->destroy (); 684 op->destroy ();
680 return; 685 return;
681 } 686 }
682 687
851 856
852 op->remove (); 857 op->remove ();
853 for (i = 0; i < op->stats.food; i++) 858 for (i = 0; i < op->stats.food; i++)
854 { 859 {
855 object *tmp = arch_to_object (op->other_arch); 860 object *tmp = arch_to_object (op->other_arch);
856
857 if (op->type == LAMP)
858 tmp->stats.food = op->stats.food - 1;
859 861
860 tmp->stats.hp = op->stats.hp; /* The only variable it keeps. */ 862 tmp->stats.hp = op->stats.hp; /* The only variable it keeps. */
861 863
862 if (env) 864 if (env)
863 env->insert (tmp); 865 env->insert (tmp);
1165 { 1167 {
1166 creator->stats.hp = -1; 1168 creator->stats.hp = -1;
1167 return; 1169 return;
1168 } 1170 }
1169 1171
1170 if (creator->inv != NULL) 1172 if (creator->inv)
1171 { 1173 {
1172 object *ob; 1174 object *ob;
1173 int i; 1175 int i;
1174 object *ob_to_copy; 1176 object *ob_to_copy;
1175 1177
1213 insert_ob_in_map_at (new_ob, creator->map, creator, 0, creator->x, creator->y); 1215 insert_ob_in_map_at (new_ob, creator->map, creator, 0, creator->x, creator->y);
1214 if (QUERY_FLAG (new_ob, FLAG_FREED)) 1216 if (QUERY_FLAG (new_ob, FLAG_FREED))
1215 return; 1217 return;
1216 1218
1217 if (creator->slaying) 1219 if (creator->slaying)
1218 {
1219 new_ob->name = new_ob->title = creator->slaying; 1220 new_ob->name = new_ob->title = creator->slaying;
1220 }
1221} 1221}
1222 1222
1223/* move_marker --peterm@soda.csua.berkeley.edu 1223/* move_marker --peterm@soda.csua.berkeley.edu
1224 when moved, a marker will search for a player sitting above 1224 when moved, a marker will search for a player sitting above
1225 it, and insert an invisible, weightless force into him 1225 it, and insert an invisible, weightless force into him
1257 } 1257 }
1258 } 1258 }
1259 } 1259 }
1260} 1260}
1261 1261
1262// mapscript objects activate themselves (only) then their timer fires
1263// TODO: maybe they should simply trigger the link like any other object?
1264void
1265move_mapscript (object *op)
1266{
1267 op->set_speed (0);
1268 cfperl_mapscript_activate (op, true, op, 0);
1269}
1270
1271void move_lamp (object *op)
1272{
1273 // if the lamp/torch is off, we should disable it.
1274 if (!op->glow_radius)
1275 {
1276 op->set_speed (0);
1277 return;
1278 }
1279 else
1280 {
1281 // check whether the face might needs to be updated
1282 // (currently this is needed to have already switched on torches
1283 // on maps, as they just set the glow_radius in the archetype)
1284 if (op->other_arch
1285 && (
1286 op->flag [FLAG_ANIMATE]
1287 ? (op->animation_id != op->other_arch->animation_id)
1288 : (op->face != op->other_arch->face)
1289 ))
1290 get_animation_from_arch (op, op->other_arch);
1291 }
1292
1293 // lamps and torches auf maps don't use up their fuel
1294 if (op->is_on_map ())
1295 return;
1296
1297 if (op->stats.food > 0)
1298 {
1299 op->stats.food--;
1300 return;
1301 }
1302
1303 apply_lamp (op, false);
1304}
1305
1262void 1306void
1263process_object (object *op) 1307process_object (object *op)
1264{ 1308{
1265 if (expect_false (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))) 1309 if (expect_false (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)))
1266 return; 1310 return;
1299 { 1343 {
1300 if (QUERY_FLAG (op, FLAG_APPLIED)) 1344 if (QUERY_FLAG (op, FLAG_APPLIED))
1301 remove_force (op); 1345 remove_force (op);
1302 else 1346 else
1303 { 1347 {
1304 op->remove (); 1348 op->remove (); // TODO: really necessary?
1305 1349
1306 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1350 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1307 make_sure_not_seen (op); 1351 make_sure_not_seen (op);
1308 1352
1309 op->destroy (); 1353 op->drop_and_destroy ();
1310 } 1354 }
1311 1355
1312 return; 1356 return;
1313 } 1357 }
1314 } 1358 }
1438 1482
1439 case PLAYER: 1483 case PLAYER:
1440 // players have their own speed-management, so undo the --speed_left 1484 // players have their own speed-management, so undo the --speed_left
1441 ++op->speed_left; 1485 ++op->speed_left;
1442 break; 1486 break;
1443 }
1444}
1445 1487
1488 case MAPSCRIPT:
1489 move_mapscript (op);
1490 break;
1491
1492 case LAMP:
1493 case TORCH:
1494 move_lamp (op);
1495 break;
1496 }
1497}
1498

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines