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#

3 years ago
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()
{
}
}
}