diff options
Diffstat (limited to 'Thronefall_v1.0/Decompile/MineShaft.cs')
-rw-r--r-- | Thronefall_v1.0/Decompile/MineShaft.cs | 141 |
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); + } + } + } +} |