using System.Collections; using System.Collections.Generic; using UnityEngine; public enum RewardType { God, Remains, Resource } public enum GodType { Sun, war, spring } [System.Serializable] public struct Rates { public int GodRate; public int ResourceRate; public int RemainsRate; public Rates(int godrate, int resourcerate, int remainsrate) { GodRate = godrate; ResourceRate = resourcerate; RemainsRate = remainsrate; } // 将另一个 Rates 的值加到当前实例上 public void Add(Rates otherrate) { GodRate += otherrate.GodRate; ResourceRate += otherrate.ResourceRate; RemainsRate += otherrate.RemainsRate; } } [CreateAssetMenu(fileName = "仪式Item", menuName = "仪式/仪式Item")] public class YiShiItem : ScriptableObject { [Header("仪式名字")] public string YiShiname; [Header("仪式所需初始信仰")] public int NeedFaith; [Header("图片")] public Sprite Sprite; [Header("资源祷告词")] [TextArea()] public string ResourcePrayer; [Header("遗物祷告词")] [TextArea()] public string RemainsPrayer; [Header("降神祷告词")] [TextArea()] public string GodPrayer; [Header("消耗的资源类型")] public ResourceKind rsourceKind; [Header("神")] public GodType God; [Header("基础概率权重")] public Rates BaseRate; /// /// 减少资源 /// /// /// >0(成功)<0(失败) public int CutResource(int count = 1) { int totalcount = GameProcedureManager.Instance.StoneCount; switch (rsourceKind) { case ResourceKind.Stone: totalcount = GameProcedureManager.Instance.StoneCount; totalcount -= count; if (totalcount >= 0) { GameProcedureManager.Instance.StoneCount = totalcount; } break; case ResourceKind.faith: totalcount = GameProcedureManager.Instance.FaithCount; totalcount -= count; if (totalcount >= 0) { GameProcedureManager.Instance.FaithCount = totalcount; } break; case ResourceKind.wood: totalcount = GameProcedureManager.Instance.WoodCount; totalcount -= count; if (totalcount >= 0) { GameProcedureManager.Instance.WoodCount = totalcount; } break; default: break; } return totalcount; } /// /// 增加资源 /// public void AddResource(int count = 1) { switch (rsourceKind) { case ResourceKind.Stone: GameProcedureManager.Instance.StoneCount += count; break; case ResourceKind.faith: GameProcedureManager.Instance.FaithCount += count; break; case ResourceKind.wood: GameProcedureManager.Instance.WoodCount += count; break; default: break; } } public int ReResourceCount() { int totalcount = 0; switch (rsourceKind) { case ResourceKind.Stone: totalcount = GameProcedureManager.Instance.StoneCount; break; case ResourceKind.faith: totalcount = GameProcedureManager.Instance.FaithCount; break; case ResourceKind.wood: totalcount = GameProcedureManager.Instance.WoodCount; break; default: break; } return totalcount; } /// /// 开始仪式,计算奖励 /// public YiShiReward StartYishi(int count, List remainsItems = null) { Rates realrates = BaseRate; if (remainsItems != null)//存在遗物 { for (int i = 0; i < remainsItems.Count; i++) { realrates.Add(remainsItems[i].rates); } } RewardType rewardType = GetRandomByRates(realrates); return GetReward(count, rewardType); } private RewardType GetRandomByRates(Rates rates)//计算概率 { int totalRate = rates.GodRate + rates.ResourceRate + rates.RemainsRate; int randomValue = Random.Range(0, totalRate); // 根据随机值判断落在哪个区间 if (randomValue < rates.GodRate) { return RewardType.God; // 随机值落在 GodRate 区间 } else if (randomValue < rates.GodRate + rates.ResourceRate) { return RewardType.Resource; // 随机值落在 ResourceRate 区间 } else { return RewardType.Remains; // 随机值落在 RemainsRate 区间 } } private YiShiReward GetReward(int count, RewardType rewardType) //得到奖励 { switch (rewardType) { case RewardType.God: int num = MathGodReward(count); return new YiShiReward(rsourceKind, God, num); case RewardType.Remains: List remains = new List(); remains.Add(BagControl.Instance.bag.GetRemainsReward()); return new YiShiReward(rsourceKind, remains); case RewardType.Resource: float rangenum = Random.Range(1, 6)/2; int totalCount = (int)(count * rangenum);//-----一系列计算 AddResource(totalCount); return new YiShiReward(rsourceKind, totalCount); default: break; } return new YiShiReward(); } private int MathGodReward(int count) //得到神后的计算 { return count * 3; } public string GetRate(RewardType rewardType,List remainsItems=null) { Rates realrates = BaseRate; if (remainsItems != null)//存在遗物 { for (int i = 0; i < remainsItems.Count; i++) { realrates.Add(remainsItems[i].rates); } } int totalRate = realrates.GodRate + realrates.ResourceRate + realrates.RemainsRate; float ratenum = 0; switch (rewardType) { case RewardType.God: ratenum = (float)realrates.GodRate / totalRate; break; case RewardType.Remains: ratenum = (float)realrates.RemainsRate / totalRate; break; case RewardType.Resource: ratenum = (float)realrates.ResourceRate / totalRate; break; default: break; } if (ratenum<0.2f) { return "微小"; } else if (ratenum>=0.2f&&ratenum<0.4f) { return "较小"; } else if (ratenum>=0.4f&&ratenum<0.6f) { return "较大"; } else if (ratenum>=0.6f&&ratenum<0.8f) { return "很大"; } else if(ratenum>=0.8f&&ratenum<=1) { return "大量"; } return ""; } } public class YiShiReward { public RewardType rewardtype; public ResourceKind resourceKind; public GodType God; public List remains; public int Resourcecount; public YiShiReward() { } public YiShiReward(ResourceKind resourcekind, GodType godType, int count)//神 { rewardtype = RewardType.God; this.resourceKind = resourcekind; God = godType; Resourcecount = count; } public YiShiReward(ResourceKind resourcekind, List items)//遗物 { rewardtype = RewardType.Remains; this.resourceKind = resourcekind; remains = items; } public YiShiReward(ResourceKind resourcekind, int count)//资源 { rewardtype = RewardType.Resource; this.resourceKind = resourcekind; Resourcecount = count; } }