--- /dev/null
+1 quit quit
+2 save_keys save keys
+3 scrl_l scroll pad left
+4 scrl_r scroll pad right
+5 keys_d keys nav down
+6 keys_u keys nav up
+7 keys_m keys mod
+8 to_keywin toggle keys window
+9 to_mapwin toggle map window
+10 to_infowin toggle info window
+11 to_logwin toggle log window
+12 cyc_win_f cycle forwards
+13 cyc_win_b cycle backwards
+14 shift_f shift forwards
+15 shift_b shift backwards
+16 grow_h grow horizontally
+17 shri_h shrink horizontally
+18 grow_v grow vertically
+19 shri_v shrink vertically
+20 map_u map up
+21 map_d map down
+22 map_l map left
+23 map_r map right
+24 map_c map center player
+25 player_u player up
+26 player_d player down
+27 player_l player left
+28 player_r player right
+29 wait wait / next turn
-81 quit
-75 save keys
-260 scroll pad left
-261 scroll pad right
-258 keys nav down
-259 keys nav up
-10 keys mod
-265 toggle keys window
-266 toggle map window
-267 toggle info window
-268 toggle log window
-62 cycle forwards
-60 cycle backwards
-121 shift forwards
-89 shift backwards
-42 grow horizontally
-95 shrink horizontally
-43 grow vertically
-45 shrink vertically
-119 map up
-120 map down
-97 map left
-100 map right
-115 map center player
-87 player up
-88 player down
-65 player left
-68 player right
-83 wait / next turn
+90 quit
+75 save_keys
+260 scrl_l
+261 scrl_r
+258 keys_d
+259 keys_u
+10 keys_m
+265 to_keywin
+266 to_mapwin
+267 to_infowin
+268 to_logwin
+62 cyc_win_f
+60 cyc_win_b
+121 shift_f
+89 shift_b
+42 grow_h
+95 shri_h
+43 grow_v
+45 shri_v
+119 map_u
+120 map_d
+97 map_l
+100 map_r
+115 map_c
+87 player_u
+88 player_d
+65 player_l
+68 player_r
+83 wait
--- /dev/null
+/* command.c */
+
+#include "command_db.h"
+#include <stdlib.h> /* for malloc() */
+#include <stdio.h> /* for FILE typedef, fopen(), fclose(), fgets() */
+#include <stdint.h> /* for uint8_t */
+#include <string.h> /* for strlen(), strtok() */
+#include "main.h" /* for World struct */
+#include "rexit.h" /* for exit_err() */
+#include "misc.h" /* for textfile_sizes() */
+
+
+
+/* Build string pointed to by "ch_ptr" from next token delimited by "delim",
+ * exit_err() with "err" as error message on malloc() failure.
+ */
+static void copy_tokenized_string(struct World * world,
+ char ** ch_ptr, char * delim, char * err)
+{
+ char * dsc_ptr = strtok(NULL, delim);
+ * ch_ptr = malloc(strlen(dsc_ptr) + 1);
+ exit_err(NULL == * ch_ptr, world, err);
+ memcpy(* ch_ptr, dsc_ptr, strlen(dsc_ptr) + 1);
+}
+
+
+
+extern char * get_command_longdsc(struct World * world, char * dsc_short)
+{
+ struct Command * cmd_ptr = world->cmd_db->cmds;
+ while (1)
+ {
+ if (0 == strcmp(dsc_short, cmd_ptr->dsc_short))
+ {
+ return cmd_ptr->dsc_long;
+ }
+ cmd_ptr = &cmd_ptr[1];
+ }
+}
+
+
+
+extern void init_command_db(struct World * world)
+{
+ char * err = "Trouble in init_cmds() with fopen() on file 'commands'.";
+ FILE * file = fopen("config/commands", "r");
+ exit_err(NULL == file, world, err);
+ uint16_t lines, linemax;
+ textfile_sizes(file, &linemax, &lines);
+ err = "Trouble in init_cmds() with malloc().";
+ char * line = malloc(linemax);
+ exit_err(NULL == line, world, err);
+ struct Command * cmds = malloc(lines * sizeof(struct Command));
+ exit_err(NULL == line, world, err);
+ uint8_t i = 0;
+ while (fgets(line, linemax, file))
+ {
+ cmds[i].id = atoi(strtok(line, " "));
+ copy_tokenized_string(world, &cmds[i].dsc_short, " ", err);
+ copy_tokenized_string(world, &cmds[i].dsc_long, "\n", err);
+ i++;
+ }
+ world->cmd_db = malloc(sizeof(struct CommandDB));
+ world->cmd_db->cmds = cmds;
+ world->cmd_db->n = lines;
+ err = "Trouble in init_cmds() with fclose() on file 'commands'.";
+ exit_err(fclose(file), world, err);
+}
+
+
+
+extern void free_command_db(struct World * world)
+{
+ uint8_t i = 0;
+ while (i < world->cmd_db->n)
+ {
+ free(world->cmd_db->cmds[i].dsc_short);
+ free(world->cmd_db->cmds[i].dsc_long);
+ i++;
+ }
+ free(world->cmd_db->cmds);
+ free(world->cmd_db);
+}
--- /dev/null
+/* command.h
+ *
+ * The Command DB collects all commands the user can give. It only contains
+ * identifiers and descriptions of commands, not the functions executing these
+ * commands. Coupling with those happens elsewhere.
+ */
+
+#ifndef COMMAND_DB_H
+#define COMMAND_DB_H
+
+
+
+#include <stdint.h> /* for uint8_t */
+struct World;
+
+
+
+struct Command
+{
+ uint8_t id; /* unique identifier of command */
+ char * dsc_short; /* short string name of command to be used internally */
+ char * dsc_long; /* long string description of command for the user */
+};
+
+struct CommandDB
+{
+ uint8_t n; /* number of Command structs in database*/
+ struct Command * cmds; /* pointer to first Command struct in database */
+};
+
+
+
+/* Give short description of command ("dsc_short"), get long descrption. */
+extern char * get_command_longdsc(struct World * world, char * dsc_short);
+
+
+
+/* Read in CommandDB from file "config/commands" to world.cmd_db. */
+extern void init_command_db(struct World * world);
+
+
+
+/* Free all memory allocated with init_command_db. */
+extern void free_command_db(struct World * world);
+
+
+
+#endif
extern uint8_t player_control(int key, struct World * world)
{
- if (key == get_action_key(world->keybindings, "player up"))
+ if (key == get_action_key(world->keybindings, "player_u"))
{
move_player(world, NORTH);
}
- else if (key == get_action_key(world->keybindings, "player right"))
+ else if (key == get_action_key(world->keybindings, "player_r"))
{
move_player(world, EAST);
}
- else if (key == get_action_key(world->keybindings, "player down"))
+ else if (key == get_action_key(world->keybindings, "player_d"))
{
move_player(world, SOUTH);
}
- else if (key == get_action_key(world->keybindings, "player left"))
+ else if (key == get_action_key(world->keybindings, "player_l"))
{
move_player(world, WEST);
}
- else if (key == get_action_key(world->keybindings, "wait / next turn"))
+ else if (key == get_action_key(world->keybindings, "wait"))
{
player_wait(world);
}
{
return 1;
}
- else if (key == get_action_key(world->keybindings, "scroll pad right"))
+ else if (key == get_action_key(world->keybindings, "scrl_r"))
{
scroll_pad(win_meta, '+');
}
- else if (key == get_action_key(world->keybindings, "scroll pad left"))
+ else if (key == get_action_key(world->keybindings, "scrl_l"))
{
scroll_pad(win_meta, '-');
}
- else if (key == get_action_key(world->keybindings, "toggle keys window"))
+ else if (key == get_action_key(world->keybindings, "to_keywin"))
{
exit_err(toggle_window(win_meta, win_keys), world, err_toggle);
}
- else if (key == get_action_key(world->keybindings, "toggle map window"))
+ else if (key == get_action_key(world->keybindings, "to_mapwin"))
{
exit_err(toggle_window(win_meta, win_map), world, err_toggle);
}
- else if (key == get_action_key(world->keybindings, "toggle info window"))
+ else if (key == get_action_key(world->keybindings, "to_infowin"))
{
exit_err(toggle_window(win_meta, win_info), world, err_toggle);
}
- else if (key == get_action_key(world->keybindings, "toggle log window"))
+ else if (key == get_action_key(world->keybindings, "to_logwin"))
{
exit_err(toggle_window(win_meta, win_log), world, err_toggle);
}
- else if (key == get_action_key(world->keybindings, "cycle forwards"))
+ else if (key == get_action_key(world->keybindings, "cyc_win_f"))
{
cycle_active_win(win_meta, 'f');
}
- else if (key == get_action_key(world->keybindings, "cycle backwards"))
+ else if (key == get_action_key(world->keybindings, "cyc_win_b"))
{
cycle_active_win(win_meta, 'b');
}
- else if (key == get_action_key(world->keybindings, "shift forwards"))
+ else if (key == get_action_key(world->keybindings, "shift_f"))
{
exit_err(shift_active_win(win_meta, 'f'), world, err_shift);
}
- else if (key == get_action_key(world->keybindings, "shift backwards"))
+ else if (key == get_action_key(world->keybindings, "shift_b"))
{
exit_err(shift_active_win(win_meta, 'b'), world, err_shift);
}
- else if (key == get_action_key(world->keybindings, "grow horizontally"))
+ else if (key == get_action_key(world->keybindings, "grow_h"))
{
exit_err(growshrink_active_window(win_meta, '*'), world, err_resize);
}
- else if (key == get_action_key(world->keybindings, "shrink horizontally"))
+ else if (key == get_action_key(world->keybindings, "shri_h"))
{
exit_err(growshrink_active_window(win_meta, '_'), world, err_resize);
}
- else if (key == get_action_key(world->keybindings, "grow vertically"))
+ else if (key == get_action_key(world->keybindings, "grow_v"))
{
exit_err(growshrink_active_window(win_meta, '+'), world, err_resize);
}
- else if (key == get_action_key(world->keybindings, "shrink vertically"))
+ else if (key == get_action_key(world->keybindings, "shri_v"))
{
exit_err(growshrink_active_window(win_meta, '-'), world, err_resize);
}
- else if (key == get_action_key(world->keybindings, "save keys"))
+ else if (key == get_action_key(world->keybindings, "save_keys"))
{
save_keybindings(world);
}
- else if (key == get_action_key(world->keybindings, "keys nav up"))
+ else if (key == get_action_key(world->keybindings, "keys_u"))
{
- keyswin_move_selection (world, 'u');
+ keyswin_move_selection(world, 'u');
}
- else if (key == get_action_key(world->keybindings, "keys nav down"))
+ else if (key == get_action_key(world->keybindings, "keys_d"))
{
- keyswin_move_selection (world, 'd');
+ keyswin_move_selection(world, 'd');
}
- else if (key == get_action_key(world->keybindings, "keys mod"))
+ else if (key == get_action_key(world->keybindings, "keys_m"))
{
- keyswin_mod_key (world, win_meta);
+ keyswin_mod_key(world, win_meta);
}
- else if (key == get_action_key(world->keybindings, "map up"))
+ else if (key == get_action_key(world->keybindings, "map_u"))
{
map_scroll(world->map, NORTH, win_map->frame.size);
}
- else if (key == get_action_key(world->keybindings, "map down"))
+ else if (key == get_action_key(world->keybindings, "map_d"))
{
map_scroll(world->map, SOUTH, win_map->frame.size);
}
- else if (key == get_action_key(world->keybindings, "map right"))
+ else if (key == get_action_key(world->keybindings, "map_r"))
{
map_scroll(world->map, EAST, win_map->frame.size);
}
- else if (key == get_action_key(world->keybindings, "map left"))
+ else if (key == get_action_key(world->keybindings, "map_l"))
{
map_scroll(world->map, WEST, win_map->frame.size);
}
- else if (key == get_action_key(world->keybindings, "map center player"))
+ else if (key == get_action_key(world->keybindings, "map_c"))
{
map_center_player (world->map, world->player, win_map->frame.size);
}
#include "map.h" /* for Map struct */
#include "main.h" /* for World struct */
#include "rexit.h" /* for err_exit() */
+#include "command_db.h" /* for get_command_longdesc() */
char * keydesc = malloc(keydescwidth), * keyname;
char * err_hint = "Trouble with draw_scroll_hint() in draw_keys_win().";
attr_t attri;
+ char * cmd_dsc;
for (y = 0; y <= world->keyswindata->max && y < win->frame.size.y; y++)
{
if (0 == y && offset > 0)
keyname = get_keyname(world->keybindings[y + offset].key);
snprintf(keydesc, keydescwidth, "%-9s", keyname);
free(keyname);
+ cmd_dsc = get_command_longdsc(world,
+ world->keybindings[y + offset].name);
for (x = 0; x < win->frame.size.x; x++)
{
if (x < strlen(keydesc))
{
mvwaddch(win->frame.curses_win, y, x, keydesc[x] | attri);
}
- else if (strlen(keydesc) < x
- && x < strlen(world->keybindings[y + offset].name)
- + strlen(keydesc) + 1)
+ else if ( strlen(keydesc) < x
+ && x < strlen(cmd_dsc) + strlen(keydesc) + 1)
{
mvwaddch(win->frame.curses_win, y, x,
- world->keybindings[y + offset]
- .name[x - strlen(keydesc) - 1] | attri);
+ cmd_dsc[x - strlen(keydesc) - 1] | attri);
}
else
{
#include "rrand.h" /* for rrand(), rrand_seed() */
#include "rexit.h" /* for exit_game() */
#include "control.h" /* for meta_control() */
+#include "command_db.h" /* for init_command_db() */
{
struct World world;
+ init_command_db(&world);
+ set_cleanup_flag(CLEANUP_COMMAND_DB);
+
/* Check for corrupted savefile / recordfile savings. */
char * recordfile = "record";
char * savefile = "savefile";
draw_all_wins(&win_meta);
key = getch();
if ( EOF != action
- && key == get_action_key(world.keybindings, "wait / next turn"))
+ && key == get_action_key(world.keybindings, "wait"))
{
action = getc(file);
if (EOF != action)
struct MonsterDef * monster_def; /* Pointer to the monster definitions. */
struct Monster * monster; /* Pointer to the monsters' data. */
struct Player * player; /* Pointer to the player data. */
+ struct CommandDB * cmd_db; /* Pointer to the command database. */
struct Wins wins; /* Pointers to WinMeta, individual Wins.*/
};
#include "main.h" /* for World struct */
#include "map.h" /* for Map struct */
#include "keybindings.h" /* for KeysWinData, KeyBinding structs */
+#include "command_db.h" /* for free_command_db() */
{
free(world->log);
}
+ if (cleanup_flags & CLEANUP_COMMAND_DB)
+ {
+ free_command_db(world);
+ }
}
CLEANUP_NCURSES = 0x01,
CLEANUP_MAP = 0x02,
CLEANUP_KEYBINDINGS = 0x04,
- CLEANUP_LOG = 0x08
+ CLEANUP_LOG = 0x08,
+ CLEANUP_COMMAND_DB = 0x10
};
extern void set_cleanup_flag(enum cleanup_flag flag);