Main/Config/Configs/BeautyConfig.cs
New file @@ -0,0 +1,116 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年12月23日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class BeautyConfig : ConfigBase<int, BeautyConfig> { static BeautyConfig() { // 访问过静态构造函数 visit = true; } public int BeautyID; public string Name; public int BeautyQuality; public int UnlockWay; public int UnlockValue; public int UnlockNeedCnt; public int ExclusiveItemID; public int[] TalentAttrIDList; public int[] TalentAttrValueList; public int[] TalentPerLVAddList; public int EffType; public int EffTypeValue; public int EffValue; public int EffPerLVAdd; public string Desc; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out BeautyID); Name = tables[1]; int.TryParse(tables[2],out BeautyQuality); int.TryParse(tables[3],out UnlockWay); int.TryParse(tables[4],out UnlockValue); int.TryParse(tables[5],out UnlockNeedCnt); int.TryParse(tables[6],out ExclusiveItemID); if (tables[7].Contains("[")) { TalentAttrIDList = JsonMapper.ToObject<int[]>(tables[7]); } else { string[] TalentAttrIDListStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); TalentAttrIDList = new int[TalentAttrIDListStringArray.Length]; for (int i=0;i<TalentAttrIDListStringArray.Length;i++) { int.TryParse(TalentAttrIDListStringArray[i],out TalentAttrIDList[i]); } } if (tables[8].Contains("[")) { TalentAttrValueList = JsonMapper.ToObject<int[]>(tables[8]); } else { string[] TalentAttrValueListStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); TalentAttrValueList = new int[TalentAttrValueListStringArray.Length]; for (int i=0;i<TalentAttrValueListStringArray.Length;i++) { int.TryParse(TalentAttrValueListStringArray[i],out TalentAttrValueList[i]); } } if (tables[9].Contains("[")) { TalentPerLVAddList = JsonMapper.ToObject<int[]>(tables[9]); } else { string[] TalentPerLVAddListStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); TalentPerLVAddList = new int[TalentPerLVAddListStringArray.Length]; for (int i=0;i<TalentPerLVAddListStringArray.Length;i++) { int.TryParse(TalentPerLVAddListStringArray[i],out TalentPerLVAddList[i]); } } int.TryParse(tables[10],out EffType); int.TryParse(tables[11],out EffTypeValue); int.TryParse(tables[12],out EffValue); int.TryParse(tables[13],out EffPerLVAdd); Desc = tables[14]; } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/BeautyConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 646fb0599edaa1546b6617bf5d7cc6e2 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/Configs/BeautyQualityLVConfig.cs
New file @@ -0,0 +1,80 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年12月21日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class BeautyQualityLVConfig : ConfigBase<int, BeautyQualityLVConfig> { static BeautyQualityLVConfig() { // 访问过静态构造函数 visit = true; } public int ID; public int BeautyQuality; public int BeautyLV; public int LVNeedExp; public int[] AttrIDList; public int[] AttrValueList; public int[][] AwardItemList; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out ID); int.TryParse(tables[1],out BeautyQuality); int.TryParse(tables[2],out BeautyLV); int.TryParse(tables[3],out LVNeedExp); if (tables[4].Contains("[")) { AttrIDList = JsonMapper.ToObject<int[]>(tables[4]); } else { string[] AttrIDListStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); AttrIDList = new int[AttrIDListStringArray.Length]; for (int i=0;i<AttrIDListStringArray.Length;i++) { int.TryParse(AttrIDListStringArray[i],out AttrIDList[i]); } } if (tables[5].Contains("[")) { AttrValueList = JsonMapper.ToObject<int[]>(tables[5]); } else { string[] AttrValueListStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); AttrValueList = new int[AttrValueListStringArray.Length]; for (int i=0;i<AttrValueListStringArray.Length;i++) { int.TryParse(AttrValueListStringArray[i],out AttrValueList[i]); } } AwardItemList = JsonMapper.ToObject<int[][]>(tables[6].Replace("(", "[").Replace(")", "]")); } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/BeautyQualityLVConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: cd6551a3725246a41b7ee227f77a56db MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/Configs/BeautySkinConfig.cs
New file @@ -0,0 +1,110 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年12月21日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class BeautySkinConfig : ConfigBase<int, BeautySkinConfig> { static BeautySkinConfig() { // 访问过静态构造函数 visit = true; } public int SkinID; public int BeautyID; public int UnlockWay; public int UnlockValue; public int UnlockNeedCnt; public int UpNeedCnt; public int StarMax; public int[] AttrIDList; public int[] InitAttrValueList; public int[] AttrPerStarAddList; public string HeadIcon; public string SmallRole; public string BigRole; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out SkinID); int.TryParse(tables[1],out BeautyID); int.TryParse(tables[2],out UnlockWay); int.TryParse(tables[3],out UnlockValue); int.TryParse(tables[4],out UnlockNeedCnt); int.TryParse(tables[5],out UpNeedCnt); int.TryParse(tables[6],out StarMax); if (tables[7].Contains("[")) { AttrIDList = JsonMapper.ToObject<int[]>(tables[7]); } else { string[] AttrIDListStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); AttrIDList = new int[AttrIDListStringArray.Length]; for (int i=0;i<AttrIDListStringArray.Length;i++) { int.TryParse(AttrIDListStringArray[i],out AttrIDList[i]); } } if (tables[8].Contains("[")) { InitAttrValueList = JsonMapper.ToObject<int[]>(tables[8]); } else { string[] InitAttrValueListStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); InitAttrValueList = new int[InitAttrValueListStringArray.Length]; for (int i=0;i<InitAttrValueListStringArray.Length;i++) { int.TryParse(InitAttrValueListStringArray[i],out InitAttrValueList[i]); } } if (tables[9].Contains("[")) { AttrPerStarAddList = JsonMapper.ToObject<int[]>(tables[9]); } else { string[] AttrPerStarAddListStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); AttrPerStarAddList = new int[AttrPerStarAddListStringArray.Length]; for (int i=0;i<AttrPerStarAddListStringArray.Length;i++) { int.TryParse(AttrPerStarAddListStringArray[i],out AttrPerStarAddList[i]); } } HeadIcon = tables[10]; SmallRole = tables[11]; BigRole = tables[12]; } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/BeautySkinConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 9725e78e336a4fd43a27a4530f95e85d MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/Configs/TravelEventConfig.cs
New file @@ -0,0 +1,47 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年12月21日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class TravelEventConfig : ConfigBase<int, TravelEventConfig> { static TravelEventConfig() { // 访问过静态构造函数 visit = true; } public int EventID; public int AwardItemID; public int AwardItemCnt; public string ShowRate; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out EventID); int.TryParse(tables[1],out AwardItemID); int.TryParse(tables[2],out AwardItemCnt); ShowRate = tables[3]; } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/TravelEventConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 4f7be2f35c0d86c43ad82c5cac661a7b MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/Configs/TravelSceneryConfig.cs
New file @@ -0,0 +1,44 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年12月21日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class TravelSceneryConfig : ConfigBase<int, TravelSceneryConfig> { static TravelSceneryConfig() { // 访问过静态构造函数 visit = true; } public int ID; public int SceneryType; public int AwardQuality; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out ID); int.TryParse(tables[1],out SceneryType); int.TryParse(tables[2],out AwardQuality); } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/TravelSceneryConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: d5ef31d5d0e91bd40aa2f8a1ff715ebd MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/PartialConfigs/BeautyQualityLVConfig.cs
New file @@ -0,0 +1,47 @@ using System.Collections.Generic; public partial class BeautyQualityLVConfig : ConfigBase<int, BeautyQualityLVConfig> { static Dictionary<int, Dictionary<int, BeautyQualityLVConfig>> beautyQualityLVConfigDict = new Dictionary<int, Dictionary<int, BeautyQualityLVConfig>>(); static Dictionary<int, int> beautyQualityMaxLVDict = new Dictionary<int, int>(); protected override void OnConfigParseCompleted() { if (!beautyQualityLVConfigDict.ContainsKey(BeautyQuality)) { beautyQualityLVConfigDict[BeautyQuality] = new Dictionary<int, BeautyQualityLVConfig>(); } beautyQualityLVConfigDict[BeautyQuality][BeautyLV] = this; if (!beautyQualityMaxLVDict.ContainsKey(BeautyQuality)) { beautyQualityMaxLVDict[BeautyQuality] = BeautyLV; } else { if (beautyQualityMaxLVDict[BeautyQuality] < BeautyLV) { beautyQualityMaxLVDict[BeautyQuality] = BeautyLV; } } } public static bool TryGetBeautyQualityLVConfig(int beautyQuality, int beautyLV, out BeautyQualityLVConfig config) { config = null; if (beautyQualityLVConfigDict.TryGetValue(beautyQuality, out var beautyQualityDict) && beautyQualityDict.TryGetValue(beautyLV, out config)) { return true; } return false; } public static int GetBeautyQualityMaxLV(int beautyQuality) { if (beautyQualityMaxLVDict.TryGetValue(beautyQuality, out var maxLV)) { return maxLV; } return 0; } } Main/Config/PartialConfigs/BeautyQualityLVConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 0660a23b092ec664ebfc5f9767299a4b MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/PartialConfigs/BeautySkinConfig.cs
New file @@ -0,0 +1,34 @@ using System.Collections.Generic; public partial class BeautySkinConfig : ConfigBase<int, BeautySkinConfig> { private static Dictionary<int, List<BeautySkinConfig>> mmIDToSkinDict = new Dictionary<int, List<BeautySkinConfig>>(); protected override void OnConfigParseCompleted() { if (!mmIDToSkinDict.ContainsKey(BeautyID)) { List<BeautySkinConfig> skinList = new List<BeautySkinConfig>(); skinList.Add(this); mmIDToSkinDict.Add(BeautyID, skinList); } else { mmIDToSkinDict[BeautyID].Add(this); } } public static List<BeautySkinConfig> GetSkinListByMMID(int mmID) { List<BeautySkinConfig> skinList = null; mmIDToSkinDict.TryGetValue(mmID, out skinList); return skinList; } } Main/Config/PartialConfigs/BeautySkinConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 90057d768cacf89479f093c7d875eff4 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -81,6 +81,7 @@ return GetFullDescription(property.x, property.y); } // 获取属性全描述,包括属性名和属性值 参考格式 string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}"); public static string GetFullDescription(int id, long value, string format="{0}+{1}") { var config = Get(id); Main/Core/NetworkPackage/DTCFile/ServerPack/HB0_Event/DTCB040_tagSCTravelInfo.cs
@@ -1,11 +1,13 @@ using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; // B0 40 游历信息 #tagSCTravelInfo public class DTCB040_tagSCTravelInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); HB040_tagSCTravelInfo vNetData = vNetPack as HB040_tagSCTravelInfo; BeautyMMManager.Instance.UpdateTravelInfo(vNetData); } } Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB130_tagSCBeautyInfo.cs
@@ -1,11 +1,12 @@ using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; // B1 30 红颜信息 #tagSCBeautyInfo public class DTCB130_tagSCBeautyInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); HB130_tagSCBeautyInfo vNetData = vNetPack as HB130_tagSCBeautyInfo; BeautyMMManager.Instance.UpdateBeautyMMData(vNetData); } } Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -136,6 +136,8 @@ Register(typeof(HB129_tagSCLineupRecommendInfo), typeof(DTCB129_tagSCLineupRecommendInfo)); Register(typeof(HAB05_tagSCOSACelebrationInfo), typeof(DTCAB05_tagSCOSACelebrationInfo)); Register(typeof(HB131_tagSCHeroFatesInfo), typeof(DTCB131_tagSCHeroFatesInfo)); Register(typeof(HB130_tagSCBeautyInfo), typeof(DTCB130_tagSCBeautyInfo)); Register(typeof(HB040_tagSCTravelInfo), typeof(DTCB040_tagSCTravelInfo)); } //主工程注册封包 Main/Main.cs
@@ -95,6 +95,7 @@ managers.Add(LineupRecommendManager.Instance); managers.Add(OSActivityManager.Instance); managers.Add(HeroFatesManager.Instance); managers.Add(BeautyMMManager.Instance); foreach (var manager in managers) { manager.Init(); Main/System/Arena/ArenaManager.cs
@@ -27,6 +27,7 @@ public Dictionary<int, int[][]> seasonRankRewards; // 赛季排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...} public uint score; // 当前积分 public int totalWinCnt; //累计胜利次数 public List<ArenaMatchInfo> matchInfoList = new List<ArenaMatchInfo>(); //用于用来拿战斗胜利失败的头像信息 @@ -155,6 +156,7 @@ if (vNetData == null) return; this.score = vNetData.Score; totalWinCnt = (int)vNetData.WinCnt; OnUpdateArenaPlayerInfo?.Invoke(); } public void UpdateGameRecInfo(HA009_tagSCGameRecInfo vNetData) Main/System/BeautyMM.meta
New file @@ -0,0 +1,8 @@ fileFormatVersion: 2 guid: a8042b4dcd2800143ae2663d7b0c5765 folderAsset: yes DefaultImporter: externalObjects: {} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMBaseWin.cs
New file @@ -0,0 +1,26 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class BeautyMMBaseWin : OneLevelWin { protected override void OpenSubUIByTabIndex() { switch (functionOrder) { case 0: currentSubUI = UIManager.Instance.OpenWindow<BeautyMMListWin>(); break; case 1: // 充值界面 currentSubUI = UIManager.Instance.OpenWindow<BeautyMMTravelWin>(); break; default: Debug.LogWarning("未知的标签索引: " + functionOrder); break; } } } Main/System/BeautyMM/BeautyMMBaseWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 48ac597434993c24eb71702157db3aa0 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMCell.cs
New file @@ -0,0 +1,113 @@ using System; using System.Linq; using UnityEngine; using UnityEngine.UI; public class BeautyMMCell : MonoBehaviour { [SerializeField] Image bgIcon; [SerializeField] ImageEx roleImg; [SerializeField] Text nameText; [SerializeField] Transform costRect; [SerializeField] Image costIcon; [SerializeField] Text costText; [SerializeField] Text[] talentTexts; [SerializeField] Image redImg; [SerializeField] Image activeImg; [SerializeField] Image lvBg; [SerializeField] Text lvText; [SerializeField] Button mmBtn; [SerializeField] Transform mask; public void Display(int index) { var mmID = BeautyMMManager.Instance.beautyMMIDSortList[index]; var isActive = BeautyMMManager.Instance.isActiveMM(mmID); var mmConfig = BeautyConfig.Get(mmID); bgIcon.SetSprite($"mmBG{mmConfig.BeautyQuality}"); int skinID = BeautyMMManager.Instance.GetUsedSkinID(mmID); var skinConfig = BeautySkinConfig.Get(skinID); roleImg.SetOrgSprite(skinConfig.SmallRole, "BeautyMMSmallRole"); roleImg.gray = !isActive; mask.SetActive(!isActive); nameText.text = mmConfig.Name; if (!isActive) { costRect.SetActive(mmConfig.UnlockWay == 1); costIcon.SetItemSprite(mmConfig.UnlockValue); var cnt = PackManager.Instance.GetItemCountByID(PackType.Item, mmConfig.UnlockValue); costText.text = $"{cnt}/{mmConfig.UnlockNeedCnt}"; costText.color = cnt >= mmConfig.UnlockNeedCnt ? Color.green : Color.red; } else { costRect.SetActive(false); } //先显示天赋属性,再显示天赋特性 var attrs = BeautyMMManager.Instance.GetMMTalentAttr(mmID, true); int talentIndex = 0; if (attrs.IsNullOrEmpty()) { talentIndex = 0; } else { foreach (var attr in attrs) { if (talentIndex < talentTexts.Length) { talentTexts[talentIndex].SetActive(true); talentTexts[talentIndex].text = PlayerPropertyConfig.GetFullDescription(attr.Key, attr.Value); } else { break; } talentIndex++; } } for (int i = talentIndex; i < talentTexts.Length; i++) { if (i == talentIndex && mmConfig.EffType != 0) { //天赋效果约定最多一个 talentTexts[talentIndex].SetActive(true); talentTexts[i].text = Language.Get($"BeautyMMTalentDefault{mmConfig.EffType}"); } else { talentTexts[i].SetActive(false); } } redImg.SetActive(BeautyMMManager.Instance.IsMMRed(mmID)); activeImg.SetActive(BeautyMMManager.Instance.GetMMBaseState(mmConfig) > 1); var mmData = BeautyMMManager.Instance.GetBeautyMMData(mmID); if (mmData != null) { lvText.text = mmData.LV.ToString(); lvBg.SetActive(mmData.LV > 0); } else { lvBg.SetActive(false); } mmBtn.AddListener(() => { UIManager.Instance.OpenWindow<BeautyMMShowWin>(mmID); }); } } Main/System/BeautyMM/BeautyMMCell.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 14d2e2937f1af8e41a99e3aa09ea85a5 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMLineCell.cs
New file @@ -0,0 +1,29 @@ using System; using System.Linq; using UnityEngine; using UnityEngine.UI; public class BeautyMMLineCell : CellView { [SerializeField] BeautyMMCell[] mmCells; public void Display(int index) { for (int i = 0; i < mmCells.Length; i++) { if (index + i < BeautyMMManager.Instance.beautyMMIDSortList.Count) { mmCells[i].SetActive(true); mmCells[i].Display(index + i); } else { mmCells[i].SetActive(false); } } } } Main/System/BeautyMM/BeautyMMLineCell.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 20109e4945479c3438f8b35aad598423 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMListWin.cs
New file @@ -0,0 +1,101 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class BeautyMMListWin : UIBase { [SerializeField] Button seeAttrBtn; [SerializeField] ScrollerController scroller; [SerializeField] GroupButtonEx allMMBtn; [SerializeField] GroupButtonEx knownMMBtn; [SerializeField] GroupButtonEx unknownMMBtn; protected override void InitComponent() { seeAttrBtn.AddListener(() => { // UIManager.Instance.OpenWindow<BeautyMMAttrWin>(); }); allMMBtn.AddListener(() => { functionOrder = 0; BeautyMMManager.Instance.SortMMList(functionOrder); CreateScroller(); }); knownMMBtn.AddListener(() => { functionOrder = 1; BeautyMMManager.Instance.SortMMList(functionOrder); CreateScroller(); }); unknownMMBtn.AddListener(() => { functionOrder = 2; BeautyMMManager.Instance.SortMMList(functionOrder); CreateScroller(); }); } protected override void OnPreOpen() { BeautyMMManager.Instance.SortMMList(functionOrder); scroller.OnRefreshCell += OnRefreshCell; UIManager.Instance.OnCloseWindow += OnCloseWindow; Display(); } protected override void OnPreClose() { scroller.OnRefreshCell -= OnRefreshCell; UIManager.Instance.OnCloseWindow -= OnCloseWindow; } void CreateScroller() { scroller.Refresh(); for (int i = 0; i < BeautyMMManager.Instance.beautyMMIDSortList.Count; i++) { if (i % 3 == 0) { scroller.AddCell(ScrollerDataType.Header, i); } } scroller.Restart(); } void OnRefreshCell(ScrollerDataType type, CellView cell) { var _cell = cell as BeautyMMLineCell; _cell.Display(cell.index); } void Display() { switch (functionOrder) { case 0: allMMBtn.SelectBtn(true); break; case 1: knownMMBtn.SelectBtn(true); break; case 2: unknownMMBtn.SelectBtn(true); break; } CreateScroller(); } void OnCloseWindow(UIBase ui) { if (ui is BeautyMMShowWin) { scroller.m_Scorller.RefreshActiveCellViews(); } } } Main/System/BeautyMM/BeautyMMListWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 05c8f6d48338973479402594fb503785 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMManager.Travel.cs
New file @@ -0,0 +1,61 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; using LitJson; public partial class BeautyMMManager : GameSystemManager<BeautyMMManager> { public byte m_Energy; //剩余体力 public uint m_EnergyTime; //上次恢复体力时间戳 public uint m_TravelCnt; //累计游历次数 public byte m_SceneryType; //景观类型 public byte m_SceneryRow; //景观左上角所在行,从1开始 public byte m_SceneryCol; //景观左上角所在列,从1开始 public uint m_SceneryLVInfo; //景观升级信息:0-还未处理景观升级;个位数-第1次升级成功与否,1-成功,2-失败;十位-第2次 ... public byte m_Result; //后端处理:0-无;1-常规;2-马车炸弹;3-传送门;4-景观;5-重置开始 Dictionary<Int2, TravelGrid> m_GridDict = new Dictionary<Int2, TravelGrid>(); public event Action OnTravelInfoUpdate; public void UpdateTravelInfo(HB040_tagSCTravelInfo netPack) { m_Energy = netPack.Energy; m_EnergyTime = netPack.EnergyTime; m_TravelCnt = netPack.TravelCnt; m_SceneryType = netPack.SceneryType; m_SceneryRow = netPack.SceneryRow; m_SceneryCol = netPack.SceneryCol; m_SceneryLVInfo = netPack.SceneryLVInfo; m_Result = netPack.Result; for (int i = 0; i < netPack.GridCnt; i++) { var grid = netPack.GridList[i]; var key = new Int2(grid.Row, grid.Col); if (m_GridDict.ContainsKey(key)) { m_GridDict[key].State = grid.State; m_GridDict[key].Multi = grid.Multi; m_GridDict[key].EventID = grid.EventID; } else { m_GridDict.Add(key, new TravelGrid() { State = grid.State, Multi = grid.Multi, EventID = grid.EventID }); } } OnTravelInfoUpdate?.Invoke(); } } public class TravelGrid { public byte State; //状态:0-未点击;1-已开启;2-裂纹 public byte Multi; //奖励倍值: 默认1倍;2-双倍;... public ushort EventID; //事件ID } Main/System/BeautyMM/BeautyMMManager.Travel.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: a952f6ec1e792504886a22be9d63bd63 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMManager.cs
New file @@ -0,0 +1,476 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; using LitJson; public partial class BeautyMMManager : GameSystemManager<BeautyMMManager> { public List<int> beautyMMIDSortList = new List<int>(); public Dictionary<int, BeautyMMData> beautyMMDataDict = new Dictionary<int, BeautyMMData>(); //MMID 对应 数据 public Dictionary<int, BeautyMMSkinData> beautyMMSkinDataDict = new Dictionary<int, BeautyMMSkinData>(); //皮肤ID 对应 数据 public event Action OnBeautyMMDataUpdate; public int selectLoveItemID = 0; //配置 //道具ID 对应 好感度 public Dictionary<int, int> giftIDToLoveDict = new Dictionary<int, int>(); public int[] loveItemIDs; public int specialGiftLove = 0; // 数值3:专属信物道具好感度 public int needLVForTalent = 0; // 数值4:每x级好感度提升一级天赋效果 public int baseTravelEnergy = 0; // 数值1:基础体力上限 public int recoverTravelEnergyTime = 0; // 数值2:恢复1点体力所需时间,分钟 public int[] travelRowCol = new int[2]; // 数值3:游历行列数 行|列 public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize; ParseConfig(); } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize; } void OnBeforePlayerDataInitialize() { beautyMMIDSortList.Clear(); beautyMMDataDict.Clear(); beautyMMSkinDataDict.Clear(); } void ParseConfig() { var config = FuncConfigConfig.Get("BeautyLVUP"); loveItemIDs = JsonMapper.ToObject<int[]>(config.Numerical1); var _list2 = JsonMapper.ToObject<int[]>(config.Numerical2); for (int i = 0; i < loveItemIDs.Length; i++) { giftIDToLoveDict[loveItemIDs[i]] = _list2[i]; } specialGiftLove = int.Parse(config.Numerical3); needLVForTalent = int.Parse(config.Numerical4); config = FuncConfigConfig.Get("TravelSet"); baseTravelEnergy = int.Parse(config.Numerical1); recoverTravelEnergyTime = int.Parse(config.Numerical2); travelRowCol = ConfigParse.GetMultipleStr<int>(config.Numerical3); } public void UpdateBeautyMMData(HB130_tagSCBeautyInfo data) { foreach (var beauty in data.BeautyList) { beautyMMDataDict[beauty.BeautyID] = new BeautyMMData() { State = beauty.State, LV = beauty.LV, Exp = beauty.Exp, AwardLV = beauty.AwardLV, }; foreach (var skin in beauty.SkinList) { beautyMMSkinDataDict[skin.SkinID] = new BeautyMMSkinData() { State = skin.State, Used = skin.Used, Star = skin.Star, }; } } UpdateRedpoint(); OnBeautyMMDataUpdate?.Invoke(); } //0 全部 1 已激活 2 未激活 public void SortMMList(int type) { var _list = BeautyConfig.GetKeys(); beautyMMIDSortList.Clear(); if (type == 0) { beautyMMIDSortList = _list; } else if (type == 1) { foreach (var mmID in _list) { if (beautyMMDataDict.ContainsKey(mmID) && beautyMMDataDict[mmID].State == 1) { beautyMMIDSortList.Add(mmID); } } } else if (type == 2) { foreach (var mmID in _list) { if (!beautyMMDataDict.ContainsKey(mmID) || beautyMMDataDict[mmID].State == 0) { beautyMMIDSortList.Add(mmID); } } } beautyMMIDSortList.Sort(CmpMM); } int CmpMM(int mmIDA, int mmIDB) { bool isActiveA = false; if (beautyMMDataDict.ContainsKey(mmIDA)) { isActiveA = beautyMMDataDict[mmIDA].State == 1; } bool isActiveB = false; if (beautyMMDataDict.ContainsKey(mmIDB)) { isActiveB = beautyMMDataDict[mmIDB].State == 1; } if (isActiveA != isActiveB) { return isActiveA ? -1 : 1; } return mmIDA - mmIDB; } public BeautyMMData GetBeautyMMData(int mmID) { if (beautyMMDataDict.ContainsKey(mmID)) { return beautyMMDataDict[mmID]; } return null; } public int GetUsedSkinID(int mmID) { if (beautyMMDataDict.ContainsKey(mmID)) { var _beauty = beautyMMDataDict[mmID]; if (_beauty.State == 1) { foreach (var skin in beautyMMSkinDataDict) { if (skin.Value.Used == 1) { return skin.Key; } } } } //默认第一个 var _list = BeautySkinConfig.GetSkinListByMMID(mmID); if (_list.Count > 0) { return _list[0].SkinID; } return 0; } public bool isActiveMM(int mmID) { if (beautyMMDataDict.ContainsKey(mmID)) { return beautyMMDataDict[mmID].State == 1; } return false; } // 获取MM天赋属性属性, defaultAttr 是否使用默认属性 public Dictionary<int, int> GetMMTalentAttr(int mmID, bool defaultAttr = false) { var _dict = new Dictionary<int, int>(); if (beautyMMDataDict.ContainsKey(mmID)) { var _beauty = beautyMMDataDict[mmID]; if (_beauty.State == 1) { var config = BeautyConfig.Get(mmID); if (config != null) { //初始天赋属性 for (int i = 0; i < config.TalentAttrIDList.Length; i++) { _dict[config.TalentAttrIDList[i]] = config.TalentAttrValueList[i]; } //按x级好感度提升一级天赋效果 var _lv = _beauty.LV; var _addLV = _lv / needLVForTalent; if (_addLV > 0) { for (int i = 0; i < config.TalentAttrIDList.Length; i++) { _dict[config.TalentAttrIDList[i]] += _addLV * config.TalentPerLVAddList[i]; } } } return _dict; } } if (defaultAttr) { var config = BeautyConfig.Get(mmID); if (config != null) { //初始天赋属性 for (int i = 0; i < config.TalentAttrIDList.Length; i++) { _dict[config.TalentAttrIDList[i]] = config.TalentAttrValueList[i]; } } } return _dict; } // 获取MM天赋效果 public int GetMMTalentEffect(int mmID) { int _effect = 0; if (beautyMMDataDict.ContainsKey(mmID)) { var _beauty = beautyMMDataDict[mmID]; if (_beauty.State == 1) { var config = BeautyConfig.Get(mmID); if (config != null) { //初始天赋效果 _effect = config.EffValue; //按x级好感度提升一级天赋效果 var _lv = _beauty.LV; var _addLV = _lv / needLVForTalent; if (_addLV > 0) { _effect += _addLV * config.EffPerLVAdd; } } return _effect; } } return _effect; } #region 红点 Redpoint redpoint = new Redpoint(MainRedDot.MainAffairsRedpoint, MainRedDot.Redpoint_BeautyMM); Redpoint redpointMM = new Redpoint(MainRedDot.Redpoint_BeautyMM, MainRedDot.Redpoint_BeautyMM * 10 + 1); Redpoint redpointMMTotal = new Redpoint(MainRedDot.Redpoint_BeautyMM * 10 + 1, (MainRedDot.Redpoint_BeautyMM * 10 + 1) * 10); Redpoint redpointMMKnown = new Redpoint((MainRedDot.Redpoint_BeautyMM * 10 + 1) * 10, (MainRedDot.Redpoint_BeautyMM * 10 + 1) * 10 + 1); Redpoint redpointMMUnKnown = new Redpoint((MainRedDot.Redpoint_BeautyMM * 10 + 1) * 10, (MainRedDot.Redpoint_BeautyMM * 10 + 1) * 10 + 2); Redpoint redpointTravel = new Redpoint(MainRedDot.Redpoint_BeautyMM, MainRedDot.Redpoint_BeautyMM * 10 + 2); void UpdateRedpoint() { redpointMMKnown.state = RedPointState.None; redpointMMUnKnown.state = RedPointState.None; var _list = BeautyConfig.GetValues(); foreach (var beauty in _list) { var state = GetMMBaseState(beauty); if (state == 1) { redpointMMKnown.state = RedPointState.Simple; } else if (state == 2) { redpointMMUnKnown.state = RedPointState.Simple; } } // 时装MM 红点 if (redpointMMKnown.state == RedPointState.None) { foreach (var beauty in _list) { if (IsMMSkinRed(beauty.BeautyID)) { redpointMMKnown.state = RedPointState.Simple; break; } } } } //MM基础状态 0 无 1 有奖励 2 可物品激活 3 需功能激活 public int GetMMBaseState(BeautyConfig beauty) { //是否可激活,是否有奖励可领取 if (beautyMMDataDict.ContainsKey(beauty.BeautyID)) { var _beauty = beautyMMDataDict[beauty.BeautyID]; if (_beauty.State == 1) { if (_beauty.LV > _beauty.AwardLV) { //有奖励可领取 return 1; } return 0; } } //功能性激活 switch (beauty.UnlockWay) { case 1: if (PackManager.Instance.GetItemCountByID(PackType.Item, beauty.UnlockValue) >= beauty.UnlockNeedCnt) { //可激活 return 2; } break; case 2: if (TaskManager.Instance.mainTask.TaskID > beauty.UnlockValue) { //任务 return 3; } break; case 3: if (ArenaManager.Instance.totalWinCnt >= beauty.UnlockNeedCnt) { return 3; } break; case 4: if (GoldRushManager.Instance.maxWorkerCount >= beauty.UnlockNeedCnt) { //可激活 return 3; } break; case 5: int dataMapID = BoneFieldManager.Instance.DataMapID; if (DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out var fbInfo)) { if (BoneFieldManager.Instance.GetNowPassLineID(fbInfo) > beauty.UnlockValue) { return 3; } } break; case 6: if (PlayerDatas.Instance.baseData.realmLevel >= beauty.UnlockValue) { return 3; } break; case 7: if (m_TravelCnt >= beauty.UnlockNeedCnt) { return 3; } break; } return 0; } // 时装MM 状态 (前提是已激活本体的情况) 0 无 1 可激活 2 可升星; public int GetMMSkinStateBySkinID(BeautySkinConfig skin) { if (beautyMMSkinDataDict.ContainsKey(skin.SkinID)) { //升星判断 var _skin = beautyMMSkinDataDict[skin.SkinID]; if (_skin.State == 1) { if (_skin.Star < skin.StarMax && PackManager.Instance.GetItemCountByID(PackType.Item, skin.UnlockValue) >= skin.UpNeedCnt) { return 2; } return 0; } } //激活 if (skin.UnlockWay == 2 && PackManager.Instance.GetItemCountByID(PackType.Item, skin.UnlockValue) >= skin.UnlockNeedCnt) { return 1; } return 0; } public bool IsMMSkinRed(int mmID) { var _list = BeautySkinConfig.GetSkinListByMMID(mmID); if (_list == null || _list.Count == 0) { return false; } if (!beautyMMDataDict.ContainsKey(mmID)) { return false; } var _beauty = beautyMMDataDict[mmID]; if (_beauty.State == 0) { return false; } foreach (var skin in _list) { if (GetMMSkinStateBySkinID(skin) > 0) { return true; } } return false; } // 判断基础的养成 和 时装 public bool IsMMRed(int mmID) { var config = BeautyConfig.Get(mmID); if (GetMMBaseState(config) > 0) { return true; } return IsMMSkinRed(mmID); } #endregion } public class BeautyMMData { public byte State; //是否已激活 public ushort LV; //红颜好感等级,激活时为0级 public ushort Exp; //当前等级经验 public ushort AwardLV; //已经领取到的奖励等级记录 } public class BeautyMMSkinData { public byte State; //是否已激活 public byte Used; //是否已穿戴该时装,某个红颜的所有时装穿戴可能都为0,则前端取默认时装进行展示,如果有同步已穿戴的则以后端为准 public byte Star; //时装星级,激活时为0星 } Main/System/BeautyMM/BeautyMMManager.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 8f7899b33b25dc84ab06ff2189d57448 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMShowWin.cs
New file @@ -0,0 +1,443 @@ using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public class BeautyMMShowWin : UIBase { [SerializeField] Image qualityImg; [SerializeField] Text qualityText1; // 品质分两字显示,注意海外版本 [SerializeField] Text qualityText2; [SerializeField] Text nameText; [SerializeField] Button descBtn; [SerializeField] ImageEx roleImg; [SerializeField] UIEffectPlayer roleUPEffect; [SerializeField] Button leftBtn; [SerializeField] Button rightBtn; [SerializeField] Button skinBtn; [SerializeField] Transform trainRect; [SerializeField] Transform activeRect; [SerializeField] Text activeTipText; [SerializeField] Button activeBtn; [SerializeField] Text lvNameText; [SerializeField] Text lvText; [SerializeField] Text expText; [SerializeField] Image process; [SerializeField] ItemCell showAwardCell; [SerializeField] Button[] awardBtns; //小奖励 [SerializeField] Image[] awardImgs; [SerializeField] Button seeAttrBtn; [SerializeField] Text nextAddAttrText; [SerializeField] Text[] talentTexts; [SerializeField] Transform nextLVTalentTipRect; [SerializeField] Text nextLVTalentTip; [SerializeField] ScrollerController loveScroller; [SerializeField] Toggle onekeyToggle; [SerializeField] Button giftBtn; [SerializeField] Transform giftOPRect; [SerializeField] Transform fullRect; int mmID; BeautyConfig mmConfig; List<int> itemlist = new List<int>(); protected override void InitComponent() { descBtn.AddListener(() => { SmallTipWin.showText = mmConfig.Desc; SmallTipWin.worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition); SmallTipWin.isDownShow = true; UIManager.Instance.OpenWindow<SmallTipWin>(); }); leftBtn.AddListener(() => { var index = BeautyMMManager.Instance.beautyMMIDSortList.IndexOf(mmID); if (index > 0) { mmID = BeautyMMManager.Instance.beautyMMIDSortList[index - 1]; } else { mmID = BeautyMMManager.Instance.beautyMMIDSortList[BeautyMMManager.Instance.beautyMMIDSortList.Count - 1]; } Display(); }); rightBtn.AddListener(() => { var index = BeautyMMManager.Instance.beautyMMIDSortList.IndexOf(mmID); if (index < BeautyMMManager.Instance.beautyMMIDSortList.Count - 1) { mmID = BeautyMMManager.Instance.beautyMMIDSortList[index + 1]; } else { mmID = BeautyMMManager.Instance.beautyMMIDSortList[0]; } Display(); }); skinBtn.AddListener(() => { // UIManager.Instance.OpenWindow<BeautyMMListWin>(); }); seeAttrBtn.AddListener(() => { // UIManager.Instance.OpenWindow<BeautyMMAttrWin>(); }); activeBtn.AddListener(ActiveMM); giftBtn.AddListener(SendGift); for (int i = 0; i < awardBtns.Length; i++) { awardBtns[i].AddListener(() => { var pack = new CA504_tagCMPlayerGetReward(); pack.RewardType = 6; pack.DataEx = (uint)mmID; GameNetSystem.Instance.SendInfo(pack); }); } } protected override void OnPreOpen() { mmID = functionOrder; loveScroller.OnRefreshCell += OnRefreshCell; BeautyMMManager.Instance.OnBeautyMMDataUpdate += OnBeautyMMDataUpdate; PackManager.Instance.RefreshItemEvent += OnRefreshItemEvent; Display(); } protected override void OnPreClose() { loveScroller.OnRefreshCell -= OnRefreshCell; BeautyMMManager.Instance.OnBeautyMMDataUpdate -= OnBeautyMMDataUpdate; PackManager.Instance.RefreshItemEvent -= OnRefreshItemEvent; } void OnBeautyMMDataUpdate() { Display(); } void OnRefreshItemEvent(PackType packType, int index, int itemID) { if (packType == PackType.Item) { if (itemlist.Contains(itemID)) { loveScroller.m_Scorller.RefreshActiveCellViews(); } } } void Display() { mmConfig = BeautyConfig.Get(mmID); qualityImg.SetSprite($"mmMark{mmConfig.BeautyQuality}"); string qualityStr = Language.Get($"CommonQuality{mmConfig.BeautyQuality}"); qualityText1.text = qualityStr[0].ToString(); qualityText2.text = qualityStr.Substring(1); nameText.text = mmConfig.Name; var skinID = BeautyMMManager.Instance.GetUsedSkinID(mmID); var skinConfig = BeautySkinConfig.Get(skinID); roleImg.SetOrgSprite(skinConfig.BigRole, "BeautyMMBigRole"); roleImg.SetNativeSize(); var isActive = BeautyMMManager.Instance.isActiveMM(mmID); trainRect.SetActive(isActive); activeRect.SetActive(!isActive); activeTipText.text = !isActive ? GetActiveTip(mmConfig) : ""; var mmData = BeautyMMManager.Instance.GetBeautyMMData(mmID); var rank = mmData != null ? mmData.LV / BeautyMMManager.Instance.needLVForTalent + 1 : 1; lvNameText.text = Language.Get($"BeautyMMLVName{rank}"); lvText.text = mmData != null ? mmData.LV.ToString() : "0"; var maxLV = BeautyQualityLVConfig.GetBeautyQualityMaxLV(mmConfig.BeautyQuality); bool isMaxLV = mmData != null && mmData.LV >= maxLV; int needExp; if (isMaxLV) { needExp = 0; process.fillAmount = 1; showAwardCell.SetActive(false); nextAddAttrText.text = Language.Get("L1055"); nextLVTalentTipRect.SetActive(false); fullRect.SetActive(true); giftOPRect.SetActive(false); } else { int curLV = mmData != null ? mmData.LV : 0; BeautyQualityLVConfig nextLVConfig; BeautyQualityLVConfig.TryGetBeautyQualityLVConfig(mmConfig.BeautyQuality, curLV + 1, out nextLVConfig); needExp = nextLVConfig.LVNeedExp; expText.text = (mmData != null ? mmData.Exp.ToString() : "0") + "/" + needExp; process.fillAmount = mmData != null ? mmData.Exp / needExp : 0; showAwardCell.SetActive(true); int itemID = nextLVConfig.AwardItemList[0][0]; showAwardCell.Init(new ItemCellModel(itemID, false, nextLVConfig.AwardItemList[0][1])); showAwardCell.button.AddListener(() => { ItemTipUtility.Show(itemID); }); var awardCnt = mmData != null ? mmData.LV - mmData.AwardLV : 0; for (int i = 0; i < awardBtns.Length; i++) { if (mmData != null && i < awardCnt) { awardBtns[i].SetActive(true); awardImgs[i].SetSprite(ItemConfig.Get(itemID).IconKey); } else { awardBtns[i].SetActive(false); } } string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}"); nextAddAttrText.text = Language.Get("BeautyMM23") + PlayerPropertyConfig.GetFullDescription(nextLVConfig.AttrIDList[0], nextLVConfig.AttrValueList[0], format); ShowTalent(); nextLVTalentTipRect.SetActive(true); nextLVTalentTip.text = Language.Get("BeautyMM26", rank * BeautyMMManager.Instance.needLVForTalent); giftOPRect.SetActive(true); fullRect.SetActive(false); } CreateScroller(); } // 解锁方式 方式值 所需数 // 1.物品解锁 碎片物品ID 数量 // 2.完成主线任务ID 任务ID // 3.演武场胜利次数 无 次数 // 4.拥有监工数量 无 数量 // 5.白骨盈野过关 funcLineID // 6.官职达到 官职ID // 7.游历次数 无 次数 string GetActiveTip(BeautyConfig beauty) { TextColType colorType = TextColType.Red; switch (beauty.UnlockWay) { case 1: var cnt = PackManager.Instance.GetItemCountByID(PackType.Item, beauty.UnlockValue); colorType = cnt >= beauty.UnlockNeedCnt ? TextColType.Green : TextColType.Red; return UIHelper.AppendColor(colorType, Language.Get("BeautyMMUnLockTip1", ItemConfig.Get(beauty.UnlockValue).IconKey, cnt, beauty.UnlockNeedCnt)); case 2: colorType = TaskConfig.Get(TaskManager.Instance.mainTask.TaskID).Index > TaskConfig.Get(beauty.UnlockValue).Index ? TextColType.Green : TextColType.Red; return Language.Get("BeautyMMUnLockTip2", TaskConfig.Get(beauty.UnlockValue).Index) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", TaskConfig.Get(TaskManager.Instance.mainTask.TaskID).Index, TaskConfig.Get(beauty.UnlockValue).Index)); case 3: colorType = ArenaManager.Instance.totalWinCnt >= beauty.UnlockNeedCnt ? TextColType.Green : TextColType.Red; return Language.Get("BeautyMMUnLockTip3", beauty.UnlockNeedCnt) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", ArenaManager.Instance.totalWinCnt, beauty.UnlockNeedCnt)); case 4: colorType = GoldRushManager.Instance.maxWorkerCount >= beauty.UnlockNeedCnt ? TextColType.Green : TextColType.Red; return Language.Get("BeautyMMUnLockTip4", beauty.UnlockNeedCnt) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", GoldRushManager.Instance.maxWorkerCount, beauty.UnlockNeedCnt)); case 5: int dataMapID = BoneFieldManager.Instance.DataMapID; if (DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out var fbInfo)) { colorType = fbInfo.PassLineID > beauty.UnlockValue ? TextColType.Green : TextColType.Red; return Language.Get("BeautyMMUnLockTip5", beauty.UnlockValue) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", fbInfo.PassLineID, beauty.UnlockValue)); } return ""; case 6: colorType = PlayerDatas.Instance.baseData.realmLevel >= beauty.UnlockValue ? TextColType.Green : TextColType.Red; var config = RealmConfig.Get(beauty.UnlockValue); return Language.Get("BeautyMMUnLockTip6", config.Name) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", PlayerDatas.Instance.baseData.realmLevel, beauty.UnlockValue)); case 7: colorType = BeautyMMManager.Instance.m_TravelCnt >= beauty.UnlockNeedCnt ? TextColType.Green : TextColType.Red; return Language.Get("BeautyMMUnLockTip7", beauty.UnlockNeedCnt) + UIHelper.AppendColor(colorType, Language.Get("HeroFates11", BeautyMMManager.Instance.m_TravelCnt, beauty.UnlockNeedCnt)); } return ""; } void ShowTalent() { //先显示天赋属性,再显示天赋特性 var attrs = BeautyMMManager.Instance.GetMMTalentAttr(mmID, true); int talentIndex = 0; if (attrs.IsNullOrEmpty()) { talentIndex = 0; } else { foreach (var attr in attrs) { if (talentIndex < talentTexts.Length) { talentTexts[talentIndex].SetActive(true); string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}"); talentTexts[talentIndex].text = PlayerPropertyConfig.GetFullDescription(attr.Key, attr.Value, format); } else { break; } talentIndex++; } } var talentValue = BeautyMMManager.Instance.GetMMTalentEffect(mmID); for (int i = talentIndex; i < talentTexts.Length; i++) { if (i == talentIndex && mmConfig.EffType != 0) { //天赋效果约定最多一个 talentTexts[talentIndex].SetActive(true); switch (mmConfig.EffType) { case 1: talentTexts[i].text = Language.Get($"BeautyMMTalent1", talentValue); break; case 2: talentTexts[i].text = Language.Get($"BeautyMMTalent2", talentValue / 100, ItemConfig.Get(mmConfig.EffTypeValue).ItemName); break; case 3: talentTexts[i].text = Language.Get($"BeautyMMTalent3", talentValue); break; case 4: talentTexts[i].text = Language.Get($"BeautyMMTalent4", ItemConfig.Get(mmConfig.EffTypeValue).ItemName, talentValue); break; } } else { talentTexts[i].SetActive(false); } } } void ActiveMM() { var state = BeautyMMManager.Instance.GetMMBaseState(mmConfig); if (state <= 1) { SysNotifyMgr.Instance.ShowTip("BeautyMM1"); return; } var pack = new CB219_tagCSBeautyActivate(); pack.BeautyID = (ushort)mmID; GameNetSystem.Instance.SendInfo(pack); } void CreateScroller() { loveScroller.Refresh(); itemlist = BeautyMMManager.Instance.loveItemIDs.ToList(); BeautyMMManager.Instance.selectLoveItemID = itemlist[0]; if (mmConfig.ExclusiveItemID > 0) { itemlist.Add(mmConfig.ExclusiveItemID); //专属信物 } for (int i = 0; i < itemlist.Count; i++) { loveScroller.AddCell(ScrollerDataType.Header, itemlist[i]); } loveScroller.Restart(); } void OnRefreshCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent<ItemCell>(); int itemID = cell.index; var cnt = PackManager.Instance.GetItemCountByID(PackType.Item, itemID); _cell.Init(new ItemCellModel(itemID, false, cnt)); _cell.button.AddListener(() => { if (BeautyMMManager.Instance.selectLoveItemID != itemID) { BeautyMMManager.Instance.selectLoveItemID = itemID; loveScroller.m_Scorller.RefreshActiveCellViews(); } else { ItemTipUtility.Show(itemID); } }); if (BeautyMMManager.Instance.selectLoveItemID == itemID) { _cell.FindComponent("Image", "selectImage").SetActive(true); } else { _cell.FindComponent("Image", "selectImage").SetActive(false); } _cell.FindComponent("Image", "mask").SetActive(cnt == 0); } void SendGift() { var cnt = PackManager.Instance.GetItemCountByID(PackType.Item, BeautyMMManager.Instance.selectLoveItemID); if (cnt == 0) { ItemTipUtility.Show(BeautyMMManager.Instance.selectLoveItemID, true); return; } //使用到可升级的数量,或者总数 var mmData = BeautyMMManager.Instance.GetBeautyMMData(mmID); var maxLV = BeautyQualityLVConfig.GetBeautyQualityMaxLV(mmConfig.BeautyQuality); bool isMaxLV = mmData != null && mmData.LV >= maxLV; if (isMaxLV) { return; } else { int curLV = mmData != null ? mmData.LV : 0; BeautyQualityLVConfig nextLVConfig; BeautyQualityLVConfig.TryGetBeautyQualityLVConfig(mmConfig.BeautyQuality, curLV + 1, out nextLVConfig); int needExp = nextLVConfig.LVNeedExp - mmData.Exp; int value = BeautyMMManager.Instance.giftIDToLoveDict.ContainsKey(BeautyMMManager.Instance.selectLoveItemID) ? BeautyMMManager.Instance.giftIDToLoveDict[BeautyMMManager.Instance.selectLoveItemID] : BeautyMMManager.Instance.specialGiftLove; int useCnt = (int)Mathf.Min(Mathf.CeilToInt(needExp * 1.0f / value), cnt); var pack = new CB220_tagCSBeautyLVUP(); pack.BeautyID = (ushort)mmID; pack.ItemID = (uint)BeautyMMManager.Instance.selectLoveItemID; pack.IsQuick = (byte)(onekeyToggle.isOn ? 1 : 0); GameNetSystem.Instance.SendInfo(pack); roleUPEffect.Play(); SysNotifyMgr.Instance.ShowTip("BeautyMM2", mmConfig.Name, useCnt * value); } } } Main/System/BeautyMM/BeautyMMShowWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 51e44717165ef6d4d945d1dfad6a83a6 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BeautyMM/BeautyMMTravelWin.cs
New file @@ -0,0 +1,10 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class BeautyMMTravelWin : UIBase { } Main/System/BeautyMM/BeautyMMTravelWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 35624c157a4b5364f902d10f570bef5a MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BoneField/AdsManager.cs
@@ -52,6 +52,7 @@ SendGetReward(ADID); break; case 4: case 6: SendGetReward(ADID); break; } Main/System/InternalAffairs/AffairFuncCell.cs
@@ -47,6 +47,10 @@ { UIManager.Instance.OpenWindow<PhantasmPavilionWin>(); } else if (funcID == 7) { UIManager.Instance.OpenWindow<BeautyMMBaseWin>(); } } Main/System/Redpoint/MainRedDot.cs
@@ -76,7 +76,8 @@ Redpoint osGalaRedpoint = new Redpoint(RedPoint_OSGala); public const int RedPoint_Download = 116; //红颜 public const int Redpoint_BeautyMM = 117; //武将卡 public const int HeroCardRedpoint = 200; public Redpoint HeroListRedpoint = new Redpoint(MainHerosRedpoint, HeroCardRedpoint);