add support for 4 player inputs
authorkub <derkub@gmail.com>
Wed, 26 Jan 2022 19:36:32 +0000 (19:36 +0000)
committerkub <derkub@gmail.com>
Wed, 26 Jan 2022 19:39:48 +0000 (19:39 +0000)
config_file.c
input.h
menu.c

index a1e67ae..248025d 100644 (file)
@@ -92,6 +92,22 @@ void config_write_keys(FILE *f)
                                }
                        }
 
+                       kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_PLAYER34)];
+                       for (i = 0; kbinds && me_ctrl_actions[i].name != NULL; i++) {
+                               mask = me_ctrl_actions[i].mask;
+                               if (mask & kbinds) {
+                                       strncpy(act, me_ctrl_actions[i].name, 31);
+                                       fprintf(f, "bind %s = player3 %s\n", name, mystrip(act));
+                                       kbinds &= ~mask;
+                               }
+                               mask = me_ctrl_actions[i].mask << 16;
+                               if (mask & kbinds) {
+                                       strncpy(act, me_ctrl_actions[i].name, 31);
+                                       fprintf(f, "bind %s = player4 %s\n", name, mystrip(act));
+                                       kbinds &= ~mask;
+                               }
+                       }
+
                        kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_EMU)];
                        for (i = 0; kbinds && emuctrl_actions[i].name != NULL; i++) {
                                mask = emuctrl_actions[i].mask;
@@ -126,12 +142,12 @@ static int parse_bind_val(const char *val, int *type)
                int player, shift = 0;
                player = atoi(val + 6) - 1;
 
-               if ((unsigned int)player > 1)
+               if ((unsigned int)player > 3)
                        return -1;
-               if (player == 1)
+               if (player & 1)
                        shift = 16;
 
-               *type = IN_BINDTYPE_PLAYER12;
+               *type = IN_BINDTYPE_PLAYER12 + (player >> 1);
                for (i = 0; me_ctrl_actions[i].name != NULL; i++) {
                        if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0)
                                return me_ctrl_actions[i].mask << shift;
diff --git a/input.h b/input.h
index 360b65b..ee1ad9f 100644 (file)
--- a/input.h
+++ b/input.h
@@ -70,6 +70,7 @@ enum {
        IN_BINDTYPE_NONE = -1,
        IN_BINDTYPE_EMU = 0,
        IN_BINDTYPE_PLAYER12,
+       IN_BINDTYPE_PLAYER34,
        IN_BINDTYPE_COUNT
 };
 
diff --git a/menu.c b/menu.c
index 50138f3..3cd69d2 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -1319,9 +1319,9 @@ static char *action_binds(int player_idx, int action_mask, int dev_id)
        type = IN_BINDTYPE_EMU;\r
        if (player_idx >= 0) {\r
                can_combo = 0;\r
-               type = IN_BINDTYPE_PLAYER12;\r
+               type = IN_BINDTYPE_PLAYER12 + (player_idx >> 1);\r
        }\r
-       if (player_idx == 1)\r
+       if (player_idx & 1)\r
                action_mask <<= 16;\r
 \r
        if (dev_id >= 0)\r
@@ -1459,9 +1459,11 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_
 \r
        dev_id = -1; // show all\r
        mask_shift = 0;\r
-       if (player_idx == 1)\r
+       if (player_idx & 1)\r
                mask_shift = 16;\r
-       bindtype = player_idx >= 0 ? IN_BINDTYPE_PLAYER12 : IN_BINDTYPE_EMU;\r
+       bindtype = IN_BINDTYPE_EMU;\r
+       if (player_idx >= 0)\r
+              bindtype = IN_BINDTYPE_PLAYER12 + (player_idx >> 1);\r
 \r
        for (;;)\r
        {\r