-
-struct Map {
- int width;
- int height;
- int offset_x;
- int offset_y;
- int player_x;
- int player_y;
- char * cells; };
-
-void draw_with_linebreaks (struct Win * win, char * text, int start_y) {
-// Write text into window content space. Start on row start_y. Fill unused rows with whitespace.
- int x, y;
- char toggle;
- int height_av = win->height - 1;
- int width_av = win->width - 1;
- char fin = 0;
- int z = -1;
- for (y = start_y; y < height_av; y++) {
- if (0 == fin)
- toggle = 0;
- for (x = 0; x < width_av; x++) {
- if (0 == toggle) {
- z++;
- if ('\n' == text[z]) {
- mvwaddch(win->curses_win, y+1, x+win->border_left, ' ');
- toggle = 1;
- continue; }
- else
- mvwaddch(win->curses_win, y+1, x+win->border_left, text[z]);
- if ('\n' == text[z+1]) {
- z++;
- toggle = 1; }
- else if (0 == text[z+1]) {
- toggle = 1;
- fin = 1; } }
- else
- mvwaddch(win->curses_win, y+1, x+win->border_left, ' '); } } }
-
-void draw_text_from_bottom (struct Win * win) {
-// Draw text in win->data from end/bottom to the top.
- char * text = (char *) win->data;
- int width_av = win->width - 1;
- int height_av = win->height - 1;
- char toggle = 0;
- int x, y, offset;
- int z = -1;
- for (y = 0; 0 == toggle; y++) // Determine number of lines text would have in a window of available
- for (x = 0; x < width_av; x++) { // width, but infinite height.
- z++;
- if ('\n' == text[z]) // Treat \n and \0 as control characters for incrementing y and
- break; // stopping the loop. Make sure they don't count as cell space
- if ('\n' == text[z+1]) { // themselves.
- z++;
- break; }
- else if (0 == text[z+1]) {
- toggle = 1;
- break; } }
- z = -1;
- int start_y = 0;
- if (y < height_av) { // Depending on what is bigger, determine start point in window or in text.
- start_y = height_av - y;
- for (y = 0; y < start_y; y++)
- for (x = 0; x < width_av; x++)
- mvwaddch(win->curses_win, y+1, x+win->border_left, ' '); }
- else if (y > height_av) {
- offset = y - height_av;
- for (y = 0; y < offset; y++)
- for (x = 0; x < width_av; x++) {
- z++;
- if ('\n' == text[z])
- break;
- if ('\n' == text[z+1]) {
- z++;
- break; } }
- text = text + (sizeof(char) * (z + 1)); }
- draw_with_linebreaks(win, text, start_y); }
-
-void draw_map (struct Win * win) {
-// Draw map determined by win->data Map struct into window. Respect offset.
- int height_av = win->height - 1;
- int width_av = win->width - 1;
- struct Map map = * (struct Map *) win->data;
- char * cells = map.cells;
- int width_map_av = map.width - map.offset_x;
- int height_map_av = map.height - map.offset_y;
- int x, y, z;
- for (y = 0; y < height_av; y++) {
- z = map.offset_x + (map.offset_y + y) * (map.width);
- for (x = 0; x < width_av; x++) {
- if (y < height_map_av && x < width_map_av) {
- if (z == (map.width * map.player_y) + map.player_x)
- mvwaddch(win->curses_win, y+1, x+win->border_left, '@');
- else
- mvwaddch(win->curses_win, y+1, x+win->border_left, cells[z]);
- z++; }
- else
- mvwaddch(win->curses_win, y+1, x+win->border_left, ' '); } } }
-
-void draw_info (struct Win * win) {
-// Draw info window by appending win->data integer value to "Turn: " display.
- int count = * (int *) win->data;
- char text[100];
- snprintf(text, 100, "Turn: %d", count);
- draw_with_linebreaks(win, text, 0); }