void save_keybindings(struct World *);
int get_action_key (struct KeyBinding *, char *);
char * get_keyname(int);
+void move_player (struct World *, char);
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.
void draw_log (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); }
+ struct World * world = (struct World *) win->data;
+ draw_text_from_bottom(win, world->log); }
void draw_map (struct Win * win) {
// Draw map determined by win->data Map struct into window. Respect offset.
void draw_info (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;
+ 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); }
sprintf(keyname, "(unknown)");
return keyname; }
+void move_player (struct World * world, char d) {
+// Move player in direction d, increment turn counter and update log.
+ update_info (world);
+ char success = 0;
+ char * dir;
+ char * msg = calloc(25, sizeof(char));
+ if ('s' == d) {
+ dir = "south";
+ if (world->player->y < world->map->height - 1) {
+ world->player->y++;
+ success = 1; } }
+ else if ('n' == d) {
+ dir = "north";
+ if (world->player->y > 0) {
+ world->player->y--;
+ success = 1; } }
+ else if ('w' == d) {
+ dir = "west";
+ if (world->player->x > 0) {
+ world->player->x--;
+ success = 1; } }
+ else if ('e' == d) {
+ dir = "east";
+ if (world->player->x < world->map->width - 1) {
+ world->player->x++;
+ success = 1; } }
+ char * msg_content = "You fail to move";
+ if (success)
+ msg_content = "You move";
+ sprintf(msg, "\n%s %s.", msg_content, dir);
+ update_log (world, msg);
+ free(msg); }
+
int main () {
struct World world;
init_keybindings(&world);
struct Win win_keys = init_window(&win_meta, "Keys");
win_keys.draw = draw_keys_window;
win_keys.data = &world;
-
struct Win win_map = init_window(&win_meta, "Map");
win_map.draw = draw_map;
win_map.data = &world;
-
struct Win win_info = init_window(&win_meta, "Info");
win_info.draw = draw_info;
win_info.data = &world;
-
struct Win win_log = init_window(&win_meta, "Log");
win_log.draw = draw_log;
win_log.data = &world;
map.offset_x++;
else if (key == get_action_key(world.keybindings, "map left") && map.offset_x > 0)
map.offset_x--;
- else if (key == get_action_key(world.keybindings, "player down") && player.y < map.height - 1) {
- update_info (&world);
- update_log (&world, "\nYou move south.");
- player.y++; }
- else if (key == get_action_key(world.keybindings, "player up") && player.y > 0) {
- update_info (&world);
- update_log (&world, "\nYou move north.");
- player.y--; }
- else if (key == get_action_key(world.keybindings, "player right") && player.x < map.width - 1) {
- update_info (&world);
- update_log (&world, "\nYou move east.");
- player.x++; }
- else if (key == get_action_key(world.keybindings, "player left") && player.x > 0) {
- update_info (&world);
- update_log (&world, "\nYou move west.");
- player.x--; }
+ else if (key == get_action_key(world.keybindings, "player down"))
+ move_player(&world, 's');
+ else if (key == get_action_key(world.keybindings, "player up"))
+ move_player(&world, 'n');
+ else if (key == get_action_key(world.keybindings, "player right"))
+ move_player(&world, 'e');
+ else if (key == get_action_key(world.keybindings, "player left"))
+ move_player(&world, 'w');
else if (key == get_action_key(world.keybindings, "wait") ) {
update_info (&world);
update_log (&world, "\nYou wait."); } }