gmtool, angefangen highlighting zu implementieren.

bugfixes letzter eressea-commit
This commit is contained in:
Enno Rehling 2006-04-09 18:13:47 +00:00
parent 2f8e9e2053
commit 11bc581285
3 changed files with 166 additions and 115 deletions

View File

@ -508,6 +508,8 @@ int
max_magicians(const faction * f)
{
int m = MAXMAGICIANS;
attrib * a;
if ((a = a_find(f->attribs, &at_maxmagicians)) != NULL) {
m = a->data.i;
}
@ -515,12 +517,12 @@ max_magicians(const faction * f)
#ifdef KARMA_MODULE
m += fspecial(f, FS_MAGOCRACY) * 2;
#endif /* KARMA_MODULE */
return m;
}
int
max_skill(faction * f, skill_t sk)
{
attrib *a;
int m = INT_MAX;
if (allied_skilllimit(f, sk)) {

View File

@ -42,7 +42,9 @@ extern "C" {
#define RF_ORCIFIED (1<<12)
#define RF_CURSED (1<<13)
/* debug flags */
#define RF_COMBATDEBUG (1<<14)
#define RF_MAPPER_HIGHLIGHT (1<<14) /* only used by mapper, not stored */
#define RF_DH (1<<18)

View File

@ -221,10 +221,12 @@ game_done(void)
static void
init_curses(void)
{
int fg, bg;
initscr();
if (has_colors() || force_color) {
short bcol = COLOR_BLACK;
short hcol = COLOR_MAGENTA;
start_color();
#ifdef WIN32
/* looks crap on putty with TERM=linux */
@ -232,17 +234,12 @@ init_curses(void)
init_color(COLOR_YELLOW, 1000, 1000, 0);
}
#endif
init_pair(COLOR_BLACK, COLOR_BLACK, bcol);
init_pair(COLOR_GREEN, COLOR_GREEN, bcol);
init_pair(COLOR_GREEN, COLOR_GREEN, bcol);
init_pair(COLOR_RED, COLOR_RED, bcol);
init_pair(COLOR_CYAN, COLOR_CYAN, bcol);
init_pair(COLOR_WHITE, COLOR_WHITE, bcol);
init_pair(COLOR_MAGENTA, COLOR_MAGENTA, bcol);
init_pair(COLOR_BLUE, COLOR_BLUE, bcol);
init_pair(COLOR_YELLOW, COLOR_YELLOW, bcol);
init_pair(COLOR_YELLOW, COLOR_YELLOW, bcol);
init_pair(COLOR_WHITE, COLOR_WHITE, bcol);
for (fg=0;fg!=8;++fg) {
for (bg=0;bg!=2;++bg) {
init_pair(fg+8*bg, fg, bg?hcol:bcol);
}
}
attrset(COLOR_PAIR(COLOR_BLACK));
bkgd(' ' | COLOR_PAIR(COLOR_BLACK));
@ -351,38 +348,39 @@ tagged_region(selection * s, const coordinate * c)
}
static int
mr_tile(const map_region * mr)
mr_tile(const map_region * mr, int highlight)
{
int hl = 8 * highlight;
if (mr!=NULL && mr->r!=NULL) {
const region * r = mr->r;
switch (r->terrain->_name[0]) {
case 'o' :
return '.' | COLOR_PAIR(COLOR_CYAN);
return '.' | COLOR_PAIR(hl + COLOR_CYAN);
case 'd' :
return 'D' | COLOR_PAIR(COLOR_YELLOW) | A_BOLD;
return 'D' | COLOR_PAIR(hl + COLOR_YELLOW) | A_BOLD;
case 't' :
return '%' | COLOR_PAIR(COLOR_YELLOW) | A_BOLD;
return '%' | COLOR_PAIR(hl + COLOR_YELLOW) | A_BOLD;
case 'f' :
if (r->terrain->_name[1]=='o') { /* fog */
return '.' | COLOR_PAIR(COLOR_YELLOW) | A_NORMAL;
return '.' | COLOR_PAIR(hl + COLOR_YELLOW) | A_NORMAL;
} else if (r->terrain->_name[1]=='i') { /* firewall */
return '%' | COLOR_PAIR(COLOR_RED) | A_BOLD;
return '%' | COLOR_PAIR(hl + COLOR_RED) | A_BOLD;
}
case 'h' :
return 'H' | COLOR_PAIR(COLOR_YELLOW) | A_NORMAL;
return 'H' | COLOR_PAIR(hl + COLOR_YELLOW) | A_NORMAL;
case 'm' :
return '^' | COLOR_PAIR(COLOR_WHITE) | A_NORMAL;
return '^' | COLOR_PAIR(hl + COLOR_WHITE) | A_NORMAL;
case 'p' :
if (r_isforest(r)) return '#' | COLOR_PAIR(COLOR_GREEN) | A_NORMAL;
return '+' | COLOR_PAIR(COLOR_GREEN) | A_BOLD;
if (r_isforest(r)) return '#' | COLOR_PAIR(hl + COLOR_GREEN) | A_NORMAL;
return '+' | COLOR_PAIR(hl + COLOR_GREEN) | A_BOLD;
case 'g' :
return '*' | COLOR_PAIR(COLOR_WHITE) | A_BOLD;
return '*' | COLOR_PAIR(hl + COLOR_WHITE) | A_BOLD;
case 's' :
return 'S' | COLOR_PAIR(COLOR_MAGENTA) | A_NORMAL;
return 'S' | COLOR_PAIR(hl + COLOR_MAGENTA) | A_NORMAL;
}
return r->terrain->_name[0] | COLOR_PAIR(COLOR_RED);
return r->terrain->_name[0] | COLOR_PAIR(hl + COLOR_RED);
}
return ' ' | COLOR_PAIR(COLOR_WHITE);
return ' ' | COLOR_PAIR(hl + COLOR_WHITE);
}
static void
@ -399,6 +397,7 @@ paint_map(window * wnd, const state * st)
int yp = (lines - y - 1) * THEIGHT;
for (x = 0; x!=cols; ++x) {
int attr = 0;
int hl = 0;
int xp = x * TWIDTH + (y & 1) * TWIDTH/2;
map_region * mr = mr_get(&st->display, x, y);
@ -406,7 +405,8 @@ paint_map(window * wnd, const state * st)
attr |= A_REVERSE;
}
if (mr) {
mvwaddch(win, yp, xp, mr_tile(mr) | attr);
if (mr->r && mr->r->flags & RF_MAPPER_HIGHLIGHT) hl = 1;
mvwaddch(win, yp, xp, mr_tile(mr, hl) | attr);
}
}
}
@ -444,7 +444,7 @@ draw_cursor(WINDOW * win, selection * s, const view * v, const coordinate * c, i
xp = cx * TWIDTH + (cy & 1) * TWIDTH/2;
if (s && tagged_region(s, &mr->coord)) attr = A_REVERSE;
if (mr->r) {
mvwaddch(win, yp, xp, mr_tile(mr) | attr);
mvwaddch(win, yp, xp, mr_tile(mr, 0) | attr);
}
else mvwaddch(win, yp, xp, ' ' | attr | COLOR_PAIR(COLOR_YELLOW));
if (show) {
@ -672,6 +672,129 @@ region2coord(const region * r, coordinate * c)
#define FAST_RIGHT KEY_SRIGHT
#endif
enum { MODE_HIGHLIGHT = 0x0, MODE_SELECT = 0x1, MODE_INVERT = 0x2 };
static void
select_regions(state * st, int selectmode)
{
char sbuffer[80];
int findmode;
const char * statustext[] = {
"mark-", "select-", "unmark-", "deselect-"
};
const char * status = statustext[selectmode];
statusline(st->wnd_status->handle, status);
doupdate();
findmode = getch();
if (findmode=='n') { /* none */
int i;
sprintf(sbuffer, "%snone", status);
statusline(st->wnd_status->handle, sbuffer);
for (i=0;i!=MAXTHASH;++i) {
tag ** tp = &st->selected->tags[i];
while (*tp) {
tag * t = *tp;
*tp = t->nexthash;
free(t);
}
}
}
else if (findmode=='u') {
region * r;
sprintf(sbuffer, "%sunits", status);
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->units) {
coordinate coord;
if (selectmode&MODE_SELECT) {
if (selectmode&MODE_INVERT) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
} else {
if (selectmode&MODE_INVERT) r->flags &= ~RF_MAPPER_HIGHLIGHT;
else r->flags |= RF_MAPPER_HIGHLIGHT;
}
}
}
}
else if (findmode=='s') {
region * r;
sprintf(sbuffer, "%sships", status);
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->ships) {
coordinate coord;
if (selectmode&MODE_SELECT) {
if (selectmode&MODE_INVERT) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
} else {
if (selectmode&MODE_INVERT) r->flags &= ~RF_MAPPER_HIGHLIGHT;
else r->flags |= RF_MAPPER_HIGHLIGHT;
}
}
}
}
else if (findmode=='f') {
char fbuffer[12];
sprintf(sbuffer, "%sfaction:", status);
askstring(st->wnd_status->handle, sbuffer, fbuffer, 12);
if (fbuffer[0]) {
faction * f = findfaction(atoi36(fbuffer));
if (f!=NULL) {
unit * u;
coordinate coord;
sprintf(sbuffer, "%sfaction: %s", status, itoa36(f->no));
statusline(st->wnd_status->handle, sbuffer);
for (u=f->units;u;u=u->nextF) {
region * r = u->region;
if (selectmode&MODE_SELECT) {
if (selectmode&MODE_INVERT) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
} else {
if (selectmode&MODE_INVERT) r->flags &= ~RF_MAPPER_HIGHLIGHT;
else r->flags |= RF_MAPPER_HIGHLIGHT;
}
}
} else {
statusline(st->wnd_status->handle, "faction not found.");
beep();
return;
}
}
}
else if (findmode=='t') {
const struct terrain_type * terrain;
sprintf(sbuffer, "%sterrain: ", status);
statusline(st->wnd_status->handle, sbuffer);
terrain = select_terrain(st, NULL);
if (terrain!=NULL) {
region * r;
sprintf(sbuffer, "%sterrain: %s", status, terrain->_name);
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->terrain==terrain) {
coordinate coord;
if (selectmode&MODE_SELECT) {
if (selectmode&MODE_INVERT) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
} else {
if (selectmode&MODE_INVERT) r->flags &= ~RF_MAPPER_HIGHLIGHT;
else r->flags |= RF_MAPPER_HIGHLIGHT;
}
}
}
}
} else {
statusline(st->wnd_status->handle, "unknown command.");
beep();
return;
}
st->wnd_info->update |= 3;
st->wnd_status->update |= 3;
st->wnd_map->update |= 3;
}
static void
handlekey(state * st, int c)
{
@ -680,7 +803,6 @@ handlekey(state * st, int c)
static char locate[80];
static int findmode = 0;
region *r;
boolean invert = false;
char sbuffer[80];
static char kbuffer[80];
@ -805,7 +927,7 @@ handlekey(state * st, int c)
}
}
break;
case 't':
case 0x14: /* C-t */
terraform_at(&st->cursor, select_terrain(st, NULL));
st->modified = 1;
st->wnd_info->update |= 1;
@ -845,92 +967,17 @@ handlekey(state * st, int c)
}
} while (c==0);
break;
case 'U':
invert = true;
/* !! intentional fall-through !! */
case 'H':
select_regions(st, MODE_INVERT|MODE_HIGHLIGHT);
break;
case 'T':
statusline(st->wnd_status->handle, "untag-"+(invert?0:2));
doupdate();
findmode = getch();
if (findmode=='n') { /* none */
int i;
statusline(st->wnd_status->handle, "tag-none");
for (i=0;i!=MAXTHASH;++i) {
tag ** tp = &st->selected->tags[i];
while (*tp) {
tag * t = *tp;
*tp = t->nexthash;
free(t);
}
}
}
else if (findmode=='u') {
sprintf(sbuffer, "%stag-units", invert?"un":"");
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->units) {
coordinate coord;
if (invert) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
}
}
}
else if (findmode=='s') {
sprintf(sbuffer, "%stag-ships", invert?"un":"");
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->ships) {
coordinate coord;
if (invert) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
}
}
}
else if (findmode=='f') {
askstring(st->wnd_status->handle, "untag-faction:"+(invert?0:2), sbuffer, 12);
if (sbuffer[0]) {
faction * f = findfaction(atoi36(sbuffer));
if (f!=NULL) {
unit * u;
coordinate coord;
sprintf(sbuffer, "%stag-terrain: %s", invert?"un":"", itoa36(f->no));
statusline(st->wnd_status->handle, sbuffer);
for (u=f->units;u;u=u->nextF) {
if (invert) untag_region(st->selected, region2coord(u->region, &coord));
else tag_region(st->selected, region2coord(u->region, &coord));
}
} else {
statusline(st->wnd_status->handle, "faction not found.");
beep();
break;
}
}
}
else if (findmode=='t') {
const struct terrain_type * terrain;
statusline(st->wnd_status->handle, "untag-terrain: "+(invert?0:2));
terrain = select_terrain(st, NULL);
if (terrain!=NULL) {
sprintf(sbuffer, "%stag-terrain: %s", invert?"un":"", terrain->_name);
statusline(st->wnd_status->handle, sbuffer);
for (r=regions;r;r=r->next) {
if (r->terrain==terrain) {
coordinate coord;
if (invert) untag_region(st->selected, region2coord(r, &coord));
else tag_region(st->selected, region2coord(r, &coord));
}
}
}
} else {
statusline(st->wnd_status->handle, "unknown command.");
beep();
break;
}
st->wnd_info->update |= 3;
st->wnd_status->update |= 3;
st->wnd_map->update |= 3;
select_regions(st, MODE_INVERT|MODE_SELECT);
break;
case 'h':
select_regions(st, MODE_HIGHLIGHT);
break;
case 't':
select_regions(st, MODE_SELECT);
break;
case ';':
statusline(st->wnd_status->handle, "tag-");