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.45 by root, Sun Apr 22 13:06:45 2007 UTC vs.
Revision 1.51 by root, Fri May 18 20:45:37 2007 UTC

41 object *tmp; 41 object *tmp;
42 42
43 for (i = 1; i < 9; i += 2) 43 for (i = 1; i < 9; i += 2)
44 if ((tmp = present (DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i])) != NULL) 44 if ((tmp = present (DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i])) != NULL)
45 { 45 {
46 tmp->set_speed (0.1); 46 tmp->set_speed (0.1f);
47 tmp->speed_left = -0.2; 47 tmp->speed_left = -0.2f;
48 } 48 }
49 49
50 if (op->other_arch) 50 if (op->other_arch)
51 { 51 {
52 tmp = arch_to_object (op->other_arch); 52 tmp = arch_to_object (op->other_arch);
69 for (i = 1; i < 9; i += 2) 69 for (i = 1; i < 9; i += 2)
70 { 70 {
71 tmp = present (LOCKED_DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i]); 71 tmp = present (LOCKED_DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i]);
72 if (tmp && tmp->slaying == op->slaying) 72 if (tmp && tmp->slaying == op->slaying)
73 { /* same key both doors */ 73 { /* same key both doors */
74 tmp->set_speed (0.1); 74 tmp->set_speed (0.1f);
75 tmp->speed_left = -0.2; 75 tmp->speed_left = -0.2f;
76 } 76 }
77 } 77 }
78 78
79 if (op->other_arch) 79 if (op->other_arch)
80 { 80 {
220} 220}
221 221
222 222
223void 223void
224move_gate (object *op) 224move_gate (object *op)
225{ /* 1 = going down, 0 = goind up */ 225{ /* 1 = going down, 0 = going up */
226 object *tmp; 226 object *tmp;
227 227
228 if (op->stats.wc < 0 || (int) op->stats.wc >= NUM_ANIMATIONS (op)) 228 if (op->stats.wc < 0 || (int) op->stats.wc >= NUM_ANIMATIONS (op))
229 { 229 {
230 LOG (llevError, "Gate error: animation was %d, max=%d\n", op->stats.wc, NUM_ANIMATIONS (op)); 230 LOG (llevError, "Gate error: animation was %d, max=%d\n", op->stats.wc, NUM_ANIMATIONS (op));
302 */ 302 */
303 if ((int) op->stats.wc >= NUM_ANIMATIONS (op) / 2) 303 if ((int) op->stats.wc >= NUM_ANIMATIONS (op) / 2)
304 { 304 {
305 /* Halfway or further, check blocks */ 305 /* Halfway or further, check blocks */
306 /* First, get the top object on the square. */ 306 /* First, get the top object on the square. */
307 for (tmp = op->above; tmp != NULL && tmp->above != NULL; tmp = tmp->above); 307 for (tmp = op->above; tmp && tmp->above; tmp = tmp->above)
308 ;
308 309
309 if (tmp != NULL) 310 if (tmp)
310 { 311 {
311 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 312 if (QUERY_FLAG (tmp, FLAG_ALIVE))
312 { 313 {
313 hit_player (tmp, random_roll (1, op->stats.dam, tmp, PREFER_LOW), op, AT_PHYSICAL, 1); 314 hit_player (tmp, random_roll (0, op->stats.dam, tmp, PREFER_LOW), op, AT_PHYSICAL, 1);
315
314 if (tmp->type == PLAYER) 316 if (tmp->type == PLAYER)
315 new_draw_info_format (NDI_UNIQUE, 0, tmp, "You are crushed by the %s!", &op->name); 317 new_draw_info_format (NDI_UNIQUE, 0, tmp, "You are crushed by the %s!", &op->name);
316 } 318 }
317 else 319 else
318 /* If the object is not alive, and the object either can 320 /* If the object is not alive, and the object either can
572 return NULL; 574 return NULL;
573 } 575 }
574 576
575 op->set_speed (0); 577 op->set_speed (0);
576 op->direction = 0; 578 op->direction = 0;
577 op->move_on = 0; 579 op->move_on = 0;
578 op->move_type = 0; 580 op->move_type = 0;
581 op->skill = 0; // really?
582
583 // restore original wc, dam, attacktype and slaying
579 op->stats.wc = op->stats.sp; 584 op->stats.wc = op->stats.sp;
580 op->stats.dam = op->stats.hp; 585 op->stats.dam = op->stats.hp;
581 op->attacktype = op->stats.grace; 586 op->attacktype = op->stats.grace;
582 op->slaying = 0;
583 op->skill = 0;
584 587
585 if (op->spellarg != NULL) 588 if (op->spellarg)
586 { 589 {
587 op->slaying = op->spellarg; 590 op->slaying = op->spellarg;
588 free (op->spellarg); 591 free (op->spellarg);
589 op->spellarg = NULL; 592 op->spellarg = 0;
590 } 593 }
591 else 594 else
592 op->slaying = NULL; 595 op->slaying = 0;
593 596
594 /* Reset these to zero, so that object::can_merge will work properly */ 597 /* Reset these to zero, so that object::can_merge will work properly */
595 op->spellarg = NULL; 598 op->spellarg = NULL;
596 op->stats.sp = 0; 599 op->stats.sp = 0;
597 op->stats.hp = 0; 600 op->stats.hp = 0;
626 op->destroy (); 629 op->destroy ();
627 } 630 }
628 else 631 else
629 { 632 {
630 op = fix_stopped_arrow (op); 633 op = fix_stopped_arrow (op);
634
631 if (op) 635 if (op)
632 merge_ob (op, NULL); 636 merge_ob (op, 0);
633 } 637 }
634} 638}
635 639
636/* Move an arrow along its course. op is the arrow or thrown object. 640/* Move an arrow along its course. op is the arrow or thrown object.
637 */ 641 */
1035 * it'll paralyze the victim for hp*his speed/op->speed 1039 * it'll paralyze the victim for hp*his speed/op->speed
1036 */ 1040 */
1037void 1041void
1038move_player_mover (object *op) 1042move_player_mover (object *op)
1039{ 1043{
1040 object *victim, *nextmover;
1041 int dir = op->stats.sp; 1044 int dir = op->stats.sp;
1042 sint16 nx, ny; 1045 sint16 nx, ny;
1043 maptile *m; 1046 maptile *m;
1044 1047
1045 /* Determine direction now for random movers so we do the right thing */ 1048 /* Determine direction now for random movers so we do the right thing */
1046 if (!dir) 1049 if (!dir)
1047 dir = rndm (1, 8); 1050 dir = rndm (1, 8);
1048 1051
1049 for (victim = GET_MAP_OB (op->map, op->x, op->y); victim != NULL; victim = victim->above) 1052 for (object *victim = op->ms ().bot; victim; victim = victim->above)
1050 { 1053 {
1051 if (QUERY_FLAG (victim, FLAG_ALIVE) && !QUERY_FLAG (victim, FLAG_WIZPASS) && 1054 if (QUERY_FLAG (victim, FLAG_ALIVE) && !QUERY_FLAG (victim, FLAG_WIZPASS) &&
1052 (victim->move_type & op->move_type || !victim->move_type)) 1055 (victim->move_type & op->move_type || !victim->move_type))
1053 { 1056 {
1054 1057
1071 } 1074 }
1072 1075
1073 if (should_director_abort (op, victim)) 1076 if (should_director_abort (op, victim))
1074 return; 1077 return;
1075 1078
1076 for (nextmover = GET_MAP_OB (m, nx, ny); nextmover != NULL; nextmover = nextmover->above) 1079 for (object *nextmover = m->at (nx, ny).bot; nextmover; nextmover = nextmover->above)
1077 { 1080 {
1078 if (nextmover->type == PLAYERMOVER) 1081 if (nextmover->type == PLAYERMOVER)
1079 nextmover->speed_left = -.99; 1082 nextmover->speed_left = -.99f;
1083
1080 if (QUERY_FLAG (nextmover, FLAG_ALIVE)) 1084 if (QUERY_FLAG (nextmover, FLAG_ALIVE))
1081 {
1082 op->speed_left = -1.1; /* wait until the next thing gets out of the way */ 1085 op->speed_left = -1.1f; /* wait until the next thing gets out of the way */
1083 }
1084 } 1086 }
1085 1087
1086 if (victim->type == PLAYER) 1088 if (victim->type == PLAYER)
1087 { 1089 {
1088 /* only level >=1 movers move people */ 1090 /* only level >=1 movers move people */
1092 * is cleared, otherwise the player will get stuck in 1094 * is cleared, otherwise the player will get stuck in
1093 * place. This can happen if the player used a spell to 1095 * place. This can happen if the player used a spell to
1094 * get to this space. 1096 * get to this space.
1095 */ 1097 */
1096 victim->contr->fire_on = 0; 1098 victim->contr->fire_on = 0;
1097 victim->speed_left = -FABS (victim->speed); 1099 victim->speed_left = 0.f;
1098 move_player (victim, dir); 1100 move_player (victim, dir);
1099 } 1101 }
1100 else 1102 else
1101 return; 1103 return;
1102 } 1104 }
1106 if (!op->stats.maxsp && op->attacktype) 1108 if (!op->stats.maxsp && op->attacktype)
1107 op->stats.maxsp = 2; 1109 op->stats.maxsp = 2;
1108 1110
1109 if (op->attacktype) 1111 if (op->attacktype)
1110 { /* flag to paralyze the player */ 1112 { /* flag to paralyze the player */
1111
1112 victim->speed_left = -FABS (op->stats.maxsp * victim->speed / op->speed); 1113 victim->speed_left = max (-5.f, -FABS (op->stats.maxsp * victim->speed / op->speed));
1113 /* Not sure why, but for some chars on metalforge, they
1114 * would sometimes get -inf speed_left, and from the
1115 * description, it could only happen here, so just put
1116 * a lower sanity limit. My only guess is that the
1117 * mover has 0 speed.
1118 */
1119 if (victim->speed_left < -5.0)
1120 victim->speed_left = -5.0;
1121 } 1114 }
1122 } 1115 }
1123 } 1116 }
1124} 1117}
1125 1118
1304 } 1297 }
1305 } 1298 }
1306 } 1299 }
1307} 1300}
1308 1301
1309int 1302void
1310process_object (object *op) 1303process_object (object *op)
1311{ 1304{
1312 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) 1305 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))
1313 return 0; 1306 return;
1314 1307
1315 if (INVOKE_OBJECT (TICK, op)) 1308 if (INVOKE_OBJECT (TICK, op))
1316 return 0; 1309 return;
1317 1310
1318 if (QUERY_FLAG (op, FLAG_MONSTER)) 1311 if (QUERY_FLAG (op, FLAG_MONSTER))
1319 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED)) 1312 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED))
1320 return 1; 1313 return;
1321 1314
1322 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0) 1315 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0)
1323 { 1316 {
1324 if (op->type == PLAYER)
1325 animate_object (op, op->facing);
1326 else
1327 animate_object (op, op->direction); 1317 animate_object (op, op->contr ? op->facing : op->direction);
1328 1318
1329 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1319 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1330 make_sure_seen (op); 1320 make_sure_seen (op);
1331 } 1321 }
1332 1322
1323 if (op->flag [FLAG_GENERATOR]
1324 || op->flag [FLAG_CHANGING]
1325 || op->flag [FLAG_IS_USED_UP])
1326 {
1333 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state) 1327 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state)
1334 { 1328 {
1335 change_object (op); 1329 change_object (op);
1336 return 1; 1330 return;
1337 } 1331 }
1338 1332
1339 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY)) 1333 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY))
1340 generate_monster (op); 1334 generate_monster (op);
1341 1335
1342 if (QUERY_FLAG (op, FLAG_IS_USED_UP) && --op->stats.food <= 0) 1336 if (QUERY_FLAG (op, FLAG_IS_USED_UP) && --op->stats.food <= 0)
1343 { 1337 {
1344 if (QUERY_FLAG (op, FLAG_APPLIED)) 1338 if (QUERY_FLAG (op, FLAG_APPLIED))
1345 remove_force (op); 1339 remove_force (op);
1346 else 1340 else
1347 { 1341 {
1348 /* IF necessary, delete the item from the players inventory */ 1342 /* If necessary, delete the item from the players inventory */
1349 object *pl = op->in_player (); 1343 object *pl = op->in_player ();
1350 1344
1351 if (pl) 1345 if (pl)
1352 esrv_del_item (pl->contr, op->count); 1346 esrv_del_item (pl->contr, op->count);
1353 1347
1354 op->remove (); 1348 op->remove ();
1355 1349
1356 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1350 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1357 make_sure_not_seen (op); 1351 make_sure_not_seen (op);
1358 1352
1359 op->destroy (); 1353 op->destroy ();
1360 } 1354 }
1361 1355
1362 return 1; 1356 return;
1357 }
1363 } 1358 }
1364 1359
1365 switch (op->type) 1360 switch (op->type)
1366 { 1361 {
1367 case SPELL_EFFECT: 1362 case SPELL_EFFECT:
1368 move_spell_effect (op); 1363 move_spell_effect (op);
1369 return 1; 1364 break;
1370 1365
1371 case ROD: 1366 case ROD:
1372 case HORN: 1367 case HORN:
1373 regenerate_rod (op); 1368 regenerate_rod (op);
1374 return 1; 1369 break;
1375 1370
1376 case FORCE: 1371 case FORCE:
1377 case POTION_EFFECT: 1372 case POTION_EFFECT:
1378 remove_force (op); 1373 remove_force (op);
1379 return 1; 1374 break;
1380 1375
1381 case BLINDNESS: 1376 case BLINDNESS:
1382 remove_blindness (op); 1377 remove_blindness (op);
1383 return 0; 1378 break;
1384 1379
1385 case POISONING: 1380 case POISONING:
1386 poison_more (op); 1381 poison_more (op);
1387 return 0; 1382 break;
1388 1383
1389 case DISEASE: 1384 case DISEASE:
1390 move_disease (op); 1385 move_disease (op);
1391 return 0; 1386 break;
1392 1387
1393 case SYMPTOM: 1388 case SYMPTOM:
1394 move_symptom (op); 1389 move_symptom (op);
1395 return 0; 1390 break;
1396 1391
1397 case THROWN_OBJ: 1392 case THROWN_OBJ:
1398 case ARROW: 1393 case ARROW:
1399 move_arrow (op); 1394 move_arrow (op);
1400 return 0; 1395 break;
1401 1396
1402 case DOOR: 1397 case DOOR:
1403 remove_door (op); 1398 remove_door (op);
1404 return 0; 1399 break;
1405 1400
1406 case LOCKED_DOOR: 1401 case LOCKED_DOOR:
1407 remove_door2 (op); 1402 remove_door2 (op);
1408 return 0; 1403 break;
1409 1404
1410 case TELEPORTER: 1405 case TELEPORTER:
1411 move_teleporter (op); 1406 move_teleporter (op);
1412 return 0; 1407 break;
1413 1408
1414 case GOLEM: 1409 case GOLEM:
1415 move_golem (op); 1410 move_golem (op);
1416 return 0; 1411 break;
1417 1412
1418 case EARTHWALL: 1413 case EARTHWALL:
1419 hit_player (op, 2, op, AT_PHYSICAL, 1); 1414 hit_player (op, 2, op, AT_PHYSICAL, 1);
1420 return 0; 1415 break;
1421 1416
1422 case FIREWALL: 1417 case FIREWALL:
1423 move_firewall (op); 1418 move_firewall (op);
1424 if (op->stats.maxsp) 1419 if (op->stats.maxsp)
1425 animate_turning (op); 1420 animate_turning (op);
1426 return 0; 1421 break;
1427 1422
1428 case MOOD_FLOOR: 1423 case MOOD_FLOOR:
1429 do_mood_floor (op); 1424 do_mood_floor (op);
1430 return 0; 1425 break;
1431 1426
1432 case GATE: 1427 case GATE:
1433 move_gate (op); 1428 move_gate (op);
1434 return 0; 1429 break;
1435 1430
1436 case TIMED_GATE: 1431 case TIMED_GATE:
1437 move_timed_gate (op); 1432 move_timed_gate (op);
1438 return 0; 1433 break;
1439 1434
1440 case TRIGGER: 1435 case TRIGGER:
1441 case TRIGGER_BUTTON: 1436 case TRIGGER_BUTTON:
1442 case TRIGGER_PEDESTAL: 1437 case TRIGGER_PEDESTAL:
1443 case TRIGGER_ALTAR: 1438 case TRIGGER_ALTAR:
1444 animate_trigger (op); 1439 animate_trigger (op);
1445 return 0; 1440 break;
1446 1441
1447 case DETECTOR: 1442 case DETECTOR:
1448 move_detector (op); 1443 move_detector (op);
1449 1444
1450 case DIRECTOR: 1445 case DIRECTOR:
1451 if (op->stats.maxsp) 1446 if (op->stats.maxsp)
1452 animate_turning (op); 1447 animate_turning (op);
1453 return 0; 1448 break;
1454 1449
1455 case HOLE: 1450 case HOLE:
1456 move_hole (op); 1451 move_hole (op);
1457 return 0; 1452 break;
1458 1453
1459 case DEEP_SWAMP: 1454 case DEEP_SWAMP:
1460 move_deep_swamp (op); 1455 move_deep_swamp (op);
1461 return 0; 1456 break;
1462 1457
1463 case RUNE: 1458 case RUNE:
1464 case TRAP: 1459 case TRAP:
1465 move_rune (op); 1460 move_rune (op);
1466 return 0; 1461 break;
1467 1462
1468 case PLAYERMOVER: 1463 case PLAYERMOVER:
1469 move_player_mover (op); 1464 move_player_mover (op);
1470 return 0; 1465 break;
1471 1466
1472 case CREATOR: 1467 case CREATOR:
1473 move_creator (op); 1468 move_creator (op);
1474 return 0; 1469 break;
1475 1470
1476 case MARKER: 1471 case MARKER:
1477 move_marker (op); 1472 move_marker (op);
1478 return 0; 1473 break;
1479 1474
1480 case PLAYER_CHANGER: 1475 case PLAYER_CHANGER:
1481 move_player_changer (op); 1476 move_player_changer (op);
1482 return 0; 1477 break;
1483 1478
1484 case PEACEMAKER: 1479 case PEACEMAKER:
1485 move_peacemaker (op); 1480 move_peacemaker (op);
1486 return 0; 1481 break;
1487 }
1488 1482
1489 return 0; 1483 case PLAYER:
1484 // players have their own speed-management, so undo the --speed_left
1485 ++op->speed_left;
1486 break;
1487 }
1490} 1488}
1489

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines