Implement post-match screen and match finishing. (#76)
Reviewed-on: #76 Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #76.
This commit is contained in:
+121
-114
@@ -18,6 +18,7 @@ pub mod errors;
|
||||
pub mod input;
|
||||
pub mod main_menu;
|
||||
pub mod match_config;
|
||||
pub mod match_results;
|
||||
pub mod navigation;
|
||||
pub mod scaling;
|
||||
pub mod stage_select;
|
||||
@@ -77,11 +78,8 @@ pub fn despawn_menu(
|
||||
mut commands: Commands,
|
||||
) {
|
||||
if let Some(entity) = existing_menu {
|
||||
commands
|
||||
.entity(entity.into_inner())
|
||||
.despawn();
|
||||
commands.entity(entity.into_inner()).despawn();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn spawn_menu(
|
||||
@@ -90,9 +88,7 @@ pub fn spawn_menu(
|
||||
menu: impl Scene,
|
||||
) {
|
||||
if let Some(entity) = existing_menu {
|
||||
commands
|
||||
.entity(entity.into_inner())
|
||||
.despawn();
|
||||
commands.entity(entity.into_inner()).despawn();
|
||||
}
|
||||
commands.queue_spawn_scene(wrap_menu(menu));
|
||||
}
|
||||
@@ -117,115 +113,126 @@ where
|
||||
|
||||
impl Plugin for MenuPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(
|
||||
OnEnter(AppState::MainMenu),
|
||||
build_menu::<MainMenu>,
|
||||
)
|
||||
.add_message::<character_select::PlayerSlotAssigned>()
|
||||
.init_resource::<navigation::UINavigationActionState>()
|
||||
.init_resource::<navigation::UINavigationRepeat>()
|
||||
.init_resource::<input::MenuInputState>()
|
||||
.insert_resource(InputFocusVisible(true))
|
||||
.insert_resource(GlobalUiDebugOptions {
|
||||
enabled: true,
|
||||
..default()
|
||||
})
|
||||
// Configure auto-navigation behavior
|
||||
.insert_resource(AutoNavigationConfig {
|
||||
// Require at least 10% overlap in perpendicular axis for cardinal directions
|
||||
min_alignment_factor: 0.1,
|
||||
// Don't connect nodes more than 500 pixels apart between their closest edges
|
||||
max_search_distance: Some(500.0),
|
||||
// Prefer nodes that are well-aligned
|
||||
prefer_aligned: true,
|
||||
})
|
||||
.add_plugins(DirectionalNavigationPlugin)
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(
|
||||
navigation::give_default_focus,
|
||||
scaling::ui_scaling_system,
|
||||
button::button_setup,
|
||||
button::button_style_system.after(bevy::picking::PickingSystems::Hover),
|
||||
button::button_focus_style_system,
|
||||
app.add_systems(OnEnter(AppState::MainMenu), build_menu::<MainMenu>)
|
||||
.add_message::<character_select::PlayerSlotAssigned>()
|
||||
.init_resource::<navigation::UINavigationActionState>()
|
||||
.init_resource::<navigation::UINavigationRepeat>()
|
||||
.init_resource::<input::MenuInputState>()
|
||||
.insert_resource(InputFocusVisible(true))
|
||||
.insert_resource(GlobalUiDebugOptions { ..default() })
|
||||
// Configure auto-navigation behavior
|
||||
.insert_resource(AutoNavigationConfig {
|
||||
// Require at least 10% overlap in perpendicular axis for cardinal directions
|
||||
min_alignment_factor: 0.1,
|
||||
// Don't connect nodes more than 500 pixels apart between their closest edges
|
||||
max_search_distance: Some(500.0),
|
||||
// Prefer nodes that are well-aligned
|
||||
prefer_aligned: true,
|
||||
})
|
||||
.add_plugins(DirectionalNavigationPlugin)
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(
|
||||
navigation::give_default_focus,
|
||||
scaling::ui_scaling_system,
|
||||
button::button_setup,
|
||||
button::button_style_system.after(bevy::picking::PickingSystems::Hover),
|
||||
button::button_focus_style_system,
|
||||
)
|
||||
.run_if(resource_exists::<CommonAssets>),
|
||||
)
|
||||
.run_if(resource_exists::<CommonAssets>),
|
||||
)
|
||||
.add_systems(Startup, scaling::ui_update_scale_on_startup)
|
||||
// CURSOR
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(cursor::cursor_input).before(bevy::picking::PickingSystems::ProcessInput),
|
||||
)
|
||||
.add_systems(
|
||||
Update,
|
||||
(cursor::copy_mouse_input, cursor::update_cursor_transform),
|
||||
)
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
input::sample_menu_inputs
|
||||
.before(cursor::cursor_input)
|
||||
.run_if(resource_exists::<crate::input::MenuInputMap>),
|
||||
)
|
||||
//---------
|
||||
// CHARACTER SELECT START
|
||||
//---------
|
||||
.add_systems(
|
||||
OnEnter(AppState::CharacterSelect),
|
||||
character_select::setup_character_select,
|
||||
)
|
||||
.add_systems(
|
||||
PostUpdate,
|
||||
character_select::copy_cursor_transform_to_token
|
||||
.run_if(in_state(AppState::CharacterSelect))
|
||||
.run_if(any_with_component::<CharacterSelectScreen>),
|
||||
)
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(
|
||||
character_select::css_auto_assign_slots,
|
||||
character_select::handle_fighter_slot_addition,
|
||||
.add_systems(Startup, scaling::ui_update_scale_on_startup)
|
||||
// CURSOR
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(cursor::cursor_input).before(bevy::picking::PickingSystems::ProcessInput),
|
||||
)
|
||||
.chain()
|
||||
.run_if(in_state(AppState::CharacterSelect))
|
||||
.run_if(any_with_component::<CharacterSelectScreen>),
|
||||
)
|
||||
.add_systems(
|
||||
OnExit(AppState::CharacterSelect),
|
||||
(cursor::despawn_cursors, character_select::despawn_tokens),
|
||||
)
|
||||
.add_observer(character_select::select_fighter.run_if(in_state(AppState::CharacterSelect)))
|
||||
.add_observer(
|
||||
character_select::update_start_banner_visibility
|
||||
.run_if(in_state(AppState::CharacterSelect)),
|
||||
)
|
||||
//---------
|
||||
// CHARACTER SELECT END
|
||||
//---------
|
||||
//---------
|
||||
// STAGE SELECT START
|
||||
//---------
|
||||
.add_systems(
|
||||
OnEnter(AppState::StageSelect),
|
||||
stage_select::setup_stage_select,
|
||||
)
|
||||
.add_observer(stage_select::stage_selected.run_if(in_state(AppState::StageSelect)))
|
||||
.add_systems(
|
||||
OnExit(AppState::StageSelect),
|
||||
(cursor::despawn_cursors, despawn_menu),
|
||||
)
|
||||
//---------
|
||||
// STAGE SELECT END
|
||||
//---------
|
||||
.add_systems(
|
||||
Update,
|
||||
(
|
||||
navigation::process_inputs,
|
||||
navigation::navigate,
|
||||
navigation::interact_with_focused_button,
|
||||
.add_systems(
|
||||
Update,
|
||||
(cursor::copy_mouse_input, cursor::update_cursor_transform),
|
||||
)
|
||||
.chain(),
|
||||
)
|
||||
.init_resource::<InputFocus>();
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
input::sample_menu_inputs
|
||||
.before(cursor::cursor_input)
|
||||
.run_if(resource_exists::<crate::input::MenuInputMap>),
|
||||
)
|
||||
//---------
|
||||
// CHARACTER SELECT START
|
||||
//---------
|
||||
.add_systems(
|
||||
OnEnter(AppState::CharacterSelect),
|
||||
character_select::setup_character_select,
|
||||
)
|
||||
.add_systems(
|
||||
PostUpdate,
|
||||
character_select::copy_cursor_transform_to_token
|
||||
.run_if(in_state(AppState::CharacterSelect))
|
||||
.run_if(any_with_component::<CharacterSelectScreen>),
|
||||
)
|
||||
.add_systems(
|
||||
PreUpdate,
|
||||
(
|
||||
character_select::css_auto_assign_slots,
|
||||
character_select::handle_fighter_slot_addition,
|
||||
)
|
||||
.chain()
|
||||
.run_if(in_state(AppState::CharacterSelect))
|
||||
.run_if(any_with_component::<CharacterSelectScreen>),
|
||||
)
|
||||
.add_systems(
|
||||
OnExit(AppState::CharacterSelect),
|
||||
(cursor::despawn_cursors, character_select::despawn_tokens),
|
||||
)
|
||||
.add_observer(
|
||||
character_select::select_fighter.run_if(in_state(AppState::CharacterSelect)),
|
||||
)
|
||||
.add_observer(
|
||||
character_select::update_start_banner_visibility
|
||||
.run_if(in_state(AppState::CharacterSelect)),
|
||||
)
|
||||
//---------
|
||||
// CHARACTER SELECT END
|
||||
//---------
|
||||
//---------
|
||||
// STAGE SELECT START
|
||||
//---------
|
||||
.add_systems(
|
||||
OnEnter(AppState::StageSelect),
|
||||
stage_select::setup_stage_select,
|
||||
)
|
||||
.add_observer(stage_select::stage_selected.run_if(in_state(AppState::StageSelect)))
|
||||
.add_systems(
|
||||
OnExit(AppState::StageSelect),
|
||||
(cursor::despawn_cursors, despawn_menu),
|
||||
)
|
||||
//---------
|
||||
// STAGE SELECT END
|
||||
//---------
|
||||
//---------
|
||||
// MATCH RESULT START
|
||||
//---------
|
||||
.add_systems(
|
||||
OnEnter(AppState::MatchResults),
|
||||
match_results::setup_post_match_menu,
|
||||
)
|
||||
.add_systems(
|
||||
PostUpdate,
|
||||
match_results::check_return_to_character_select
|
||||
.run_if(in_state(AppState::MatchResults)),
|
||||
)
|
||||
//---------
|
||||
// MATCH RESULT END
|
||||
//---------
|
||||
.add_systems(
|
||||
Update,
|
||||
(
|
||||
navigation::process_inputs,
|
||||
navigation::navigate,
|
||||
navigation::interact_with_focused_button,
|
||||
)
|
||||
.chain(),
|
||||
)
|
||||
.init_resource::<InputFocus>();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user