Improve investor visual recovery pass

This commit is contained in:
2026-05-19 18:03:15 -07:00
parent c742a172da
commit d59f613e2b
10 changed files with 467 additions and 343 deletions
@@ -9,13 +9,11 @@
#include "Components/HorizontalBox.h"
#include "Components/HorizontalBoxSlot.h"
#include "Components/SizeBox.h"
#include "Components/Slider.h"
#include "Components/TextBlock.h"
#include "Components/VerticalBox.h"
#include "Components/VerticalBoxSlot.h"
#include "GameFramework/PlayerController.h"
#include "InputCoreTypes.h"
#include "Kismet/GameplayStatics.h"
#include "Styling/CoreStyle.h"
#include "TimerManager.h"
@@ -50,21 +48,18 @@ FReply UAgrarianMvpFrontendWidget::NativeOnKeyDown(const FGeometry& InGeometry,
const FKey Key = InKeyEvent.GetKey();
if (Key == EKeys::Left || Key == EKeys::A)
{
PlayUiSound(UiSelectionSound);
SetSelectedCharacterArchetype(EAgrarianMvpCharacterArchetype::YoungAdultMale);
return FReply::Handled();
}
if (Key == EKeys::Right || Key == EKeys::D)
{
PlayUiSound(UiSelectionSound);
SetSelectedCharacterArchetype(EAgrarianMvpCharacterArchetype::YoungAdultFemale);
return FReply::Handled();
}
if (Key == EKeys::Enter || Key == EKeys::SpaceBar)
{
PlayUiSound(UiConfirmSound);
ConfirmActiveScreen();
return FReply::Handled();
}
@@ -74,14 +69,12 @@ FReply UAgrarianMvpFrontendWidget::NativeOnKeyDown(const FGeometry& InGeometry,
const FKey Key = InKeyEvent.GetKey();
if (Key == EKeys::Enter || Key == EKeys::SpaceBar)
{
PlayUiSound(UiConfirmSound);
ConfirmActiveScreen();
return FReply::Handled();
}
if (Key == EKeys::BackSpace || Key == EKeys::Escape)
{
PlayUiSound(UiBackSound);
BackFromActiveScreen();
return FReply::Handled();
}
@@ -91,7 +84,6 @@ FReply UAgrarianMvpFrontendWidget::NativeOnKeyDown(const FGeometry& InGeometry,
const FKey Key = InKeyEvent.GetKey();
if (Key == EKeys::Enter || Key == EKeys::SpaceBar)
{
PlayUiSound(UiConfirmSound);
ConfirmActiveScreen();
return FReply::Handled();
}
@@ -101,14 +93,12 @@ FReply UAgrarianMvpFrontendWidget::NativeOnKeyDown(const FGeometry& InGeometry,
const FKey Key = InKeyEvent.GetKey();
if (Key == EKeys::Enter || Key == EKeys::SpaceBar || Key == EKeys::Escape)
{
PlayUiSound(UiConfirmSound);
ConfirmActiveScreen();
return FReply::Handled();
}
if (Key == EKeys::Q)
{
PlayUiSound(UiSaveQuitSound);
SaveAndQuit();
return FReply::Handled();
}
@@ -211,6 +201,11 @@ void UAgrarianMvpFrontendWidget::ContinueFromActiveScreen()
CompleteFrontendFlow();
return;
}
if (ActiveScreen == EAgrarianMvpFrontendScreen::SavingAndQuit)
{
return;
}
}
void UAgrarianMvpFrontendWidget::ReturnFromActiveScreen()
@@ -238,6 +233,7 @@ void UAgrarianMvpFrontendWidget::CompleteFrontendFlow()
: TEXT("AgrarianSelectCharacter male"));
}
PlayerController->ConsoleCommand(TEXT("AgrarianCompleteFrontend"));
PlayerController->SetInputMode(FInputModeGameOnly());
PlayerController->bShowMouseCursor = false;
PlayerController->SetIgnoreMoveInput(false);
@@ -299,31 +295,6 @@ void UAgrarianMvpFrontendWidget::RebuildFrontendTree()
UButton* QuitButton = AddButton(Panel, FText::FromString(TEXT("Save & Quit")), QuitButtonColor, FLinearColor(0.58f, 0.28f, 0.22f, 1.0f), 34.0f * Scale);
QuitButton->OnClicked.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleSaveAndQuitClicked);
AddText(Panel, FText::FromString(TEXT("Audio")), FMath::RoundToInt(18.0f * Scale), true, AccentColor, 8.0f * Scale);
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("Master")), MasterVolume, 8.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleMasterVolumeChanged);
}
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("Ambient")), AmbientVolume, 8.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleAmbientVolumeChanged);
}
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("Weather")), WeatherVolume, 8.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleWeatherVolumeChanged);
}
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("Effects")), EffectsVolume, 8.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleEffectsVolumeChanged);
}
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("Wildlife")), WildlifeVolume, 8.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleWildlifeVolumeChanged);
}
if (USlider* Slider = AddVolumeSlider(Panel, FText::FromString(TEXT("UI")), UiVolume, 24.0f * Scale))
{
Slider->OnValueChanged.AddDynamic(this, &UAgrarianMvpFrontendWidget::HandleUiVolumeChanged);
}
AddText(Panel, FText::FromString(TEXT("Escape opens this menu. Save & Quit writes the current world save before closing.")), FMath::RoundToInt(16.0f * Scale), false, MutedTextColor, 0.0f);
return;
}
@@ -496,78 +467,6 @@ UButton* UAgrarianMvpFrontendWidget::AddButton(UVerticalBox* Parent, const FText
return Button;
}
void UAgrarianMvpFrontendWidget::PlayUiSound(USoundBase* Sound) const
{
if (Sound)
{
UGameplayStatics::PlaySound2D(this, Sound, FMath::Clamp(MasterVolume * UiVolume, 0.0f, 1.0f));
}
}
USlider* UAgrarianMvpFrontendWidget::AddVolumeSlider(UVerticalBox* Parent, const FText& Label, float Value, float BottomPadding)
{
if (!Parent || !WidgetTree)
{
return nullptr;
}
UHorizontalBox* Row = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass());
if (UVerticalBoxSlot* RowSlot = Parent->AddChildToVerticalBox(Row))
{
RowSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, BottomPadding));
RowSlot->SetHorizontalAlignment(HAlign_Fill);
}
UTextBlock* LabelText = AddText(nullptr, Label, 15, false, FLinearColor(0.82f, 0.90f, 0.76f, 1.0f), 0.0f);
if (UHorizontalBoxSlot* LabelSlot = Row->AddChildToHorizontalBox(LabelText))
{
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
LabelSlot->SetHorizontalAlignment(HAlign_Left);
LabelSlot->SetVerticalAlignment(VAlign_Center);
}
USlider* Slider = WidgetTree->ConstructWidget<USlider>(USlider::StaticClass());
Slider->SetValue(FMath::Clamp(Value, 0.0f, 1.0f));
if (UHorizontalBoxSlot* SliderSlot = Row->AddChildToHorizontalBox(Slider))
{
SliderSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
SliderSlot->SetHorizontalAlignment(HAlign_Fill);
SliderSlot->SetVerticalAlignment(VAlign_Center);
}
return Slider;
}
void UAgrarianMvpFrontendWidget::HandleMasterVolumeChanged(float Value)
{
MasterVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::HandleAmbientVolumeChanged(float Value)
{
AmbientVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::HandleWeatherVolumeChanged(float Value)
{
WeatherVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::HandleEffectsVolumeChanged(float Value)
{
EffectsVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::HandleWildlifeVolumeChanged(float Value)
{
WildlifeVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::HandleUiVolumeChanged(float Value)
{
UiVolume = FMath::Clamp(Value, 0.0f, 1.0f);
}
void UAgrarianMvpFrontendWidget::FocusPrimaryButton()
{
if (PrimaryFocusButton)
@@ -582,31 +481,26 @@ void UAgrarianMvpFrontendWidget::FocusPrimaryButton()
void UAgrarianMvpFrontendWidget::HandlePrimaryActionClicked()
{
PlayUiSound(UiConfirmSound);
ConfirmActiveScreen();
}
void UAgrarianMvpFrontendWidget::HandleBackClicked()
{
PlayUiSound(UiBackSound);
BackFromActiveScreen();
}
void UAgrarianMvpFrontendWidget::HandleSaveAndQuitClicked()
{
PlayUiSound(UiSaveQuitSound);
SaveAndQuit();
}
void UAgrarianMvpFrontendWidget::HandleMaleCharacterClicked()
{
PlayUiSound(UiSelectionSound);
SetSelectedCharacterArchetype(EAgrarianMvpCharacterArchetype::YoungAdultMale);
}
void UAgrarianMvpFrontendWidget::HandleFemaleCharacterClicked()
{
PlayUiSound(UiSelectionSound);
SetSelectedCharacterArchetype(EAgrarianMvpCharacterArchetype::YoungAdultFemale);
}