summaryrefslogtreecommitdiff
path: root/Thronefall_v1.0/Decompile/MineShaft.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Thronefall_v1.0/Decompile/MineShaft.cs')
-rw-r--r--Thronefall_v1.0/Decompile/MineShaft.cs141
1 files changed, 141 insertions, 0 deletions
diff --git a/Thronefall_v1.0/Decompile/MineShaft.cs b/Thronefall_v1.0/Decompile/MineShaft.cs
new file mode 100644
index 0000000..6ac6218
--- /dev/null
+++ b/Thronefall_v1.0/Decompile/MineShaft.cs
@@ -0,0 +1,141 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class MineShaft : IncomeModifyer
+{
+ public int incomeReductionPerTurn = 1;
+
+ public int minimumIncome = 1;
+
+ private bool firstNightPassed;
+
+ private PlayerManager playerManager;
+
+ public Transform mineEntrance;
+
+ [SerializeField]
+ private float mineEnterDistance = 3f;
+
+ [SerializeField]
+ private float mineEnterAngleDotProd = 0.8f;
+
+ [SerializeField]
+ private float playerEnterTimerMax = 0.75f;
+
+ [SerializeField]
+ private float cooldownAfterTeleport = 1f;
+
+ private float playerEnterTimer;
+
+ public static List<MineShaft> allMineShafts = new List<MineShaft>();
+
+ private BuildSlot myBuildSlot;
+
+ private float cooldown;
+
+ public BuildSlot MyBuildSlot => myBuildSlot;
+
+ public void SetCooldown(float _cooldown)
+ {
+ cooldown = _cooldown;
+ }
+
+ private void Start()
+ {
+ playerManager = PlayerManager.Instance;
+ myBuildSlot = GetComponent<BuildSlot>();
+ playerEnterTimer = playerEnterTimerMax;
+ if (!allMineShafts.Contains(this))
+ {
+ allMineShafts.Add(this);
+ }
+ for (int num = allMineShafts.Count - 1; num >= 0; num--)
+ {
+ if (allMineShafts[num] == null)
+ {
+ allMineShafts.RemoveAt(num);
+ }
+ }
+ SortAllMineShafts();
+ }
+
+ private void SortAllMineShafts()
+ {
+ allMineShafts.Sort(delegate(MineShaft mineShaft1, MineShaft mineShaft2)
+ {
+ Vector3 position = mineShaft1.gameObject.transform.position;
+ Vector3 position2 = mineShaft2.gameObject.transform.position;
+ int num = position.z.CompareTo(position2.z);
+ if (num != 0)
+ {
+ return num;
+ }
+ int num2 = position.x.CompareTo(position2.x);
+ return (num2 != 0) ? num2 : position.y.CompareTo(position2.y);
+ });
+ }
+
+ public static MineShaft FindNextMineShaftAfter(int _i)
+ {
+ for (int num = (_i + 1) % allMineShafts.Count; num != _i; num = (num + 1) % allMineShafts.Count)
+ {
+ MineShaft mineShaft = allMineShafts[num];
+ if (mineShaft.MyBuildSlot.Level > 0 && mineShaft.buildingInteractor.buildingHP.TaggedObj.Tags.Contains(TagManager.ETag.AUTO_Alive))
+ {
+ return mineShaft;
+ }
+ }
+ return null;
+ }
+
+ private void Update()
+ {
+ cooldown -= Time.deltaTime;
+ if (MyBuildSlot.Level <= 0 || !buildingInteractor.buildingHP.TaggedObj.Tags.Contains(TagManager.ETag.AUTO_Alive) || cooldown > 0f)
+ {
+ return;
+ }
+ bool flag = false;
+ PlayerMovement[] registeredPlayers = playerManager.RegisteredPlayers;
+ foreach (PlayerMovement playerMovement in registeredPlayers)
+ {
+ if (!((mineEntrance.position - playerMovement.transform.position).magnitude < mineEnterDistance) || !(Vector3.Dot(mineEntrance.localToWorldMatrix.MultiplyVector(new Vector3(0f, 0f, 1f)).normalized, playerMovement.Velocity.normalized) > mineEnterAngleDotProd))
+ {
+ continue;
+ }
+ playerEnterTimer -= Time.deltaTime;
+ flag = true;
+ if (playerEnterTimer <= 0f)
+ {
+ MineShaft mineShaft = FindNextMineShaftAfter(allMineShafts.IndexOf(this));
+ if ((bool)mineShaft)
+ {
+ Vector3 position = mineShaft.transform.position;
+ position += mineShaft.mineEntrance.localToWorldMatrix.MultiplyVector(new Vector3(0f, 0f, -1f));
+ playerMovement.TeleportTo(position);
+ mineShaft.SetCooldown(cooldownAfterTeleport);
+ SetCooldown(cooldownAfterTeleport);
+ }
+ }
+ }
+ if (!flag)
+ {
+ playerEnterTimer = playerEnterTimerMax;
+ }
+ }
+
+ public override void OnDawn()
+ {
+ if (myBuildSlot.Level > 0 && !buildingInteractor.KnockedOutTonight)
+ {
+ if (!firstNightPassed)
+ {
+ firstNightPassed = true;
+ }
+ else
+ {
+ myBuildSlot.GoldIncome = Mathf.Max(myBuildSlot.GoldIncome - incomeReductionPerTurn, minimumIncome);
+ }
+ }
+ }
+}