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.24 by root, Mon Dec 25 11:25:50 2006 UTC vs.
Revision 1.35 by root, Tue Jan 9 01:28:32 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 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
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24/* 25/*
25 * Routines that is executed from objects based on their speed have been 26 * Routines that is executed from objects based on their speed have been
26 * collected in this file. 27 * collected in this file.
27 */ 28 */
28
29#include <global.h> 29#include <global.h>
30#include <spells.h> 30#include <spells.h>
31#ifndef __CEXTRACT__
32# include <sproto.h> 31#include <sproto.h>
33#endif
34 32
35/* The following removes doors. The functions check to see if similar 33/* The following removes doors. The functions check to see if similar
36 * doors are next to the one that is being removed, and if so, set it 34 * doors are next to the one that is being removed, and if so, set it
37 * so those will be removed shortly (in a cascade like fashion.) 35 * so those will be removed shortly (in a cascade like fashion.)
38 */ 36 */
39
40void 37void
41remove_door (object *op) 38remove_door (object *op)
42{ 39{
43 int i; 40 int i;
44 object *tmp; 41 object *tmp;
45 42
46 for (i = 1; i < 9; i += 2) 43 for (i = 1; i < 9; i += 2)
47 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)
48 { 45 {
49 tmp->speed = 0.1; 46 tmp->set_speed (0.1);
50 update_ob_speed (tmp);
51 tmp->speed_left = -0.2; 47 tmp->speed_left = -0.2;
52 } 48 }
53 49
54 if (op->other_arch) 50 if (op->other_arch)
55 { 51 {
73 for (i = 1; i < 9; i += 2) 69 for (i = 1; i < 9; i += 2)
74 { 70 {
75 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]);
76 if (tmp && tmp->slaying == op->slaying) 72 if (tmp && tmp->slaying == op->slaying)
77 { /* same key both doors */ 73 { /* same key both doors */
78 tmp->speed = 0.1; 74 tmp->set_speed (0.1);
79 update_ob_speed (tmp);
80 tmp->speed_left = -0.2; 75 tmp->speed_left = -0.2;
81 } 76 }
82 } 77 }
78
83 if (op->other_arch) 79 if (op->other_arch)
84 { 80 {
85 tmp = arch_to_object (op->other_arch); 81 tmp = arch_to_object (op->other_arch);
86 tmp->x = op->x; 82 tmp->x = op->x;
87 tmp->y = op->y; 83 tmp->y = op->y;
205remove_force (object *op) 201remove_force (object *op)
206{ 202{
207 if (--op->duration > 0) 203 if (--op->duration > 0)
208 return; 204 return;
209 205
206 if (op->env)
210 switch (op->subtype) 207 switch (op->subtype)
211 { 208 {
212 case FORCE_CONFUSION: 209 case FORCE_CONFUSION:
213 if (op->env != NULL)
214 {
215 CLEAR_FLAG (op->env, FLAG_CONFUSED); 210 CLEAR_FLAG (op->env, FLAG_CONFUSED);
216 new_draw_info (NDI_UNIQUE, 0, op->env, "You regain your senses.\n"); 211 new_draw_info (NDI_UNIQUE, 0, op->env, "You regain your senses.\n");
217 }
218 212
219 default: 213 default:
220 if (op->env != NULL)
221 {
222 CLEAR_FLAG (op, FLAG_APPLIED); 214 CLEAR_FLAG (op, FLAG_APPLIED);
223 change_abil (op->env, op); 215 change_abil (op->env, op);
224 op->env->update_stats (); 216 op->env->update_stats ();
225 }
226 } 217 }
227 218
228 op->destroy (); 219 op->destroy ();
229} 220}
230 221
231void 222void
234 if (--op->stats.food > 0) 225 if (--op->stats.food > 0)
235 return; 226 return;
236 227
237 CLEAR_FLAG (op, FLAG_APPLIED); 228 CLEAR_FLAG (op, FLAG_APPLIED);
238 229
239 if (op->env != NULL) 230 if (op->env)
240 { 231 {
241 change_abil (op->env, op); 232 change_abil (op->env, op);
242 op->env->update_stats (); 233 op->env->update_stats ();
243 } 234 }
244 235
273 if (op->env->type == PLAYER) 264 if (op->env->type == PLAYER)
274 { 265 {
275 op->env->stats.food--; 266 op->env->stats.food--;
276 new_draw_info (NDI_UNIQUE, 0, op->env, "You feel very sick..."); 267 new_draw_info (NDI_UNIQUE, 0, op->env, "You feel very sick...");
277 } 268 }
269
278 (void) hit_player (op->env, op->stats.dam, op, AT_INTERNAL, 1); 270 hit_player (op->env, op->stats.dam, op, AT_INTERNAL, 1);
279} 271}
280 272
281 273
282void 274void
283move_gate (object *op) 275move_gate (object *op)
297 { /* Reached bottom, let's stop */ 289 { /* Reached bottom, let's stop */
298 op->stats.wc = 0; 290 op->stats.wc = 0;
299 if (op->arch->clone.speed) 291 if (op->arch->clone.speed)
300 op->value = 0; 292 op->value = 0;
301 else 293 else
302 {
303 op->speed = 0; 294 op->set_speed (0);
304 update_ob_speed (op);
305 } 295 }
306 } 296
307 if ((int) op->stats.wc < (NUM_ANIMATIONS (op) / 2 + 1)) 297 if ((int) op->stats.wc < (NUM_ANIMATIONS (op) / 2 + 1))
308 { 298 {
309 op->move_block = 0; 299 op->move_block = 0;
310 CLEAR_FLAG (op, FLAG_BLOCKSVIEW); 300 CLEAR_FLAG (op, FLAG_BLOCKSVIEW);
311 update_all_los (op->map, op->x, op->y); 301 update_all_los (op->map, op->x, op->y);
312 } 302 }
303
313 SET_ANIMATION (op, op->stats.wc); 304 SET_ANIMATION (op, op->stats.wc);
314 update_object (op, UP_OBJ_CHANGE); 305 update_object (op, UP_OBJ_CHANGE);
315 return; 306 return;
316 } 307 }
317 308
334 if (tmp == NULL) 325 if (tmp == NULL)
335 { 326 {
336 if (op->arch->clone.speed) 327 if (op->arch->clone.speed)
337 op->value = 1; 328 op->value = 1;
338 else 329 else
339 {
340 op->speed = 0; 330 op->set_speed (0);
341 update_ob_speed (op); /* Reached top, let's stop */ 331
342 }
343 return; 332 return;
344 } 333 }
345 } 334 }
346 335
347 if (op->stats.food) 336 if (op->stats.food)
438 } 427 }
439 if (--op->stats.hp <= 0) 428 if (--op->stats.hp <= 0)
440 { /* keep gate down */ 429 { /* keep gate down */
441 move_gate (op); 430 move_gate (op);
442 if (op->value != v) 431 if (op->value != v)
443 { /* ready ? */
444 op->speed = 0; 432 op->set_speed (0);
445 update_ob_speed (op);
446 }
447 } 433 }
448} 434}
449 435
450/* slaying: name of the thing the detector is to look for 436/* slaying: name of the thing the detector is to look for
451 * speed: frequency of 'glances' 437 * speed: frequency of 'glances'
538 if (op->value) 524 if (op->value)
539 { /* We're opening */ 525 { /* We're opening */
540 if (--op->stats.wc <= 0) 526 if (--op->stats.wc <= 0)
541 { /* Opened, let's stop */ 527 { /* Opened, let's stop */
542 op->stats.wc = 0; 528 op->stats.wc = 0;
543 op->speed = 0; 529 op->set_speed (0);
544 update_ob_speed (op);
545 530
546 /* Hard coding this makes sense for holes I suppose */ 531 /* Hard coding this makes sense for holes I suppose */
547 op->move_on = MOVE_WALK; 532 op->move_on = MOVE_WALK;
548 for (tmp = op->above; tmp != NULL; tmp = next) 533 for (tmp = op->above; tmp != NULL; tmp = next)
549 { 534 {
550 next = tmp->above; 535 next = tmp->above;
551 move_apply (op, tmp, tmp); 536 move_apply (op, tmp, tmp);
552 } 537 }
553 } 538 }
539
554 SET_ANIMATION (op, op->stats.wc); 540 SET_ANIMATION (op, op->stats.wc);
555 update_object (op, UP_OBJ_FACE); 541 update_object (op, UP_OBJ_FACE);
556 return; 542 return;
557 } 543 }
558 /* We're closing */ 544 /* We're closing */
559 op->move_on = 0; 545 op->move_on = 0;
560 546
561 op->stats.wc++; 547 op->stats.wc++;
562 if ((int) op->stats.wc >= NUM_ANIMATIONS (op)) 548 if ((int) op->stats.wc >= NUM_ANIMATIONS (op))
563 op->stats.wc = NUM_ANIMATIONS (op) - 1; 549 op->stats.wc = NUM_ANIMATIONS (op) - 1;
550
564 SET_ANIMATION (op, op->stats.wc); 551 SET_ANIMATION (op, op->stats.wc);
565 update_object (op, UP_OBJ_FACE); 552 update_object (op, UP_OBJ_FACE);
566 if ((unsigned char) op->stats.wc == (NUM_ANIMATIONS (op) - 1)) 553 if ((unsigned char) op->stats.wc == (NUM_ANIMATIONS (op) - 1))
567 {
568 op->speed = 0;
569 update_ob_speed (op); /* closed, let's stop */ 554 op->set_speed (0); /* closed, let's stop */
570 return;
571 }
572} 555}
573 556
574 557
575/* stop_item() returns a pointer to the stopped object. The stopped object 558/* stop_item() returns a pointer to the stopped object. The stopped object
576 * may or may not have been removed from maps or inventories. It will not 559 * may or may not have been removed from maps or inventories. It will not
602 op->destroy (); 585 op->destroy ();
603 return payload; 586 return payload;
604 } 587 }
605 588
606 case ARROW: 589 case ARROW:
607 if (op->speed >= MIN_ACTIVE_SPEED) 590 if (op->has_active_speed ())
608 op = fix_stopped_arrow (op); 591 op = fix_stopped_arrow (op);
609 return op; 592 return op;
610 593
611 default: 594 default:
612 return op; 595 return op;
638 /* Small chance of breaking */ 621 /* Small chance of breaking */
639 op->destroy (); 622 op->destroy ();
640 return NULL; 623 return NULL;
641 } 624 }
642 625
626 op->set_speed (0);
643 op->direction = 0; 627 op->direction = 0;
644 op->move_on = 0; 628 op->move_on = 0;
645 op->move_type = 0; 629 op->move_type = 0;
646 op->speed = 0;
647 update_ob_speed (op);
648 op->stats.wc = op->stats.sp; 630 op->stats.wc = op->stats.sp;
649 op->stats.dam = op->stats.hp; 631 op->stats.dam = op->stats.hp;
650 op->attacktype = op->stats.grace; 632 op->attacktype = op->stats.grace;
651 op->slaying = 0; 633 op->slaying = 0;
652 op->skill = 0; 634 op->skill = 0;
677 * here too. -b.t. 659 * here too. -b.t.
678 * 660 *
679 * Returns a pointer to the stopped object (which will have been removed 661 * Returns a pointer to the stopped object (which will have been removed
680 * from maps or inventories), or NULL if was destroyed. 662 * from maps or inventories), or NULL if was destroyed.
681 */ 663 */
682
683static void 664static void
684stop_arrow (object *op) 665stop_arrow (object *op)
685{ 666{
686 if (INVOKE_OBJECT (STOP, op)) 667 if (INVOKE_OBJECT (STOP, op))
687 return; 668 return;
982 * there is an old multipart teleporter in which the other parts 963 * there is an old multipart teleporter in which the other parts
983 * have speed, we don't really want to call it twice for the same 964 * have speed, we don't really want to call it twice for the same
984 * function - in fact, as written below, part N would get called 965 * function - in fact, as written below, part N would get called
985 * N times without the speed check. 966 * N times without the speed check.
986 */ 967 */
987 if (op->more && FABS (op->more->speed) < MIN_ACTIVE_SPEED) 968 if (op->more && !op->more->has_active_speed ())
988 move_teleporter (op->more); 969 move_teleporter (op->more);
989 970
990 if (op->head) 971 if (op->head)
991 head = op->head; 972 head = op->head;
992 973
1003 if (tmp->type == PLAYER) 984 if (tmp->type == PLAYER)
1004 { 985 {
1005 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp))) 986 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp)))
1006 return; 987 return;
1007 988
1008 enter_exit (tmp, head); 989 tmp->enter_exit (head);
1009 } 990 }
1010 else 991 else
1011 /* Currently only players can transfer maps */ 992 /* Currently only players can transfer maps */
1012 return; 993 return;
1013 } 994 }
1038/* This object will teleport someone to a different map 1019/* This object will teleport someone to a different map
1039 and will also apply changes to the player from its inventory. 1020 and will also apply changes to the player from its inventory.
1040 This was invented for giving classes, but there's no reason it 1021 This was invented for giving classes, but there's no reason it
1041 can't be generalized. 1022 can't be generalized.
1042*/ 1023*/
1043
1044void 1024void
1045move_player_changer (object *op) 1025move_player_changer (object *op)
1046{ 1026{
1047 object *player; 1027 object *player;
1048 object *walk; 1028 object *walk;
1049 char c;
1050 1029
1051 if (!op->above || !EXIT_PATH (op)) 1030 if (!op->above || !EXIT_PATH (op))
1052 return; 1031 return;
1053 1032
1054 /* This isn't all that great - means that the player_mover 1033 /* This isn't all that great - means that the player_mover
1055 * needs to be on top. 1034 * needs to be on top.
1056 */ 1035 */
1057 if (op->above->type == PLAYER) 1036 if (op->above->type == PLAYER)
1058 { 1037 {
1059 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (player))) 1038 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (player)))
1060 return; 1039 return;
1040
1061 player = op->above; 1041 player = op->above;
1062 1042
1063 for (walk = op->inv; walk != NULL; walk = walk->below) 1043 for (walk = op->inv; walk; walk = walk->below)
1064 apply_changes_to_player (player, walk); 1044 apply_changes_to_player (player, walk);
1065 1045
1066 player->update_stats (); 1046 player->update_stats ();
1067 1047
1068 esrv_send_inventory (op->above, op->above); 1048 esrv_send_inventory (op->above, op->above);
1069 esrv_update_item (UPD_FACE, op->above, op->above); 1049 esrv_update_item (UPD_FACE, op->above, op->above);
1070 1050
1071 /* update players death & WoR home-position */ 1051 /* update players death & WoR home-position */
1072 sscanf (EXIT_PATH (op), "%c", &c); 1052 if (*EXIT_PATH (op) == '/')
1073 if (c == '/')
1074 { 1053 {
1075 strcpy (player->contr->savebed_map, EXIT_PATH (op)); 1054 player->contr->savebed_map = EXIT_PATH (op);
1076 player->contr->bed_x = EXIT_X (op); 1055 player->contr->bed_x = EXIT_X (op);
1077 player->contr->bed_y = EXIT_Y (op); 1056 player->contr->bed_y = EXIT_Y (op);
1078 } 1057 }
1079 else 1058 else
1080 LOG (llevDebug, "WARNING: destination '%s' in player_changer must be an absolute path!\n", &EXIT_PATH (op)); 1059 LOG (llevDebug, "WARNING: destination '%s' in player_changer must be an absolute path!\n", &EXIT_PATH (op));
1081 1060
1082 enter_exit (op->above, op); 1061 op->above->enter_exit (op);
1083 player->contr->save ();
1084 } 1062 }
1085} 1063}
1086 1064
1087/* firewalls fire other spells. 1065/* firewalls fire other spells.
1088 * The direction of the wall is stored in op->stats.sp. 1066 * The direction of the wall is stored in op->stats.sp.
1101 if (!spell || spell->type != SPELL) 1079 if (!spell || spell->type != SPELL)
1102 spell = &op->other_arch->clone; 1080 spell = &op->other_arch->clone;
1103 1081
1104 if (!spell) 1082 if (!spell)
1105 { 1083 {
1106 LOG (llevError, "move_firewall: no spell specified (%s, %s, %d, %d)\n", &op->name, op->map->name, op->x, op->y); 1084 LOG (llevError, "move_firewall: no spell specified (%s, %s, %d, %d)\n", &op->name, &op->map->name, op->x, op->y);
1107 return; 1085 return;
1108 } 1086 }
1109 1087
1110 cast_spell (op, op, op->stats.sp ? op->stats.sp : rndm (1, 8), spell, NULL); 1088 cast_spell (op, op, op->stats.sp ? op->stats.sp : rndm (1, 8), spell, NULL);
1111} 1089}
1149 nx = op->x + freearr_x[dir]; 1127 nx = op->x + freearr_x[dir];
1150 ny = op->y + freearr_y[dir]; 1128 ny = op->y + freearr_y[dir];
1151 m = op->map; 1129 m = op->map;
1152 if (get_map_flags (m, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP) 1130 if (get_map_flags (m, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP)
1153 { 1131 {
1154 LOG (llevError, "move_player_mover: Trying to push player off the map! map=%s (%d, %d)\n", m->path, op->x, op->y); 1132 LOG (llevError, "move_player_mover: Trying to push player off the map! map=%s (%d, %d)\n", &m->path, op->x, op->y);
1155 return; 1133 return;
1156 } 1134 }
1157 1135
1158 if (should_director_abort (op, victim)) 1136 if (should_director_abort (op, victim))
1159 return; 1137 return;
1220{ 1198{
1221 object *tmp; 1199 object *tmp;
1222 1200
1223 if (!op->other_arch) 1201 if (!op->other_arch)
1224 { 1202 {
1225 LOG (llevInfo, "Duplicator with no other_arch! %d %d %s\n", op->x, op->y, op->map ? op->map->path : "nullmap"); 1203 LOG (llevInfo, "Duplicator with no other_arch! %d %d %s\n", op->x, op->y, op->map ? &op->map->path : "nullmap");
1226 return; 1204 return;
1227 } 1205 }
1228 1206
1229 if (op->above == NULL) 1207 if (op->above == NULL)
1230 return; 1208 return;
1295 } 1273 }
1296 else 1274 else
1297 { 1275 {
1298 if (creator->other_arch == NULL) 1276 if (creator->other_arch == NULL)
1299 { 1277 {
1300 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n", &creator->name, creator->map->path, 1278 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n",
1301 creator->x, creator->y); 1279 &creator->name, &creator->map->path, creator->x, creator->y);
1302 return; 1280 return;
1303 } 1281 }
1304 1282
1305 new_ob = object_create_arch (creator->other_arch); 1283 new_ob = object_create_arch (creator->other_arch);
1306 fix_generated_item (new_ob, creator, 0, 0, GT_MINIMAL); 1284 fix_generated_item (new_ob, creator, 0, 0, GT_MINIMAL);
1357 /* if we didn't find our own MARK */ 1335 /* if we didn't find our own MARK */
1358 if (tmp2 == NULL) 1336 if (tmp2 == NULL)
1359 { 1337 {
1360 object *force = get_archetype (FORCE_NAME); 1338 object *force = get_archetype (FORCE_NAME);
1361 1339
1362 force->speed = 0;
1363 if (op->stats.food) 1340 if (op->stats.food)
1364 { 1341 {
1365 force->speed = 0.01; 1342 force->set_speed (0.01);
1366 force->speed_left = -op->stats.food; 1343 force->speed_left = -op->stats.food;
1367 } 1344 }
1368 update_ob_speed (force); 1345 else
1346 force->set_speed (0);
1347
1369 /* put in the lock code */ 1348 /* put in the lock code */
1370 force->slaying = op->slaying; 1349 force->slaying = op->slaying;
1371 1350
1372 if (op->lore) 1351 if (op->lore)
1373 force->lore = op->lore; 1352 force->lore = op->lore;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines