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;
}
}