Skip to content

Commit f268c6f

Browse files
authored
Templar's Valor Gameplay Scripts
1 parent 0376f91 commit f268c6f

9 files changed

+2085
-0
lines changed

AIBrain.cs

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using TMPro;
4+
using UnityEngine;
5+
6+
public class AIBrain : MonoBehaviour
7+
{
8+
[SerializeField] private float waitBeforeActing;
9+
[SerializeField] private float waitAfterActing;
10+
[Range(0f, 100f)]
11+
[SerializeField] private float ignoreShootChance = 20f;
12+
[SerializeField] private float ignoreHealChance = 20f;
13+
14+
private CharacterControl charCon;
15+
16+
private void Awake()
17+
{
18+
charCon = this.GetComponent<CharacterControl>();
19+
}
20+
21+
public void ChooseAction()
22+
{
23+
StartCoroutine(ChooseCo());
24+
}
25+
26+
public IEnumerator ChooseCo() //Make Choices Heres
27+
{
28+
Debug.Log(name + " is choosing an action");
29+
30+
yield return new WaitForSeconds(waitBeforeActing);
31+
32+
bool actionTaken = false;
33+
34+
charCon.GetMeleeTargets(); //Getting the melee targets
35+
36+
if(charCon.meleeTargets.Count > 0) //IF THERE ARE ENEMIES WITHIN MELEE RANGE
37+
{
38+
Debug.Log(name + "Chosen Melee");
39+
40+
charCon.currentMeleeTarget = Random.Range(0, charCon.meleeTargets.Count);
41+
42+
GameManager.instance.currentActionCost = 1;
43+
44+
StartCoroutine(WaitToEndAction(waitAfterActing));
45+
46+
charCon.animator.SetBool("isAttacking", true);
47+
charCon.DoMelee();
48+
yield return new WaitForSeconds(1.5f);
49+
charCon.animator.SetBool("isAttacking", false);
50+
actionTaken = true;
51+
}
52+
53+
if(!charCon.isPlayer && charCon.rangedEnemy || !charCon.isPlayer && charCon.magicalEnemy) //IF THE ENEMY IS RANGED & MAGICAL
54+
{
55+
charCon.GetRangedTargets();
56+
if(actionTaken == false && charCon.rangedTargets.Count > 0)
57+
{
58+
if(Random.Range(0f, 100f) > ignoreShootChance)
59+
{
60+
Debug.Log(name + "Chosen Ranged");
61+
62+
charCon.currentRangedTarget = Random.Range(0, charCon.rangedTargets.Count);
63+
64+
GameManager.instance.currentActionCost = 1;
65+
66+
StartCoroutine(WaitToEndAction(waitAfterActing));
67+
68+
if (charCon.rangedEnemy)
69+
{
70+
charCon.animator.SetBool("isRangedAttacking", true);
71+
charCon.ShootTheTarget();
72+
yield return new WaitForSeconds(1.5f);
73+
74+
charCon.animator.SetBool("isRangedAttacking", false);
75+
actionTaken = true;
76+
}
77+
78+
if (charCon.magicalEnemy)
79+
{
80+
charCon.animator.SetBool("isSpellCasting", true);
81+
charCon.ShootTheTarget();
82+
yield return new WaitForSeconds(1.5f);
83+
84+
charCon.animator.SetBool("isSpellCasting", false);
85+
actionTaken = true;
86+
}
87+
88+
}
89+
}
90+
}
91+
92+
if(!charCon.isPlayer && charCon.healerEnemy) //IF THE ENEMY IS A HEALER
93+
{
94+
charCon.GetTargetsToHeal();
95+
charCon.currentHealingTarget = Random.Range(0, charCon.healingTargets.Count);
96+
if (charCon.healingTargets.Count > 0 && charCon.healingTargets[charCon.currentHealingTarget].currentHealth
97+
< charCon.healingTargets[charCon.currentHealingTarget].maxHealth)
98+
{
99+
100+
if (actionTaken == false)
101+
{
102+
if (Random.Range(0f, 100f) > ignoreHealChance)
103+
{
104+
Debug.Log(name + "Choose to heal");
105+
106+
GameManager.instance.ActivePlayer.transform.LookAt(charCon.healingTargets[charCon.currentHealingTarget].transform);
107+
108+
GameManager.instance.currentActionCost = 1;
109+
110+
StartCoroutine(WaitToEndAction(waitAfterActing));
111+
112+
charCon.animator.SetBool("isHealing", true);
113+
charCon.healingTargets[charCon.currentHealingTarget].HealTarget(charCon.healingAmount);
114+
yield return new WaitForSeconds(1.5f);
115+
116+
charCon.animator.SetBool("isHealing", false);
117+
actionTaken = true;
118+
119+
}
120+
}
121+
}
122+
123+
}
124+
125+
if (!actionTaken) //IF NO ACTION TAKEN
126+
{
127+
var potentialMovePoints = MoveGrid.instance.GetMovePointsInRange(charCon.moveRange, transform.position); //Get the move points in range
128+
129+
if (potentialMovePoints.Count > 0)
130+
{
131+
int nearestPlayer = 0;
132+
for (int i = 1; i < GameManager.instance.PlayerTeam.Count; i++) //Find the nearest player character
133+
{
134+
if (Vector3.Distance(transform.position, GameManager.instance.PlayerTeam[nearestPlayer].transform.position)
135+
> Vector3.Distance(transform.position, GameManager.instance.PlayerTeam[i].transform.position))
136+
{
137+
nearestPlayer = i;
138+
}
139+
}
140+
141+
int selectedPoint = 0; //Select one
142+
float closestDistance = 1000f; //Never gonna need this far but just to safe keeping
143+
for (int i = 0; i < potentialMovePoints.Count; i++)
144+
{
145+
if (Vector3.Distance(GameManager.instance.PlayerTeam[nearestPlayer].transform.position, potentialMovePoints[i]) < closestDistance)
146+
{
147+
closestDistance = Vector3.Distance(GameManager.instance.PlayerTeam[nearestPlayer].transform.position, potentialMovePoints[i]);
148+
selectedPoint = i;
149+
}
150+
}
151+
152+
GameManager.instance.currentActionCost = 1; //ACTION COST FOR WALKING
153+
154+
charCon.MoveToPoint(potentialMovePoints[selectedPoint]); //MOVE TO THAT POINT
155+
156+
actionTaken = true; //ACTION TAKEN
157+
}
158+
159+
if (!actionTaken)
160+
{
161+
//skip turn
162+
GameManager.instance.EndTurn();
163+
164+
Debug.Log(name + "Skipped Turn");
165+
}
166+
}
167+
}
168+
169+
170+
IEnumerator WaitToEndAction(float timeToWait)
171+
{
172+
Debug.Log("Waiting to end action");
173+
yield return new WaitForSeconds(timeToWait);
174+
GameManager.instance.SpendTurnPoints();
175+
}
176+
177+
}

