using System.Collections; using System.Collections.Generic; using UnityEngine; using SiegeSong; namespace SiegeSong { public class BattleStrategizer : MonoBehaviour { public AIBattleStrategy CurrentStrategy; public Statistics ActorStats; public Statistics TargetStats; public AIConfidence ConfidenceLevel; public int MuchStrongerAlliesInFight; public int StrongerAlliesInFight; public int ComparableAlliesInFight; public int WeakerAlliesInFight; public int MuchWeakerAlliesInFight; public int MuchStrongerEnemiesInFight; public int StrongerEnemiesInFight; public int ComparableEnemiesInFight; public int WeakerEnemiesInFight; public int MuchWeakerEnemiesInFight; public int ConfidenceScore; int smallChange = 1; int mediumChange = 3; int largeChange = 5; int lowConfidenceThreshold = 10; int highConfidenceThreshold = 25; float lowHealthConfidenceThreshold = 25.0f; float mediumHealthConfidenceThreshold = 50.0f; float highHealthConfidenceThreshold = 75.0f; float staminaConfidenceThreshold = 30.0f; bool shouldFlee; public void DetermineConfidenceLevel() { var confidenceScore = 0; if (ActorStats.Health < highHealthConfidenceThreshold) confidenceScore -= smallChange; if (ActorStats.Health < mediumHealthConfidenceThreshold) confidenceScore -= mediumChange; if (ActorStats.Health < lowHealthConfidenceThreshold) confidenceScore -= largeChange; if (TargetStats.Health < highHealthConfidenceThreshold) confidenceScore += smallChange; if (TargetStats.Health < mediumHealthConfidenceThreshold) confidenceScore += mediumChange; if (TargetStats.Health < lowHealthConfidenceThreshold) confidenceScore += largeChange; if (TargetStats.Staggered) confidenceScore += mediumChange; if (TargetStats.OffBalance) confidenceScore += largeChange; if (ActorStats.Staggered) confidenceScore -= mediumChange; if (ActorStats.OffBalance) confidenceScore -= largeChange; confidenceScore += MuchStrongerAlliesInFight * largeChange; confidenceScore += StrongerAlliesInFight * ((largeChange + mediumChange) / 2); confidenceScore += ComparableAlliesInFight * mediumChange; confidenceScore += WeakerAlliesInFight * ((mediumChange + smallChange) / 2); confidenceScore += MuchWeakerAlliesInFight * smallChange; confidenceScore += MuchStrongerAlliesInFight * largeChange; confidenceScore += StrongerAlliesInFight * ((largeChange + mediumChange) / 2); confidenceScore += ComparableAlliesInFight * mediumChange; confidenceScore += WeakerAlliesInFight * ((mediumChange + smallChange) / 2); confidenceScore += MuchWeakerAlliesInFight * smallChange; confidenceScore -= MuchStrongerEnemiesInFight * largeChange; confidenceScore -= StrongerEnemiesInFight * ((largeChange + mediumChange) / 2); confidenceScore -= ComparableEnemiesInFight * mediumChange; confidenceScore -= WeakerEnemiesInFight * ((mediumChange + smallChange) / 2); confidenceScore -= MuchWeakerEnemiesInFight * smallChange; if (confidenceScore > lowConfidenceThreshold) { ChangeConfidence(confidenceScore > 0, confidenceScore > highConfidenceThreshold); } if (ConfidenceScore != 0 && (confidenceScore - ConfidenceScore) > highHealthConfidenceThreshold) shouldFlee = true; else shouldFlee = false; ConfidenceScore = confidenceScore; } public void ChangeConfidence(bool positive = true, bool largeChange = false) { switch (ConfidenceLevel) { case AIConfidence.Panicked: if (positive) if (largeChange) ConfidenceLevel = AIConfidence.Calm; else ConfidenceLevel = AIConfidence.Nervous; break; case AIConfidence.Nervous: if (positive) { if (largeChange) ConfidenceLevel = AIConfidence.Confident; else ConfidenceLevel = AIConfidence.Calm; } else { ConfidenceLevel = AIConfidence.Panicked; } break; case AIConfidence.Calm: if (positive) { if (largeChange) ConfidenceLevel = AIConfidence.Reckless; else ConfidenceLevel = AIConfidence.Confident; } else { if (largeChange) ConfidenceLevel = AIConfidence.Panicked; else ConfidenceLevel = AIConfidence.Nervous; } break; case AIConfidence.Confident: if (positive) { ConfidenceLevel = AIConfidence.Reckless; } else { if (largeChange) ConfidenceLevel = AIConfidence.Nervous; else ConfidenceLevel = AIConfidence.Calm; } break; case AIConfidence.Reckless: if (!positive) { if (largeChange) ConfidenceLevel = AIConfidence.Calm; else ConfidenceLevel = AIConfidence.Confident; } break; } } public void SelectStrategy() { switch (ConfidenceLevel) { case AIConfidence.Panicked: if (shouldFlee) StartFleeingCombat(); else CurrentStrategy = AIBattleStrategy.DistanceToRecoup; break; case AIConfidence.Nervous: if (shouldFlee) CurrentStrategy = AIBattleStrategy.DistanceToRecoup; else CurrentStrategy = AIBattleStrategy.DistanceToRanged; break; case AIConfidence.Calm: if (shouldFlee) CurrentStrategy = AIBattleStrategy.DistanceToRanged; else CurrentStrategy = AIBattleStrategy.LureIntoCounter; break; case AIConfidence.Confident: if (shouldFlee) CurrentStrategy = AIBattleStrategy.LureIntoCounter; else CurrentStrategy = AIBattleStrategy.ChargeToAttack; break; case AIConfidence.Reckless: CurrentStrategy = AIBattleStrategy.ChargeToAttack; break; } } public void StartFleeingCombat() { } void Start() { } void Update() { } } }