summaryrefslogtreecommitdiff
path: root/Thronefall_v1.0/Decompile/CommandUnits.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Thronefall_v1.0/Decompile/CommandUnits.cs')
-rw-r--r--Thronefall_v1.0/Decompile/CommandUnits.cs261
1 files changed, 261 insertions, 0 deletions
diff --git a/Thronefall_v1.0/Decompile/CommandUnits.cs b/Thronefall_v1.0/Decompile/CommandUnits.cs
new file mode 100644
index 0000000..d439867
--- /dev/null
+++ b/Thronefall_v1.0/Decompile/CommandUnits.cs
@@ -0,0 +1,261 @@
+using System.Collections.Generic;
+using Pathfinding;
+using Rewired;
+using UnityEngine;
+
+public class CommandUnits : MonoBehaviour
+{
+ public static CommandUnits instance;
+
+ public UnitCommandRadiusAnimation rangeIndicator;
+
+ public GameObject commandingIndicator;
+
+ public ParticleSystem dropWaypointFx;
+
+ public int drowWaypointParticleCount = 100;
+
+ public float attractRange;
+
+ public string graphNameOfPlayerUnits;
+
+ public float unitDistanceFromEachOther = 2f;
+
+ public float unitDistanceMoveStep = 0.5f;
+
+ public int maxPositioningRepeats = 5;
+
+ public float holdToHoldPositionTime = 1f;
+
+ private ThronefallAudioManager audioManager;
+
+ private AudioSet audioSet;
+
+ private NNConstraint nearestConstraint = new NNConstraint();
+
+ private List<PathfindMovementPlayerunit> playerUnitsCommanding = new List<PathfindMovementPlayerunit>();
+
+ private List<PathfindMovementPlayerunit> playerUnitsCommandingBuffer = new List<PathfindMovementPlayerunit>();
+
+ private Player input;
+
+ [HideInInspector]
+ public bool commanding;
+
+ private TagManager tagManager;
+
+ private AstarPath astarPath;
+
+ private PlayerUpgradeManager playerUPgradeManager;
+
+ private Hp hpPlayer;
+
+ private float timeSincePlace;
+
+ private bool switchedToHold;
+
+ private List<AutoAttack> autoAttacksToEnable = new List<AutoAttack>();
+
+ private void Awake()
+ {
+ instance = this;
+ }
+
+ private void Start()
+ {
+ audioManager = ThronefallAudioManager.Instance;
+ audioSet = audioManager.audioContent;
+ input = ReInput.players.GetPlayer(0);
+ tagManager = TagManager.instance;
+ astarPath = AstarPath.active;
+ nearestConstraint.graphMask = GraphMask.FromGraphName(graphNameOfPlayerUnits);
+ playerUPgradeManager = PlayerUpgradeManager.instance;
+ hpPlayer = GetComponent<Hp>();
+ }
+
+ private void Update()
+ {
+ if (!commanding)
+ {
+ if (input.GetButtonDown("Command Units"))
+ {
+ rangeIndicator.Activate();
+ }
+ if (input.GetButton("Command Units") && hpPlayer.HpValue > 0f)
+ {
+ foreach (TaggedObject playerUnit in TagManager.instance.PlayerUnits)
+ {
+ if (tagManager.MeasureDistanceToTaggedObject(playerUnit, base.transform.position) <= attractRange)
+ {
+ OnUnitAdd(playerUnit);
+ }
+ }
+ }
+ else if (playerUnitsCommanding.Count > 0)
+ {
+ commanding = true;
+ }
+ }
+ else
+ {
+ if (input.GetButtonDown("Command Units") || hpPlayer.HpValue <= 0f)
+ {
+ PlaceCommandedUnitsAndCalculateTargetPositions();
+ timeSincePlace = 0f;
+ switchedToHold = false;
+ }
+ if (input.GetButton("Command Units") && hpPlayer.HpValue > 0f)
+ {
+ timeSincePlace += Time.deltaTime;
+ if (timeSincePlace > holdToHoldPositionTime && !switchedToHold)
+ {
+ switchedToHold = true;
+ MakeUnitsInBufferHoldPosition();
+ }
+ }
+ if (input.GetButtonUp("Command Units") || hpPlayer.HpValue <= 0f)
+ {
+ commanding = false;
+ timeSincePlace = 0f;
+ }
+ }
+ for (int num = playerUnitsCommanding.Count - 1; num >= 0; num--)
+ {
+ PathfindMovementPlayerunit pathfindMovementPlayerunit = playerUnitsCommanding[num];
+ pathfindMovementPlayerunit.HomePosition = base.transform.position;
+ if (!pathfindMovementPlayerunit.enabled)
+ {
+ playerUnitsCommanding.RemoveAt(num);
+ OnUnitRemove(pathfindMovementPlayerunit);
+ }
+ }
+ if (playerUnitsCommanding.Count > 0 && !input.GetButton("Command Units"))
+ {
+ commandingIndicator.SetActive(value: true);
+ }
+ else
+ {
+ commandingIndicator.SetActive(value: false);
+ }
+ if (!input.GetButton("Command Units") && rangeIndicator.Active)
+ {
+ rangeIndicator.Deactivate();
+ }
+ }
+
+ public void MakeUnitsInBufferHoldPosition()
+ {
+ if (playerUnitsCommandingBuffer.Count > 0)
+ {
+ audioManager.PlaySoundAsOneShot(audioSet.HoldPosition, 0.45f, 0.9f + Random.value * 0.2f, audioManager.mgSFX, 10);
+ }
+ foreach (PathfindMovementPlayerunit item in playerUnitsCommandingBuffer)
+ {
+ item.HoldPosition = true;
+ }
+ }
+
+ public void ForceCommandingEnd()
+ {
+ if (commanding)
+ {
+ PlaceCommandedUnitsAndCalculateTargetPositions();
+ }
+ }
+
+ public void PlaceCommandedUnitsAndCalculateTargetPositions()
+ {
+ if (!commanding)
+ {
+ return;
+ }
+ if (playerUnitsCommanding.Count > 0)
+ {
+ audioManager.PlaySoundAsOneShot(audioSet.PlaceCommandingUnits, 0.35f, 0.9f + Random.value * 0.2f, audioManager.mgSFX, 10);
+ }
+ dropWaypointFx.Emit(drowWaypointParticleCount);
+ foreach (PathfindMovementPlayerunit item in playerUnitsCommanding)
+ {
+ OnUnitRemove(item);
+ }
+ foreach (AutoAttack item2 in autoAttacksToEnable)
+ {
+ if ((bool)item2 && item2.GetComponent<Hp>().HpValue > 0f)
+ {
+ item2.enabled = true;
+ }
+ }
+ autoAttacksToEnable.Clear();
+ for (int i = 0; i < playerUnitsCommanding.Count; i++)
+ {
+ Vector3 vector = Quaternion.AngleAxis((float)(i / playerUnitsCommanding.Count) * 360f, Vector3.up) * Vector3.right * unitDistanceMoveStep;
+ playerUnitsCommanding[i].HomePosition = astarPath.GetNearest(base.transform.position + vector + new Vector3(Random.value - 0.5f, 0f, Random.value - 0.5f) * unitDistanceMoveStep * 0.1f, nearestConstraint).position;
+ }
+ for (int j = 0; j < maxPositioningRepeats; j++)
+ {
+ bool flag = false;
+ for (int k = 0; k < playerUnitsCommanding.Count; k++)
+ {
+ for (int l = k + 1; l < playerUnitsCommanding.Count; l++)
+ {
+ if (!((playerUnitsCommanding[k].HomePosition - playerUnitsCommanding[l].HomePosition).magnitude > unitDistanceFromEachOther))
+ {
+ Vector3 vector2 = (playerUnitsCommanding[k].HomePosition - playerUnitsCommanding[l].HomePosition).normalized * unitDistanceMoveStep;
+ playerUnitsCommanding[k].HomePosition = astarPath.GetNearest(playerUnitsCommanding[k].HomePosition + vector2, nearestConstraint).position;
+ playerUnitsCommanding[l].HomePosition = astarPath.GetNearest(playerUnitsCommanding[l].HomePosition - vector2, nearestConstraint).position;
+ flag = true;
+ }
+ }
+ }
+ if (!flag)
+ {
+ break;
+ }
+ }
+ playerUnitsCommandingBuffer.Clear();
+ playerUnitsCommandingBuffer.AddRange(playerUnitsCommanding);
+ playerUnitsCommanding.Clear();
+ }
+
+ public void OnUnitAdd(TaggedObject _t)
+ {
+ PathfindMovementPlayerunit pathfindMovementPlayerunit = (PathfindMovementPlayerunit)_t.Hp.PathfindMovement;
+ if (!playerUnitsCommanding.Contains(pathfindMovementPlayerunit))
+ {
+ audioManager.PlaySoundAsOneShot(audioSet.AddedUnitToCommanding, 0.55f, 0.7f + (float)playerUnitsCommanding.Count * 0.025f, audioManager.mgSFX, 50);
+ playerUnitsCommanding.Add(pathfindMovementPlayerunit);
+ pathfindMovementPlayerunit.FollowPlayer(_follow: true);
+ MaterialFlasherFX componentInChildren = pathfindMovementPlayerunit.GetComponentInChildren<MaterialFlasherFX>();
+ if ((bool)componentInChildren)
+ {
+ componentInChildren.SetSelected(_selected: true);
+ }
+ _t.Tags.Add(TagManager.ETag.AUTO_Commanded);
+ if (playerUPgradeManager.commander)
+ {
+ pathfindMovementPlayerunit.movementSpeed *= UpgradeCommander.instance.moveSpeedMultiplicator;
+ }
+ AutoAttack[] components = _t.GetComponents<AutoAttack>();
+ foreach (AutoAttack autoAttack in components)
+ {
+ autoAttack.enabled = false;
+ autoAttacksToEnable.Add(autoAttack);
+ }
+ }
+ }
+
+ public void OnUnitRemove(PathfindMovementPlayerunit _p)
+ {
+ _p.FollowPlayer(_follow: false);
+ MaterialFlasherFX componentInChildren = _p.GetComponentInChildren<MaterialFlasherFX>();
+ if ((bool)componentInChildren)
+ {
+ componentInChildren.SetSelected(_selected: false);
+ }
+ _p.GetComponent<TaggedObject>().Tags.Remove(TagManager.ETag.AUTO_Commanded);
+ if (playerUPgradeManager.commander)
+ {
+ _p.movementSpeed /= UpgradeCommander.instance.moveSpeedMultiplicator;
+ }
+ }
+}