From a470e49ace2874380e6018a6166dd2a61e3c689c Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 23 May 2013 11:34:53 +0200 Subject: [PATCH] Moved draw_*_win() into its own library. Removed some unneeded libray includes. --- Makefile | 3 +- draw_wins.c | 132 +++++++++++++++++++++++++++++++++++++ draw_wins.h | 6 ++ draw_wins.o | Bin 0 -> 13352 bytes roguelike.c | 185 +--------------------------------------------------- 5 files changed, 142 insertions(+), 184 deletions(-) create mode 100644 draw_wins.c create mode 100644 draw_wins.h create mode 100644 draw_wins.o 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 0000000000000000000000000000000000000000..e373125946f0d58d764e68c335c72ff349bcb793 GIT binary patch literal 13352 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 #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. -- 2.30.2