summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-07 17:32:26 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-07 17:32:26 +0000
commitee653d2656b747a8b8426fafc55c7c1cff008871 (patch)
tree527f7ed8f8a53532963f8d5eeb18fc91acf3c193 /crawl-ref
parent23931ce20599deb7cac821f41964d232855e7133 (diff)
downloadcrawl-ref-ee653d2656b747a8b8426fafc55c7c1cff008871.tar.gz
crawl-ref-ee653d2656b747a8b8426fafc55c7c1cff008871.zip
Added support for Unicode characters in the map display with ncursesw (enabled
by setting UNICODE_GLYPHS=y in makefile.unix). Removed the (1,1) offset between map and grid. Both map and grid are now in sync. Store object indexes instead of raw characters in env.map so that players can change charsets and have the display update immediately. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1552 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/INSTALL25
-rw-r--r--crawl-ref/docs/crawl_manual.txt2
-rw-r--r--crawl-ref/docs/crawl_options.txt25
-rw-r--r--crawl-ref/source/AppHdr.h8
-rw-r--r--crawl-ref/source/abyss.cc9
-rw-r--r--crawl-ref/source/acr.cc6
-rw-r--r--crawl-ref/source/command.cc3
-rw-r--r--crawl-ref/source/defines.h27
-rw-r--r--crawl-ref/source/direct.cc12
-rw-r--r--crawl-ref/source/enum.h1
-rw-r--r--crawl-ref/source/externs.h31
-rw-r--r--crawl-ref/source/files.cc13
-rw-r--r--crawl-ref/source/format.cc6
-rw-r--r--crawl-ref/source/initfile.cc46
-rw-r--r--crawl-ref/source/libdos.h8
-rw-r--r--crawl-ref/source/libunix.cc121
-rw-r--r--crawl-ref/source/libunix.h1
-rw-r--r--crawl-ref/source/libw32c.cc10
-rw-r--r--crawl-ref/source/libw32c.h2
-rw-r--r--crawl-ref/source/makefile.unix18
-rw-r--r--crawl-ref/source/player.cc7
-rw-r--r--crawl-ref/source/spells2.cc6
-rw-r--r--crawl-ref/source/stuff.cc9
-rw-r--r--crawl-ref/source/tags.cc16
-rw-r--r--crawl-ref/source/travel.cc75
-rw-r--r--crawl-ref/source/travel.h3
-rw-r--r--crawl-ref/source/tutorial.cc14
-rw-r--r--crawl-ref/source/view.cc443
-rw-r--r--crawl-ref/source/view.h13
29 files changed, 542 insertions, 418 deletions
diff --git a/crawl-ref/INSTALL b/crawl-ref/INSTALL
index c962fd36c6..4114224a28 100644
--- a/crawl-ref/INSTALL
+++ b/crawl-ref/INSTALL
@@ -32,6 +32,7 @@ Crawl can be built with some optional features:
* Sounds
* Regular expressions
* Lua support
+* Unicode characters for the map (Unix only).
Crawl Stone Soup also uses a level compiler to compile special level
definitions; to make changes to the level compiler, you'll need the
@@ -76,6 +77,11 @@ on some Unixes.
flex and bison are optional but highly recommended. Recent versions of
byacc are also fine (edit your makefile appropriately).
+If you have ncursesw and the development headers (usually in the
+/usr/include/ncursesw directory) you can build Crawl with support for
+Unicode display characters in the map by setting UNICODE_GLYPHS = y
+in makefile.unix.
+
Building:
* cd to the source directory (you can safely ignore the dolinks.sh and
@@ -339,3 +345,22 @@ http://gnuwin32.sourceforge.net/packages/pcre.htm
On DOS you get the joy of building PCRE yourself. It's a little more
annoying than building Lua (you have to roll your own makefile), but
not by much.
+
+
+Unicode
+-------
+
+Modern Unixes may support Unicode terminals (particularly xterms). If
+you have a terminal that can display Unicode characters, and an
+ncurses library that can handle Unicode (libncursesw, and its devel
+headers), you can build Crawl to display Unicode in the map: set
+UNICODE_GLYPHS = y in makefile.unix.
+
+NOTE: You may have libncursesw, but not have the header files; check
+that you have the header files installed as well, or you'll get a lot
+of errors. Crawl expects the ncursesw headers to be in
+/usr/include/ncursesw.
+
+After compiling Crawl with Unicode support, you still need to add the
+line "char_set = unicode" in your .crawlrc to tell Crawl to use
+Unicode. \ No newline at end of file
diff --git a/crawl-ref/docs/crawl_manual.txt b/crawl-ref/docs/crawl_manual.txt
index 65b1245cd5..1514bc8106 100644
--- a/crawl-ref/docs/crawl_manual.txt
+++ b/crawl-ref/docs/crawl_manual.txt
@@ -1035,7 +1035,7 @@ newsgroup rec.games.roguelike.misc. Flag queries with -crawl- as other
games are also discussed there. All topics related to this game usually
meet a warm response, including tales of victories (going under 'YAVP',
i.e. 'Yet Another Victory Post'), especially first victories (YAFVP) as
-well as sad stories of deceasedcharacters (being 'YAAD' or 'YASD', i.e.
+well as sad stories of deceased characters (being 'YAAD' or 'YASD', i.e.
'Yet Another Annoying/Stupid Death'). Some players, especially those on
crawl.akrasiac.org, also frequent ##crawl on IRC's freenode network.
diff --git a/crawl-ref/docs/crawl_options.txt b/crawl-ref/docs/crawl_options.txt
index 5be8d756c9..01b894bcd4 100644
--- a/crawl-ref/docs/crawl_options.txt
+++ b/crawl-ref/docs/crawl_options.txt
@@ -1167,12 +1167,12 @@ wiz_mode = (no | never | yes)
no -- still allows player to enter wizard mode after start of game
never -- never allow a wizard command to be used
-char_set = (ascii | ibm | dec)
+char_set = (ascii | ibm | dec | unicode)
Chooses different character sets for the game play screen. DOS and
Windows users will want to use the IBM character set, Unix users will
prefer DEC or plain ASCII.
-cset_ascii, cset_ibm, cset_dec, cset_any
+cset_ascii, cset_ibm, cset_dec, cset_unicode, cset_any
Can be used to change individual characters in a specific character
set (the character set used for display is determined by the char_set
option). The syntax is the same for all of these; cset_any changes
@@ -1194,10 +1194,13 @@ cset_XXX = <dungeon_character_name : symbol>
for water creatures submerged in shallow water, or invisible creatures
wading in shallow water.
- Symbols can be specified using a letter, or by a number (decimal code).
+ Symbols can be specified using a letter, or by a number (decimal code),
+ or a hexadecimal number (prefixed with x):
+
For an example on IBM displays,
- cset_ibm = wall:219, arch:0
- shows walls as solid blocks and shops and portals as '0'.
+ cset_ibm = wall:219, arch:0, wavy:x7E
+ shows walls as solid blocks, shops and portals as '0', and water as
+ '~'.
feature = <regex> { <symbol>, <magicmap symbol>, <view colour>,
<levelmap_magic_colour>, <levelmap_seen_colour> }
@@ -1223,8 +1226,16 @@ feature = <regex> { <symbol>, <magicmap symbol>, <view colour>,
descriptions strung together on the same line separated by semicolons.
Examples:
- feature = rock wall { , , red } # shows rock walls in red
- feature = metal wall {#} # use '#' for metal walls
+ * Colour rock walls red:
+ feature = rock wall { , , red }
+ * Use # for metal walls in all character sets:
+ feature = metal wall {#}
+
+ Symbols can be specified as with cset:
+ feature = metal wall {#}
+ feature = metal wall {35}
+ feature = metal wall {x23}
+ all do the same thing.
classic_item_colours = false
Crawl uses 4.0 b26/0.1.x-like item colours if classic_item_colours is
diff --git a/crawl-ref/source/AppHdr.h b/crawl-ref/source/AppHdr.h
index 01ff994e96..fa6ad69293 100644
--- a/crawl-ref/source/AppHdr.h
+++ b/crawl-ref/source/AppHdr.h
@@ -54,6 +54,14 @@
//
// #define CLUA_BINDINGS
+// Enable support for Unicode character glyphs. Note that this needs
+// to be accompanied by changes to linker and compiler options and may
+// not be available on all platforms. In most cases you want to set
+// this option from your makefile, not directly in AppHdr.h (See
+// INSTALL for more details.)
+//
+// #define UNICODE_GLYPHS
+
// Uncomment to prevent Crawl from looking for a list of saves when
// asking the player to enter a name. This can speed up startup
// considerably if you have a lot of saves lying around (even more so
diff --git a/crawl-ref/source/abyss.cc b/crawl-ref/source/abyss.cc
index 6dbf138ada..2b881855ba 100644
--- a/crawl-ref/source/abyss.cc
+++ b/crawl-ref/source/abyss.cc
@@ -71,14 +71,7 @@ static void generate_area(unsigned char gx1, unsigned char gy1,
FixedVector < unsigned char, 5 > replaced;
// nuke map
- for (i = 0; i < GXM; i++)
- {
- for (j = 0; j < GYM; j++)
- {
- env.map[i][j] = 0;
- env.map_col[i][j].clear();
- }
- }
+ env.map.init(map_cell());
// generate level composition vector
for (i = 0; i < 5; i++)
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 25757b00fa..716b02ed66 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -2860,11 +2860,7 @@ static bool initialise(void)
igrd.init(NON_ITEM);
mgrd.init(NON_MONSTER);
- env.map.init(0);
-
- for (int i = 0; i < GXM; i++)
- for (int j = 0; j < GYM; j++)
- env.map_col[i][j].clear();
+ env.map.init(map_cell());
you.unique_creatures.init(false);
you.unique_items.init(UNIQ_NOT_EXISTS);
diff --git a/crawl-ref/source/command.cc b/crawl-ref/source/command.cc
index 1101d4362c..eedeb15cef 100644
--- a/crawl-ref/source/command.cc
+++ b/crawl-ref/source/command.cc
@@ -1028,7 +1028,8 @@ void list_tutorial_help()
// Page size is number of lines - one line for --more-- prompt.
cols.set_pagesize(get_number_of_lines());
- unsigned short ch, colour;
+ unsigned ch;
+ unsigned short colour;
std::ostringstream text;
text <<
diff --git a/crawl-ref/source/defines.h b/crawl-ref/source/defines.h
index 5b8bb6200c..9f8beea1ba 100644
--- a/crawl-ref/source/defines.h
+++ b/crawl-ref/source/defines.h
@@ -88,11 +88,11 @@
// Note: these boundaries are exclusive for the zone the player can move/dig,
// and are inclusive for the area that we display on the map.
// Note: that the right (bottom) boundary is one smaller here.
-#define X_BOUND_1 BOUNDARY_BORDER
+#define X_BOUND_1 (-1 + BOUNDARY_BORDER)
#define X_BOUND_2 (GXM - BOUNDARY_BORDER)
#define X_WIDTH (X_BOUND_2 - X_BOUND_1 + 1)
-#define Y_BOUND_1 BOUNDARY_BORDER
+#define Y_BOUND_1 (-1 + BOUNDARY_BORDER)
#define Y_BOUND_2 (GYM - BOUNDARY_BORDER)
#define Y_WIDTH (Y_BOUND_2 - Y_BOUND_1 + 1)
@@ -112,26 +112,9 @@
#define LOS_RADIUS 8
#define ENV_SHOW_OFFSET (LOS_RADIUS + 1)
#define ENV_SHOW_DIAMETER (ENV_SHOW_OFFSET * 2 + 1)
-#define LOS_SX 8
-#define LOS_EX 25
-#define LOS_SY 1
-#define LOS_EY 17
-
-#define VIEW_SX 1
-#define VIEW_EX 33
-#define VIEW_SY 1
-#define VIEW_EY 17
-
-#define VIEW_WIDTH (VIEW_EX - VIEW_SX + 1)
-#define VIEW_HEIGHT (VIEW_EY - VIEW_SY + 1)
-
-#define VIEW_Y_DIFF (((VIEW_EX - VIEW_SX + 1) - (VIEW_EY - VIEW_SY + 1)) / 2)
-
-// View centre must be the same as LOS centre.
-// VIEW_CX == 17
-#define VIEW_CX ((VIEW_SX + VIEW_EX) / 2)
-// VIEW_CY == 9
-#define VIEW_CY ((VIEW_SY + VIEW_EY) / 2)
+
+#define VIEW_MIN_WIDTH 33
+#define VIEW_MIN_HEIGHT 17
// max traps per level
#define MAX_TRAPS 30
diff --git a/crawl-ref/source/direct.cc b/crawl-ref/source/direct.cc
index 5bf61db694..c7177ead30 100644
--- a/crawl-ref/source/direct.cc
+++ b/crawl-ref/source/direct.cc
@@ -96,11 +96,6 @@ static int targeting_cmd_to_compass( command_type command );
static void describe_oos_square(int x, int y);
static void extend_move_to_edge(dist &moves);
-static bool is_mapped(int x, int y)
-{
- return (is_player_mapped(x, y));
-}
-
static command_type read_direction_key(bool just_looking = false)
{
flush_input_buffer( FLUSH_BEFORE_COMMAND );
@@ -818,7 +813,7 @@ static void describe_oos_square(int x, int y)
{
mpr("You can't see that place.");
- if (!in_bounds(x, y) || !is_mapped(x, y))
+ if (!in_bounds(x, y) || !is_terrain_seen(x, y))
return;
describe_stash(x, y);
@@ -861,7 +856,7 @@ static bool find_monster( int x, int y, int mode )
static bool find_feature( int x, int y, int mode )
{
// The stair need not be in LOS if the square is mapped.
- if (!in_los(x, y) && (!Options.target_oos || !is_mapped(x, y)))
+ if (!in_los(x, y) && (!Options.target_oos || !is_terrain_seen(x, y)))
return (false);
return is_feature(mode, x, y);
@@ -873,7 +868,8 @@ static bool find_object(int x, int y, int mode)
// The square need not be in LOS if the stash tracker knows this item.
return (item != NON_ITEM
&& (in_los(x, y)
- || (Options.target_oos && is_mapped(x, y) && is_stash(x, y))));
+ || (Options.target_oos && is_terrain_seen(x, y)
+ && is_stash(x, y))));
}
static int next_los(int dir, int los, bool wrap)
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 06415f0a76..739482db13 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -542,6 +542,7 @@ enum char_set_type
CSET_ASCII, // flat 7-bit ASCII
CSET_IBM, // 8-bit ANSI/Code Page 437
CSET_DEC, // 8-bit DEC, 0xE0-0xFF shifted for line drawing chars
+ CSET_UNICODE, // Unicode.
NUM_CSET
};
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 635d853f6a..d0ffac011f 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -1132,13 +1132,18 @@ struct trap_struct
unsigned char type;
};
-struct map_colour
+struct map_cell
{
- short colour;
- short flags;
+ short object; // The object: monster, item, feature, or cloud.
+ unsigned short flags; // Flags describing the mappedness of this square.
+ unsigned short colour;
- operator short () const { return colour; }
- void clear() { colour = flags = 0; }
+ map_cell() : object(0), flags(0), colour(0) { }
+ void clear() { flags = object = colour = 0; }
+
+ unsigned glyph() const;
+ bool known() const;
+ bool seen() const;
};
struct crawl_environment
@@ -1154,8 +1159,7 @@ struct crawl_environment
FixedArray< int, GXM, GYM > igrid; // item grid
FixedArray< unsigned char, GXM, GYM > cgrid; // cloud grid
- FixedArray< unsigned short, GXM, GYM > map; // discovered terrain
- FixedArray< map_colour, GXM, GYM > map_col; // map colours
+ FixedArray< map_cell, GXM, GYM > map; // discovered terrain
FixedArray<unsigned, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER>
show; // view window char
@@ -1188,8 +1192,11 @@ struct game_state
int seen_hups; // Set to true if SIGHUP received.
+ bool unicode_ok; // Is unicode support available?
+
game_state() : need_save(false), saving_game(false),
- updating_scores(false), shopping(false), seen_hups(0)
+ updating_scores(false), shopping(false), seen_hups(0),
+ unicode_ok(false)
{
}
};
@@ -1352,8 +1359,8 @@ struct message_colour_mapping
struct feature_def
{
- unsigned short symbol; // symbol used for seen terrain
- unsigned short magic_symbol; // symbol used for magic-mapped terrain
+ unsigned symbol; // symbol used for seen terrain
+ unsigned magic_symbol; // symbol used for magic-mapped terrain
unsigned short colour; // normal in LoS colour
unsigned short map_colour; // colour when out of LoS on display
unsigned short seen_colour; // map_colour when is_terrain_seen()
@@ -1508,7 +1515,7 @@ public:
bool lowercase_invocations; // prefer lowercase invocations
char_set_type char_set;
- FixedVector<unsigned char, NUM_DCHAR_TYPES> char_table;
+ FixedVector<unsigned, NUM_DCHAR_TYPES> char_table;
int num_colours; // used for setting up curses colour table (8 or 16)
@@ -1689,7 +1696,7 @@ private:
void clear_cset_overrides();
void add_cset_override(char_set_type set, const std::string &overrides);
void add_cset_override(char_set_type set, dungeon_char_type dc,
- unsigned char symbol);
+ unsigned symbol);
void add_feature_override(const std::string &);
void add_message_colour_mappings(const std::string &);
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 2e4ec6c9d9..68dc9424b2 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -835,23 +835,14 @@ static void close_level_gates()
static void clear_env_map()
{
- for (int i = 0; i < GXM; i++)
- {
- for (int j = 0; j < GYM; j++)
- {
- env.map[i][j] = 0;
- env.map_col[i][j].clear();
- }
- }
+ env.map.init(map_cell());
}
static void clear_clouds()
{
for (int clouty = 0; clouty < MAX_CLOUDS; ++clouty)
delete_cloud( clouty );
- for (int i = 0; i < GXM; i++)
- for (int j = 0; j < GYM; j++)
- env.cgrid[i][j] = EMPTY_CLOUD;
+ env.cgrid.init(EMPTY_CLOUD);
}
static void grab_followers(std::vector<follower>& followers)
diff --git a/crawl-ref/source/format.cc b/crawl-ref/source/format.cc
index d8942e5d08..390133f3d5 100644
--- a/crawl-ref/source/format.cc
+++ b/crawl-ref/source/format.cc
@@ -236,7 +236,8 @@ int formatted_string::find_last_colour() const
void formatted_string::add_glyph(const item_def *item)
{
const int last_col = find_last_colour();
- unsigned short ch, col;
+ unsigned ch;
+ unsigned short col;
get_item_glyph(item, &ch, &col);
this->textcolor(col);
this->cprintf("%c", ch);
@@ -246,7 +247,8 @@ void formatted_string::add_glyph(const item_def *item)
void formatted_string::add_glyph(const monsters *mons)
{
const int last_col = find_last_colour();
- unsigned short ch, col;
+ unsigned ch;
+ unsigned short col;
get_mons_glyph(mons, &ch, &col);
this->textcolor(col);
this->cprintf("%c", ch);
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 30e9619699..05c437455f 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -555,8 +555,8 @@ void game_options::reset_options()
messaging = true;
#endif
- view_max_width = VIEW_EX;
- view_max_height = VIEW_EY;
+ view_max_width = VIEW_MIN_WIDTH;
+ view_max_height = VIEW_MIN_HEIGHT;
view_lock_x = true;
view_lock_y = true;
@@ -805,20 +805,29 @@ void game_options::clear_feature_overrides()
feature_overrides.clear();
}
-static unsigned short read_symbol(std::string s)
+static unsigned read_symbol(std::string s)
{
if (s.empty())
return (0);
+
if (s.length() == 1)
return s[0];
- if (s[0] == '\\')
+ if (s.length() > 1 && s[0] == '\\')
s = s.substr(1);
-
- int feat = atoi(s.c_str());
+
+ int base = 10;
+ if (s.length() > 1 && s[0] == 'x')
+ {
+ s = s.substr(1);
+ base = 16;
+ }
+
+ char *tail;
+ int feat = strtol(s.c_str(), &tail, base);
if (feat < 0)
feat = 0;
- return static_cast<unsigned short>(feat);
+ return static_cast<unsigned>(feat);
}
void game_options::add_feature_override(const std::string &text)
@@ -875,8 +884,8 @@ void game_options::add_cset_override(
if (dc == NUM_DCHAR_TYPES)
continue;
- unsigned char symbol =
- static_cast<unsigned char>(read_symbol(mapping[1]));
+ unsigned symbol =
+ static_cast<unsigned>(read_symbol(mapping[1]));
if (set == NUM_CSET)
for (int c = 0; c < NUM_CSET; ++c)
@@ -887,7 +896,7 @@ void game_options::add_cset_override(
}
void game_options::add_cset_override(char_set_type set, dungeon_char_type dc,
- unsigned char symbol)
+ unsigned symbol)
{
cset_override[set][dc] = symbol;
}
@@ -1483,7 +1492,9 @@ void game_options::read_option_line(const std::string &str, bool runscript)
char_set = CSET_IBM;
else if (field == "dec")
char_set = CSET_DEC;
- else
+ else if (field == "utf" || field == "unicode")
+ char_set = CSET_UNICODE;
+ else
{
fprintf( stderr, "Bad character set: %s\n", field.c_str() );
valid = false;
@@ -1640,6 +1651,8 @@ void game_options::read_option_line(const std::string &str, bool runscript)
cs = CSET_IBM;
else if (cset == "dec")
cs = CSET_DEC;
+ else if (cset == "utf" || cset == "unicode")
+ cs = CSET_UNICODE;
add_cset_override(cs, field);
}
@@ -1869,16 +1882,19 @@ void game_options::read_option_line(const std::string &str, bool runscript)
else if (key == "view_max_width")
{
view_max_width = atoi(field.c_str());
- if (view_max_width < VIEW_EX)
- view_max_width = VIEW_EX;
+ if (view_max_width < VIEW_MIN_WIDTH)
+ view_max_width = VIEW_MIN_WIDTH;
+
+ // Allow the view to be one larger than GXM because the view width
+ // needs to be odd, and GXM is even.
else if (view_max_width > GXM + 1)
view_max_width = GXM + 1;
}
else if (key == "view_max_height")
{
view_max_height = atoi(field.c_str());
- if (view_max_height < VIEW_EY)
- view_max_height = VIEW_EY;
+ if (view_max_height < VIEW_MIN_HEIGHT)
+ view_max_height = VIEW_MIN_HEIGHT;
else if (view_max_height > GYM + 1)
view_max_height = GYM + 1;
}
diff --git a/crawl-ref/source/libdos.h b/crawl-ref/source/libdos.h
index 1b8ae87e75..6e2d3f16a6 100644
--- a/crawl-ref/source/libdos.h
+++ b/crawl-ref/source/libdos.h
@@ -15,5 +15,13 @@ void clear_to_end_of_line();
void message_out(int mline, int colour, const char *str, int firstcol = 0,
bool newline = true);
void clear_message_window();
+inline void update_screen()
+{
+}
+
+inline void putwch(unsigned c)
+{
+ putch(static_cast<char>(c));
+}
#endif
diff --git a/crawl-ref/source/libunix.cc b/crawl-ref/source/libunix.cc
index b9d9342e92..b245ccdbab 100644
--- a/crawl-ref/source/libunix.cc
+++ b/crawl-ref/source/libunix.cc
@@ -47,6 +47,10 @@
#include "externs.h"
#include "files.h"
+#ifdef UNICODE_GLYPHS
+#include <locale.h>
+#endif
+
#include <termios.h>
static struct termios def_term;
@@ -64,11 +68,12 @@ static struct termios game_term;
#endif
// Character set variable
-int Character_Set = CHARACTER_SET;
+static int Character_Set = CHARACTER_SET;
// Globals holding current text/backg. colors
-short FG_COL = WHITE;
-short BG_COL = BLACK;
+static short FG_COL = WHITE;
+static short BG_COL = BLACK;
+static int Current_Colour = COLOR_PAIR(BG_COL * 8 + FG_COL);
static int curs_fg_attr(int col);
static int curs_bg_attr(int col);
@@ -180,6 +185,10 @@ static void termio_init()
#endif
tcsetattr(0, TCSAFLUSH, &game_term);
+
+#ifdef UNICODE_GLYPHS
+ crawl_state.unicode_ok = !!setlocale(LC_ALL, "");
+#endif
}
@@ -410,6 +419,18 @@ int putch(unsigned char chr)
return (addch(chr));
}
+int putwch(unsigned chr)
+{
+#ifdef UNICODE_GLYPHS
+ if (chr <= 127)
+ return (putch(chr));
+
+ wchar_t c = chr;
+ return (addnwstr(&c, 1));
+#else
+ return (putch(static_cast<unsigned char>(chr)));
+#endif
+}
char getche()
{
@@ -570,7 +591,7 @@ static int curs_fg_attr(int col)
void textcolor(int col)
{
- attrset( curs_fg_attr(col) );
+ attrset( Current_Colour = curs_fg_attr(col) );
}
static int curs_bg_attr(int col)
@@ -629,7 +650,7 @@ static int curs_bg_attr(int col)
void textbackground(int col)
{
- attrset( curs_bg_attr(col) );
+ attrset( Current_Colour = curs_bg_attr(col) );
}
@@ -638,28 +659,57 @@ int gotoxy(int x, int y)
return (move(y - 1, x - 1));
}
-static unsigned oldch, oldmangledch;
-static int faked_x = -1, faked_y;
-
-void fakecursorxy(int x, int y)
+#ifdef UNICODE_GLYPHS
+typedef cchar_t char_info;
+inline bool operator == (const cchar_t &a, const cchar_t &b)
{
- if (oldch && faked_x != -1
- && mvinch(faked_y, faked_x) == oldmangledch)
+ return (a.attr == b.attr && *a.chars == *b.chars);
+}
+inline char_info character_at(int y, int x)
+{
+ cchar_t c;
+ mvin_wch(y, x, &c);
+ return (c);
+}
+inline bool valid_char(const cchar_t &c)
+{
+ return *c.chars;
+}
+inline void write_char_at(int y, int x, const cchar_t &ch)
+{
+ move(y, x);
+ add_wchnstr(&ch, 1);
+}
+static void flip_colour(cchar_t &ch)
+{
+ const unsigned colour = (ch.attr & A_COLOR);
+ const int pair = PAIR_NUMBER(colour);
+
+ int fg = pair & 7;
+ int bg = (pair >> 3) & 7;
+
+ if (pair == 63)
{
- if (faked_x != x - 1 || faked_y != y - 1)
- mvaddch(faked_y, faked_x, oldch);
- else
- return;
+ fg = COLOR_WHITE;
+ bg = COLOR_BLACK;
}
-
- const unsigned c = mvinch(y - 1, x - 1);
- const int ch = c & A_CHARTEXT;
- const unsigned colour = c & A_COLOR;
- const int pair = PAIR_NUMBER(colour);
- faked_x = x - 1;
- faked_y = y - 1;
- oldch = c;
+ const int newpair = (fg * 8 + bg);
+ ch.attr = COLOR_PAIR(newpair);
+}
+#else // ! UNICODE_GLYPHS
+typedef unsigned char_info;
+#define character_at(y,x) mvinch(y,x)
+#define valid_char(x) (x)
+#define write_char_at(y,x,c) mvaddch(y, x, c)
+
+#define char_info_character(c) ((c) & A_CHARTEXT)
+#define char_info_colour(c) ((c) & A_COLOR)
+
+static void flip_colour(unsigned &ch)
+{
+ const unsigned colour = char_info_colour(ch);
+ const int pair = PAIR_NUMBER(colour);
int fg = pair & 7;
int bg = (pair >> 3) & 7;
@@ -671,9 +721,30 @@ void fakecursorxy(int x, int y)
}
const int newpair = (fg * 8 + bg);
-
- mvaddch( y - 1, x - 1, oldmangledch = ((ch & 127) | COLOR_PAIR(newpair)) );
+ ch = ((ch & 127) | COLOR_PAIR(newpair));
+}
+#endif
+
+static char_info oldch, oldmangledch;
+static int faked_x = -1, faked_y;
+void fakecursorxy(int x, int y)
+{
+ if (valid_char(oldch) && faked_x != -1
+ && character_at(faked_y, faked_x) == oldmangledch)
+ {
+ if (faked_x != x - 1 || faked_y != y - 1)
+ write_char_at(faked_y, faked_x, oldch);
+ else
+ return;
+ }
+
+ char_info c = character_at(y - 1, x - 1);
+ oldch = c;
+ faked_x = x - 1;
+ faked_y = y - 1;
+ flip_colour(c);
+ write_char_at( y - 1, x - 1, oldmangledch = c);
move(y - 1, x - 1);
}
diff --git a/crawl-ref/source/libunix.h b/crawl-ref/source/libunix.h
index 19cd2674e3..42d9ba9449 100644
--- a/crawl-ref/source/libunix.h
+++ b/crawl-ref/source/libunix.h
@@ -25,6 +25,7 @@ void fakecursorxy(int x, int y);
int itoa(int value, char *strptr, int radix);
int kbhit(void);
int putch(unsigned char chr);
+int putwch(unsigned chr);
int stricmp(const char *str1, const char *str2);
int translate_keypad(int keyin);
int wherex(void);
diff --git a/crawl-ref/source/libw32c.cc b/crawl-ref/source/libw32c.cc
index dd0822deee..055471351d 100644
--- a/crawl-ref/source/libw32c.cc
+++ b/crawl-ref/source/libw32c.cc
@@ -711,6 +711,11 @@ void putch(char c)
writeChar(c);
}
+void putwch(unsigned c)
+{
+ putch((char) c);
+}
+
// translate virtual keys
#define VKEY_MAPPINGS 10
@@ -961,6 +966,11 @@ int getConsoleString(char *buf, int maxlen)
return (int)nread;
}
+void update_screen()
+{
+ bFlush();
+}
+
bool setBuffering( bool value )
{
bool oldValue = buffering;
diff --git a/crawl-ref/source/libw32c.h b/crawl-ref/source/libw32c.h
index 9e01a44fd7..70c038c49e 100644
--- a/crawl-ref/source/libw32c.h
+++ b/crawl-ref/source/libw32c.h
@@ -37,6 +37,7 @@ void window(int x, int y, int lx, int ly);
int wherex(void);
int wherey(void);
void putch(char c);
+void putwch(unsigned c);
int getch(void);
int getch_ck(void);
int key_to_command(int);
@@ -44,6 +45,7 @@ int getche(void);
int kbhit(void);
void delay(int ms);
void textbackground(int c);
+void update_screen();
void enable_smart_cursor(bool cursor);
bool is_smart_cursor_enabled();
diff --git a/crawl-ref/source/makefile.unix b/crawl-ref/source/makefile.unix
index f67953792c..199bc302b3 100644
--- a/crawl-ref/source/makefile.unix
+++ b/crawl-ref/source/makefile.unix
@@ -17,8 +17,9 @@ DELETE = rm -f
COPY = cp
OS_TYPE = UNIX
-# Include path for curses or ncurses.
-INCLUDES = -I/usr/include/ncurses
+# Change this to y if you want to use Unicode glyphs in the map, and you have
+# libncursesw available.
+UNICODE_GLYPHS = n
# If you have lex and yacc, set DOYACC to y (lowercase y).
DOYACC := y
@@ -44,6 +45,17 @@ INSTALLDIR := /usr/games
LEX := flex
YACC := bison -y
+ifeq ($(UNICODE_GLYPHS),y)
+# Include path for (n)curses with Unicode support.
+INCLUDES = -I/usr/include/ncursesw
+LIBCURS = ncursesw
+EXTRA_FLAGS += -DUNICODE_GLYPHS
+else
+# Include path for curses or ncurses (non-Unicode).
+INCLUDES = -I/usr/include/ncurses
+LIBCURS = ncurses
+endif
+
ifeq ($(LUASRC),)
LUASRC := util/lua/src
endif
@@ -82,7 +94,7 @@ EXTRA_INCLUDES += -I$(SQLSRC)
EXTRA_DEPENDS += $(FSQLLIBA)
endif
-LIB = -lncurses -L$(LUASRC) -l$(LUALIB) $(LIBDBM)
+LIB = -l$(LIBCURS) -L$(LUASRC) -l$(LUALIB) $(LIBDBM)
INCLUDES := $(INCLUDES) -Iutil -I. -I$(LUASRC) $(EXTRA_INCLUDES)
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 175db38a74..258fefa122 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -299,7 +299,7 @@ bool move_player_to_grid( int x, int y, bool stepped, bool allow_shift,
const int type = trap_category( env.trap[id].type );
grd[you.x_pos][you.y_pos] = type;
- set_envmap_char(you.x_pos, you.y_pos, get_sightmap_char(type));
+ set_envmap_obj(you.x_pos, you.y_pos, type);
}
// not easy to blink onto a trap without setting it off:
@@ -2193,10 +2193,7 @@ void forget_map(unsigned char chance_forgotten)
for (ycount = 0; ycount < GYM; ycount++)
{
if (random2(100) < chance_forgotten)
- {
- env.map[xcount][ycount] = 0;
- env.map_col[xcount][ycount].clear();
- }
+ env.map[xcount][ycount].clear();
}
}
} // end forget_map()
diff --git a/crawl-ref/source/spells2.cc b/crawl-ref/source/spells2.cc
index abd620955c..6708c9b42b 100644
--- a/crawl-ref/source/spells2.cc
+++ b/crawl-ref/source/spells2.cc
@@ -76,7 +76,7 @@ unsigned char detect_traps( int pow )
traps_found++;
grd[ etx ][ ety ] = trap_category( env.trap[count_x].type );
- set_envmap_char(etx, ety, get_magicmap_char(grd[etx][ety]));
+ set_envmap_obj(etx, ety, grd[etx][ety]);
set_terrain_mapped(etx, ety);
}
}
@@ -104,7 +104,7 @@ unsigned char detect_items( int pow )
if (igrd[i][j] != NON_ITEM)
{
- set_envmap_char(i, j, get_magicmap_char(DNGN_ITEM_DETECTED));
+ set_envmap_obj(i, j, DNGN_ITEM_DETECTED);
set_envmap_detected_item(i, j);
}
}
@@ -159,7 +159,7 @@ static void mark_detected_creature(int gridx, int gridy, const monsters *mon,
}
}
- set_envmap_char(gridx, gridy, mons_char(mon->type));
+ set_envmap_obj(gridx, gridy, mon->type + DNGN_START_OF_MONSTERS);
set_envmap_detected_mons(gridx, gridy);
}
diff --git a/crawl-ref/source/stuff.cc b/crawl-ref/source/stuff.cc
index e948dbbcdd..baf3058dfc 100644
--- a/crawl-ref/source/stuff.cc
+++ b/crawl-ref/source/stuff.cc
@@ -333,10 +333,15 @@ void cio_init()
#ifdef DOS
init_libdos();
#endif
-
- crawl_view.init_geometry();
io_inited = true;
+
+ crawl_view.init_geometry();
+
+ if (Options.char_set == CSET_UNICODE && !crawl_state.unicode_ok)
+ end(1, false,
+ "Unicode glyphs are not available, please change your "
+ "char_set option");
}
void cio_cleanup()
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index bbfc298549..e492b338aa 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -1301,9 +1301,9 @@ static void tag_construct_level(struct tagHeader &th)
for (count_y = 0; count_y < GYM; count_y++)
{
marshallByte(th, grd[count_x][count_y]);
- marshallShort(th, env.map[count_x][count_y]);
- marshallShort(th, env.map_col[count_x][count_y].colour);
- marshallShort(th, env.map_col[count_x][count_y].flags);
+ marshallShort(th, env.map[count_x][count_y].object);
+ marshallShort(th, env.map[count_x][count_y].colour);
+ marshallShort(th, env.map[count_x][count_y].flags);
marshallByte(th, env.cgrid[count_x][count_y]);
}
}
@@ -1522,13 +1522,9 @@ static void tag_read_level( struct tagHeader &th, char minorVersion )
{
grd[i][j] = unmarshallByte(th);
- env.map[i][j] = (unsigned short) unmarshallShort(th);
-
- if ((env.map[i][j] & 0xFF) == 201) // what is this??
- env.map[i][j] = (env.map[i][j] & 0xFF00U) | 239;
-
- env.map_col[i][j].colour = unmarshallShort(th);
- env.map_col[i][j].flags = unmarshallShort(th);
+ env.map[i][j].object = unmarshallShort(th);
+ env.map[i][j].colour = unmarshallShort(th);
+ env.map[i][j].flags = unmarshallShort(th);
mgrd[i][j] = NON_MONSTER;
env.cgrid[i][j] = (unsigned char) unmarshallByte(th);
diff --git a/crawl-ref/source/travel.cc b/crawl-ref/source/travel.cc
index 0bc14a2134..6e6f817208 100644
--- a/crawl-ref/source/travel.cc
+++ b/crawl-ref/source/travel.cc
@@ -92,7 +92,7 @@ static unsigned char curr_waypoints[GXM][GYM];
static signed char curr_traps[GXM][GYM];
#endif
-static FixedArray< unsigned short, GXM, GYM > mapshadow;
+static FixedArray< map_cell, GXM, GYM > mapshadow;
const signed char TRAVERSABLE = 1;
const signed char IMPASSABLE = 0;
@@ -109,26 +109,9 @@ static void populate_stair_distances(const level_pos &target);
static bool is_greed_inducing_square(const LevelStashes *ls,
const coord_def &c);
-bool is_player_mapped(int grid_x, int grid_y)
+bool is_player_seen(int grid_x, int grid_y)
{
- return (is_player_mapped( env.map[grid_x - 1][grid_y - 1] ));
-}
-
-// Determines whether the player has seen this square, given the user-visible
-// character.
-//
-// The player is assumed to have seen the square if:
-// a. The square is mapped (the env map char is not zero)
-// b. The square was *not* magic-mapped.
-//
-// FIXME: There's better ways of doing this with the new view.cc.
-bool is_player_mapped(unsigned char envch)
-{
- // Note that we're relying here on mapch(DNGN_FLOOR) != mapch2(DNGN_FLOOR)
- // and that no *other* dungeon feature renders as mapch(DNGN_FLOOR).
- // The check for a ~ is to ensure explore stops for items turned up by
- // detect items.
- return envch && envch != get_magicmap_char(DNGN_FLOOR) && envch != '~';
+ return (is_terrain_seen(grid_x, grid_y));
}
// Returns true if there is a known trap at (x,y). Returns false for non-trap
@@ -169,14 +152,6 @@ inline bool is_player_altar(const coord_def &c)
return is_player_altar(grd[c.x][c.y]);
}
-// Copies FixedArray src to FixedArray dest.
-//
-inline void copy(const FixedArray<unsigned short, GXM, GYM> &src,
- FixedArray<unsigned short, GXM, GYM> &dest)
-{
- dest = src;
-}
-
#ifdef CLUA_BINDINGS
static void init_traps()
{
@@ -297,8 +272,11 @@ void toggle_exclude(int x, int y)
if (you.level_type == LEVEL_LABYRINTH || you.level_type == LEVEL_ABYSS)
return;
- if (x <= 0 || x >= GXM || y <= 0 || y >= GYM) return;
- if (!env.map[x - 1][y - 1]) return;
+ if (!in_bounds(x, y))
+ return;
+
+ if (!is_terrain_known(x, y))
+ return;
if (is_exclude_root(x, y))
{
@@ -374,10 +352,9 @@ bool is_travelsafe_square(int x, int y, bool ignore_hostile,
if ((grid == DNGN_OPEN_DOOR || grid == DNGN_CLOSED_DOOR)
&& is_terrain_changed(x, y))
{
- const int c = get_envmap_char(x, y);
+ const int c = get_envmap_obj(x, y);
const int secret_door = grid_secret_door_appearance(x, y);
- return (c != get_sightmap_char(secret_door)
- && c != get_magicmap_char(secret_door));
+ return (c != secret_door);
}
if (!ignore_hostile && is_monster_blocked(x, y))
@@ -686,7 +663,7 @@ bool prompt_stop_explore(int es_why)
inline static void check_interesting_square(int x, int y,
explore_discoveries &ed)
{
- const coord_def pos(x + 1, y + 1);
+ const coord_def pos(x, y);
if (ES_item)
{
@@ -760,7 +737,7 @@ static bool is_valid_explore_target(int x, int y)
const int ax = x + xi, ay = y + yi;
if (!in_bounds(ax, ay))
continue;
- if (!is_player_mapped( get_envmap_char(ax, ay) ))
+ if (!is_terrain_seen(ax, ay))
return (true);
}
}
@@ -883,12 +860,11 @@ command_type travel()
// feature, stop exploring.
explore_discoveries discoveries;
- for (int y = 0; y < GYM - 1; ++y)
+ for (int y = 0; y < GYM; ++y)
{
- for (int x = 0; x < GXM - 1; ++x)
+ for (int x = 0; x < GXM; ++x)
{
- if (!is_player_mapped(mapshadow[x][y])
- && is_player_mapped((unsigned char) env.map[x][y]))
+ if (!mapshadow[x][y].seen() && is_terrain_seen(x, y))
{
check_interesting_square(x, y, discoveries);
}
@@ -898,7 +874,7 @@ command_type travel()
if (discoveries.prompt_stop())
stop_running();
- copy(env.map, mapshadow);
+ mapshadow = env.map;
}
if (you.running.is_explore())
@@ -2546,7 +2522,7 @@ void start_explore(bool grab_items)
}
// Clone shadow array off map
- copy(env.map, mapshadow);
+ mapshadow = env.map;
you.running.x = you.running.y = 0;
start_running();
@@ -2903,23 +2879,22 @@ int LevelInfo::distance_between(const stair_info *s1, const stair_info *s2)
void LevelInfo::get_stairs(std::vector<coord_def> &st)
{
- // These are env map coords, not grid coordinates.
- for (int y = 0; y < GYM - 1; ++y)
+ for (int y = 0; y < GYM; ++y)
{
- for (int x = 0; x < GXM - 1; ++x)
+ for (int x = 0; x < GXM; ++x)
{
- int grid = grd[x + 1][y + 1];
- int envc = env.map[x][y];
+ int grid = grd[x][y];
+ int envc = env.map[x][y].object;
- if ((x + 1 == you.x_pos && y + 1 == you.y_pos)
+ if ((x == you.x_pos && y == you.y_pos)
|| (envc
&& is_travelable_stair(grid)
- && (is_terrain_seen(x + 1, y + 1)
- || !is_branch_stair(x + 1, y + 1))))
+ && (is_terrain_seen(x, y)
+ || !is_branch_stair(x, y))))
{
// Convert to grid coords, because that's what we use
// everywhere else.
- const coord_def stair(x + 1, y + 1);
+ const coord_def stair(x, y);
st.push_back(stair);
}
}
diff --git a/crawl-ref/source/travel.h b/crawl-ref/source/travel.h
index ecda8e5a12..d6fb9c62f1 100644
--- a/crawl-ref/source/travel.h
+++ b/crawl-ref/source/travel.h
@@ -32,13 +32,10 @@ void update_excludes();
bool is_stair(unsigned gridc);
bool is_travelable_stair(unsigned gridc);
command_type stair_direction(int stair_feat);
-bool is_player_mapped(unsigned char envch);
command_type direction_to_command( char x, char y );
bool is_resting( void );
bool can_travel_interlevel();
-bool is_player_mapped(int grid_x, int grid_y);
-
void find_travel_pos(int you_x, int you_y, char *move_x, char *move_y,
std::vector<coord_def>* coords = NULL);
diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc
index 4c6310ae92..798c3c10c1 100644
--- a/crawl-ref/source/tutorial.cc
+++ b/crawl-ref/source/tutorial.cc
@@ -802,7 +802,8 @@ void tutorial_first_monster(const monsters& mon)
if (!Options.tutorial_events[TUT_SEEN_MONSTER])
return;
- unsigned short ch, col;
+ unsigned ch;
+ unsigned short col;
get_mons_glyph(&mon, &ch, &col);
std::string text = "<magenta>That ";
@@ -849,10 +850,14 @@ void tutorial_first_monster(const monsters& mon)
void tutorial_first_item(const item_def& item)
{
- if (!Options.tutorial_events[TUT_SEEN_FIRST_OBJECT] || Options.tut_just_triggered)
+ if (!Options.tutorial_events[TUT_SEEN_FIRST_OBJECT]
+ || Options.tut_just_triggered)
+ {
return;
+ }
- unsigned short ch, col;
+ unsigned ch;
+ unsigned short col;
get_item_glyph(&item, &ch, &col);
std::string text = "<magenta>That ";
@@ -882,7 +887,8 @@ void learned_something_new(tutorial_event_type seen_what, int x, int y)
return;
std::ostringstream text;
- unsigned short ch, colour;
+ unsigned ch;
+ unsigned short colour;
const int ex = x - you.x_pos + 9;
const int ey = y - you.y_pos + 9;
int object;
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 13679f290a..b65d2c8ede 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -61,164 +61,170 @@
// These are hidden from the rest of the world... use the functions
// below to get information about the map grid.
-#define MAP_MAGIC_MAPPED_FLAG 0x0100
-#define MAP_SEEN_FLAG 0x0200
-#define MAP_CHANGED_FLAG 0x0400
-#define MAP_DETECTED_MONSTER 0x0800
-#define MAP_DETECTED_ITEM 0x1000
-#define MAP_GRID_KNOWN 0xFF00
+#define MAP_MAGIC_MAPPED_FLAG 0x01
+#define MAP_SEEN_FLAG 0x02
+#define MAP_CHANGED_FLAG 0x04
+#define MAP_DETECTED_MONSTER 0x08
+#define MAP_DETECTED_ITEM 0x10
+#define MAP_GRID_KNOWN 0xFF
-#define MAP_CHARACTER_MASK 0x00ff
-
-// Flags that define what the player remembers on this square.
-#define MC_ITEM 0x01
-#define MC_MONS 0x02
+#define MC_ITEM 0x01
+#define MC_MONS 0x02
static FixedVector<feature_def, NUM_FEATURES> Feature;
+#ifdef UNICODE_GLYPHS
+typedef unsigned int screen_buffer_t;
+#else
typedef unsigned short screen_buffer_t;
+#endif
crawl_view_geometry crawl_view;
-FixedArray < unsigned int, 20, 19 > Show_Backup;
+FixedArray < unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER > Show_Backup;
unsigned char show_green;
extern int stealth; // 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 );
+ bool travel_colour = false );
void cloud_grid(void);
void monster_grid(bool do_updates);
+static void get_symbol( int x, int y,
+ int object, unsigned *ch,
+ unsigned short *colour,
+ bool magic_mapped = false );
+static unsigned get_symbol(int object, unsigned short *colour = NULL,
+ bool magic_mapped = false);
+
static int get_item_dngn_code(const item_def &item);
static void set_show_backup( int ex, int ey );
static int get_viewobj_flags(int viewobj);
-unsigned get_envmap_char(int x, int y)
+unsigned map_cell::glyph() const
{
- return static_cast<unsigned char>(
- env.map[x - 1][y - 1] & MAP_CHARACTER_MASK);
+ if (!object)
+ return (' ');
+ return get_symbol(object, NULL, !(flags & MAP_SEEN_FLAG));
}
-void set_envmap_detected_item(int x, int y, bool detected)
+bool map_cell::known() const
{
- if (detected)
- env.map[x - 1][y - 1] |= MAP_DETECTED_ITEM;
- else
- env.map[x - 1][y - 1] &= ~MAP_DETECTED_ITEM;
+ return (object && (flags & (MAP_SEEN_FLAG | MAP_MAGIC_MAPPED_FLAG)));
}
-bool is_envmap_detected_item(int x, int y)
+bool map_cell::seen() const
{
- return (env.map[x - 1][y - 1] & MAP_DETECTED_ITEM);
+ return (object && (flags & MAP_SEEN_FLAG));
}
-void set_envmap_detected_mons(int x, int y, bool detected)
+inline unsigned get_envmap_char(int x, int y)
{
- if (detected)
- env.map[x - 1][y - 1] |= MAP_DETECTED_MONSTER;
- else
- env.map[x - 1][y - 1] &= ~MAP_DETECTED_MONSTER;
+ return env.map[x][y].glyph();
}
-bool is_envmap_detected_mons(int x, int y)
+int get_envmap_obj(int x, int y)
{
- return (env.map[x - 1][y - 1] & MAP_DETECTED_MONSTER);
+ return (env.map[x][y].object);
}
-void set_envmap_glyph(int x, int y, int chr, int col, int object)
+void set_envmap_detected_item(int x, int y, bool detected)
{
- set_envmap_char(x, y, chr);
- set_envmap_col(x, y, col, get_viewobj_flags(object));
+ if (detected)
+ env.map[x][y].flags |= MAP_DETECTED_ITEM;
+ else
+ env.map[x][y].flags &= ~MAP_DETECTED_ITEM;
}
-void set_envmap_char( int x, int y, unsigned char chr )
+bool is_envmap_detected_item(int x, int y)
{
- env.map[x - 1][y - 1] &= (~MAP_CHARACTER_MASK); // clear old first
- env.map[x - 1][y - 1] |= chr;
+ return (env.map[x][y].flags & MAP_DETECTED_ITEM);
}
-void set_envmap_col( int x, int y, int colour )
+void set_envmap_detected_mons(int x, int y, bool detected)
{
- env.map_col[x - 1][y - 1].colour = colour;
- env.map_col[x - 1][y - 1].flags = 0;
+ if (detected)
+ env.map[x][y].flags |= MAP_DETECTED_MONSTER;
+ else
+ env.map[x][y].flags &= ~MAP_DETECTED_MONSTER;
}
-void set_envmap_col( int x, int y, int colour, int flags )
+bool is_envmap_detected_mons(int x, int y)
{
- env.map_col[x - 1][y - 1].colour = colour;
- env.map_col[x - 1][y - 1].flags = flags;
+ return (env.map[x][y].flags & MAP_DETECTED_MONSTER);
}
-inline void set_envmap_item(int x, int y, bool isitem)
+void set_envmap_glyph(int x, int y, int object, int col)
{
- if (isitem)
- env.map_col[x - 1][y - 1].flags |= MC_ITEM;
- else
- env.map_col[x - 1][y - 1].flags &= ~MC_ITEM;
+ map_cell &c = env.map[x][y];
+ c.object = object;
+ c.colour = col;
}
-inline void set_envmap_mons(int x, int y, bool ismons)
+void set_envmap_obj( int x, int y, int obj )
{
- if (ismons)
- env.map_col[x - 1][y - 1].flags |= MC_MONS;
- else
- env.map_col[x - 1][y - 1].flags &= ~MC_MONS;
+ env.map[x][y].object = obj;
+}
+
+void set_envmap_col( int x, int y, int colour )
+{
+ env.map[x][y].colour = colour;
}
bool is_envmap_item(int x, int y)
{
- return (env.map_col[x - 1][y - 1].flags & MC_ITEM);
+ return (get_viewobj_flags(env.map[x][y].object) & MC_ITEM);
}
bool is_envmap_mons(int x, int y)
{
- return (env.map_col[x - 1][y - 1].flags & MC_MONS);
+ return (get_viewobj_flags(env.map[x][y].object) & MC_MONS);
}
int get_envmap_col(int x, int y)
{
- return (env.map_col[x - 1][y - 1].colour);
+ return (env.map[x][y].colour);
}
bool is_terrain_known( int x, int y )
{
- return (env.map[x - 1][y - 1] & (MAP_MAGIC_MAPPED_FLAG | MAP_SEEN_FLAG));
+ return (env.map[x][y].flags
+ & (MAP_MAGIC_MAPPED_FLAG | MAP_SEEN_FLAG));
}
bool is_terrain_seen( int x, int y )
{
- return (env.map[x - 1][y - 1] & MAP_SEEN_FLAG);
+ return (env.map[x][y].flags & MAP_SEEN_FLAG);
}
bool is_terrain_changed( int x, int y )
{
- return (env.map[x - 1][y - 1] & MAP_CHANGED_FLAG);
+ return (env.map[x][y].flags & MAP_CHANGED_FLAG);
}
// used to mark dug out areas, unset when terrain is seen or mapped again.
void set_terrain_changed( int x, int y )
{
- env.map[x - 1][y - 1] |= MAP_CHANGED_FLAG;
+ env.map[x][y].flags |= MAP_CHANGED_FLAG;
}
void set_terrain_mapped( int x, int y )
{
- env.map[x - 1][y - 1] &= (~MAP_CHANGED_FLAG);
- env.map[x - 1][y - 1] |= MAP_MAGIC_MAPPED_FLAG;
+ env.map[x][y].flags &= (~MAP_CHANGED_FLAG);
+ env.map[x][y].flags |= MAP_MAGIC_MAPPED_FLAG;
}
void set_terrain_seen( int x, int y )
{
- env.map[x - 1][y - 1] &= (~MAP_CHANGED_FLAG);
- env.map[x - 1][y - 1] |= MAP_SEEN_FLAG;
+ env.map[x][y].flags &= (~MAP_CHANGED_FLAG);
+ env.map[x][y].flags |= MAP_SEEN_FLAG;
}
void clear_envmap_grid( int x, int y )
{
- env.map[x - 1][y - 1] = 0;
- env.map_col[x - 1][y - 1].clear();
+ env.map[x][y].clear();
}
#if defined(WIN32CONSOLE) || defined(DOS)
@@ -284,24 +290,36 @@ static int get_viewobj_flags(int object)
return (0);
}
+static unsigned get_symbol(int object, unsigned short *colour,
+ bool magic_mapped)
+{
+ unsigned ch;
+ get_symbol(0, 0, object, &ch, NULL, magic_mapped);
+ return (ch);
+}
+
static void get_symbol( int x, int y,
- unsigned int object, unsigned short *ch,
- unsigned short *colour )
+ int object, unsigned *ch,
+ unsigned short *colour,
+ bool magic_mapped )
{
ASSERT( ch != NULL );
- ASSERT( colour != NULL );
if (object < NUM_FEATURES)
{
*ch = Feature[object].symbol;
- const int colmask = *colour & COLFLAG_MASK;
- // Don't clobber with BLACK, because the colour should be already set.
- if (Feature[object].colour != BLACK)
- *colour = Feature[object].colour | colmask;
+ if (colour)
+ {
+ const int colmask = *colour & COLFLAG_MASK;
+ // Don't clobber with BLACK, because the colour should be
+ // already set.
+ if (Feature[object].colour != BLACK)
+ *colour = Feature[object].colour | colmask;
+ }
// Note anything we see that's notable
- if (Feature[object].notable)
+ if ((x || y) && Feature[object].notable)
seen_notable_thing( object, x, y );
}
else
@@ -310,10 +328,11 @@ static void get_symbol( int x, int y,
*ch = mons_char( object - DNGN_START_OF_MONSTERS );
}
- *colour = real_colour(*colour);
+ if (colour)
+ *colour = real_colour(*colour);
}
-void get_item_symbol(unsigned int object, unsigned short *ch,
+void get_item_symbol(unsigned int object, unsigned *ch,
unsigned short *colour)
{
if (object < NUM_FEATURES)
@@ -328,7 +347,7 @@ void get_item_symbol(unsigned int object, unsigned short *ch,
}
-unsigned char get_sightmap_char( int feature )
+unsigned get_sightmap_char( int feature )
{
if (feature < NUM_FEATURES)
return (Feature[feature].symbol);
@@ -336,7 +355,7 @@ unsigned char get_sightmap_char( int feature )
return (0);
}
-unsigned char get_magicmap_char( int feature )
+unsigned get_magicmap_char( int feature )
{
if (feature < NUM_FEATURES)
return (Feature[feature].magic_symbol);
@@ -346,10 +365,10 @@ unsigned char get_magicmap_char( int feature )
static char get_travel_colour( int x, int y )
{
- if (is_waypoint(x + 1, y + 1))
+ if (is_waypoint(x, y))
return LIGHTGREEN;
- short dist = travel_point_distance[x + 1][y + 1];
+ short dist = travel_point_distance[x][y];
return dist > 0? Options.tc_reachable :
dist == PD_EXCLUDED? Options.tc_excluded :
dist == PD_EXCLUDED_RADIUS? Options.tc_exclude_circle :
@@ -439,12 +458,11 @@ unsigned short dos_brand( unsigned short colour,
screen_buffer_t colour_code_map( int x, int y, bool item_colour,
bool travel_colour )
{
- const unsigned short map_flags = env.map[x][y];
+ const unsigned short map_flags = env.map[x][y].flags;
if (!(map_flags & MAP_GRID_KNOWN))
return (BLACK);
- // XXX: Yes, the map array and the grid array are off by one. -- bwr
- const int grid_value = grd[x + 1][y + 1];
+ const int grid_value = grd[x][y];
unsigned tc = travel_colour?
get_travel_colour(x, y)
@@ -464,19 +482,19 @@ screen_buffer_t colour_code_map( int x, int y, bool item_colour,
if (tc == LIGHTGREEN || tc == LIGHTMAGENTA)
return real_colour(tc);
- if (item_colour && is_envmap_item(x + 1, y + 1))
- return get_envmap_col(x + 1, y + 1);
+ if (item_colour && is_envmap_item(x, y))
+ return get_envmap_col(x, y);
int feature_colour = DARKGREY;
feature_colour =
- is_terrain_seen(x + 1, y + 1)? Feature[grid_value].seen_colour
+ is_terrain_seen(x, y)? Feature[grid_value].seen_colour
: Feature[grid_value].map_colour;
if (feature_colour != DARKGREY)
tc = feature_colour;
if (Options.stair_item_brand
- && is_stair(grid_value) && igrd[x + 1][y + 1] != NON_ITEM)
+ && is_stair(grid_value) && igrd[x][y] != NON_ITEM)
{
tc |= COLFLAG_STAIR_ITEM;
}
@@ -497,7 +515,7 @@ void clear_map(bool clear_detected_items, bool clear_detected_monsters)
if (is_terrain_changed(x, y))
continue;
- unsigned short envc = get_envmap_char(x, y);
+ unsigned envc = get_envmap_char(x, y);
if (!envc)
continue;
@@ -510,11 +528,9 @@ void clear_map(bool clear_detected_items, bool clear_detected_monsters)
if (!clear_detected_monsters && is_envmap_detected_mons(x, y))
continue;
- set_envmap_char(x, y,
- is_terrain_seen(x, y)? get_sightmap_char(grd[x][y]) :
- is_terrain_known(x, y)? get_magicmap_char(grd[x][y]) :
- 0);
+ set_envmap_obj(x, y, is_terrain_known(x, y)? grd[x][y] : 0);
set_envmap_detected_mons(x, y, false);
+ set_envmap_detected_item(x, y, false);
}
}
}
@@ -875,14 +891,14 @@ void item_grid()
}
} // end item()
-void get_item_glyph( const item_def *item, unsigned short *glych,
+void get_item_glyph( const item_def *item, unsigned *glych,
unsigned short *glycol )
{
*glycol = item->colour;
get_symbol( 0, 0, get_item_dngn_code( *item ), glych, glycol );
}
-void get_mons_glyph( const monsters *mons, unsigned short *glych,
+void get_mons_glyph( const monsters *mons, unsigned *glych,
unsigned short *glycol )
{
*glycol = get_mons_colour( mons );
@@ -2009,8 +2025,7 @@ void draw_border(void)
// 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)
+ if (!env.map[x][y].object)
return false;
// 'grid' can fit in an unsigned char, but making this a short shuts up
@@ -2128,7 +2143,7 @@ bool is_feature(int feature, int x, int y)
return false;
}
default:
- return envfeat == feature;
+ return get_envmap_char(x, y) == (unsigned) feature;
}
}
@@ -2162,9 +2177,9 @@ static int find_feature(unsigned char feature, int curs_x, int curs_y,
}
int x = cx + dx, y = cy + dy;
- if (x < 0 || y < 0 || x >= GXM || y >= GYM)
+ if (!in_bounds(x, y))
continue;
- if (is_feature(feature, x + 1, y + 1))
+ if (is_feature(feature, x, y + 1))
{
++matchcount;
if (!ignore_count--)
@@ -2255,7 +2270,7 @@ static int find_feature( const std::vector<coord_def>& features,
//
static int cset_adjust(int raw)
{
- if (Options.char_set != CSET_ASCII)
+ if (Options.char_set != CSET_ASCII && Options.char_set != CSET_UNICODE)
{
// switch to alternate char set for 8-bit characters:
set_altcharset( raw > 127 );
@@ -2317,65 +2332,63 @@ static void draw_level_map(int start_x, int start_y, bool travel_mode)
coord_def c(start_x + screen_x, start_y + screen_y);
- if (!in_bounds(c + coord_def(1, 1)))
+ if (!in_bounds(c))
{
buffer2[bufcount2 + 1] = DARKGREY;
buffer2[bufcount2] = 0;
- bufcount2 += 2;
-
- goto print_it;
}
+ else
+ {
+ colour = colour_code_map(c.x, c.y,
+ Options.item_colour,
+ travel_mode && Options.travel_colour);
- colour = colour_code_map(c.x, c.y,
- Options.item_colour,
- travel_mode && Options.travel_colour);
-
- buffer2[bufcount2 + 1] = colour;
- buffer2[bufcount2] = (unsigned char) env.map(c);
+ buffer2[bufcount2 + 1] = colour;
+ buffer2[bufcount2] = env.map(c).glyph();
- if (c.x + 1 == you.x_pos && c.y + 1 == you.y_pos)
- {
- // [dshaligram] Draw the @ symbol on the level-map. It's no
- // longer saved into the env.map, so we need to draw it
- // directly.
- buffer2[bufcount2 + 1] = WHITE;
- buffer2[bufcount2] = you.symbol;
- }
+ if (c == you.pos())
+ {
+ // [dshaligram] Draw the @ symbol on the level-map. It's no
+ // longer saved into the env.map, so we need to draw it
+ // directly.
+ buffer2[bufcount2 + 1] = WHITE;
+ buffer2[bufcount2] = you.symbol;
+ }
- // 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];
- const coord_def gridc = c + coord_def(1, 1);
-
- unsigned char ch = is_waypoint(gridc.x, gridc.y);
- if (ch && (bc == get_sightmap_char(DNGN_FLOOR) ||
- bc == get_magicmap_char(DNGN_FLOOR)))
- bc = ch;
+ // 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];
+ unsigned char ch = is_waypoint(c.x, c.y);
+ if (ch && (bc == get_sightmap_char(DNGN_FLOOR) ||
+ bc == get_magicmap_char(DNGN_FLOOR)))
+ bc = ch;
+ }
}
bufcount2 += 2;
- print_it:
// newline
if (screen_x == 0 && screen_y > 0)
gotoxy( 1, screen_y + top );
- int ch = buffer2[bufcount2 - 2];
+ unsigned ch = buffer2[bufcount2 - 2];
#ifdef USE_CURSES
ch = cset_adjust( ch );
#endif
textcolor( buffer2[bufcount2 - 1] );
- putch(ch);
+ putwch(ch);
}
}
#ifdef USE_CURSES
set_altcharset(false);
#endif
+
+ update_screen();
}
// show_map() now centers the known map along x or y. This prevents
@@ -2414,7 +2427,7 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
{
for (i = 0; i < GXM; i++)
{
- if (env.map[i][j])
+ if (env.map[i][j].known())
{
if (!found_y)
{
@@ -2456,8 +2469,8 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
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 curs_x = you.x_pos - start_x + 1;
+ int curs_y = you.y_pos - screen_y + half_screen + 1;
int search_feat = 0, search_found = 0, anchor_x = -1, anchor_y = -1;
bool map_alive = true;
@@ -2476,7 +2489,8 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
redraw_map = true;
cursorxy(curs_x, curs_y + top - 1);
- getty = unmangle_direction_keys(getchm(KC_LEVELMAP), KC_LEVELMAP);
+ getty = unmangle_direction_keys(getchm(KC_LEVELMAP), KC_LEVELMAP,
+ false, false);
switch (getty)
{
@@ -2614,6 +2628,12 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
move_y = -20;
move_x = 0;
break;
+ case '!':
+ mprf("Terrain seen: %s",
+ is_terrain_seen(start_x + curs_x - 1,
+ start_y + curs_y - 1)? "yes" : "no");
+ more();
+ break;
case '<':
case '>':
case '@':
@@ -2667,7 +2687,7 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
case ',':
case ';':
{
- int x = start_x + curs_x, y = start_y + curs_y;
+ int x = start_x + curs_x - 1, y = start_y + curs_y - 1;
if (travel_mode && x == you.x_pos && y == you.y_pos)
{
if (you.travel_x > 0 && you.travel_y > 0)
@@ -2700,7 +2720,7 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
if (!map_alive)
break;
- if (curs_x + move_x < 1 || curs_x + move_x > 80)
+ if (curs_x + move_x < 1 || curs_x + move_x > crawl_view.termsz.x)
move_x = 0;
curs_x += move_x;
@@ -2826,15 +2846,8 @@ void magic_mapping(int map_radius, int proportion)
if (empty_count > 0)
{
- if (!get_envmap_char(i, j))
- {
- set_envmap_char(i, j, get_magicmap_char(grd[i][j]));
-
-#ifdef WIZARD
- if (map_radius == 1000 && you.wizard)
- set_envmap_char(i, j, get_sightmap_char(grd[i][j]));
-#endif
- }
+ if (!get_envmap_obj(i, j))
+ set_envmap_obj(i, j, grd[i][j]);
// Hack to give demonspawn Pandemonium mutation the ability
// to detect exits magically.
@@ -2909,7 +2922,7 @@ bool see_grid( int grx, int gry )
return (false);
} // end see_grid()
-static const unsigned char table[ NUM_CSET ][ NUM_DCHAR_TYPES ] =
+static const unsigned table[ NUM_CSET ][ NUM_DCHAR_TYPES ] =
{
// CSET_ASCII
{
@@ -2934,6 +2947,14 @@ static const unsigned char table[ NUM_CSET ][ NUM_DCHAR_TYPES ] =
'0', ')', '[', '/', '%', '?', '=', '!', '(', // orb, missile
'+', '\\', '}', '%', '$', '"', '#', // book, cloud
},
+
+ // CSET_UNICODE
+ {
+ 0x2592, 0x2591, 0xB7, 0x25E6, '\'', 0x25FC, '^', '>', '<',
+ '_', 0x22C2, 0x2320, 0x2248, '8', '~', '~',
+ '0', ')', '[', '/', '%', '?', '=', '!', '(',
+ '+', '|', '}', '%', '$', '"', '#',
+ },
};
dungeon_char_type dchar_by_name(const std::string &name)
@@ -3530,7 +3551,7 @@ int get_screen_glyph( int x, int y )
int object = env.show[ex][ey];
unsigned short colour = env.show_col[ex][ey];
- unsigned short ch;
+ unsigned ch;
if (!object)
return get_envmap_char(x, y);
@@ -3552,7 +3573,7 @@ std::string screenshot( bool fullscreen )
// [ds] Screenshots need to be straight ASCII. We will now proceed to force
// the char and feature tables back to ASCII.
- FixedVector<unsigned char, NUM_DCHAR_TYPES> char_table_bk;
+ FixedVector<unsigned, NUM_DCHAR_TYPES> char_table_bk;
char_table_bk = Options.char_table;
init_char_table(CSET_ASCII);
@@ -3582,7 +3603,8 @@ std::string screenshot( bool fullscreen )
{
// [ds] Evil hack time again. Peek at grid, use that character.
int object = grd(gc);
- unsigned short glych, glycol = 0;
+ unsigned glych;
+ unsigned short glycol = 0;
if (object == DNGN_SECRET_DOOR)
object = grid_secret_door_appearance( gc.x, gc.y );
@@ -3667,9 +3689,9 @@ void viewwindow(bool draw_it, bool do_updates)
losight( env.show, grd, you.x_pos, you.y_pos ); // must be done first
- for (count_x = 0; count_x < 18; count_x++)
+ for (count_x = 0; count_x < ENV_SHOW_DIAMETER; count_x++)
{
- for (count_y = 0; count_y < 18; count_y++)
+ for (count_y = 0; count_y < ENV_SHOW_DIAMETER; count_y++)
{
env.show_col[count_x][count_y] = LIGHTGREY;
Show_Backup[count_x][count_y] = 0;
@@ -3691,70 +3713,65 @@ void viewwindow(bool draw_it, bool do_updates)
if (flash_colour == BLACK)
flash_colour = viewmap_flash_colour();
- for (count_y = 1; count_y <= crawl_view.viewsz.y; count_y++)
+ for (count_y = crawl_view.viewp.y; count_y <= crawl_view.viewsz.y;
+ count_y++)
{
- for (count_x = 1; count_x <= crawl_view.viewsz.x; count_x++)
+ for (count_x = crawl_view.viewp.x; count_x <= crawl_view.viewsz.x;
+ count_x++)
{
// in grid coords
- const int gx = view2gridX(count_x);
- const int gy = view2gridY(count_y);
+ const coord_def gc(view2grid(coord_def(count_x, count_y)));
+ const coord_def ep = view2show(grid2view(gc));
- if (Options.tutorial_left && in_bounds(gx, gy)
- && crawl_view.in_grid_los(coord_def(gx, gy)))
+ if (Options.tutorial_left && in_bounds(gc)
+ && crawl_view.in_grid_los(gc))
{
- const int ex = gx - you.x_pos + 9;
- const int ey = gy - you.y_pos + 9;
-
- const int object = env.show[ex][ey];
+ const int object = env.show(ep);
if (object)
{
- if (is_feature('>',gx,gy))
- learned_something_new(TUT_SEEN_STAIRS,gx,gy);
- else if (is_feature('_',gx,gy))
- learned_something_new(TUT_SEEN_ALTAR,gx,gy);
- else if (grd[gx][gy] == DNGN_CLOSED_DOOR
- && see_grid( gx, gy ))
- learned_something_new(TUT_SEEN_DOOR,gx,gy);
- else if (grd[gx][gy] == DNGN_ENTER_SHOP
- && see_grid( gx, gy ))
- learned_something_new(TUT_SEEN_SHOP,gx,gy);
+ if (is_feature('>', gc.x, gc.y))
+ learned_something_new(TUT_SEEN_STAIRS, gc.x, gc.y);
+ else if (is_feature('_', gc.x, gc.y))
+ learned_something_new(TUT_SEEN_ALTAR, gc.x, gc.y);
+ else if (grd(gc) == DNGN_CLOSED_DOOR
+ && see_grid( gc.x, gc.y ))
+ learned_something_new(TUT_SEEN_DOOR, gc.x, gc.y);
+ else if (grd(gc) == DNGN_ENTER_SHOP
+ && see_grid( gc.x, gc.y ))
+ learned_something_new(TUT_SEEN_SHOP, gc.x, gc.y);
}
}
// order is important here
- if (!map_bounds( gx, gy ))
+ if (!map_bounds(gc))
{
// off the map
buffy[bufcount] = 0;
buffy[bufcount + 1] = DARKGREY;
}
- else if (!crawl_view.in_grid_los(coord_def(gx, gy)))
+ else if (!crawl_view.in_grid_los(gc))
{
// outside the env.show area
- buffy[bufcount] = get_envmap_char( gx, gy );
+ buffy[bufcount] = get_envmap_char( gc.x, gc.y );
buffy[bufcount + 1] = DARKGREY;
if (Options.colour_map)
buffy[bufcount + 1] =
- colour_code_map(gx - 1, gy - 1,
- Options.item_colour);
+ colour_code_map(gc.x, gc.y, Options.item_colour);
}
- else if (gx == you.x_pos && gy == you.y_pos)
+ else if (gc == you.pos())
{
- const int ex = gx - you.x_pos + 9;
- const int ey = gy - you.y_pos + 9;
-
- int object = env.show[ex][ey];
- unsigned short colour = env.show_col[ex][ey];
- unsigned short ch;
- get_symbol( gx, gy, object, &ch, &colour );
+ int object = env.show(ep);
+ unsigned short colour = env.show_col(ep);
+ unsigned ch;
+ get_symbol( gc.x, gc.y, object, &ch, &colour );
if (map)
{
- set_envmap_glyph( gx, gy, ch, colour, object );
- set_terrain_seen( gx, gy );
- set_envmap_detected_mons(gx, gy, false);
- set_envmap_detected_item(gx, gy, false);
+ set_envmap_glyph( gc.x, gc.y, object, colour );
+ set_terrain_seen( gc.x, gc.y );
+ set_envmap_detected_mons(gc.x, gc.y, false);
+ set_envmap_detected_item(gc.x, gc.y, false);
}
// player overrides everything in cell
@@ -3763,7 +3780,7 @@ void viewwindow(bool draw_it, bool do_updates)
if (player_is_swimming())
{
- if (grd[gx][gy] == DNGN_DEEP_WATER)
+ if (grd(gc) == DNGN_DEEP_WATER)
buffy[bufcount + 1] = BLUE;
else
buffy[bufcount + 1] = CYAN;
@@ -3771,19 +3788,14 @@ void viewwindow(bool draw_it, bool do_updates)
}
else
{
- // Note: env.show is set for grids in LoS
- // get env coords
- const int ex = gx - you.x_pos + 9;
- const int ey = gy - you.y_pos + 9;
-
- int object = env.show[ex][ey];
- unsigned short colour = env.show_col[ex][ey];
- unsigned short ch;
+ int object = env.show(ep);
+ unsigned short colour = env.show_col(ep);
+ unsigned ch;
if (object == DNGN_SECRET_DOOR)
- object = grid_secret_door_appearance( gx, gy );
+ object = grid_secret_door_appearance( gc.x, gc.y );
- get_symbol( gx, gy, object, &ch, &colour );
+ get_symbol( gc.x, gc.y, object, &ch, &colour );
buffy[bufcount] = ch;
buffy[bufcount + 1] = colour;
@@ -3798,10 +3810,10 @@ void viewwindow(bool draw_it, bool do_updates)
if (buffy[bufcount] != 0)
{
// ... map that we've seen this
- set_envmap_glyph( gx, gy, ch, colour, object );
- set_terrain_seen( gx, gy );
- set_envmap_detected_mons(gx, gy, false);
- set_envmap_detected_item(gx, gy, false);
+ set_envmap_glyph( gc.x, gc.y, object, colour );
+ set_terrain_seen( gc.x, gc.y );
+ set_envmap_detected_mons(gc.x, gc.y, false);
+ set_envmap_detected_item(gc.x, gc.y, false);
}
// Check if we're looking to clean_map...
@@ -3816,13 +3828,13 @@ void viewwindow(bool draw_it, bool do_updates)
// to the grid before monsters and clouds were
// added otherwise.
if (Options.clean_map
- && Show_Backup[ex][ey]
- && is_terrain_seen( gx, gy ))
+ && Show_Backup(ep)
+ && is_terrain_seen( gc.x, gc.y ))
{
- get_symbol( gx, gy,
- Show_Backup[ex][ey], &ch, &colour );
- set_envmap_glyph( gx, gy, ch, colour,
- Show_Backup[ex][ey] );
+ get_symbol( gc.x, gc.y,
+ Show_Backup(ep), &ch, &colour );
+ set_envmap_glyph( gc.x, gc.y, Show_Backup(ep),
+ colour );
}
// Now we get to filling in both the unseen
@@ -3838,12 +3850,12 @@ void viewwindow(bool draw_it, bool do_updates)
if (buffy[bufcount] == 0)
{
// show map
- buffy[bufcount] = get_envmap_char( gx, gy );
+ buffy[bufcount] = get_envmap_char( gc.x, gc.y );
buffy[bufcount + 1] = DARKGREY;
if (Options.colour_map)
buffy[bufcount + 1] =
- colour_code_map(gx - 1, gy - 1,
+ colour_code_map(gc.x, gc.y,
Options.item_colour);
}
}
@@ -3877,7 +3889,7 @@ void viewwindow(bool draw_it, bool do_updates)
buffy[bufcount] = cset_adjust( buffy[bufcount] );
#endif
textcolor( buffy[bufcount + 1] );
- putch( buffy[bufcount] );
+ putwch( buffy[bufcount] );
bufcount += 2;
}
}
@@ -3886,6 +3898,7 @@ void viewwindow(bool draw_it, bool do_updates)
#ifdef USE_CURSES
set_altcharset( false );
#endif
+ update_screen();
}
} // end viewwindow()
diff --git a/crawl-ref/source/view.h b/crawl-ref/source/view.h
index ce31141055..38bdc47b61 100644
--- a/crawl-ref/source/view.h
+++ b/crawl-ref/source/view.h
@@ -110,19 +110,20 @@ void clear_map(bool clear_items = true, bool clear_mons = true);
bool is_feature(int feature, int x, int y);
-void get_item_glyph(const item_def *item, unsigned short *glych,
+void get_item_glyph(const item_def *item, unsigned *glych,
unsigned short *glycol);
-void get_mons_glyph(const monsters *mons, unsigned short *glych,
+void get_mons_glyph(const monsters *mons, unsigned *glych,
unsigned short *glycol);
int get_screen_glyph( int x, int y );
-void get_item_symbol(unsigned int object, unsigned short *ch,
+void get_item_symbol(unsigned int object, unsigned *ch,
unsigned short *colour);
// Applies EC_ colour substitutions and brands.
unsigned real_colour(unsigned raw_colour);
-void set_envmap_char( int x, int y, unsigned char chr );
+void set_envmap_obj( int x, int y, int object );
unsigned get_envmap_char(int x, int y);
+int get_envmap_obj(int x, int y);
void set_envmap_detected_item(int x, int y, bool detected = true);
void set_envmap_detected_mons(int x, int y, bool detected = true);
void set_envmap_col( int x, int y, int colour, int flags );
@@ -150,8 +151,8 @@ bool see_grid( int grx, int gry );
std::string screenshot(bool fullscreen = false);
-unsigned char get_sightmap_char(int feature);
-unsigned char get_magicmap_char(int feature);
+unsigned get_sightmap_char(int feature);
+unsigned get_magicmap_char(int feature);
void viewwindow(bool draw_it, bool do_updates);
void fire_monster_alerts();