AttackRangeIndicator.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
[RequireComponent(typeof(LineRenderer))]
6+
public class AttackRangeIndicator : MonoBehaviour
7+
{
8+
public float radius = 5f; // Adjust this value to set the attack range
9+
public int segments = 50; // Number of segments for the circle
10+
public Color indicatorColor = Color.red; // Color of the indicator
11+
12+
private LineRenderer lineRenderer;
13+
14+
private void Start()
15+
{
16+
lineRenderer = GetComponent<LineRenderer>();
17+
lineRenderer.positionCount = segments + 1;
18+
lineRenderer.useWorldSpace = false;
19+
lineRenderer.startWidth = 0.05f;
20+
lineRenderer.endWidth = 0.05f;
21+
DrawCircle();
22+
}
23+
24+
private void DrawCircle()
25+
{
26+
float angle = 0f;
27+
float angleStep = 360f / segments;
28+
for (int i = 0; i < segments + 1; i++)
29+
{
30+
float x = Mathf.Sin(Mathf.Deg2Rad * angle) * radius;
31+
float z = Mathf.Cos(Mathf.Deg2Rad * angle) * radius;
32+
lineRenderer.SetPosition(i, new Vector3(x, 0, z));
33+
angle += angleStep;
34+
}
35+
}
36+
37+
private void Update()
38+
{
39+
lineRenderer.startColor = indicatorColor;
40+
lineRenderer.endColor = indicatorColor;
41+
}
42+
}

CameraSystem.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
public class CameraSystem : MonoBehaviour
6+
{
7+
public static CameraSystem instance;
8+
9+
private void Awake()
10+
{
11+
instance = this;
12+
13+
moveTarget = transform.position;
14+
}
15+
16+
[Header("Camera Variables")]
17+
public float moveSpeed, manualMoveSpeed;
18+
19+
float targetRot; //Rotation
20+
public float rotateSpeed;
21+
int currentAngle;
22+
23+
24+
[Header("Input Keys")]
25+
public KeyCode snapBackToPlayer;
26+
public KeyCode rotateLeft;
27+
public KeyCode rotateRight;
28+
29+
30+
Vector3 moveTarget; //Target that Camera should follow
31+
Vector2 moveInput; //For Manual Camera Movement
32+
33+
34+
35+
private void Start()
36+
{
37+
38+
}
39+
40+
private void Update()
41+
{
42+
if (moveTarget != transform.position)
43+
{
44+
transform.position = Vector3.MoveTowards(transform.position, moveTarget, moveSpeed * Time.deltaTime);
45+
}
46+
47+
if ((LevelManager.Instance?.PlayerCanControl ?? true) && (!PauseMenu.Instance?.IsPaused ?? false))
48+
{
49+
moveInput.x = Input.GetAxis("Horizontal");
50+
moveInput.y = Input.GetAxis("Vertical");
51+
moveInput.Normalize();
52+
53+
if (moveInput != Vector2.zero)
54+
{
55+
transform.position += ((transform.forward * (moveInput.y * manualMoveSpeed)) +
56+
(transform.right * (moveInput.x * manualMoveSpeed))) * Time.deltaTime;
57+
58+
moveTarget = transform.position;
59+
60+
}
61+
62+
if (Input.GetKeyDown(snapBackToPlayer)) //Snapping back to player
63+
{
64+
SetMoveTarget(GameManager.instance.ActivePlayer.transform.position);
65+
}
66+
67+
if (Input.GetKeyDown(rotateLeft)) //Rotate Right
68+
{
69+
currentAngle++;
70+
71+
if (currentAngle >= 4)
72+
{
73+
currentAngle = 0;
74+
}
75+
76+
}
77+
78+
if (Input.GetKeyDown(rotateRight)) //Rotate Left
79+
{
80+
currentAngle--;
81+
82+
if (currentAngle < 0)
83+
{
84+
currentAngle = 3;
85+
}
86+
}
87+
}
88+
89+
targetRot = (90f * currentAngle) + 45f;
90+
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0f, targetRot, 0f), rotateSpeed * Time.deltaTime);
91+
92+
}
93+
94+
public void SetMoveTarget(Vector3 newTarget)
95+
{
96+
moveTarget = newTarget;
97+
}
98+
}

0 commit comments

Comments
 (0)