-/* src/client/control.c */
+/* src/client/control.c
+ *
+ * This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
+ * or any later version. For details on its copyright, license, and warranties,
+ * see the file NOTICE in the root directory of the PlomRogue source package.
+ */
#include "control.h"
#include <stdint.h> /* uint8_t, uint16_t, uint32_t, UINT32_MAX */
#include <stdlib.h> /* free() */
#include <stdio.h> /* sprintf() */
-#include <string.h> /* strlen() */
+#include <string.h> /* strlen(), strcmp(), strncmp() */
#include "../common/rexit.h" /* exit_err(), exit_trouble() */
#include "../common/try_malloc.h" /* try_malloc() */
#include "interface_conf.h" /* reload_interface_conf(), save_interface_conf() */
#include "keybindings.h" /* get_command_to_keycode(), get_keycode_to_command(),
* mod_selected_keyb(), move_keyb_selection()
*/
-#include "map.h" /* map_scroll(), map_center(), toggle_autofocus() */
+#include "map.h" /* map_scroll(),toggle_lookmode(),lookmode_nav()*/
#include "wincontrol.h" /* shift_active_win(), resize_active_win(),
* toggle_win_size_type(), toggle_window(),
* cycle_active_win(), scroll_v_screen(),
static uint8_t try_0args(struct Command * command, char * match, void (* f) ());
static uint8_t try_1args(struct Command * command, char * match,
void (* f) (char), char c);
-static uint8_t try_2args(struct Command * command, char * match,
- void (* f) (char, char), char c1, char c2);
+
+/* If "command" fits pattern "keyb_XY" with Y a proper keybinding list ID char
+ * and X one of "u" (for "up"), "d" (for "down") or "m" (for "modify"), move up
+ * or down or modify entry in the selected keybinding list.
+ */
+static uint8_t try_kb_manip(char * command);
/* Try if "command" matches a hard-coded list of client-only commands and, if
* successful, execute the match and return 1. Else, return 0.
return 0;
}
+
+
static uint8_t try_1args(struct Command * command, char * match,
void (* f) (char), char c)
{
-static uint8_t try_2args(struct Command * command, char * match,
- void (* f) (char, char), char c1, char c2)
+static uint8_t try_kb_manip(char * command)
{
- if (!strcmp(command->dsc_short, match))
+ char * cmp = "keyb_";
+ if (strlen(command) == strlen(cmp)+2 && !strncmp(command, cmp, strlen(cmp)))
{
- f(c1, c2);
+ if ('m' == command[strlen(cmp)])
+ {
+ mod_selected_keyb(command[strlen(cmp) + 1]);
+ }
+ else if ('u' == command[strlen(cmp)] || 'd' == command[strlen(cmp)])
+ {
+ move_keyb_selection(command[strlen(cmp) + 1], command[strlen(cmp)]);
+ }
return 1;
}
return 0;
static uint8_t try_client_commands(struct Command * command)
{
- return ( try_0args(command, "map_c", map_center)
- || try_0args(command, "to_autofocus", toggle_autofocus)
- || try_1args(command, "map_u", map_scroll, '8')
+ return ( try_1args(command, "map_u", map_scroll, '8')
|| try_1args(command, "map_d", map_scroll, '2')
|| try_1args(command, "map_r", map_scroll, '6')
|| try_1args(command, "map_l", map_scroll, '4')
|| try_1args(command, "cyc_win_b", cycle_active_win, 'b')
|| try_1args(command, "scrl_r", scroll_v_screen, '+')
|| try_1args(command, "scrl_l", scroll_v_screen, '-')
- || try_1args(command, "to_a_keywin", toggle_window, 'k')
|| try_1args(command, "to_g_keywin", toggle_window, '0')
|| try_1args(command, "to_wg_keywin", toggle_window, '1')
|| try_1args(command, "to_wk_keywin", toggle_window, '2')
|| try_1args(command, "to_infowin", toggle_window, 'i')
|| try_1args(command, "to_inv", toggle_window, 'c')
|| try_1args(command, "to_logwin", toggle_window, 'l')
+ || try_1args(command, "to_terrain", toggle_window, 's')
|| try_0args(command, "winconf", toggle_winconfig)
|| try_1args(command, "grow_h", resize_active_win, '*')
|| try_1args(command, "shri_h", resize_active_win, '_')
|| try_1args(command, "shift_b", shift_active_win, 'b')
|| try_0args(command, "reload_conf", reload_interface_conf)
|| try_0args(command, "save_conf", save_interface_conf)
- || try_1args(command, "g_keys_m", mod_selected_keyb, 'G')
- || try_2args(command, "g_keys_u", move_keyb_selection, 'G', 'u')
- || try_2args(command, "g_keys_d", move_keyb_selection, 'G', 'd')
- || try_1args(command, "w_keys_m", mod_selected_keyb, 'w')
- || try_2args(command, "w_keys_u", move_keyb_selection, 'w', 'u')
- || try_2args(command, "w_keys_d", move_keyb_selection, 'w', 'd')
- || try_1args(command, "wg_keys_m", mod_selected_keyb, 'g')
- || try_2args(command, "wg_keys_u", move_keyb_selection, 'g', 'u')
- || try_2args(command, "wg_keys_d", move_keyb_selection, 'g', 'd')
- || try_1args(command, "wk_keys_m", mod_selected_keyb, 'k')
- || try_2args(command, "wk_keys_u", move_keyb_selection, 'k', 'u')
- || try_2args(command, "wk_keys_d", move_keyb_selection, 'k', 'd'));
+ || try_0args(command, "to_look", toggle_lookmode)
+ || try_kb_manip(command->dsc_short));
}
static char * build_server_message_with_argument(struct Command * cmd)
{
- char * f_name = "build_server_message_with_argument()";
uint8_t command_size = strlen(cmd->server_msg);
char * arg_str = "";
uint8_t arg_size = 0;
if ('i' == cmd->arg)
{
arg_size = 3;
- arg_str = try_malloc(arg_size + 1, f_name);
+ arg_str = try_malloc(arg_size + 1, __func__);
int test = sprintf(arg_str, "%d",world.player_inventory_select);
- exit_trouble(test < 0, f_name, "sprintf()");
+ exit_trouble(test < 0, __func__, "sprintf");
}
else if ( set_string_if_char_match(cmd->arg, 'd', &arg_str, "east")
|| set_string_if_char_match(cmd->arg, 'c', &arg_str, "south-east")
{
exit_err(1, "Illegal server command argument.");
}
- char * msg = try_malloc(command_size + 1 + arg_size + 1, f_name);
+ char * msg = try_malloc(command_size + 1 + arg_size + 1, __func__);
int test = sprintf(msg, "%s %s", cmd->server_msg, arg_str);
- exit_trouble(test < 0, f_name, "sprintf()");
+ exit_trouble(test < 0, __func__, "sprintf");
if ('i' == cmd->arg)
{
free(arg_str);
}
if (command)
{
- if (try_server_commands(command))
+ if (world.look && lookmode_nav(command->dsc_short))
{
return 1;
}
{
return 1;
}
+ else if (try_server_commands(command))
+ {
+ return 1;
+ }
else if (!strcmp("quit", command->dsc_short))
{
return 2;