using System;
using System.Collections.Generic;
using UnityEngine;
///
/// Static data transfer class for passing combat-related data between scenes
/// Handles team data, enemy data, terrain information, and battle context
///
public static class CombatDataTransfer
{
[System.Serializable]
public class CombatSessionData
{
[Header("Battle Context")]
public string battleDescription = "";
public Vector2Int battleLocation = Vector2Int.zero;
public TerrainType battleTerrain = TerrainType.Plains;
public FeatureType battleFeature = FeatureType.None;
[Header("Team Data")]
public List playerTeam = new List();
[Header("Enemy Data")]
public List enemies = new List();
[Header("Environmental Settings")]
public Weather weather = Weather.Clear;
public float timeOfDay = 12f; // 0-24 hours
public CombatSessionData()
{
playerTeam = new List();
enemies = new List();
}
}
[System.Serializable]
public class TeamCharacterCombatData
{
public string characterName = "";
public bool isMale = true;
// Core stats
public int strength = 10;
public int dexterity = 10;
public int constitution = 10;
public int wisdom = 10;
public int perception = 10;
// Combat stats
public int maxHealth = 20;
public int currentHealth = 20;
public int armorClass = 10;
// Equipment
public string equippedWeapon = "Sword"; // Keep for backward compatibility
public WeaponItem equippedWeaponItem = null; // NEW: Actual weapon item reference
public string equippedArmor = "";
public List availableWeapons = new List();
public List availableArmor = new List();
public List miscItems = new List(); // Character's inventory items
// Resources
public int gold = 25;
public int silver = 0;
public int copper = 0;
public TeamCharacterCombatData()
{
availableWeapons = new List();
availableArmor = new List();
miscItems = new List();
}
///
/// Create combat data from a TeamCharacter
///
public static TeamCharacterCombatData FromTeamCharacter(TeamCharacter teamChar)
{
var combatData = new TeamCharacterCombatData();
if (teamChar != null)
{
combatData.characterName = teamChar.name;
combatData.isMale = teamChar.isMale;
combatData.strength = teamChar.strength;
combatData.dexterity = teamChar.dexterity;
combatData.constitution = teamChar.constitution;
combatData.wisdom = teamChar.wisdom;
combatData.perception = teamChar.perception;
combatData.gold = teamChar.gold;
combatData.silver = teamChar.silver;
combatData.copper = teamChar.copper;
// Ensure equipped weapon is not empty, fallback to first available or "Fists"
combatData.equippedWeapon = !string.IsNullOrEmpty(teamChar.equippedWeapon)
? teamChar.equippedWeapon
: (teamChar.weapons != null && teamChar.weapons.Count > 0)
? teamChar.weapons[0]
: "Fists";
// Try to find the actual WeaponItem for the equipped weapon
combatData.equippedWeaponItem = FindWeaponItem(combatData.equippedWeapon);
combatData.equippedArmor = teamChar.equippedArmor;
// Calculate derived stats
combatData.maxHealth = 10 + (teamChar.constitution * 2); // HP formula
combatData.currentHealth = combatData.maxHealth; // Start at full health
combatData.armorClass = 10 + (teamChar.dexterity / 2 - 5); // AC formula
// Copy equipment lists
if (teamChar.weapons != null)
combatData.availableWeapons.AddRange(teamChar.weapons);
if (teamChar.armor != null)
combatData.availableArmor.AddRange(teamChar.armor);
if (teamChar.miscItems != null)
combatData.miscItems.AddRange(teamChar.miscItems);
}
return combatData;
}
}
[System.Serializable]
public class EnemyCombatData
{
public string enemyName = "Bandit";
public string enemyType = "Humanoid";
public int maxHealth = 15;
public int currentHealth = 15;
public int armorClass = 12;
public int threatLevel = 2;
public string preferredWeapon = "Sword"; // Keep for backward compatibility
public WeaponItem preferredWeaponItem = null; // NEW: Actual weapon item reference
public EnemyCharacterData sourceData = null; // Reference to original data
///
/// Create combat data from EnemyCharacterData
///
public static EnemyCombatData FromEnemyData(EnemyCharacterData enemyData, int instanceNumber = 1)
{
var combatData = new EnemyCombatData();
if (enemyData != null)
{
combatData.enemyName = $"{enemyData.enemyName}_{instanceNumber}";
combatData.enemyType = enemyData.enemyName;
combatData.maxHealth = enemyData.maxHealth;
combatData.currentHealth = enemyData.maxHealth;
combatData.armorClass = enemyData.armorClass;
combatData.threatLevel = enemyData.threatLevel;
// Extract weapon type properly from WeaponItem
if (enemyData.preferredWeapon != null)
{
combatData.preferredWeapon = enemyData.preferredWeapon.weaponType.ToString();
combatData.preferredWeaponItem = enemyData.preferredWeapon; // Store actual WeaponItem
}
else
{
combatData.preferredWeapon = "Fists"; // Default fallback
combatData.preferredWeaponItem = null;
}
combatData.sourceData = enemyData;
}
return combatData;
}
}
// Current combat session data
private static CombatSessionData currentSession = null;
///
/// Initialize a new combat session with the given data
///
public static void InitializeCombatSession(BattleEventData battleData, TravelEventContext context, List teamMembers)
{
currentSession = new CombatSessionData();
// Set battle context
if (context != null)
{
currentSession.battleLocation = context.currentPosition;
currentSession.battleTerrain = context.currentTile?.terrainType ?? TerrainType.Plains;
currentSession.battleFeature = context.currentTile?.featureType ?? FeatureType.None;
currentSession.weather = context.currentWeather;
currentSession.timeOfDay = context.timeOfDay;
}
// Set battle description
if (battleData != null)
{
currentSession.battleDescription = battleData.battleDescription;
}
// Convert team members to combat data
if (teamMembers != null)
{
foreach (var teamMember in teamMembers)
{
if (teamMember != null)
{
currentSession.playerTeam.Add(TeamCharacterCombatData.FromTeamCharacter(teamMember));
}
}
}
// Create enemy combat data
if (battleData != null && battleData.enemyCharacterData != null)
{
for (int i = 0; i < battleData.enemyCount; i++)
{
currentSession.enemies.Add(EnemyCombatData.FromEnemyData(battleData.enemyCharacterData, i + 1));
}
}
}
///
/// Get the current combat session data
///
public static CombatSessionData GetCurrentSession()
{
return currentSession;
}
///
/// Check if there's a valid combat session
///
public static bool HasValidSession()
{
return currentSession != null &&
currentSession.playerTeam.Count > 0 &&
currentSession.enemies.Count > 0;
}
///
/// Clear the current combat session (call after battle ends)
///
public static void ClearSession()
{
currentSession = null;
}
///
/// Get terrain-appropriate description for battle setup
///
public static string GetTerrainDescription(TerrainType terrain, FeatureType feature)
{
string baseDescription = terrain switch
{
TerrainType.Plains => "open grasslands",
TerrainType.Forest => "dense woodland",
TerrainType.Mountain => "rocky mountain terrain",
TerrainType.River => "along a flowing river",
TerrainType.Lake => "near a peaceful lake",
TerrainType.Ocean => "along the coastline",
TerrainType.Shore => "on sandy shores",
_ => "unknown terrain"
};
string featureDescription = feature switch
{
FeatureType.Road => "on a well-traveled road",
FeatureType.Bridge => "at a stone bridge",
FeatureType.Town => "within town limits",
FeatureType.Village => "near a small village",
FeatureType.Tunnel => "in a dark tunnel",
FeatureType.Ferry => "at a ferry crossing",
FeatureType.Harbour => "at a busy harbor",
_ => ""
};
if (!string.IsNullOrEmpty(featureDescription))
{
return $"{featureDescription} in {baseDescription}";
}
return $"in {baseDescription}";
}
///
/// Create legacy BattleSetupData for compatibility with existing battle scene
///
public static void PopulateLegacyBattleSetupData()
{
if (!HasValidSession())
{
Debug.LogError("❌ No valid combat session to populate legacy battle setup data");
return;
}
// Clear existing data
BattleSetupData.playerSelections.Clear();
BattleSetupData.enemySelections.Clear();
// Populate player selections
foreach (var player in currentSession.playerTeam)
{
string weaponType = !string.IsNullOrEmpty(player.equippedWeapon) ? player.equippedWeapon : "Fists";
BattleSetupData.playerSelections.Add(new CharacterSelection
{
characterName = player.characterName,
weaponType = weaponType
});
}
// Populate enemy selections
foreach (var enemy in currentSession.enemies)
{
string weaponType = !string.IsNullOrEmpty(enemy.preferredWeapon) ? enemy.preferredWeapon : "Fists";
BattleSetupData.enemySelections.Add(new CharacterSelection
{
characterName = enemy.enemyName,
weaponType = weaponType
});
}
}
///
/// Helper method to find a WeaponItem by name or type
///
private static WeaponItem FindWeaponItem(string weaponIdentifier)
{
if (string.IsNullOrEmpty(weaponIdentifier) || weaponIdentifier == "Fists")
{
return null;
}
// Load all WeaponItem assets from Resources folders
WeaponItem[] allWeapons = Resources.LoadAll("");
// First try exact name match
foreach (var weapon in allWeapons)
{
if (weapon != null && string.Equals(weapon.itemName, weaponIdentifier, System.StringComparison.OrdinalIgnoreCase))
{
return weapon;
}
}
// Then try weapon type match
if (System.Enum.TryParse(weaponIdentifier, true, out WeaponType weaponType))
{
// Look for a weapon of this type, prefer "Simple" variants
WeaponItem simpleWeapon = null;
WeaponItem anyWeapon = null;
foreach (var weapon in allWeapons)
{
if (weapon != null && weapon.weaponType == weaponType)
{
anyWeapon = weapon; // Keep track of any weapon of this type
// Prefer simple/basic weapons
if (weapon.itemName.ToLower().Contains("simple") || weapon.itemName.ToLower().Contains("basic"))
{
simpleWeapon = weapon;
break; // Found preferred weapon, stop searching
}
}
}
WeaponItem result = simpleWeapon ?? anyWeapon;
return result;
}
return null;
}
internal static void SetCombatSession(CombatSessionData sessionData)
{
if (sessionData == null)
{
return;
}
currentSession = sessionData;
}
}