You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
7.8 KiB
C#
213 lines
7.8 KiB
C#
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()
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|