From 1c82071686f500e9b756d8ca54f932777cd07e8e Mon Sep 17 00:00:00 2001 From: doyle Date: Sun, 22 Oct 2023 20:11:33 +1100 Subject: [PATCH] fp: Only allow one keyboard player, allocate remainder to gamepads --- feely_pona.cpp | 73 +++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/feely_pona.cpp b/feely_pona.cpp index 624805a..7a46a57 100644 --- a/feely_pona.cpp +++ b/feely_pona.cpp @@ -109,16 +109,22 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game) if (game->play.players.size == 2) return result; - FP_GamePlay *play = &game->play; - uint32_t gamepad_index = 0; + FP_GamePlay *play = &game->play; + bool keyboard_already_allocated = false; + uint32_t gamepad_index = 0; if (play->players.size) { FP_GameEntityHandle first_player_handle = play->players.data[0]; FP_GameEntity *player = FP_Game_GetEntity(game, first_player_handle); - if (player->controls.mode == FP_GameControlMode_Gamepad) + if (player->controls.mode == FP_GameControlMode_Gamepad) { gamepad_index = 1; + } else { + // NOTE: We only allow one player to use the keyboard, everyone + // else must use a gamepad. + keyboard_already_allocated = true; + } } - bool keyboard_pressed = TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_B); + bool keyboard_pressed = !keyboard_already_allocated && TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_B); bool gamepad_pressed = TELY_Platform_InputGamepadKeyIsPressed(input, gamepad_index, TELY_PlatformInputGamepadKey_Start); if (keyboard_pressed || gamepad_pressed) { @@ -136,39 +142,23 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game) FP_GameEntity *terry = FP_Game_GetEntity(game, terry_handle); FP_GameControls *controls = &terry->controls; if (keyboard_pressed) { - controls->mode = FP_GameControlMode_Keyboard; - if (play->players.size == 1) { - controls->up.scan_code = TELY_PlatformInputScanCode_W; - controls->down.scan_code = TELY_PlatformInputScanCode_S; - controls->left.scan_code = TELY_PlatformInputScanCode_A; - controls->right.scan_code = TELY_PlatformInputScanCode_D; - controls->attack.scan_code = TELY_PlatformInputScanCode_G; - controls->range_attack.scan_code = TELY_PlatformInputScanCode_H; - controls->build_mode.scan_code = TELY_PlatformInputScanCode_F; - controls->strafe.scan_code = TELY_PlatformInputScanCode_J; - controls->dash.scan_code = TELY_PlatformInputScanCode_V; - controls->buy_building.scan_code = TELY_PlatformInputScanCode_T; - controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Y; - controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_Q; - controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_E; - } else { - controls->up.scan_code = TELY_PlatformInputScanCode_O; - controls->down.scan_code = TELY_PlatformInputScanCode_L; - controls->left.scan_code = TELY_PlatformInputScanCode_K; - controls->right.scan_code = TELY_PlatformInputScanCode_Semicolon; - controls->attack.scan_code = TELY_PlatformInputScanCode_Right; - controls->range_attack.scan_code = TELY_PlatformInputScanCode_Left; - controls->build_mode.scan_code = TELY_PlatformInputScanCode_Up; - controls->strafe.scan_code = TELY_PlatformInputScanCode_N; - controls->dash.scan_code = TELY_PlatformInputScanCode_Down; - controls->buy_building.scan_code = TELY_PlatformInputScanCode_Backslash; - controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Apostrophe; - controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_I; - controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_P; - } + controls->mode = FP_GameControlMode_Keyboard; + controls->up.scan_code = TELY_PlatformInputScanCode_W; + controls->down.scan_code = TELY_PlatformInputScanCode_S; + controls->left.scan_code = TELY_PlatformInputScanCode_A; + controls->right.scan_code = TELY_PlatformInputScanCode_D; + controls->attack.scan_code = TELY_PlatformInputScanCode_J; + controls->range_attack.scan_code = TELY_PlatformInputScanCode_K; + controls->build_mode.scan_code = TELY_PlatformInputScanCode_H; + controls->strafe.scan_code = TELY_PlatformInputScanCode_L; + controls->dash.scan_code = TELY_PlatformInputScanCode_N; + controls->buy_building.scan_code = TELY_PlatformInputScanCode_U; + controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_I; + controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_Q; + controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_E; } else { - controls->mode = FP_GameControlMode_Gamepad; - controls->gamepad_index = gamepad_index; + controls->mode = FP_GameControlMode_Gamepad; + controls->gamepad_index = gamepad_index; FP_SetDefaultGamepadBindings(controls); } @@ -2831,11 +2821,16 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, TELY_Render_PopTransform(renderer); }; + FP_GameEntity *first_player = FP_Game_GetEntity(game, game->play.players.data[0]); + Dqn_String8 join_game_key = {}; + if (first_player->controls.mode == FP_GameControlMode_Keyboard) + join_game_key = DQN_STRING8(""); + else + join_game_key = DQN_STRING8(""); + Dqn_f32 font_height = TELY_Render_FontHeight(renderer, assets); Dqn_V2 base_p = player_avatar_base_pos[game->play.players.size]; - TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "Press "); base_p.y += font_height; - TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "or"); base_p.y += font_height; - TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, " to join!"); base_p.y += font_height; + TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "Press %.*s", DQN_STRING_FMT(join_game_key)); base_p.y += font_height; FP_ListenForNewPlayer(input, game); }