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 | /* Nov 95 - inserted USE_LIGHTING code stuff in here - b.t. */ |
25 | /* Nov 95 - inserted USE_LIGHTING code stuff in here - b.t. */ |
25 | |
26 | |
26 | #include <global.h> |
27 | #include <global.h> |
27 | #include <funcpoint.h> |
28 | #include <funcpoint.h> |
28 | #include <math.h> |
29 | #include <math.h> |
29 | |
|
|
30 | |
30 | |
31 | /* Distance must be less than this for the object to be blocked. |
31 | /* Distance must be less than this for the object to be blocked. |
32 | * An object is 1.0 wide, so if set to 0.5, it means the object |
32 | * An object is 1.0 wide, so if set to 0.5, it means the object |
33 | * that blocks half the view (0.0 is complete block) will |
33 | * that blocks half the view (0.0 is complete block) will |
34 | * block view in our tables. |
34 | * block view in our tables. |
… | |
… | |
349 | /* Do a sanity check. If not valid, some code below may do odd |
349 | /* Do a sanity check. If not valid, some code below may do odd |
350 | * things. |
350 | * things. |
351 | */ |
351 | */ |
352 | if (darklevel > MAX_DARKNESS) |
352 | if (darklevel > MAX_DARKNESS) |
353 | { |
353 | { |
354 | 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); |
355 | darklevel = MAX_DARKNESS; |
355 | darklevel = MAX_DARKNESS; |
356 | } |
356 | } |
357 | |
357 | |
358 | /* First, limit player furthest (unlighted) vision */ |
358 | /* First, limit player furthest (unlighted) vision */ |
359 | for (x = 0; x < op->contr->ns->mapx; x++) |
359 | for (x = 0; x < op->contr->ns->mapx; x++) |
… | |
… | |
394 | #endif |
394 | #endif |
395 | for (ax = basex - light; ax <= basex + light; ax++) |
395 | for (ax = basex - light; ax <= basex + light; ax++) |
396 | { |
396 | { |
397 | if (ax < 0 || ax >= op->contr->ns->mapx) |
397 | if (ax < 0 || ax >= op->contr->ns->mapx) |
398 | continue; |
398 | continue; |
|
|
399 | |
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->ns->mapy) |
402 | if (ay < 0 || ay >= op->contr->ns->mapy) |
402 | continue; |
403 | continue; |
403 | |
404 | |
… | |
… | |
410 | */ |
411 | */ |
411 | if (op->contr->blocked_los[ax][ay] != 100) |
412 | if (op->contr->blocked_los[ax][ay] != 100) |
412 | { |
413 | { |
413 | x1 = abs (basex - ax) * abs (basex - ax); |
414 | x1 = abs (basex - ax) * abs (basex - ax); |
414 | y1 = abs (basey - ay) * abs (basey - ay); |
415 | y1 = abs (basey - ay) * abs (basey - ay); |
415 | if (light > 0) |
416 | |
416 | op->contr->blocked_los[ax][ay] -= MAX ((light - isqrt (x1 + y1)), 0); |
417 | if (light > 0) op->contr->blocked_los[ax][ay] -= max (light - isqrt (x1 + y1), 0); |
417 | if (light < 0) |
|
|
418 | op->contr->blocked_los[ax][ay] -= MIN ((light + isqrt (x1 + y1)), 0); |
418 | if (light < 0) op->contr->blocked_los[ax][ay] -= min (light + isqrt (x1 + y1), 0); |
419 | } |
419 | } |
420 | } /* for ay */ |
420 | } |
421 | } /* for ax */ |
421 | } |
422 | } /* if this space is providing light */ |
422 | } |
423 | } /* for y */ |
423 | } |
424 | } /* for x */ |
424 | } |
425 | |
425 | |
426 | /* Outdoor should never really be completely pitch black dark like |
426 | /* Outdoor should never really be completely pitch black dark like |
427 | * 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 |
428 | */ |
428 | */ |
429 | if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3)) |
429 | if (op->map->outdoor && darklevel > (MAX_DARKNESS - 3)) |
… | |
… | |
436 | { |
436 | { |
437 | if (op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->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)) |
438 | 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->ns->mapx / 2][y + op->contr->ns->mapy / 2] = MAX_DARKNESS - 2; |
439 | } |
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->ns->mapx / 2][y + op->contr->ns->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->ns->mapx / 2][y + op->contr->ns->mapy / 2] -= |
446 | op->contr->blocked_los[x + op->contr->ns->mapx / 2][y + op->contr->ns->mapy / 2] -= |
… | |
… | |
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 |
451 | * odd that you can see yourself (and what your standing on), but |
452 | * odd that you can see yourself (and what your standing on), but |
452 | * really need for any reasonable game play. |
453 | * really need for any reasonable game play. |
453 | */ |
454 | */ |
454 | |
|
|
455 | static void |
455 | static void |
456 | blinded_sight (object *op) |
456 | blinded_sight (object *op) |
457 | { |
457 | { |
458 | int x, y; |
458 | int x, y; |
459 | |
459 | |