public override float Evaluate(TacticalTaskConfig config) { // unpack config var target = config.target; var controller = config.controller; var teammates = config.teammates; var enemies = config.enemies; // score wrt distance float distanceScore = 1.0f / Mathf.Min(Vector3.Distance(target.transform.position, controller.transform.position), 1.0f); // score wrt duplicate work bool duplicate = false; for (int i = 0; i < teammates.Count; i++) { // check if this teammate is doing the same var task = TacticalPlanner.CurrentTask(teammates[i]); if (task.prototype.type == this.type && task.target == target) { duplicate = true; break; } } float duplicateScore = duplicate ? 0.0f : 1.0f; // score wrt danger float dangerScoreBase = 0.25f; float dangerScore = dangerScoreBase; for (int i = 0; i < enemies.Count; i++) { if (Vector3.Distance(enemies[i].transform.position, target.transform.position) < 20.0f) { dangerScore *= 2.0f; } } dangerScore -= dangerScoreBase; // score wrt easiness var ps = target.GetComponent <PowerSourceController>(); float easinessScore = (ps.CurrentPower / ps.m_MaxPower); float initiative = Random.Range(0.0f, 0.3f); float distanceWeight = 3.0f; float duplicateWeight = -0.9f; float dangerWeight = -0.5f; float easinessWeight = 0.5f; float finalScore = initiative + distanceWeight * distanceScore + duplicateWeight * duplicateScore + dangerWeight * dangerScore + easinessWeight * easinessScore; return(Mathf.Clamp01(finalScore)); }
public override float Evaluate(TacticalTaskConfig config) { var target = config.target; // here target is an chokepoint area volume var controller = config.controller; var teammates = config.teammates; var enemies = config.enemies; float distanceScore = 1.0f / (Vector3.Distance(target.transform.position, controller.transform.position) + 1.0f); // score wrt duplicate work bool duplicate = false; for (int i = 0; i < teammates.Count; i++) { // check if this teammate is doing the same var task = TacticalPlanner.CurrentTask(teammates[i]); if (task.prototype.type == this.type && task.target == target) { duplicate = true; break; } } float duplicateScore = duplicate ? 0.0f : 1.0f; float dangerScoreBase = 0.25f; float dangerScore = dangerScoreBase; for (int i = 0; i < enemies.Count; i++) { if (Vector3.Distance(enemies[i].transform.position, target.transform.position) < 20.0f) { dangerScore *= 2.0f; } } dangerScore -= dangerScoreBase; float initiative = 0.0f; // = target.areaImportance * (1 - duplicateScore); float distanceWeight = 0.5f; float dangerWeight = -0.2f; float finalScore = initiative + distanceWeight * distanceScore + dangerWeight * dangerScore; return(Mathf.Clamp01(finalScore)); }
public override void Act(AIStateController controller) { controller.TransitionToState(TacticalPlanner.NextState(controller)); }