using Container; using EnhancedUI; using System; using UnityEngine; public partial class FantasyWorldSettingView : View { [SerializeField] GameObject leftPanel; [SerializeField] GameObject rightPanel; [SerializeField] SelectedWorld selectedWorld; [SerializeField] EScrController worldListScrollCtrl; HorizontalDataMatrix worldDataMatrix; GameModData selectedMod; GameModEscrListRowSlot selectedListSlot; private void Start() { leftPanel.SetActive(false); rightPanel.SetActive(false); viewState = ViewState.Hidden; } private void LateUpdate() { selectedWorld.Update(); } public override void Show() { GameUIMgr.SSetMainUiOn(false); GameUIMgr.SOpenLeftPanel(fatansyWorldRing : true, memoryPiece : true); ResetPosition(); leftPanel.SetActive(true); rightPanel.SetActive(true); viewState = ViewState.Shown; RefreshWorldListScroll(); } public override void Hide() { selectedWorld.Dispose(); selectedMod = null; selectedListSlot = null; leftPanel.SetActive(false); rightPanel.SetActive(false); viewState = ViewState.Hidden; GameUIMgr.SCloseLeftPanel(); GameUIMgr.SSetMainUiOn(true); } private void RefreshWorldListScroll() { if(worldListScrollCtrl is null) return; if(worldDataMatrix is null) { const int columnCount = 1; worldDataMatrix = new HorizontalDataMatrix(columnCount); string[] modCodeNames = new string[] { DreamWorldProp.CodeName }; for (int i = 0; i < modCodeNames.Length; i++) { if (GameModDataGroup.Instance.TryGetModData(modCodeNames[i], out GameModData modData)) { worldDataMatrix.PushBack(modData); } } } var worldRowIndices = new SmallList(); for (int i = 0; i < worldDataMatrix.RowCount; i++) { worldRowIndices.Add(i); } worldListScrollCtrl.LoadDatas(worldRowIndices, new ListRowDelegate { OnSetData = OnSetWorldListRow }); } private void OnSetWorldListRow(EscrListRowSlot slot) { var worldSlot = slot as GameModEscrListRowSlot; if (worldSlot is null) return; if(worldDataMatrix.TryGetValue(worldSlot.RowIndex, worldSlot.ColumnIndex, out var worldData)) { // if there is no selected slot, then select this slot if (selectedMod is null) { selectedMod = worldData; selectedListSlot = worldSlot; selectedWorld.SetData(worldData); } worldSlot.SetData(worldData); worldSlot.SetActiveSelectedIndicator(selectedMod == worldData); worldSlot.OnClick -= OnClickWorldSlot; worldSlot.OnClick += OnClickWorldSlot; } } private void OnClickWorldSlot(GameModEscrListRowSlot slot) { selectedListSlot?.SetActiveSelectedIndicator(false); var selectedMod = slot.GetData() as GameModData; this.selectedMod = selectedMod; selectedListSlot = slot; selectedListSlot.SetActiveSelectedIndicator(true); if (selectedMod != null) { selectedWorld.SetData(selectedMod); } } public void EnterSelectedWorld() { if(selectedWorld.worldData is null) return; DungeonMgr.Instance.OpenPopupPreset(selectedWorld.worldData, Hide); } } public partial class FantasyWorldSettingView : View { [Serializable] class SelectedWorld { [SerializeField] ExtendImage worldImage; [SerializeField] ExtendText levelText; [SerializeField] ButtonIV enterButton; [SerializeField] ObjectIndicator[] rewards; public GameModData worldData { get; private set; } public void SetData(GameModData worldData) { this.worldData = worldData; if(worldData is null) return; SetImage(); SetLevelText(); SetRewards(); } public void Update() { if(worldData is null) return; if(enterButton != null) enterButton.interactable = worldData.IsUnlocked && DataHandler.Goods.fantasyWorldRing >= 1; } private void SetImage() { var hasThumbnail = worldData as IHasThumbnail; if(hasThumbnail is null) return; worldImage?.SetImageInAtlasAsync(hasThumbnail.ThumbnailAtlasName, hasThumbnail.ThumbnailSpriteName); } private void SetLevelText() { levelText?.SetText(FormatString.StringFormat(LocalizationText.GetText("dg_diff"), worldData.Level)); } private void SetRewards() { var hasRewards = worldData as IHasRewards; if(hasRewards is null) return; var rewardList = hasRewards.GetRewardList(worldData.Level); for (int i = 0; i < rewards.Length; i++) { bool isActive = i < rewardList.Count; rewards[i].gameObject.SetActive(isActive); if(isActive) ObjectIndicatorSetter.SetWith(rewards[i], rewardList[i]); } } public void Dispose() { worldData = null; } } }