/********************************************************************* * \file LeafAttack.cs * \author Ryan Wang Nian Jing * \brief Leaf node implementation for AI attacking the player * when the AI is close enough after chasing * * * \copyright Copyright (c) 2022 DigiPen Institute of Technology. Reproduction or disclosure of this file or its contents without the prior written consent of DigiPen Institute of Technology is prohibited. *********************************************************************/ using SHADE; using SHADE_Scripting.AIBehaviour.BehaviourTree; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //VARIABLES public partial class LeafAttack : BehaviourTreeNode { //Holds the player game object that is to be targeted private GameObject player; } //FUNCTIONS public partial class LeafAttack : BehaviourTreeNode { public LeafAttack(string name) : base (name) { //Debug.Log("LeafAttack ctor"); } //Helper, find the nearest unobstructed waypoint to return to when chase is over public void reevaluateWaypoint() { List waypoints = (List)GetNodeData("waypoints"); Transform transform = (Transform)GetNodeData("transform"); if (waypoints == null || transform == null) { SetNodeData("currentWaypointIndex", 0); return; } int nearestWaypointIndex = 0; for (int i = 0; i < waypoints.Count; ++i) { if ((transform.GlobalPosition - waypoints[i].GetComponent().GlobalPosition).GetSqrMagnitude() < (transform.GlobalPosition - waypoints[nearestWaypointIndex].GetComponent().GlobalPosition).GetSqrMagnitude()) { nearestWaypointIndex = i; } } SetNodeData("currentWaypointIndex", nearestWaypointIndex); } public override BehaviourTreeNodeStatus Evaluate() { //Debug.LogWarning("LeafAttack"); //Fail if no target in blackboard? onEnter(BehaviourTreeNodeStatus.RUNNING); //Get Data float? captureTime; if (GetNodeData("captureTimeLeft") == null) { status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); return status; } else captureTime = (float)GetNodeData("captureTimeLeft"); if (GameObject.Find("Player") == null) { status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); return status; } else player = GameObject.Find("Player").GetValueOrDefault(); //Succeed when stand in hurt box for long enough //Debug.Log("Attempting to get blackboard data"); //Debug.Log("Got blackboard data"); captureTime -= Time.DeltaTimeF; SetNodeData("captureTimeLeft", captureTime); //Debug.Log(captureTime.ToString()); if (captureTime <= 0.0f) { //Catch player when in range for long enough //Debug.Log("Success: Caught"); player.GetScript().currentState = PlayerController.RaccoonStates.CAUGHT; status = BehaviourTreeNodeStatus.SUCCESS; onExit(BehaviourTreeNodeStatus.SUCCESS); return status; } //Return running if not success //Debug.Log("Running: About to capture in " + captureTimeLeft); status = BehaviourTreeNodeStatus.RUNNING; onExit(BehaviourTreeNodeStatus.RUNNING); return status; } }