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.14 by root, Mon Dec 25 14:54:44 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];
299 op->contr->blocked_los[dx][dy] = -1; 293 op->contr->blocked_los[dx][dy] = -1;
300 } 294 }
301 } 295 }
302 } 296 }
303 297
304 if (MAP_DARKNESS (op->map) > 0) /* player is on a dark map */ 298 if (op->map->darkness > 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 = m->darkness;
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 */
344 if (QUERY_FLAG (op, FLAG_SEE_IN_DARK)) 338 if (QUERY_FLAG (op, FLAG_SEE_IN_DARK))
345 darklevel -= 2; 339 darklevel -= 2;
346 340
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 */
513 } 507 }
514} 508}
515 509
516/* update all_map_los is like update_all_los below, 510/* update all_map_los is like update_all_los below,
517 * but updates everyone on the map, no matter where they 511 * but updates everyone on the map, no matter where they
518 * are. This generally should not be used, as a per 512 * are. This generally should not be used, as a per
519 * specific map change doesn't make much sense when tiling 513 * specific map change doesn't make much sense when tiling
520 * is considered (lowering darkness would certainly be a 514 * is considered (lowering darkness would certainly be a
521 * strange effect if done on a tile map, as it makes 515 * strange effect if done on a tile map, as it makes
522 * the distinction between maps much more obvious to the 516 * the distinction between maps much more obvious to the
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 && pl->ob->map == map)
535 pl->do_los = 1; 526 pl->do_los = 1;
536 }
537} 527}
538
539 528
540/* 529/*
541 * This function makes sure that update_los() will be called for all 530 * This function makes sure that update_los() will be called for all
542 * players on the given map within the next frame. 531 * players on the given map within the next frame.
543 * It is triggered by removal or inserting of objects which blocks 532 * It is triggered by removal or inserting of objects which blocks
547 * means that just being on the same map is not sufficient - the 536 * means that just being on the same map is not sufficient - the
548 * space that changes must be withing your viewable area. 537 * space that changes must be withing your viewable area.
549 * 538 *
550 * map is the map that changed, x and y are the coordinates. 539 * map is the map that changed, x and y are the coordinates.
551 */ 540 */
552
553void 541void
554update_all_los (const mapstruct *map, int x, int y) 542update_all_los (const maptile *map, int x, int y)
555{ 543{
556 player *pl; 544 for_all_players (pl)
557
558 for (pl = first_player; pl != NULL; pl = pl->next)
559 { 545 {
560 /* Player should not have a null map, but do this 546 /* Player should not have a null map, but do this
561 * check as a safety 547 * check as a safety
562 */ 548 */
563 if (!pl->ob->map) 549 if (!pl->ob || !pl->ob->map || !pl->ns)
564 continue; 550 continue;
565 551
566 /* Same map is simple case - see if pl is close enough. 552 /* Same map is simple case - see if pl is close enough.
567 * Note in all cases, we did the check for same map first, 553 * Note in all cases, we did the check for same map first,
568 * and then see if the player is close enough and update 554 * and then see if the player is close enough and update
572 * so by setting it up this way, we trim processing 558 * so by setting it up this way, we trim processing
573 * some. 559 * some.
574 */ 560 */
575 if (pl->ob->map == map) 561 if (pl->ob->map == map)
576 { 562 {
577 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 563 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
578 pl->do_los = 1; 564 pl->do_los = 1;
579 } 565 }
566
580 /* Now we check to see if player is on adjacent 567 /* Now we check to see if player is on adjacent
581 * maps to the one that changed and also within 568 * maps to the one that changed and also within
582 * view. The tile_maps[] could be null, but in that 569 * view. The tile_maps[] could be null, but in that
583 * case it should never match the pl->ob->map, so 570 * case it should never match the pl->ob->map, so
584 * we want ever try to dereference any of the data in it. 571 * we want ever try to dereference any of the data in it.
585 */ 572 *
586
587 /* The logic for 0 and 3 is to see how far the player is 573 * The logic for 0 and 3 is to see how far the player is
588 * from the edge of the map (height/width) - pl->ob->(x,y) 574 * from the edge of the map (height/width) - pl->ob->(x,y)
589 * and to add current position on this map - that gives a 575 * and to add current position on this map - that gives a
590 * distance. 576 * distance.
591 * For 1 and 2, we check to see how far the given 577 * For 1 and 2, we check to see how far the given
592 * coordinate (x,y) is from the corresponding edge, 578 * coordinate (x,y) is from the corresponding edge,
593 * and then add the players location, which gives 579 * and then add the players location, which gives
594 * a distance. 580 * a distance.
595 */ 581 */
596 else if (pl->ob->map == map->tile_map[0]) 582 else if (pl->ob->map == map->tile_map[0])
597 { 583 {
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)) 584 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (y + map->tile_map[0]->height - pl->ob->y) <= pl->ns->mapy / 2))
599 pl->do_los = 1; 585 pl->do_los = 1;
600 } 586 }
601 else if (pl->ob->map == map->tile_map[2]) 587 else if (pl->ob->map == map->tile_map[2])
602 { 588 {
603 if ((abs (pl->ob->x - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y + MAP_HEIGHT (map) - y) <= pl->socket.mapy / 2)) 589 if ((abs (pl->ob->x - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y + map->height - y) <= pl->ns->mapy / 2))
604 pl->do_los = 1; 590 pl->do_los = 1;
605 } 591 }
606 else if (pl->ob->map == map->tile_map[1]) 592 else if (pl->ob->map == map->tile_map[1])
607 { 593 {
608 if ((abs (pl->ob->x + MAP_WIDTH (map) - x) <= pl->socket.mapx / 2) && (abs (pl->ob->y - y) <= pl->socket.mapy / 2)) 594 if ((abs (pl->ob->x + map->width - x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
609 pl->do_los = 1; 595 pl->do_los = 1;
610 } 596 }
611 else if (pl->ob->map == map->tile_map[3]) 597 else if (pl->ob->map == map->tile_map[3])
612 { 598 {
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)) 599 if ((abs (x + map->tile_map[3]->width - pl->ob->x) <= pl->ns->mapx / 2) && (abs (pl->ob->y - y) <= pl->ns->mapy / 2))
614 pl->do_los = 1; 600 pl->do_los = 1;
615 } 601 }
616 } 602 }
617} 603}
618 604
619/* 605/*
620 * Debug-routine which dumps the array which specifies the visible 606 * Debug-routine which dumps the array which specifies the visible
621 * area of a player. Triggered by the z key in DM mode. 607 * area of a player. Triggered by the z key in DM mode.
622 */ 608 */
623
624void 609void
625print_los (object *op) 610print_los (object *op)
626{ 611{
627 int x, y; 612 int x, y;
628 char buf[50], buf2[10]; 613 char buf[50], buf2[10];
629 614
630 strcpy (buf, " "); 615 strcpy (buf, " ");
616
631 for (x = 0; x < op->contr->socket.mapx; x++) 617 for (x = 0; x < op->contr->ns->mapx; x++)
632 { 618 {
633 sprintf (buf2, "%2d", x); 619 sprintf (buf2, "%2d", x);
634 strcat (buf, buf2); 620 strcat (buf, buf2);
635 } 621 }
622
636 new_draw_info (NDI_UNIQUE, 0, op, buf); 623 new_draw_info (NDI_UNIQUE, 0, op, buf);
624
637 for (y = 0; y < op->contr->socket.mapy; y++) 625 for (y = 0; y < op->contr->ns->mapy; y++)
638 { 626 {
639 sprintf (buf, "%2d:", y); 627 sprintf (buf, "%2d:", y);
628
640 for (x = 0; x < op->contr->socket.mapx; x++) 629 for (x = 0; x < op->contr->ns->mapx; x++)
641 { 630 {
642 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]); 631 sprintf (buf2, " %1d", op->contr->blocked_los[x][y]);
643 strcat (buf, buf2); 632 strcat (buf, buf2);
644 } 633 }
634
645 new_draw_info (NDI_UNIQUE, 0, op, buf); 635 new_draw_info (NDI_UNIQUE, 0, op, buf);
646 } 636 }
647} 637}
648 638
649/* 639/*
652 */ 642 */
653 643
654void 644void
655make_sure_seen (const object *op) 645make_sure_seen (const object *op)
656{ 646{
657 player *pl; 647 for_all_players (pl)
658
659 for (pl = first_player; pl; pl = pl->next)
660 if (pl->ob->map == op->map && 648 if (pl->ob->map == op->map &&
661 pl->ob->y - pl->socket.mapy / 2 <= op->y && 649 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) 650 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; 651 pl->blocked_los[pl->ns->mapx / 2 + op->x - pl->ob->x][pl->ns->mapy / 2 + op->y - pl->ob->y] = 0;
664} 652}
665 653
666/* 654/*
667 * make_sure_not_seen: The object which is supposed to be visible through 655 * 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 656 * walls has just been removed from the map, so update the los of any
670 */ 658 */
671 659
672void 660void
673make_sure_not_seen (const object *op) 661make_sure_not_seen (const object *op)
674{ 662{
675 player *pl; 663 for_all_players (pl)
676
677 for (pl = first_player; pl; pl = pl->next)
678 if (pl->ob->map == op->map && 664 if (pl->ob->map == op->map &&
679 pl->ob->y - pl->socket.mapy / 2 <= op->y && 665 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) 666 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; 667 pl->do_los = 1;
682} 668}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines