Add investor startup sequence
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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.
@@ -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 ^
|
||||||
|
|||||||
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
@@ -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[] { });
|
||||||
|
|||||||
Reference in New Issue
Block a user