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.20 by root, Wed Dec 20 09:14:22 2006 UTC vs.
Revision 1.29 by elmex, Sat Dec 30 21:07:46 2006 UTC

26 * collected in this file. 26 * collected in this file.
27 */ 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 */
44 object *tmp; 42 object *tmp;
45 43
46 for (i = 1; i < 9; i += 2) 44 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) 45 if ((tmp = present (DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i])) != NULL)
48 { 46 {
49 tmp->speed = 0.1; 47 tmp->set_speed (0.1);
50 update_ob_speed (tmp);
51 tmp->speed_left = -0.2; 48 tmp->speed_left = -0.2;
52 } 49 }
53 50
54 if (op->other_arch) 51 if (op->other_arch)
55 { 52 {
73 for (i = 1; i < 9; i += 2) 70 for (i = 1; i < 9; i += 2)
74 { 71 {
75 tmp = present (LOCKED_DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i]); 72 tmp = present (LOCKED_DOOR, op->map, op->x + freearr_x[i], op->y + freearr_y[i]);
76 if (tmp && tmp->slaying == op->slaying) 73 if (tmp && tmp->slaying == op->slaying)
77 { /* same key both doors */ 74 { /* same key both doors */
78 tmp->speed = 0.1; 75 tmp->set_speed (0.1);
79 update_ob_speed (tmp);
80 tmp->speed_left = -0.2; 76 tmp->speed_left = -0.2;
81 } 77 }
82 } 78 }
79
83 if (op->other_arch) 80 if (op->other_arch)
84 { 81 {
85 tmp = arch_to_object (op->other_arch); 82 tmp = arch_to_object (op->other_arch);
86 tmp->x = op->x; 83 tmp->x = op->x;
87 tmp->y = op->y; 84 tmp->y = op->y;
144{ 141{
145 int i; 142 int i;
146 object *op, *head = NULL, *prev = NULL; 143 object *op, *head = NULL, *prev = NULL;
147 archetype *at = gen->other_arch; 144 archetype *at = gen->other_arch;
148 145
149 if (gen->other_arch == NULL) 146 if (!gen->other_arch)
150 {
151 //LOG(llevError,"Generator without other_arch: %s\n",gen->name);
152 return; 147 return;
153 } 148
154 /* Code below assumes the generator is on a map, as it tries 149 /* Code below assumes the generator is on a map, as it tries
155 * to place the monster on the map. So if the generator 150 * to place the monster on the map. So if the generator
156 * isn't on a map, complain and exit. 151 * isn't on a map, complain and exit.
157 */ 152 */
158 if (gen->map == NULL) 153 if (!gen->map)
159 {
160 //LOG(llevError,"Generator (%s) not on a map?\n", gen->name);
161 return; 154 return;
162 } 155
163 i = find_free_spot (&at->clone, gen->map, gen->x, gen->y, 1, 9); 156 i = find_free_spot (&at->clone, gen->map, gen->x, gen->y, 1, 9);
164 if (i == -1) 157 if (i == -1)
165 return; 158 return;
159
166 while (at != NULL) 160 while (at)
167 { 161 {
168 op = arch_to_object (at); 162 op = arch_to_object (at);
169 op->x = gen->x + freearr_x[i] + at->clone.x; 163 op->x = gen->x + freearr_x[i] + at->clone.x;
170 op->y = gen->y + freearr_y[i] + at->clone.y; 164 op->y = gen->y + freearr_y[i] + at->clone.y;
171 165
172 if (head != NULL) 166 if (head)
173 op->head = head, prev->more = op; 167 op->head = head, prev->more = op;
174 168
175 if (rndm (0, 9)) 169 if (rndm (0, 9))
176 generate_artifact (op, gen->map->difficulty); 170 generate_artifact (op, gen->map->difficulty);
171
177 insert_ob_in_map (op, gen->map, gen, 0); 172 insert_ob_in_map (op, gen->map, gen, 0);
178 if (QUERY_FLAG (op, FLAG_FREED)) 173 if (QUERY_FLAG (op, FLAG_FREED))
179 return; 174 return;
175
180 if (op->has_random_items ()) 176 if (op->has_random_items ())
181 create_treasure (op->randomitems, op, GT_APPLY, gen->map->difficulty, 0); 177 create_treasure (op->randomitems, op, GT_APPLY, gen->map->difficulty, 0);
178
182 if (head == NULL) 179 if (head == NULL)
183 head = op; 180 head = op;
181
184 prev = op; 182 prev = op;
185 at = at->more; 183 at = at->more;
186 } 184 }
187} 185}
188 186
190generate_monster (object *gen) 188generate_monster (object *gen)
191{ 189{
192 190
193 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1)) 191 if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1))
194 return; 192 return;
193
195 if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN)) 194 if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN))
196 generate_monster_inv (gen); 195 generate_monster_inv (gen);
197 else 196 else
198 generate_monster_arch (gen); 197 generate_monster_arch (gen);
199 198
203remove_force (object *op) 202remove_force (object *op)
204{ 203{
205 if (--op->duration > 0) 204 if (--op->duration > 0)
206 return; 205 return;
207 206
207 if (op->env)
208 switch (op->subtype) 208 switch (op->subtype)
209 { 209 {
210 case FORCE_CONFUSION: 210 case FORCE_CONFUSION:
211 if (op->env != NULL)
212 {
213 CLEAR_FLAG (op->env, FLAG_CONFUSED); 211 CLEAR_FLAG (op->env, FLAG_CONFUSED);
214 new_draw_info (NDI_UNIQUE, 0, op->env, "You regain your senses.\n"); 212 new_draw_info (NDI_UNIQUE, 0, op->env, "You regain your senses.\n");
215 }
216 213
217 default: 214 default:
218 if (op->env != NULL)
219 {
220 CLEAR_FLAG (op, FLAG_APPLIED); 215 CLEAR_FLAG (op, FLAG_APPLIED);
221 change_abil (op->env, op); 216 change_abil (op->env, op);
222 fix_player (op->env); 217 op->env->update_stats ();
223 }
224 } 218 }
225 219
226 op->destroy (); 220 op->destroy ();
227} 221}
228 222
229void 223void
232 if (--op->stats.food > 0) 226 if (--op->stats.food > 0)
233 return; 227 return;
234 228
235 CLEAR_FLAG (op, FLAG_APPLIED); 229 CLEAR_FLAG (op, FLAG_APPLIED);
236 230
237 if (op->env != NULL) 231 if (op->env)
238 { 232 {
239 change_abil (op->env, op); 233 change_abil (op->env, op);
240 fix_player (op->env); 234 op->env->update_stats ();
241 } 235 }
242 236
243 op->destroy (); 237 op->destroy ();
244} 238}
245 239
258 * will not do anything. 252 * will not do anything.
259 */ 253 */
260 if (op->env->type == PLAYER) 254 if (op->env->type == PLAYER)
261 { 255 {
262 CLEAR_FLAG (op, FLAG_APPLIED); 256 CLEAR_FLAG (op, FLAG_APPLIED);
263 fix_player (op->env); 257 op->env->update_stats ();
264 new_draw_info (NDI_UNIQUE, 0, op->env, "You feel much better now."); 258 new_draw_info (NDI_UNIQUE, 0, op->env, "You feel much better now.");
265 } 259 }
266 260
267 op->destroy (); 261 op->destroy ();
268 return; 262 return;
295 { /* Reached bottom, let's stop */ 289 { /* Reached bottom, let's stop */
296 op->stats.wc = 0; 290 op->stats.wc = 0;
297 if (op->arch->clone.speed) 291 if (op->arch->clone.speed)
298 op->value = 0; 292 op->value = 0;
299 else 293 else
300 {
301 op->speed = 0; 294 op->set_speed (0);
302 update_ob_speed (op);
303 } 295 }
304 } 296
305 if ((int) op->stats.wc < (NUM_ANIMATIONS (op) / 2 + 1)) 297 if ((int) op->stats.wc < (NUM_ANIMATIONS (op) / 2 + 1))
306 { 298 {
307 op->move_block = 0; 299 op->move_block = 0;
308 CLEAR_FLAG (op, FLAG_BLOCKSVIEW); 300 CLEAR_FLAG (op, FLAG_BLOCKSVIEW);
309 update_all_los (op->map, op->x, op->y); 301 update_all_los (op->map, op->x, op->y);
310 } 302 }
303
311 SET_ANIMATION (op, op->stats.wc); 304 SET_ANIMATION (op, op->stats.wc);
312 update_object (op, UP_OBJ_CHANGE); 305 update_object (op, UP_OBJ_CHANGE);
313 return; 306 return;
314 } 307 }
315 308
332 if (tmp == NULL) 325 if (tmp == NULL)
333 { 326 {
334 if (op->arch->clone.speed) 327 if (op->arch->clone.speed)
335 op->value = 1; 328 op->value = 1;
336 else 329 else
337 {
338 op->speed = 0; 330 op->set_speed (0);
339 update_ob_speed (op); /* Reached top, let's stop */ 331
340 }
341 return; 332 return;
342 } 333 }
343 } 334 }
344 335
345 if (op->stats.food) 336 if (op->stats.food)
436 } 427 }
437 if (--op->stats.hp <= 0) 428 if (--op->stats.hp <= 0)
438 { /* keep gate down */ 429 { /* keep gate down */
439 move_gate (op); 430 move_gate (op);
440 if (op->value != v) 431 if (op->value != v)
441 { /* ready ? */
442 op->speed = 0; 432 op->set_speed (0);
443 update_ob_speed (op);
444 }
445 } 433 }
446} 434}
447 435
448/* slaying: name of the thing the detector is to look for 436/* slaying: name of the thing the detector is to look for
449 * speed: frequency of 'glances' 437 * speed: frequency of 'glances'
536 if (op->value) 524 if (op->value)
537 { /* We're opening */ 525 { /* We're opening */
538 if (--op->stats.wc <= 0) 526 if (--op->stats.wc <= 0)
539 { /* Opened, let's stop */ 527 { /* Opened, let's stop */
540 op->stats.wc = 0; 528 op->stats.wc = 0;
541 op->speed = 0; 529 op->set_speed (0);
542 update_ob_speed (op);
543 530
544 /* Hard coding this makes sense for holes I suppose */ 531 /* Hard coding this makes sense for holes I suppose */
545 op->move_on = MOVE_WALK; 532 op->move_on = MOVE_WALK;
546 for (tmp = op->above; tmp != NULL; tmp = next) 533 for (tmp = op->above; tmp != NULL; tmp = next)
547 { 534 {
548 next = tmp->above; 535 next = tmp->above;
549 move_apply (op, tmp, tmp); 536 move_apply (op, tmp, tmp);
550 } 537 }
551 } 538 }
539
552 SET_ANIMATION (op, op->stats.wc); 540 SET_ANIMATION (op, op->stats.wc);
553 update_object (op, UP_OBJ_FACE); 541 update_object (op, UP_OBJ_FACE);
554 return; 542 return;
555 } 543 }
556 /* We're closing */ 544 /* We're closing */
557 op->move_on = 0; 545 op->move_on = 0;
558 546
559 op->stats.wc++; 547 op->stats.wc++;
560 if ((int) op->stats.wc >= NUM_ANIMATIONS (op)) 548 if ((int) op->stats.wc >= NUM_ANIMATIONS (op))
561 op->stats.wc = NUM_ANIMATIONS (op) - 1; 549 op->stats.wc = NUM_ANIMATIONS (op) - 1;
550
562 SET_ANIMATION (op, op->stats.wc); 551 SET_ANIMATION (op, op->stats.wc);
563 update_object (op, UP_OBJ_FACE); 552 update_object (op, UP_OBJ_FACE);
564 if ((unsigned char) op->stats.wc == (NUM_ANIMATIONS (op) - 1)) 553 if ((unsigned char) op->stats.wc == (NUM_ANIMATIONS (op) - 1))
565 {
566 op->speed = 0;
567 update_ob_speed (op); /* closed, let's stop */ 554 op->set_speed (0); /* closed, let's stop */
568 return;
569 }
570} 555}
571 556
572 557
573/* 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
574 * 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
600 op->destroy (); 585 op->destroy ();
601 return payload; 586 return payload;
602 } 587 }
603 588
604 case ARROW: 589 case ARROW:
605 if (op->speed >= MIN_ACTIVE_SPEED) 590 if (op->has_active_speed ())
606 op = fix_stopped_arrow (op); 591 op = fix_stopped_arrow (op);
607 return op; 592 return op;
608 593
609 default: 594 default:
610 return op; 595 return op;
636 /* Small chance of breaking */ 621 /* Small chance of breaking */
637 op->destroy (); 622 op->destroy ();
638 return NULL; 623 return NULL;
639 } 624 }
640 625
626 op->set_speed (0);
641 op->direction = 0; 627 op->direction = 0;
642 op->move_on = 0; 628 op->move_on = 0;
643 op->move_type = 0; 629 op->move_type = 0;
644 op->speed = 0;
645 update_ob_speed (op);
646 op->stats.wc = op->stats.sp; 630 op->stats.wc = op->stats.sp;
647 op->stats.dam = op->stats.hp; 631 op->stats.dam = op->stats.hp;
648 op->attacktype = op->stats.grace; 632 op->attacktype = op->stats.grace;
649 op->slaying = 0; 633 op->slaying = 0;
650 op->skill = 0; 634 op->skill = 0;
675 * here too. -b.t. 659 * here too. -b.t.
676 * 660 *
677 * 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
678 * from maps or inventories), or NULL if was destroyed. 662 * from maps or inventories), or NULL if was destroyed.
679 */ 663 */
680
681static void 664static void
682stop_arrow (object *op) 665stop_arrow (object *op)
683{ 666{
684 if (INVOKE_OBJECT (STOP, op)) 667 if (INVOKE_OBJECT (STOP, op))
685 return; 668 return;
980 * there is an old multipart teleporter in which the other parts 963 * there is an old multipart teleporter in which the other parts
981 * 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
982 * function - in fact, as written below, part N would get called 965 * function - in fact, as written below, part N would get called
983 * N times without the speed check. 966 * N times without the speed check.
984 */ 967 */
985 if (op->more && FABS (op->more->speed) < MIN_ACTIVE_SPEED) 968 if (op->more && !op->more->has_active_speed ())
986 move_teleporter (op->more); 969 move_teleporter (op->more);
987 970
988 if (op->head) 971 if (op->head)
989 head = op->head; 972 head = op->head;
990 973
1001 if (tmp->type == PLAYER) 984 if (tmp->type == PLAYER)
1002 { 985 {
1003 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp))) 986 if (INVOKE_OBJECT (TRIGGER, op, ARG_OBJECT (tmp)))
1004 return; 987 return;
1005 988
1006 enter_exit (tmp, head); 989 tmp->enter_exit (head);
1007 } 990 }
1008 else 991 else
1009 /* Currently only players can transfer maps */ 992 /* Currently only players can transfer maps */
1010 return; 993 return;
1011 } 994 }
1059 player = op->above; 1042 player = op->above;
1060 1043
1061 for (walk = op->inv; walk != NULL; walk = walk->below) 1044 for (walk = op->inv; walk != NULL; walk = walk->below)
1062 apply_changes_to_player (player, walk); 1045 apply_changes_to_player (player, walk);
1063 1046
1064 fix_player (player); 1047 player->update_stats ();
1065 1048
1066 esrv_send_inventory (op->above, op->above); 1049 esrv_send_inventory (op->above, op->above);
1067 esrv_update_item (UPD_FACE, op->above, op->above); 1050 esrv_update_item (UPD_FACE, op->above, op->above);
1068 1051
1069 /* update players death & WoR home-position */ 1052 /* update players death & WoR home-position */
1075 player->contr->bed_y = EXIT_Y (op); 1058 player->contr->bed_y = EXIT_Y (op);
1076 } 1059 }
1077 else 1060 else
1078 LOG (llevDebug, "WARNING: destination '%s' in player_changer must be an absolute path!\n", &EXIT_PATH (op)); 1061 LOG (llevDebug, "WARNING: destination '%s' in player_changer must be an absolute path!\n", &EXIT_PATH (op));
1079 1062
1080 enter_exit (op->above, op); 1063 op->above->enter_exit (op);
1081 save_player (player, 1); 1064 player->contr->save ();
1082 } 1065 }
1083} 1066}
1084 1067
1085/* firewalls fire other spells. 1068/* firewalls fire other spells.
1086 * The direction of the wall is stored in op->stats.sp. 1069 * The direction of the wall is stored in op->stats.sp.
1093 1076
1094 if (!op->map) 1077 if (!op->map)
1095 return; /* dm has created a firewall in his inventory */ 1078 return; /* dm has created a firewall in his inventory */
1096 1079
1097 spell = op->inv; 1080 spell = op->inv;
1081
1098 if (!spell || spell->type != SPELL) 1082 if (!spell || spell->type != SPELL)
1099 spell = &op->other_arch->clone; 1083 spell = &op->other_arch->clone;
1084
1100 if (!spell) 1085 if (!spell)
1101 { 1086 {
1102 LOG (llevError, "move_firewall: no spell specified (%s, %s, %d, %d)\n", &op->name, op->map->name, op->x, op->y); 1087 LOG (llevError, "move_firewall: no spell specified (%s, %s, %d, %d)\n", &op->name, &op->map->name, op->x, op->y);
1103 return; 1088 return;
1104 } 1089 }
1105 1090
1106 cast_spell (op, op, op->stats.sp ? op->stats.sp : rndm (1, 8), spell, NULL); 1091 cast_spell (op, op, op->stats.sp ? op->stats.sp : rndm (1, 8), spell, NULL);
1107} 1092}
1108
1109 1093
1110/* move_player_mover: this function takes a "player mover" as an 1094/* move_player_mover: this function takes a "player mover" as an
1111 * argument, and performs the function of a player mover, which is: 1095 * argument, and performs the function of a player mover, which is:
1112 * 1096 *
1113 * a player mover finds any players that are sitting on it. It 1097 * a player mover finds any players that are sitting on it. It
1146 nx = op->x + freearr_x[dir]; 1130 nx = op->x + freearr_x[dir];
1147 ny = op->y + freearr_y[dir]; 1131 ny = op->y + freearr_y[dir];
1148 m = op->map; 1132 m = op->map;
1149 if (get_map_flags (m, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP) 1133 if (get_map_flags (m, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP)
1150 { 1134 {
1151 LOG (llevError, "move_player_mover: Trying to push player off the map! map=%s (%d, %d)\n", m->path, op->x, op->y); 1135 LOG (llevError, "move_player_mover: Trying to push player off the map! map=%s (%d, %d)\n", &m->path, op->x, op->y);
1152 return; 1136 return;
1153 } 1137 }
1154 1138
1155 if (should_director_abort (op, victim)) 1139 if (should_director_abort (op, victim))
1156 return; 1140 return;
1217{ 1201{
1218 object *tmp; 1202 object *tmp;
1219 1203
1220 if (!op->other_arch) 1204 if (!op->other_arch)
1221 { 1205 {
1222 LOG (llevInfo, "Duplicator with no other_arch! %d %d %s\n", op->x, op->y, op->map ? op->map->path : "nullmap"); 1206 LOG (llevInfo, "Duplicator with no other_arch! %d %d %s\n", op->x, op->y, op->map ? &op->map->path : "nullmap");
1223 return; 1207 return;
1224 } 1208 }
1225 1209
1226 if (op->above == NULL) 1210 if (op->above == NULL)
1227 return; 1211 return;
1292 } 1276 }
1293 else 1277 else
1294 { 1278 {
1295 if (creator->other_arch == NULL) 1279 if (creator->other_arch == NULL)
1296 { 1280 {
1297 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n", &creator->name, creator->map->path, 1281 LOG (llevError, "move_creator: Creator doesn't have other arch set: %s (%s, %d, %d)\n",
1298 creator->x, creator->y); 1282 &creator->name, &creator->map->path, creator->x, creator->y);
1299 return; 1283 return;
1300 } 1284 }
1301 1285
1302 new_ob = object_create_arch (creator->other_arch); 1286 new_ob = object_create_arch (creator->other_arch);
1303 fix_generated_item (new_ob, creator, 0, 0, GT_MINIMAL); 1287 fix_generated_item (new_ob, creator, 0, 0, GT_MINIMAL);
1330 unless hp was zero to start with, in which case it is infinite.*/ 1314 unless hp was zero to start with, in which case it is infinite.*/
1331 1315
1332void 1316void
1333move_marker (object *op) 1317move_marker (object *op)
1334{ 1318{
1319 if (object *tmp = op->ms ().player ())
1320 {
1335 object *tmp, *tmp2; 1321 object *tmp2;
1336 1322
1337 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
1338 {
1339 if (tmp->type == PLAYER)
1340 { /* we've got someone to MARK */
1341
1342 /* remove an old force with a slaying field == op->name */ 1323 /* remove an old force with a slaying field == op->name */
1343 for (tmp2 = tmp->inv; tmp2 != NULL; tmp2 = tmp2->below) 1324 for (tmp2 = tmp->inv; tmp2; tmp2 = tmp2->below)
1344 {
1345 if (tmp2->type == FORCE && tmp2->slaying && !strcmp (tmp2->slaying, op->name)) 1325 if (tmp2->type == FORCE && tmp2->slaying && !strcmp (tmp2->slaying, op->name))
1346 break;
1347 } 1326 {
1348
1349 if (tmp2)
1350 tmp2->destroy (); 1327 tmp2->destroy ();
1328 break;
1329 }
1351 1330
1352 /* cycle through his inventory to look for the MARK we want to 1331 /* cycle through his inventory to look for the MARK we want to
1353 * place 1332 * place
1354 */ 1333 */
1355 for (tmp2 = tmp->inv; tmp2 != NULL; tmp2 = tmp2->below) 1334 for (tmp2 = tmp->inv; tmp2; tmp2 = tmp2->below)
1356 {
1357 if (tmp2->type == FORCE && tmp2->slaying && !strcmp (tmp2->slaying, op->slaying)) 1335 if (tmp2->type == FORCE && tmp2->slaying && !strcmp (tmp2->slaying, op->slaying))
1358 break; 1336 break;
1359 }
1360 1337
1361 /* if we didn't find our own MARK */ 1338 /* if we didn't find our own MARK */
1362 if (tmp2 == NULL) 1339 if (tmp2 == NULL)
1363 { 1340 {
1364 object *force = get_archetype (FORCE_NAME); 1341 object *force = get_archetype (FORCE_NAME);
1365 1342
1366 force->speed = 0;
1367 if (op->stats.food) 1343 if (op->stats.food)
1344 {
1345 force->set_speed (0.01);
1346 force->speed_left = -op->stats.food;
1347 }
1348 else
1349 force->set_speed (0);
1350
1351 /* put in the lock code */
1352 force->slaying = op->slaying;
1353
1354 if (op->lore)
1355 force->lore = op->lore;
1356
1357 insert_ob_in_ob (force, tmp);
1358 if (op->msg)
1359 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, tmp, op->msg);
1360
1361 if (op->stats.hp > 0)
1362 {
1363 op->stats.hp--;
1364 if (op->stats.hp == 0)
1368 { 1365 {
1369 force->speed = 0.01; 1366 /* marker expires--granted mark number limit */
1370 force->speed_left = -op->stats.food; 1367 op->destroy ();
1368 return;
1371 } 1369 }
1372 update_ob_speed (force);
1373 /* put in the lock code */
1374 force->slaying = op->slaying;
1375
1376 if (op->lore)
1377 force->lore = op->lore;
1378
1379 insert_ob_in_ob (force, tmp);
1380 if (op->msg)
1381 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, tmp, op->msg);
1382
1383 if (op->stats.hp > 0)
1384 {
1385 op->stats.hp--;
1386 if (op->stats.hp == 0)
1387 {
1388 /* marker expires--granted mark number limit */
1389 op->destroy ();
1390 return;
1391 }
1392 } 1370 }
1393 } /* if tmp2 == NULL */ 1371 }
1394 } /* if tmp->type == PLAYER */ 1372 }
1395 } /* For all objects on this space */
1396} 1373}
1397 1374
1398int 1375int
1399process_object (object *op) 1376process_object (object *op)
1400{ 1377{
1484 return 0; 1461 return 0;
1485 1462
1486 case THROWN_OBJ: 1463 case THROWN_OBJ:
1487 case ARROW: 1464 case ARROW:
1488 move_arrow (op); 1465 move_arrow (op);
1489 return 0;
1490
1491 case LIGHTNING: /* It now moves twice as fast */
1492 move_bolt (op);
1493 return 0; 1466 return 0;
1494 1467
1495 case DOOR: 1468 case DOOR:
1496 remove_door (op); 1469 remove_door (op);
1497 return 0; 1470 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines