ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/monster.C
(Generate patch)

Comparing deliantra/server/server/monster.C (file contents):
Revision 1.13 by root, Tue Dec 12 20:53:03 2006 UTC vs.
Revision 1.24 by root, Thu Jan 18 21:27:19 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
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#include <global.h> 25#include <global.h>
25#ifndef __CEXTRACT__
26# include <sproto.h> 26#include <sproto.h>
27# include <spells.h> 27#include <spells.h>
28# include <skills.h> 28#include <skills.h>
29#endif
30
31 29
32#define MIN_MON_RADIUS 3 /* minimum monster detection radius */ 30#define MIN_MON_RADIUS 3 /* minimum monster detection radius */
33
34 31
35/* checks npc->enemy and returns that enemy if still valid, 32/* checks npc->enemy and returns that enemy if still valid,
36 * NULL otherwise. 33 * NULL otherwise.
37 * this is map tile aware. 34 * this is map tile aware.
38 * If this returns an enemy, the range vector rv should also be 35 * If this returns an enemy, the range vector rv should also be
116find_nearest_living_creature (object *npc) 113find_nearest_living_creature (object *npc)
117{ 114{
118 int i, mflags; 115 int i, mflags;
119 sint16 nx, ny; 116 sint16 nx, ny;
120 maptile *m; 117 maptile *m;
121 object *tmp;
122 int search_arr[SIZEOFFREE]; 118 int search_arr[SIZEOFFREE];
123 119
124 get_search_arr (search_arr); 120 get_search_arr (search_arr);
121
125 for (i = 0; i < SIZEOFFREE; i++) 122 for (i = 0; i < SIZEOFFREE; i++)
126 { 123 {
127 /* modified to implement smart searching using search_arr 124 /* modified to implement smart searching using search_arr
128 * guidance array to determine direction of search order 125 * guidance array to determine direction of search order
129 */ 126 */
130 nx = npc->x + freearr_x[search_arr[i]]; 127 nx = npc->x + freearr_x[search_arr[i]];
131 ny = npc->y + freearr_y[search_arr[i]]; 128 ny = npc->y + freearr_y[search_arr[i]];
132 m = npc->map; 129 m = npc->map;
133 130
134 mflags = get_map_flags (m, &m, nx, ny, &nx, &ny); 131 mflags = get_map_flags (m, &m, nx, ny, &nx, &ny);
132
135 if (mflags & P_OUT_OF_MAP) 133 if (mflags & P_OUT_OF_MAP)
136 continue; 134 continue;
137 135
138 if (mflags & P_IS_ALIVE) 136 if (mflags & P_IS_ALIVE)
139 { 137 {
140 tmp = get_map_ob (m, nx, ny); 138 for (object *tmp = m->at (nx, ny).top; tmp; tmp = tmp->below)
141 while (tmp != NULL && !QUERY_FLAG (tmp, FLAG_MONSTER) && !QUERY_FLAG (tmp, FLAG_GENERATOR) && tmp->type != PLAYER) 139 if (tmp->flag [FLAG_MONSTER] || tmp->flag [FLAG_GENERATOR] || tmp->type == PLAYER)
142 tmp = tmp->above;
143
144 if (!tmp)
145 {
146 LOG (llevDebug, "find_nearest_living_creature: map %s (%d,%d) has is_alive set but did not find a monster?\n",
147 m->path, nx, ny);
148 }
149 else
150 {
151 if (can_see_monsterP (m, nx, ny, i)) 140 if (can_see_monsterP (m, nx, ny, i))
152 return tmp; 141 return tmp;
153 } 142 }
154 } /* is something living on this space */
155 } 143 }
156 return NULL; /* nothing found */ 144
145 return 0;
157} 146}
158 147
159 148
160/* Tries to find an enmy for npc. We pass the range vector since 149/* Tries to find an enmy for npc. We pass the range vector since
161 * our caller will find the information useful. 150 * our caller will find the information useful.
289 int i; 278 int i;
290 279
291 /* Give up to 15 chances for a monster to move randomly */ 280 /* Give up to 15 chances for a monster to move randomly */
292 for (i = 0; i < 15; i++) 281 for (i = 0; i < 15; i++)
293 { 282 {
294 if (move_object (op, RANDOM () % 8 + 1)) 283 if (move_object (op, rndm (8) + 1))
295 return 1; 284 return 1;
296 } 285 }
297 return 0; 286 return 0;
298} 287}
299 288
368 } 357 }
369 358
370 /* this should probably get modified by many more values. 359 /* this should probably get modified by many more values.
371 * (eg, creatures resistance to fear, level, etc. ) 360 * (eg, creatures resistance to fear, level, etc. )
372 */ 361 */
373 if (QUERY_FLAG (op, FLAG_SCARED) && !(RANDOM () % 20)) 362 if (QUERY_FLAG (op, FLAG_SCARED) && !(rndm (20)))
374 { 363 {
375 CLEAR_FLAG (op, FLAG_SCARED); /* Time to regain some "guts"... */ 364 CLEAR_FLAG (op, FLAG_SCARED); /* Time to regain some "guts"... */
376 } 365 }
377 366
378 if (INVOKE_OBJECT (MONSTER_MOVE, op, ARG_OBJECT (op->enemy))) 367 if (INVOKE_OBJECT (MONSTER_MOVE, op, ARG_OBJECT (op->enemy)))
398 /* If we don't have an enemy, do special movement or the like */ 387 /* If we don't have an enemy, do special movement or the like */
399 if (!enemy) 388 if (!enemy)
400 { 389 {
401 if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) 390 if (QUERY_FLAG (op, FLAG_ONLY_ATTACK))
402 { 391 {
403 op->remove ();
404 op->destroy (0); 392 op->destroy ();
405 return 1; 393 return 1;
406 } 394 }
407 395
408 /* Probably really a bug for a creature to have both 396 /* Probably really a bug for a creature to have both
409 * stand still and a movement type set. 397 * stand still and a movement type set.
458 } /* stand still */ 446 } /* stand still */
459 return 0; 447 return 0;
460 } /* no enemy */ 448 } /* no enemy */
461 449
462 /* We have an enemy. Block immediately below is for pets */ 450 /* We have an enemy. Block immediately below is for pets */
463 if ((op->attack_movement & HI4) == PETMOVE && (owner = get_owner (op)) != NULL && !on_same_map (op, owner)) 451 if ((op->attack_movement & HI4) == PETMOVE && (owner = op->owner) != NULL && !on_same_map (op, owner))
464 return follow_owner (op, owner); 452 return follow_owner (op, owner);
465 453
466 /* doppleganger code to change monster facing to that of the nearest 454 /* doppleganger code to change monster facing to that of the nearest
467 * player. Hmm. The code is here, but no monster in the current 455 * player. Hmm. The code is here, but no monster in the current
468 * arch set uses it. 456 * arch set uses it.
498 * but that we test above... so can be old code here 486 * but that we test above... so can be old code here
499 */ 487 */
500 if (QUERY_FLAG (op, FLAG_RUN_AWAY)) 488 if (QUERY_FLAG (op, FLAG_RUN_AWAY))
501 dir = absdir (dir + 4); 489 dir = absdir (dir + 4);
502 if (QUERY_FLAG (op, FLAG_CONFUSED)) 490 if (QUERY_FLAG (op, FLAG_CONFUSED))
503 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 491 dir = absdir (dir + rndm (3) + rndm (3) - 2);
504 492
505 if (QUERY_FLAG (op, FLAG_CAST_SPELL) && !(RANDOM () % 3)) 493 if (QUERY_FLAG (op, FLAG_CAST_SPELL) && !(rndm (3)))
506 { 494 {
507 if (monster_cast_spell (op, part, enemy, dir, &rv1)) 495 if (monster_cast_spell (op, part, enemy, dir, &rv1))
508 return 0; 496 return 0;
509 } 497 }
510 498
511 if (QUERY_FLAG (op, FLAG_READY_SCROLL) && !(RANDOM () % 3)) 499 if (QUERY_FLAG (op, FLAG_READY_SCROLL) && !(rndm (3)))
512 { 500 {
513 if (monster_use_scroll (op, part, enemy, dir, &rv1)) 501 if (monster_use_scroll (op, part, enemy, dir, &rv1))
514 return 0; 502 return 0;
515 } 503 }
516 504
517 if (QUERY_FLAG (op, FLAG_READY_RANGE) && !(RANDOM () % 3)) 505 if (QUERY_FLAG (op, FLAG_READY_RANGE) && !(rndm (3)))
518 { 506 {
519 if (monster_use_range (op, part, enemy, dir)) 507 if (monster_use_range (op, part, enemy, dir))
520 return 0; 508 return 0;
521 } 509 }
522 if (QUERY_FLAG (op, FLAG_READY_SKILL) && !(RANDOM () % 3)) 510 if (QUERY_FLAG (op, FLAG_READY_SKILL) && !(rndm (3)))
523 { 511 {
524 if (monster_use_skill (op, rv.part, enemy, rv.direction)) 512 if (monster_use_skill (op, rv.part, enemy, rv.direction))
525 return 0; 513 return 0;
526 } 514 }
527 if (QUERY_FLAG (op, FLAG_READY_BOW) && !(RANDOM () % 2)) 515 if (QUERY_FLAG (op, FLAG_READY_BOW) && !(rndm (2)))
528 { 516 {
529 if (monster_use_bow (op, part, enemy, dir)) 517 if (monster_use_bow (op, part, enemy, dir))
530 return 0; 518 return 0;
531 } 519 }
532 } /* for processing of all parts */ 520 } /* for processing of all parts */
538 526
539 if (QUERY_FLAG (op, FLAG_SCARED) || QUERY_FLAG (op, FLAG_RUN_AWAY)) 527 if (QUERY_FLAG (op, FLAG_SCARED) || QUERY_FLAG (op, FLAG_RUN_AWAY))
540 dir = absdir (dir + 4); 528 dir = absdir (dir + 4);
541 529
542 if (QUERY_FLAG (op, FLAG_CONFUSED)) 530 if (QUERY_FLAG (op, FLAG_CONFUSED))
543 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 531 dir = absdir (dir + rndm (3) + rndm (3) - 2);
544 532
545 pre_att_dir = dir; /* remember the original direction */ 533 pre_att_dir = dir; /* remember the original direction */
546 534
547 if ((op->attack_movement & LO4) && !QUERY_FLAG (op, FLAG_SCARED)) 535 if ((op->attack_movement & LO4) && !QUERY_FLAG (op, FLAG_SCARED))
548 { 536 {
668 return 1; 656 return 1;
669 657
670 if (QUERY_FLAG (op, FLAG_ONLY_ATTACK)) 658 if (QUERY_FLAG (op, FLAG_ONLY_ATTACK))
671 { 659 {
672 op->remove (); 660 op->remove ();
673 op->destroy (0); 661 op->destroy ();
674 return 1; 662 return 1;
675 } 663 }
676 return 0; 664 return 0;
677} 665}
678 666
680can_hit (object *ob1, object *ob2, rv_vector * rv) 668can_hit (object *ob1, object *ob2, rv_vector * rv)
681{ 669{
682 object *more; 670 object *more;
683 rv_vector rv1; 671 rv_vector rv1;
684 672
685 if (QUERY_FLAG (ob1, FLAG_CONFUSED) && !(RANDOM () % 3)) 673 if (QUERY_FLAG (ob1, FLAG_CONFUSED) && !(rndm (3)))
686 return 0; 674 return 0;
687 675
688 if (abs (rv->distance_x) < 2 && abs (rv->distance_y) < 2) 676 if (abs (rv->distance_x) < 2 && abs (rv->distance_y) < 2)
689 return 1; 677 return 1;
690 678
789 * other monsters) 777 * other monsters)
790 */ 778 */
791 if (!(dir = path_to_player (part, pl, 0))) 779 if (!(dir = path_to_player (part, pl, 0)))
792 return 0; 780 return 0;
793 781
794 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = get_owner (head)) != NULL) 782 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = head->owner) != NULL)
795 { 783 {
796 get_rangevector (head, owner, &rv1, 0x1); 784 get_rangevector (head, owner, &rv1, 0x1);
797 if (dirdiff (dir, rv1.direction) < 2) 785 if (dirdiff (dir, rv1.direction) < 2)
798 { 786 {
799 return 0; /* Might hit owner with spell */ 787 return 0; /* Might hit owner with spell */
800 } 788 }
801 } 789 }
802 790
803 if (QUERY_FLAG (head, FLAG_CONFUSED)) 791 if (QUERY_FLAG (head, FLAG_CONFUSED))
804 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 792 dir = absdir (dir + rndm (3) + rndm (3) - 2);
805 793
806 /* If the monster hasn't already chosen a spell, choose one 794 /* If the monster hasn't already chosen a spell, choose one
807 * I'm not sure if it really make sense to pre-select spells (events 795 * I'm not sure if it really make sense to pre-select spells (events
808 * could be different by the time the monster goes again). 796 * could be different by the time the monster goes again).
809 */ 797 */
866 * other monsters) 854 * other monsters)
867 */ 855 */
868 if (!(dir = path_to_player (part, pl, 0))) 856 if (!(dir = path_to_player (part, pl, 0)))
869 return 0; 857 return 0;
870 858
871 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = get_owner (head)) != NULL) 859 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = head->owner) != NULL)
872 { 860 {
873 get_rangevector (head, owner, &rv1, 0x1); 861 get_rangevector (head, owner, &rv1, 0x1);
874 if (dirdiff (dir, rv1.direction) < 2) 862 if (dirdiff (dir, rv1.direction) < 2)
875 { 863 {
876 return 0; /* Might hit owner with spell */ 864 return 0; /* Might hit owner with spell */
877 } 865 }
878 } 866 }
879 867
880 if (QUERY_FLAG (head, FLAG_CONFUSED)) 868 if (QUERY_FLAG (head, FLAG_CONFUSED))
881 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 869 dir = absdir (dir + rndm (3) + rndm (3) - 2);
882 870
883 for (scroll = head->inv; scroll; scroll = scroll->below) 871 for (scroll = head->inv; scroll; scroll = scroll->below)
884 if (scroll->type == SCROLL && monster_should_cast_spell (head, scroll->inv)) 872 if (scroll->type == SCROLL && monster_should_cast_spell (head, scroll->inv))
885 break; 873 break;
886 874
917 object *skill, *owner; 905 object *skill, *owner;
918 906
919 if (!(dir = path_to_player (part, pl, 0))) 907 if (!(dir = path_to_player (part, pl, 0)))
920 return 0; 908 return 0;
921 909
922 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = get_owner (head)) != NULL) 910 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = head->owner) != NULL)
923 { 911 {
924 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y); 912 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y);
925 913
926 if (dirdiff (dir, dir2) < 1) 914 if (dirdiff (dir, dir2) < 1)
927 return 0; /* Might hit owner with skill -thrown rocks for example ? */ 915 return 0; /* Might hit owner with skill -thrown rocks for example ? */
928 } 916 }
929 if (QUERY_FLAG (head, FLAG_CONFUSED)) 917 if (QUERY_FLAG (head, FLAG_CONFUSED))
930 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 918 dir = absdir (dir + rndm (3) + rndm (3) - 2);
931 919
932 /* skill selection - monster will use the next unused skill. 920 /* skill selection - monster will use the next unused skill.
933 * well...the following scenario will allow the monster to 921 * well...the following scenario will allow the monster to
934 * toggle between 2 skills. One day it would be nice to make 922 * toggle between 2 skills. One day it would be nice to make
935 * more skills available to monsters. 923 * more skills available to monsters.
961 int at_least_one = 0; 949 int at_least_one = 0;
962 950
963 if (!(dir = path_to_player (part, pl, 0))) 951 if (!(dir = path_to_player (part, pl, 0)))
964 return 0; 952 return 0;
965 953
966 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = get_owner (head)) != NULL) 954 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = head->owner) != NULL)
967 { 955 {
968 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y); 956 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y);
969 957
970 if (dirdiff (dir, dir2) < 2) 958 if (dirdiff (dir, dir2) < 2)
971 return 0; /* Might hit owner with spell */ 959 return 0; /* Might hit owner with spell */
972 } 960 }
973 if (QUERY_FLAG (head, FLAG_CONFUSED)) 961 if (QUERY_FLAG (head, FLAG_CONFUSED))
974 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 962 dir = absdir (dir + rndm (3) + rndm (3) - 2);
975 963
976 for (wand = head->inv; wand != NULL; wand = wand->below) 964 for (wand = head->inv; wand != NULL; wand = wand->below)
977 { 965 {
978 if (wand->type == WAND) 966 if (wand->type == WAND)
979 { 967 {
988 { 976 {
989 if (wand->arch) 977 if (wand->arch)
990 { 978 {
991 CLEAR_FLAG (wand, FLAG_ANIMATE); 979 CLEAR_FLAG (wand, FLAG_ANIMATE);
992 wand->face = wand->arch->clone.face; 980 wand->face = wand->arch->clone.face;
993 wand->speed = 0; 981 wand->set_speed (0);
994 update_ob_speed (wand);
995 } 982 }
996 } 983 }
997 /* Success */ 984 /* Success */
998 return 1; 985 return 1;
999 } 986 }
1030 object *owner; 1017 object *owner;
1031 1018
1032 if (!(dir = path_to_player (part, pl, 0))) 1019 if (!(dir = path_to_player (part, pl, 0)))
1033 return 0; 1020 return 0;
1034 if (QUERY_FLAG (head, FLAG_CONFUSED)) 1021 if (QUERY_FLAG (head, FLAG_CONFUSED))
1035 dir = absdir (dir + RANDOM () % 3 + RANDOM () % 3 - 2); 1022 dir = absdir (dir + rndm (3) + rndm (3) - 2);
1036 1023
1037 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = get_owner (head)) != NULL) 1024 if (QUERY_FLAG (head, FLAG_FRIENDLY) && (owner = head->owner) != NULL)
1038 { 1025 {
1039 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y); 1026 int dir2 = find_dir_2 (head->x - owner->x, head->y - owner->y);
1040 1027
1041 if (dirdiff (dir, dir2) < 1) 1028 if (dirdiff (dir, dir2) < 1)
1042 return 0; /* Might hit owner with arrow */ 1029 return 0; /* Might hit owner with arrow */
1353 /* Don't use it right now */ 1340 /* Don't use it right now */
1354 return; 1341 return;
1355 } 1342 }
1356 else if (item->type == WEAPON) 1343 else if (item->type == WEAPON)
1357 flag = check_good_weapon (mon, item); 1344 flag = check_good_weapon (mon, item);
1358 else if (IS_ARMOR (item)) 1345 else if (item->is_armor ())
1359 flag = check_good_armour (mon, item); 1346 flag = check_good_armour (mon, item);
1360 /* Should do something more, like make sure this is a better item */ 1347 /* Should do something more, like make sure this is a better item */
1361 else if (item->type == RING) 1348 else if (item->type == RING)
1362 flag = 1; 1349 flag = 1;
1363 else if (item->type == WAND || item->type == ROD || item->type == HORN) 1350 else if (item->type == WAND || item->type == ROD || item->type == HORN)
1434 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); 1421 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy);
1435 /* If nothing alive on this space, no need to search the space. */ 1422 /* If nothing alive on this space, no need to search the space. */
1436 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE)) 1423 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE))
1437 continue; 1424 continue;
1438 1425
1439 for (npc = get_map_ob (m, sx, sy); npc != NULL; npc = npc->above) 1426 for (npc = GET_MAP_OB (m, sx, sy); npc != NULL; npc = npc->above)
1440 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE)) 1427 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE))
1441 npc->enemy = op->enemy; 1428 npc->enemy = op->enemy;
1442 } 1429 }
1443} 1430}
1444 1431
1530{ 1517{
1531 static int circle[12] = { 3, 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2 }; 1518 static int circle[12] = { 3, 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2 };
1532 if (++ob->move_status > 11) 1519 if (++ob->move_status > 11)
1533 ob->move_status = 0; 1520 ob->move_status = 0;
1534 if (!(move_object (ob, circle[ob->move_status]))) 1521 if (!(move_object (ob, circle[ob->move_status])))
1535 (void) move_object (ob, RANDOM () % 8 + 1); 1522 (void) move_object (ob, rndm (8) + 1);
1536} 1523}
1537 1524
1538void 1525void
1539circ2_move (object *ob) 1526circ2_move (object *ob)
1540{ 1527{
1541 static int circle[20] = { 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 1, 1, 1, 2, 2 }; 1528 static int circle[20] = { 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 1, 1, 1, 2, 2 };
1542 if (++ob->move_status > 19) 1529 if (++ob->move_status > 19)
1543 ob->move_status = 0; 1530 ob->move_status = 0;
1544 if (!(move_object (ob, circle[ob->move_status]))) 1531 if (!(move_object (ob, circle[ob->move_status])))
1545 (void) move_object (ob, RANDOM () % 8 + 1); 1532 (void) move_object (ob, rndm (8) + 1);
1546} 1533}
1547 1534
1548void 1535void
1549pace_movev (object *ob) 1536pace_movev (object *ob)
1550{ 1537{
1600void 1587void
1601rand_move (object *ob) 1588rand_move (object *ob)
1602{ 1589{
1603 int i; 1590 int i;
1604 1591
1605 if (ob->move_status < 1 || ob->move_status > 8 || !(move_object (ob, ob->move_status || !(RANDOM () % 9)))) 1592 if (ob->move_status < 1 || ob->move_status > 8 || !(move_object (ob, ob->move_status || !(rndm (9)))))
1606 for (i = 0; i < 5; i++) 1593 for (i = 0; i < 5; i++)
1607 if (move_object (ob, ob->move_status = RANDOM () % 8 + 1)) 1594 if (move_object (ob, ob->move_status = rndm (8) + 1))
1608 return; 1595 return;
1609} 1596}
1610 1597
1611void 1598void
1612check_earthwalls (object *op, maptile *m, int x, int y) 1599check_earthwalls (object *op, maptile *m, int x, int y)
1613{ 1600{
1614 object *tmp; 1601 object *tmp;
1615 1602
1616 for (tmp = get_map_ob (m, x, y); tmp != NULL; tmp = tmp->above) 1603 for (tmp = GET_MAP_OB (m, x, y); tmp != NULL; tmp = tmp->above)
1617 { 1604 {
1618 if (tmp->type == EARTHWALL) 1605 if (tmp->type == EARTHWALL)
1619 { 1606 {
1620 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1); 1607 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1);
1621 return; 1608 return;
1626void 1613void
1627check_doors (object *op, maptile *m, int x, int y) 1614check_doors (object *op, maptile *m, int x, int y)
1628{ 1615{
1629 object *tmp; 1616 object *tmp;
1630 1617
1631 for (tmp = get_map_ob (m, x, y); tmp != NULL; tmp = tmp->above) 1618 for (tmp = GET_MAP_OB (m, x, y); tmp != NULL; tmp = tmp->above)
1632 { 1619 {
1633 if (tmp->type == DOOR) 1620 if (tmp->type == DOOR)
1634 { 1621 {
1635 hit_player (tmp, 1000, op, AT_PHYSICAL, 1); 1622 hit_player (tmp, 1000, op, AT_PHYSICAL, 1);
1636 return; 1623 return;
1657 tmp = op; 1644 tmp = op;
1658 1645
1659 /* New throw code: look through the inventory. Grap the first legal is_thrown 1646 /* New throw code: look through the inventory. Grap the first legal is_thrown
1660 * marked item and throw it to the enemy. 1647 * marked item and throw it to the enemy.
1661 */ 1648 */
1662
1663 for (tmp = op->inv; tmp; tmp = tmp->below) 1649 for (tmp = op->inv; tmp; tmp = tmp->below)
1664 { 1650 {
1665
1666 /* Can't throw invisible objects or items that are applied */ 1651 /* Can't throw invisible objects or items that are applied */
1667 if (tmp->invisible || QUERY_FLAG (tmp, FLAG_APPLIED)) 1652 if (tmp->invisible || QUERY_FLAG (tmp, FLAG_APPLIED))
1668 continue; 1653 continue;
1669 1654
1670 if (QUERY_FLAG (tmp, FLAG_IS_THROWN)) 1655 if (QUERY_FLAG (tmp, FLAG_IS_THROWN))
1793 /* ah, we are within range, detected? take cases */ 1778 /* ah, we are within range, detected? take cases */
1794 if (!enemy->invisible) /* enemy in dark squares... are seen! */ 1779 if (!enemy->invisible) /* enemy in dark squares... are seen! */
1795 return 1; 1780 return 1;
1796 1781
1797 /* hidden or low-quality invisible */ 1782 /* hidden or low-quality invisible */
1798 if (enemy->hide && (rv->distance <= 1) && (RANDOM () % 100 <= hide_discovery)) 1783 if (enemy->hide && (rv->distance <= 1) && (rndm (100) <= hide_discovery))
1799 { 1784 {
1800 make_visible (enemy); 1785 make_visible (enemy);
1801 /* inform players of new status */ 1786 /* inform players of new status */
1802 if (enemy->type == PLAYER && player_can_view (enemy, op)) 1787 if (enemy->type == PLAYER && player_can_view (enemy, op))
1803 new_draw_info_format (NDI_UNIQUE, 0, enemy, "You are discovered by %s!", &op->name); 1788 new_draw_info_format (NDI_UNIQUE, 0, enemy, "You are discovered by %s!", &op->name);
1810 * do something to you. Decreasing the duration of invisible 1795 * do something to you. Decreasing the duration of invisible
1811 * doesn't make a lot of sense IMO, as a bunch of stupid creatures 1796 * doesn't make a lot of sense IMO, as a bunch of stupid creatures
1812 * can then basically negate the spell. The spell isn't negated - 1797 * can then basically negate the spell. The spell isn't negated -
1813 * they just know where you are! 1798 * they just know where you are!
1814 */ 1799 */
1815 if ((RANDOM () % 50) <= hide_discovery) 1800 if ((rndm (50)) <= hide_discovery)
1816 { 1801 {
1817 if (enemy->type == PLAYER) 1802 if (enemy->type == PLAYER)
1818 { 1803 {
1819 new_draw_info_format (NDI_UNIQUE, 0, enemy, "You see %s noticing your position.", query_name (op)); 1804 new_draw_info_format (NDI_UNIQUE, 0, enemy, "You see %s noticing your position.", query_name (op));
1820 } 1805 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines