fp: Only allow one keyboard player, allocate remainder to gamepads

This commit is contained in:
doyle 2023-10-22 20:11:33 +11:00
parent 943bea72f1
commit 1c82071686

View File

@ -110,15 +110,21 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game)
return result; return result;
FP_GamePlay *play = &game->play; FP_GamePlay *play = &game->play;
bool keyboard_already_allocated = false;
uint32_t gamepad_index = 0; uint32_t gamepad_index = 0;
if (play->players.size) { if (play->players.size) {
FP_GameEntityHandle first_player_handle = play->players.data[0]; FP_GameEntityHandle first_player_handle = play->players.data[0];
FP_GameEntity *player = FP_Game_GetEntity(game, first_player_handle); 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; 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); bool gamepad_pressed = TELY_Platform_InputGamepadKeyIsPressed(input, gamepad_index, TELY_PlatformInputGamepadKey_Start);
if (keyboard_pressed || gamepad_pressed) { if (keyboard_pressed || gamepad_pressed) {
@ -137,35 +143,19 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game)
FP_GameControls *controls = &terry->controls; FP_GameControls *controls = &terry->controls;
if (keyboard_pressed) { if (keyboard_pressed) {
controls->mode = FP_GameControlMode_Keyboard; controls->mode = FP_GameControlMode_Keyboard;
if (play->players.size == 1) {
controls->up.scan_code = TELY_PlatformInputScanCode_W; controls->up.scan_code = TELY_PlatformInputScanCode_W;
controls->down.scan_code = TELY_PlatformInputScanCode_S; controls->down.scan_code = TELY_PlatformInputScanCode_S;
controls->left.scan_code = TELY_PlatformInputScanCode_A; controls->left.scan_code = TELY_PlatformInputScanCode_A;
controls->right.scan_code = TELY_PlatformInputScanCode_D; controls->right.scan_code = TELY_PlatformInputScanCode_D;
controls->attack.scan_code = TELY_PlatformInputScanCode_G; controls->attack.scan_code = TELY_PlatformInputScanCode_J;
controls->range_attack.scan_code = TELY_PlatformInputScanCode_H; controls->range_attack.scan_code = TELY_PlatformInputScanCode_K;
controls->build_mode.scan_code = TELY_PlatformInputScanCode_F; controls->build_mode.scan_code = TELY_PlatformInputScanCode_H;
controls->strafe.scan_code = TELY_PlatformInputScanCode_J; controls->strafe.scan_code = TELY_PlatformInputScanCode_L;
controls->dash.scan_code = TELY_PlatformInputScanCode_V; controls->dash.scan_code = TELY_PlatformInputScanCode_N;
controls->buy_building.scan_code = TELY_PlatformInputScanCode_T; controls->buy_building.scan_code = TELY_PlatformInputScanCode_U;
controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Y; controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_I;
controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_Q; controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_Q;
controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_E; 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;
}
} else { } else {
controls->mode = FP_GameControlMode_Gamepad; controls->mode = FP_GameControlMode_Gamepad;
controls->gamepad_index = gamepad_index; controls->gamepad_index = gamepad_index;
@ -2831,11 +2821,16 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
TELY_Render_PopTransform(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("<Gamepad: Start>");
else
join_game_key = DQN_STRING8("<Gamepad: B>");
Dqn_f32 font_height = TELY_Render_FontHeight(renderer, assets); Dqn_f32 font_height = TELY_Render_FontHeight(renderer, assets);
Dqn_V2 base_p = player_avatar_base_pos[game->play.players.size]; Dqn_V2 base_p = player_avatar_base_pos[game->play.players.size];
TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "Press <B>"); 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;
TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "or"); base_p.y += font_height;
TELY_Render_TextF(renderer, base_p, Dqn_V2_Zero, "<Gamepad: Start> to join!"); base_p.y += font_height;
FP_ListenForNewPlayer(input, game); FP_ListenForNewPlayer(input, game);
} }