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.10 by root, Thu Sep 14 22:34:04 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
115object * 112object *
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 mapstruct *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 remove_ob (op); 392 op->destroy ();
404 free_object (op);
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 {
667 if (QUERY_FLAG (part, FLAG_FREED)) /* Might be freed by ghost-attack or hit-back */ 655 if (QUERY_FLAG (part, FLAG_FREED)) /* Might be freed by ghost-attack or hit-back */
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 remove_ob (op); 660 op->remove ();
673 free_object (op); 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 */
1147 1134
1148void 1135void
1149monster_check_pickup (object *monster) 1136monster_check_pickup (object *monster)
1150{ 1137{
1151 object *tmp, *next; 1138 object *tmp, *next;
1152 int next_tag;
1153 1139
1154 for (tmp = monster->below; tmp != NULL; tmp = next) 1140 for (tmp = monster->below; tmp != NULL; tmp = next)
1155 { 1141 {
1156 next = tmp->below; 1142 next = tmp->below;
1157 next_tag = next ? next->count : 0;
1158 if (monster_can_pick (monster, tmp)) 1143 if (monster_can_pick (monster, tmp))
1159 { 1144 {
1160 remove_ob (tmp); 1145 tmp->remove ();
1161 tmp = insert_ob_in_ob (tmp, monster); 1146 tmp = insert_ob_in_ob (tmp, monster);
1162 (void) monster_check_apply (monster, tmp); 1147 (void) monster_check_apply (monster, tmp);
1163 } 1148 }
1164 /* We could try to re-establish the cycling, of the space, but probably 1149 /* We could try to re-establish the cycling, of the space, but probably
1165 * not a big deal to just bail out. 1150 * not a big deal to just bail out.
1166 */ 1151 */
1167 if (next && was_destroyed (next, next_tag)) 1152 if (next && next->destroyed ())
1168 return; 1153 return;
1169 } 1154 }
1170} 1155}
1171 1156
1172/* 1157/*
1355 /* Don't use it right now */ 1340 /* Don't use it right now */
1356 return; 1341 return;
1357 } 1342 }
1358 else if (item->type == WEAPON) 1343 else if (item->type == WEAPON)
1359 flag = check_good_weapon (mon, item); 1344 flag = check_good_weapon (mon, item);
1360 else if (IS_ARMOR (item)) 1345 else if (item->is_armor ())
1361 flag = check_good_armour (mon, item); 1346 flag = check_good_armour (mon, item);
1362 /* 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 */
1363 else if (item->type == RING) 1348 else if (item->type == RING)
1364 flag = 1; 1349 flag = 1;
1365 else if (item->type == WAND || item->type == ROD || item->type == HORN) 1350 else if (item->type == WAND || item->type == ROD || item->type == HORN)
1423npc_call_help (object *op) 1408npc_call_help (object *op)
1424{ 1409{
1425 int x, y, mflags; 1410 int x, y, mflags;
1426 object *npc; 1411 object *npc;
1427 sint16 sx, sy; 1412 sint16 sx, sy;
1428 mapstruct *m; 1413 maptile *m;
1429 1414
1430 for (x = -3; x < 4; x++) 1415 for (x = -3; x < 4; x++)
1431 for (y = -3; y < 4; y++) 1416 for (y = -3; y < 4; y++)
1432 { 1417 {
1433 m = op->map; 1418 m = op->map;
1436 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); 1421 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy);
1437 /* 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. */
1438 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE)) 1423 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE))
1439 continue; 1424 continue;
1440 1425
1441 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)
1442 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE)) 1427 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE))
1443 npc->enemy = op->enemy; 1428 npc->enemy = op->enemy;
1444 } 1429 }
1445} 1430}
1446 1431
1532{ 1517{
1533 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 };
1534 if (++ob->move_status > 11) 1519 if (++ob->move_status > 11)
1535 ob->move_status = 0; 1520 ob->move_status = 0;
1536 if (!(move_object (ob, circle[ob->move_status]))) 1521 if (!(move_object (ob, circle[ob->move_status])))
1537 (void) move_object (ob, RANDOM () % 8 + 1); 1522 (void) move_object (ob, rndm (8) + 1);
1538} 1523}
1539 1524
1540void 1525void
1541circ2_move (object *ob) 1526circ2_move (object *ob)
1542{ 1527{
1543 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 };
1544 if (++ob->move_status > 19) 1529 if (++ob->move_status > 19)
1545 ob->move_status = 0; 1530 ob->move_status = 0;
1546 if (!(move_object (ob, circle[ob->move_status]))) 1531 if (!(move_object (ob, circle[ob->move_status])))
1547 (void) move_object (ob, RANDOM () % 8 + 1); 1532 (void) move_object (ob, rndm (8) + 1);
1548} 1533}
1549 1534
1550void 1535void
1551pace_movev (object *ob) 1536pace_movev (object *ob)
1552{ 1537{
1602void 1587void
1603rand_move (object *ob) 1588rand_move (object *ob)
1604{ 1589{
1605 int i; 1590 int i;
1606 1591
1607 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)))))
1608 for (i = 0; i < 5; i++) 1593 for (i = 0; i < 5; i++)
1609 if (move_object (ob, ob->move_status = RANDOM () % 8 + 1)) 1594 if (move_object (ob, ob->move_status = rndm (8) + 1))
1610 return; 1595 return;
1611} 1596}
1612 1597
1613void 1598void
1614check_earthwalls (object *op, mapstruct *m, int x, int y) 1599check_earthwalls (object *op, maptile *m, int x, int y)
1615{ 1600{
1616 object *tmp; 1601 object *tmp;
1617 1602
1618 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)
1619 { 1604 {
1620 if (tmp->type == EARTHWALL) 1605 if (tmp->type == EARTHWALL)
1621 { 1606 {
1622 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1); 1607 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1);
1623 return; 1608 return;
1624 } 1609 }
1625 } 1610 }
1626} 1611}
1627 1612
1628void 1613void
1629check_doors (object *op, mapstruct *m, int x, int y) 1614check_doors (object *op, maptile *m, int x, int y)
1630{ 1615{
1631 object *tmp; 1616 object *tmp;
1632 1617
1633 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)
1634 { 1619 {
1635 if (tmp->type == DOOR) 1620 if (tmp->type == DOOR)
1636 { 1621 {
1637 hit_player (tmp, 1000, op, AT_PHYSICAL, 1); 1622 hit_player (tmp, 1000, op, AT_PHYSICAL, 1);
1638 return; 1623 return;
1659 tmp = op; 1644 tmp = op;
1660 1645
1661 /* 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
1662 * marked item and throw it to the enemy. 1647 * marked item and throw it to the enemy.
1663 */ 1648 */
1664
1665 for (tmp = op->inv; tmp; tmp = tmp->below) 1649 for (tmp = op->inv; tmp; tmp = tmp->below)
1666 { 1650 {
1667
1668 /* Can't throw invisible objects or items that are applied */ 1651 /* Can't throw invisible objects or items that are applied */
1669 if (tmp->invisible || QUERY_FLAG (tmp, FLAG_APPLIED)) 1652 if (tmp->invisible || QUERY_FLAG (tmp, FLAG_APPLIED))
1670 continue; 1653 continue;
1671 1654
1672 if (QUERY_FLAG (tmp, FLAG_IS_THROWN)) 1655 if (QUERY_FLAG (tmp, FLAG_IS_THROWN))
1795 /* ah, we are within range, detected? take cases */ 1778 /* ah, we are within range, detected? take cases */
1796 if (!enemy->invisible) /* enemy in dark squares... are seen! */ 1779 if (!enemy->invisible) /* enemy in dark squares... are seen! */
1797 return 1; 1780 return 1;
1798 1781
1799 /* hidden or low-quality invisible */ 1782 /* hidden or low-quality invisible */
1800 if (enemy->hide && (rv->distance <= 1) && (RANDOM () % 100 <= hide_discovery)) 1783 if (enemy->hide && (rv->distance <= 1) && (rndm (100) <= hide_discovery))
1801 { 1784 {
1802 make_visible (enemy); 1785 make_visible (enemy);
1803 /* inform players of new status */ 1786 /* inform players of new status */
1804 if (enemy->type == PLAYER && player_can_view (enemy, op)) 1787 if (enemy->type == PLAYER && player_can_view (enemy, op))
1805 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);
1812 * do something to you. Decreasing the duration of invisible 1795 * do something to you. Decreasing the duration of invisible
1813 * 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
1814 * can then basically negate the spell. The spell isn't negated - 1797 * can then basically negate the spell. The spell isn't negated -
1815 * they just know where you are! 1798 * they just know where you are!
1816 */ 1799 */
1817 if ((RANDOM () % 50) <= hide_discovery) 1800 if ((rndm (50)) <= hide_discovery)
1818 { 1801 {
1819 if (enemy->type == PLAYER) 1802 if (enemy->type == PLAYER)
1820 { 1803 {
1821 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));
1822 } 1805 }
1837 1820
1838int 1821int
1839stand_in_light (object *op) 1822stand_in_light (object *op)
1840{ 1823{
1841 sint16 nx, ny; 1824 sint16 nx, ny;
1842 mapstruct *m; 1825 maptile *m;
1843 1826
1844 1827
1845 if (!op) 1828 if (!op)
1846 return 0; 1829 return 0;
1847 if (op->glow_radius > 0) 1830 if (op->glow_radius > 0)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines