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.15 by root, Wed Dec 13 03:28:42 2006 UTC vs.
Revision 1.21 by root, Sun Jan 14 23:35:04 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
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.
987 { 976 {
988 if (wand->arch) 977 if (wand->arch)
989 { 978 {
990 CLEAR_FLAG (wand, FLAG_ANIMATE); 979 CLEAR_FLAG (wand, FLAG_ANIMATE);
991 wand->face = wand->arch->clone.face; 980 wand->face = wand->arch->clone.face;
992 wand->speed = 0; 981 wand->set_speed (0);
993 update_ob_speed (wand);
994 } 982 }
995 } 983 }
996 /* Success */ 984 /* Success */
997 return 1; 985 return 1;
998 } 986 }
1352 /* Don't use it right now */ 1340 /* Don't use it right now */
1353 return; 1341 return;
1354 } 1342 }
1355 else if (item->type == WEAPON) 1343 else if (item->type == WEAPON)
1356 flag = check_good_weapon (mon, item); 1344 flag = check_good_weapon (mon, item);
1357 else if (IS_ARMOR (item)) 1345 else if (item->is_armor ())
1358 flag = check_good_armour (mon, item); 1346 flag = check_good_armour (mon, item);
1359 /* 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 */
1360 else if (item->type == RING) 1348 else if (item->type == RING)
1361 flag = 1; 1349 flag = 1;
1362 else if (item->type == WAND || item->type == ROD || item->type == HORN) 1350 else if (item->type == WAND || item->type == ROD || item->type == HORN)
1433 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); 1421 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy);
1434 /* 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. */
1435 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE)) 1423 if ((mflags & P_OUT_OF_MAP) || !(mflags & P_IS_ALIVE))
1436 continue; 1424 continue;
1437 1425
1438 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)
1439 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE)) 1427 if (QUERY_FLAG (npc, FLAG_ALIVE) && QUERY_FLAG (npc, FLAG_UNAGGRESSIVE))
1440 npc->enemy = op->enemy; 1428 npc->enemy = op->enemy;
1441 } 1429 }
1442} 1430}
1443 1431
1610void 1598void
1611check_earthwalls (object *op, maptile *m, int x, int y) 1599check_earthwalls (object *op, maptile *m, int x, int y)
1612{ 1600{
1613 object *tmp; 1601 object *tmp;
1614 1602
1615 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)
1616 { 1604 {
1617 if (tmp->type == EARTHWALL) 1605 if (tmp->type == EARTHWALL)
1618 { 1606 {
1619 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1); 1607 hit_player (tmp, op->stats.dam, op, AT_PHYSICAL, 1);
1620 return; 1608 return;
1625void 1613void
1626check_doors (object *op, maptile *m, int x, int y) 1614check_doors (object *op, maptile *m, int x, int y)
1627{ 1615{
1628 object *tmp; 1616 object *tmp;
1629 1617
1630 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)
1631 { 1619 {
1632 if (tmp->type == DOOR) 1620 if (tmp->type == DOOR)
1633 { 1621 {
1634 hit_player (tmp, 1000, op, AT_PHYSICAL, 1); 1622 hit_player (tmp, 1000, op, AT_PHYSICAL, 1);
1635 return; 1623 return;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines