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

Comparing deliantra/server/common/los.C (file contents):
Revision 1.4 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.11 by root, Sat Dec 23 13:56:25 2006 UTC

1
2/*
3 * static char *rcsid_los_c =
4 * "$Id: los.C,v 1.4 2006/09/10 16:00:23 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 22*/
29 23
30/* Nov 95 - inserted USE_LIGHTING code stuff in here - b.t. */ 24/* Nov 95 - inserted USE_LIGHTING code stuff in here - b.t. */
31 25
32#include <global.h> 26#include <global.h>
150 * area. l is the distance from x,y to the line. 144 * area. l is the distance from x,y to the line.
151 * r is more a curiosity - it lets us know what direction (left/right) 145 * r is more a curiosity - it lets us know what direction (left/right)
152 * the line is off 146 * the line is off
153 */ 147 */
154 148
155 d1 = (float) (pow (MAP_CLIENT_X / 2 - dx, 2) + pow (MAP_CLIENT_Y / 2 - dy, 2)); 149 d1 = (float) (pow (MAP_CLIENT_X / 2 - dx, 2.f) + pow (MAP_CLIENT_Y / 2 - dy, 2.f));
156 r = (float) ((dy - y) * (dy - MAP_CLIENT_Y / 2) - (dx - x) * (MAP_CLIENT_X / 2 - dx)) / d1; 150 r = (float) ((dy - y) * (dy - MAP_CLIENT_Y / 2) - (dx - x) * (MAP_CLIENT_X / 2 - dx)) / d1;
157 s = (float) ((dy - y) * (MAP_CLIENT_X / 2 - dx) - (dx - x) * (MAP_CLIENT_Y / 2 - dy)) / d1; 151 s = (float) ((dy - y) * (MAP_CLIENT_X / 2 - dx) - (dx - x) * (MAP_CLIENT_Y / 2 - dy)) / d1;
158 l = FABS (sqrt (d1) * s); 152 l = FABS (sqrt (d1) * s);
159 153
160 if (l <= SPACE_BLOCK) 154 if (l <= SPACE_BLOCK)
194 int dx = block[x][y].x[i], dy = block[x][y].y[i], ax, ay; 188 int dx = block[x][y].x[i], dy = block[x][y].y[i], ax, ay;
195 189
196 /* ax, ay are the values as adjusted to be in the 190 /* ax, ay are the values as adjusted to be in the
197 * socket look structure. 191 * socket look structure.
198 */ 192 */
199 ax = dx - (MAP_CLIENT_X - op->contr->socket.mapx) / 2; 193 ax = dx - (MAP_CLIENT_X - op->contr->ns->mapx) / 2;
200 ay = dy - (MAP_CLIENT_Y - op->contr->socket.mapy) / 2; 194 ay = dy - (MAP_CLIENT_Y - op->contr->ns->mapy) / 2;
201 195
202 if (ax < 0 || ax >= op->contr->socket.mapx || ay < 0 || ay >= op->contr->socket.mapy) 196 if (ax < 0 || ax >= op->contr->ns->mapx || ay < 0 || ay >= op->contr->ns->mapy)
203 continue; 197 continue;
204#if 0 198#if 0
205 LOG (llevDebug, "blocked %d %d -> %d %d\n", dx, dy, ax, ay); 199 LOG (llevDebug, "blocked %d %d -> %d %d\n", dx, dy, ax, ay);
206#endif 200#endif
207 /* we need to adjust to the fact that the socket 201 /* we need to adjust to the fact that the socket
226 220
227 if (!block[x][y].index) 221 if (!block[x][y].index)
228 return; 222 return;
229 223
230 /* ax, ay are coordinates as indexed into the look window */ 224 /* ax, ay are coordinates as indexed into the look window */
231 ax = x - (MAP_CLIENT_X - op->contr->socket.mapx) / 2; 225 ax = x - (MAP_CLIENT_X - op->contr->ns->mapx) / 2;
232 ay = y - (MAP_CLIENT_Y - op->contr->socket.mapy) / 2; 226 ay = y - (MAP_CLIENT_Y - op->contr->ns->mapy) / 2;
233 227
234 /* If the converted coordinates are outside the viewable 228 /* If the converted coordinates are outside the viewable
235 * area for the client, return now. 229 * area for the client, return now.
236 */ 230 */
237 if (ax < 0 || ay < 0 || ax >= op->contr->socket.mapx || ay >= op->contr->socket.mapy) 231 if (ax < 0 || ay < 0 || ax >= op->contr->ns->mapx || ay >= op->contr->ns->mapy)
238 return; 232 return;
239 233
240#if 0 234#if 0
241 LOG (llevDebug, "check_wall, ax,ay=%d, %d x,y = %d, %d blocksview = %d, %d\n", 235 LOG (llevDebug, "check_wall, ax,ay=%d, %d x,y = %d, %d blocksview = %d, %d\n",
242 ax, ay, x, y, op->x + x - MAP_CLIENT_X / 2, op->y + y - MAP_CLIENT_Y / 2); 236 ax, ay, x, y, op->x + x - MAP_CLIENT_X / 2, op->y + y - MAP_CLIENT_Y / 2);
260 */ 254 */
261 255
262void 256void
263clear_los (object *op) 257clear_los (object *op)
264{ 258{
265 /* This is safer than using the socket->mapx, mapy because 259 /* This is safer than using the ns->mapx, mapy because
266 * we index the blocked_los as a 2 way array, so clearing 260 * we index the blocked_los as a 2 way array, so clearing
267 * the first z spaces may not not cover the spaces we are 261 * the first z spaces may not not cover the spaces we are
268 * actually going to use 262 * actually going to use
269 */ 263 */
270 (void) memset ((void *) op->contr->blocked_los, 0, MAP_CLIENT_X * MAP_CLIENT_Y); 264 (void) memset ((void *) op->contr->blocked_los, 0, MAP_CLIENT_X * MAP_CLIENT_Y);
280static void 274static void
281expand_sight (object *op) 275expand_sight (object *op)
282{ 276{
283 int i, x, y, dx, dy; 277 int i, x, y, dx, dy;
284 278
285 for (x = 1; x < op->contr->socket.mapx - 1; x++) /* loop over inner squares */ 279 for (x = 1; x < op->contr->ns->mapx - 1; x++) /* loop over inner squares */
286 for (y = 1; y < op->contr->socket.mapy - 1; y++) 280 for (y = 1; y < op->contr->ns->mapy - 1; y++)
287 { 281 {
288 if (!op->contr->blocked_los[x][y] && 282 if (!op->contr->blocked_los[x][y] &&
289 !(get_map_flags (op->map, NULL, 283 !(get_map_flags (op->map, NULL,
290 op->x - op->contr->socket.mapx / 2 + x, 284 op->x - op->contr->ns->mapx / 2 + x,
291 op->y - op->contr->socket.mapy / 2 + y, NULL, NULL) & (P_BLOCKSVIEW | P_OUT_OF_MAP))) 285 op->y - op->contr->ns->mapy / 2 + y, NULL, NULL) & (P_BLOCKSVIEW | P_OUT_OF_MAP)))
292 { 286 {
293 287
294 for (i = 1; i <= 8; i += 1) 288 for (i = 1; i <= 8; i += 1)
295 { /* mark all directions */ 289 { /* mark all directions */
296 dx = x + freearr_x[i]; 290 dx = x + freearr_x[i];
304 if (MAP_DARKNESS (op->map) > 0) /* player is on a dark map */ 298 if (MAP_DARKNESS (op->map) > 0) /* player is on a dark map */
305 expand_lighted_sight (op); 299 expand_lighted_sight (op);
306 300
307 301
308 /* clear mark squares */ 302 /* clear mark squares */
309 for (x = 0; x < op->contr->socket.mapx; x++) 303 for (x = 0; x < op->contr->ns->mapx; x++)
310 for (y = 0; y < op->contr->socket.mapy; y++) 304 for (y = 0; y < op->contr->ns->mapy; y++)
311 if (op->contr->blocked_los[x][y] < 0) 305 if (op->contr->blocked_los[x][y] < 0)
312 op->contr->blocked_los[x][y] = 0; 306 op->contr->blocked_los[x][y] = 0;
313} 307}
314 308
315 309
333 327
334static void 328static void
335expand_lighted_sight (object *op) 329expand_lighted_sight (object *op)
336{ 330{
337 int x, y, darklevel, ax, ay, basex, basey, mflags, light, x1, y1; 331 int x, y, darklevel, ax, ay, basex, basey, mflags, light, x1, y1;
338 mapstruct *m = op->map; 332 maptile *m = op->map;
339 sint16 nx, ny; 333 sint16 nx, ny;
340 334
341 darklevel = MAP_DARKNESS (m); 335 darklevel = MAP_DARKNESS (m);
342 336
343 /* If the player can see in the dark, lower the darklevel for him */ 337 /* If the player can see in the dark, lower the darklevel for him */
360 LOG (llevError, "Map darkness for %s on %s is too high (%d)\n", &op->name, op->map->path, darklevel); 354 LOG (llevError, "Map darkness for %s on %s is too high (%d)\n", &op->name, op->map->path, darklevel);
361 darklevel = MAX_DARKNESS; 355 darklevel = MAX_DARKNESS;
362 } 356 }
363 357
364 /* First, limit player furthest (unlighted) vision */ 358 /* First, limit player furthest (unlighted) vision */
365 for (x = 0; x < op->contr->socket.mapx; x++) 359 for (x = 0; x < op->contr->ns->mapx; x++)
366 for (y = 0; y < op->contr->socket.mapy; y++) 360 for (y = 0; y < op->contr->ns->mapy; y++)
367 if (op->contr->blocked_los[x][y] != 100) 361 if (op->contr->blocked_los[x][y] != 100)
368 op->contr->blocked_los[x][y] = MAX_LIGHT_RADII; 362 op->contr->blocked_los[x][y] = MAX_LIGHT_RADII;
369 363
370 /* the spaces[] darkness value contains the information we need. 364 /* the spaces[] darkness value contains the information we need.
371 * Only process the area of interest. 365 * Only process the area of interest.
372 * the basex, basey values represent the position in the op->contr->blocked_los 366 * the basex, basey values represent the position in the op->contr->blocked_los
373 * array. Its easier to just increment them here (and start with the right 367 * array. Its easier to just increment them here (and start with the right
374 * value) than to recalculate them down below. 368 * value) than to recalculate them down below.
375 */ 369 */
376 for (x = (op->x - op->contr->socket.mapx / 2 - MAX_LIGHT_RADII), basex = -MAX_LIGHT_RADII; 370 for (x = (op->x - op->contr->ns->mapx / 2 - MAX_LIGHT_RADII), basex = -MAX_LIGHT_RADII;
377 x <= (op->x + op->contr->socket.mapx / 2 + MAX_LIGHT_RADII); x++, basex++) 371 x <= (op->x + op->contr->ns->mapx / 2 + MAX_LIGHT_RADII); x++, basex++)
378 { 372 {
379 373
380 for (y = (op->y - op->contr->socket.mapy / 2 - MAX_LIGHT_RADII), basey = -MAX_LIGHT_RADII; 374 for (y = (op->y - op->contr->ns->mapy / 2 - MAX_LIGHT_RADII), basey = -MAX_LIGHT_RADII;
381 y <= (op->y + op->contr->socket.mapy / 2 + MAX_LIGHT_RADII); y++, basey++) 375 y <= (op->y + op->contr->ns->mapy / 2 + MAX_LIGHT_RADII); y++, basey++)
382 { 376 {
383 m = op->map; 377 m = op->map;
384 nx = x; 378 nx = x;
385 ny = y; 379 ny = y;
386 380
398#if 0 392#if 0
399 LOG (llevDebug, "expand_lighted_sight: Found light at x=%d, y=%d, basex=%d, basey=%d\n", x, y, basex, basey); 393 LOG (llevDebug, "expand_lighted_sight: Found light at x=%d, y=%d, basex=%d, basey=%d\n", x, y, basex, basey);
400#endif 394#endif
401 for (ax = basex - light; ax <= basex + light; ax++) 395 for (ax = basex - light; ax <= basex + light; ax++)
402 { 396 {
403 if (ax < 0 || ax >= op->contr->socket.mapx) 397 if (ax < 0 || ax >= op->contr->ns->mapx)
404 continue; 398 continue;
405 for (ay = basey - light; ay <= basey + light; ay++) 399 for (ay = basey - light; ay <= basey + light; ay++)
406 { 400 {
407 if (ay < 0 || ay >= op->contr->socket.mapy) 401 if (ay < 0 || ay >= op->contr->ns->mapy)
408 continue; 402 continue;
409 403
410 /* If the space is fully blocked, do nothing. Otherwise, we 404 /* If the space is fully blocked, do nothing. Otherwise, we
411 * brighten the space. The further the light is away from the 405 * brighten the space. The further the light is away from the
412 * source (basex-x), the less effect it has. Though light used 406 * source (basex-x), the less effect it has. Though light used
432 /* Outdoor should never really be completely pitch black dark like 426 /* Outdoor should never really be completely pitch black dark like
433 * a dungeon, so let the player at least see a little around themselves 427 * a dungeon, so let the player at least see a little around themselves
434 */ 428 */
435 if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3)) 429 if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3))
436 { 430 {
437 if (op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] > (MAX_DARKNESS - 3)) 431 if (op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] > (MAX_DARKNESS - 3))
438 op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] = MAX_DARKNESS - 3; 432 op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] = MAX_DARKNESS - 3;
439 433
440 for (x = -1; x <= 1; x++) 434 for (x = -1; x <= 1; x++)
441 for (y = -1; y <= 1; y++) 435 for (y = -1; y <= 1; y++)
442 { 436 {
443 if (op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] > (MAX_DARKNESS - 2)) 437 if (op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] > (MAX_DARKNESS - 2))
444 op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] = MAX_DARKNESS - 2; 438 op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] = MAX_DARKNESS - 2;
445 } 439 }
446 } 440 }
447 /* grant some vision to the player, based on the darklevel */ 441 /* grant some vision to the player, based on the darklevel */
448 for (x = darklevel - MAX_DARKNESS; x < MAX_DARKNESS + 1 - darklevel; x++) 442 for (x = darklevel - MAX_DARKNESS; x < MAX_DARKNESS + 1 - darklevel; x++)
449 for (y = darklevel - MAX_DARKNESS; y < MAX_DARKNESS + 1 - darklevel; y++) 443 for (y = darklevel - MAX_DARKNESS; y < MAX_DARKNESS + 1 - darklevel; y++)
450 if (!(op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] == 100)) 444 if (!(op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] == 100))
451 op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] -= 445 op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] -=
452 MAX (0, 6 - darklevel - MAX (abs (x), abs (y))); 446 MAX (0, 6 - darklevel - MAX (abs (x), abs (y)));
453} 447}
454 448
455/* blinded_sight() - sets all veiwable squares to blocked except 449/* blinded_sight() - sets all veiwable squares to blocked except
456 * for the one the central one that the player occupies. A little 450 * for the one the central one that the player occupies. A little
461static void 455static void
462blinded_sight (object *op) 456blinded_sight (object *op)
463{ 457{
464 int x, y; 458 int x, y;
465 459
466 for (x = 0; x < op->contr->socket.mapx; x++) 460 for (x = 0; x < op->contr->ns->mapx; x++)
467 for (y = 0; y < op->contr->socket.mapy; y++) 461 for (y = 0; y < op->contr->ns->mapy; y++)
468 op->contr->blocked_los[x][y] = 100; 462 op->contr->blocked_los[x][y] = 100;
469 463
470 op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] = 0; 464 op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] = 0;
471} 465}
472 466
473/* 467/*
474 * update_los() recalculates the array which specifies what is 468 * update_los() recalculates the array which specifies what is
475 * visible for the given player-object. 469 * visible for the given player-object.
476 */ 470 */
477 471
478void 472void
479update_los (object *op) 473update_los (object *op)
480{ 474{
481 int dx = op->contr->socket.mapx / 2, dy = op->contr->socket.mapy / 2, x, y; 475 int dx = op->contr->ns->mapx / 2, dy = op->contr->ns->mapy / 2, x, y;
482 476
483 if (QUERY_FLAG (op, FLAG_REMOVED)) 477 if (QUERY_FLAG (op, FLAG_REMOVED))
484 return; 478 return;
485 479
486 clear_los (op); 480 clear_los (op);
490 /* For larger maps, this is more efficient than the old way which 484 /* For larger maps, this is more efficient than the old way which
491 * used the chaining of the block array. Since many space views could 485 * used the chaining of the block array. Since many space views could
492 * be blocked by different spaces in front, this mean that a lot of spaces 486 * be blocked by different spaces in front, this mean that a lot of spaces
493 * could be examined multile times, as each path would be looked at. 487 * could be examined multile times, as each path would be looked at.
494 */ 488 */
495 for (x = (MAP_CLIENT_X - op->contr->socket.mapx) / 2 - 1; x < (MAP_CLIENT_X + op->contr->socket.mapx) / 2 + 1; x++) 489 for (x = (MAP_CLIENT_X - op->contr->ns->mapx) / 2 - 1; x < (MAP_CLIENT_X + op->contr->ns->mapx) / 2 + 1; x++)
496 for (y = (MAP_CLIENT_Y - op->contr->socket.mapy) / 2 - 1; y < (MAP_CLIENT_Y + op->contr->socket.mapy) / 2 + 1; y++) 490 for (y = (MAP_CLIENT_Y - op->contr->ns->mapy) / 2 - 1; y < (MAP_CLIENT_Y + op->contr->ns->mapy) / 2 + 1; y++)
497 check_wall (op, x, y); 491 check_wall (op, x, y);
498 492
499 493
500 /* do the los of the player. 3 (potential) cases */ 494 /* do the los of the player. 3 (potential) cases */
501 if (QUERY_FLAG (op, FLAG_BLIND)) /* player is blind */ 495 if (QUERY_FLAG (op, FLAG_BLIND)) /* player is blind */
523 * players, which is should not be. 517 * players, which is should not be.
524 * Currently, this function is called from the 518 * Currently, this function is called from the
525 * change_map_light function 519 * change_map_light function
526 */ 520 */
527void 521void
528update_all_map_los (mapstruct *map) 522update_all_map_los (maptile *map)
529{ 523{
530 player *pl; 524 for_all_players (pl)
531
532 for (pl = first_player; pl != NULL; pl = pl->next)
533 {
534 if (pl->ob->map == map) 525 if (pl->ob->map == map)
535 pl->do_los = 1; 526 pl->do_los = 1;
536 }
537} 527}
538 528
539 529
540/* 530/*
541 * This function makes sure that update_los() will be called for all 531 * This function makes sure that update_los() will be called for all
549 * 539 *
550 * map is the map that changed, x and y are the coordinates. 540 * map is the map that changed, x and y are the coordinates.
551 */ 541 */
552 542
553void 543void
554update_all_los (const mapstruct *map, int x, int y) 544update_all_los (const maptile *map, int x, int y)
555{ 545{
556 player *pl; 546 for_all_players (pl)
557
558 for (pl = first_player; pl != NULL; pl = pl->next)
559 { 547 {
560 /* Player should not have a null map, but do this 548 /* Player should not have a null map, but do this
561 * check as a safety 549 * check as a safety
562 */ 550 */
563 if (!pl->ob->map) 551 if (!pl->ob->map)
572 * so by setting it up this way, we trim processing 560 * so by setting it up this way, we trim processing
573 * some. 561 * some.
574 */ 562 */
575 if (pl->ob->map == map) 563 if (pl->ob->map == map)
576 { 564 {
577 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 565 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
578 pl->do_los = 1; 566 pl->do_los = 1;
579 } 567 }
580 /* Now we check to see if player is on adjacent 568 /* Now we check to see if player is on adjacent
581 * maps to the one that changed and also within 569 * maps to the one that changed and also within
582 * view. The tile_maps[] could be null, but in that 570 * view. The tile_maps[] could be null, but in that
593 * and then add the players location, which gives 581 * and then add the players location, which gives
594 * a distance. 582 * a distance.
595 */ 583 */
596 else if (pl->ob->map == map->tile_map[0]) 584 else if (pl->ob->map == map->tile_map[0])
597 { 585 {
598 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (y + MAP_HEIGHT (map->tile_map[0]) - pl->ob->y) <= pl->socket.mapy / 2)) 586 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (y + MAP_HEIGHT (map->tile_map[0]) - pl->ob->y) <= pl->ns->mapy / 2))
599 pl->do_los = 1; 587 pl->do_los = 1;
600 } 588 }
601 else if (pl->ob->map == map->tile_map[2]) 589 else if (pl->ob->map == map->tile_map[2])
602 { 590 {
603 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y + MAP_HEIGHT (map) - y) <= pl->socket.mapy / 2)) 591 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y + MAP_HEIGHT (map) - y) <= pl->ns->mapy / 2))
604 pl->do_los = 1; 592 pl->do_los = 1;
605 } 593 }
606 else if (pl->ob->map == map->tile_map[1]) 594 else if (pl->ob->map == map->tile_map[1])
607 { 595 {
608 if ((abs (pl->ob->x + MAP_WIDTH (map) - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 596 if ((abs (pl->ob->x + MAP_WIDTH (map) - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
609 pl->do_los = 1; 597 pl->do_los = 1;
610 } 598 }
611 else if (pl->ob->map == map->tile_map[3]) 599 else if (pl->ob->map == map->tile_map[3])
612 { 600 {
613 if ((abs (x + MAP_WIDTH (map->tile_map[3]) - pl->ob->x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 601 if ((abs (x + MAP_WIDTH (map->tile_map[3]) - pl->ob->x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
614 pl->do_los = 1; 602 pl->do_los = 1;
615 } 603 }
616 } 604 }
617} 605}
618 606
619/* 607/*
620 * Debug-routine which dumps the array which specifies the visible 608 * Debug-routine which dumps the array which specifies the visible
621 * area of a player. Triggered by the z key in DM mode. 609 * area of a player. Triggered by the z key in DM mode.
622 */ 610 */
623
624void 611void
625print_los (object *op) 612print_los (object *op)
626{ 613{
627 int x, y; 614 int x, y;
628 char buf[50], buf2[10]; 615 char buf[50], buf2[10];
629 616
630 strcpy (buf, " "); 617 strcpy (buf, " ");
618
631 for (x = 0; x < op->contr->socket.mapx; x++) 619 for (x = 0; x < op->contr->ns->mapx; x++)
632 { 620 {
633 sprintf (buf2, "%2d", x); 621 sprintf (buf2, "%2d", x);
634 strcat (buf, buf2); 622 strcat (buf, buf2);
635 } 623 }
624
636 new_draw_info (NDI_UNIQUE, 0, op, buf); 625 new_draw_info (NDI_UNIQUE, 0, op, buf);
626
637 for (y = 0; y < op->contr->socket.mapy; y++) 627 for (y = 0; y < op->contr->ns->mapy; y++)
638 { 628 {
639 sprintf (buf, "%2d:", y); 629 sprintf (buf, "%2d:", y);
630
640 for (x = 0; x < op->contr->socket.mapx; x++) 631 for (x = 0; x < op->contr->ns->mapx; x++)
641 { 632 {
642 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]); 633 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]);
643 strcat (buf, buf2); 634 strcat (buf, buf2);
644 } 635 }
636
645 new_draw_info (NDI_UNIQUE, 0, op, buf); 637 new_draw_info (NDI_UNIQUE, 0, op, buf);
646 } 638 }
647} 639}
648 640
649/* 641/*
652 */ 644 */
653 645
654void 646void
655make_sure_seen (const object *op) 647make_sure_seen (const object *op)
656{ 648{
657 player *pl; 649 for_all_players (pl)
658
659 for (pl = first_player; pl; pl = pl->next)
660 if (pl->ob->map == op->map && 650 if (pl->ob->map == op->map &&
661 pl->ob->y - pl->socket.mapy / 2 <= op->y && 651 pl->ob->y - pl->ns->mapy / 2 <= op->y &&
662 pl->ob->y + pl->socket.mapy / 2 >= op->y && pl->ob->x - pl->socket.mapx / 2 <= op->x && pl->ob->x + pl->socket.mapx / 2 >= op->x) 652 pl->ob->y + pl->ns->mapy / 2 >= op->y && pl->ob->x - pl->ns->mapx / 2 <= op->x && pl->ob->x + pl->ns->mapx / 2 >= op->x)
663 pl->blocked_los[pl->socket.mapx / 2 + op->x - pl->ob->x][pl->socket.mapy / 2 + op->y - pl->ob->y] = 0; 653 pl->blocked_los[pl->ns->mapx / 2 + op->x - pl->ob->x][pl->ns->mapy / 2 + op->y - pl->ob->y] = 0;
664} 654}
665 655
666/* 656/*
667 * make_sure_not_seen: The object which is supposed to be visible through 657 * make_sure_not_seen: The object which is supposed to be visible through
668 * walls has just been removed from the map, so update the los of any 658 * walls has just been removed from the map, so update the los of any
670 */ 660 */
671 661
672void 662void
673make_sure_not_seen (const object *op) 663make_sure_not_seen (const object *op)
674{ 664{
675 player *pl; 665 for_all_players (pl)
676
677 for (pl = first_player; pl; pl = pl->next)
678 if (pl->ob->map == op->map && 666 if (pl->ob->map == op->map &&
679 pl->ob->y - pl->socket.mapy / 2 <= op->y && 667 pl->ob->y - pl->ns->mapy / 2 <= op->y &&
680 pl->ob->y + pl->socket.mapy / 2 >= op->y && pl->ob->x - pl->socket.mapx / 2 <= op->x && pl->ob->x + pl->socket.mapx / 2 >= op->x) 668 pl->ob->y + pl->ns->mapy / 2 >= op->y && pl->ob->x - pl->ns->mapx / 2 <= op->x && pl->ob->x + pl->ns->mapx / 2 >= op->x)
681 pl->do_los = 1; 669 pl->do_los = 1;
682} 670}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines