I can't get ncurses in my program to work. I need some help. I don't even know what the problem is anymore. I've only been programming for 2 years too, so bare with me.
I am trying to get my
roguelike game running on my Zaurus. It's simple C/C++ game that I wrote in school. Currently, it is using ncurses for the graphicsal user interface, but I was using windoes console before and switched. It will compile with 'g++ -lncurses *.c -o test', and will run with './test', but only my debugging text is printing, not the ncurses portions of the game. My debugging text is printed to the display using standard cout, not ncurses.
Well, maybe ncurses isn't installed on the Z? I found the following package, 'libncurses_5.0_arm.ipk' and installed it but even after a recompile ncurses still doesn't work.
So, I am starting to think maybe it has to do with how I am using ncurses in my code. I hope in posting it someone with ncurses experience can easily recognise anything that I might be doing in error. As a last resort, I might make my Z-port B&W only (couts only) or maybe find an ncurses program that runs on the Zaurus and mimic its method of ncurse programming. But, I'm not conviced entirely that ncurses is working properly on my Z. Hopefully, this can be resolved easily.
Here's my code in its primeval form.
/////////////////////////////////////////////
///// UI.CPP ////////////////////////////
/////////////////////////////////////////////
#include "ui.h"
UI::UI( Dungeon * inWorld )
{
world = inWorld;
initscr();
start_color();
cbreak();
noecho();
// nodelay(0, true);
intrflush(stdscr, false);
keypad(stdscr, true);
curs_set(0);
//if ( !has_colors() ) {
// endwin ();
// fputs ("No colours!", stderr);
// exit (1);
//}
init_pair(1, COLOR_BLACK, COLOR_BLACK);
init_pair(2, COLOR_WHITE, COLOR_BLACK);
init_pair(3, COLOR_RED, COLOR_BLACK);
init_pair(4, COLOR_GREEN, COLOR_BLACK);
init_pair(5, COLOR_BLUE, COLOR_BLACK);
init_pair(6, COLOR_CYAN, COLOR_BLACK);
init_pair(7, COLOR_MAGENTA, COLOR_BLACK);
init_pair(8, COLOR_YELLOW, COLOR_BLACK);
init_pair(9, COLOR_BLACK, COLOR_WHITE); // map colour in use
// Colour test
for(int i = 1;i<=9;i++)
{
attron( COLOR_PAIR(i) );
mvprintw (0, 60+i, "%d", i );
attroff( COLOR_PAIR(i) );
}
for(int i = 1;i<=9;i++)
{
attron( COLOR_PAIR(i)|A_BOLD );
mvprintw (0, 69+i, "%d", i );
attroff( COLOR_PAIR(i)|A_BOLD );
}
// Title test
mvprintw (1, 62, "%s", "Dungeon: Infernal" );
// display & frame initialization & centering of player to frame
display = newwin( DISP_HEIGHT, DISP_WIDTH, 0, 0 );
int pRow = ( world->getPlayer() )->getRow();
int pCol = ( world->getPlayer() )->getCol();
tRow = 0;
tCol = 0;
bRow = DISP_HEIGHT;
bCol = DISP_WIDTH;
centerFrame( UP_KEY );
centerFrame( DOWN_KEY );
centerFrame( LEFT_KEY );
centerFrame( RIGHT_KEY );
}
UI::~UI()
{
erase ();
refresh ();
endwin ();
}
void UI::bindFrame()
{
if( bCol > world->getLevelCols() )
{
bCol = world->getLevelCols();
tCol = world->getLevelCols() - DISP_WIDTH;
}
if( bRow > world->getLevelRows() )
{
bRow = world->getLevelRows();
tRow = world->getLevelRows() - DISP_HEIGHT;
}
if( tRow < 0 )
{
bRow = DISP_HEIGHT;
tRow = 0;
}
if( tCol < 0 )
{
bCol = DISP_WIDTH;
tCol = 0;
}
}
void UI::addMessage( int inNum )
{
// wattron( message, COLOR_PAIR(2) );
// mvwaddch( message, DISP_HEIGHT, 0, inNum );
mvprintw (22, 10, "%d", inNum );
// wattroff( message, COLOR_PAIR(2) );
// wrefresh( message );
}
void UI::refreshPlayWindow()
{
int x, y, frameRow, frameCol;
frameRow = tRow;
frameCol = tCol;
Tile * t;
for (x = 0; x < DISP_HEIGHT; x++)
{
for (y = 0; y < DISP_WIDTH; y++)
{
t = world->getTile( frameRow, frameCol++ );
if( (t->getFlags() & VISITED) == VISITED )
{
if( (t->getFlags() & DUNGEONWALL) == DUNGEONWALL )
{
if( (t->getFlags() & SEEN) == SEEN )
{
// Print 219 white
wattron( display, COLOR_PAIR(2) );
mvwaddch( display, x, y, 219 );
wattroff( display, COLOR_PAIR(2) );
// Later have a BLOODY flag for red
}
else
{
// Print 219 BOLD black
wattron( display, COLOR_PAIR(1)|A_BOLD );
mvwaddch( display, x, y, 219 );
wattroff( display, COLOR_PAIR(1)|A_BOLD );
}
}
else if( (t->getFlags() & PLAYER) == PLAYER )
{
// Print player as 64 for now
wattron( display, COLOR_PAIR(2)|A_BOLD );
mvwaddch( display, x, y, 64 );
wattroff( display, COLOR_PAIR(2)|A_BOLD );
}
else if( (t->getFlags() & OBJECT) == OBJECT )
{
if( (t->getFlags() & SEEN) == SEEN )
{
// Get the object and print icon and colour
wattron( display, COLOR_PAIR(2)|A_BOLD );
mvwaddch( display, x, y, 64 );
wattroff( display, COLOR_PAIR(2)|A_BOLD );
}
else
{
wattron( display, COLOR_PAIR(1)|A_BOLD );
mvwaddch( display, x, y, 64 );
wattroff( display, COLOR_PAIR(1)|A_BOLD );
}
}
else // Is an empty floor tile
{
// VISITED, SEEN, later BLOODY?
if( (t->getFlags() & SEEN) == SEEN )
{
if( (t->getFlags() & DIRTFLOOR) == DIRTFLOOR )
{
// Print 219 white
wattron( display, COLOR_PAIR(

);
mvwaddch( display, x, y, 250 );
wattroff( display, COLOR_PAIR(

);
}
else if( (t->getFlags() & STONEFLOOR) == STONEFLOOR )
{
// Print 219 white
wattron( display, COLOR_PAIR(2)|A_BOLD );
mvwaddch( display, x, y, 250 );
wattroff( display, COLOR_PAIR(2)|A_BOLD );
}
else
{
// Print 219 white
wattron( display, COLOR_PAIR(1)|A_BOLD );
mvwaddch( display, x, y, 250 );
wattroff( display, COLOR_PAIR(1)|A_BOLD );
}
// Later have a BLOODY flag for red
// Lighting effect
// * have a range check, player x y - tile x y,
// * if within 3, light up as white, else grey
//
}
else
{
// Print 219 jet black
wattron( display, COLOR_PAIR(1) );
mvwaddch( display, x, y, 32 );
wattroff( display, COLOR_PAIR(1) );
}
}
}
else
{
wattron( display, COLOR_PAIR(1) );
mvwaddch( display, x, y, 32 );
wattroff( display, COLOR_PAIR(1) );
}
//this erases what FOV does, so it can done again
t->setFlag(-SEEN);
}
frameRow++;
frameCol=tCol;
}
}
void UI::centerFrame( int key )
{
// decreasing far-enough will not move display with player
int farEnoughRow = ((DISP_HEIGHT) / 2);
int farEnoughCol = (DISP_WIDTH) / 2;
int pRow = ( world->getPlayer() )->getRow();
int pCol = ( world->getPlayer() )->getCol();
tCol = pCol - farEnoughCol;
bCol = pCol + farEnoughCol;
tRow = pRow - farEnoughRow;
bRow = pRow+2 + farEnoughRow;
bindFrame();
return;
}
void UI::getInput()
{
int c, r, a;
bool dirty;
while ( (a=getch()) != KEY_F(10) ) {
mvprintw (3, 62, "%s", " ");
mvprintw (4, 62, "%s", " ");
mvprintw (5, 62, "%s", " ");
mvprintw (6, 62, "%s", " ");
mvprintw (7, 62, "%s", " ");
mvprintw (8, 62, "%s", " ");
dirty = false;
switch( a )
{
case HOME_NUMPAD: //NW KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()-1,
( world->getPlayer() )->getCol()-1, 0 );
break;
}
case UP_NUMPAD: //N KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()-1,
( world->getPlayer() )->getCol(), 0 );
break;
}
case UP_KEY: //N KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()-1,
( world->getPlayer() )->getCol(), 0 );
break;
}
case PGUP_NUMPAD: //NE KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()-1,
( world->getPlayer() )->getCol()+1, 0 );
break;
}
case LEFT_NUMPAD: //W KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow(),
( world->getPlayer() )->getCol()-1, 0 );
break;
}
case LEFT_KEY: //W KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow(),
( world->getPlayer() )->getCol()-1, 0 );
break;
}
case RIGHT_NUMPAD: //E KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow(),
( world->getPlayer() )->getCol()+1, 0 );
break;
}
case RIGHT_KEY: //E KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow(),
( world->getPlayer() )->getCol()+1, 0 );
break;
}
case END_NUMPAD: //SW KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()+1,
( world->getPlayer() )->getCol()-1, 0 );
break;
}
case DOWN_NUMPAD: //S KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()+1,
( world->getPlayer() )->getCol(), 0 );
break;
}
case DOWN_KEY: //S KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()+1,
( world->getPlayer() )->getCol(), 0 );
break;
}
case PGDN_NUMPAD: //SE KEY_PAD
{
dirty = world->movePlayer( ( world->getPlayer() )->getRow()+1,
( world->getPlayer() )->getCol()+1, 0 );
break;
}
case CENTER_NUMPAD: //CENTER KEY_PAD
{
centerFrame( UP_KEY );
centerFrame( DOWN_KEY );
centerFrame( LEFT_KEY );
centerFrame( RIGHT_KEY );
dirty = true;
break;
}
case M_KEY: // tile averaged-centered map
{
int frameSize = 4;
generatePlayerMap( frameSize );
wrefresh( display );
while( getch() == M_KEY )
{
frameSize = frameSize * 2;
generatePlayerMap( frameSize );
wrefresh( display );
if( frameSize == 32 )
{
dirty = true;
world->movePlayer( ( world->getPlayer() )->getRow(),( world->getPlayer() )->getCol(), 0 );
break;
}
}
dirty = true;
world->movePlayer( ( world->getPlayer() )->getRow(),( world->getPlayer() )->getCol(), 0 );
break;
}
}// end switch
int pRow = (world->getPlayer())->getRow();
mvprintw (4, 62, "Calc bRow %d", ((pRow +2) +12) );
mvprintw (3, 62, "Calc tRow %d", ((pRow ) -12) );
mvprintw (5, 63, "tR %d", tRow );
mvprintw (7, 63, "tC %d", tCol );
mvprintw (6, 63, "bR %d", bRow );
mvprintw (8, 63, "bC %d", bCol );
if( dirty ) centerFrame( a );
if( dirty ) refreshPlayWindow();
if( dirty ) refreshDisplay();
} // end while
}
void UI::generatePlayerMap( int frSize )
{
int frRow = (world->getPlayer())->getRow();
int frCol = (world->getPlayer())->getCol();
while( frRow % frSize != 0 )
{
frRow = frRow - 1;
}
while( frCol % frSize != 0 )
{
frCol = frCol - 1;
}
int row = frRow - ((DISP_HEIGHT)/2)*frSize;
int col = frCol - ((DISP_WIDTH)/2)*frSize;
int walls;
bool seen;
Tile * t;
for (int x = 0; x < DISP_HEIGHT; x++)
{
for (int y = 0; y < DISP_WIDTH; y++)
{
walls = 0;
seen = false;
for (int r = 0; r < frSize; r++)
{
for (int c = 0; c < frSize; c++)
{
if( (world->getLevel(0))->inBounds( row+r, col+c ) )
{
t = world->getTile( row+r, col+c );
if( (t->getFlags()&IMPASSABLE) == IMPASSABLE )
walls++;
if( (t->getFlags()&PLAYER) == PLAYER )
walls+=10000;
if( (t->getFlags()&VISITED) == VISITED )
seen = true;
}
}
}
if( seen )
{
if( walls >= 10000 )
{
wattron( display, COLOR_PAIR(1)|A_REVERSE );
mvwaddch( display, x, y, 64 );
wattroff( display, COLOR_PAIR(1)|A_REVERSE );
}
else if( walls == (16) )
{
wattron( display, COLOR_PAIR(9) );
mvwaddch( display, x, y, 32 );
wattroff( display, COLOR_PAIR(9) );
}
else if(walls > (int)(((double)(16))*(.75)))
{
wattron( display, COLOR_PAIR(9) );
mvwaddch( display, x, y, 176 );
wattroff( display, COLOR_PAIR(9) );
}
else if(walls > (int)(((double)(16))*(.5)))
{
wattron( display, COLOR_PAIR(9) );
mvwaddch( display, x, y, 177 );
wattroff( display, COLOR_PAIR(9) );
}
else if(walls > (int)(((double)(16))*(.25)))
{
wattron( display, COLOR_PAIR(9) );
mvwaddch( display, x, y, 178 );
wattroff( display, COLOR_PAIR(9) );
}
else
{
wattron( display, COLOR_PAIR(0) );
mvwaddch( display, x, y, 219 );
wattroff( display, COLOR_PAIR(0) );
}
}
else // not seen by player
{
wattron( display, COLOR_PAIR(1) );
mvwaddch( display, x, y, 219 );
wattroff( display, COLOR_PAIR(1) );
}
col += frSize;
}
col = frCol - (DISP_WIDTH/2)*frSize;
row += frSize;
}
}
void UI::refreshDisplay()
{
wrefresh( display );
}
/////////////////////////////////////////////
///// END UI.CPP ///////////////////////
/////////////////////////////////////////////
Please, if you know ncurses and Zs, and you like helping people, help me at this dire hour.
Andres