Add investor startup sequence

This commit is contained in:
2026-05-14 02:28:38 -07:00
parent 0a27d9a0b4
commit e9896cdce1
12 changed files with 257 additions and 4 deletions
+1
View File
@@ -5,6 +5,7 @@
*.uexp filter=lfs diff=lfs merge=lfs -text *.uexp filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text *.wav filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text *.mp3 filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text *.png filter=lfs diff=lfs merge=lfs -text
*.bmp filter=lfs diff=lfs merge=lfs -text *.bmp filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text *.jpg filter=lfs diff=lfs merge=lfs -text
+2
View File
@@ -317,6 +317,7 @@ Completed in version .01:
- [x] Set the packaged investor demo default map to Ground Zero. - [x] Set the packaged investor demo default map to Ground Zero.
- [x] Added first Agrarian Studio splash screen and investor demo legal notices. - [x] Added first Agrarian Studio splash screen and investor demo legal notices.
- [x] Built a Windows Development packaged demo and smoke-tested launch into Ground Zero. - [x] Built a Windows Development packaged demo and smoke-tested launch into Ground Zero.
- [x] Added startup movie and in-game beta demo notice with motto, version, and copyright language.
Open version .01 tasks: Open version .01 tasks:
@@ -345,6 +346,7 @@ Open version .01 tasks:
- [x] Convert the extracted 1-meter DEM subset into an Unreal Landscape-ready heightmap and import plan. - [x] Convert the extracted 1-meter DEM subset into an Unreal Landscape-ready heightmap and import plan.
- [x] Import the Ground Zero R16 heightmap into an Unreal terrain test map. - [x] Import the Ground Zero R16 heightmap into an Unreal terrain test map.
- [x] Package a Windows Development investor demo that starts on the Ground Zero map. - [x] Package a Windows Development investor demo that starts on the Ground Zero map.
- [x] Add investor-facing startup sequence and beta/demo notice language.
# Phase 1 - Foundational Survival MVP # Phase 1 - Foundational Survival MVP
+5
View File
@@ -12,6 +12,11 @@ CopyrightNotice=Copyright (c) 2026 Agrarian Studio. All rights reserved.
LicensingTerms=Investor demo build. Not for public distribution. LicensingTerms=Investor demo build. Not for public distribution.
PrivacyPolicy=Internal prototype build; online services and telemetry policies are not final. PrivacyPolicy=Internal prototype build; online services and telemetry policies are not final.
[/Script/MoviePlayer.MoviePlayerSettings]
bWaitForMoviesToComplete=True
bMoviesAreSkippable=True
+StartupMovies=AgrarianStudioIntro
[/Script/UnrealEd.ProjectPackagingSettings] [/Script/UnrealEd.ProjectPackagingSettings]
BuildConfiguration=PPBC_Development BuildConfiguration=PPBC_Development
ForDistribution=False ForDistribution=False
Binary file not shown.
Binary file not shown.
+25 -1
View File
@@ -5,9 +5,11 @@ set "PROJECT_DIR=%~dp0.."
set "PROJECT_FILE=%PROJECT_DIR%\AgrarianGame.uproject" set "PROJECT_FILE=%PROJECT_DIR%\AgrarianGame.uproject"
set "UE_ROOT=C:\Program Files\Epic Games\UE_5.7" set "UE_ROOT=C:\Program Files\Epic Games\UE_5.7"
set "RUN_UAT=%UE_ROOT%\Engine\Build\BatchFiles\RunUAT.bat" set "RUN_UAT=%UE_ROOT%\Engine\Build\BatchFiles\RunUAT.bat"
set "BUILD_BAT=%UE_ROOT%\Engine\Build\BatchFiles\Build.bat"
set "ARCHIVE_DIR=%PROJECT_DIR%\Builds\WindowsDevelopment" set "ARCHIVE_DIR=%PROJECT_DIR%\Builds\WindowsDevelopment"
set "LOG_DIR=%PROJECT_DIR%\Saved\BuildLogs" set "LOG_DIR=%PROJECT_DIR%\Saved\BuildLogs"
set "LOG_FILE=%LOG_DIR%\PackageWindowsDevelopment.log" set "LOG_FILE=%LOG_DIR%\PackageWindowsDevelopment.log"
set "BUILD_LOG_FILE=%LOG_DIR%\PackageWindowsBuild.log"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
if not exist "%ARCHIVE_DIR%" mkdir "%ARCHIVE_DIR%" if not exist "%ARCHIVE_DIR%" mkdir "%ARCHIVE_DIR%"
@@ -18,6 +20,12 @@ if not exist "%RUN_UAT%" (
exit /b 1 exit /b 1
) )
if not exist "%BUILD_BAT%" (
echo Unreal Engine 5.7 Build.bat was not found at:
echo %BUILD_BAT%
exit /b 1
)
if not exist "%PROJECT_FILE%" ( if not exist "%PROJECT_FILE%" (
echo Project file was not found at: echo Project file was not found at:
echo %PROJECT_FILE% echo %PROJECT_FILE%
@@ -28,12 +36,28 @@ echo Packaging Agrarian Windows Development build...
echo Archive: %ARCHIVE_DIR% echo Archive: %ARCHIVE_DIR%
echo Log: %LOG_FILE% echo Log: %LOG_FILE%
echo Building packaged targets without Unreal Build Accelerator...
(
call "%BUILD_BAT%" AgrarianGameEditor Win64 Development -Project="%PROJECT_FILE%" -WaitMutex -architecture=x64 -NoUBA
call "%BUILD_BAT%" AgrarianGame Win64 Development -Project="%PROJECT_FILE%" -WaitMutex -architecture=x64 -NoUBA
) > "%BUILD_LOG_FILE%" 2>&1
set "BUILD_EXIT_CODE=%ERRORLEVEL%"
type "%BUILD_LOG_FILE%"
if not "%BUILD_EXIT_CODE%"=="0" (
echo.
echo Target build failed with exit code %BUILD_EXIT_CODE%.
echo Log file: %BUILD_LOG_FILE%
exit /b %BUILD_EXIT_CODE%
)
call "%RUN_UAT%" BuildCookRun ^ call "%RUN_UAT%" BuildCookRun ^
-project="%PROJECT_FILE%" ^ -project="%PROJECT_FILE%" ^
-noP4 ^ -noP4 ^
-platform=Win64 ^ -platform=Win64 ^
-clientconfig=Development ^ -clientconfig=Development ^
-build ^ -skipbuild ^
-cook ^ -cook ^
-stage ^ -stage ^
-pak ^ -pak ^
+7
View File
@@ -78,6 +78,13 @@ DEMO_ACTORS = [
"fixed_z": 4000.0, "fixed_z": 4000.0,
"rotation": unreal.Rotator(0.0, 0.0, 0.0), "rotation": unreal.Rotator(0.0, 0.0, 0.0),
}, },
{
"label": "AGR_DemoNoticeActor",
"class": unreal.AgrarianDemoNoticeActor,
"location_xy": unreal.Vector(-18500.0, -6400.0, 0.0),
"fixed_z": 1600.0,
"rotation": unreal.Rotator(0.0, 0.0, 0.0),
},
] ]
@@ -0,0 +1,47 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianDemoNoticeActor.h"
#include "AgrarianDemoNoticeWidget.h"
#include "Blueprint/UserWidget.h"
#include "Engine/World.h"
#include "TimerManager.h"
AAgrarianDemoNoticeActor::AAgrarianDemoNoticeActor()
{
PrimaryActorTick.bCanEverTick = false;
NoticeWidgetClass = UAgrarianDemoNoticeWidget::StaticClass();
}
void AAgrarianDemoNoticeActor::BeginPlay()
{
Super::BeginPlay();
APlayerController* PlayerController = GetWorld() ? GetWorld()->GetFirstPlayerController() : nullptr;
if (!PlayerController || !NoticeWidgetClass)
{
return;
}
ActiveNoticeWidget = CreateWidget<UAgrarianDemoNoticeWidget>(PlayerController, NoticeWidgetClass);
if (!ActiveNoticeWidget)
{
return;
}
ActiveNoticeWidget->VersionLabel = VersionLabel;
ActiveNoticeWidget->DemoNotice = DemoNotice;
ActiveNoticeWidget->AddToViewport(100);
GetWorldTimerManager().SetTimer(RemoveNoticeTimerHandle, this, &AAgrarianDemoNoticeActor::RemoveNotice, NoticeDurationSeconds, false);
}
void AAgrarianDemoNoticeActor::RemoveNotice()
{
if (ActiveNoticeWidget)
{
ActiveNoticeWidget->RemoveFromParent();
ActiveNoticeWidget = nullptr;
}
}
@@ -0,0 +1,42 @@
// Copyright Pacificao. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AgrarianDemoNoticeActor.generated.h"
class UAgrarianDemoNoticeWidget;
UCLASS()
class AGRARIANGAME_API AAgrarianDemoNoticeActor : public AActor
{
GENERATED_BODY()
public:
AAgrarianDemoNoticeActor();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
TSubclassOf<UAgrarianDemoNoticeWidget> NoticeWidgetClass;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo", meta = (ClampMin = "1.0"))
float NoticeDurationSeconds = 9.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText VersionLabel = FText::FromString(TEXT("Investor Demo v0.01"));
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText DemoNotice = FText::FromString(TEXT("Beta prototype build - not for public distribution"));
protected:
virtual void BeginPlay() override;
private:
UPROPERTY()
TObjectPtr<UAgrarianDemoNoticeWidget> ActiveNoticeWidget;
FTimerHandle RemoveNoticeTimerHandle;
void RemoveNotice();
};
@@ -0,0 +1,74 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianDemoNoticeWidget.h"
#include "Rendering/DrawElements.h"
#include "Styling/CoreStyle.h"
int32 UAgrarianDemoNoticeWidget::NativePaint(
const FPaintArgs& Args,
const FGeometry& AllottedGeometry,
const FSlateRect& MyCullingRect,
FSlateWindowElementList& OutDrawElements,
int32 LayerId,
const FWidgetStyle& InWidgetStyle,
bool bParentEnabled) const
{
LayerId = Super::NativePaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled);
const FVector2D Size = AllottedGeometry.GetLocalSize();
const float PanelWidth = FMath::Min(860.0f, Size.X - 96.0f);
const float PanelHeight = 210.0f;
const FVector2D PanelPosition((Size.X - PanelWidth) * 0.5f, 42.0f);
FSlateDrawElement::MakeBox(
OutDrawElements,
++LayerId,
AllottedGeometry.ToPaintGeometry(FVector2f(PanelWidth, PanelHeight), FSlateLayoutTransform(FVector2f(PanelPosition))),
FCoreStyle::Get().GetBrush(TEXT("WhiteBrush")),
ESlateDrawEffect::None,
FLinearColor(0.02f, 0.03f, 0.025f, 0.82f));
FSlateDrawElement::MakeBox(
OutDrawElements,
++LayerId,
AllottedGeometry.ToPaintGeometry(FVector2f(PanelWidth, 3.0f), FSlateLayoutTransform(FVector2f(PanelPosition))),
FCoreStyle::Get().GetBrush(TEXT("WhiteBrush")),
ESlateDrawEffect::None,
FLinearColor(0.45f, 0.72f, 0.40f, 1.0f));
const FSlateFontInfo MottoFont = FCoreStyle::GetDefaultFontStyle("Bold", 30);
const FSlateFontInfo VersionFont = FCoreStyle::GetDefaultFontStyle("Regular", 18);
const FSlateFontInfo NoticeFont = FCoreStyle::GetDefaultFontStyle("Regular", 16);
DrawCenteredText(OutDrawElements, LayerId, AllottedGeometry, Motto, PanelPosition.Y + 34.0f, MottoFont, FLinearColor(0.86f, 0.94f, 0.78f, 1.0f));
DrawCenteredText(OutDrawElements, LayerId, AllottedGeometry, VersionLabel, PanelPosition.Y + 94.0f, VersionFont, FLinearColor(0.82f, 0.86f, 0.78f, 1.0f));
DrawCenteredText(OutDrawElements, LayerId, AllottedGeometry, DemoNotice, PanelPosition.Y + 126.0f, NoticeFont, FLinearColor(0.78f, 0.82f, 0.75f, 1.0f));
DrawCenteredText(OutDrawElements, LayerId, AllottedGeometry, CopyrightNotice, PanelPosition.Y + 158.0f, NoticeFont, FLinearColor(0.66f, 0.70f, 0.64f, 1.0f));
return LayerId;
}
void UAgrarianDemoNoticeWidget::DrawCenteredText(
FSlateWindowElementList& OutDrawElements,
int32& LayerId,
const FGeometry& AllottedGeometry,
const FText& Text,
float Y,
const FSlateFontInfo& Font,
const FLinearColor& Color) const
{
const FVector2D Size = AllottedGeometry.GetLocalSize();
const FString TextString = Text.ToString();
const float EstimatedWidth = FMath::Min(Size.X - 96.0f, static_cast<float>(TextString.Len()) * Font.Size * 0.52f);
const FVector2D TextPosition((Size.X - EstimatedWidth) * 0.5f, Y);
FSlateDrawElement::MakeText(
OutDrawElements,
++LayerId,
AllottedGeometry.ToPaintGeometry(FVector2f(EstimatedWidth, Font.Size + 12.0f), FSlateLayoutTransform(FVector2f(TextPosition))),
Text,
Font,
ESlateDrawEffect::None,
Color);
}
@@ -0,0 +1,47 @@
// Copyright Pacificao. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "AgrarianDemoNoticeWidget.generated.h"
UCLASS()
class AGRARIANGAME_API UAgrarianDemoNoticeWidget : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText Motto = FText::FromString(TEXT("What survives after you are gone?"));
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText VersionLabel = FText::FromString(TEXT("Investor Demo v0.01"));
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText DemoNotice = FText::FromString(TEXT("Beta prototype build - not for public distribution"));
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Demo")
FText CopyrightNotice = FText::FromString(TEXT("Copyright (c) 2026 Agrarian Studio. All rights reserved."));
protected:
virtual int32 NativePaint(
const FPaintArgs& Args,
const FGeometry& AllottedGeometry,
const FSlateRect& MyCullingRect,
FSlateWindowElementList& OutDrawElements,
int32 LayerId,
const FWidgetStyle& InWidgetStyle,
bool bParentEnabled) const override;
private:
void DrawCenteredText(
FSlateWindowElementList& OutDrawElements,
int32& LayerId,
const FGeometry& AllottedGeometry,
const FText& Text,
float Y,
const FSlateFontInfo& Font,
const FLinearColor& Color) const;
};
+2 -1
View File
@@ -19,7 +19,8 @@ public class AgrarianGame : ModuleRules
"GameplayStateTreeModule", "GameplayStateTreeModule",
"UMG", "UMG",
"Landscape", "Landscape",
"Slate" "Slate",
"SlateCore"
}); });
PrivateDependencyModuleNames.AddRange(new string[] { }); PrivateDependencyModuleNames.AddRange(new string[] { });