From: Christian Heller Date: Thu, 23 May 2013 09:34:53 +0000 (+0200) Subject: Moved draw_*_win() into its own library. Removed some unneeded libray includes. X-Git-Tag: tce~1281 X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/static/%7B%7Bprefix%7D%7D/task?a=commitdiff_plain;h=a470e49ace2874380e6018a6166dd2a61e3c689c;p=plomrogue Moved draw_*_win() into its own library. Removed some unneeded libray includes. --- diff --git a/Makefile b/Makefile index 0bcd8e8..5b7f7d9 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ roguelike: cc -Wall -g -o windows.o -c windows.c + cc -Wall -g -o draw_wins.o -c draw_wins.c cc -Wall -g -o roguelike.o -c roguelike.c - cc -Wall -g -o roguelike windows.o roguelike.o -lncurses + cc -Wall -g -o roguelike windows.o draw_wins.o roguelike.o -lncurses clean: rm *.o; rm roguelike diff --git a/draw_wins.c b/draw_wins.c new file mode 100644 index 0000000..3eaf491 --- /dev/null +++ b/draw_wins.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include "windows.h" +#include "roguelike.h" + +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; + char fin = 0; + int z = -1; + for (y = start_y; y < win->height; y++) { + if (0 == fin) + toggle = 0; + for (x = 0; x < win->width; x++) { + if (0 == toggle) { + z++; + if ('\n' == text[z]) { + toggle = 1; + continue; } + else + mvwaddch(win->curses, y, x, text[z]); + if ('\n' == text[z+1]) { + z++; + toggle = 1; } + else if (0 == text[z+1]) { + toggle = 1; + fin = 1; } } } } } + +void draw_text_from_bottom (struct Win * win, char * text) { +// Draw text from end/bottom to the top. + char toggle = 0; + int x, y, offset; + int z = -1; + for (y = 0; 0 == toggle; y++) // Determine number of lines text would have in + for (x = 0; x < win->width; x++) { // a window of available width, but infinite height. + z++; + if ('\n' == text[z]) // Treat \n and \0 as control characters for incrementing y and stopping + break; // the loop. Make sure they don't count as cell space themselves. + if ('\n' == text[z+1]) { + z++; + break; } + else if (0 == text[z+1]) { + toggle = 1; + break; } } + z = -1; + int start_y = 0; + if (y < win->height) // Depending on what is bigger, determine start point in window or in text. + start_y = win->height - y; + else if (y > win->height) { + offset = y - win->height; + for (y = 0; y < offset; y++) + for (x = 0; x < win->width; 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_log_win (struct Win * win) { +// Draw log text from world struct in win->data from bottom to top. + struct World * world = (struct World *) win->data; + draw_text_from_bottom(win, world->log); } + +void draw_map_win (struct Win * win) { +// Draw map determined by win->data Map struct into window. Respect offset. + struct World * world = (struct World *) win->data; + struct Map * map = world->map; + struct Player * player = world->player; + struct Monster * monster = world->monster; + 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 < win->height; y++) { + z = map->offset_x + (map->offset_y + y) * (map->width); + for (x = 0; x < win->width; x++) { + if (y < height_map_av && x < width_map_av) { + if (z == (map->width * player->y) + player->x) + mvwaddch(win->curses, y, x, '@'); + else if (z == (map->width * monster->y) + monster->x) + mvwaddch(win->curses, y, x, 'M'); + else + mvwaddch(win->curses, y, x, cells[z]); + z++; } } } } + +void draw_info_win (struct Win * win) { +// Draw info window by appending win->data integer value to "Turn: " display. + struct World * world = (struct World *) win->data; + int count = world->turn; + char text[100]; + snprintf(text, 100, "Turn: %d", count); + draw_with_linebreaks(win, text, 0); } + +void draw_keys_win (struct Win * win) { +// Draw keybinding window. + struct World * world = (struct World *) win->data; + struct KeysWinData * keyswindata = (struct KeysWinData *) world->keyswindata; + struct KeyBinding * keybindings = world->keybindings; + int offset = 0; + if (keyswindata->max >= win->height) { + if (keyswindata->select > win->height / 2) { + if (keyswindata->select < (keyswindata->max - (win->height / 2))) + offset = keyswindata->select - (win->height / 2); + else + offset = keyswindata->max - win->height + 1; } } + int keydescwidth = 9 + 1; // max length assured by get_keyname() + \0 + char * keydesc = malloc(keydescwidth); + attr_t attri; + int y, x; + char * keyname; + for (y = 0; y <= keyswindata->max && y < win->height; y++) { + attri = 0; + if (y == keyswindata->select - offset) { + attri = A_REVERSE; + if (1 == keyswindata->edit) + attri = attri | A_BLINK; } + keyname = get_keyname(keybindings[y + offset].key); + snprintf(keydesc, keydescwidth, "%-9s", keyname); + free(keyname); + for (x = 0; x < win->width; x++) + if (x < strlen(keydesc)) + mvwaddch(win->curses, y, x, keydesc[x] | attri); + else if (strlen(keydesc) < x && x < strlen(keybindings[y + offset].name) + strlen(keydesc) + 1) + mvwaddch(win->curses, y, x, keybindings[y + offset].name[x - strlen(keydesc) - 1] | attri); + else + mvwaddch(win->curses, y, x, ' ' | attri); } + free(keydesc); } diff --git a/draw_wins.h b/draw_wins.h new file mode 100644 index 0000000..39c5ce9 --- /dev/null +++ b/draw_wins.h @@ -0,0 +1,6 @@ +void draw_with_linebreaks (struct Win *, char *, int); +void draw_text_from_bottom (struct Win *, char *); +void draw_log_win (struct Win *); +void draw_map_win (struct Win *); +void draw_info_win (struct Win *); +void draw_keys_win (struct Win *); diff --git a/draw_wins.o b/draw_wins.o new file mode 100644 index 0000000..e373125 Binary files /dev/null and b/draw_wins.o differ diff --git a/roguelike.c b/roguelike.c index e387daf..8235d7c 100644 --- a/roguelike.c +++ b/roguelike.c @@ -1,190 +1,9 @@ #include #include -#include #include #include "windows.h" - -struct World { - struct KeyBinding * keybindings; - struct KeysWinData * keyswindata; - int turn; - char * log; - struct Map * map; - struct Monster * monster; - struct Player * player; }; - -struct KeyBinding { - char * name; - int key; }; - -struct KeysWinData { - int max; - char edit; - int select; }; - -struct Map { - int width; - int height; - int offset_x; - int offset_y; - char * cells; }; - -struct Player { - int y; - int x; }; - -struct Monster { - int y; - int x; }; - -void draw_with_linebreaks (struct Win *, char *, int); -void draw_text_from_bottom (struct Win *, char *); -void draw_log_win (struct Win *); -void draw_map_win (struct Win *); -void draw_info_win (struct Win *); -void draw_keys_win (struct Win *); -void toggle_window (struct WinMeta *, struct Win *); -void growshrink_active_window (struct WinMeta *, char); -void init_keybindings(struct World *); -struct Map init_map (); -void map_scroll (struct Map *, char); -void next_turn (struct World *); -void update_log (struct World *, char *); -void save_keybindings(struct World *); -int get_action_key (struct KeyBinding *, char *); -char * get_keyname(int); -void keyswin_mod_key (struct World *, struct WinMeta *); -void keyswin_move_selection (struct World *, char); -char is_passable (struct World *, int, int); -void move_player (struct World *, char); -void player_wait(struct World *); - -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; - char fin = 0; - int z = -1; - for (y = start_y; y < win->height; y++) { - if (0 == fin) - toggle = 0; - for (x = 0; x < win->width; x++) { - if (0 == toggle) { - z++; - if ('\n' == text[z]) { - toggle = 1; - continue; } - else - mvwaddch(win->curses, y, x, text[z]); - if ('\n' == text[z+1]) { - z++; - toggle = 1; } - else if (0 == text[z+1]) { - toggle = 1; - fin = 1; } } } } } - -void draw_text_from_bottom (struct Win * win, char * text) { -// Draw text from end/bottom to the top. - char toggle = 0; - int x, y, offset; - int z = -1; - for (y = 0; 0 == toggle; y++) // Determine number of lines text would have in - for (x = 0; x < win->width; x++) { // a window of available width, but infinite height. - z++; - if ('\n' == text[z]) // Treat \n and \0 as control characters for incrementing y and stopping - break; // the loop. Make sure they don't count as cell space themselves. - if ('\n' == text[z+1]) { - z++; - break; } - else if (0 == text[z+1]) { - toggle = 1; - break; } } - z = -1; - int start_y = 0; - if (y < win->height) // Depending on what is bigger, determine start point in window or in text. - start_y = win->height - y; - else if (y > win->height) { - offset = y - win->height; - for (y = 0; y < offset; y++) - for (x = 0; x < win->width; 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_log_win (struct Win * win) { -// Draw log text from world struct in win->data from bottom to top. - struct World * world = (struct World *) win->data; - draw_text_from_bottom(win, world->log); } - -void draw_map_win (struct Win * win) { -// Draw map determined by win->data Map struct into window. Respect offset. - struct World * world = (struct World *) win->data; - struct Map * map = world->map; - struct Player * player = world->player; - struct Monster * monster = world->monster; - 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 < win->height; y++) { - z = map->offset_x + (map->offset_y + y) * (map->width); - for (x = 0; x < win->width; x++) { - if (y < height_map_av && x < width_map_av) { - if (z == (map->width * player->y) + player->x) - mvwaddch(win->curses, y, x, '@'); - else if (z == (map->width * monster->y) + monster->x) - mvwaddch(win->curses, y, x, 'M'); - else - mvwaddch(win->curses, y, x, cells[z]); - z++; } } } } - -void draw_info_win (struct Win * win) { -// Draw info window by appending win->data integer value to "Turn: " display. - struct World * world = (struct World *) win->data; - int count = world->turn; - char text[100]; - snprintf(text, 100, "Turn: %d", count); - draw_with_linebreaks(win, text, 0); } - -void draw_keys_win (struct Win * win) { -// Draw keybinding window. - struct World * world = (struct World *) win->data; - struct KeysWinData * keyswindata = (struct KeysWinData *) world->keyswindata; - struct KeyBinding * keybindings = world->keybindings; - int offset = 0; - if (keyswindata->max >= win->height) { - if (keyswindata->select > win->height / 2) { - if (keyswindata->select < (keyswindata->max - (win->height / 2))) - offset = keyswindata->select - (win->height / 2); - else - offset = keyswindata->max - win->height + 1; } } - int keydescwidth = 9 + 1; // max length assured by get_keyname() + \0 - char * keydesc = malloc(keydescwidth); - attr_t attri; - int y, x; - char * keyname; - for (y = 0; y <= keyswindata->max && y < win->height; y++) { - attri = 0; - if (y == keyswindata->select - offset) { - attri = A_REVERSE; - if (1 == keyswindata->edit) - attri = attri | A_BLINK; } - keyname = get_keyname(keybindings[y + offset].key); - snprintf(keydesc, keydescwidth, "%-9s", keyname); - free(keyname); - for (x = 0; x < win->width; x++) - if (x < strlen(keydesc)) - mvwaddch(win->curses, y, x, keydesc[x] | attri); - else if (strlen(keydesc) < x && x < strlen(keybindings[y + offset].name) + strlen(keydesc) + 1) - mvwaddch(win->curses, y, x, keybindings[y + offset].name[x - strlen(keydesc) - 1] | attri); - else - mvwaddch(win->curses, y, x, ' ' | attri); } - free(keydesc); } +#include "draw_wins.h" +#include "roguelike.h" void toggle_window (struct WinMeta * win_meta, struct Win * win) { // Toggle display of window win.