using UnityEngine;
///
/// Singleton that persists settlement data across scene transitions
/// Ensures town generation is consistent based on settlement type
///
public class SettlementContext : MonoBehaviour
{
public static SettlementContext Instance { get; private set; }
[Header("Current Settlement Data")]
public string settlementName = "Haven Village";
public SettlementType settlementType = SettlementType.Town;
public bool hasHarbor = false;
public Vector2Int mapPosition = Vector2Int.zero;
public int settlementSeed = 0; // For consistent generation
[Header("Generated Data")]
public TownShop[] availableShops;
public ShopData[] generatedShopData; // Data-only shop definitions
public bool isGenerated = false;
[Header("Debug")]
public bool debugMode = false;
private void Awake()
{
// Singleton pattern - persist across scenes
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
if (debugMode) Debug.Log("SettlementContext created and marked as DontDestroyOnLoad");
}
else
{
if (debugMode) Debug.Log("SettlementContext already exists, destroying duplicate");
Destroy(gameObject);
}
}
///
/// Set settlement data before entering town scene
///
public void SetSettlement(string name, SettlementType type, Vector2Int position, bool harbor = false)
{
settlementName = name;
settlementType = type;
mapPosition = position;
hasHarbor = harbor;
// Generate consistent seed based on position and name
settlementSeed = (position.x * 1000 + position.y) ^ name.GetHashCode();
// Clear existing generation to force regeneration
isGenerated = false;
availableShops = null;
Debug.Log($"Settlement context set: {name} ({type}) at {position}, seed: {settlementSeed}");
}
///
///
/// Generate shops based on settlement type - just logs what would be created
/// TownShopManager handles the actual shop configuration
///
public TownShop[] GenerateShops()
{
if (isGenerated)
{
Debug.Log("Settlement already generated");
return new TownShop[0];
}
Debug.Log($"Planning shops for {settlementType}: {settlementName}");
// Use settlement seed for consistent generation logging
var oldState = Random.state;
Random.InitState(settlementSeed);
if (settlementType == SettlementType.Town)
{
Debug.Log("Town will have: Weapons, Armor, Potions, General shops");
if (Random.value > 0.3f) // 70% chance
{
Debug.Log("Town will also have: Adventurer's Guild");
}
if (hasHarbor && Random.value > 0.5f) // 50% chance if near water
{
Debug.Log("Town will also have: Harbor Trading Post");
}
}
else // Village
{
Debug.Log("Village will have: General Store");
if (Random.value > 0.4f) // 60% chance
{
var shopTypes = new string[] { "Herb Shop", "Old Weaponsmith" };
int index = Random.Range(0, shopTypes.Length);
Debug.Log($"Village will also have: {shopTypes[index]}");
}
}
// Restore random state
Random.state = oldState;
isGenerated = true;
Debug.Log("Shop configuration complete - TownShopManager will handle activation");
return new TownShop[0]; // No MonoBehaviour instances created here
}
///
/// Get shops for current settlement (generates if needed)
///
public TownShop[] GetShops()
{
if (!isGenerated || availableShops == null)
{
return GenerateShops();
}
return availableShops;
}
///
/// Clear settlement data (for testing)
///
[ContextMenu("Clear Settlement Data")]
public void ClearSettlementData()
{
isGenerated = false;
availableShops = null;
Debug.Log("Settlement data cleared");
}
///
/// Debug method to test different settlement types
///
[ContextMenu("Test Village Generation")]
public void TestVillageGeneration()
{
SetSettlement("Test Village", SettlementType.Village, new Vector2Int(50, 50));
var shops = GenerateShops();
Debug.Log($"Village shops: {string.Join(", ", System.Array.ConvertAll(shops, s => s.buildingName))}");
}
[ContextMenu("Test Town Generation")]
public void TestTownGeneration()
{
SetSettlement("Test Town", SettlementType.Town, new Vector2Int(100, 100), true);
var shops = GenerateShops();
Debug.Log($"Town shops: {string.Join(", ", System.Array.ConvertAll(shops, s => s.buildingName))}");
}
}