Territory System
Sistema di gestione dei territori di gioco
ATerritoryActor
Responsabilità
Rappresenta un singolo territorio sulla mappa di gioco.
Proprietà Core
Identità
int32 TerritoryID; // ID univoco (0-41)
FString TerritoryName; // "Alaska", "Kamchatka"...
int32 ContinentID; // A quale continente appartieneStato Runtime (Replicato)
int32 OwnerPlayerID; // Chi possiede (-1 = neutrale)
int32 ArmyCount; // Quante armate presentiConnessioni
TArray<int32> AdjacentTerritoryIDs; // IDs territori confinantiVisualizzazione
Static Mesh
Ogni territorio ha una mesh 3D che rappresenta la sua forma geografica.
Dynamic Material
Material cambia colore in base al proprietario:
void UpdateTerritoryColor(FLinearColor OwnerColor) {
DynamicMaterial->SetVectorParameterValue("BaseColor", OwnerColor);
}Outline/Highlight
- Hover: Outline bianco
- Selected: Outline giallo
- Attackable: Outline rosso
- Fortifiable: Outline blu
Interazione
Click Handler
void OnTerritoryClicked() {
// Notifica controller
PlayerController->OnTerritorySelected(TerritoryID);
}Hover Feedback
void OnMouseEnter() {
ShowOutline(FLinearColor::White);
ShowTooltip();
}
void OnMouseExit() {
HideOutline();
HideTooltip();
}Tooltip
Mostra info quando hover:
┌───────────────┐
│ Alaska │
│ Owner: Rosso │
│ Armate: 5 │
│ Continente: │
│ Nord America │
└───────────────┘Metodi Principali
SetOwner
void SetOwner(int32 NewOwnerID, FLinearColor OwnerColor) {
OwnerPlayerID = NewOwnerID;
UpdateTerritoryColor(OwnerColor);
}AddArmies / RemoveArmies
void AddArmies(int32 Count) {
ArmyCount += Count;
UpdateArmyDisplay();
}IsAdjacentTo
bool IsAdjacentTo(int32 OtherTerritoryID) {
return AdjacentTerritoryIDs.Contains(OtherTerritoryID);
}Replicazione
Replicated Properties
DOREPLIFETIME(ATerritoryActor, OwnerPlayerID);
DOREPLIFETIME(ATerritoryActor, ArmyCount);Non replicati: TerritoryID, ContinentID, AdjacentIDs = static data. Generati localmente, identici su tutti i client.
Adiacenze
Definizione
Due territori sono adiacenti se:
- Condividono un confine geografico
- O hanno un collegamento marittimo speciale
Esempio:
- Alaska ↔ Kamchatka (collegamento speciale)
- Italia ↔ Francia (confine geografico)
Setup
Definite in config o calcolate da geometria:
// Config-based
TerritoryConfigs[0].AdjacentIDs = {1, 2, 38};
// O geometry-based (overlap detection)
DetectAdjacentTerritories();Stati Visivi
Neutrale
- Grigio chiaro
- Nessun proprietario
- Solo fase iniziale
Owned
- Colore del proprietario
- Display armate
- Interattivo
Attackable
- Outline rosso
- Evidenziato durante combat
- Click per attaccare
Fortifiable
- Outline blu
- Evidenziato durante fortification
- Click per spostare truppe
Army Display
Visualizzazione numero armate:
3D Text: Componente TextRender sopra territorio.
Widget Component: UMG widget 3D per display avanzato.
Icon System:
- 1-9 armate: numero
- 10+ armate: numero + icona bandiera
- 20+ armate: numero + doppia bandiera
Continenti
Appartenenza
Ogni territorio appartiene a esattamente 1 continente.
Bonus Controllo
Se un player controlla TUTTI i territori di un continente: → Riceve bonus truppe ogni turno.
Il GameManager controlla questo:
bool DoesPlayerControlContinent(PlayerID, ContinentID);Stato Implementazione
✅ Completato:
- Struct base TerritoryActor
- Replicazione owner e armate
- Adiacenze
- Material dinamico
🔧 Da fare:
- Click/hover interazione
- Tooltip
- Outline system
- Army display 3D
- Animazioni conquista
How is this guide?
Last updated on