using Core.Utilities; using System; using System.Collections.Generic; using TowerDefense.Level; using TowerDefense.Towers; using TowerDefense.UI.HUD; using UnityEngine; using UnityEngine.UI; using TMPro; using KTGMGemClient; public class EndlessRandomTower : Singleton { // 当前类所在的Btn. public Button randomBtn; //public Button skillBtn; /// /// 购买二级宝石的按钮贴图. /// public Sprite buyBtnLevelUp; protected bool bSetBuyLvlUp; protected bool bCdTimeStart; protected float btnLvlUpCdTime; public static bool MAX_INTERNAL = false; // 玩家初始阵容 protected List towerArray = new List(); protected int maxTower = 0; public static readonly int MAX_TOWERDIS = 5; // 开始出现技能塔的时间: public static float SKILL_TOWER_TIME = 30.0f; // 购买之后直接出现2级宝石的时间. public static float LEVELUP_TOWER_TIME = 10.0f; protected System.Random mRandom; protected int rTowerIdx = 2; // 所有宝石随机总权重 private int randomTotalWeight; // 所有宝石位置权重列表 private List weightList; public Text NormalDesc; public Text SkillDesc; // Start is called before the first frame update void Start() { if (!EndlessLevelManager.instanceExists) Debug.LogError("[UI] No level manager for tower list"); foreach (Tower tower in EndlessLevelManager.instance.TowerLibrary) { towerArray.Add(tower); } maxTower = towerArray.Count; while (maxTower > MAX_TOWERDIS) { maxTower--; towerArray.RemoveAt(towerArray.Count - 1); } mRandom = new System.Random(); bSetBuyLvlUp = false; bCdTimeStart = false; randomBtn.onClick.AddListener(delegate () { onClick(EFeatureTower.NULL); }); //skillBtn.onClick.AddListener(delegate () { onClick(EFeatureTower.Skill_Bomb); }); UpdateDescDisplay(); } public void UpdateDescDisplay() { int minLevel = Mathf.Min(EndlessGameUI.instance.MinLevel, 1); NormalDesc.text = $"购买{minLevel + 1}级宝石"; //SkillDesc.text = $"购买{minLevel + 1}级技能宝石"; } public void ChangeBtnClickNormal() { randomBtn.onClick.RemoveAllListeners(); //skillBtn.onClick.RemoveAllListeners(); randomBtn.onClick.AddListener(delegate () { onClick(EFeatureTower.NULL); }); //skillBtn.onClick.AddListener(delegate () { onClick(EFeatureTower.Skill_Bomb); }); } public void ChangeBtnClick() { randomBtn.onClick.RemoveAllListeners(); //skillBtn.onClick.RemoveAllListeners(); randomBtn.onClick.AddListener(() => { AudioSourceManager.Ins.Play(AudioEnum.UIDisable); }); // skillBtn.onClick.AddListener(() => // { // AudioSourceManager.Ins.Play(AudioEnum.UIDisable); // }); } /// /// 获取TowerList. /// public List towerList { get { return this.towerArray; } } public void actionTest() { multipara((str, strnew) => { Debug.Log(str + strnew); }, "Ying"); } protected void actadd(string str, string strnew) { Debug.Log("这是新增的Action String:" + str); } /// /// 用于测试Action参数的测试函数,Action多参数的用法. /// /// /// protected void multipara(Action act, string p1) { string finalstr = "Welcome to " + p1; act += this.actadd; act(finalstr, "YingYing"); } /// /// 获取序列化的Tower /// /// public Tower getRTower() { Tower t = this.towerArray[this.rTowerIdx]; rTowerIdx++; if (rTowerIdx >= this.maxTower) rTowerIdx = 2; return t; } /// /// 根据Tower名字获取当前的Tower指针。 /// /// /// public Tower getTowerByName(string name) { for (int ti = 0; ti < this.maxTower; ti++) if (name == this.towerArray[ti].towerName) return towerArray[ti]; return GetRandomTower(EFeatureTower.NULL, true); } /// /// 获取随机命中位置索引 /// private int GetRandomIndex(List list, int totalWeight) { int random = mRandom.Next(0, totalWeight); int index = -1; int total = 0; for (int i = 0; i < list.Count; ++i) { total += list[i]; if (total >= random) { index = i; break; } } return index; } /// /// 根据规则生成一个随机的塔 /// /// public Tower GetRandomTower(EFeatureTower towerType, bool isRandom) { int[] indexArr = { 0, 1, 2, 3, 4 }; if (!isRandom) { if (towerType == EFeatureTower.NULL) { // 只获得普通宝石 indexArr = new int[] { 0, 1, 2 }; } else { // 只获得技能宝石 indexArr = new int[] { 3, 4 }; } } int random = UnityEngine.Random.Range(0, indexArr.Length); return towerArray[indexArr[random]]; } /// /// 随机购买Tower的入口,如果购买成功,则需要实时更新价格 /// public void onClick(EFeatureTower towerType) { if (GameConfig.IsNewbie && !GameConfig.CanBuyNewTower) { AudioSourceManager.Ins.Play(AudioEnum.UIDisable); return; } AudioSourceManager.Ins.Play(AudioEnum.UI); Tower newTower = GetRandomTower(towerType, false); if (!newTower) throw new Exception("未能成功产生Tower"); if (newTower.towerFeature == EFeatureTower.NULL) { string tmpTowerName = newTower.towerName; towerNameLis.Add(tmpTowerName); int count = 0; bool isFirstBuy = true; for (int i = 0; i < towerNameLis.Count; i++) { if (towerNameLis[i] == tmpTowerName) { count++; if (count == 2) { isFirstBuy = false; break; } } } if (isFirstBuy) { //Debug.Log("首次购买:" + tmpTowerName); } else { //Debug.Log("购买了多次了:" + tmpTowerName); } RandomPlaceTower(newTower, -1, -1, -1, -1, isFirstBuy); } else { RandomPlaceTower(newTower, -1, -1, -1, -1, false); } } private List towerNameLis = new List();//用来判断是否是首次购买宝石 /// /// 随机找一个空白位置放置塔防 /// /// public bool RandomPlaceTower(Tower tower, int level = -1, int cost = -1, int posx = -1, int posy = -1, bool isFirstAppear = false) { EndlessGameUI gameUI = EndlessGameUI.instance; if (gameUI.isBuilding) gameUI.CancelGhostPlacement(); if (level == -1) level = Mathf.Min(EndlessGameUI.instance.MinLevel, 1); return gameUI.RandomPlaceTower(tower, posx, posy, level, cost, false, isFirstAppear); } /// /// 在固定的位置,放置一个随机的塔防类型. /// /// /// public void randomTower(int x, int y, int lvl, string tname = "") { int tidx = 0; Tower targetTower = null; if (tname == "") { tidx = mRandom.Next(0, this.maxTower); // 随机升级的Tower,不能升级成为成长骰子. int maxLoop = 20; while (this.towerArray[tidx].towerFeature != EFeatureTower.NULL) { tidx = mRandom.Next(0, this.maxTower); maxLoop--; if (maxLoop <= 0) { tidx = this.rTowerIdx; rTowerIdx++; if (rTowerIdx >= maxTower) rTowerIdx = 2; Debug.LogError("超级循环发生了."); break; } } targetTower = this.towerArray[tidx]; } else targetTower = getTowerByName(tname); // River: 随机找一个空白位置放置塔防。 EndlessGameUI.instance.RandomPlaceTower(targetTower, x, y, lvl, -1, true); } }