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.36 by root, Mon Feb 5 01:39:05 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 {
87 } 87 }
88 88
89 op->destroy (); 89 op->destroy ();
90} 90}
91 91
92/* Will generate a monster according to content
93 * of generator.
94 */
95void 92void
96generate_monster_inv (object *gen) 93generate_monster (object *gen)
97{ 94{
98 int i;
99 object *op, *head = NULL;
100
101 int qty = 0;
102
103 /* Code below assumes the generator is on a map, as it tries
104 * to place the monster on the map. So if the generator
105 * isn't on a map, complain and exit.
106 */
107 if (gen->map == NULL)
108 {
109 //LOG(llevError,"Generator (%s) not on a map?\n", gen->name);
110 return;
111 }
112 /*First count numer of objects in inv */
113 for (op = gen->inv; op; op = op->below)
114 qty++;
115 if (!qty)
116 {
117 LOG (llevError, "Generator (%s) has no inventory in generate_monster_inv?\n", &gen->name);
118 return; /*No inventory */
119 }
120 qty = rndm (0, qty - 1);
121 for (op = gen->inv; qty; qty--)
122 op = op->below;
123 i = find_free_spot (op, gen->map, gen->x, gen->y, 1, 9);
124 if (i == -1)
125 return;
126 head = object_create_clone (op);
127 CLEAR_FLAG (head, FLAG_IS_A_TEMPLATE);
128 unflag_inv (head, FLAG_IS_A_TEMPLATE);
129 if (rndm (0, 9))
130 generate_artifact (head, gen->map->difficulty);
131 insert_ob_in_map_at (head, gen->map, gen, 0, gen->x + freearr_x[i], gen->y + freearr_y[i]);
132 if (QUERY_FLAG (head, FLAG_FREED))
133 return;
134 if (head->has_random_items ())
135 create_treasure (head->randomitems, head, GT_APPLY, gen->map->difficulty, 0);
136}
137
138void
139generate_monster_arch (object *gen)
140{
141 int i;
142 object *op, *head = NULL, *prev = NULL;
143 archetype *at = gen->other_arch;
144
145 if (!gen->other_arch)
146 return;
147
148 /* Code below assumes the generator is on a map, as it tries
149 * to place the monster on the map. So if the generator
150 * isn't on a map, complain and exit.
151 */
152 if (!gen->map) 95 if (!gen->map)
153 return; 96 return;
154 97
155 i = find_free_spot (&at->clone, gen->map, gen->x, gen->y, 1, 9);
156 if (i == -1)
157 return;
158
159 while (at)
160 {
161 op = arch_to_object (at);
162 op->x = gen->x + freearr_x[i] + at->clone.x;
163 op->y = gen->y + freearr_y[i] + at->clone.y;
164
165 if (head)
166 op->head = head, prev->more = op;
167
168 if (rndm (0, 9))
169 generate_artifact (op, gen->map->difficulty);
170
171 insert_ob_in_map (op, gen->map, gen, 0);
172 if (QUERY_FLAG (op, FLAG_FREED))
173 return;
174
175 if (op->has_random_items ())
176 create_treasure (op->randomitems, op, GT_APPLY, gen->map->difficulty, 0);
177
178 if (head == NULL)
179 head = op;
180
181 prev = op;
182 at = at->more;
183 }
184}
185
186void
187generate_monster (object *gen)
188{
189
190 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1)) 98 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1))
191 return; 99 return;
192 100
101 object *op;
102
193 if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN)) 103 if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN))
194 generate_monster_inv (gen); 104 {
105 // either copy one item form the inventory...
106 if (!gen->inv)
107 return;
108
109 // first select one item from the inventory
110 int index = 0;
111 for (object *tmp = gen->inv; tmp; tmp = tmp->below)
112 if (!rndm (++index))
113 op = tmp;
114
115 op = object_create_clone (op);
116
117 CLEAR_FLAG (op, FLAG_IS_A_TEMPLATE);
118 unflag_inv (op, FLAG_IS_A_TEMPLATE);
119 }
195 else 120 else
196 generate_monster_arch (gen); 121 {
122 // ...or use other_arch
123 if (archetype *at = gen->other_arch)
124 op = arch_to_object (at);
125 else
126 return;
127 }
197 128
129 op->expand_tail ();
130
131 int i = find_free_spot (op, gen->map, gen->x, gen->y, 1, 9);
132 if (i >= 0)
133 {
134 if (insert_ob_in_map_at (op, gen->map, gen, 0, gen->x + freearr_x[i], gen->y + freearr_y[i]))
135 {
136 if (rndm (0, 9))
137 generate_artifact (op, gen->map->difficulty);
138
139 if (op->has_random_items ())
140 create_treasure (op->randomitems, op, GT_APPLY, gen->map->difficulty);
141
142 return;
143 }
144 }
145
146 op->destroy ();
198} 147}
199 148
200void 149void
201remove_force (object *op) 150remove_force (object *op)
202{ 151{
245 return; 194 return;
246 } 195 }
247 196
248 if (op->stats.food == 1) 197 if (op->stats.food == 1)
249 { 198 {
250 /* need to remove the object before fix_player is called, else fix_player 199 /* need to unapply the object before update_stats is called, else fix_player
251 * will not do anything. 200 * will not do anything.
252 */ 201 */
253 if (op->env->type == PLAYER) 202 if (op->env->type == PLAYER)
254 { 203 {
255 CLEAR_FLAG (op, FLAG_APPLIED); 204 CLEAR_FLAG (op, FLAG_APPLIED);
271} 220}
272 221
273 222
274void 223void
275move_gate (object *op) 224move_gate (object *op)
276{ /* 1 = going down, 0 = goind up */ 225{ /* 1 = going down, 0 = going up */
277 object *tmp; 226 object *tmp;
278 227
279 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))
280 { 229 {
281 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));
353 */ 302 */
354 if ((int) op->stats.wc >= NUM_ANIMATIONS (op) / 2) 303 if ((int) op->stats.wc >= NUM_ANIMATIONS (op) / 2)
355 { 304 {
356 /* Halfway or further, check blocks */ 305 /* Halfway or further, check blocks */
357 /* First, get the top object on the square. */ 306 /* First, get the top object on the square. */
358 for (tmp = op->above; tmp != NULL && tmp->above != NULL; tmp = tmp->above); 307 for (tmp = op->above; tmp && tmp->above; tmp = tmp->above)
308 ;
359 309
360 if (tmp != NULL) 310 if (tmp)
361 { 311 {
362 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 312 if (QUERY_FLAG (tmp, FLAG_ALIVE))
363 { 313 {
364 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
365 if (tmp->type == PLAYER) 316 if (tmp->type == PLAYER)
366 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);
367 } 318 }
368 else 319 else
369 /* If the object is not alive, and the object either can 320 /* If the object is not alive, and the object either can
455 406
456 if (op->stats.hp) 407 if (op->stats.hp)
457 { 408 {
458 for (tmp2 = tmp->inv; tmp2; tmp2 = tmp2->below) 409 for (tmp2 = tmp->inv; tmp2; tmp2 = tmp2->below)
459 { 410 {
460 if (op->slaying && !strcmp (op->slaying, tmp->name)) 411 if (op->slaying && op->slaying == tmp->name)
461 detected = 1; 412 detected = 1;
413
462 if (tmp2->type == FORCE && tmp2->slaying && !strcmp (tmp2->slaying, op->slaying)) 414 if (tmp2->type == FORCE && tmp2->slaying && tmp2->slaying == op->slaying)
463 detected = 1; 415 detected = 1;
464 } 416 }
465 } 417 }
418
466 if (op->slaying && !strcmp (op->slaying, tmp->name)) 419 if (op->slaying && op->slaying == tmp->name)
467 {
468 detected = 1; 420 detected = 1;
469 }
470 else if (tmp->type == SPECIAL_KEY && tmp->slaying == op->slaying) 421 else if (tmp->type == SPECIAL_KEY && tmp->slaying == op->slaying)
471 detected = 1; 422 detected = 1;
472 } 423 }
473 424
474 /* the detector sets the button if detection is found */ 425 /* the detector sets the button if detection is found */
604void 555void
605fix_stopped_item (object *op, maptile *map, object *originator) 556fix_stopped_item (object *op, maptile *map, object *originator)
606{ 557{
607 if (map == NULL) 558 if (map == NULL)
608 return; 559 return;
560
609 if (QUERY_FLAG (op, FLAG_REMOVED)) 561 if (QUERY_FLAG (op, FLAG_REMOVED))
610 insert_ob_in_map (op, map, originator, 0); 562 insert_ob_in_map (op, map, originator, 0);
611 else if (op->type == ARROW) 563 else if (op->type == ARROW)
612 merge_ob (op, NULL); /* only some arrows actually need this */ 564 merge_ob (op, NULL); /* only some arrows actually need this */
613} 565}
614 566
615
616object * 567object *
617fix_stopped_arrow (object *op) 568fix_stopped_arrow (object *op)
618{ 569{
619 if (rndm (0, 99) < op->stats.food) 570 if (rndm (0, 99) < op->stats.food)
620 { 571 {
623 return NULL; 574 return NULL;
624 } 575 }
625 576
626 op->set_speed (0); 577 op->set_speed (0);
627 op->direction = 0; 578 op->direction = 0;
628 op->move_on = 0; 579 op->move_on = 0;
629 op->move_type = 0; 580 op->move_type = 0;
581 op->skill = 0; // really?
582
583 // restore original wc, dam, attacktype and slaying
630 op->stats.wc = op->stats.sp; 584 op->stats.wc = op->stats.sp;
631 op->stats.dam = op->stats.hp; 585 op->stats.dam = op->stats.hp;
632 op->attacktype = op->stats.grace; 586 op->attacktype = op->stats.grace;
633 op->slaying = 0;
634 op->skill = 0;
635 587
636 if (op->spellarg != NULL) 588 if (op->spellarg)
637 { 589 {
638 op->slaying = op->spellarg; 590 op->slaying = op->spellarg;
639 free (op->spellarg); 591 free (op->spellarg);
640 op->spellarg = NULL; 592 op->spellarg = 0;
641 } 593 }
642 else 594 else
643 op->slaying = NULL; 595 op->slaying = 0;
644 596
645 /* 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 */
646 op->spellarg = NULL; 598 op->spellarg = NULL;
647 op->stats.sp = 0; 599 op->stats.sp = 0;
648 op->stats.hp = 0; 600 op->stats.hp = 0;
649 op->stats.grace = 0; 601 op->stats.grace = 0;
650 op->level = 0; 602 op->level = 0;
651 op->face = op->arch->clone.face; 603 op->face = op->arch->clone.face;
652 op->owner = NULL; /* So that stopped arrows will be saved */ 604 op->owner = NULL; /* So that stopped arrows will be saved */
653 update_object (op, UP_OBJ_FACE); 605 update_object (op, UP_OBJ_CHANGE);
654 return op; 606 return op;
655} 607}
656 608
657/* stop_arrow() - what to do when a non-living flying object 609/* stop_arrow() - what to do when a non-living flying object
658 * has to stop. Sept 96 - I added in thrown object code in 610 * has to stop. Sept 96 - I added in thrown object code in
677 op->destroy (); 629 op->destroy ();
678 } 630 }
679 else 631 else
680 { 632 {
681 op = fix_stopped_arrow (op); 633 op = fix_stopped_arrow (op);
634
682 if (op) 635 if (op)
683 merge_ob (op, NULL); 636 merge_ob (op, 0);
684 } 637 }
685} 638}
686 639
687/* 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.
688 */ 641 */
689
690void 642void
691move_arrow (object *op) 643move_arrow (object *op)
692{ 644{
693 object *tmp; 645 object *tmp;
694 sint16 new_x, new_y; 646 sint16 new_x, new_y;
765 * as below. (Note that for living creatures there is a small 717 * as below. (Note that for living creatures there is a small
766 * chance that reflect_missile fails.) 718 * chance that reflect_missile fails.)
767 */ 719 */
768 if (QUERY_FLAG (tmp, FLAG_REFL_MISSILE) && (rndm (0, 99)) < (90 - op->level / 10)) 720 if (QUERY_FLAG (tmp, FLAG_REFL_MISSILE) && (rndm (0, 99)) < (90 - op->level / 10))
769 { 721 {
770 int number = op->face->number; 722 int number = op->face;
771 723
772 op->direction = absdir (op->direction + 4); 724 op->direction = absdir (op->direction + 4);
773 op->state = 0; 725 update_turn_face (op);
774
775 if (GET_ANIM_ID (op))
776 {
777 number += 4;
778
779 if (number > GET_ANIMATION (op, 8))
780 number -= 8;
781
782 op->face = &new_faces[number];
783 }
784
785 was_reflected = 1; /* skip normal movement calculations */ 726 was_reflected = 1; /* skip normal movement calculations */
786 } 727 }
787 else 728 else
788 { 729 {
789 /* Attack the object. */ 730 /* Attack the object. */
1098 * it'll paralyze the victim for hp*his speed/op->speed 1039 * it'll paralyze the victim for hp*his speed/op->speed
1099 */ 1040 */
1100void 1041void
1101move_player_mover (object *op) 1042move_player_mover (object *op)
1102{ 1043{
1103 object *victim, *nextmover;
1104 int dir = op->stats.sp; 1044 int dir = op->stats.sp;
1105 sint16 nx, ny; 1045 sint16 nx, ny;
1106 maptile *m; 1046 maptile *m;
1107 1047
1108 /* 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 */
1109 if (!dir) 1049 if (!dir)
1110 dir = rndm (1, 8); 1050 dir = rndm (1, 8);
1111 1051
1112 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)
1113 { 1053 {
1114 if (QUERY_FLAG (victim, FLAG_ALIVE) && !QUERY_FLAG (victim, FLAG_WIZPASS) && 1054 if (QUERY_FLAG (victim, FLAG_ALIVE) && !QUERY_FLAG (victim, FLAG_WIZPASS) &&
1115 (victim->move_type & op->move_type || !victim->move_type)) 1055 (victim->move_type & op->move_type || !victim->move_type))
1116 { 1056 {
1117 1057
1134 } 1074 }
1135 1075
1136 if (should_director_abort (op, victim)) 1076 if (should_director_abort (op, victim))
1137 return; 1077 return;
1138 1078
1139 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)
1140 { 1080 {
1141 if (nextmover->type == PLAYERMOVER) 1081 if (nextmover->type == PLAYERMOVER)
1142 nextmover->speed_left = -.99; 1082 nextmover->speed_left = -.99f;
1083
1143 if (QUERY_FLAG (nextmover, FLAG_ALIVE)) 1084 if (QUERY_FLAG (nextmover, FLAG_ALIVE))
1144 {
1145 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 */
1146 }
1147 } 1086 }
1148 1087
1149 if (victim->type == PLAYER) 1088 if (victim->type == PLAYER)
1150 { 1089 {
1151 /* only level >=1 movers move people */ 1090 /* only level >=1 movers move people */
1155 * is cleared, otherwise the player will get stuck in 1094 * is cleared, otherwise the player will get stuck in
1156 * place. This can happen if the player used a spell to 1095 * place. This can happen if the player used a spell to
1157 * get to this space. 1096 * get to this space.
1158 */ 1097 */
1159 victim->contr->fire_on = 0; 1098 victim->contr->fire_on = 0;
1160 victim->speed_left = -FABS (victim->speed); 1099 victim->speed_left = 0.f;
1161 move_player (victim, dir); 1100 move_player (victim, dir);
1162 } 1101 }
1163 else 1102 else
1164 return; 1103 return;
1165 } 1104 }
1169 if (!op->stats.maxsp && op->attacktype) 1108 if (!op->stats.maxsp && op->attacktype)
1170 op->stats.maxsp = 2; 1109 op->stats.maxsp = 2;
1171 1110
1172 if (op->attacktype) 1111 if (op->attacktype)
1173 { /* flag to paralyze the player */ 1112 { /* flag to paralyze the player */
1174
1175 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));
1176 /* Not sure why, but for some chars on metalforge, they
1177 * would sometimes get -inf speed_left, and from the
1178 * description, it could only happen here, so just put
1179 * a lower sanity limit. My only guess is that the
1180 * mover has 0 speed.
1181 */
1182 if (victim->speed_left < -5.0)
1183 victim->speed_left = -5.0;
1184 } 1114 }
1185 } 1115 }
1186 } 1116 }
1187} 1117}
1188 1118
1204 return; 1134 return;
1205 } 1135 }
1206 1136
1207 if (op->above == NULL) 1137 if (op->above == NULL)
1208 return; 1138 return;
1139
1209 for (tmp = op->above; tmp != NULL; tmp = tmp->above) 1140 for (tmp = op->above; tmp; tmp = tmp->above)
1210 { 1141 {
1211 if (strcmp (op->other_arch->name, tmp->arch->name) == 0) 1142 if (op->other_arch->name == tmp->arch->name)
1212 { 1143 {
1213 if (op->level <= 0) 1144 if (op->level <= 0)
1214 tmp->destroy (); 1145 tmp->destroy ();
1215 else 1146 else
1216 { 1147 {
1366 } 1297 }
1367 } 1298 }
1368 } 1299 }
1369} 1300}
1370 1301
1371int 1302void
1372process_object (object *op) 1303process_object (object *op)
1373{ 1304{
1374 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) 1305 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))
1375 return 0; 1306 return;
1376 1307
1377 if (INVOKE_OBJECT (TICK, op)) 1308 if (INVOKE_OBJECT (TICK, op))
1378 return 0; 1309 return;
1379 1310
1380 if (QUERY_FLAG (op, FLAG_MONSTER)) 1311 if (QUERY_FLAG (op, FLAG_MONSTER))
1381 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED)) 1312 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED))
1382 return 1; 1313 return;
1383 1314
1384 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0) 1315 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0)
1385 { 1316 {
1386 if (op->type == PLAYER)
1387 animate_object (op, op->facing);
1388 else
1389 animate_object (op, op->direction); 1317 animate_object (op, op->contr ? op->facing : op->direction);
1390 1318
1391 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1319 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1392 make_sure_seen (op); 1320 make_sure_seen (op);
1393 } 1321 }
1394 1322
1323 if (op->flag [FLAG_GENERATOR]
1324 || op->flag [FLAG_CHANGING]
1325 || op->flag [FLAG_IS_USED_UP])
1326 {
1395 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state) 1327 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state)
1396 { 1328 {
1397 change_object (op); 1329 change_object (op);
1398 return 1; 1330 return;
1399 } 1331 }
1400 1332
1401 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY)) 1333 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY))
1402 generate_monster (op); 1334 generate_monster (op);
1403 1335
1404 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)
1405 { 1337 {
1406 if (QUERY_FLAG (op, FLAG_APPLIED)) 1338 if (QUERY_FLAG (op, FLAG_APPLIED))
1407 remove_force (op); 1339 remove_force (op);
1408 else 1340 else
1409 { 1341 {
1410 /* IF necessary, delete the item from the players inventory */ 1342 /* If necessary, delete the item from the players inventory */
1411 object *pl = op->in_player (); 1343 object *pl = op->in_player ();
1412 1344
1413 if (pl) 1345 if (pl)
1414 esrv_del_item (pl->contr, op->count); 1346 esrv_del_item (pl->contr, op->count);
1415 1347
1416 op->remove (); 1348 op->remove ();
1417 1349
1418 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1350 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1419 make_sure_not_seen (op); 1351 make_sure_not_seen (op);
1420 1352
1421 op->destroy (); 1353 op->destroy ();
1422 } 1354 }
1423 1355
1424 return 1; 1356 return;
1357 }
1425 } 1358 }
1426 1359
1427 switch (op->type) 1360 switch (op->type)
1428 { 1361 {
1429 case SPELL_EFFECT: 1362 case SPELL_EFFECT:
1430 move_spell_effect (op); 1363 move_spell_effect (op);
1431 return 1; 1364 break;
1432 1365
1433 case ROD: 1366 case ROD:
1434 case HORN: 1367 case HORN:
1435 regenerate_rod (op); 1368 regenerate_rod (op);
1436 return 1; 1369 break;
1437 1370
1438 case FORCE: 1371 case FORCE:
1439 case POTION_EFFECT: 1372 case POTION_EFFECT:
1440 remove_force (op); 1373 remove_force (op);
1441 return 1; 1374 break;
1442 1375
1443 case BLINDNESS: 1376 case BLINDNESS:
1444 remove_blindness (op); 1377 remove_blindness (op);
1445 return 0; 1378 break;
1446 1379
1447 case POISONING: 1380 case POISONING:
1448 poison_more (op); 1381 poison_more (op);
1449 return 0; 1382 break;
1450 1383
1451 case DISEASE: 1384 case DISEASE:
1452 move_disease (op); 1385 move_disease (op);
1453 return 0; 1386 break;
1454 1387
1455 case SYMPTOM: 1388 case SYMPTOM:
1456 move_symptom (op); 1389 move_symptom (op);
1457 return 0; 1390 break;
1458 1391
1459 case THROWN_OBJ: 1392 case THROWN_OBJ:
1460 case ARROW: 1393 case ARROW:
1461 move_arrow (op); 1394 move_arrow (op);
1462 return 0; 1395 break;
1463 1396
1464 case DOOR: 1397 case DOOR:
1465 remove_door (op); 1398 remove_door (op);
1466 return 0; 1399 break;
1467 1400
1468 case LOCKED_DOOR: 1401 case LOCKED_DOOR:
1469 remove_door2 (op); 1402 remove_door2 (op);
1470 return 0; 1403 break;
1471 1404
1472 case TELEPORTER: 1405 case TELEPORTER:
1473 move_teleporter (op); 1406 move_teleporter (op);
1474 return 0; 1407 break;
1475 1408
1476 case GOLEM: 1409 case GOLEM:
1477 move_golem (op); 1410 move_golem (op);
1478 return 0; 1411 break;
1479 1412
1480 case EARTHWALL: 1413 case EARTHWALL:
1481 hit_player (op, 2, op, AT_PHYSICAL, 1); 1414 hit_player (op, 2, op, AT_PHYSICAL, 1);
1482 return 0; 1415 break;
1483 1416
1484 case FIREWALL: 1417 case FIREWALL:
1485 move_firewall (op); 1418 move_firewall (op);
1486 if (op->stats.maxsp) 1419 if (op->stats.maxsp)
1487 animate_turning (op); 1420 animate_turning (op);
1488 return 0; 1421 break;
1489 1422
1490 case MOOD_FLOOR: 1423 case MOOD_FLOOR:
1491 do_mood_floor (op); 1424 do_mood_floor (op);
1492 return 0; 1425 break;
1493 1426
1494 case GATE: 1427 case GATE:
1495 move_gate (op); 1428 move_gate (op);
1496 return 0; 1429 break;
1497 1430
1498 case TIMED_GATE: 1431 case TIMED_GATE:
1499 move_timed_gate (op); 1432 move_timed_gate (op);
1500 return 0; 1433 break;
1501 1434
1502 case TRIGGER: 1435 case TRIGGER:
1503 case TRIGGER_BUTTON: 1436 case TRIGGER_BUTTON:
1504 case TRIGGER_PEDESTAL: 1437 case TRIGGER_PEDESTAL:
1505 case TRIGGER_ALTAR: 1438 case TRIGGER_ALTAR:
1506 animate_trigger (op); 1439 animate_trigger (op);
1507 return 0; 1440 break;
1508 1441
1509 case DETECTOR: 1442 case DETECTOR:
1510 move_detector (op); 1443 move_detector (op);
1511 1444
1512 case DIRECTOR: 1445 case DIRECTOR:
1513 if (op->stats.maxsp) 1446 if (op->stats.maxsp)
1514 animate_turning (op); 1447 animate_turning (op);
1515 return 0; 1448 break;
1516 1449
1517 case HOLE: 1450 case HOLE:
1518 move_hole (op); 1451 move_hole (op);
1519 return 0; 1452 break;
1520 1453
1521 case DEEP_SWAMP: 1454 case DEEP_SWAMP:
1522 move_deep_swamp (op); 1455 move_deep_swamp (op);
1523 return 0; 1456 break;
1524 1457
1525 case RUNE: 1458 case RUNE:
1526 case TRAP: 1459 case TRAP:
1527 move_rune (op); 1460 move_rune (op);
1528 return 0; 1461 break;
1529 1462
1530 case PLAYERMOVER: 1463 case PLAYERMOVER:
1531 move_player_mover (op); 1464 move_player_mover (op);
1532 return 0; 1465 break;
1533 1466
1534 case CREATOR: 1467 case CREATOR:
1535 move_creator (op); 1468 move_creator (op);
1536 return 0; 1469 break;
1537 1470
1538 case MARKER: 1471 case MARKER:
1539 move_marker (op); 1472 move_marker (op);
1540 return 0; 1473 break;
1541 1474
1542 case PLAYER_CHANGER: 1475 case PLAYER_CHANGER:
1543 move_player_changer (op); 1476 move_player_changer (op);
1544 return 0; 1477 break;
1545 1478
1546 case PEACEMAKER: 1479 case PEACEMAKER:
1547 move_peacemaker (op); 1480 move_peacemaker (op);
1548 return 0; 1481 break;
1549 }
1550 1482
1551 return 0; 1483 case PLAYER:
1484 // players have their own speed-management, so undo the --speed_left
1485 ++op->speed_left;
1486 break;
1487 }
1552} 1488}
1489

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines