using asap.core; using cfg; using LitJson; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace GameCore { public class RodGSAData { public int GloveID; public Dictionary RodToSkin = new Dictionary(); public List GloveIds = new List(); public List SkinIds = new List(); public List GloveNewIds = new List(); public List SkinNewIds = new List(); } public partial class PlayerFishData { #region 鱼杆皮肤 public RodGSAData rodAccessoriesData; string InitRodAccessoriesDataKey = "InitRodAccessoriesData"; public GloveData GetGloveData { get { return _tables.TbGloveData.GetOrDefault(rodAccessoriesData.GloveID); } } public void InitRodAccessoriesData() { if (rodAccessoriesData == null || rodAccessoriesData.GloveID == 0) { rodAccessoriesData = new RodGSAData(); rodAccessoriesData.GloveID = _tables.TbGlobalConfig.InitGloveID; rodAccessoriesData.GloveIds = new List() { _tables.TbGlobalConfig.InitGloveID }; } } /// /// 获取鱼杆对应的皮肤 /// /// /// public int GetRodSkin(int rodId) { if (rodAccessoriesData.RodToSkin.ContainsKey(rodId)) { return rodAccessoriesData.RodToSkin[rodId]; } return rodId; } /// /// 设置鱼杆对应的皮肤 /// /// /// public void SetRodSkin(int rodId, int skinId) { if (skinId <= 0) { skinId = rodId; } rodAccessoriesData.RodToSkin[rodId] = skinId; SaveInitRodAccessoriesData(); } public void InitRodAccessoriesData(string value) { rodAccessoriesData = Newtonsoft.Json.JsonConvert.DeserializeObject(value); } public void SaveInitRodAccessoriesData() { string value = Newtonsoft.Json.JsonConvert.SerializeObject(rodAccessoriesData); PlayFabMgr.Instance.UpdateUserDataValue(InitRodAccessoriesDataKey, value); } /// /// 手是否解锁 /// /// /// public bool IsGloveUnlocked(int gloveId) { return rodAccessoriesData.GloveIds.Contains(gloveId); } /// /// 皮肤是否解锁 /// /// /// public bool IsSkinUnlocked(int skinId) { return rodAccessoriesData.SkinIds.Contains(skinId); } /// /// 解锁手 /// /// public void UnlockGlove(int gloveId) { if (!IsGloveUnlocked(gloveId)) { rodAccessoriesData.GloveIds.Add(gloveId); rodAccessoriesData.GloveNewIds.Add(gloveId); SaveInitRodAccessoriesData(); } else { Debug.LogError("手投放重复:" + gloveId); } } /// /// 解锁皮肤 /// /// public void UnlockSkin(int skinId) { if (!IsSkinUnlocked(skinId)) { rodAccessoriesData.SkinIds.Add(skinId); rodAccessoriesData.SkinNewIds.Add(skinId); SaveInitRodAccessoriesData(); } else { Debug.LogError("鱼杆皮肤投放重复:" + skinId); } } /// /// 获取是否是没查看过的手 /// /// /// public bool IsNewGlove(int skinId) { return rodAccessoriesData.GloveNewIds.Contains(skinId); } /// /// 是否是没查看过的皮肤 /// /// /// public bool IsNewSkin(int skinId) { bool isNew = rodAccessoriesData.SkinNewIds.Contains(skinId); if (isNew) { rodAccessoriesData.SkinNewIds.Remove(skinId); } return isNew; } /// /// 取消new标记 手 /// /// public void RemoveGloveNewId() { if (rodAccessoriesData.GloveNewIds.Count > 0) { rodAccessoriesData.GloveNewIds.Clear(); SaveInitRodAccessoriesData(); } } #endregion 鱼杆皮肤 #region 鱼杆升级 //合成或强化鱼竿 bool EnhanceConsumed(int quality, int fragmentID, int rquiredFragments) { if (rodData.TryGetValue(fragmentID, out int rodCount) && rodCount >= rquiredFragments) { rodData[fragmentID] -= rquiredFragments; #if AGG using (var e = GEvent.GameEvent("item_change", gaSend: true)) { e.AddContent("item_id", fragmentID) .AddContent("state_info", "cost") .AddContent("change_num", rquiredFragments); } #endif return true; } else { rquiredFragments -= rodCount; RodFragmentExchange rodFragmentExchange = _tables.TbRodFragmentExchange.GetOrDefault(quality); int fragment = 0; if (rodFragmentExchange != null) { rquiredFragments *= rodFragmentExchange.ExchangeRate; fragment = GContext.container.Resolve().GetRodPiece(rodFragmentExchange.GeneralFragmentID); } if (fragment >= rquiredFragments) { if (rodData.ContainsKey(fragmentID)) { rodData[fragmentID] = 0; } rodData[rodFragmentExchange.GeneralFragmentID] -= rquiredFragments; #if AGG if (rodCount > 0) { using (var e = GEvent.GameEvent("item_change", gaSend: true)) { e.AddContent("item_id", fragmentID) .AddContent("state_info", "cost") .AddContent("change_num", rodCount); } } using (var e = GEvent.GameEvent("item_change", gaSend: true)) { e.AddContent("item_id", rodFragmentExchange.GeneralFragmentID) .AddContent("state_info", "cost") .AddContent("change_num", rquiredFragments); } #endif return true; } } return false; } public void AscendRod(int id) { RodData _rodData = _tables.TbRodData.GetOrDefault(id); if (_rodData != null) { bool isUp = false; RodAscend rodAscend = _tables.TbRodAscend.GetOrDefault(_rodData.AscendID); int rquiredFragments; int fragmentID = rodAscend.FragmentID; int quality = _rodData.Quality; if (rodData.ContainsKey(id)) { rquiredFragments = rodAscend.AscentTransformed[rodData[id] + 1]; if (rodData[id] < rodAscend.AscentTransformed.Count - 1 && EnhanceConsumed(quality, fragmentID, rquiredFragments)) { isUp = true; rodData[id] += 1; } } else { rquiredFragments = rodAscend.AscentTransformed[0]; if (rodData.TryGetValue(fragmentID, out int rodCount) && rodCount >= rquiredFragments) { rodData[fragmentID] -= rquiredFragments; #if AGG using (var e = GEvent.GameEvent("item_change", gaSend: true)) { e.AddContent("item_id", fragmentID) .AddContent("state_info", "cost") .AddContent("change_num", rquiredFragments); } #endif isUp = true; rodData.Add(id, 0); } } if (isUp) { #if AGG using (var e = GEvent.GameEvent("rod_upgrade")) { e.AddContent("rod_id", id) .AddContent("rod_level", GetRodLevel(id)) .AddContent("resin_consume", 0) .AddContent("rod_star", rodData[id]) .AddContent("rod_chips_consume", rquiredFragments); } #endif PlayFabMgr.Instance.UpdateUserDataValue("RodData", JsonMapper.ToJson(rodData)); //鱼竿红点数据修改 CheckRodRedPointUp(); //合成鱼竿 CheckAllRodUpLevel(); } } } #endregion #region 荣耀等级 Dictionary _honorlevel = new Dictionary(); public int GetHonorLevel(int honorId) { if (_honorlevel.TryGetValue(honorId, out int level)) { return level; } return 0; } public int GetHonorLevelAttribute(int quality, int starAdd = 0) { RodRodLevelPeak rodLevelPeak = _tables.TbRodRodLevelPeak.GetOrDefault(quality); //星级对属性的加成 某几个属性加多少加到多少星 int level = GetHonorLevel(quality) + starAdd; if (rodLevelPeak != null && level > 0) { List peakBasicStats = rodLevelPeak.PeakBasicStats; int value; int count = peakBasicStats.Count; if (level > count) { value = peakBasicStats[count - 1]; value += (level - count) * (peakBasicStats[count - 1] - peakBasicStats[count - 2]); } else { value = peakBasicStats[level - 1]; } return value; } return 0; } public void HonorLevelUp(RodData rodData) { PlayerData playerData = GContext.container.Resolve(); RodAscend rodAscend = _tables.TbRodAscend.GetOrDefault(rodData.AscendID); int quality = rodData.Quality; int fragmentID = rodAscend.FragmentID; RodRodLevelPeak rodLevelPeak = _tables.TbRodRodLevelPeak.GetOrDefault(rodData.Quality); if (rodLevelPeak == null) { Debug.LogError($"[FishingRodHonorlevelPanel]OnClickUpGray: No RodRodLevelPeak data found for Quality {quality}"); return; } int currentHonorLevel = GetHonorLevel(rodData.Quality); if (currentHonorLevel >= rodLevelPeak.ItemConsume.Count) { currentHonorLevel = rodLevelPeak.ItemConsume.Count - 1; } int requiredItems = rodLevelPeak.ItemConsume[currentHonorLevel]; int fragmentItems = rodLevelPeak.FragmentConsume[currentHonorLevel]; if (playerData.pearl >= requiredItems && EnhanceConsumed(quality, fragmentID, fragmentItems)) { playerData.SetPearl(playerData.pearl - requiredItems); if (_honorlevel.ContainsKey(quality)) { _honorlevel[quality]++; } else { _honorlevel[quality] = 1; } SaveHonorLevelData(); } } string HonorLevelDataKey = "HonorLevelData"; public void SaveHonorLevelData() { string value = Newtonsoft.Json.JsonConvert.SerializeObject(_honorlevel); PlayFabMgr.Instance.UpdateUserDataValue(HonorLevelDataKey, value); } #endregion 荣耀等级 #region 鱼杆词条星级相关 //计算升级和强化后的属性 public List GetRodAttribute(int id, bool isMax = false, int levelAdd = 0, int starAdd = 0) { RodData rodData = _tables.TbRodData.GetOrDefault(id); RodAscend rodAscend = _tables.TbRodAscend.GetOrDefault(rodData.AscendID); RodLevelup rodLevelup = _tables.TbRodLevelup.GetOrDefault(rodData.LevelupID); int star = isMax ? rodAscend.MaxAscent : GetRodPiece(rodData.ID) + starAdd; int level = isMax ? rodLevelup.MaxLevel - 1 : GetRodLevel(rodData.ID) + levelAdd; List list = new List(); for (int i = 0; i < rodData.InitialBasicStats.Count; i++) { list.Add(0); } //星级对属性的加成 某几个属性加多少加到多少星 var AscentBasicStats = rodAscend.AscentBasicStat; var AscentBasicStatList = rodAscend.AscentBasicStatList; int index; for (int i = 0; i < star; i++) { var AscentBasicStat = AscentBasicStats[i]; int count = AscentBasicStat.Count; for (int j = 0; j < count; j++) { //InitialBasicStats 中第 AscentBasicStat[j] 个值加 i 星的值 累加 index = AscentBasicStat[j] - 1; list[index] = AscentBasicStatList[i][j]; } } //等级对属性的加成 每个属性升到多少级 var levelupBasicStats = rodLevelup.LevelupBasicStats; for (int j = 0; j < list.Count; j++) { list[j] += levelupBasicStats[j][level] + rodData.InitialBasicStats[j]; } list[0] += GetHonorLevelAttribute(rodData.Quality); return list; } #region 工具 //获取鱼竿某一星级各个词条的等级 public int[] GetPerkLevel(int perkIDListCount, int star, List DefaultPerk, List PerkUnlockOrder) { int[] lv = new int[perkIDListCount]; for (int i = 0; i < DefaultPerk.Count; i++) { lv[DefaultPerk[i] - 1]++; } for (int i = 0; i < star; i++) { if (PerkUnlockOrder[i] <= perkIDListCount) { //每一星升级的是第几个特性 lv[PerkUnlockOrder[i] - 1]++; } } return lv; } //获取鱼竿某一星级能解锁的词条ID及值 public Dictionary GetRodDuelPerk(int id, int star) { RodData rodData = _tables.TbRodData.GetOrDefault(id); RodAscend curRodAscend = _tables.TbRodAscend.GetOrDefault(rodData.AscendID); int perkIDListCount = curRodAscend.PerkIDList.Count; int[] lv = GetPerkLevel(perkIDListCount, star, curRodAscend.DefaultPerk, curRodAscend.PerkUnlockOrder); Dictionary RodPerkDic = new Dictionary(); for (int i = 0; i < perkIDListCount; i++) { int level = lv[i]; if (level > 0) { var rodEngancePerk = _tables.TbRodAscendPerk.GetOrDefault(curRodAscend.PerkIDList[i]); if (rodEngancePerk.DuelPerk) { List PerkDataList = curRodAscend.PerkDataList[i]; if (level > PerkDataList.Count) { Debug.LogError($"GetRodPerk: rod {id} perkID {curRodAscend.PerkIDList[i]} level {level} is out of range (1 - {PerkDataList.Count})"); } else { RodPerkDic[curRodAscend.PerkIDList[i]] = PerkDataList[level - 1]; } } } } return RodPerkDic; } //获取鱼竿某一星级能解锁的词条类型及值 public Dictionary GetRodPerk(int id, int star) { RodData rodData = _tables.TbRodData.GetOrDefault(id); RodAscend curRodAscend = _tables.TbRodAscend.GetOrDefault(rodData.AscendID); int perkIDListCount = curRodAscend.PerkIDList.Count; int[] lv = GetPerkLevel(perkIDListCount, star, curRodAscend.DefaultPerk, curRodAscend.PerkUnlockOrder); Dictionary RodPerkDic = new Dictionary(); for (int i = 0; i < curRodAscend.PerkDataList.Count; i++) { int level = lv[i]; if (level > 0) { var rodEngancePerk = _tables.TbRodAscendPerk.GetOrDefault(curRodAscend.PerkIDList[i]); //第i条第lv[i]级 直接读数值 List PerkDataList = curRodAscend.PerkDataList[i]; if (level > PerkDataList.Count) { Debug.LogError($"GetRodPerk: rod {id} perkID {curRodAscend.PerkIDList[i]} level {level} is out of range (1 - {PerkDataList.Count})"); } else { RodPerkDic[rodEngancePerk.PerkType] = PerkDataList[level - 1]; } } } return RodPerkDic; } //获取鱼竿某一星级能解锁的词条类型及等级 public Dictionary GetRodPerkLevel(int id, int star) { RodData rodData = _tables.TbRodData.GetOrDefault(id); RodAscend curRodAscend = _tables.TbRodAscend.GetOrDefault(rodData.AscendID); int perkIDListCount = curRodAscend.PerkIDList.Count; int[] lv = GetPerkLevel(perkIDListCount, star, curRodAscend.DefaultPerk, curRodAscend.PerkUnlockOrder); Dictionary RodPerkDic = new Dictionary(); for (int i = 0; i < perkIDListCount; i++) { int level = lv[i]; if (level > 0) { var rodEngancePerk = _tables.TbRodAscendPerk.GetOrDefault(curRodAscend.PerkIDList[i]); RodPerkDic[rodEngancePerk.PerkType] = (curRodAscend.PerkIDList[i], level); } } return RodPerkDic; } //解析词条的值 public float GetRodPerkValue(RodPerkType rodPerkType, Dictionary RodPerkDic) { if (RodPerkDic.TryGetValue(rodPerkType, out string perk)) { if (perk.Contains('|')) { Debug.LogError($"GetRodPerkValue: rodPerkType {rodPerkType} perk {perk} cannot convert to float directly"); string[] values = perk.Split('|'); return float.Parse(values[0]); } return float.Parse(perk); } return 0; } public static string GetPerkDesc(RodPerkType rodPerkType, string des, string value) { var values = value.Split('|'); string str = LocalizationMgr.GetText(des); try { switch (rodPerkType) { case RodPerkType.BattlePerk_AllToAtkSpeed: str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[0]).ToPercentageString(), values[1], float.Parse(values[2]).ToPercentageString()); break; case RodPerkType.BattlePerk_ComboToExDmg: str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[0]).ToPercentageString(), values[1]); break; case RodPerkType.BattlePerk_FishSkillToAtkSpeed: case RodPerkType.BattlePerk_FishEscapeToAtkSpeed: str = LocalizationMgr.GetFormatTextValue(des, values[0], float.Parse(values[1]).ToPercentageString()); break; case RodPerkType.BattlePerk_PiercingAddDamage: str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[1]).ToPercentageString(), values[0]); break; case RodPerkType.BattlePerk_PiercingToCombo: case RodPerkType.BattlePerk_TensionToCrit: case RodPerkType.BattlePerk_PiercingCritDmg: case RodPerkType.FactoryLabel_ScaleG: case RodPerkType.FactoryLabel_Ilmarinen: case RodPerkType.FactoryLabel_ChromaCast: case RodPerkType.FactoryLabel_Victoria: case RodPerkType.FactoryLabel_Sakura: case RodPerkType.FactoryLabel_Titan: str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[0]).ToPercentageString(), float.Parse(values[1]).ToPercentageString()); break; case RodPerkType.BattlePerk_ComboToCombo: str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[0]).ToPercentageString(), float.Parse(values[1]).ToPercentageString(), float.Parse(values[2]).ToPercentageString()); break; case RodPerkType.NewPiercingZone: break; default: if (!value.Contains('|')) { str = LocalizationMgr.GetFormatTextValue(des, float.Parse(value).ToPercentageString()); } else { str = LocalizationMgr.GetFormatTextValue(des, float.Parse(values[0]).ToPercentageString(), float.Parse(values[1]).ToPercentageString()); Debug.LogError($"GetPerkDesc error: no case for rodPerkType: {rodPerkType}, des: {des}, value: {value}"); } break; } } catch (Exception e) { Debug.LogError($"GetPerkDesc error: {e.Message}, rodPerkType: {rodPerkType}, des: {des}, value: {value}"); } return str; } /// /// 设置星级展示 /// /// /// /// /// /// /// /// public static int SetRodStar(int star, int MaxAscent, List star_empty_list, List star_empty_image, List starList, bool isUp = false) { if (star > MaxAscent || star < 0) { Debug.LogError($"SetRodStar: star {star} is out of range (0 - {MaxAscent})"); star = MaxAscent; } int Quality = MaxAscent / 3; if (MaxAscent > 15) { Debug.LogError("MaxAscent >> show == 15"); Quality = MaxAscent / 4; } if (Quality > 5) { Debug.LogError("MaxAscent >> show == 20"); Quality = 5; } int show = star; int startIndex = 0; if (star > Quality * 3) { show = star - Quality * 3; startIndex = 3; } else if (star > Quality * 2) { show = star - Quality * 2; startIndex = 2; } else if (star > Quality) { show = star - Quality; startIndex = 1; } int index = startIndex; for (int i = 0; i < starList.Count; i++) { starList[i].gameObject.SetActive(i < Quality); star_empty_list[i].SetActive(i < Quality); if (i < show) { starList[i].SetStar(startIndex + 1); } else if (i < Quality) { starList[i].SetStar(startIndex); } if (star_empty_image != null) { if (index > 0) { if (index > 3) { Debug.LogError("SetRodStar index > 3, index = " + index); index = 3; } star_empty_image[i].gameObject.SetActive(true); star_empty_image[i].sprite = starList[i].Star[index - 1].sprite; } else { star_empty_image[i].gameObject.SetActive(false); } } } if (isUp) { if (show > 0) { starList[show - 1].PlayAni(); if (star_empty_image != null) { index = startIndex; if (index > 0) { star_empty_image[show - 1].gameObject.SetActive(true); star_empty_image[show - 1].sprite = starList[show - 1].Star[index - 1].sprite; } else { star_empty_image[show - 1].gameObject.SetActive(false); } } } } return Quality; } #endregion 工具 #endregion 鱼杆词条星级相关 } }