using UnityEngine;
using System.Collections.Generic;
///
/// Defines all possible battle actions a character can take
///
public enum BattleActionType
{
Move,
Attack,
UseItem,
CastSpell,
RunAway,
Defend, // Optional: block/defend action
Wait // Optional: skip turn but maintain position
}
///
/// Enhanced action data to support multiple action types
///
[System.Serializable]
public class EnhancedCharacterActionData
{
[Header("Action State")]
public ActionDecisionState state = ActionDecisionState.NoAction;
public BattleActionType actionType = BattleActionType.Move;
[Header("Targeting")]
public Vector3 targetPosition = Vector3.zero;
public GameObject targetEnemy;
public Character targetCharacter; // For healing spells/items
[Header("Item/Spell Data")]
public string selectedItemName = "";
public string selectedSpellName = "";
public int selectedItemIndex = -1;
[Header("Action Properties")]
public bool requiresTarget = false;
public bool isAreaOfEffect = false;
public float aoeRadius = 0f;
public bool hasTarget => targetEnemy != null || targetCharacter != null || targetPosition != Vector3.zero;
public bool hasValidAction => state == ActionDecisionState.ActionSelected &&
(actionType == BattleActionType.Wait ||
actionType == BattleActionType.Defend ||
actionType == BattleActionType.RunAway ||
hasTarget ||
(!string.IsNullOrEmpty(selectedItemName) && selectedItemIndex >= 0) ||
!string.IsNullOrEmpty(selectedSpellName));
public void Reset()
{
state = ActionDecisionState.NoAction;
actionType = BattleActionType.Move;
targetPosition = Vector3.zero;
targetEnemy = null;
targetCharacter = null;
selectedItemName = "";
selectedSpellName = "";
selectedItemIndex = -1;
requiresTarget = false;
isAreaOfEffect = false;
aoeRadius = 0f;
}
public void SetMoveAction(Vector3 position)
{
Reset();
actionType = BattleActionType.Move;
targetPosition = position;
state = ActionDecisionState.ActionSelected;
}
public void SetAttackAction(GameObject enemy)
{
Reset();
actionType = BattleActionType.Attack;
targetEnemy = enemy;
requiresTarget = true;
state = ActionDecisionState.ActionSelected;
}
public void SetItemAction(string itemName, int itemIndex, bool requiresTargeting = false)
{
Reset();
actionType = BattleActionType.UseItem;
selectedItemName = itemName;
selectedItemIndex = itemIndex;
requiresTarget = requiresTargeting;
state = requiresTargeting ? ActionDecisionState.NoAction : ActionDecisionState.ActionSelected;
}
public void SetSpellAction(string spellName, bool requiresTargeting = false, bool isAoE = false, float radius = 0f)
{
Reset();
actionType = BattleActionType.CastSpell;
selectedSpellName = spellName;
requiresTarget = requiresTargeting;
isAreaOfEffect = isAoE;
aoeRadius = radius;
state = requiresTargeting ? ActionDecisionState.NoAction : ActionDecisionState.ActionSelected;
}
public void SetDefendAction()
{
Reset();
actionType = BattleActionType.Defend;
state = ActionDecisionState.ActionSelected;
}
public void SetWaitAction()
{
Reset();
actionType = BattleActionType.Wait;
state = ActionDecisionState.ActionSelected;
}
public void SetRunAwayAction()
{
Reset();
actionType = BattleActionType.RunAway;
state = ActionDecisionState.ActionSelected;
}
public void SetTarget(GameObject enemy)
{
targetEnemy = enemy;
if (requiresTarget)
{
state = ActionDecisionState.ActionSelected;
}
}
public void SetTarget(Character character)
{
targetCharacter = character;
if (requiresTarget)
{
state = ActionDecisionState.ActionSelected;
}
}
public void SetTarget(Vector3 position)
{
targetPosition = position;
if (requiresTarget && (isAreaOfEffect || actionType == BattleActionType.CastSpell))
{
state = ActionDecisionState.ActionSelected;
}
}
public string GetActionDescription()
{
switch (actionType)
{
case BattleActionType.Move:
return $"Move to {targetPosition}";
case BattleActionType.Attack:
return $"Attack {(targetEnemy ? targetEnemy.name : "target")}";
case BattleActionType.UseItem:
return $"Use {selectedItemName}";
case BattleActionType.CastSpell:
return $"Cast {selectedSpellName}";
case BattleActionType.Defend:
return "Defend";
case BattleActionType.Wait:
return "Wait";
case BattleActionType.RunAway:
return "Run Away";
default:
return "No Action";
}
}
}