summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-03-11 15:31:45 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-03-11 15:31:45 +0000
commit04ef4ac34d7bbc5358a3adbf542071599e71c515 (patch)
treef1a7f48c32bd700ac49cace190c67b3f5434df7f /crawl-ref/source
parent370f12250ba294042472a110a006769e42f1bff4 (diff)
downloadcrawl-ref-04ef4ac34d7bbc5358a3adbf542071599e71c515.tar.gz
crawl-ref-04ef4ac34d7bbc5358a3adbf542071599e71c515.zip
[1657502] Added use_fake_cursor option to make Crawl draw a cursor for Unix
terminals that cannot draw cursors on black spaces or darkgrey areas. May need some work, since the fake cursor tends to leave artifacts on the scrolling edge. Removed the +1 X offset to the viewport. Fixed crash when monster wielding a weapon of orc slaying hits player (Erik). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1016 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/acr.cc2
-rw-r--r--crawl-ref/source/direct.cc9
-rw-r--r--crawl-ref/source/externs.h3
-rw-r--r--crawl-ref/source/fight.cc2
-rw-r--r--crawl-ref/source/initfile.cc5
-rw-r--r--crawl-ref/source/libunix.cc38
-rw-r--r--crawl-ref/source/libunix.h1
-rw-r--r--crawl-ref/source/libutil.cc16
-rw-r--r--crawl-ref/source/libutil.h15
-rw-r--r--crawl-ref/source/view.cc8
10 files changed, 80 insertions, 19 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index b7ded5c700..d673838ae4 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -882,7 +882,7 @@ static void input()
handle_delay();
- gotoxy(18,9);
+ gotoxy(VIEW_CX, VIEW_CY);
if ( you_are_delayed() )
{
diff --git a/crawl-ref/source/direct.cc b/crawl-ref/source/direct.cc
index 0aebaf1a28..b9be9325c7 100644
--- a/crawl-ref/source/direct.cc
+++ b/crawl-ref/source/direct.cc
@@ -273,6 +273,8 @@ void direction(struct dist& moves, targeting_type restricts,
return;
}
+ cursor_control con(!Options.use_fake_cursor);
+
int dir = 0;
bool show_beam = false;
ray_def ray;
@@ -322,8 +324,7 @@ void direction(struct dist& moves, targeting_type restricts,
moves.isEndpoint = false;
moves.choseRay = false;
- // I'm sure there's a perfectly good reason for the +1.
- gotoxy( grid2viewX(moves.tx) + 1, grid2viewY(moves.ty) );
+ cursorxy( grid2viewX(moves.tx), grid2viewY(moves.ty) );
command_type key_command;
@@ -616,7 +617,7 @@ void direction(struct dist& moves, targeting_type restricts,
// We'll go on looping. Redraw whatever is necessary.
// Tried to step out of bounds
- if ( !in_bounds(moves.tx, moves.ty) )
+ if ( !in_viewport_bounds(grid2viewX(moves.tx), grid2viewY(moves.ty)) )
{
moves.tx = old_tx;
moves.ty = old_ty;
@@ -686,6 +687,8 @@ void direction(struct dist& moves, targeting_type restricts,
// cache and noted in the Dungeon (O)verview, names the stair.
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))
return;
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 3fcb868c51..a222cee91b 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -1258,6 +1258,9 @@ public:
bool remember_name; // Remember and reprompt with last name
bool dos_use_background_intensity;
+
+ bool use_fake_cursor; // Draw a fake cursor instead of relying
+ // on the term's own cursor.
int level_map_cursor_step; // The cursor increment in the level
// map.
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 621f1b9253..859a8f2e62 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -1501,7 +1501,7 @@ bool melee_attack::apply_damage_brand()
break;
case SPWPN_ORC_SLAYING:
- if (def->mons_species() == MONS_ORC)
+ if (defender->mons_species() == MONS_ORC)
{
special_damage = 1 + random2(damage_done);
special_damage_message =
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index f99126ff23..5815807405 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -647,6 +647,7 @@ void game_options::reset_options()
// 10 was the cursor step default on Linux.
level_map_cursor_step = 7;
+ use_fake_cursor = false;
stash_tracking = STM_ALL;
@@ -1982,6 +1983,10 @@ void game_options::read_option_line(const std::string &str, bool runscript)
if (level_map_cursor_step > 50)
level_map_cursor_step = 50;
}
+ else if (key == "use_fake_cursor")
+ {
+ use_fake_cursor = read_bool(field, use_fake_cursor);
+ }
else if (key == "macro_meta_entry")
{
macro_meta_entry = read_bool(field, macro_meta_entry);
diff --git a/crawl-ref/source/libunix.cc b/crawl-ref/source/libunix.cc
index 3eb398237b..1ef0d2ea45 100644
--- a/crawl-ref/source/libunix.cc
+++ b/crawl-ref/source/libunix.cc
@@ -640,6 +640,44 @@ 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)
+{
+ if (oldch && faked_x != -1
+ && mvinch(faked_y, faked_x) == oldmangledch)
+ {
+ if (faked_x != x - 1 || faked_y != y - 1)
+ mvaddch(faked_y, faked_x, oldch);
+ else
+ return;
+ }
+
+ 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;
+
+ int fg = pair & 7;
+ int bg = (pair >> 3) & 7;
+
+ if (pair == 63)
+ {
+ fg = COLOR_WHITE;
+ bg = COLOR_BLACK;
+ }
+
+ const int newpair = (fg * 8 + bg);
+
+ mvaddch( y - 1, x - 1, oldmangledch = ((ch & 127) | COLOR_PAIR(newpair)) );
+
+ move(y - 1, x - 1);
+}
int wherex()
{
diff --git a/crawl-ref/source/libunix.h b/crawl-ref/source/libunix.h
index bcbb864e85..19cd2674e3 100644
--- a/crawl-ref/source/libunix.h
+++ b/crawl-ref/source/libunix.h
@@ -21,6 +21,7 @@ int getch_ck(void);
int clrscr(void);
int cprintf(const char *format,...);
int gotoxy(int x, int y);
+void fakecursorxy(int x, int y);
int itoa(int value, char *strptr, int radix);
int kbhit(void);
int putch(unsigned char chr);
diff --git a/crawl-ref/source/libutil.cc b/crawl-ref/source/libutil.cc
index 5246c2704d..096eeffc8a 100644
--- a/crawl-ref/source/libutil.cc
+++ b/crawl-ref/source/libutil.cc
@@ -140,7 +140,7 @@ int unmangle_direction_keys(int keyin, int km)
// the shell can do damage with.
bool shell_safe(const char *file)
{
- int match = strcspn(file, "`$*?|><&\n");
+ int match = strcspn(file, "\\`$*?|><&\n!");
return !(match >= 0 && file[match]);
}
@@ -302,6 +302,20 @@ int c_getch()
#endif
}
+// Wrapper around gotoxy that can draw a fake cursor for Unix terms where
+// cursoring over darkgray or black causes problems.
+void cursorxy(int x, int y)
+{
+#ifdef UNIX
+ if (Options.use_fake_cursor)
+ fakecursorxy(x, y);
+ else
+ gotoxy(x, y);
+#else
+ gotoxy(x, y);
+#endif
+}
+
// cprintf that knows how to wrap down lines (primitive, but what the heck)
int wrapcprintf( int wrapcol, const char *s, ... )
{
diff --git a/crawl-ref/source/libutil.h b/crawl-ref/source/libutil.h
index a84ab5a166..d5b7bf081e 100644
--- a/crawl-ref/source/libutil.h
+++ b/crawl-ref/source/libutil.h
@@ -19,6 +19,8 @@
#include <string>
#include <vector>
+void cursorxy(int x, int y);
+
// Converts a key to a direction key, converting keypad and other sequences
// to vi key sequences (shifted/control key directions are also handled). Non
// direction keys (hopefully) pass through unmangled.
@@ -307,12 +309,8 @@ public:
bool compile() const
{
- // This function is const because compiled_pattern is not really part of
- // the state of the object.
-
- void *&cp = const_cast<text_pattern*>( this )->compiled_pattern;
return !empty()?
- !!(cp = compile_pattern(pattern.c_str(), ignore_case))
+ !!(compiled_pattern = compile_pattern(pattern.c_str(), ignore_case))
: false;
}
@@ -324,8 +322,7 @@ public:
bool valid() const
{
return isvalid &&
- (compiled_pattern ||
- (const_cast<text_pattern*>( this )->isvalid = compile()));
+ (compiled_pattern || (isvalid = compile()));
}
bool matches(const char *s, int length) const
@@ -350,8 +347,8 @@ public:
private:
std::string pattern;
- void *compiled_pattern;
- bool isvalid;
+ mutable void *compiled_pattern;
+ mutable bool isvalid;
bool ignore_case;
};
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 1c0a31ed0f..e8a73dc6d2 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -2088,7 +2088,7 @@ static void draw_level_map(int start_x, int start_y, bool travel_mode)
// to get that. This function is still a mess, though. -- bwr
void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
{
- cursor_control con(true);
+ cursor_control ccon(!Options.use_fake_cursor);
int i, j;
char move_x = 0;
@@ -2178,7 +2178,7 @@ void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
draw_level_map(start_x, start_y, travel_mode);
redraw_map = true;
- gotoxy(curs_x, curs_y + top - 1);
+ cursorxy(curs_x, curs_y + top - 1);
getty = unmangle_direction_keys(getchm(KC_LEVELMAP), KC_LEVELMAP);
@@ -3583,7 +3583,7 @@ void viewwindow(bool draw_it, bool do_updates)
// avoiding unneeded draws when running
if (!you.running || (you.running < 0 && Options.travel_delay > -1))
{
- gotoxy( 2, 1 );
+ gotoxy( 1, 1 );
bufcount = 0;
for (count_y = 0; count_y < Y_SIZE; count_y++)
@@ -3598,7 +3598,7 @@ void viewwindow(bool draw_it, bool do_updates)
bufcount += 2;
}
- gotoxy( 2, count_y + 2 );
+ gotoxy( 1, count_y + 2 );
}
}