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.7 by root, Mon Dec 11 21:32:16 2006 UTC vs.
Revision 1.16 by pippijn, Sat Jan 6 14:42:29 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
188 int dx = block[x][y].x[i], dy = block[x][y].y[i], ax, ay; 189 int dx = block[x][y].x[i], dy = block[x][y].y[i], ax, ay;
189 190
190 /* ax, ay are the values as adjusted to be in the 191 /* ax, ay are the values as adjusted to be in the
191 * socket look structure. 192 * socket look structure.
192 */ 193 */
193 ax = dx - (MAP_CLIENT_X - op->contr->socket.mapx) / 2; 194 ax = dx - (MAP_CLIENT_X - op->contr->ns->mapx) / 2;
194 ay = dy - (MAP_CLIENT_Y - op->contr->socket.mapy) / 2; 195 ay = dy - (MAP_CLIENT_Y - op->contr->ns->mapy) / 2;
195 196
196 if (ax < 0 || ax >= op->contr->socket.mapx || ay < 0 || ay >= op->contr->socket.mapy) 197 if (ax < 0 || ax >= op->contr->ns->mapx || ay < 0 || ay >= op->contr->ns->mapy)
197 continue; 198 continue;
198#if 0 199#if 0
199 LOG (llevDebug, "blocked %d %d -> %d %d\n", dx, dy, ax, ay); 200 LOG (llevDebug, "blocked %d %d -> %d %d\n", dx, dy, ax, ay);
200#endif 201#endif
201 /* we need to adjust to the fact that the socket 202 /* we need to adjust to the fact that the socket
220 221
221 if (!block[x][y].index) 222 if (!block[x][y].index)
222 return; 223 return;
223 224
224 /* ax, ay are coordinates as indexed into the look window */ 225 /* ax, ay are coordinates as indexed into the look window */
225 ax = x - (MAP_CLIENT_X - op->contr->socket.mapx) / 2; 226 ax = x - (MAP_CLIENT_X - op->contr->ns->mapx) / 2;
226 ay = y - (MAP_CLIENT_Y - op->contr->socket.mapy) / 2; 227 ay = y - (MAP_CLIENT_Y - op->contr->ns->mapy) / 2;
227 228
228 /* If the converted coordinates are outside the viewable 229 /* If the converted coordinates are outside the viewable
229 * area for the client, return now. 230 * area for the client, return now.
230 */ 231 */
231 if (ax < 0 || ay < 0 || ax >= op->contr->socket.mapx || ay >= op->contr->socket.mapy) 232 if (ax < 0 || ay < 0 || ax >= op->contr->ns->mapx || ay >= op->contr->ns->mapy)
232 return; 233 return;
233 234
234#if 0 235#if 0
235 LOG (llevDebug, "check_wall, ax,ay=%d, %d x,y = %d, %d blocksview = %d, %d\n", 236 LOG (llevDebug, "check_wall, ax,ay=%d, %d x,y = %d, %d blocksview = %d, %d\n",
236 ax, ay, x, y, op->x + x - MAP_CLIENT_X / 2, op->y + y - MAP_CLIENT_Y / 2); 237 ax, ay, x, y, op->x + x - MAP_CLIENT_X / 2, op->y + y - MAP_CLIENT_Y / 2);
254 */ 255 */
255 256
256void 257void
257clear_los (object *op) 258clear_los (object *op)
258{ 259{
259 /* This is safer than using the socket->mapx, mapy because 260 /* This is safer than using the ns->mapx, mapy because
260 * we index the blocked_los as a 2 way array, so clearing 261 * we index the blocked_los as a 2 way array, so clearing
261 * the first z spaces may not not cover the spaces we are 262 * the first z spaces may not not cover the spaces we are
262 * actually going to use 263 * actually going to use
263 */ 264 */
264 (void) memset ((void *) op->contr->blocked_los, 0, MAP_CLIENT_X * MAP_CLIENT_Y); 265 (void) memset ((void *) op->contr->blocked_los, 0, MAP_CLIENT_X * MAP_CLIENT_Y);
274static void 275static void
275expand_sight (object *op) 276expand_sight (object *op)
276{ 277{
277 int i, x, y, dx, dy; 278 int i, x, y, dx, dy;
278 279
279 for (x = 1; x < op->contr->socket.mapx - 1; x++) /* loop over inner squares */ 280 for (x = 1; x < op->contr->ns->mapx - 1; x++) /* loop over inner squares */
280 for (y = 1; y < op->contr->socket.mapy - 1; y++) 281 for (y = 1; y < op->contr->ns->mapy - 1; y++)
281 { 282 {
282 if (!op->contr->blocked_los[x][y] && 283 if (!op->contr->blocked_los[x][y] &&
283 !(get_map_flags (op->map, NULL, 284 !(get_map_flags (op->map, NULL,
284 op->x - op->contr->socket.mapx / 2 + x, 285 op->x - op->contr->ns->mapx / 2 + x,
285 op->y - op->contr->socket.mapy / 2 + y, NULL, NULL) & (P_BLOCKSVIEW | P_OUT_OF_MAP))) 286 op->y - op->contr->ns->mapy / 2 + y, NULL, NULL) & (P_BLOCKSVIEW | P_OUT_OF_MAP)))
286 { 287 {
287 288
288 for (i = 1; i <= 8; i += 1) 289 for (i = 1; i <= 8; i += 1)
289 { /* mark all directions */ 290 { /* mark all directions */
290 dx = x + freearr_x[i]; 291 dx = x + freearr_x[i];
293 op->contr->blocked_los[dx][dy] = -1; 294 op->contr->blocked_los[dx][dy] = -1;
294 } 295 }
295 } 296 }
296 } 297 }
297 298
298 if (MAP_DARKNESS (op->map) > 0) /* player is on a dark map */ 299 if (op->map->darkness > 0) /* player is on a dark map */
299 expand_lighted_sight (op); 300 expand_lighted_sight (op);
300 301
301 302
302 /* clear mark squares */ 303 /* clear mark squares */
303 for (x = 0; x < op->contr->socket.mapx; x++) 304 for (x = 0; x < op->contr->ns->mapx; x++)
304 for (y = 0; y < op->contr->socket.mapy; y++) 305 for (y = 0; y < op->contr->ns->mapy; y++)
305 if (op->contr->blocked_los[x][y] < 0) 306 if (op->contr->blocked_los[x][y] < 0)
306 op->contr->blocked_los[x][y] = 0; 307 op->contr->blocked_los[x][y] = 0;
307} 308}
308 309
309 310
330{ 331{
331 int x, y, darklevel, ax, ay, basex, basey, mflags, light, x1, y1; 332 int x, y, darklevel, ax, ay, basex, basey, mflags, light, x1, y1;
332 maptile *m = op->map; 333 maptile *m = op->map;
333 sint16 nx, ny; 334 sint16 nx, ny;
334 335
335 darklevel = MAP_DARKNESS (m); 336 darklevel = m->darkness;
336 337
337 /* If the player can see in the dark, lower the darklevel for him */ 338 /* If the player can see in the dark, lower the darklevel for him */
338 if (QUERY_FLAG (op, FLAG_SEE_IN_DARK)) 339 if (QUERY_FLAG (op, FLAG_SEE_IN_DARK))
339 darklevel -= 2; 340 darklevel -= 2;
340 341
349 /* Do a sanity check. If not valid, some code below may do odd 350 /* Do a sanity check. If not valid, some code below may do odd
350 * things. 351 * things.
351 */ 352 */
352 if (darklevel > MAX_DARKNESS) 353 if (darklevel > MAX_DARKNESS)
353 { 354 {
354 LOG (llevError, "Map darkness for %s on %s is too high (%d)\n", &op->name, op->map->path, darklevel); 355 LOG (llevError, "Map darkness for %s on %s is too high (%d)\n", &op->name, &op->map->path, darklevel);
355 darklevel = MAX_DARKNESS; 356 darklevel = MAX_DARKNESS;
356 } 357 }
357 358
358 /* First, limit player furthest (unlighted) vision */ 359 /* First, limit player furthest (unlighted) vision */
359 for (x = 0; x < op->contr->socket.mapx; x++) 360 for (x = 0; x < op->contr->ns->mapx; x++)
360 for (y = 0; y < op->contr->socket.mapy; y++) 361 for (y = 0; y < op->contr->ns->mapy; y++)
361 if (op->contr->blocked_los[x][y] != 100) 362 if (op->contr->blocked_los[x][y] != 100)
362 op->contr->blocked_los[x][y] = MAX_LIGHT_RADII; 363 op->contr->blocked_los[x][y] = MAX_LIGHT_RADII;
363 364
364 /* the spaces[] darkness value contains the information we need. 365 /* the spaces[] darkness value contains the information we need.
365 * Only process the area of interest. 366 * Only process the area of interest.
366 * the basex, basey values represent the position in the op->contr->blocked_los 367 * the basex, basey values represent the position in the op->contr->blocked_los
367 * array. Its easier to just increment them here (and start with the right 368 * array. Its easier to just increment them here (and start with the right
368 * value) than to recalculate them down below. 369 * value) than to recalculate them down below.
369 */ 370 */
370 for (x = (op->x - op->contr->socket.mapx / 2 - MAX_LIGHT_RADII), basex = -MAX_LIGHT_RADII; 371 for (x = (op->x - op->contr->ns->mapx / 2 - MAX_LIGHT_RADII), basex = -MAX_LIGHT_RADII;
371 x <= (op->x + op->contr->socket.mapx / 2 + MAX_LIGHT_RADII); x++, basex++) 372 x <= (op->x + op->contr->ns->mapx / 2 + MAX_LIGHT_RADII); x++, basex++)
372 { 373 {
373 374
374 for (y = (op->y - op->contr->socket.mapy / 2 - MAX_LIGHT_RADII), basey = -MAX_LIGHT_RADII; 375 for (y = (op->y - op->contr->ns->mapy / 2 - MAX_LIGHT_RADII), basey = -MAX_LIGHT_RADII;
375 y <= (op->y + op->contr->socket.mapy / 2 + MAX_LIGHT_RADII); y++, basey++) 376 y <= (op->y + op->contr->ns->mapy / 2 + MAX_LIGHT_RADII); y++, basey++)
376 { 377 {
377 m = op->map; 378 m = op->map;
378 nx = x; 379 nx = x;
379 ny = y; 380 ny = y;
380 381
392#if 0 393#if 0
393 LOG (llevDebug, "expand_lighted_sight: Found light at x=%d, y=%d, basex=%d, basey=%d\n", x, y, basex, basey); 394 LOG (llevDebug, "expand_lighted_sight: Found light at x=%d, y=%d, basex=%d, basey=%d\n", x, y, basex, basey);
394#endif 395#endif
395 for (ax = basex - light; ax <= basex + light; ax++) 396 for (ax = basex - light; ax <= basex + light; ax++)
396 { 397 {
397 if (ax < 0 || ax >= op->contr->socket.mapx) 398 if (ax < 0 || ax >= op->contr->ns->mapx)
398 continue; 399 continue;
399 for (ay = basey - light; ay <= basey + light; ay++) 400 for (ay = basey - light; ay <= basey + light; ay++)
400 { 401 {
401 if (ay < 0 || ay >= op->contr->socket.mapy) 402 if (ay < 0 || ay >= op->contr->ns->mapy)
402 continue; 403 continue;
403 404
404 /* If the space is fully blocked, do nothing. Otherwise, we 405 /* If the space is fully blocked, do nothing. Otherwise, we
405 * brighten the space. The further the light is away from the 406 * brighten the space. The further the light is away from the
406 * source (basex-x), the less effect it has. Though light used 407 * source (basex-x), the less effect it has. Though light used
426 /* Outdoor should never really be completely pitch black dark like 427 /* Outdoor should never really be completely pitch black dark like
427 * a dungeon, so let the player at least see a little around themselves 428 * a dungeon, so let the player at least see a little around themselves
428 */ 429 */
429 if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3)) 430 if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3))
430 { 431 {
431 if (op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] > (MAX_DARKNESS - 3)) 432 if (op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] > (MAX_DARKNESS - 3))
432 op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] = MAX_DARKNESS - 3; 433 op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] = MAX_DARKNESS - 3;
433 434
434 for (x = -1; x <= 1; x++) 435 for (x = -1; x <= 1; x++)
435 for (y = -1; y <= 1; y++) 436 for (y = -1; y <= 1; y++)
436 { 437 {
437 if (op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] > (MAX_DARKNESS - 2)) 438 if (op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] > (MAX_DARKNESS - 2))
438 op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] = MAX_DARKNESS - 2; 439 op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] = MAX_DARKNESS - 2;
439 } 440 }
440 } 441 }
441 /* grant some vision to the player, based on the darklevel */ 442 /* grant some vision to the player, based on the darklevel */
442 for (x = darklevel - MAX_DARKNESS; x < MAX_DARKNESS + 1 - darklevel; x++) 443 for (x = darklevel - MAX_DARKNESS; x < MAX_DARKNESS + 1 - darklevel; x++)
443 for (y = darklevel - MAX_DARKNESS; y < MAX_DARKNESS + 1 - darklevel; y++) 444 for (y = darklevel - MAX_DARKNESS; y < MAX_DARKNESS + 1 - darklevel; y++)
444 if (!(op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] == 100)) 445 if (!(op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] == 100))
445 op->contr->blocked_los[x + op->contr->socket.mapx / 2][y + op->contr->socket.mapy / 2] -= 446 op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] -=
446 MAX (0, 6 - darklevel - MAX (abs (x), abs (y))); 447 MAX (0, 6 - darklevel - MAX (abs (x), abs (y)));
447} 448}
448 449
449/* blinded_sight() - sets all veiwable squares to blocked except 450/* blinded_sight() - sets all veiwable squares to blocked except
450 * for the one the central one that the player occupies. A little 451 * for the one the central one that the player occupies. A little
455static void 456static void
456blinded_sight (object *op) 457blinded_sight (object *op)
457{ 458{
458 int x, y; 459 int x, y;
459 460
460 for (x = 0; x < op->contr->socket.mapx; x++) 461 for (x = 0; x < op->contr->ns->mapx; x++)
461 for (y = 0; y < op->contr->socket.mapy; y++) 462 for (y = 0; y < op->contr->ns->mapy; y++)
462 op->contr->blocked_los[x][y] = 100; 463 op->contr->blocked_los[x][y] = 100;
463 464
464 op->contr->blocked_los[op->contr->socket.mapx / 2][op->contr->socket.mapy / 2] = 0; 465 op->contr->blocked_los[op->contr->ns->mapx / 2][op->contr->ns->mapy / 2] = 0;
465} 466}
466 467
467/* 468/*
468 * update_los() recalculates the array which specifies what is 469 * update_los() recalculates the array which specifies what is
469 * visible for the given player-object. 470 * visible for the given player-object.
470 */ 471 */
471 472
472void 473void
473update_los (object *op) 474update_los (object *op)
474{ 475{
475 int dx = op->contr->socket.mapx / 2, dy = op->contr->socket.mapy / 2, x, y; 476 int dx = op->contr->ns->mapx / 2, dy = op->contr->ns->mapy / 2, x, y;
476 477
477 if (QUERY_FLAG (op, FLAG_REMOVED)) 478 if (QUERY_FLAG (op, FLAG_REMOVED))
478 return; 479 return;
479 480
480 clear_los (op); 481 clear_los (op);
484 /* For larger maps, this is more efficient than the old way which 485 /* For larger maps, this is more efficient than the old way which
485 * used the chaining of the block array. Since many space views could 486 * used the chaining of the block array. Since many space views could
486 * be blocked by different spaces in front, this mean that a lot of spaces 487 * be blocked by different spaces in front, this mean that a lot of spaces
487 * could be examined multile times, as each path would be looked at. 488 * could be examined multile times, as each path would be looked at.
488 */ 489 */
489 for (x = (MAP_CLIENT_X - op->contr->socket.mapx) / 2 - 1; x < (MAP_CLIENT_X + op->contr->socket.mapx) / 2 + 1; x++) 490 for (x = (MAP_CLIENT_X - op->contr->ns->mapx) / 2 - 1; x < (MAP_CLIENT_X + op->contr->ns->mapx) / 2 + 1; x++)
490 for (y = (MAP_CLIENT_Y - op->contr->socket.mapy) / 2 - 1; y < (MAP_CLIENT_Y + op->contr->socket.mapy) / 2 + 1; y++) 491 for (y = (MAP_CLIENT_Y - op->contr->ns->mapy) / 2 - 1; y < (MAP_CLIENT_Y + op->contr->ns->mapy) / 2 + 1; y++)
491 check_wall (op, x, y); 492 check_wall (op, x, y);
492 493
493 494
494 /* do the los of the player. 3 (potential) cases */ 495 /* do the los of the player. 3 (potential) cases */
495 if (QUERY_FLAG (op, FLAG_BLIND)) /* player is blind */ 496 if (QUERY_FLAG (op, FLAG_BLIND)) /* player is blind */
507 } 508 }
508} 509}
509 510
510/* update all_map_los is like update_all_los below, 511/* update all_map_los is like update_all_los below,
511 * but updates everyone on the map, no matter where they 512 * but updates everyone on the map, no matter where they
512 * are. This generally should not be used, as a per 513 * are. This generally should not be used, as a per
513 * specific map change doesn't make much sense when tiling 514 * specific map change doesn't make much sense when tiling
514 * is considered (lowering darkness would certainly be a 515 * is considered (lowering darkness would certainly be a
515 * strange effect if done on a tile map, as it makes 516 * strange effect if done on a tile map, as it makes
516 * the distinction between maps much more obvious to the 517 * the distinction between maps much more obvious to the
517 * players, which is should not be. 518 * players, which is should not be.
519 * change_map_light function 520 * change_map_light function
520 */ 521 */
521void 522void
522update_all_map_los (maptile *map) 523update_all_map_los (maptile *map)
523{ 524{
524 player *pl; 525 for_all_players (pl)
525
526 for (pl = first_player; pl != NULL; pl = pl->next)
527 {
528 if (pl->ob->map == map) 526 if (pl->ob && pl->ob->map == map)
529 pl->do_los = 1; 527 pl->do_los = 1;
530 }
531} 528}
532
533 529
534/* 530/*
535 * 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
536 * players on the given map within the next frame. 532 * players on the given map within the next frame.
537 * It is triggered by removal or inserting of objects which blocks 533 * It is triggered by removal or inserting of objects which blocks
541 * means that just being on the same map is not sufficient - the 537 * means that just being on the same map is not sufficient - the
542 * space that changes must be withing your viewable area. 538 * space that changes must be withing your viewable area.
543 * 539 *
544 * 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.
545 */ 541 */
546
547void 542void
548update_all_los (const maptile *map, int x, int y) 543update_all_los (const maptile *map, int x, int y)
549{ 544{
550 player *pl; 545 for_all_players (pl)
551
552 for (pl = first_player; pl != NULL; pl = pl->next)
553 { 546 {
554 /* Player should not have a null map, but do this 547 /* Player should not have a null map, but do this
555 * check as a safety 548 * check as a safety
556 */ 549 */
557 if (!pl->ob->map) 550 if (!pl->ob || !pl->ob->map || !pl->ns)
558 continue; 551 continue;
559 552
560 /* Same map is simple case - see if pl is close enough. 553 /* Same map is simple case - see if pl is close enough.
561 * Note in all cases, we did the check for same map first, 554 * Note in all cases, we did the check for same map first,
562 * and then see if the player is close enough and update 555 * and then see if the player is close enough and update
566 * so by setting it up this way, we trim processing 559 * so by setting it up this way, we trim processing
567 * some. 560 * some.
568 */ 561 */
569 if (pl->ob->map == map) 562 if (pl->ob->map == map)
570 { 563 {
571 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 564 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
572 pl->do_los = 1; 565 pl->do_los = 1;
573 } 566 }
567
574 /* Now we check to see if player is on adjacent 568 /* Now we check to see if player is on adjacent
575 * maps to the one that changed and also within 569 * maps to the one that changed and also within
576 * view. The tile_maps[] could be null, but in that 570 * view. The tile_maps[] could be null, but in that
577 * case it should never match the pl->ob->map, so 571 * case it should never match the pl->ob->map, so
578 * we want ever try to dereference any of the data in it. 572 * we want ever try to dereference any of the data in it.
579 */ 573 *
580
581 /* The logic for 0 and 3 is to see how far the player is 574 * The logic for 0 and 3 is to see how far the player is
582 * from the edge of the map (height/width) - pl->ob->(x,y) 575 * from the edge of the map (height/width) - pl->ob->(x,y)
583 * and to add current position on this map - that gives a 576 * and to add current position on this map - that gives a
584 * distance. 577 * distance.
585 * For 1 and 2, we check to see how far the given 578 * For 1 and 2, we check to see how far the given
586 * coordinate (x,y) is from the corresponding edge, 579 * coordinate (x,y) is from the corresponding edge,
587 * and then add the players location, which gives 580 * and then add the players location, which gives
588 * a distance. 581 * a distance.
589 */ 582 */
590 else if (pl->ob->map == map->tile_map[0]) 583 else if (pl->ob->map == map->tile_map[0])
591 { 584 {
592 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)) 585 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (y + map->tile_map[0]->height - pl->ob->y) <= pl->ns->mapy / 2))
593 pl->do_los = 1; 586 pl->do_los = 1;
594 } 587 }
595 else if (pl->ob->map == map->tile_map[2]) 588 else if (pl->ob->map == map->tile_map[2])
596 { 589 {
597 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y + MAP_HEIGHT (map) - y) <= pl->socket.mapy / 2)) 590 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y + map->height - y) <= pl->ns->mapy / 2))
598 pl->do_los = 1; 591 pl->do_los = 1;
599 } 592 }
600 else if (pl->ob->map == map->tile_map[1]) 593 else if (pl->ob->map == map->tile_map[1])
601 { 594 {
602 if ((abs (pl->ob->x + MAP_WIDTH (map) - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 595 if ((abs (pl->ob->x + map->width - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
603 pl->do_los = 1; 596 pl->do_los = 1;
604 } 597 }
605 else if (pl->ob->map == map->tile_map[3]) 598 else if (pl->ob->map == map->tile_map[3])
606 { 599 {
607 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)) 600 if ((abs (x + map->tile_map[3]->width - pl->ob->x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
608 pl->do_los = 1; 601 pl->do_los = 1;
609 } 602 }
610 } 603 }
611} 604}
612 605
613/* 606/*
614 * Debug-routine which dumps the array which specifies the visible 607 * Debug-routine which dumps the array which specifies the visible
615 * area of a player. Triggered by the z key in DM mode. 608 * area of a player. Triggered by the z key in DM mode.
616 */ 609 */
617
618void 610void
619print_los (object *op) 611print_los (object *op)
620{ 612{
621 int x, y; 613 int x, y;
622 char buf[50], buf2[10]; 614 char buf[50], buf2[10];
623 615
624 strcpy (buf, " "); 616 strcpy (buf, " ");
617
625 for (x = 0; x < op->contr->socket.mapx; x++) 618 for (x = 0; x < op->contr->ns->mapx; x++)
626 { 619 {
627 sprintf (buf2, "%2d", x); 620 sprintf (buf2, "%2d", x);
628 strcat (buf, buf2); 621 strcat (buf, buf2);
629 } 622 }
623
630 new_draw_info (NDI_UNIQUE, 0, op, buf); 624 new_draw_info (NDI_UNIQUE, 0, op, buf);
625
631 for (y = 0; y < op->contr->socket.mapy; y++) 626 for (y = 0; y < op->contr->ns->mapy; y++)
632 { 627 {
633 sprintf (buf, "%2d:", y); 628 sprintf (buf, "%2d:", y);
629
634 for (x = 0; x < op->contr->socket.mapx; x++) 630 for (x = 0; x < op->contr->ns->mapx; x++)
635 { 631 {
636 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]); 632 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]);
637 strcat (buf, buf2); 633 strcat (buf, buf2);
638 } 634 }
635
639 new_draw_info (NDI_UNIQUE, 0, op, buf); 636 new_draw_info (NDI_UNIQUE, 0, op, buf);
640 } 637 }
641} 638}
642 639
643/* 640/*
646 */ 643 */
647 644
648void 645void
649make_sure_seen (const object *op) 646make_sure_seen (const object *op)
650{ 647{
651 player *pl; 648 for_all_players (pl)
652
653 for (pl = first_player; pl; pl = pl->next)
654 if (pl->ob->map == op->map && 649 if (pl->ob->map == op->map &&
655 pl->ob->y - pl->socket.mapy / 2 <= op->y && 650 pl->ob->y - pl->ns->mapy / 2 <= op->y &&
656 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) 651 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)
657 pl->blocked_los[pl->socket.mapx / 2 + op->x - pl->ob->x][pl->socket.mapy / 2 + op->y - pl->ob->y] = 0; 652 pl->blocked_los[pl->ns->mapx / 2 + op->x - pl->ob->x][pl->ns->mapy / 2 + op->y - pl->ob->y] = 0;
658} 653}
659 654
660/* 655/*
661 * make_sure_not_seen: The object which is supposed to be visible through 656 * make_sure_not_seen: The object which is supposed to be visible through
662 * walls has just been removed from the map, so update the los of any 657 * walls has just been removed from the map, so update the los of any
664 */ 659 */
665 660
666void 661void
667make_sure_not_seen (const object *op) 662make_sure_not_seen (const object *op)
668{ 663{
669 player *pl; 664 for_all_players (pl)
670
671 for (pl = first_player; pl; pl = pl->next)
672 if (pl->ob->map == op->map && 665 if (pl->ob->map == op->map &&
673 pl->ob->y - pl->socket.mapy / 2 <= op->y && 666 pl->ob->y - pl->ns->mapy / 2 <= op->y &&
674 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) 667 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)
675 pl->do_los = 1; 668 pl->do_los = 1;
676} 669}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines