You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							222 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
	
	
							222 lines
						
					
					
						
							4.7 KiB
						
					
					
				#include <cstdio> | 
						|
 | 
						|
#include "gamestate.h" | 
						|
#include "window.h" | 
						|
 | 
						|
Window::Window(int rows, int cols, int y, int x) : | 
						|
	rows(rows), | 
						|
	cols(cols), | 
						|
	y(0), | 
						|
	x(0), | 
						|
	window(newwin(rows, cols, y, x)) { | 
						|
} | 
						|
 | 
						|
Window::~Window() { | 
						|
	delwin(this->window); | 
						|
} | 
						|
 | 
						|
void Window::initialize() { | 
						|
	// Start curses mode | 
						|
	initscr(); | 
						|
	// Disable line buffering | 
						|
	cbreak(); | 
						|
	// Enable reading of function keys | 
						|
	keypad(stdscr, TRUE); | 
						|
	// Dont echo while reading input | 
						|
	noecho(); | 
						|
	// Disable cursor visibility | 
						|
	curs_set(0); | 
						|
 | 
						|
	// If terminal supports colors | 
						|
	if(!has_colors()) { | 
						|
		printw("Your terminal does not support color\n"); | 
						|
	} | 
						|
	else { | 
						|
		start_color(); | 
						|
		use_default_colors(); | 
						|
 | 
						|
		init_pair(PAIR_WHITE_BLACK, COLOR_WHITE, COLOR_BLACK); | 
						|
		init_pair(PAIR_WHITE_BRIGHT_BLACK, COLOR_WHITE_BRIGHT, COLOR_BLACK); | 
						|
		init_pair(PAIR_RED_BLACK, COLOR_RED, COLOR_BLACK); | 
						|
		init_pair(PAIR_BLUE_BLACK, COLOR_BLUE, COLOR_BLACK); | 
						|
		init_pair(PAIR_GRAY_BLACK_BRIGHT, COLOR_GRAY, COLOR_BLACK_BRIGHT); | 
						|
	} | 
						|
 | 
						|
	// Add bright colors, intensity range: 0-1000 | 
						|
	if(!can_change_color()) { | 
						|
		printw("Your terminal does not support changing colors\n"); | 
						|
	} | 
						|
	else { | 
						|
		init_color(COLOR_BLACK,             0,    0,    0); | 
						|
		init_color(COLOR_WHITE,           680,  680,  680); | 
						|
		init_color(COLOR_GRAY,            380,  380,  380); | 
						|
 | 
						|
		init_color(COLOR_BLACK_BRIGHT,    110,  110,  110); //   0,   0,   0 | 
						|
		init_color(COLOR_RED_BRIGHT,      900,    0,    0); // 680,   0,   0 | 
						|
		init_color(COLOR_GREEN_BRIGHT,      0,  900,    0); //   0, 680,   0 | 
						|
		init_color(COLOR_YELLOW_BRIGHT,   900,  900,    0); // 680, 680,   0 | 
						|
		init_color(COLOR_BLUE_BRIGHT,       0,    0,  900); //   0,   0, 680 | 
						|
		init_color(COLOR_MAGENTA_BRIGHT,  900,    0,  900); // 680,   0, 680 | 
						|
		init_color(COLOR_CYAN_BRIGHT,       0,  900,  900); //   0, 680, 680 | 
						|
		init_color(COLOR_WHITE_BRIGHT,    900,  900,  900); // 680, 680, 680 | 
						|
	} | 
						|
} | 
						|
 | 
						|
void Window::update() { | 
						|
	Window::getMaXYZ(stdscr, this->maxRows, this->maxCols); | 
						|
} | 
						|
 | 
						|
void Window::render() { | 
						|
	box(this->window, 0, 0); | 
						|
	wrefresh(this->window); | 
						|
} | 
						|
 | 
						|
void Window::destroy() { | 
						|
	// Restore line buffering | 
						|
	nocbreak(); | 
						|
	// Restore cursor | 
						|
	curs_set(1); | 
						|
	// End curses mode | 
						|
	endwin(); | 
						|
} | 
						|
 | 
						|
void Window::clear() { | 
						|
	this->setYX(0, 0); | 
						|
 | 
						|
	// Set background color | 
						|
	// wbkgdset(this->window, COLOR_PAIR(3)); | 
						|
 | 
						|
	// Copy blanks to every position in the window, clearing the screen | 
						|
	werase(this->window); | 
						|
} | 
						|
 | 
						|
void Window::resize() { | 
						|
	wresize(this->window, this->rows, this->cols); | 
						|
	mvwin(this->window, this->y, this->x); | 
						|
} | 
						|
 | 
						|
void Window::print(std::string str, char newLine) { | 
						|
	this->print(str, this->y, this->x); | 
						|
	this->x += str.length(); | 
						|
	if (newLine == 1) { | 
						|
		this->x = 0; | 
						|
		this->y++; | 
						|
	} | 
						|
} | 
						|
 | 
						|
void Window::print(std::string str, int y, int x) { | 
						|
	this->y = y; | 
						|
	this->x = x; | 
						|
	mvwprintw(this->window, y + 1, x + 1, str.c_str()); | 
						|
} | 
						|
 | 
						|
void Window::print(std::string str, int y, int x, int attribute) { | 
						|
	wattron(this->window, attribute); | 
						|
	this->print(str, y, x); | 
						|
	wattroff(this->window, attribute); | 
						|
} | 
						|
 | 
						|
void Window::printCenter(std::string str) { | 
						|
	int halfBoard = this->cols / 2; | 
						|
	int halfStr = str.length() / 2; | 
						|
	this->print(str, this->y, halfBoard - halfStr - 1); | 
						|
} | 
						|
 | 
						|
void Window::printCenter(std::string str, int attribute) { | 
						|
	wattron(this->window, attribute); | 
						|
	this->printCenter(str); | 
						|
	wattroff(this->window, attribute); | 
						|
} | 
						|
 | 
						|
void Window::printSide(std::string left, std::string right) { | 
						|
	this->print(left, this->y, 1); | 
						|
	this->print(right, this->y, this->cols - right.length() - 3); | 
						|
} | 
						|
 | 
						|
void Window::getYX(int &y, int &x) { | 
						|
	getyx(this->window, y, x); | 
						|
} | 
						|
 | 
						|
void Window::setYX(int y, int x) { | 
						|
	this->y = y; | 
						|
	this->x = x; | 
						|
	wmove(this->window, y, x); | 
						|
} | 
						|
 | 
						|
void Window::getMaXYZ(int &rows, int &cols) { | 
						|
	getmaxyx(this->window, rows, cols); | 
						|
} | 
						|
 | 
						|
void Window::getMaXYZ(WINDOW *window, int &rows, int &cols) { | 
						|
	getmaxyx(window, rows, cols); | 
						|
} | 
						|
 | 
						|
std::string Window::getStr() { | 
						|
	curs_set(1); | 
						|
	echo(); | 
						|
	char *tmp = new char(); | 
						|
	wgetstr(this->window, tmp); | 
						|
	noecho(); | 
						|
	curs_set(0); | 
						|
	return std::string(tmp); | 
						|
} | 
						|
 | 
						|
int Window::getMaxRows() { | 
						|
	return this->maxRows; | 
						|
} | 
						|
 | 
						|
int Window::getMaxCols() { | 
						|
	return this->maxCols; | 
						|
} | 
						|
 | 
						|
int Window::getRows() { | 
						|
	return this->rows; | 
						|
} | 
						|
 | 
						|
void Window::setRows(int rows) { | 
						|
	this->rows = rows; | 
						|
} | 
						|
 | 
						|
int Window::getCols() { | 
						|
	return this->cols; | 
						|
} | 
						|
 | 
						|
void Window::setCols(int cols) { | 
						|
	this->cols = cols; | 
						|
} | 
						|
 | 
						|
int Window::getY() { | 
						|
	return this->y; | 
						|
} | 
						|
 | 
						|
void Window::setY(int y) { | 
						|
	this->y = y; | 
						|
} | 
						|
 | 
						|
int Window::getX() { | 
						|
	return this->x; | 
						|
} | 
						|
 | 
						|
void Window::setX(int x) { | 
						|
	this->x = x; | 
						|
} | 
						|
 | 
						|
void Window::setWindow(int rows, int cols, int y, int x) { | 
						|
	this->setRows(rows); | 
						|
	this->setCols(cols); | 
						|
	this->setY(y); | 
						|
	this->setX(x); | 
						|
	if (this->window == nullptr) { | 
						|
		this->window = newwin(rows, cols, y, x); | 
						|
	} | 
						|
} | 
						|
 | 
						|
//----------------------------------------------------------------------------// | 
						|
 | 
						|
Window::Window() : | 
						|
	rows(0), | 
						|
	cols(0), | 
						|
	y(0), | 
						|
	x(0), | 
						|
	window(nullptr) { | 
						|
}
 | 
						|
 |