summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/view.cc')
-rw-r--r--stone_soup/crawl-ref/source/view.cc4098
1 files changed, 0 insertions, 4098 deletions
diff --git a/stone_soup/crawl-ref/source/view.cc b/stone_soup/crawl-ref/source/view.cc
deleted file mode 100644
index e3e7564453..0000000000
--- a/stone_soup/crawl-ref/source/view.cc
+++ /dev/null
@@ -1,4098 +0,0 @@
-/*
- * File: view.cc
- * Summary: Misc function used to render the dungeon.
- * Written by: Linley Henzell
- *
- * Modified for Crawl Reference by $Author$ on $Date$
- *
- * Change History (most recent first):
- *
- * <10> 29 Jul 00 JDJ show_map iterates horizontally to 79 instead of 80.
- * item no longer indexes past the end of environ::grid.
- * <9> 19 Jun 00 GDL Complete rewrite of LOS code
- * <8> 11/23/99 LRH Added colour-coded play-screen map & clean_map
- * init options
- * <7> 9/29/99 BCR Removed first argument from draw_border
- * <6> 9/11/99 LRH Added calls to overmap functions
- * <5> 6/22/99 BWR Fixed and improved the stealth
- * <4> 5/20/99 BWR show_map colours all portals,
- * exits from subdungeons now
- * look like up stairs.
- * <3> 5/09/99 JDJ show_map draws shops in yellow.
- * <2> 5/09/99 JDJ show_map accepts '\r' along with '.'.
- * <1> -/--/-- LRH Created
- */
-
-#include "AppHdr.h"
-#include "view.h"
-
-#include <string.h>
-
-#ifdef DOS
-#include <conio.h>
-#endif
-
-#include "externs.h"
-
-#include "clua.h"
-#include "debug.h"
-#include "insult.h"
-#include "macro.h"
-#include "monstuff.h"
-#include "mon-util.h"
-#include "overmap.h"
-#include "player.h"
-#include "skills2.h"
-#include "stuff.h"
-#include "spells4.h"
-#include "stash.h"
-#include "travel.h"
-
-#if defined(DOS_TERM)
-typedef char screen_buffer_t;
-#else
-typedef unsigned short screen_buffer_t;
-#endif
-
-unsigned char your_sign; // accessed as extern in transfor.cc and acr.cc
-unsigned char your_colour; // accessed as extern in transfor.cc and acr.cc
-
-FixedArray < unsigned int, 20, 19 > show_backup;
-
-unsigned char show_green;
-extern int stealth; // defined in acr.cc
-extern FixedVector<char, 10> Visible_Statue; // defined in acr.cc
-
-// char colour_code_map(unsigned char map_value);
-screen_buffer_t colour_code_map( int x, int y, bool item_colour = false,
- bool travel_colour = false );
-
-extern void (*viewwindow) (char, bool);
-unsigned char (*mapch) (unsigned char);
-unsigned char (*mapch2) (unsigned char);
-unsigned char mapchar(unsigned char ldfk);
-unsigned char mapchar2(unsigned char ldfk);
-unsigned char mapchar3(unsigned char ldfk);
-unsigned char mapchar4(unsigned char ldfk);
-void cloud_grid(void);
-void monster_grid(bool do_updates);
-
-static int display_glyph(int env_glyph);
-static int item_env_glyph(const item_def &item);
-
-//---------------------------------------------------------------
-//
-// get_number_of_lines
-//
-// Made this a function instead of a #define. This should help
-// considering the fact that the curses version is a macro
-// (curses tends to be implemented with a large number of
-// preprocessor macros, which can wreak havoc with things
-// like the C++ string class, so we want to isolate that
-// away to keep portability up).
-//
-// Other OSes might want to hook into reading system environment
-// variables or player set options to determine the screen size
-// (see the Options and SysEnv structures, as well as initfile.cc).
-//
-// This might be better to move to the lib*.cc files, but we
-// don't really have a standard API defined for them, or the
-// all important libdos.cc. It would be a good idea to eventually
-// head that way. -- bwr
-//
-//---------------------------------------------------------------
-int get_number_of_lines(void)
-{
-#ifdef UNIX
- return (get_number_of_lines_from_curses());
-#elif MAC
- return (MAC_NUMBER_OF_LINES);
-#else
- return (25);
-#endif
-}
-
-
-//---------------------------------------------------------------
-//
-// get_ibm_symbol
-//
-// Returns the DOS character code and color for everything drawn
-// with the IBM graphics option.
-//
-//---------------------------------------------------------------
-static void get_ibm_symbol(unsigned int object, unsigned short *ch,
- unsigned short *color)
-{
- ASSERT(color != NULL);
- ASSERT(ch != NULL);
-
- switch (object)
- {
- case DNGN_UNSEEN:
- *ch = 0;
- break;
-
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- *color = env.rock_colour;
- *ch = 177;
- break; // remember earth elementals
-
- // stone in the realm of Zot is coloured the same as rock
- case DNGN_STONE_WALL:
- *color = (player_in_branch( BRANCH_HALL_OF_ZOT ) ? env.rock_colour
- : LIGHTGREY);
- *ch = 177;
- break;
-
- case DNGN_CLOSED_DOOR:
- *ch = 254;
- break;
-
- case DNGN_METAL_WALL:
- *ch = 177;
- *color = CYAN;
- break;
-
- case DNGN_SECRET_DOOR:
- *ch = 177;
- *color = env.rock_colour;
- break;
-
- case DNGN_GREEN_CRYSTAL_WALL:
- *ch = 177;
- *color = GREEN;
- break;
-
- case DNGN_ORCISH_IDOL:
- *ch = '8';
- *color = DARKGREY;
- break;
-
- case DNGN_WAX_WALL:
- *ch = 177;
- *color = YELLOW;
- break; // wax wall
- /* Anything added here must also be added to the PLAIN_TERMINAL
- viewwindow2 below */
-
- case DNGN_SILVER_STATUE:
- *ch = '8';
- *color = WHITE;
- Visible_Statue[ STATUE_SILVER ] = 1;
- break;
-
- case DNGN_GRANITE_STATUE:
- *ch = '8';
- *color = LIGHTGREY;
- break;
-
- case DNGN_ORANGE_CRYSTAL_STATUE:
- *ch = '8';
- *color = LIGHTRED;
- Visible_Statue[ STATUE_ORANGE_CRYSTAL ] = 1;
- break;
-
- case DNGN_LAVA:
- *ch = 247;
- *color = RED;
- break;
-
- case DNGN_DEEP_WATER:
- *ch = 247; // this wavy thing also used for water elemental
- *color = BLUE;
- break;
-
- case DNGN_SHALLOW_WATER:
- *ch = 247; // this wavy thing also used for water elemental
- *color = CYAN;
- break;
-
- case DNGN_FLOOR:
- *color = env.floor_colour;
- *ch = 249;
- break;
-
- case DNGN_ENTER_HELL:
- *ch = 239;
- *color = RED;
- seen_other_thing(object);
- break;
-
- case DNGN_OPEN_DOOR:
- *ch = 39;
- break;
-
- case DNGN_TRAP_MECHANICAL:
- *color = LIGHTCYAN;
- *ch = 94;
- break;
-
- case DNGN_TRAP_MAGICAL:
- *color = MAGENTA;
- *ch = 94;
- break;
-
- case DNGN_TRAP_III:
- *color = LIGHTGREY;
- *ch = 94;
- break;
-
- case DNGN_UNDISCOVERED_TRAP:
- *ch = 249;
- *color = env.floor_colour;
- break;
-
- case DNGN_ENTER_SHOP:
- *ch = 239;
- *color = YELLOW;
-
- seen_other_thing(object);
- break;
- // if I change anything above here, must also change magic mapping!
-
- case DNGN_ENTER_LABYRINTH:
- *ch = 239;
- *color = LIGHTGREY;
- seen_other_thing(object);
- break;
-
- // not sure why we have "odd" here, but "ladders" are special in
- // that they all lead to the first staircase of the next level
- // (and returning from there will take you somewhere different)
- // ... that's why they're brown... it's a warning -- bwr
- case DNGN_ROCK_STAIRS_DOWN:
- *color = BROWN; // ladder // odd {dlb}
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- *ch = '>';
- break;
-
- case DNGN_ROCK_STAIRS_UP:
- *color = BROWN; // ladder // odd {dlb}
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- *ch = '<';
- break;
-
- case DNGN_ENTER_DIS:
- *color = CYAN;
- *ch = 239;
- break;
-
- case DNGN_ENTER_GEHENNA:
- *color = RED;
- *ch = 239;
- break;
-
- case DNGN_ENTER_COCYTUS:
- *color = LIGHTCYAN;
- *ch = 239;
- break;
-
- case DNGN_ENTER_TARTARUS:
- *color = DARKGREY;
- *ch = 239;
- break;
-
- case DNGN_ENTER_ABYSS:
- *color = random2(16);
- *ch = 239;
- seen_other_thing(object);
- break;
-
- case DNGN_EXIT_ABYSS:
- *color = random2(16);
- *ch = 239;
- break;
-
- case DNGN_STONE_ARCH:
- *color = LIGHTGREY;
- *ch = 239;
- break;
-
- case DNGN_ENTER_PANDEMONIUM:
- *color = LIGHTBLUE;
- *ch = 239;
- seen_other_thing(object);
- break;
-
- case DNGN_EXIT_PANDEMONIUM:
- *color = LIGHTBLUE;
- *ch = 239;
- break;
-
- case DNGN_TRANSIT_PANDEMONIUM:
- *color = LIGHTGREEN;
- *ch = 239;
- break;
-
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- *color = YELLOW;
- *ch = '>';
- seen_staircase(object);
- break;
-
- case DNGN_ENTER_ZOT:
- *color = MAGENTA;
- *ch = 239;
- seen_staircase(object);
- break;
-
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- *color = YELLOW;
- *ch = '<';
- break;
-
- case DNGN_RETURN_FROM_ZOT:
- *color = MAGENTA;
- *ch = 239;
- break;
-
- case DNGN_ALTAR_ZIN:
- *color = WHITE;
- *ch = 220;
- seen_altar(GOD_ZIN);
- break;
-
- case DNGN_ALTAR_SHINING_ONE:
- *color = YELLOW;
- *ch = 220;
- seen_altar(GOD_SHINING_ONE);
- break;
-
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- *color = DARKGREY;
- *ch = 220;
- seen_altar(GOD_KIKUBAAQUDGHA);
- break;
-
- case DNGN_ALTAR_YREDELEMNUL:
- *color = ((one_chance_in(3)) ? RED : DARKGREY);
- *ch = 220;
- seen_altar(GOD_YREDELEMNUL);
- break;
-
- case DNGN_ALTAR_XOM:
- *color = random_colour();
- *ch = 220;
- seen_altar(GOD_XOM);
- break;
-
- case DNGN_ALTAR_VEHUMET:
- *color = LIGHTBLUE;
- if (one_chance_in(3))
- *color = LIGHTMAGENTA;
- if (one_chance_in(3))
- *color = LIGHTRED;
- *ch = 220;
- seen_altar(GOD_VEHUMET);
- break;
-
- case DNGN_ALTAR_OKAWARU:
- *color = CYAN;
- *ch = 220;
- seen_altar(GOD_OKAWARU);
- break;
-
- case DNGN_ALTAR_MAKHLEB:
- *color = RED;
- if (one_chance_in(3))
- *color = LIGHTRED;
- if (one_chance_in(3))
- *color = YELLOW;
- *ch = 220;
- seen_altar(GOD_MAKHLEB);
- break;
-
- case DNGN_ALTAR_SIF_MUNA:
- *color = BLUE;
- *ch = 220;
- seen_altar(GOD_SIF_MUNA);
- break;
-
- case DNGN_ALTAR_TROG:
- *color = RED;
- *ch = 220;
- seen_altar(GOD_TROG);
- break;
-
- case DNGN_ALTAR_NEMELEX_XOBEH:
- *color = LIGHTMAGENTA;
- *ch = 220;
- seen_altar(GOD_NEMELEX_XOBEH);
- break;
-
- case DNGN_ALTAR_ELYVILON:
- *color = LIGHTGREY;
- *ch = 220;
- seen_altar(GOD_ELYVILON);
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- *color = BLUE;
- *ch = 159;
- break;
-
- case DNGN_SPARKLING_FOUNTAIN:
- *color = LIGHTBLUE;
- *ch = 159;
- break;
-
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_PERMADRY_FOUNTAIN:
- *color = LIGHTGREY;
- *ch = 159;
- break;
-
- case 256:
- *ch = '0';
- break;
-
- case 257:
- *color = CYAN;
- *ch = '~';
- break; /* Invis creature walking through water */
-
- case 258:
- *ch = ')';
- break; // weapon )
-
- case 259:
- *ch = '[';
- break; // armour [
-
- case 260:
- *ch = '/';
- break; // wands, etc.
-
- case 261:
- *ch = '%';
- break; // food
-
- case 262:
- *ch = '+';
- break; // books +
-
- case 263:
- *ch = '?';
- break; // scroll ?
-
- case 264:
- *ch = '=';
- break; // ring = etc
-
- case 265:
- *ch = '!';
- break; // potions !
-
- case 266:
- *ch = '(';
- break; // stones
-
- case 267:
- *ch = '+';
- break; // book +
-
- case 268:
- *ch = '%';
- break; // corpses part 1
-
- case 269:
- *ch = '\\';
- break; // magical staves
-
- case 270:
- *ch = '}';
- break; // gems
-
- case 271:
- *ch = '%';
- break; // don't know ?
-
- case 272:
- *ch = '$';
- *color = YELLOW;
- break; // $ gold
-
- case 273:
- *ch = '"';
- break; // amulet
-
- default:
- *ch = ((object >= 297) ? mons_char(object - 297) : object);
- break;
- }
-} // end get_ibm_symbol()
-
-//---------------------------------------------------------------
-//
-// viewwindow2
-//
-// Draws the main window using the extended IBM character set.
-//
-// This function should not interfer with the game condition,
-// unless do_updates is set (ie. stealth checks for visible
-// monsters).
-//
-//---------------------------------------------------------------
-void viewwindow2(char draw_it, bool do_updates)
-{
- const long BUFFER_SIZE = 1550;
-#ifdef DOS_TERM
- // DOS functions like gettext() and puttext() can only
- // work with arrays of characters, not shorts.
- FixedVector < unsigned char, BUFFER_SIZE > buffy; //[800]; //392];
-#else
- FixedVector < unsigned short, BUFFER_SIZE > buffy; //[800]; //392];
-#endif
-
- unsigned short ch, color;
-
- losight(env.show, grd, you.x_pos, you.y_pos);
-
- int count_x, count_y;
-
- for (count_x = 0; count_x < 18; count_x++)
- {
- for (count_y = 0; count_y < 18; count_y++)
- {
- env.show_col[count_x][count_y] = LIGHTGREY;
- show_backup[count_x][count_y] = 0;
- }
- }
-
- item();
- cloud_grid();
- monster_grid(do_updates);
- int bufcount = 0;
-
- if (draw_it == 1)
- {
- _setcursortype(_NOCURSOR);
- for (count_y = you.y_pos - 8; count_y < you.y_pos + 9; count_y++)
- {
- bufcount += 16;
-
- for (count_x = you.x_pos - 8; count_x < you.x_pos + 9; count_x++)
- {
- // may be overriden by the code below
- color = env.show_col[ count_x - you.x_pos + 9 ]
- [ count_y - you.y_pos + 9 ];
-
- unsigned int object = env.show[ count_x - you.x_pos + 9 ]
- [ count_y - you.y_pos + 9 ];
-
- get_ibm_symbol(object, &ch, &color);
-
- if (count_x == you.x_pos && count_y == you.y_pos)
- {
- ch = your_sign;
-
- if (player_is_swimming())
- {
- color = (grd[you.x_pos][you.y_pos] == DNGN_DEEP_WATER)
- ? BLUE : CYAN;
- }
- else
- {
- color = your_colour;
- }
- }
-
- ASSERT(bufcount + 1 < BUFFER_SIZE);
- buffy[bufcount] = ch;
- buffy[bufcount + 1] = color;
-
- bufcount += 2;
- }
-
- bufcount += 16;
- }
-
- if (you.level_type != LEVEL_LABYRINTH && you.level_type != LEVEL_ABYSS)
- {
- bufcount = 0;
-
- for (count_y = 0; count_y < 17; count_y++)
- {
- bufcount += 16;
-
- for (count_x = 0; count_x < 17; count_x++)
- {
- ASSERT(bufcount < BUFFER_SIZE);
-
- int mapx = count_x + you.x_pos - 9;
- int mapy = count_y + you.y_pos - 9;
- if (buffy[bufcount] != 0 && mapx >= 0 && mapx + 1 < GXM
- && mapy >= 0 && mapy + 1 < GYM)
- {
- unsigned short bch = buffy[bufcount];
- if (mgrd[mapx + 1][mapy + 1] != NON_MONSTER) {
- const monsters &m = menv[mgrd[mapx + 1][mapy + 1]];
- if (!mons_is_mimic(m.type)
- && mons_char(m.type) == bch)
- {
- bch |= mons_colour(m.type) << 12;
- }
- }
- env.map[mapx][mapy] = bch;
- }
-
- if (Options.clean_map == 1
- && show_backup[count_x + 1][count_y + 1] != 0)
- {
- get_ibm_symbol(show_backup[count_x + 1][count_y + 1],
- &ch, &color);
- if (mapx >= 0 && mapx < GXM
- && mapy >= 0 && mapy < GYM)
- env.map[ count_x + you.x_pos - 9 ]
- [ count_y + you.y_pos - 9 ] = ch;
- }
- bufcount += 2;
- }
- bufcount += 16;
- }
- }
-
- bufcount = 0;
- for (count_y = 0; count_y < 17; count_y++)
- {
- for (count_x = 0; count_x < 33; count_x++)
- {
- if (count_x + you.x_pos - 17 < 3
- || count_y + you.y_pos - 9 < 3
- || count_x + you.x_pos - 14 > 77
- || count_y + you.y_pos - 9 > 67)
- {
- ASSERT(bufcount < BUFFER_SIZE);
- buffy[bufcount] = 0;
- bufcount++;
- buffy[bufcount] = 0;
- bufcount++;
- continue;
- }
-
- if (count_x >= 8 && count_x <= 24 && count_y >= 0
- && count_y <= 16 && buffy[bufcount] != 0)
- {
- bufcount += 2;
- continue;
- }
-
- ASSERT(bufcount + 1 < BUFFER_SIZE);
-
- buffy[bufcount] = (unsigned char)
- env.map[ count_x + you.x_pos - 17 ]
- [ count_y + you.y_pos - 9 ];
-
- buffy[bufcount + 1] = DARKGREY;
- if (Options.colour_map)
- {
- if (env.map[ count_x + you.x_pos - 17 ]
- [ count_y + you.y_pos - 9 ] != 0)
- {
- buffy[bufcount + 1]
- = colour_code_map( count_x + you.x_pos - 17,
- count_y + you.y_pos - 9,
- Options.item_colour );
- }
- }
-
- bufcount += 2;
- }
- }
-
- const int flash_colour =
- you.flash_colour != BLACK? you.flash_colour :
- you.berserker ? RED :
- show_green != BLACK ? show_green :
- you.special_wield == SPWLD_SHADOW? DARKGREY :
- BLACK;
- if (flash_colour != BLACK)
- {
- for (count_x = 1; count_x < 1400; count_x += 2)
- {
- if (buffy[count_x] != DARKGREY)
- buffy[count_x] = flash_colour;
- }
-
- if (show_green != BLACK)
- {
- show_green = BLACK;
- if (you.special_wield == SPWLD_SHADOW)
- show_green = DARKGREY;
- }
- }
-
- you.flash_colour = BLACK;
-
-#ifdef DOS_TERM
- puttext(2, 1, 34, 17, buffy.buffer());
-#endif
-
-#ifdef PLAIN_TERM
- gotoxy(2, 1);
- bufcount = 0;
-
- // following lines are purely optional.
- // if used, players will 'jump' move.
- // Resting will be a LOT faster too.
- if (you.running == 0 || (you.running < 0 && Options.travel_delay > -1))
- {
- for (count_x = 0; count_x < 1120; count_x += 2)
- { // 1056
- ch = buffy[count_x];
- color = buffy[count_x + 1];
-// ASSERT(color < 16);
- ASSERT(ch < 255);
-
- textcolor(color);
- putch(ch);
-
- if (count_x % 66 == 64 && count_x > 0)
- gotoxy(2, wherey() + 1);
- }
- // remember to comment out the line below if you comment out jump move.
- }
- _setcursortype(_NORMALCURSOR);
-#endif
- }
-} // end viewwindow2()
-
-static char get_travel_colour( int x, int y )
-{
- if (is_waypoint(x + 1, y + 1))
- return LIGHTGREEN;
-
- short dist = point_distance[x + 1]
- [y + 1];
- return dist > 0 ? BLUE :
- dist == PD_EXCLUDED ? LIGHTMAGENTA :
- dist == PD_EXCLUDED_RADIUS ? RED :
- dist < 0 ? CYAN :
- DARKGREY;
-}
-
-#if defined(WIN32CONSOLE) || defined(DOS)
-static unsigned short dos_reverse_brand(unsigned short colour)
-{
- if (Options.dos_use_background_intensity)
- {
- // If the console treats the intensity bit on background colours
- // correctly, we can do a very simple colour invert.
-
- // Special casery for shadows. Note this must be matched by the fix
- // to libw32c.cc (the unpatched libw32c.cc does not draw spaces of any
- // colour).
- if (colour == BLACK)
- colour = (DARKGREY << 4);
- else
- colour = (colour & 0xF) << 4;
- }
- else
- {
- // If we're on a console that takes its DOSness very seriously the
- // background high-intensity bit is actually a blink bit. Blinking is
- // evil, so we strip the background high-intensity bit. This, sadly,
- // limits us to 7 background colours.
-
- // Strip off high-intensity bit. Special case DARKGREY, since it's the
- // high-intensity counterpart of black, and we don't want black on
- // black.
- //
- // We *could* set the foreground colour to WHITE if the background
- // intensity bit is set, but I think we've carried the
- // angry-fruit-salad theme far enough already.
-
- if (colour == DARKGREY)
- colour |= (LIGHTGREY << 4);
- else if (colour == BLACK)
- colour = LIGHTGREY << 4;
- else
- {
- // Zap out any existing background colour, and the high
- // intensity bit.
- colour &= 7;
-
- // And swap the foreground colour over to the background
- // colour, leaving the foreground black.
- colour <<= 4;
- }
- }
-
- return (colour);
-}
-
-static unsigned short dos_hilite_brand(unsigned short colour,
- unsigned short hilite)
-{
- if (!hilite)
- return (colour);
-
- if (colour == hilite)
- colour = 0;
-
- colour |= (hilite << 4);
- return (colour);
-}
-
-static unsigned short dos_brand( unsigned short colour,
- unsigned brand = CHATTR_REVERSE )
-{
- if ((brand & CHATTR_ATTRMASK) == CHATTR_NORMAL)
- return (colour);
-
- colour &= 0xFF;
-
- if ((brand & CHATTR_ATTRMASK) == CHATTR_HILITE)
- return dos_hilite_brand(colour, (brand & CHATTR_COLMASK) >> 8);
- else
- return dos_reverse_brand(colour);
-
-}
-#endif
-
-screen_buffer_t colour_code_map( int x, int y, bool item_colour,
- bool travel_colour )
-{
- // XXX: Yes, the map array and the grid array are off by one. -- bwr
- const int map_value = (unsigned char) env.map[x][y];
- const unsigned short map_flags = env.map[x][y] & ENVF_FLAGS;
- const int grid_value = grd[x + 1][y + 1];
-
- char tc = travel_colour? get_travel_colour(x, y) : DARKGREY;
-
- if (map_flags & ENVF_DETECT_ITEM)
- tc = Options.detected_item_colour;
-
- if (map_flags & ENVF_DETECT_MONS) {
- tc = Options.detected_monster_colour;
- return (tc);
- }
-
- unsigned char ecol = ENVF_COLOR(map_flags);
- if (ecol) {
- unsigned rmc = Options.remembered_monster_colour & 0xFFFF;
- if (rmc == 0xFFFF) // Use real colour
- tc = ecol;
- else if (rmc == 0) // Don't colour
- ;
- else
- tc = rmc;
- }
-
- // XXX: [ds] If we've an important colour, override other feature
- // colouring. Yes, this is hacky. Story of my life.
- if (tc == LIGHTGREEN || tc == LIGHTMAGENTA)
- return tc;
-
- // XXX: Yeah, this is ugly, but until we have stored layers in the
- // map we can't tell if we've seen a square, detected it, or just
- // detected the item or monster on top... giving colour here will
- // result in detect creature/item detecting features like stairs. -- bwr
- if (map_value != mapch2( grid_value )) {
- // If there's an item on this square, change colour to indicate
- // that, iff the item's glyph matches map_value. XXX: Potentially
- // abusable? -- ds
- int item = igrd[x + 1][y + 1];
- if (item_colour && item != NON_ITEM
- && map_value == display_glyph(item_env_glyph(mitm[item])))
- {
- screen_buffer_t ic = mitm[item].colour;
-
-#if defined(WIN32CONSOLE) || defined(DOS) || defined(DOS_TERM)
- if (mitm[item].link != NON_ITEM
- && Options.heap_brand != CHATTR_NORMAL)
- {
- ic = dos_brand(ic, Options.heap_brand);
- }
-#elif defined(USE_COLOUR_OPTS)
- if (mitm[item].link != NON_ITEM )
- {
- ic |= COLFLAG_ITEM_HEAP;
- }
-#endif
- // If the item colour is the background colour, tweak it to WHITE
- // instead to catch the player's eye.
- return ic == tc? WHITE : ic;
- }
-
- return tc;
- }
-
- switch (grid_value)
- {
- case DNGN_TRAP_MECHANICAL:
- return (LIGHTCYAN);
-
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- return (MAGENTA);
-
- case DNGN_ENTER_SHOP:
- return (YELLOW);
-
- case DNGN_ENTER_DIS:
- return (CYAN);
-
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_GEHENNA:
- return (RED);
-
- case DNGN_ENTER_COCYTUS:
- return (LIGHTCYAN);
-
- case DNGN_ENTER_ABYSS:
- return random2(16); // so it can be black - is this right? {dlb}
-
- case DNGN_ENTER_LABYRINTH:
- case DNGN_STONE_ARCH:
- return (LIGHTGREY);
-
- case DNGN_ENTER_PANDEMONIUM:
- return (LIGHTBLUE);
-
- case DNGN_EXIT_PANDEMONIUM:
- // Exit pandemonium gates won't show up on the map as light blue
- // unless the character has the "gate to pandemonium" demonspawn
- // mutation. This is so that the player can't quickly use a
- // crystal ball to find their way out. -- bwr
- return (you.mutation[MUT_PANDEMONIUM] ? LIGHTBLUE : LIGHTGREEN);
-
- case DNGN_TRANSIT_PANDEMONIUM:
- return (LIGHTGREEN);
-
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- return (MAGENTA);
-
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ROCK_STAIRS_DOWN:
- return (RED);
-
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_ROCK_STAIRS_UP:
- return (GREEN);
-
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- return (LIGHTRED);
-
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- return (LIGHTBLUE);
-
- default:
- break;
- }
-
- return tc;
-}
-
-void clear_map()
-{
- for (int y = 0; y < GYM - 1; ++y)
- {
- for (int x = 0; x < GXM - 1; ++x)
- {
- unsigned short envc = env.map[x][y];
- if (!envc)
- continue;
-
- bool unmapped = (envc & ENVF_DETECTED) != 0;
- // Discard flags at this point.
- envc = (unsigned char) envc;
-
- const unsigned char &grdc = grd[x + 1][y + 1];
- if (envc == mapch(grdc) || envc == mapch2(grdc))
- continue;
-
- int item = igrd[x + 1][y + 1];
- if (item != NON_ITEM
- && envc == display_glyph(item_env_glyph(mitm[item])))
- continue;
-
- env.map[x][y] = unmapped? 0 : mapch2(grdc);
- }
- }
-}
-
-void monster_grid(bool do_updates)
-{
- struct monsters *monster = 0; // NULL {dlb}
-
- for (int s = 0; s < MAX_MONSTERS; s++)
- {
- monster = &menv[s];
-
- if (monster->type != -1 && mons_near(monster))
- {
- if (do_updates
- && (monster->behaviour == BEH_SLEEP
- || monster->behaviour == BEH_WANDER)
- && check_awaken(s))
- {
- behaviour_event( monster, ME_ALERT, MHITYOU );
-
- if (you.turn_is_over == 1
- && mons_shouts(monster->type) > 0
- && random2(30) >= you.skills[SK_STEALTH])
- {
- int noise_level = 8;
-
- if (!mons_friendly(monster)
- && (!silenced(you.x_pos, you.y_pos)
- && !silenced(monster->x, monster->y)))
- {
- if (mons_is_demon( monster->type ) && coinflip())
- {
- if (monster->type == MONS_IMP
- || monster->type == MONS_WHITE_IMP
- || monster->type == MONS_SHADOW_IMP)
- {
- imp_taunt( monster );
- }
- else
- {
- demon_taunt( monster );
- }
- }
- else
- {
- int the_shout = mons_shouts(monster->type);
-
- strcpy(info, "You hear ");
- switch (the_shout)
- {
- case S_SILENT:
- default:
- strcat(info, "buggy behaviour!");
- break;
- case S_SHOUT:
- strcat(info, "a shout!");
- break;
- case S_BARK:
- strcat(info, "a bark!");
- break;
- case S_SHOUT2:
- strcat(info, "two shouts!");
- noise_level = 12;
- break;
- case S_ROAR:
- strcat(info, "a roar!");
- noise_level = 12;
- break;
- case S_SCREAM:
- strcat(info, "a hideous shriek!");
- break;
- case S_BELLOW:
- strcat(info, "a bellow!");
- break;
- case S_SCREECH:
- strcat(info, "a screech!");
- break;
- case S_BUZZ:
- strcat(info, "an angry buzzing noise.");
- break;
- case S_MOAN:
- strcat(info, "a chilling moan.");
- break;
- case S_WHINE:
- strcat(info,
- "an irritating high-pitched whine.");
- break;
- case S_CROAK:
- if (coinflip())
- strcat(info, "a loud, deep croak!");
- else
- strcat(info, "a croak.");
- break;
- case S_GROWL:
- strcat(info, "an angry growl!");
- break;
- case S_HISS:
- strcat(info, "an angry hiss!");
- noise_level = 4; // not very loud -- bwr
- break;
- }
-
- mpr(info);
- }
- }
-
- noisy( noise_level, monster->x, monster->y );
- }
- }
-
- if (!player_monster_visible( monster ))
- {
- // ripple effect?
- if (grd[monster->x][monster->y] == DNGN_SHALLOW_WATER
- && !mons_flies(monster))
- {
- show_backup[ monster->x - you.x_pos + 9 ]
- [ monster->y - you.y_pos + 9]
- = env.show[ monster->x - you.x_pos + 9 ]
- [ monster->y - you.y_pos + 9 ];
- env.show[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9] = 257;
- }
- continue;
- }
- else if (!mons_friendly( monster )
- && !mons_is_mimic( monster->type )
- && !mons_class_flag( monster->type, M_NO_EXP_GAIN ))
- {
- interrupt_activity( AI_SEE_MONSTER );
- if (you.running != 0
-#ifdef CLUA_BINDINGS
- && clua.callbooleanfn(true, "ch_stop_run",
- "M", monster)
-#endif
- )
- {
- // Friendly monsters, mimics, or harmless monsters
- // don't disturb the player's running/resting.
- //
- // Doing it this way causes players in run mode 2
- // to move one square, and in mode 1 to stop. This
- // means that the character will run one square if
- // a monster is in sight... we automatically jump
- // to zero if we're resting. -- bwr
- if (you.run_x == 0 && you.run_y == 0)
- stop_running();
- else if (you.running > 1)
- you.running--;
- else
- stop_running();
- }
- }
-
- // mimics are always left on map
- if (!mons_is_mimic( monster->type ))
- {
- show_backup[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9]
- = env.show[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9];
- }
-
- env.show[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9] = monster->type + 297;
-
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9]
- = ((mcolour[monster->type] == BLACK)
- ? monster->number : mcolour[monster->type]);
-#ifdef USE_COLOUR_OPTS
- if (mons_friendly(monster))
- {
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9]
- |= COLFLAG_FRIENDLY_MONSTER;
- }
- else if (Options.stab_brand != CHATTR_NORMAL
- && mons_looks_stabbable(monster))
- {
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9]
- |= COLFLAG_WILLSTAB;
- }
- else if (Options.may_stab_brand != CHATTR_NORMAL
- && mons_looks_distracted(monster))
- {
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9]
- |= COLFLAG_MAYSTAB;
- }
-
-#elif defined(WIN32CONSOLE) || defined(DOS)
- if (Options.friend_brand != CHATTR_NORMAL
- && mons_friendly(monster))
- {
- // We munge the colours right here for DOS and Windows, because
- // we know exactly how the colours will be handled, and we don't
- // want to change both DOS and Windows port code to handle
- // friend branding.
- unsigned short &colour =
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9];
- colour = dos_brand(colour, Options.friend_brand);
- }
-
- if (Options.stab_brand != CHATTR_NORMAL
- && mons_looks_stabbable(monster))
- {
- unsigned short &colour =
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9];
- colour = dos_brand(colour, Options.stab_brand);
- }
- else if (Options.may_stab_brand != CHATTR_NORMAL
- && mons_looks_distracted(monster))
- {
- unsigned short &colour =
- env.show_col[monster->x - you.x_pos + 9]
- [monster->y - you.y_pos + 9];
- colour = dos_brand(colour, Options.may_stab_brand);
- }
-#endif
- } // end "if (monster->type != -1 && mons_ner)"
- } // end "for s"
-} // end monster_grid()
-
-
-bool check_awaken(int mons_aw)
-{
- int mons_perc = 0;
- struct monsters *monster = &menv[mons_aw];
- const int mon_holy = mons_holiness(monster);
-
- // berserkers aren't really concerned about stealth
- if (you.berserker)
- return (true);
-
- // Repel undead is a holy aura, to which evil creatures are sensitive.
- // Note that even though demons aren't affected by repel undead, they
- // do sense this type of divine aura. -- bwr
- if (you.duration[DUR_REPEL_UNDEAD]
- && (mon_holy == MH_UNDEAD || mon_holy == MH_DEMONIC))
- {
- return (true);
- }
-
- // I assume that creatures who can see invisible are very perceptive
- mons_perc = 10 + (mons_intel(monster->type) * 4) + monster->hit_dice
- + mons_see_invis(monster) * 5;
-
- // critters that are wandering still have MHITYOU as their foe are
- // still actively on guard for the player, even if they can't see
- // him. Give them a large bonus (handle_behaviour() will nuke 'foe'
- // after a while, removing this bonus.
- if (monster->behaviour == BEH_WANDER && monster->foe == MHITYOU)
- mons_perc += 15;
-
- if (!mons_player_visible(monster))
- mons_perc -= 75;
-
- if (monster->behaviour == BEH_SLEEP)
- {
- if (mon_holy == MH_NATURAL)
- {
- // monster is "hibernating"... reduce chance of waking
- if (mons_has_ench( monster, ENCH_SLEEP_WARY ))
- mons_perc -= 10;
- }
- else // unnatural creature
- {
- // Unnatural monsters don't actually "sleep", they just
- // haven't noticed an intruder yet... we'll assume that
- // they're diligently on guard.
- mons_perc += 10;
- }
- }
-
- // glowing with magical contamination isn't very stealthy
- if (you.magic_contamination > 10)
- mons_perc += you.magic_contamination - 10;
-
- if (mons_perc < 0)
- mons_perc = 0;
-
- return (random2(stealth) <= mons_perc);
-} // end check_awaken()
-
-static int display_glyph(int env_glyph)
-{
- unsigned short ch, color;
- if (viewwindow == viewwindow2)
- get_ibm_symbol(env_glyph, &ch, &color);
- else
- get_non_ibm_symbol(env_glyph, &ch, &color);
- return ch;
-}
-
-static int item_env_glyph(const item_def &item)
-{
- switch (item.base_type)
- {
- case OBJ_ORBS:
- return 256;
- // need + 6 because show is 0 - 12, not -6 - +6
- case OBJ_WEAPONS:
- case OBJ_MISSILES:
- return 258;
- case OBJ_ARMOUR:
- return 259;
- case OBJ_WANDS:
- return 260;
- case OBJ_FOOD:
- return 261;
- case OBJ_UNKNOWN_I:
- return 262;
- case OBJ_SCROLLS:
- return 263;
- case OBJ_JEWELLERY:
- return item.sub_type >= AMU_RAGE? 273 : 264;
- case OBJ_POTIONS:
- return 265;
- case OBJ_UNKNOWN_II:
- return 266;
- case OBJ_BOOKS:
- return 267;
- case OBJ_STAVES:
- return 269;
- case OBJ_MISCELLANY:
- return 270;
- case OBJ_CORPSES:
- return 271;
- case OBJ_GOLD:
- return 272;
- default:
- return '8';
- }
-}
-
-void item()
-{
- char count_x, count_y;
-
- for (count_y = (you.y_pos - 8); (count_y < you.y_pos + 9); count_y++)
- {
- for (count_x = (you.x_pos - 8); (count_x < you.x_pos + 9); count_x++)
- {
- if (count_x >= 0 && count_x < GXM && count_y >= 0 && count_y < GYM)
- {
- if (igrd[count_x][count_y] != NON_ITEM)
- {
- if (env.show[count_x - you.x_pos + 9]
- [count_y - you.y_pos + 9] != 0)
- {
- const item_def &eitem = mitm[igrd[count_x][count_y]];
- unsigned short &ecol =
- env.show_col[count_x - you.x_pos + 9]
- [count_y - you.y_pos + 9];
-
- ecol = (grd[count_x][count_y] == DNGN_SHALLOW_WATER)?
- CYAN
- : eitem.colour;
-
-#ifdef USE_COLOUR_OPTS
- if (eitem.link != NON_ITEM)
- {
- ecol |= COLFLAG_ITEM_HEAP;
- }
-#elif defined(WIN32CONSOLE) || defined(DOS)
- if (eitem.link != NON_ITEM
- && Options.heap_brand != CHATTR_NORMAL)
- {
- // Yes, exact same code as friend-branding.
- ecol = dos_brand(ecol, Options.heap_brand);
- }
-#endif
- env.show[count_x - you.x_pos + 9]
- [count_y - you.y_pos + 9] =
- item_env_glyph( eitem );
- }
- }
- }
- } // end of "for count_y, count_x"
- }
-} // end item()
-
-
-void cloud_grid(void)
-{
- int mnc = 0;
-
- // btw, this is also the 'default' color {dlb}
- unsigned char which_color = LIGHTGREY;
-
- for (int s = 0; s < MAX_CLOUDS; s++)
- {
- // can anyone explain this??? {dlb}
- // its an optimization to avoid looking past the last cloud -bwr
- if (mnc > env.cloud_no)
- break;
-
- if (env.cloud[s].type != CLOUD_NONE)
- {
- mnc++;
-
- if (see_grid(env.cloud[s].x, env.cloud[s].y))
- {
- show_backup[env.cloud[s].x - you.x_pos + 9]
- [env.cloud[s].y - you.y_pos + 9]
- = env.show[env.cloud[s].x - you.x_pos + 9]
- [env.cloud[s].y - you.y_pos + 9];
-
- env.show[env.cloud[s].x - you.x_pos + 9]
- [env.cloud[s].y - you.y_pos + 9] = '#';
-
- switch (env.cloud[s].type)
- {
- case CLOUD_FIRE:
- case CLOUD_FIRE_MON:
- if (env.cloud[s].decay <= 20)
- which_color = RED;
- else if (env.cloud[s].decay <= 40)
- which_color = LIGHTRED;
- else if (one_chance_in(4))
- which_color = RED;
- else if (one_chance_in(4))
- which_color = LIGHTRED;
- else
- which_color = YELLOW;
- break;
-
- case CLOUD_STINK:
- case CLOUD_STINK_MON:
- which_color = GREEN;
- break;
-
- case CLOUD_COLD:
- case CLOUD_COLD_MON:
- if (env.cloud[s].decay <= 20)
- which_color = BLUE;
- else if (env.cloud[s].decay <= 40)
- which_color = LIGHTBLUE;
- else if (one_chance_in(4))
- which_color = BLUE;
- else if (one_chance_in(4))
- which_color = LIGHTBLUE;
- else
- which_color = WHITE;
- break;
-
- case CLOUD_POISON:
- case CLOUD_POISON_MON:
- which_color = (one_chance_in(3) ? LIGHTGREEN : GREEN);
- break;
-
- case CLOUD_BLUE_SMOKE:
- case CLOUD_BLUE_SMOKE_MON:
- which_color = LIGHTBLUE;
- break;
-
- case CLOUD_PURP_SMOKE:
- case CLOUD_PURP_SMOKE_MON:
- which_color = MAGENTA;
- break;
-
- case CLOUD_MIASMA:
- case CLOUD_MIASMA_MON:
- case CLOUD_BLACK_SMOKE:
- case CLOUD_BLACK_SMOKE_MON:
- which_color = DARKGREY;
- break;
-
- default:
- which_color = LIGHTGREY;
- break;
- }
-
- env.show_col[env.cloud[s].x - you.x_pos + 9]
- [env.cloud[s].y - you.y_pos + 9] = which_color;
- }
- } // end 'if != CLOUD_NONE'
- } // end 'for s' loop
-} // end cloud_grid()
-
-// Noisy now has a messenging service for giving messages to the
-// player is appropriate.
-//
-// Returns true if the PC heard the noise.
-bool noisy( int loudness, int nois_x, int nois_y, const char *msg )
-{
- int p;
- struct monsters *monster = 0; // NULL {dlb}
- bool ret = false;
-
- // If the origin is silenced there is no noise.
- if (silenced( nois_x, nois_y ))
- return (false);
-
- const int dist = loudness * loudness;
-
- // message the player
- if (distance( you.x_pos, you.y_pos, nois_x, nois_y ) <= dist
- && player_can_hear( nois_x, nois_y ))
- {
- if (msg)
- mpr( msg, MSGCH_SOUND );
-
- ret = true;
- }
-
- for (p = 0; p < MAX_MONSTERS; p++)
- {
- monster = &menv[p];
-
- if (monster->type < 0)
- continue;
-
- if (distance(monster->x, monster->y, nois_x, nois_y) <= dist
- && !silenced(monster->x, monster->y))
- {
- // If the noise came from the character, any nearby monster
- // will be jumping on top of them.
- if (nois_x == you.x_pos && nois_y == you.y_pos)
- behaviour_event( monster, ME_ALERT, MHITYOU );
- else
- behaviour_event( monster, ME_DISTURB, MHITNOT, nois_x, nois_y );
- }
- }
-
- return (ret);
-} // end noisy()
-
-/* ========================================================================
- * brand new LOS code
- * ========================================================================
- * The new LOS works via a new (I think) shadow casting algorithm,
- * plus an esthetic tweak for more pleasing corner illumination. More
- * detail can be had by contacting its author, Gordon Lipford. */
-
-#define MAX_LIGHT_RADIUS 20
-#define CIRC_MAX 32000
-#define BIG_SHADOW 32000
-
-// the following two constants represent the 'middle' of the sh array.
-// since the current shown area is 19x19, centering the view at (9,9)
-// means it will be exactly centered.
-// This is done to accomodate possible future changes in viewable screen
-// area - simply change sh_xo and sh_yo to the new view center.
-
-const int sh_xo = 9; // X and Y origins for the sh array
-const int sh_yo = 9;
-
-// the Cell class, used in the shadow-casting LOS algorithm
-class Cell
-{
-
-public:
- int up_count;
- int up_max;
- int low_count;
- int low_max;
- bool lit;
- bool lit_delay;
- bool visible; // for blockers only
- void init();
- bool reachedLower();
- bool reachedUpper();
-
- Cell()
- {
- init();
- };
-};
-
-void Cell::init()
-{
- up_count = 0;
- up_max = 0;
- low_count = 0;
- low_max = 0;
- lit = true;
- visible = true;
- lit_delay = false;
-}
-
-bool Cell::reachedLower()
-{
- // integer math: a 'step' has a value of 10
- // see if we're within a half step of the max. VERY important
- // to use 'half step' or else things look really stupid.
- if (low_max != 0 && low_count + 5 >= low_max && low_count - 5 < low_max)
- return true;
-
- return false;
-}
-
-bool Cell::reachedUpper()
-{
- // see if we're within a half step of the max. VERY important
- // to use 'half step' or else things look really stupid.
- if (up_max != 0 && up_count + 5 >= up_max && up_count - 5 < up_max)
- return true;
-
- return false;
-}
-
-// the cell array
-static FixedVector < Cell, MAX_LIGHT_RADIUS + 1 > cells;
-
-// the 'circle' array. For any given row, we won't check higher than
-// this given cell.
-static FixedVector < int, MAX_LIGHT_RADIUS + 1 > circle;
-
-// current light radius
-static int LR = 0;
-
-// View constant
-const int view = 2; // 1=widest LOS .. 5=narrowest
-
-// initialize LOS code for a given light radius
-extern void setLOSRadius(int newLR)
-{
- int i, j;
-
- // sanity check - also allows multiple calls w/out performance loss
- if (LR == newLR)
- return;
-
- LR = newLR;
- // cells should already be initted. calculate the circle array.
-
- // note that rows 0 and 1 will always go to infinity.
- circle[0] = circle[1] = CIRC_MAX;
-
- // for the rest, simply calculate max height based on light rad.
- for (i = 2; i <= LR; i++)
- {
- // check top
- if (2 * i * i <= LR * LR)
- {
- circle[i] = CIRC_MAX;
- continue;
- }
-
- for (j = i - 1; j >= 0; j--)
- {
- // check that Distance (I^2 + J^2) is no more than (R+0.5)^2
- // this rounding allows for *much* better looking circles.
- if (i * i + j * j <= LR * LR + LR)
- {
- circle[i] = j;
- break;
- }
- }
- }
-}
-
-static int calcUpper(int bX, int bY)
-{
- // got a blocker at row bX, cell bY. do all values
- // and scale by a factor of 10 for the integer math.
- int upper;
-
- upper = (10 * (10 * bX - view)) / (10 * bY + view);
- if (upper < 10) // upper bound for blocker on diagonal
- upper = 10;
-
- return upper;
-}
-
-static int calcLower(int bX, int bY)
-{
- // got a blocker at row bX, cell bY. do all values
- // and scale by a factor of 10 for the integer math.
-
- if (bY == 0)
- return BIG_SHADOW;
-
- return (10 * (10 * bX + view)) / (10 * bY - view);
-}
-
-// for easy x,y octant translation
-static int xxcomp[8] = { 1, 0, 0, -1, -1, 0, 0, 1 };
-static int xycomp[8] = { 0, 1, -1, 0, 0, -1, 1, 0 };
-static int yxcomp[8] = { 0, 1, 1, 0, 0, -1, -1, 0 };
-static int yycomp[8] = { 1, 0, 0, 1, -1, 0, 0, -1 };
-
-static void los_octant(int o, FixedArray < unsigned int, 19, 19 > &sh,
- FixedArray < unsigned char, 80, 70 > &gr, int x_p,
- int y_p)
-{
- int row, cell, top, south;
- int tx, ty; // translated x, y deltas for this octant
- unsigned char gv; // grid value
- bool row_dark, all_dark;
- bool blocker, vis_corner;
- int up_inc, low_inc;
-
- // leave [0,0] alone, because the old LOS code seems to.
-
- // init cell[0]. this is the only one that needs clearing.
- cells[0].init();
- all_dark = false;
- vis_corner = false;
-
- // loop through each row
- for (row = 1; row <= LR; row++)
- {
- row_dark = true;
-
- // loop through each cell, up to the max allowed by circle[]
- top = circle[row];
- if (top > row)
- top = row;
-
- for (cell = 0; cell <= top; cell++)
- {
- // translate X,Y co'ord + bounds check
- tx = row * xxcomp[o] + cell * xycomp[o];
- ty = row * yxcomp[o] + cell * yycomp[o];
-
- if (x_p + tx < 0 || x_p + tx > 79 || y_p + ty < 0 || y_p + ty > 69)
- continue;
-
- // check for all_dark - we've finished the octant but
- // have yet to fill in '0' for the rest of the sight grid
- if (all_dark == true)
- {
- sh[sh_xo + tx][sh_yo + ty] = 0;
- continue;
- }
-
- // get grid value.. see if it blocks LOS
- gv = gr[x_p + tx][y_p + ty];
- blocker = (gv < MINSEE);
-
- // init some other variables
- up_inc = 10;
- low_inc = 10;
- south = cell - 1;
-
- // STEP 1 - inherit values from immediate West, if possible
- if (cell < row)
- {
- // check for delayed lighting
- if (cells[cell].lit_delay)
- {
- if (!blocker)
- { // blockers don't light up with lit_delay.
- if (cells[south].lit)
- {
- if (cells[south].low_max != 0)
- {
- cells[cell].lit = false;
- // steal lower values
- cells[cell].low_max = cells[south].low_max;
- cells[cell].low_count = cells[south].low_count;
- cells[south].low_count = 0;
- cells[south].low_max = 0;
- low_inc = 0; // avoid double-inc.
- }
- else
- cells[cell].lit = true;
- }
- }
- cells[cell].lit_delay = false;
- }
- }
- else
- {
- // initialize new cell.
- cells[cell].init();
- }
-
- // STEP 2 - check for blocker
- // a dark blocker in shadow's edge will be visible
- if (blocker)
- {
- if (cells[cell].lit || (cell != 0 && cells[south].lit)
- || vis_corner)
- {
- // hack: make 'corners' visible
- vis_corner = cells[cell].lit;
-
- cells[cell].lit = false;
- cells[cell].visible = true;
-
- int upper = calcUpper(row, cell);
- int lower = calcLower(row, cell);
-
- if (upper < cells[cell].up_max || cells[cell].up_max == 0)
- {
- // new upper shadow
- cells[cell].up_max = upper;
- cells[cell].up_count = 0;
- up_inc = 0;
- }
-
- if (lower > cells[cell].low_max || cells[cell].low_max == 0)
- {
- // new lower shadow
- cells[cell].low_max = lower;
- cells[cell].low_count = -10;
- low_inc = 0;
- if (lower <= 30) // somewhat arbitrary
- cells[cell].lit_delay = true;
- // set dark_delay if lower > 20?? how to decide?
- }
- }
- else
- {
- cells[cell].visible = false;
- }
- }
- else
- {
- cells[cell].visible = false; // special flags for blockers
- }
-
- // STEP 3 - add increments to upper, lower counts
- cells[cell].up_count += up_inc;
- cells[cell].low_count += low_inc;
-
- // STEP 4 - check south for dark
- if (south >= 0)
- if (cells[south].reachedUpper() == true)
- {
- if (cells[cell].reachedUpper() == false)
- {
- cells[cell].up_max = cells[south].up_max;
- cells[cell].up_count = cells[south].up_count;
- cells[cell].up_count -= cells[south].up_max;
- }
- cells[cell].lit = false;
- cells[cell].visible = false;
- }
-
- // STEP 5 - nuke lower if south lower
- if (south >= 0)
- {
- if (cells[south].reachedLower())
- {
- cells[cell].low_max = cells[south].low_max;
- cells[cell].low_count = cells[south].low_count;
- cells[cell].low_count -= cells[south].low_max;
- cells[south].low_count = cells[south].low_max = 0;
- }
-
- if (cells[south].low_max != 0
- || (cells[south].lit == false
- && cells[south].low_max == 0))
- {
- cells[cell].low_count = cells[cell].low_max + 10;
- }
- }
-
- // STEP 6 - light up if we've reached lower bound
- if (cells[cell].reachedLower() == true)
- cells[cell].lit = true;
-
- // now place appropriate value in sh
- if (cells[cell].lit == true
- || (blocker == true && cells[cell].visible == true))
- {
- sh[sh_xo + tx][sh_yo + ty] = gv;
- }
- else
- sh[sh_xo + tx][sh_yo + ty] = 0;
-
- if (cells[cell].lit == true)
- row_dark = false;
- } // end for - cells
-
- vis_corner = false; // don't carry over to next row. :)
- if (row_dark == true)
- all_dark = true;
- } // end for - rows
-}
-
-void losight(FixedArray < unsigned int, 19, 19 > &sh,
- FixedArray < unsigned char, 80, 70 > &gr, int x_p, int y_p)
-{
- int o;
-
- for (o = 0; o < 8; o++)
- los_octant(o, sh, gr, x_p, y_p);
-}
-
-
-void draw_border(void)
-{
- textcolor( BORDER_COLOR );
- clrscr();
- redraw_skill( you.your_name, player_title() );
-
- gotoxy(40, 2);
- cprintf( "%s %s", species_name( you.species, you.experience_level ),
- (you.wizard ? "*WIZARD*" : "" ) );
-
- gotoxy(40, 3); cprintf("HP:");
- gotoxy(40, 4); cprintf("Magic:");
- gotoxy(40, 5); cprintf("AC:");
- gotoxy(40, 6); cprintf("EV:");
- gotoxy(40, 7); cprintf("Str:");
- gotoxy(40, 8); cprintf("Int:");
- gotoxy(40, 9); cprintf("Dex:");
- gotoxy(40, 10); cprintf("Gold:");
- gotoxy(40, 11); cprintf("Experience:");
- gotoxy(40, 12); cprintf("Level");
-} // end draw_border()
-
-// Determines if the given feature is present at (x, y) in _grid_ coordinates.
-// If you have map coords, add (1, 1) to get grid coords.
-// Use one of
-// 1. '<' and '>' to look for stairs
-// 2. '\t' or '\\' for shops, portals.
-// 3. '^' for traps
-// 4. '_' for altars
-// 5. Anything else will look for the exact same character in the level map.
-bool is_feature(int feature, int x, int y) {
- unsigned char envfeat = (unsigned char) env.map[x - 1][y - 1];
- if (!envfeat)
- return false;
-
- // 'grid' can fit in an unsigned char, but making this a short shuts up
- // warnings about out-of-range case values.
- short grid = grd[x][y];
-
- switch (feature) {
- case 'X':
- return (point_distance[x][y] == PD_EXCLUDED);
- case 'F':
- case 'W':
- return is_waypoint(x, y);
-#ifdef STASH_TRACKING
- case 'I':
- return is_stash(x, y);
-#endif
- case '_':
- switch (grid) {
- case DNGN_ALTAR_ZIN:
- case DNGN_ALTAR_SHINING_ONE:
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- case DNGN_ALTAR_YREDELEMNUL:
- case DNGN_ALTAR_XOM:
- case DNGN_ALTAR_VEHUMET:
- case DNGN_ALTAR_OKAWARU:
- case DNGN_ALTAR_MAKHLEB:
- case DNGN_ALTAR_SIF_MUNA:
- case DNGN_ALTAR_TROG:
- case DNGN_ALTAR_NEMELEX_XOBEH:
- case DNGN_ALTAR_ELYVILON:
- return true;
- default:
- return false;
- }
- case '\t':
- case '\\':
- switch (grid) {
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_LABYRINTH:
- case DNGN_ENTER_SHOP:
- case DNGN_ENTER_DIS:
- case DNGN_ENTER_GEHENNA:
- case DNGN_ENTER_COCYTUS:
- case DNGN_ENTER_TARTARUS:
- case DNGN_ENTER_ABYSS:
- case DNGN_EXIT_ABYSS:
- case DNGN_STONE_ARCH:
- case DNGN_ENTER_PANDEMONIUM:
- case DNGN_EXIT_PANDEMONIUM:
- case DNGN_TRANSIT_PANDEMONIUM:
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- return true;
- default:
- return false;
- }
- case '<':
- switch (grid) {
- case DNGN_ROCK_STAIRS_UP:
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- return true;
- default:
- return false;
- }
- case '>':
- switch (grid) {
- case DNGN_ROCK_STAIRS_DOWN:
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- return true;
- default:
- return false;
- }
- case '^':
- switch (grid) {
- case DNGN_TRAP_MECHANICAL:
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- return true;
- default:
- return false;
- }
- default:
- return envfeat == feature;
- }
-}
-
-static int find_feature(unsigned char feature, int curs_x, int curs_y,
- int start_x, int start_y, int anchor_x, int anchor_y,
- int ignore_count, char *move_x, char *move_y) {
- int cx = anchor_x,
- cy = anchor_y;
-
- int firstx = -1, firsty = -1;
- int matchcount = 0;
-
- // Find the first occurrence of feature 'feature', spiralling around (x,y)
- int maxradius = GXM > GYM? GXM : GYM;
- for (int radius = 1; radius < maxradius; ++radius) {
- for (int axis = -2; axis < 2; ++axis) {
- int rad = radius - (axis < 0);
- for (int var = -rad; var <= rad; ++var) {
- int dx = radius, dy = var;
- if (axis % 2)
- dx = -dx;
- if (axis < 0) {
- int temp = dx;
- dx = dy;
- dy = temp;
- }
-
- int x = cx + dx, y = cy + dy;
- if (x < 0 || y < 0 || x >= GXM || y >= GYM) continue;
- if (is_feature(feature, x + 1, y + 1)) {
- ++matchcount;
- if (!ignore_count--) {
- // We want to cursor to (x,y)
- *move_x = x - (start_x + curs_x - 1);
- *move_y = y - (start_y + curs_y - 1);
- return matchcount;
- }
- else if (firstx == -1) {
- firstx = x;
- firsty = y;
- }
- }
- }
- }
- }
-
- // We found something, but ignored it because of an ignorecount
- if (firstx != -1) {
- *move_x = firstx - (start_x + curs_x - 1);
- *move_y = firsty - (start_y + curs_y - 1);
- return 1;
- }
- return 0;
-}
-
-void find_features(const std::vector<coord_def>& features,
- unsigned char feature, std::vector<coord_def> *found) {
- for (unsigned feat = 0; feat < features.size(); ++feat) {
- const coord_def& coord = features[feat];
- if (is_feature(feature, coord.x, coord.y))
- found->push_back(coord);
- }
-}
-
-static int find_feature( const std::vector<coord_def>& features,
- unsigned char feature, int curs_x, int curs_y,
- int start_x, int start_y,
- int ignore_count, char *move_x, char *move_y) {
- int firstx = -1, firsty = -1;
- int matchcount = 0;
-
- for (unsigned feat = 0; feat < features.size(); ++feat) {
- const coord_def& coord = features[feat];
-
- if (is_feature(feature, coord.x, coord.y)) {
- ++matchcount;
- if (!ignore_count--) {
- // We want to cursor to (x,y)
- *move_x = coord.x - (start_x + curs_x);
- *move_y = coord.y - (start_y + curs_y);
- return matchcount;
- }
- else if (firstx == -1) {
- firstx = coord.x;
- firsty = coord.y;
- }
- }
- }
-
- // We found something, but ignored it because of an ignorecount
- if (firstx != -1) {
- *move_x = firstx - (start_x + curs_x);
- *move_y = firsty - (start_y + curs_y);
- return 1;
- }
- return 0;
-}
-
-// show_map() now centers the known map along x or y. This prevents
-// the player from getting "artificial" location clues by using the
-// map to see how close to the end they are. They'll need to explore
-// to get that. This function is still a mess, though. -- bwr
-void show_map( FixedVector<int, 2> &spec_place )
-{
- int i, j;
-
- int bufcount2 = 0;
-
- char move_x = 0;
- char move_y = 0;
- char getty = 0;
-
-#ifdef DOS_TERM
- char buffer[4800];
-#endif
-
- // Vector to track all features we can travel to, in order of distance.
- std::vector<coord_def> features;
- if (!spec_place[0]) {
- travel_cache.update();
-
- find_travel_pos(you.x_pos, you.y_pos, NULL, NULL, &features);
- // Sort features into the order the player is likely to prefer.
- arrange_features(features);
- }
-
- // buffer2[GYM * GXM * 2] segfaults my box {dlb}
- screen_buffer_t buffer2[GYM * GXM * 2];
-
- char min_x = 80, max_x = 0, min_y = 0, max_y = 0;
- bool found_y = false;
-
- const int num_lines = get_number_of_lines();
- const int half_screen = num_lines / 2 - 1;
-
- for (j = 0; j < GYM; j++)
- {
- for (i = 0; i < GXM; i++)
- {
- if (env.map[i][j])
- {
- if (!found_y)
- {
- found_y = true;
- min_y = j;
- }
-
- max_y = j;
-
- if (i < min_x)
- min_x = i;
-
- if (i > max_x)
- max_x = i;
- }
- }
- }
-
- const int map_lines = max_y - min_y + 1;
-
- const int start_x = min_x + (max_x - min_x + 1) / 2 - 40; // no x scrolling
- const int block_step = Options.level_map_cursor_step;
- int start_y; // y does scroll
-
- int screen_y = you.y_pos;
-
- // if close to top of known map, put min_y on top
- // else if close to bottom of known map, put max_y on bottom.
- //
- // The num_lines comparisons are done to keep things neat, by
- // keeping things at the top of the screen. By shifting an
- // additional one in the num_lines > map_lines case, we can
- // keep the top line clear... which makes things look a whole
- // lot better for small maps.
- if (num_lines > map_lines)
- screen_y = min_y + half_screen - 1;
- else if (num_lines == map_lines || screen_y - half_screen < min_y)
- screen_y = min_y + half_screen;
- else if (screen_y + half_screen > max_y)
- screen_y = max_y - half_screen;
-
- int curs_x = you.x_pos - start_x;
- int curs_y = you.y_pos - screen_y + half_screen;
- int search_feat = 0, search_found = 0, anchor_x = -1, anchor_y = -1;
-
-#ifdef DOS_TERM
- gettext(1, 1, 80, 25, buffer);
- window(1, 1, 80, 25);
-#endif
-
- clrscr();
- textcolor(DARKGREY);
-
- put_screen:
- bufcount2 = 0;
-
- _setcursortype(_NOCURSOR);
-
-#ifdef PLAIN_TERM
- gotoxy(1, 1);
-#endif
-
- start_y = screen_y - half_screen;
-
- for (j = 0; j < num_lines; j++)
- {
- for (i = 0; i < 80; i++)
- {
- screen_buffer_t colour = DARKGREY;
- if (start_y + j >= 65 || start_y + j <= 3
- || start_x + i < 0 || start_x + i >= GXM - 1)
- {
- buffer2[bufcount2 + 1] = DARKGREY;
- buffer2[bufcount2] = 0;
- bufcount2 += 2;
-
-#ifdef PLAIN_TERM
- goto print_it;
-#endif
-
-#ifdef DOS_TERM
- continue;
-#endif
-
- }
-
- colour = colour_code_map(start_x + i, start_y + j,
- Options.item_colour,
- !spec_place[0] && Options.travel_colour);
-
- buffer2[bufcount2 + 1] = colour;
-
- if (start_x + i + 1 == you.x_pos && start_y + j + 1 == you.y_pos)
- buffer2[bufcount2 + 1] = WHITE;
-
- buffer2[bufcount2] =
- (unsigned char) env.map[start_x + i][start_y + j];
-
- // If we've a waypoint on the current square, *and* the square is
- // a normal floor square with nothing on it, show the waypoint
- // number.
- if (Options.show_waypoints)
- {
- // XXX: This is a horrible hack.
- screen_buffer_t &bc = buffer2[bufcount2];
- int gridx = start_x + i + 1, gridy = start_y + j + 1;
- unsigned char ch = is_waypoint(gridx, gridy);
- if (ch && (bc == mapch2(DNGN_FLOOR) ||
- bc == mapch(DNGN_FLOOR)))
- bc = ch;
- }
-
- bufcount2 += 2;
-
-#ifdef PLAIN_TERM
-
- print_it:
- // avoid line wrap
- if (i == 79)
- continue;
-
- // newline
- if (i == 0 && j > 0)
- gotoxy( 1, j + 1 );
-
- textcolor( buffer2[bufcount2 - 1] );
- putch( buffer2[bufcount2 - 2] );
-#endif
- }
- }
-
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer2);
-#endif
-
- _setcursortype(_NORMALCURSOR);
- gotoxy(curs_x, curs_y);
-
- gettything:
- getty = getchm(KC_LEVELMAP);
-
- if (spec_place[0] == 0 && getty != 0 && getty != '+' && getty != '-'
- && getty != 'h' && getty != 'j' && getty != 'k' && getty != 'l'
- && getty != 'y' && getty != 'u' && getty != 'b' && getty != 'n'
- && getty != 'H' && getty != 'J' && getty != 'K' && getty != 'L'
- && getty != 'Y' && getty != 'U' && getty != 'B' && getty != 'N'
- // Keystrokes to initiate travel
- && getty != ',' && getty != '.' && getty != '\r' && getty != ';'
-
- // Keystrokes for jumping to features
- && getty != '<' && getty != '>' && getty != '@' && getty != '\t'
- && getty != '^' && getty != '_'
- && (getty < '0' || getty > '9')
- && getty != CONTROL('X')
- && getty != CONTROL('E')
- && getty != CONTROL('F')
- && getty != CONTROL('W')
- && getty != CONTROL('C')
- && getty != 'X' && getty != 'F' && getty != 'I' && getty != 'W')
- {
- goto putty;
- }
-
- if (spec_place[0] == 1 && getty != 0 && getty != '+' && getty != '-'
- && getty != 'h' && getty != 'j' && getty != 'k' && getty != 'l'
- && getty != 'y' && getty != 'u' && getty != 'b' && getty != 'n'
- && getty != 'H' && getty != 'J' && getty != 'K' && getty != 'L'
- && getty != 'Y' && getty != 'U' && getty != 'B' && getty != 'N'
- && getty != '.' && getty != 'S' && (getty < '0' || getty > '9')
- // Keystrokes for jumping to features
- && getty != '<' && getty != '>' && getty != '@' && getty != '\t'
- && getty != '^' && getty != '_')
- {
- goto gettything;
- }
-
- if (getty == 0)
- getty = getchm(KC_LEVELMAP);
-
-#ifdef WIN32CONSOLE
- // Translate shifted numpad to shifted vi keys. Yes,
- // this is horribly hacky.
- {
- static int win_keypad[] = { 'B', 'J', 'N',
- 'H', '5', 'L',
- 'Y', 'K', 'U' };
- if (getty >= '1' && getty <= '9')
- getty = win_keypad[ getty - '1' ];
- }
-#endif
-
- switch (getty)
- {
- case CONTROL('C'):
- clear_map();
- break;
-
- case CONTROL('F'):
- case CONTROL('W'):
- travel_cache.add_waypoint(start_x + curs_x, start_y + curs_y);
- // We need to do this all over again so that the user can jump
- // to the waypoint he just created.
- features.clear();
- find_travel_pos(you.x_pos, you.y_pos, NULL, NULL, &features);
- // Sort features into the order the player is likely to prefer.
- arrange_features(features);
- move_x = move_y = 0;
- break;
- case CONTROL('E'):
- case CONTROL('X'):
- {
- int x = start_x + curs_x, y = start_y + curs_y;
- if (getty == CONTROL('X'))
- toggle_exclude(x, y);
- else
- clear_excludes();
-
- // We now need to redo travel colours
- features.clear();
- find_travel_pos(you.x_pos, you.y_pos, NULL, NULL, &features);
- // Sort features into the order the player is likely to prefer.
- arrange_features(features);
-
- move_x = move_y = 0;
- }
- break;
-
- case 'b':
- case '1':
- move_x = -1;
- move_y = 1;
- break;
-
- case 'j':
- case '2':
- move_y = 1;
- move_x = 0;
- break;
-
- case 'u':
- case '9':
- move_x = 1;
- move_y = -1;
- break;
-
- case 'k':
- case '8':
- move_y = -1;
- move_x = 0;
- break;
-
- case 'y':
- case '7':
- move_y = -1;
- move_x = -1;
- break;
-
- case 'h':
- case '4':
- move_x = -1;
- move_y = 0;
- break;
-
- case 'n':
- case '3':
- move_y = 1;
- move_x = 1;
- break;
-
- case 'l':
- case '6':
- move_x = 1;
- move_y = 0;
- break;
-
- case 'B':
- move_x = -block_step;
- move_y = block_step;
- break;
-
- case 'J':
- move_y = block_step;
- move_x = 0;
- break;
-
- case 'U':
- move_x = block_step;
- move_y = -block_step;
- break;
-
- case 'K':
- move_y = -block_step;
- move_x = 0;
- break;
-
- case 'Y':
- move_y = -block_step;
- move_x = -block_step;
- break;
-
- case 'H':
- move_x = -block_step;
- move_y = 0;
- break;
-
- case 'N':
- move_y = block_step;
- move_x = block_step;
- break;
-
- case 'L':
- move_x = block_step;
- move_y = 0;
- break;
-
- case '+':
- move_y = 20;
- move_x = 0;
- break;
- case '-':
- move_y = -20;
- move_x = 0;
- break;
- case '<':
- case '>':
- case '@':
- case '\t':
- case '^':
- case '_':
- case 'X':
- case 'F':
- case 'W':
- case 'I':
- move_x = 0;
- move_y = 0;
- if (anchor_x == -1) {
- anchor_x = start_x + curs_x - 1;
- anchor_y = start_y + curs_y - 1;
- }
- if (search_feat != getty) {
- search_feat = getty;
- search_found = 0;
- }
- if (!spec_place[0])
- search_found = find_feature(features, getty, curs_x, curs_y,
- start_x, start_y,
- search_found, &move_x, &move_y);
- else
- search_found = find_feature(getty, curs_x, curs_y,
- start_x, start_y,
- anchor_x, anchor_y,
- search_found, &move_x, &move_y);
- break;
- case '.':
- case '\r':
- case 'S':
- case ',':
- case ';':
- {
- int x = start_x + curs_x, y = start_y + curs_y;
- if (!spec_place[0] && x == you.x_pos && y == you.y_pos)
- {
- if (you.travel_x > 0 && you.travel_y > 0) {
- move_x = you.travel_x - x;
- move_y = you.travel_y - y;
- }
- break;
- }
- else {
- spec_place[0] = x;
- spec_place[1] = y;
- goto putty;
- }
- }
- default:
- move_x = 0;
- move_y = 0;
- break;
- }
-
- if (curs_x + move_x < 1 || curs_x + move_x > 80)
- move_x = 0;
-
- curs_x += move_x;
-
- if (num_lines < map_lines)
- {
- // Scrolling only happens when we don't have a large enough
- // display to show the known map.
- if (getty == '-' || getty == '+')
- {
- if (getty == '-')
- screen_y -= 20;
-
- if (screen_y <= min_y + half_screen)
- screen_y = min_y + half_screen;
-
- if (getty == '+')
- screen_y += 20;
-
- if (screen_y >= max_y - half_screen)
- screen_y = max_y - half_screen;
-
- goto put_screen;
- }
-
- if (curs_y + move_y < 1)
- {
- // screen_y += (curs_y + move_y) - 1;
- screen_y += move_y;
-
- if (screen_y < min_y + half_screen) {
- move_y = screen_y - (min_y + half_screen);
- screen_y = min_y + half_screen;
- }
- else
- move_y = 0;
- }
-
- if (curs_y + move_y > num_lines - 1)
- {
- // screen_y += (curs_y + move_y) - num_lines + 1;
- screen_y += move_y;
-
- if (screen_y > max_y - half_screen) {
- move_y = screen_y - (max_y - half_screen);
- screen_y = max_y - half_screen;
- }
- else
- move_y = 0;
- }
- }
-
- if (curs_y + move_y < 1 || curs_y + move_y > num_lines)
- move_y = 0;
-
- curs_y += move_y;
- goto put_screen;
-
- putty:
-
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
-
- return;
-} // end show_map()
-
-
-void magic_mapping(int map_radius, int proportion)
-{
- int i, j, k, l, empty_count;
-
- if (map_radius > 50)
- map_radius = 50;
-
- for (i = you.x_pos - map_radius; i < you.x_pos + map_radius; i++)
- {
- for (j = you.y_pos - map_radius; j < you.y_pos + map_radius; j++)
- {
- if (random2(100) > proportion)
- continue; // note that proportion can be over 100
-
- if (i < 5 || j < 5 || i > (GXM - 5) || j > (GYM - 5))
- continue;
-
- //if (env.map[i][j] == mapch2(grd[i + 1][j + 1]))
- // continue;
- if (env.map[i][j])
- continue;
-
- empty_count = 8;
-
- if (grd[i][j] < DNGN_LAVA && grd[i][j] != DNGN_CLOSED_DOOR)
- {
- for (k = 0; k < 3; k++)
- {
- for (l = 0; l < 3; l++)
- {
- if (k == 1 && l == 1)
- continue;
-
- if (grd[i + k][j + l] <= 60
- && grd[i + k][j + l] != DNGN_CLOSED_DOOR)
- {
- empty_count--;
- }
- }
- }
- }
-
- if (empty_count > 0)
- env.map[i][j] = mapch(grd[i + 1][j + 1]);
- }
- }
-} // end magic_mapping()
-
-
-/* mapchars 3 & 4 are for non-ibm char sets */
-unsigned char mapchar(unsigned char ldfk)
-{
- unsigned char showed = 0;
-
- switch (ldfk)
- {
- case DNGN_UNSEEN:
- showed = 0;
- break;
-
- case DNGN_SECRET_DOOR:
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- case DNGN_STONE_WALL:
- case DNGN_METAL_WALL:
- case DNGN_GREEN_CRYSTAL_WALL:
- case DNGN_WAX_WALL:
- showed = 176;
- break;
-
- case DNGN_CLOSED_DOOR:
- showed = 206;
- break;
-
- case 20: // orcish idol
- case 24: // ???
- case 25: // ???
- case DNGN_SILVER_STATUE:
- case DNGN_GRANITE_STATUE:
- case DNGN_ORANGE_CRYSTAL_STATUE:
- showed = '8';
- break;
-
- case DNGN_LAVA:
- case DNGN_DEEP_WATER:
- case DNGN_SHALLOW_WATER:
- showed = 247;
- break;
-
- case DNGN_FLOOR:
- case DNGN_UNDISCOVERED_TRAP:
- showed = 250;
- break;
-
- //case 68: showed = '>'; break; // < (60)
-
- case DNGN_OPEN_DOOR:
- showed = 39;
- break;
-
- //case 72: showed = '<'; break;
-
- case DNGN_TRAP_MECHANICAL:
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- showed = '^';
- break;
-
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ROCK_STAIRS_DOWN:
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- showed = '>';
- break;
-
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_ROCK_STAIRS_UP:
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- showed = '<';
- break;
-
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_LABYRINTH:
- case DNGN_ENTER_SHOP:
- case DNGN_ENTER_DIS:
- case DNGN_ENTER_GEHENNA:
- case DNGN_ENTER_COCYTUS:
- case DNGN_ENTER_TARTARUS:
- case DNGN_ENTER_ABYSS:
- case DNGN_EXIT_ABYSS:
- case DNGN_STONE_ARCH:
- case DNGN_ENTER_PANDEMONIUM:
- case DNGN_EXIT_PANDEMONIUM:
- case DNGN_TRANSIT_PANDEMONIUM:
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- showed = 239;
- break;
-
- case DNGN_ALTAR_ZIN:
- case DNGN_ALTAR_SHINING_ONE:
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- case DNGN_ALTAR_YREDELEMNUL:
- case DNGN_ALTAR_XOM:
- case DNGN_ALTAR_VEHUMET:
- case DNGN_ALTAR_OKAWARU:
- case DNGN_ALTAR_MAKHLEB:
- case DNGN_ALTAR_SIF_MUNA:
- case DNGN_ALTAR_TROG:
- case DNGN_ALTAR_NEMELEX_XOBEH:
- case DNGN_ALTAR_ELYVILON:
- showed = 220;
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_SPARKLING_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_DRY_FOUNTAIN_III:
- case DNGN_DRY_FOUNTAIN_IV:
- case DNGN_DRY_FOUNTAIN_V:
- case DNGN_DRY_FOUNTAIN_VI:
- case DNGN_DRY_FOUNTAIN_VII:
- case DNGN_DRY_FOUNTAIN_VIII:
- case DNGN_PERMADRY_FOUNTAIN:
- showed = 159;
- break;
-
- default:
- showed = 0;
- break;
- }
-
- return showed;
-}
-
-
-unsigned char mapchar2(unsigned char ldfk)
-{
- unsigned char showed = 0;
-
- switch (ldfk)
- {
- case DNGN_UNSEEN:
- showed = 0;
- break;
-
- case DNGN_SECRET_DOOR:
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- case DNGN_STONE_WALL:
- case DNGN_METAL_WALL:
- case DNGN_GREEN_CRYSTAL_WALL:
- case DNGN_WAX_WALL:
- showed = 177;
- break;
-
- case DNGN_CLOSED_DOOR:
- showed = 254;
- break;
-
- case 20: // orcish idol
- case 24: // ???
- case 25: // ???
- case DNGN_SILVER_STATUE:
- case DNGN_GRANITE_STATUE:
- case DNGN_ORANGE_CRYSTAL_STATUE:
- showed = '8';
- break;
-
- case DNGN_LAVA:
- case DNGN_DEEP_WATER:
- case DNGN_SHALLOW_WATER:
- showed = 247;
- break;
-
- case DNGN_FLOOR:
- case DNGN_UNDISCOVERED_TRAP:
- showed = 249;
- break;
-
- case 68:
- showed = '>';
- break; // <
-
- case DNGN_OPEN_DOOR:
- showed = 39;
- break;
-
- case 72:
- showed = '<';
- break; // <
-
- case DNGN_TRAP_MECHANICAL:
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- showed = '^';
- break;
-
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ROCK_STAIRS_DOWN:
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- showed = '>';
- break;
-
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_ROCK_STAIRS_UP:
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- showed = '<';
- break;
-
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_LABYRINTH:
- case DNGN_ENTER_SHOP:
- case DNGN_ENTER_DIS:
- case DNGN_ENTER_GEHENNA:
- case DNGN_ENTER_COCYTUS:
- case DNGN_ENTER_TARTARUS:
- case DNGN_ENTER_ABYSS:
- case DNGN_EXIT_ABYSS:
- case DNGN_STONE_ARCH:
- case DNGN_ENTER_PANDEMONIUM:
- case DNGN_EXIT_PANDEMONIUM:
- case DNGN_TRANSIT_PANDEMONIUM:
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- showed = 239;
- break;
-
- case DNGN_ALTAR_ZIN:
- case DNGN_ALTAR_SHINING_ONE:
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- case DNGN_ALTAR_YREDELEMNUL:
- case DNGN_ALTAR_XOM:
- case DNGN_ALTAR_VEHUMET:
- case DNGN_ALTAR_OKAWARU:
- case DNGN_ALTAR_MAKHLEB:
- case DNGN_ALTAR_SIF_MUNA:
- case DNGN_ALTAR_TROG:
- case DNGN_ALTAR_NEMELEX_XOBEH:
- case DNGN_ALTAR_ELYVILON:
- showed = 220;
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_SPARKLING_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_DRY_FOUNTAIN_III:
- case DNGN_DRY_FOUNTAIN_IV:
- case DNGN_DRY_FOUNTAIN_V:
- case DNGN_DRY_FOUNTAIN_VI:
- case DNGN_DRY_FOUNTAIN_VII:
- case DNGN_DRY_FOUNTAIN_VIII:
- case DNGN_PERMADRY_FOUNTAIN:
- showed = 159;
- break;
- default:
- showed = 0;
- break;
- }
-
- return showed;
-}
-
-
-// realize that this is simply a repackaged version of
-// stuff::see_grid() -- make certain they correlate {dlb}:
-bool mons_near(struct monsters *monster, unsigned int foe)
-{
- // early out -- no foe!
- if (foe == MHITNOT)
- return (false);
-
- if (foe == MHITYOU)
- {
- if (monster->x > you.x_pos - 9 && monster->x < you.x_pos + 9
- && monster->y > you.y_pos - 9 && monster->y < you.y_pos + 9)
- {
- if (env.show[monster->x - you.x_pos + 9][monster->y - you.y_pos + 9])
- return (true);
- }
- return (false);
- }
-
- // must be a monster
- struct monsters *myFoe = &menv[foe];
- if (myFoe->type >= 0)
- {
- if (monster->x > myFoe->x - 9 && monster->x < myFoe->x + 9
- && monster->y > myFoe->y - 9 && monster->y < myFoe->y + 9)
- {
- return (true);
- }
- }
-
- return (false);
-} // end mons_near()
-
-
-//---------------------------------------------------------------
-//
-// get_non_ibm_symbol
-//
-// Returns the character code and color for everything drawn
-// without the IBM graphics option.
-//
-//---------------------------------------------------------------
-void get_non_ibm_symbol(unsigned int object, unsigned short *ch,
- unsigned short *color)
-{
- ASSERT(color != NULL);
- ASSERT(ch != NULL);
-
- switch (object)
- {
-
- case DNGN_UNSEEN:
- *ch = 0;
- break;
-
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- *color = env.rock_colour;
- *ch = '#';
- break;
-
- case DNGN_STONE_WALL:
- if (player_in_branch( BRANCH_HALL_OF_ZOT ))
- *color = env.rock_colour;
- else
- *color = LIGHTGREY;
- *ch = '#';
- break;
-
- case DNGN_CLOSED_DOOR:
- *ch = '+';
- break;
-
- case DNGN_METAL_WALL:
- *ch = '#';
- *color = CYAN;
- break;
-
- case DNGN_SECRET_DOOR:
- *ch = '#';
- *color = env.rock_colour;
- break;
-
- case DNGN_GREEN_CRYSTAL_WALL:
- *ch = '#';
- *color = GREEN;
- break;
-
- case DNGN_ORCISH_IDOL:
- *ch = '8';
- *color = DARKGREY;
- break;
-
- case DNGN_WAX_WALL:
- *ch = '#';
- *color = YELLOW;
- break;
-
- case DNGN_SILVER_STATUE:
- *ch = '8';
- *color = WHITE;
- Visible_Statue[ STATUE_SILVER ] = 1;
- break;
-
- case DNGN_GRANITE_STATUE:
- *ch = '8';
- *color = LIGHTGREY;
- break;
-
- case DNGN_ORANGE_CRYSTAL_STATUE:
- *ch = '8';
- *color = LIGHTRED;
- Visible_Statue[ STATUE_ORANGE_CRYSTAL ] = 1;
- break;
-
- case DNGN_LAVA:
- *ch = '{';
- *color = RED;
- break;
-
- case DNGN_DEEP_WATER:
- *ch = '{';
- // this wavy thing also used for water elemental
- // note that some monsters which use IBM graphics aren't set
- // for this function - too tricky for now.
- *color = BLUE;
- break;
-
- case DNGN_SHALLOW_WATER:
- *color = CYAN;
- *ch = '{';
- break;
-
- case DNGN_FLOOR:
- *color = env.floor_colour;
- *ch = '.';
- break;
-
- case DNGN_ENTER_HELL:
- *color = RED;
- *ch = '\\';
- seen_other_thing(DNGN_ENTER_HELL);
- break;
-
- case DNGN_OPEN_DOOR:
- *ch = '\'';
- break;
-
- case DNGN_TRAP_MECHANICAL:
- *color = 11;
- *ch = '^';
- break;
-
- case DNGN_TRAP_MAGICAL:
- *color = MAGENTA;
- *ch = '^';
- break;
-
- case DNGN_TRAP_III:
- *color = LIGHTGREY;
- *ch = '^';
- break;
-
- case DNGN_UNDISCOVERED_TRAP:
- *color = env.floor_colour;
- *ch = '.';
- break;
-
- case DNGN_ENTER_SHOP:
- *color = YELLOW;
- *ch = '\\';
- seen_other_thing(DNGN_ENTER_SHOP);
- break;
-// if I change anything above here, must also change magic mapping!
-
- case DNGN_ENTER_LABYRINTH:
- *color = LIGHTGREY;
- *ch = '\\';
- seen_other_thing(DNGN_ENTER_LABYRINTH);
- break;
-
- case DNGN_ROCK_STAIRS_DOWN:
- *color = BROWN; // ladder
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- *ch = '>';
- break;
-
- case DNGN_ROCK_STAIRS_UP:
- *color = BROWN; // ladder
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- *ch = '<';
- break;
-
- case DNGN_ENTER_DIS:
- *color = CYAN;
- *ch = '\\';
- break;
-
- case DNGN_ENTER_GEHENNA:
- *color = RED;
- *ch = '\\';
- break;
-
- case DNGN_ENTER_COCYTUS:
- *color = LIGHTCYAN;
- *ch = '\\';
- break;
-
- case DNGN_ENTER_TARTARUS:
- *color = DARKGREY;
- *ch = '\\';
- break;
-
- case DNGN_ENTER_ABYSS:
- *color = random2(16);
- *ch = '\\';
- seen_other_thing(DNGN_ENTER_ABYSS);
- break;
-
- case DNGN_EXIT_ABYSS:
- *color = random2(16);
- *ch = '\\';
- break;
-
- case DNGN_STONE_ARCH:
- *color = LIGHTGREY;
- *ch = '\\';
- break;
-
- case DNGN_ENTER_PANDEMONIUM:
- *color = LIGHTBLUE;
- *ch = '\\';
- seen_other_thing(DNGN_ENTER_PANDEMONIUM);
- break;
-
- case DNGN_EXIT_PANDEMONIUM:
- *color = LIGHTBLUE;
- *ch = '\\';
- break;
-
- case DNGN_TRANSIT_PANDEMONIUM:
- *color = LIGHTGREEN;
- *ch = '\\';
- break; // gate to other part of pandemonium
-
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- *color = YELLOW;
- *ch = '>';
- seen_staircase(object);
- break;
-
- case DNGN_ENTER_ZOT:
- *color = MAGENTA;
- *ch = '\\';
- seen_staircase(object);
- break;
-
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- *color = YELLOW;
- *ch = '<';
- break;
-
- case DNGN_RETURN_FROM_ZOT:
- *color = MAGENTA;
- *ch = '\\';
- break;
-
- case DNGN_ALTAR_ZIN:
- *color = WHITE;
- *ch = '_';
- seen_altar(GOD_ZIN);
- break;
-
- case DNGN_ALTAR_SHINING_ONE:
- *color = YELLOW;
- *ch = '_';
- seen_altar(GOD_SHINING_ONE);
- break;
-
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- *color = DARKGREY;
- *ch = '_';
- seen_altar(GOD_KIKUBAAQUDGHA);
- break;
-
- case DNGN_ALTAR_YREDELEMNUL:
- *color = DARKGREY;
- if (one_chance_in(3))
- *color = RED;
- *ch = '_';
- seen_altar(GOD_YREDELEMNUL);
- break;
-
- case DNGN_ALTAR_XOM:
- *color = random_colour();
- *ch = '_';
- seen_altar(GOD_XOM);
- break;
-
- case DNGN_ALTAR_VEHUMET:
- *color = LIGHTBLUE;
- if (one_chance_in(3))
- *color = LIGHTMAGENTA;
- if (one_chance_in(3))
- *color = LIGHTRED;
- *ch = '_';
- seen_altar(GOD_VEHUMET);
- break;
-
- case DNGN_ALTAR_OKAWARU:
- *color = CYAN;
- *ch = '_';
- seen_altar(GOD_OKAWARU);
- break;
-
- case DNGN_ALTAR_MAKHLEB:
- *color = RED;
- if (one_chance_in(3))
- *color = LIGHTRED;
- if (one_chance_in(3))
- *color = YELLOW;
- *ch = '_';
- seen_altar(GOD_MAKHLEB);
- break;
-
- case DNGN_ALTAR_SIF_MUNA:
- *color = BLUE;
- *ch = '_';
- seen_altar(GOD_SIF_MUNA);
- break;
-
- case DNGN_ALTAR_TROG:
- *color = RED;
- *ch = '_';
- seen_altar(GOD_TROG);
- break;
-
- case DNGN_ALTAR_NEMELEX_XOBEH:
- *color = LIGHTMAGENTA;
- *ch = '_';
- seen_altar(GOD_NEMELEX_XOBEH);
- break;
-
- case DNGN_ALTAR_ELYVILON:
- *color = LIGHTGREY;
- *ch = '_';
- seen_altar(GOD_ELYVILON);
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- *color = BLUE;
- *ch = '}';
- break;
-
- case DNGN_SPARKLING_FOUNTAIN:
- *color = LIGHTBLUE;
- *ch = '}';
- break;
-
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_PERMADRY_FOUNTAIN:
- *color = LIGHTGREY;
- *ch = '}';
- break;
-
- case 256:
- *ch = '0';
- break;
-
- case 257:
- *color = CYAN;
- *ch = '~';
- break; /* Invis creature walking through water */
-
- case 258:
- *ch = ')';
- break; // weapon )
-
- case 259:
- *ch = '[';
- break; // armour [
-
- case 260:
- *ch = '/';
- break; // wands, etc.
-
- case 261:
- *ch = '%';
- break; // food
-
- case 262:
- *ch = '+';
- break; // books +
-
- case 263:
- *ch = '?';
- break; // scroll ?
-
- case 264:
- *ch = '=';
- break; // ring = etc
-
- case 265:
- *ch = '!';
- break; // potions !
-
- case 266:
- *ch = '(';
- break; // stones
-
- case 267:
- *ch = ':';
- break; // book +
-
- case 268:
- *ch = '%';
- break; // corpses part 1
-
- case 269:
- *ch = '|';
- break; // magical staves
-
- case 270:
- *ch = '}';
- break; // gems
-
- case 271:
- *ch = '%';
- break; // don't know ?
-
- case 272:
- *ch = '$';
- *color = YELLOW;
- break; // $ gold
-
- case 273:
- *ch = '"';
- break; // amulet
-
- default:
- int mnr = object;
- *ch = ((mnr >= 297) ? mons_char(mnr - 297) : object); // yeah
- break;
- }
-}
-
-
-/*
- This is the viewwindow function for computers without IBM graphic displays.
- It is activated by a command line argument, which sets a function pointer.
- */
-void viewwindow3(char draw_it, bool do_updates)
-{
- int bufcount = 0;
- FixedVector < unsigned short, 1500 > buffy; //[800]; //392];
-
- unsigned short ch, color;
-
- int count_x, count_y;
-
- losight(env.show, grd, you.x_pos, you.y_pos);
-
- for (count_x = 0; count_x < 18; count_x++)
- {
- for (count_y = 0; count_y < 18; count_y++)
- {
- env.show_col[count_x][count_y] = LIGHTGREY;
- show_backup[count_x][count_y] = 0;
- }
- }
-
- item();
- cloud_grid();
- monster_grid(do_updates);
- bufcount = 0;
-
- if (draw_it == 1)
- {
- _setcursortype(_NOCURSOR);
- for (count_y = (you.y_pos - 8); (count_y < you.y_pos + 9); count_y++)
- {
- bufcount += 16;
-
- for (count_x = (you.x_pos - 8); (count_x < you.x_pos + 9); count_x++)
- {
- color = env.show_col[count_x - you.x_pos + 9]
- [count_y - you.y_pos + 9];
-
- if (count_x == you.x_pos && count_y == you.y_pos)
- {
- ch = your_sign;
-
- if (player_is_swimming())
- {
- color = (grd[you.x_pos][you.y_pos] == DNGN_DEEP_WATER)
- ? BLUE : CYAN;
- }
- else
- {
- color = your_colour;
- }
- }
- else
- {
- unsigned int object = env.show[count_x - you.x_pos + 9]
- [count_y - you.y_pos + 9];
-
- get_non_ibm_symbol(object, &ch, &color);
- }
-
- buffy[bufcount] = ch; //showed;
- buffy[bufcount + 1] = color;
- bufcount += 2;
- }
-
- bufcount += 16;
- }
-
- bufcount = 0;
-
- if (you.level_type != LEVEL_LABYRINTH
- && you.level_type != LEVEL_ABYSS)
- {
- for (count_y = 0; count_y < 17; count_y++)
- {
- bufcount += 16;
- for (count_x = 0; count_x < 17; count_x++)
- {
- int enx = count_x + you.x_pos - 9,
- eny = count_y + you.y_pos - 9;
- if (buffy[bufcount] != 0 && enx >= 0 && eny >= 0
- && enx + 1 < GXM && eny + 1 < GYM)
- {
- unsigned short bch = buffy[bufcount];
- if (mgrd[enx + 1][eny + 1] != NON_MONSTER) {
- const monsters &m = menv[ mgrd[enx + 1][eny + 1] ];
- if (!mons_is_mimic(m.type)
- && mons_char(m.type) == bch)
- {
- bch |= mons_colour(m.type) << 12;
- }
- }
- env.map[enx][eny] = bch;
- }
-
- if (Options.clean_map == 1
- && show_backup[count_x + 1][count_y + 1] != 0
- && enx >= 0
- && eny >= 0)
- {
- get_non_ibm_symbol( show_backup[count_x + 1]
- [count_y + 1],
- &ch, &color );
- env.map[enx][eny] = ch;
- }
- bufcount += 2;
- }
- bufcount += 16;
- }
- }
-
- bufcount = 0;
-
- for (count_y = 0; count_y < 17; count_y++)
- {
- for (count_x = 0; count_x < 33; count_x++)
- {
- if (count_x + you.x_pos - 17 < 3
- || count_y + you.y_pos - 9 < 3
- || count_x + you.x_pos - 14 > (GXM - 3)
- || count_y + you.y_pos - 9 > (GYM - 3))
- {
- buffy[bufcount] = 0;
- bufcount++;
- buffy[bufcount] = 0;
- bufcount++;
- continue;
- }
-
- if (count_x >= 8 && count_x <= 24 && count_y >= 0
- && count_y <= 16 && buffy[bufcount] != 0)
- {
- bufcount += 2;
- continue;
- }
-
- buffy[bufcount] = (unsigned char)
- env.map[count_x + you.x_pos - 17]
- [count_y + you.y_pos - 9];
-
- buffy[bufcount + 1] = DARKGREY;
-
- if (Options.colour_map)
- {
- if (env.map[count_x + you.x_pos - 17]
- [count_y + you.y_pos - 9] != 0)
- {
- buffy[bufcount + 1]
- = colour_code_map( count_x + you.x_pos - 17,
- count_y + you.y_pos - 9,
- Options.item_colour );
- }
- }
-
- bufcount += 2;
- }
- }
-
- const int flash_colour =
- you.flash_colour != BLACK? you.flash_colour :
- you.berserker ? RED :
- show_green != BLACK ? show_green :
- you.special_wield == SPWLD_SHADOW? DARKGREY :
- BLACK;
- if (flash_colour != BLACK)
- {
- for (count_x = 1; count_x < 1400; count_x += 2)
- {
- if (buffy[count_x] != DARKGREY)
- buffy[count_x] = flash_colour;
- }
-
- if (show_green != BLACK)
- {
- show_green = BLACK;
- if (you.special_wield == SPWLD_SHADOW)
- show_green = DARKGREY;
- }
- }
- you.flash_colour = BLACK;
-
-#ifdef DOS_TERM
- puttext(2, 1, 34, 17, buffy.buffer());
-#endif
-
-#ifdef PLAIN_TERM
- gotoxy(2, 1);
- bufcount = 0;
-
- // this line is purely optional
- if (you.running == 0 || (you.running < 0 && Options.travel_delay > -1))
- {
- for (count_x = 0; count_x < 1120; count_x += 2) // 1056
- {
- textcolor(buffy[count_x + 1]);
- putch(buffy[count_x]);
-
- if (count_x % 66 == 64 && count_x > 0)
-#ifdef DOS_TERM
- cprintf(EOL " ");
-#endif
-
-#ifdef PLAIN_TERM
- gotoxy(2, wherey() + 1);
-#endif
- }
- }
-#endif
- _setcursortype(_NORMALCURSOR);
- } // end of (if brek...)
-} // end viewwindow3()
-
-
-unsigned char mapchar3(unsigned char ldfk)
-{
- unsigned char showed = 0;
-
- switch (ldfk)
- {
- case DNGN_UNSEEN:
- showed = 0;
- break;
-
- case DNGN_SECRET_DOOR:
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- case DNGN_STONE_WALL:
- case DNGN_METAL_WALL:
- case DNGN_GREEN_CRYSTAL_WALL:
- case DNGN_WAX_WALL:
- showed = '*';
- break;
-
- case DNGN_CLOSED_DOOR:
- showed = '+';
- break;
-
- case 20: // orcish idol
- case 24: // ???
- case 25: // ???
- case DNGN_SILVER_STATUE:
- case DNGN_GRANITE_STATUE:
- case DNGN_ORANGE_CRYSTAL_STATUE:
- showed = '8';
- break;
-
- case DNGN_LAVA:
- case DNGN_DEEP_WATER:
- case DNGN_SHALLOW_WATER:
- showed = '{';
- break;
-
- case DNGN_FLOOR:
- case DNGN_UNDISCOVERED_TRAP:
- showed = ',';
- break;
-
- //case 68: showed = '>'; break; // < (60)
-
- case DNGN_OPEN_DOOR:
- showed = 39;
- break; // open door
-
- //case 72: showed = '<'; break;
-
- case DNGN_TRAP_MECHANICAL:
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- showed = '^';
- break;
-
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ROCK_STAIRS_DOWN:
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- showed = '>';
- break;
-
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_ROCK_STAIRS_UP:
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- showed = '<';
- break;
-
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_LABYRINTH:
- case DNGN_ENTER_SHOP:
- case DNGN_ENTER_DIS:
- case DNGN_ENTER_GEHENNA:
- case DNGN_ENTER_COCYTUS:
- case DNGN_ENTER_TARTARUS:
- case DNGN_ENTER_ABYSS:
- case DNGN_EXIT_ABYSS:
- case DNGN_STONE_ARCH:
- case DNGN_ENTER_PANDEMONIUM:
- case DNGN_EXIT_PANDEMONIUM:
- case DNGN_TRANSIT_PANDEMONIUM:
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- showed = '\\';
- break;
-
- case DNGN_ALTAR_ZIN:
- case DNGN_ALTAR_SHINING_ONE:
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- case DNGN_ALTAR_YREDELEMNUL:
- case DNGN_ALTAR_XOM:
- case DNGN_ALTAR_VEHUMET:
- case DNGN_ALTAR_OKAWARU:
- case DNGN_ALTAR_MAKHLEB:
- case DNGN_ALTAR_SIF_MUNA:
- case DNGN_ALTAR_TROG:
- case DNGN_ALTAR_NEMELEX_XOBEH:
- case DNGN_ALTAR_ELYVILON:
- showed = '_';
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_SPARKLING_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_DRY_FOUNTAIN_III:
- case DNGN_DRY_FOUNTAIN_IV:
- case DNGN_DRY_FOUNTAIN_V:
- case DNGN_DRY_FOUNTAIN_VI:
- case DNGN_DRY_FOUNTAIN_VII:
- case DNGN_DRY_FOUNTAIN_VIII:
- case DNGN_PERMADRY_FOUNTAIN:
- showed = '}';
- break;
-
- default:
- showed = 0;
- break;
- }
-
- return showed;
-}
-
-
-unsigned char mapchar4(unsigned char ldfk)
-{
- unsigned char showed = 0;
-
- switch (ldfk)
- {
- case DNGN_UNSEEN:
- showed = 0;
- break;
-
- case DNGN_CLOSED_DOOR:
- showed = '+';
- break;
-
- case DNGN_SECRET_DOOR:
- case DNGN_ROCK_WALL:
- case DNGN_PERMAROCK_WALL:
- case DNGN_STONE_WALL:
- case DNGN_METAL_WALL:
- case DNGN_GREEN_CRYSTAL_WALL:
- case DNGN_WAX_WALL:
- showed = '#';
- break;
-
- case 20: // orcish idol
- case 24: // ???
- case 25: // ???
- case DNGN_SILVER_STATUE:
- case DNGN_GRANITE_STATUE:
- case DNGN_ORANGE_CRYSTAL_STATUE:
- showed = '8';
- break;
-
- case DNGN_LAVA:
- case DNGN_DEEP_WATER:
- case DNGN_SHALLOW_WATER:
- showed = '{';
- break;
-
- case DNGN_FLOOR:
- case DNGN_UNDISCOVERED_TRAP:
- showed = '.';
- break;
-
- case 68:
- showed = '>'; // <
- break;
-
- case DNGN_OPEN_DOOR:
- showed = 39;
- break;
-
- case 72:
- showed = '<';
- break;
-
- case DNGN_TRAP_MECHANICAL:
- case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_III:
- showed = '^';
- break;
-
- case DNGN_STONE_STAIRS_DOWN_I:
- case DNGN_STONE_STAIRS_DOWN_II:
- case DNGN_STONE_STAIRS_DOWN_III:
- case DNGN_ROCK_STAIRS_DOWN:
- case DNGN_ENTER_ORCISH_MINES:
- case DNGN_ENTER_HIVE:
- case DNGN_ENTER_LAIR:
- case DNGN_ENTER_SLIME_PITS:
- case DNGN_ENTER_VAULTS:
- case DNGN_ENTER_CRYPT:
- case DNGN_ENTER_HALL_OF_BLADES:
- case DNGN_ENTER_TEMPLE:
- case DNGN_ENTER_SNAKE_PIT:
- case DNGN_ENTER_ELVEN_HALLS:
- case DNGN_ENTER_TOMB:
- case DNGN_ENTER_SWAMP:
- case 123:
- case 124:
- case 125:
- case 126:
- showed = '>';
- break;
-
- case DNGN_STONE_STAIRS_UP_I:
- case DNGN_STONE_STAIRS_UP_II:
- case DNGN_STONE_STAIRS_UP_III:
- case DNGN_ROCK_STAIRS_UP:
- case DNGN_RETURN_FROM_ORCISH_MINES:
- case DNGN_RETURN_FROM_HIVE:
- case DNGN_RETURN_FROM_LAIR:
- case DNGN_RETURN_FROM_SLIME_PITS:
- case DNGN_RETURN_FROM_VAULTS:
- case DNGN_RETURN_FROM_CRYPT:
- case DNGN_RETURN_FROM_HALL_OF_BLADES:
- case DNGN_RETURN_FROM_TEMPLE:
- case DNGN_RETURN_FROM_SNAKE_PIT:
- case DNGN_RETURN_FROM_ELVEN_HALLS:
- case DNGN_RETURN_FROM_TOMB:
- case DNGN_RETURN_FROM_SWAMP:
- case 143:
- case 144:
- case 145:
- case 146:
- showed = '<';
- break;
-
- case DNGN_ENTER_HELL:
- case DNGN_ENTER_LABYRINTH:
- case DNGN_ENTER_SHOP:
- case DNGN_ENTER_DIS:
- case DNGN_ENTER_GEHENNA:
- case DNGN_ENTER_COCYTUS:
- case DNGN_ENTER_TARTARUS:
- case DNGN_ENTER_ABYSS:
- case DNGN_EXIT_ABYSS:
- case DNGN_STONE_ARCH:
- case DNGN_ENTER_PANDEMONIUM:
- case DNGN_EXIT_PANDEMONIUM:
- case DNGN_TRANSIT_PANDEMONIUM:
- case DNGN_ENTER_ZOT:
- case DNGN_RETURN_FROM_ZOT:
- showed = '\\';
- break;
-
- case DNGN_ALTAR_ZIN:
- case DNGN_ALTAR_SHINING_ONE:
- case DNGN_ALTAR_KIKUBAAQUDGHA:
- case DNGN_ALTAR_YREDELEMNUL:
- case DNGN_ALTAR_XOM:
- case DNGN_ALTAR_VEHUMET:
- case DNGN_ALTAR_OKAWARU:
- case DNGN_ALTAR_MAKHLEB:
- case DNGN_ALTAR_SIF_MUNA:
- case DNGN_ALTAR_TROG:
- case DNGN_ALTAR_NEMELEX_XOBEH:
- case DNGN_ALTAR_ELYVILON:
- showed = '_';
- break;
-
- case DNGN_BLUE_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_I:
- case DNGN_SPARKLING_FOUNTAIN:
- case DNGN_DRY_FOUNTAIN_II:
- case DNGN_DRY_FOUNTAIN_III:
- case DNGN_DRY_FOUNTAIN_IV:
- case DNGN_DRY_FOUNTAIN_V:
- case DNGN_DRY_FOUNTAIN_VI:
- case DNGN_DRY_FOUNTAIN_VII:
- case DNGN_DRY_FOUNTAIN_VIII:
- case DNGN_PERMADRY_FOUNTAIN:
- showed = '}';
- break;
-
- default:
- showed = 0;
- break;
- }
-
- return showed;
-}