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.40 by root, Wed Mar 14 04:12:29 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{
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
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;
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;
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; 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 = 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
1367 } 1297 }
1368 } 1298 }
1369 } 1299 }
1370} 1300}
1371 1301
1372int 1302void
1373process_object (object *op) 1303process_object (object *op)
1374{ 1304{
1375 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) 1305 if (QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))
1376 return 0; 1306 return;
1377 1307
1378 if (INVOKE_OBJECT (TICK, op)) 1308 if (INVOKE_OBJECT (TICK, op))
1379 return 0; 1309 return;
1380 1310
1381 if (QUERY_FLAG (op, FLAG_MONSTER)) 1311 if (QUERY_FLAG (op, FLAG_MONSTER))
1382 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED)) 1312 if (move_monster (op) || QUERY_FLAG (op, FLAG_FREED))
1383 return 1; 1313 return;
1384 1314
1385 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0) 1315 if (QUERY_FLAG (op, FLAG_ANIMATE) && op->anim_speed == 0)
1386 { 1316 {
1387 if (op->type == PLAYER)
1388 animate_object (op, op->facing);
1389 else
1390 animate_object (op, op->direction); 1317 animate_object (op, op->contr ? op->facing : op->direction);
1391 1318
1392 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1319 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1393 make_sure_seen (op); 1320 make_sure_seen (op);
1394 } 1321 }
1395 1322
1323 if (op->flag [FLAG_GENERATOR]
1324 || op->flag [FLAG_CHANGING]
1325 || op->flag [FLAG_IS_USED_UP])
1326 {
1396 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state) 1327 if (QUERY_FLAG (op, FLAG_CHANGING) && !op->state)
1397 { 1328 {
1398 change_object (op); 1329 change_object (op);
1399 return 1; 1330 return;
1400 } 1331 }
1401 1332
1402 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY)) 1333 if (QUERY_FLAG (op, FLAG_GENERATOR) && !QUERY_FLAG (op, FLAG_FRIENDLY))
1403 generate_monster (op); 1334 generate_monster (op);
1404 1335
1405 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)
1406 { 1337 {
1407 if (QUERY_FLAG (op, FLAG_APPLIED)) 1338 if (QUERY_FLAG (op, FLAG_APPLIED))
1408 remove_force (op); 1339 remove_force (op);
1409 else 1340 else
1410 { 1341 {
1411 /* IF necessary, delete the item from the players inventory */ 1342 /* If necessary, delete the item from the players inventory */
1412 object *pl = op->in_player (); 1343 object *pl = op->in_player ();
1413 1344
1414 if (pl) 1345 if (pl)
1415 esrv_del_item (pl->contr, op->count); 1346 esrv_del_item (pl->contr, op->count);
1416 1347
1417 op->remove (); 1348 op->remove ();
1418 1349
1419 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE)) 1350 if (QUERY_FLAG (op, FLAG_SEE_ANYWHERE))
1420 make_sure_not_seen (op); 1351 make_sure_not_seen (op);
1421 1352
1422 op->destroy (); 1353 op->destroy ();
1423 } 1354 }
1424 1355
1425 return 1; 1356 return;
1357 }
1426 } 1358 }
1427 1359
1428 switch (op->type) 1360 switch (op->type)
1429 { 1361 {
1430 case SPELL_EFFECT: 1362 case SPELL_EFFECT:
1431 move_spell_effect (op); 1363 move_spell_effect (op);
1432 return 1; 1364 break;
1433 1365
1434 case ROD: 1366 case ROD:
1435 case HORN: 1367 case HORN:
1436 regenerate_rod (op); 1368 regenerate_rod (op);
1437 return 1; 1369 break;
1438 1370
1439 case FORCE: 1371 case FORCE:
1440 case POTION_EFFECT: 1372 case POTION_EFFECT:
1441 remove_force (op); 1373 remove_force (op);
1442 return 1; 1374 break;
1443 1375
1444 case BLINDNESS: 1376 case BLINDNESS:
1445 remove_blindness (op); 1377 remove_blindness (op);
1446 return 0; 1378 break;
1447 1379
1448 case POISONING: 1380 case POISONING:
1449 poison_more (op); 1381 poison_more (op);
1450 return 0; 1382 break;
1451 1383
1452 case DISEASE: 1384 case DISEASE:
1453 move_disease (op); 1385 move_disease (op);
1454 return 0; 1386 break;
1455 1387
1456 case SYMPTOM: 1388 case SYMPTOM:
1457 move_symptom (op); 1389 move_symptom (op);
1458 return 0; 1390 break;
1459 1391
1460 case THROWN_OBJ: 1392 case THROWN_OBJ:
1461 case ARROW: 1393 case ARROW:
1462 move_arrow (op); 1394 move_arrow (op);
1463 return 0; 1395 break;
1464 1396
1465 case DOOR: 1397 case DOOR:
1466 remove_door (op); 1398 remove_door (op);
1467 return 0; 1399 break;
1468 1400
1469 case LOCKED_DOOR: 1401 case LOCKED_DOOR:
1470 remove_door2 (op); 1402 remove_door2 (op);
1471 return 0; 1403 break;
1472 1404
1473 case TELEPORTER: 1405 case TELEPORTER:
1474 move_teleporter (op); 1406 move_teleporter (op);
1475 return 0; 1407 break;
1476 1408
1477 case GOLEM: 1409 case GOLEM:
1478 move_golem (op); 1410 move_golem (op);
1479 return 0; 1411 break;
1480 1412
1481 case EARTHWALL: 1413 case EARTHWALL:
1482 hit_player (op, 2, op, AT_PHYSICAL, 1); 1414 hit_player (op, 2, op, AT_PHYSICAL, 1);
1483 return 0; 1415 break;
1484 1416
1485 case FIREWALL: 1417 case FIREWALL:
1486 move_firewall (op); 1418 move_firewall (op);
1487 if (op->stats.maxsp) 1419 if (op->stats.maxsp)
1488 animate_turning (op); 1420 animate_turning (op);
1489 return 0; 1421 break;
1490 1422
1491 case MOOD_FLOOR: 1423 case MOOD_FLOOR:
1492 do_mood_floor (op); 1424 do_mood_floor (op);
1493 return 0; 1425 break;
1494 1426
1495 case GATE: 1427 case GATE:
1496 move_gate (op); 1428 move_gate (op);
1497 return 0; 1429 break;
1498 1430
1499 case TIMED_GATE: 1431 case TIMED_GATE:
1500 move_timed_gate (op); 1432 move_timed_gate (op);
1501 return 0; 1433 break;
1502 1434
1503 case TRIGGER: 1435 case TRIGGER:
1504 case TRIGGER_BUTTON: 1436 case TRIGGER_BUTTON:
1505 case TRIGGER_PEDESTAL: 1437 case TRIGGER_PEDESTAL:
1506 case TRIGGER_ALTAR: 1438 case TRIGGER_ALTAR:
1507 animate_trigger (op); 1439 animate_trigger (op);
1508 return 0; 1440 break;
1509 1441
1510 case DETECTOR: 1442 case DETECTOR:
1511 move_detector (op); 1443 move_detector (op);
1512 1444
1513 case DIRECTOR: 1445 case DIRECTOR:
1514 if (op->stats.maxsp) 1446 if (op->stats.maxsp)
1515 animate_turning (op); 1447 animate_turning (op);
1516 return 0; 1448 break;
1517 1449
1518 case HOLE: 1450 case HOLE:
1519 move_hole (op); 1451 move_hole (op);
1520 return 0; 1452 break;
1521 1453
1522 case DEEP_SWAMP: 1454 case DEEP_SWAMP:
1523 move_deep_swamp (op); 1455 move_deep_swamp (op);
1524 return 0; 1456 break;
1525 1457
1526 case RUNE: 1458 case RUNE:
1527 case TRAP: 1459 case TRAP:
1528 move_rune (op); 1460 move_rune (op);
1529 return 0; 1461 break;
1530 1462
1531 case PLAYERMOVER: 1463 case PLAYERMOVER:
1532 move_player_mover (op); 1464 move_player_mover (op);
1533 return 0; 1465 break;
1534 1466
1535 case CREATOR: 1467 case CREATOR:
1536 move_creator (op); 1468 move_creator (op);
1537 return 0; 1469 break;
1538 1470
1539 case MARKER: 1471 case MARKER:
1540 move_marker (op); 1472 move_marker (op);
1541 return 0; 1473 break;
1542 1474
1543 case PLAYER_CHANGER: 1475 case PLAYER_CHANGER:
1544 move_player_changer (op); 1476 move_player_changer (op);
1545 return 0; 1477 break;
1546 1478
1547 case PEACEMAKER: 1479 case PEACEMAKER:
1548 move_peacemaker (op); 1480 move_peacemaker (op);
1549 return 0; 1481 break;
1550 }
1551 1482
1552 return 0; 1483 case PLAYER:
1484 // players have their own speed-management, so undo the --speed_left
1485 ++op->speed_left;
1486 break;
1487 }
1553} 1488}
1489

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines