# Part 6 (C++): Create Game Director

[← Previous: Part 5 (C++) - Create Enemy Spawner](part-5-cpp-create-spawner.md) | [Back to Index](README.md) | [Next: Part 7 (C++) - Create UI →](part-7-cpp-create-ui.md)

---

## Overview

Create a Game Director to manage the game timer, victory/defeat conditions, and overall game state.

**Time:** ~10 minutes

---

## Step 6.1: Create STGGameDirector C++ Class

1. **Tools → New C++ Class** → Actor → Name: `STGGameDirector`
2. Wait for compilation

---

## Step 6.2: Define Game Director Variables

### STGGameDirector.h:

> **⚠️ IMPORTANT:** Replace `YOURPROJECTNAME_API` with your actual project's API macro (e.g., `BULLETHELLCPP_API`).

```cpp
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "STGGameDirector.generated.h"

UCLASS()
class YOURPROJECTNAME_API ASTGGameDirector : public AActor
{
    GENERATED_BODY()
    
public:    
    ASTGGameDirector();

protected:
    virtual void BeginPlay() override;

public:    
    virtual void Tick(float DeltaTime) override;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Game")
    float GameDuration = 300.0f;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Game")
    float ElapsedTime = 0.0f;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Game")
    bool bGameActive = true;

    void OnPlayerDied();
    void OnVictory();
    void OnGameOver();
};
```

---

## Step 6.3: Implement Game Director

### STGGameDirector.cpp:

```cpp
#include "STGGameDirector.h"
#include "Kismet/GameplayStatics.h"

ASTGGameDirector::ASTGGameDirector()
{
    PrimaryActorTick.bCanEverTick = true;
}

void ASTGGameDirector::BeginPlay()
{
    Super::BeginPlay();
    ElapsedTime = 0.0f;
    bGameActive = true;
}

void ASTGGameDirector::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    if (!bGameActive)
        return;

    ElapsedTime += DeltaTime;

    // Display timer on screen (key 0 = persistent slot for timer)
    if (GEngine)
    {
        int32 Minutes = FMath::FloorToInt(ElapsedTime / 60.0f);
        int32 Seconds = FMath::FloorToInt(FMath::Fmod(ElapsedTime, 60.0f));
        FString TimeStr = FString::Printf(TEXT("Time: %02d:%02d"), Minutes, Seconds);
        GEngine->AddOnScreenDebugMessage(0, 0.0f, FColor::White, TimeStr);
    }

    // Check for victory (survived full duration)
    if (ElapsedTime >= GameDuration)
    {
        OnVictory();
    }
}

void ASTGGameDirector::OnPlayerDied()
{
    OnGameOver();
}

void ASTGGameDirector::OnVictory()
{
    bGameActive = false;
    
    if (GEngine)
    {
        int32 Minutes = FMath::FloorToInt(ElapsedTime / 60.0f);
        int32 Seconds = FMath::FloorToInt(FMath::Fmod(ElapsedTime, 60.0f));
        FString Msg = FString::Printf(TEXT("VICTORY! You survived %02d:%02d!"), Minutes, Seconds);
        GEngine->AddOnScreenDebugMessage(-1, 999.0f, FColor::Green, Msg);
    }
    
    // Pause game
    UGameplayStatics::SetGamePaused(GetWorld(), true);
}

void ASTGGameDirector::OnGameOver()
{
    bGameActive = false;
    
    if (GEngine)
    {
        int32 Minutes = FMath::FloorToInt(ElapsedTime / 60.0f);
        int32 Seconds = FMath::FloorToInt(FMath::Fmod(ElapsedTime, 60.0f));
        FString Msg = FString::Printf(TEXT("GAME OVER! Survived %02d:%02d"), Minutes, Seconds);
        GEngine->AddOnScreenDebugMessage(-1, 999.0f, FColor::Red, Msg);
    }
    
    // Pause game
    UGameplayStatics::SetGamePaused(GetWorld(), true);
}
```

---

## Step 6.4: Update Player Death to Notify Director

### In STGPawn.cpp, update HandleDeath():

```cpp
void ASTGPawn::HandleDeath()
{
    SetActorHiddenInGame(true);
    
    // Find and notify Game Director
    TArray<AActor*> FoundDirectors;
    UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASTGGameDirector::StaticClass(), FoundDirectors);
    if (FoundDirectors.Num() > 0)
    {
        ASTGGameDirector* Director = Cast<ASTGGameDirector>(FoundDirectors[0]);
        if (Director)
        {
            Director->OnPlayerDied();
        }
    }
}
```

Add include: `#include "STGGameDirector.h"`

---

## Step 6.5: Place Director in Level and Test

1. Drag `STGGameDirector` from C++ Classes into level
2. Press Play
3. Wait 5 minutes OR let player die

### Expected Result:

- ✅ Timer counts up from 0
- ✅ After 300 seconds: "VICTORY!" message, game pauses
- ✅ If player dies: "GAME OVER!" message, game pauses

---

[← Previous: Part 5 (C++) - Create Enemy Spawner](part-5-cpp-create-spawner.md) | [Back to Index](README.md) | [Next: Part 7 (C++) - Create UI →](part-7-cpp-create-ui.md)
