From cfc7ccebf17d06aaba47e3d504ca4822c8b6d156 Mon Sep 17 00:00:00 2001 From: Tirlititi Date: Mon, 11 Sep 2023 02:07:30 +0200 Subject: [PATCH] Configurable rows for lists in some menus --- Assembly-CSharp/Assembly-CSharp.csproj | 3 +- Assembly-CSharp/Global/AbilityUI.cs | 59 +++-- Assembly-CSharp/Global/ChocographUI.cs | 122 +++++------ Assembly-CSharp/Global/Config/ConfigUI.cs | 42 +--- Assembly-CSharp/Global/EquipUI.cs | 64 +++--- Assembly-CSharp/Global/ItemUI.cs | 54 ++++- Assembly-CSharp/Global/MainMenuUI.cs | 14 +- .../Global/Recycle/RecycleListPopulator.cs | 17 +- Assembly-CSharp/Global/ShopUI.cs | 120 +++++------ .../Global/UI/UIKey/UIKeyTrigger.cs | 16 +- Assembly-CSharp/Global/UI/UIPanel.cs | 42 ++-- .../Global/UI/UISprite/UISprite.cs | 37 ++-- .../battle/BattleHUD/BattleHUD.Scene.cs | 3 - .../BattleHUD/BattleHUD.UI.AllMenuPanel.cs | 8 +- .../BattleHUD/BattleHUD.UI.ScrollablePanel.cs | 56 ----- .../battle/BattleHUD/BattleHUD.Unity.cs | 4 +- .../Global/battle/BattleHUD/BattleHUD.cs | 4 +- .../Memoria/Configuration/Access/Interface.cs | 204 ++++++++++-------- .../Configuration/Configuration.Loading.cs | 54 +++-- .../Memoria/Configuration/Memoria.ini | 8 +- .../Structure/InterfaceSection.cs | 99 +++++---- .../Scenes/BattleHUD/BattleUIControlPanel.cs | 1 + .../Scenes/ControlPanel/ControlPanel.cs | 15 +- .../Memoria/Scenes/GOButtonPrefab.cs | 5 +- .../Memoria/Scenes/GOScrollablePanel.cs | 68 ++++++ Assembly-CSharp/Memoria/Scenes/GOSubPanel.cs | 111 +++++++--- .../Scenes/MenuHUD/MenuUIControlPanel.cs | 97 +++++++++ Memoria.Launcher/App.cs | 1 - Memoria.Launcher/Ini/Memoria.ini | 8 +- Memoria.Launcher/Memoria.Launcher.csproj | 5 +- 30 files changed, 811 insertions(+), 530 deletions(-) delete mode 100644 Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.ScrollablePanel.cs create mode 100644 Assembly-CSharp/Memoria/Scenes/GOScrollablePanel.cs create mode 100644 Assembly-CSharp/Memoria/Scenes/MenuHUD/MenuUIControlPanel.cs diff --git a/Assembly-CSharp/Assembly-CSharp.csproj b/Assembly-CSharp/Assembly-CSharp.csproj index f81afb4ed..03ba1e83f 100644 --- a/Assembly-CSharp/Assembly-CSharp.csproj +++ b/Assembly-CSharp/Assembly-CSharp.csproj @@ -227,7 +227,6 @@ - @@ -355,6 +354,8 @@ + + diff --git a/Assembly-CSharp/Global/AbilityUI.cs b/Assembly-CSharp/Global/AbilityUI.cs index 635b5c85c..eb242e532 100644 --- a/Assembly-CSharp/Global/AbilityUI.cs +++ b/Assembly-CSharp/Global/AbilityUI.cs @@ -7,6 +7,7 @@ using System.Linq; using Memoria; using Memoria.Assets; +using Memoria.Scenes; using Memoria.Data; using Memoria.Database; using Memoria.Field; @@ -75,6 +76,8 @@ public class AbilityUI : UIScene private Boolean canMultiTarget; private Dictionary equipmentPartInAbilityDict; private Dictionary equipmentIdInAbilityDict; + private GOScrollablePanel _abilityPanel; + private GOScrollablePanel _supportPanel; public static Color[] BoostedAbilityColor = new Color[] { @@ -88,7 +91,7 @@ public class AbilityUI : UIScene public Int32 CurrentPartyIndex { - set { this.currentPartyIndex = value; } + set => this.currentPartyIndex = value; } static AbilityUI() @@ -113,7 +116,7 @@ public AbilityUI() public override void Show(SceneVoidDelegate afterFinished = null) { - SceneVoidDelegate action = () => + SceneVoidDelegate afterShowAction = () => { PersistenSingleton.Instance.MainMenuScene.SubMenuPanel.SetActive(false); ButtonGroupState.SetScrollButtonToGroup(this.activeAbilityScrollList.ScrollButton, ActionAbilityGroupButton); @@ -129,7 +132,8 @@ public override void Show(SceneVoidDelegate afterFinished = null) }; SceneDirector.FadeEventSetColor(FadeMode.Sub, Color.black); - base.Show(action); + base.Show(afterShowAction); + this.UpdateUserInterface(); this.SwitchCharacter(true); this.DisplayHelp(); this.DisplaySubMenuArrow(true); @@ -138,9 +142,41 @@ public override void Show(SceneVoidDelegate afterFinished = null) this.supportAbilityScrollList.ScrollButton.DisplayScrollButton(false, false); } + public void UpdateUserInterface() + { + if (!Configuration.Interface.IsEnabled) + return; + const Int32 originalLineCount = 6; + const Single buttonOriginalHeight = 92f; + const Single panelOriginalWidth = 1488f; + const Single panelOriginalHeight = originalLineCount * buttonOriginalHeight; + Int32 linePerPage = Configuration.Interface.MenuAbilityRowCount; + Int32 lineHeight = (Int32)Math.Round(panelOriginalHeight / linePerPage); + Single scaleFactor = lineHeight / buttonOriginalHeight; + _abilityPanel.SubPanel.ChangeDims(2, linePerPage, panelOriginalWidth / 2f, lineHeight); + _abilityPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _abilityPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.152f, relTop: 0.848f, relLeft: 0.091f, relRight: 0.795f); + _abilityPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _abilityPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.152f, relTop: 0.848f, relLeft: 0.8f, relRight: 0.92f); + _abilityPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _abilityPanel.SubPanel.ButtonPrefab.NumberLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _abilityPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + _supportPanel.SubPanel.ChangeDims(2, linePerPage, panelOriginalWidth / 2f, lineHeight); + _supportPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _supportPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.152f, relTop: 0.848f, relLeft: 0.09f, relRight: 0.176f); + _supportPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _supportPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.152f, relTop: 0.848f, relLeft: 0.24f, relRight: 0.795f); + _supportPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _supportPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.152f, relTop: 0.848f, relLeft: 0.8f, relRight: 0.92f); + _supportPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _supportPanel.SubPanel.ButtonPrefab.NumberLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _supportPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + } + public override void Hide(SceneVoidDelegate afterFinished = null) { - base.Hide(afterFinished); + UIScene.SceneVoidDelegate afterHideAction = delegate + { + MainMenuUI.UIControlPanel?.ExitMenu(); + }; + if (afterFinished != null) + afterHideAction += afterFinished; + base.Hide(afterHideAction); if (this.fastSwitch) return; PersistenSingleton.Instance.MainMenuScene.StartSubmenuTweenIn(); @@ -949,6 +985,7 @@ private void DisplaySADetail(Transform item, ListDataTypeBase data, Int32 index, ButtonGroupState.SetButtonAnimation(detailWithIconHud.Self, true); detailWithIconHud.NameLabel.text = FF9TextTool.SupportAbilityName(supportId); detailWithIconHud.NumberLabel.text = saData.GemsCount.ToString(); + detailWithIconHud.IconSprite.preventPixelPerfect = Configuration.Interface.IsEnabled; detailWithIconHud.IconSprite.color = Color.white; if (abilityListData.Type == AbilityType.CantSpell) { @@ -1290,10 +1327,8 @@ public SubMenu GetSubMenuFromGameObject(GameObject go) private void Awake() { this.FadingComponent = this.ScreenFadeGameObject.GetComponent(); - UIEventListener uiEventListener1 = UIEventListener.Get(this.UseSubMenu); - uiEventListener1.Click += this.onClick; - UIEventListener uiEventListener2 = UIEventListener.Get(this.EquipSubMenu); - uiEventListener2.Click += this.onClick; + UIEventListener.Get(this.UseSubMenu).Click += this.onClick; + UIEventListener.Get(this.EquipSubMenu).Click += this.onClick; this.abilityInfoHud = new AbilityInfoHUD(this.AbilityDetailPanel); this.abilityInfoHud.ClearEquipmentIcon(); this.characterHud = new CharacterDetailHUD(this.CharacterDetailPanel, false); @@ -1301,8 +1336,7 @@ private void Awake() foreach (Component component in this.TargetListPanel.transform.GetChild(0).transform) { GameObject obj = component.gameObject; - UIEventListener uiEventListener3 = UIEventListener.Get(obj); - uiEventListener3.Click += this.onClick; + UIEventListener.Get(obj).Click += this.onClick; this.targetHudList.Add(new CharacterDetailHUD(obj, true)); if (FF9StateSystem.MobilePlatform) gameObject.GetComponent().Help.TextKey = "TargetHelpMobile"; @@ -1314,8 +1348,7 @@ private void Awake() this.allTargetButtonCollider = this.allTargetButton.GetComponent(); this.allTargetButtonLabel = this.allTargetButton.GetChild(1).GetComponent(); this.allTargetHitArea = this.TargetListPanel.GetChild(2); - UIEventListener uiEventListener4 = UIEventListener.Get(this.allTargetButton); - uiEventListener4.Click += OnAllTargetClick; + UIEventListener.Get(this.allTargetButton).Click += OnAllTargetClick; this.useSubMenuLabel = this.UseSubMenu.GetChild(1).GetComponent(); this.equipSubMenuLabel = this.EquipSubMenu.GetChild(1).GetComponent(); this.submenuArrowGameObject = this.SubMenuPanel.GetChild(0); @@ -1323,6 +1356,8 @@ private void Awake() this.supportAbilityScrollList = this.SupportAbilityListPanel.GetChild(1).GetComponent(); this.targetTransition = this.TransitionGroup.GetChild(0).GetComponent(); this.avatarTransition = this.CharacterDetailPanel.GetChild(0).GetChild(6).GetChild(0).GetComponent(); + this._abilityPanel = new GOScrollablePanel(this.ActiveAbilityListPanel); + this._supportPanel = new GOScrollablePanel(this.SupportAbilityListPanel); } private Boolean IsSubMenuDisabledByMainMenu(Boolean useMenu) diff --git a/Assembly-CSharp/Global/ChocographUI.cs b/Assembly-CSharp/Global/ChocographUI.cs index 31ed23473..f48f0aef7 100644 --- a/Assembly-CSharp/Global/ChocographUI.cs +++ b/Assembly-CSharp/Global/ChocographUI.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using Assets.Scripts.Common; using Assets.Sources.Scripts.UI.Common; +using Memoria; +using Memoria.Scenes; using UnityEngine; using Object = System.Object; @@ -9,7 +11,7 @@ public class ChocographUI : UIScene { public override void Show(UIScene.SceneVoidDelegate afterFinished = null) { - UIScene.SceneVoidDelegate sceneVoidDelegate = delegate + UIScene.SceneVoidDelegate afterShowAction = delegate { ButtonGroupState.SetPointerDepthToGroup(4, ChocographUI.ItemGroupButton); ButtonGroupState.SetPointerOffsetToGroup(new Vector2(30f, 0f), ChocographUI.ItemGroupButton); @@ -19,24 +21,16 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) ButtonGroupState.ActiveGroup = ChocographUI.SubMenuGroupButton; }; if (afterFinished != null) - { - sceneVoidDelegate = (UIScene.SceneVoidDelegate)Delegate.Combine(sceneVoidDelegate, afterFinished); - } + afterShowAction += afterFinished; SceneDirector.FadeEventSetColor(FadeMode.Sub, Color.black); - base.Show(sceneVoidDelegate); + base.Show(afterShowAction); + this.UpdateUserInterface(); this.ClearLatestUI(); this.GetEventData(); this.DisplayChocoboAbilityInfo(); this.DisplayInventoryInfo(); this.DisplayChocographList(); - if (FF9StateSystem.PCPlatform) - { - this.HelpDespLabelGameObject.SetActive(true); - } - else - { - this.HelpDespLabelGameObject.SetActive(false); - } + this.HelpDespLabelGameObject.SetActive(FF9StateSystem.PCPlatform); if (ChocographUI.CurrentSelectedChocograph != -1) { ButtonGroupState.SetCursorStartSelect(this.chocographItemList[ChocographUI.CurrentSelectedChocograph].Self, ChocographUI.ItemGroupButton); @@ -53,17 +47,36 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) this.chocoboScrollButton.DisplayScrollButton(false, false); } + public void UpdateUserInterface() + { + if (!Configuration.Interface.IsEnabled) + return; + const Int32 originalLineCount = 5; + const Single buttonOriginalHeight = 86f; + const Single panelOriginalWidth = 658f; + const Single panelOriginalHeight = originalLineCount * buttonOriginalHeight; + Int32 linePerPage = Configuration.Interface.MenuChocographRowCount; + Int32 lineHeight = (Int32)Math.Round(panelOriginalHeight / linePerPage); + Single scaleFactor = lineHeight / buttonOriginalHeight; + _chocographPanel.SubPanel.ChangeDims(1, linePerPage, panelOriginalWidth, lineHeight); + foreach (GOButtonPrefab button in _chocographPanel.SubPanel.Table.Entries) + { + button.IconSprite.SetAnchor(target: button.Transform, relBottom: 0.5f, relTop: 0.5f, bottom: -36f * scaleFactor, top: 36f * scaleFactor, relLeft: 0.064f, relRight: 0.064f, right: 72f * scaleFactor); + button.NameLabel.SetAnchor(target: button.Transform, relBottom: 0.081f, relTop: 0.919f, relLeft: 0.064f, left: 90f * scaleFactor, relRight: 1f); + button.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + } + } + public override void Hide(UIScene.SceneVoidDelegate afterFinished = null) { - UIScene.SceneVoidDelegate sceneVoidDelegate = delegate + UIScene.SceneVoidDelegate afterHideAction = delegate { + MainMenuUI.UIControlPanel?.ExitMenu(); PersistenSingleton.Instance.ChangeUIState(PersistenSingleton.Instance.HUDState); }; if (afterFinished != null) - { - sceneVoidDelegate = (UIScene.SceneVoidDelegate)Delegate.Combine(sceneVoidDelegate, afterFinished); - } - base.Hide(sceneVoidDelegate); + afterHideAction += afterFinished; + base.Hide(afterHideAction); this.RemoveCursorMemorize(); } @@ -218,15 +231,14 @@ private Int32 GetIconType(Int32 id) public static void UpdateEquipedHintMap() { - if (FF9StateSystem.Common.FF9.hintmap_id > 24) + if (FF9StateSystem.Common.FF9.hintmap_id > ChocographUI.HintMapMax) { FF9StateSystem.Common.FF9.hintmap_id = 0; ChocographUI.CurrentSelectedChocograph = -1; } else { - ChocographUI.CurrentSelectedChocograph = FF9StateSystem.Common.FF9.hintmap_id - 1; - ChocographUI.CurrentSelectedChocograph = (Int32)((ChocographUI.CurrentSelectedChocograph >= 0) ? ChocographUI.CurrentSelectedChocograph : -1); + ChocographUI.CurrentSelectedChocograph = Math.Max(FF9StateSystem.Common.FF9.hintmap_id, 0) - 1; } } @@ -235,28 +247,24 @@ private void GetEventData() this.hasMap.Clear(); this.hasGem.Clear(); ChocographUI.UpdateEquipedHintMap(); - Int32 num = 0; - Int32 num2 = 0; - this.ability = (Int32)FF9StateSystem.EventState.gEventGlobal[191]; + Int32 chocographFound = 0; + Int32 chocographOpened = 0; + this.ability = FF9StateSystem.EventState.gEventGlobal[191]; this.mapCount = 0; this.gemCount = 0; for (Int32 i = 0; i < 3; i++) { - num |= (Int32)FF9StateSystem.EventState.gEventGlobal[187 + i] << i * 8; - num2 |= (Int32)FF9StateSystem.EventState.gEventGlobal[184 + i] << i * 8; + chocographFound |= (Int32)FF9StateSystem.EventState.gEventGlobal[187 + i] << i * 8; + chocographOpened |= (Int32)FF9StateSystem.EventState.gEventGlobal[184 + i] << i * 8; } - for (Int32 j = 0; j < 24; j++) + for (Int32 i = 0; i < ChocographUI.HintMapMax; i++) { - this.hasMap.Add((num & 1 << j) != 0); - if (this.hasMap[j]) - { + this.hasMap.Add((chocographFound & 1 << i) != 0); + if (this.hasMap[i]) this.mapCount++; - } - this.hasGem.Add((num2 & 1 << j) != 0); - if (this.hasGem[j]) - { + this.hasGem.Add((chocographOpened & 1 << i) != 0); + if (this.hasGem[i]) this.gemCount++; - } } } @@ -413,19 +421,16 @@ private void DisplaySelected(Int32 currentSelectedItemIndex) private void Awake() { base.FadingComponent = this.ScreenFadeGameObject.GetComponent(); - UIEventListener uieventListener = UIEventListener.Get(this.SelectSubMenu); - uieventListener.onClick = (UIEventListener.VoidDelegate)Delegate.Combine(uieventListener.onClick, new UIEventListener.VoidDelegate(this.onClick)); - UIEventListener uieventListener2 = UIEventListener.Get(this.CancelSubMenu); - uieventListener2.onClick = (UIEventListener.VoidDelegate)Delegate.Combine(uieventListener2.onClick, new UIEventListener.VoidDelegate(this.onClick)); - foreach (Object obj in this.ChocographListPanel.GetChild(1).GetChild(0).transform) + UIEventListener.Get(this.SelectSubMenu).onClick += this.onClick; + UIEventListener.Get(this.CancelSubMenu).onClick += this.onClick; + foreach (Transform t in this.ChocographListPanel.GetChild(1).GetChild(0).transform) { - Transform transform = (Transform)obj; - this.chocographItemList.Add(new ChocographUI.ChocographItem(transform.gameObject)); - UIEventListener uieventListener3 = UIEventListener.Get(transform.gameObject); - uieventListener3.onClick = (UIEventListener.VoidDelegate)Delegate.Combine(uieventListener3.onClick, new UIEventListener.VoidDelegate(this.onClick)); + this.chocographItemList.Add(new ChocographUI.ChocographItem(t.gameObject)); + UIEventListener.Get(t.gameObject).onClick += this.onClick; } this.chocoboScrollButton = this.ChocographListPanel.GetChild(0).GetComponent(); this.chocographScrollList = this.ChocographListPanel.GetChild(1).GetComponent(); + this._chocographPanel = new GOScrollablePanel(this.ChocographListPanel); this.ChocoboAbilityInfo = new ChocographUI.ChocoboAbility(this.ChocoboAbilityInfoPanel); this.ChocoboAbilityInfo.ClearAbility(); this.HintAbilityRequired = new ChocographUI.ChocoboAbility(this.HintAbilityRequiredPanel); @@ -437,35 +442,24 @@ private void Awake() public static Int32 CurrentSelectedChocograph = -1; public GameObject ScreenFadeGameObject; - public GameObject HelpDespLabelGameObject; - public GameObject ChocographListPanel; - public GameObject SelectedContentPanel; - public GameObject HintContentPanel; - public GameObject ChocoboAbilityInfoPanel; public UILabel InventoryNumber; - public UILabel LocationFoundNumber; public UISprite SelectedMap; - public UILabel SelectedItemLabel; - public UISprite SelectedItemIcon; public UISprite HintMap; - public UILabel HintText; - public GameObject HintAbilityRequiredPanel; public GameObject SelectSubMenu; - public GameObject CancelSubMenu; private ChocographUI.SubMenu currentMenu; @@ -473,17 +467,15 @@ private void Awake() private Int32 currentSelectItemIndex; private static String SubMenuGroupButton = "Chocograph.SubMenu"; - private static String ItemGroupButton = "Chocograph.Item"; private ChocographUI.ChocoboAbility ChocoboAbilityInfo; - private ChocographUI.ChocoboAbility HintAbilityRequired; private List chocographItemList = new List(); + private GOScrollablePanel _chocographPanel; private SnapDragScrollView chocographScrollList; - private ScrollButton chocoboScrollButton; private Boolean hasSelectedItem; @@ -491,11 +483,9 @@ private void Awake() private Int32 ability = 1; private List hasMap = new List(); - private List hasGem = new List(); private Int32 mapCount; - private Int32 gemCount; public class ChocoboAbility @@ -514,12 +504,8 @@ public ChocoboAbility(GameObject go) public void ClearAbility() { - UISprite[] abilitySpriteList = this.AbilitySpriteList; - for (Int32 i = 0; i < (Int32)abilitySpriteList.Length; i++) - { - UISprite uisprite = abilitySpriteList[i]; - uisprite.spriteName = String.Empty; - } + foreach (UISprite sprite in this.AbilitySpriteList) + sprite.spriteName = String.Empty; } public UISprite[] AbilitySpriteList; @@ -537,13 +523,9 @@ public ChocographItem(GameObject go) } public GameObject Self; - public GameObject Content; - public ButtonGroupState Button; - public UISprite IconSprite; - public UILabel ItemName; } diff --git a/Assembly-CSharp/Global/Config/ConfigUI.cs b/Assembly-CSharp/Global/Config/ConfigUI.cs index 8dfa6e190..e51bb2021 100644 --- a/Assembly-CSharp/Global/Config/ConfigUI.cs +++ b/Assembly-CSharp/Global/Config/ConfigUI.cs @@ -79,21 +79,15 @@ public enum ATBMode } public GameObject KeyboardButton; - public GameObject JoystickButton; - public GameObject CustomControllerKeyboardPanel; - public GameObject CustomControllerJoystickPanel; - public GameObject CustomControllerMobilePanel; private HonoTweenPosition controllerKeyboardTransition; - private HonoTweenPosition controllerJoystickTransition; private List ControllerKeyboardList = new List(); - private List ControllerJoystickList = new List(); private Boolean[] inputBool = @@ -121,9 +115,7 @@ public enum ATBMode }; private Int32 customControllerCount = 8; - private Int32 currentControllerIndex; - private ControllerType currentControllerType; private String[] PCJoystickNormalButtons = @@ -149,37 +141,24 @@ public enum ATBMode }; private ConfigUI.TriggerState leftTrigger; - private ConfigUI.TriggerState rightTrigger; private float leftTriggerTime; - private float rightTriggerTime; - private float triggerDelay = 0.1f; public GameObject ConfigList; - public GameObject HelpDespLabelGameObject; - public GameObject ScreenFadeGameObject; - public GameObject WarningDialog; - public GameObject WarningDialogHitPoint; - public GameObject BoosterPanel; - public GameObject TransitionGroup; - public GameObject ControlPanelGroup; private static String ConfigGroupButton = "Config.Config"; - private static String WarningMenuGroupButton = "Config.Warning"; - private static String CustomControllerGroupButton = "Config.Controller"; - private static String ControllerTypeGroupButton = "Config.ControllerType"; private static List ConfigSliderIdList = new List(new[] @@ -196,31 +175,23 @@ public enum ATBMode private List ConfigFieldList; private SnapDragScrollView configScrollView; - private ScrollButton configScrollButton; private OnScreenButton hitpointScreenButton; private GameObject toTitleGameObject; - private GameObject masterSkillButtonGameObject; - private GameObject lvMaxButtonGameObject; - private GameObject gilMaxButtonGameObject; - private GameObject backButtonGameObject; private UILabel masterSkillLabel; - private UILabel lvMaxLabel; - private UILabel gilMaxLabel; private HonoTweenClipping warningTransition; private Single fieldMessageSliderStep = 6f; - private Single battleSpeedSliderStep = 2f; private Boolean fastSwitch; @@ -228,11 +199,14 @@ public enum ATBMode private Boolean cursorInList = true; private Boolean is_vibe; - private Int32 vibe_tick; private Boolean helpEnable; + [NonSerialized] + private Int32 fieldMessageConfigIndex = (Int32)Configurator.FieldMessage; + public GameObject SliderMenuTemplate => ConfigList.GetChild(1).GetChild(0).GetChild(fieldMessageConfigIndex); + [DebuggerHidden] private IEnumerator ShowButtonGroupDalay() { @@ -1547,6 +1521,8 @@ private GameObject CreateSlider(GameObject template, Configurator id, int siblin go.transform.SetSiblingIndex(siblingIndex); go.name = $"{id} Panel - Slider"; go.GetComponent().ID = (int)id; + if (siblingIndex <= fieldMessageConfigIndex) + fieldMessageConfigIndex++; return go; } catch (Exception ex) @@ -1589,7 +1565,6 @@ private void CreateATBModeSlider(GameObject template, Configurator id, int sibli var slider = go.GetComponentInChildren(); slider.numberOfSteps = 4; slider.value = 0f; - } private void Awake() @@ -1598,8 +1573,7 @@ private void Awake() ConfigFieldList = new List(); // Adding the volume sliders - UITable table = ConfigList.GetChild(1).GetChild(0).GetComponent(); - GameObject template = table.gameObject.GetChild((int)Configurator.FieldMessage); + GameObject template = SliderMenuTemplate; CreateVolumeSlider(template, Configurator.SoundVolume, 0); CreateVolumeSlider(template, Configurator.MusicVolume, 1); CreateVolumeSlider(template, Configurator.MovieVolume, 2); @@ -1619,6 +1593,8 @@ private void Awake() || id == Configurator.Sound || id == Configurator.SoundEffect) { + if (configTopObj.transform.GetSiblingIndex() < fieldMessageConfigIndex) + fieldMessageConfigIndex--; configTopObj.SetActive(false); Destroy(configTopObj); continue; diff --git a/Assembly-CSharp/Global/EquipUI.cs b/Assembly-CSharp/Global/EquipUI.cs index f0f6b7313..125b6cfc7 100644 --- a/Assembly-CSharp/Global/EquipUI.cs +++ b/Assembly-CSharp/Global/EquipUI.cs @@ -15,7 +15,7 @@ public class EquipUI : UIScene { public Int32 CurrentPartyIndex { - set { this.currentPartyIndex = value; } + set => this.currentPartyIndex = value; } public void Update() @@ -49,7 +49,7 @@ private void ChangeBestItemsButtonBehaviour(Boolean equipForAbilityLearning) public override void Show(UIScene.SceneVoidDelegate afterFinished = null) { - UIScene.SceneVoidDelegate sceneVoidDelegate = delegate + UIScene.SceneVoidDelegate afterShowAction = delegate { PersistenSingleton.Instance.MainMenuScene.SubMenuPanel.SetActive(false); ButtonGroupState.SetPointerOffsetToGroup(new Vector2(10f, 0f), EquipUI.InventoryGroupButton); @@ -58,10 +58,11 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) ButtonGroupState.ActiveGroup = EquipUI.SubMenuGroupButton; }; if (afterFinished != null) - sceneVoidDelegate += afterFinished; + afterShowAction += afterFinished; SceneDirector.FadeEventSetColor(FadeMode.Sub, Color.black); - base.Show(sceneVoidDelegate); + base.Show(afterShowAction); + this.UpdateUserInterface(); this.SwitchCharacter(true); this.DisplaySubMenuArrow(true); this.HelpDespLabelGameObject.SetActive(FF9StateSystem.PCPlatform); @@ -69,9 +70,35 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) this.equipSelectScrollList.ScrollButton.DisplayScrollButton(false, false); } + public void UpdateUserInterface() + { + if (!Configuration.Interface.IsEnabled) + return; + const Int32 originalLineCount = 5; + const Single buttonOriginalHeight = 90f; + const Single panelOriginalWidth = 752f; + const Single panelOriginalHeight = originalLineCount * buttonOriginalHeight; + Int32 linePerPage = Configuration.Interface.MenuEquipRowCount; + Int32 lineHeight = (Int32)Math.Round(panelOriginalHeight / linePerPage); + Single scaleFactor = lineHeight / buttonOriginalHeight; + _equipSelectPanel.SubPanel.ChangeDims(1, linePerPage, panelOriginalWidth, lineHeight); + _equipSelectPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _equipSelectPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.144f, relTop: 0.856f, relLeft: 0.044f, relRight: 0.13f); + _equipSelectPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _equipSelectPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.144f, relTop: 0.856f, relLeft: 0.154f, relRight: 0.795f); + _equipSelectPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _equipSelectPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.144f, relTop: 0.856f, relLeft: 0.8f, relRight: 0.92f); + _equipSelectPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _equipSelectPanel.SubPanel.ButtonPrefab.NumberLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _equipSelectPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + } + public override void Hide(UIScene.SceneVoidDelegate afterFinished = null) { - base.Hide(afterFinished); + UIScene.SceneVoidDelegate afterHideAction = delegate + { + MainMenuUI.UIControlPanel?.ExitMenu(); + }; + if (afterFinished != null) + afterHideAction += afterFinished; + base.Hide(afterHideAction); if (!this.fastSwitch) { PersistenSingleton.Instance.MainMenuScene.StartSubmenuTweenIn(); @@ -830,9 +857,7 @@ private void DisplayInventory() if (CanEquip(item, itemData, character, characterMask, equipSlotMask)) { - this.tempItemList[resultIndex].id = item.id; - this.tempItemList[resultIndex].count = item.count; - equipList.Add(this.tempItemList[resultIndex]); + equipList.Add(item); resultIndex++; } } @@ -1315,12 +1340,9 @@ public SubMenu GetSubMenuFromGameObject(GameObject go) private void Awake() { base.FadingComponent = this.ScreenFadeGameObject.GetComponent(); - UIEventListener uieventListener = UIEventListener.Get(this.EquipSubMenu); - uieventListener.onClick = (UIEventListener.VoidDelegate) Delegate.Combine(uieventListener.onClick, new UIEventListener.VoidDelegate(this.onClick)); - UIEventListener uieventListener2 = UIEventListener.Get(this.OptimizeSubMenu); - uieventListener2.onClick = (UIEventListener.VoidDelegate) Delegate.Combine(uieventListener2.onClick, new UIEventListener.VoidDelegate(this.onClick)); - UIEventListener uieventListener3 = UIEventListener.Get(this.OffSubMenu); - uieventListener3.onClick = (UIEventListener.VoidDelegate) Delegate.Combine(uieventListener3.onClick, new UIEventListener.VoidDelegate(this.onClick)); + UIEventListener.Get(this.EquipSubMenu).onClick += this.onClick; + UIEventListener.Get(this.OptimizeSubMenu).onClick += this.onClick; + UIEventListener.Get(this.OffSubMenu).onClick += this.onClick; this.characterHud = new CharacterDetailHUD(this.CharacterDetailPanel, false); this.parameterHud = new ParameterDetailCompareHUD(this.CharacterParameterPanel); this.equipmentHud = new EquipmentDetailHud(this.EquipmentPartListPanel.GetChild(0)); @@ -1332,15 +1354,12 @@ private void Awake() this.equipmentAbilitySelectHudList[2] = new AbilityItemHUD(this.EquipmentAbilityPanel.GetChild(1).GetChild(2)); this.equipmentPartCaption = this.EquipmentPartListPanel.GetChild(1).GetChild(2); this.equipmentListCaption = this.EquipmentInventoryListPanel.GetChild(2).GetChild(4).GetChild(0).GetComponent(); - foreach (Object obj in this.EquipmentPartListPanel.GetChild(0).transform) - { - Transform tr = (Transform) obj; - UIEventListener uieventListener4 = UIEventListener.Get(tr.gameObject); - uieventListener4.onClick = (UIEventListener.VoidDelegate) Delegate.Combine(uieventListener4.onClick, new UIEventListener.VoidDelegate(this.onClick)); - } + foreach (Transform t in this.EquipmentPartListPanel.GetChild(0).transform) + UIEventListener.Get(t.gameObject).onClick += this.onClick; this.submenuArrowGameObject = this.SubMenuPanel.GetChild(0); this.equipSelectScrollList = this.EquipmentInventoryListPanel.GetChild(1).GetComponent(); + this._equipSelectPanel = new GOScrollablePanel(this.EquipmentInventoryListPanel); this.equipmentSelectionTransition = this.TransitionGroup.GetChild(0).GetComponent(); this.avatarTransition = this.CharacterDetailPanel.GetChild(0).GetChild(6).GetChild(0).GetComponent(); this.itemIdList.Add(new List()); @@ -1348,9 +1367,6 @@ private void Awake() this.itemIdList.Add(new List()); this.itemIdList.Add(new List()); this.itemIdList.Add(new List()); - this.tempItemList = new FF9ITEM[45]; - for (int i = 0; i < this.tempItemList.Length; i++) - this.tempItemList[i] = new FF9ITEM(RegularItem.NoItem, 0); this.selectedCaption = this.EquipmentInventoryListPanel.GetChild(2).GetChild(4).GetChild(0).GetComponent(); @@ -1397,13 +1413,13 @@ private void ChangeEquipButtonWidth() private HonoAvatarTweenPosition avatarTransition; private GameObject submenuArrowGameObject; private RecycleListPopulator equipSelectScrollList; + private GOScrollablePanel _equipSelectPanel; private static String SubMenuGroupButton = "Equip.SubMenu"; private static String EquipmentGroupButton = "Equip.Equipment"; private static String InventoryGroupButton = "Equip.Inventory"; private List> itemIdList = new List>(); - private FF9ITEM[] tempItemList; private Int32 currentPartyIndex; private SubMenu currentMenu = SubMenu.None; private Int32 currentEquipPart = -1; diff --git a/Assembly-CSharp/Global/ItemUI.cs b/Assembly-CSharp/Global/ItemUI.cs index 8e7af4b42..fc8e92548 100644 --- a/Assembly-CSharp/Global/ItemUI.cs +++ b/Assembly-CSharp/Global/ItemUI.cs @@ -73,6 +73,8 @@ public class ItemUI : UIScene private Int32 _currentItemIndex; private Dialog _chocoboDialog; private Int32 _defaultSkinLabelSpacingY; + private GOScrollablePanel _itemPanel; + private GOScrollablePanel _keyItemPanel; static ItemUI() { @@ -101,7 +103,7 @@ public ItemUI() public override void Show(SceneVoidDelegate afterFinished = null) { - SceneVoidDelegate action = () => + SceneVoidDelegate afterShowAction = () => { PersistenSingleton.Instance.MainMenuScene.SubMenuPanel.SetActive(false); ButtonGroupState.SetPointerDepthToGroup(4, ItemGroupButton); @@ -117,12 +119,13 @@ public override void Show(SceneVoidDelegate afterFinished = null) ButtonGroupState.SetPointerLimitRectToGroup(ItemListPanel.GetComponent(), _itemScrollList.cellHeight, ItemArrangeGroupButton); ButtonGroupState.SetPointerLimitRectToGroup(KeyItemListPanel.GetComponent(), _keyItemScrollList.cellHeight, KeyItemGroupButton); ButtonGroupState.ActiveGroup = SubMenuGroupButton; - StartCoroutine(Show_dalay()); + StartCoroutine(Show_delay()); afterFinished?.Invoke(); }; SceneDirector.FadeEventSetColor(FadeMode.Sub, Color.black); - base.Show(action); + base.Show(afterShowAction); + UpdateUserInterface(); ItemListPanel.SetActive(true); KeyItemListPanel.SetActive(false); DisplayItem(); @@ -131,8 +134,35 @@ public override void Show(SceneVoidDelegate afterFinished = null) _keyItemScrollList.ScrollButton.DisplayScrollButton(false, false); } + public void UpdateUserInterface() + { + if (!Configuration.Interface.IsEnabled) + return; + const Int32 originalLineCount = 8; + const Single buttonOriginalHeight = 98f; + const Single panelOriginalWidth = 1490f; + const Single panelOriginalHeight = originalLineCount * buttonOriginalHeight; + Int32 linePerPage = Configuration.Interface.MenuItemRowCount; + Int32 lineHeight = (Int32)Math.Round(panelOriginalHeight / linePerPage); + Single scaleFactor = lineHeight / buttonOriginalHeight; + KeyItemDetailHUD keyItemPrefab = new KeyItemDetailHUD(_keyItemPanel.SubPanel.ButtonPrefab.GameObject); + _itemPanel.SubPanel.ChangeDims(2, linePerPage, panelOriginalWidth / 2f, lineHeight); + _itemPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _itemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.105f, relRight: 0.191f); + _itemPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _itemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.215f, relRight: 0.795f); + _itemPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _itemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.8f, relRight: 0.9f); + _itemPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _itemPanel.SubPanel.ButtonPrefab.NumberLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _itemPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + _keyItemPanel.SubPanel.ChangeDims(2, linePerPage, panelOriginalWidth / 2f, lineHeight); + keyItemPrefab.NewIcon.SetDimensions((Int32)Math.Round(117f * scaleFactor), (Int32)Math.Round(64f * scaleFactor)); + keyItemPrefab.NewIconSprite.SetDimensions((Int32)Math.Round(44f * scaleFactor), (Int32)Math.Round(58f * scaleFactor)); + keyItemPrefab.NewIconLabelSprite.SetDimensions((Int32)Math.Round(90f * scaleFactor), (Int32)Math.Round(58f * scaleFactor)); + keyItemPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _keyItemPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + } + [DebuggerHidden] - private IEnumerator Show_dalay() + private IEnumerator Show_delay() { yield return new WaitForEndOfFrame(); @@ -146,7 +176,13 @@ private IEnumerator Show_dalay() public override void Hide(SceneVoidDelegate afterFinished = null) { - base.Hide(afterFinished); + UIScene.SceneVoidDelegate afterHideAction = delegate + { + MainMenuUI.UIControlPanel?.ExitMenu(); + }; + if (afterFinished != null) + afterHideAction += afterFinished; + base.Hide(afterHideAction); if (_fastSwitch) return; PersistenSingleton.Instance.MainMenuScene.StartSubmenuTweenIn(); @@ -889,6 +925,8 @@ private void Awake() _defaultSkinLabelSpacingY = _keyItemDetailDescription.spacingY; _itemScrollList = ItemListPanel.GetChild(1).GetComponent(); _keyItemScrollList = KeyItemListPanel.GetChild(1).GetComponent(); + _itemPanel = new GOScrollablePanel(ItemListPanel); + _keyItemPanel = new GOScrollablePanel(KeyItemListPanel); RemoveLeftAnchorFromItemNumberLabels(); @@ -922,17 +960,19 @@ private void RemoveLeftAnchorFromItemNumberLabels() private struct KeyItemDetailHUD { - //public GameObject Self; + public GameObject Self; public ButtonGroupState Button; public UILabel NameLabel; + public UIWidget NewIcon; public UISprite NewIconSprite; public UISprite NewIconLabelSprite; public KeyItemDetailHUD(GameObject go) { - //Self = go; + Self = go; Button = go.GetComponent(); NameLabel = go.GetChild(0).GetComponent(); + NewIcon = go.GetChild(1).GetComponent(); NewIconSprite = go.GetChild(1).GetChild(0).GetComponent(); NewIconLabelSprite = go.GetChild(1).GetChild(1).GetComponent(); } diff --git a/Assembly-CSharp/Global/MainMenuUI.cs b/Assembly-CSharp/Global/MainMenuUI.cs index 62ab59626..966dbd643 100644 --- a/Assembly-CSharp/Global/MainMenuUI.cs +++ b/Assembly-CSharp/Global/MainMenuUI.cs @@ -5,20 +5,17 @@ using Assets.Sources.Scripts.UI.Common; using Memoria.Data; using Memoria.Assets; +using Memoria.Scenes; using UnityEngine; using Object = System.Object; public class MainMenuUI : UIScene { - public Vector3 FrontRowPosition - { - get => new Vector3(-418f, 0f, 0f); - } + public static MenuUIControlPanel UIControlPanel { get; set; } - public Vector3 BackRowPosition - { - get => new Vector3(-392f, 0f, 0f); - } + public Vector3 FrontRowPosition => new Vector3(-418f, 0f, 0f); + + public Vector3 BackRowPosition => new Vector3(-392f, 0f, 0f); public MainMenuUI.SubMenu CurrentSubMenu { @@ -87,6 +84,7 @@ public override void Hide(UIScene.SceneVoidDelegate afterFinished = null) { UIScene.SceneVoidDelegate afterHideAction = delegate { + MainMenuUI.UIControlPanel?.ExitMenu(); if (this.isNeedHideSubMenu) { SceneDirector.FF9Wipe_FadeInEx(12); diff --git a/Assembly-CSharp/Global/Recycle/RecycleListPopulator.cs b/Assembly-CSharp/Global/Recycle/RecycleListPopulator.cs index 7473acfc2..0f336087c 100644 --- a/Assembly-CSharp/Global/Recycle/RecycleListPopulator.cs +++ b/Assembly-CSharp/Global/Recycle/RecycleListPopulator.cs @@ -239,7 +239,7 @@ private void InitTableViewImp(List inDataList, Int32 inActiveI afterVisibleIndex++; } } - base.Invoke("RepositionList", 0.02f); + base.Invoke("RepositionList", 0f); } private void UpdateTableViewImp(Boolean refreshSelection = true) @@ -248,7 +248,15 @@ private void UpdateTableViewImp(Boolean refreshSelection = true) { Transform poolObj = this.itemsPool[kvp.Value]; if (refreshSelection && poolObj.GetComponent()) + { poolObj.GetComponent().startsSelected = this.activeNumber == kvp.Key; + if (ButtonGroupState.ActiveGroup == ItemUI.ItemArrangeGroupButton) + { + UIKeyNavigation subGroupNavig = poolObj.GetChild(1)?.GetComponent(); + if (subGroupNavig != null) + subGroupNavig.startsSelected = this.activeNumber == kvp.Key; + } + } this.PopulateListItemWithData(poolObj, this.dataList[kvp.Key], kvp.Key, false); } } @@ -257,13 +265,18 @@ private void RepositionList() { this.table.Reposition(); this.draggablePanel.SetDragAmount(0f, 0f, false); + // The "pivotOffset" pick is a bit hacky there... not sure on what it should be based instead + Vector2 pivotOffset = PersistenSingleton.Instance.State == UIManager.UIState.BattleHUD ? new Vector2(0f, 0.5f) : new Vector2(0.5f, 0.5f); foreach (KeyValuePair kvp in this.dataTracker) { Int32 lineNo = kvp.Key / this.Column; + Int32 columnNo = kvp.Key % this.Column; Transform poolObj = this.itemsPool[kvp.Value]; if (this.startNumber > 0) lineNo -= this.startNumber / this.Column; - poolObj.localPosition = new Vector3(poolObj.localPosition.x, -(this.cellHeight / 2f + lineNo * this.cellHeight), poolObj.localPosition.z); + Single posX = this.table.padding.x + pivotOffset.x * poolObj.GetComponent().width + columnNo * (2 * this.table.padding.x + poolObj.GetComponent().width); + Single posY = this.table.padding.y + pivotOffset.y * this.cellHeight + lineNo * (2 * this.table.padding.y + this.cellHeight); + poolObj.localPosition = new Vector3(posX, -posY, poolObj.localPosition.z); } this.draggablePanel.SetDragAmount(0f, 0f, true); if (this.ScrollButton) diff --git a/Assembly-CSharp/Global/ShopUI.cs b/Assembly-CSharp/Global/ShopUI.cs index b4b5fa491..e350dca76 100644 --- a/Assembly-CSharp/Global/ShopUI.cs +++ b/Assembly-CSharp/Global/ShopUI.cs @@ -8,6 +8,7 @@ using Memoria; using Memoria.Data; using Memoria.Assets; +using Memoria.Scenes; using UnityEngine; public class ShopUI : UIScene @@ -26,7 +27,7 @@ public ShopUI.ShopType Type public override void Show(UIScene.SceneVoidDelegate afterFinished = null) { - UIScene.SceneVoidDelegate sceneVoidDelegate = delegate + UIScene.SceneVoidDelegate afterShowAction = delegate { ButtonGroupState.SetPointerOffsetToGroup(new Vector2(50f, 0f), ShopUI.ItemGroupButton); ButtonGroupState.SetPointerOffsetToGroup(new Vector2(50f, 0f), ShopUI.WeaponGroupButton); @@ -44,9 +45,10 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) ButtonGroupState.ActiveGroup = ShopUI.SubMenuGroupButton; }; if (afterFinished != null) - sceneVoidDelegate += afterFinished; + afterShowAction += afterFinished; SceneDirector.FadeEventSetColor(FadeMode.Sub, Color.black); - base.Show(sceneVoidDelegate); + base.Show(afterShowAction); + this.UpdateUserInterface(); this.InitializeData(); if (this.type != ShopUI.ShopType.Synthesis) { @@ -64,15 +66,53 @@ public override void Show(UIScene.SceneVoidDelegate afterFinished = null) this.shopSellItemScrollList.ScrollButton.DisplayScrollButton(false, false); } + public void UpdateUserInterface() + { + if (!Configuration.Interface.IsEnabled) + return; + const Int32 originalLineCount = 8; + const Int32 reducedOriginalLineCount = 5; + const Single buttonOriginalHeight = 98f; + const Single buyPanelOriginalWidth = 916f; + const Single panelOriginalHeight = originalLineCount * buttonOriginalHeight; + const Single panelReducedOriginalHeight = reducedOriginalLineCount * buttonOriginalHeight; + Int32 linePerPage = Configuration.Interface.MenuItemRowCount; + Int32 lineHeight = (Int32)Math.Round(panelOriginalHeight / linePerPage); + Int32 reducedLinePerPage = (Int32)Math.Round(linePerPage * 0.65f); + Int32 reducedLineHeight = (Int32)Math.Round(panelReducedOriginalHeight / reducedLinePerPage); + Single scaleFactor = lineHeight / buttonOriginalHeight; + _shopItemPanel.SubPanel.ChangeDims(1, linePerPage, buyPanelOriginalWidth, lineHeight); + _shopItemPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _shopItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.085f, relRight: 0.155f); + _shopItemPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _shopItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.175f, relRight: 0.65f); + _shopItemPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _shopItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.65f, relRight: 0.92f); + _shopItemPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _shopItemPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + _shopWeaponPanel.SubPanel.ChangeDims(1, reducedLinePerPage, buyPanelOriginalWidth, reducedLineHeight); + _shopWeaponPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _shopWeaponPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.085f, relRight: 0.155f); + _shopWeaponPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _shopWeaponPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.175f, relRight: 0.65f); + _shopWeaponPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _shopWeaponPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.65f, relRight: 0.92f); + _shopWeaponPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _shopWeaponPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + const Single sellPanelOriginalWidth = 1490f; + _shopSellItemPanel.SubPanel.ChangeDims(2, linePerPage, sellPanelOriginalWidth / 2f, lineHeight); + _shopSellItemPanel.SubPanel.ButtonPrefab.IconSprite.SetAnchor(target: _shopSellItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.105f, relRight: 0.191f); + _shopSellItemPanel.SubPanel.ButtonPrefab.NameLabel.SetAnchor(target: _shopSellItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.215f, relRight: 0.795f); + _shopSellItemPanel.SubPanel.ButtonPrefab.NumberLabel.SetAnchor(target: _shopSellItemPanel.SubPanel.ButtonPrefab.Transform, relBottom: 0.184f, relTop: 0.816f, relLeft: 0.8f, relRight: 0.9f); + _shopSellItemPanel.SubPanel.ButtonPrefab.NameLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _shopSellItemPanel.SubPanel.ButtonPrefab.NumberLabel.fontSize = (Int32)Math.Round(36f * scaleFactor); + _shopSellItemPanel.SubPanel.RecycleListPopulator.RefreshTableView(); + } + public override void Hide(UIScene.SceneVoidDelegate afterFinished = null) { - UIScene.SceneVoidDelegate sceneVoidDelegate = delegate + UIScene.SceneVoidDelegate afterHideAction = delegate { + MainMenuUI.UIControlPanel?.ExitMenu(); PersistenSingleton.Instance.SetEventEnable(true); }; if (afterFinished != null) - sceneVoidDelegate += afterFinished; - base.Hide(sceneVoidDelegate); + afterHideAction += afterFinished; + base.Hide(afterHideAction); this.RemoveCursorMemorize(); this.soldItemIdDict.Clear(); } @@ -1136,6 +1176,9 @@ private void Awake() this.shopItemScrollList = this.ItemListPanel.GetChild(1).GetComponent(); this.shopWeaponScrollList = this.WeaponListPanel.GetChild(1).GetComponent(); this.shopSellItemScrollList = this.SellItemListPanel.GetChild(1).GetComponent(); + this._shopItemPanel = new GOScrollablePanel(this.ItemListPanel); + this._shopWeaponPanel = new GOScrollablePanel(this.WeaponListPanel); + this._shopSellItemPanel = new GOScrollablePanel(this.SellItemListPanel); UIEventListener.Get(this.BuySubMenu).onClick += this.onClick; UIEventListener.Get(this.SellSubMenu).onClick += this.onClick; UIEventListener.Get(this.InputQuantityDialog.GetChild(2)).onNavigate += this.OnKeyQuantity; @@ -1218,127 +1261,80 @@ private void UpdateWeaponOrSynthType(Boolean exitSelection = false) } private const Single TRIGGER_DURATION = 0.115f; - private const Single CHANGE_QUANTITY_DURATION = 1f; private static String SubMenuGroupButton = "Shop.SubMenu"; - private static String ItemGroupButton = "Shop.Item"; - private static String WeaponGroupButton = "Shop.Weapon"; - private static String SellItemGroupButton = "Shop.Sell"; - private static String QuantityGroupButton = "Shop.Quantity"; public GameObject BuySubMenu; - public GameObject SellSubMenu; - public GameObject ShopTitleLabel; - public GameObject HelpLabel; - public GameObject ItemShopPanel; - public GameObject WeaponAndSynthShopPanel; - public GameObject SellShopPanel; - public GameObject SynthesisPartInfoPanel; - public GameObject NonSynthesisControlPanel; - public GameObject NonSynthesisHelpDespLabelGo; - public GameObject SynthesisControlPanel; - public GameObject SynthesisHelpDespLabelGo; - public GameObject InputQuantityDialog; - public GameObject InfoDialog; - public GameObject ConfirmDialogHitPoint; - public GameObject ItemInfoPanel; - public GameObject WeaponInfoPanel; - public GameObject ItemListPanel; - public GameObject WeaponListPanel; - public GameObject SellItemListPanel; - public GameObject CharacterParamInfoPanel; - public GameObject RequiredItemPanel; - public GameObject ScreenFadeGameObject; private UILabel itemFundLabel; - private UILabel itemCountLabel; - private UILabel weaponFundLabel; - private UILabel weaponCountLabel; - private UILabel weaponEquipTextLabel; - private UILabel weaponEquipLabel; private ItemListDetailWithIconHUD requiredItem1Hud; - private ItemListDetailWithIconHUD requiredItem2Hud; - private ItemListDetailWithIconHUD confirmItemHud; private UILabel confirmQuantityLabel; - private UILabel confirmPriceLabel; - private UILabel confirmFundLabel; - private UILabel confirmCountLabel; - private UILabel confirmEquipLabel; - private UILabel confirmEquipTextLabel; - private UILabel characterParamCaptionLabel; private RecycleListPopulator shopItemScrollList; - private RecycleListPopulator shopWeaponScrollList; - private RecycleListPopulator shopSellItemScrollList; + private GOScrollablePanel _shopItemPanel; + private GOScrollablePanel _shopWeaponPanel; + private GOScrollablePanel _shopSellItemPanel; private List charInfoHud = new List(); private Int32 id; private List itemIdList = new List(); - private List isItemEnableList = new List(); - private List mixItemList = new List(); - private List mixPartyList = new List(); - private List sellItemIdList = new List(); - private Dictionary soldItemIdDict = new Dictionary(); - private List availableCharaList = new List(); private ShopUI.ShopType type; - private ShopUI.SubMenu currentMenu; private Int32 currentItemIndex = -1; - private Int32 mixStartIndex = 0; private Boolean isGrocery; @@ -1346,17 +1342,12 @@ private void UpdateWeaponOrSynthType(Boolean exitSelection = false) private Int32 availableCharaStart; private Int32 minCount; - private Int32 maxCount; - private Int32 count; private Single triggerCounter; - private Boolean isPlusQuantity; - private Boolean isMinusQuantity; - private Single keepPressingTime; private class CharacterWeaponInfoHUD @@ -1371,13 +1362,9 @@ public CharacterWeaponInfoHUD(GameObject go) } public GameObject Self; - public UILabel ParamValueLabel; - public UISprite AvatarSprite; - public UISprite ChangeArrowSprite; - public UISprite EquipmentTypeSprite; } @@ -1400,16 +1387,13 @@ public enum ShopType public class ShopItemListData : ListDataTypeBase { public RegularItem Id; - public Boolean Enable; - public UInt32 Price; } public class ShopSellItemListData : ListDataTypeBase { public RegularItem Id; - public Int32 Count; } } diff --git a/Assembly-CSharp/Global/UI/UIKey/UIKeyTrigger.cs b/Assembly-CSharp/Global/UI/UIKey/UIKeyTrigger.cs index 4f33c71c0..78f508bbd 100644 --- a/Assembly-CSharp/Global/UI/UIKey/UIKeyTrigger.cs +++ b/Assembly-CSharp/Global/UI/UIKey/UIKeyTrigger.cs @@ -339,12 +339,24 @@ private void OnUIConfigDetected(UIScene scene) break; if (battleHUD.UIControlPanel == null) battleHUD.UIControlPanel = new BattleUIControlPanel(battleHUD); - else if (battleHUD.UIControlPanel.Show) - Configuration.Interface.SaveValues(); battleHUD.UIControlPanel.Show = !battleHUD.UIControlPanel.Show; FF9Sfx.FF9SFX_Play(103); return; } + case UIManager.UIState.MainMenu: + case UIManager.UIState.Item: + case UIManager.UIState.Ability: + case UIManager.UIState.Equip: + case UIManager.UIState.Shop: + case UIManager.UIState.Chocograph: + { + if (MainMenuUI.UIControlPanel == null) + MainMenuUI.UIControlPanel = new MenuUIControlPanel(); + MainMenuUI.UIControlPanel.Scene = scene; + MainMenuUI.UIControlPanel.Show = !MainMenuUI.UIControlPanel.Show; + FF9Sfx.FF9SFX_Play(103); + return; + } } FF9Sfx.FF9SFX_Play(102); } diff --git a/Assembly-CSharp/Global/UI/UIPanel.cs b/Assembly-CSharp/Global/UI/UIPanel.cs index de0da1208..a84122c1f 100644 --- a/Assembly-CSharp/Global/UI/UIPanel.cs +++ b/Assembly-CSharp/Global/UI/UIPanel.cs @@ -1444,40 +1444,38 @@ public virtual Vector3 CalculateConstrainOffset(Vector2 min, Vector2 max) public Boolean ConstrainTargetToBounds(Transform target, ref Bounds targetBounds, Boolean immediate) { - Vector3 vector = targetBounds.min; - Vector3 vector2 = targetBounds.max; - Single num = 1f; + if (targetBounds.size.sqrMagnitude == 0f) + return false; + Vector3 minBounds = targetBounds.min; + Vector3 maxBounds = targetBounds.max; + Single pixelFactor = 1f; if (this.mClipping == UIDrawCall.Clipping.None) { UIRoot root = base.root; - if (root != (UnityEngine.Object)null) - { - num = root.pixelSizeAdjustment; - } + if (root != null) + pixelFactor = root.pixelSizeAdjustment; } - if (num != 1f) + if (pixelFactor != 1f) { - vector /= num; - vector2 /= num; + minBounds /= pixelFactor; + maxBounds /= pixelFactor; } - Vector3 b = this.CalculateConstrainOffset(vector, vector2) * num; - if (b.sqrMagnitude > 0f) + Vector3 constrainOffset = this.CalculateConstrainOffset(minBounds, maxBounds) * pixelFactor; + if (constrainOffset.sqrMagnitude > 0f) { if (immediate) { - target.localPosition += b; - targetBounds.center += b; - SpringPosition component = target.GetComponent(); - if (component != (UnityEngine.Object)null) - { - component.enabled = false; - } + target.localPosition += constrainOffset; + targetBounds.center += constrainOffset; + SpringPosition spring = target.GetComponent(); + if (spring != null) + spring.enabled = false; } else { - SpringPosition springPosition = SpringPosition.Begin(target.gameObject, target.localPosition + b, 13f); - springPosition.ignoreTimeScale = true; - springPosition.worldSpace = false; + SpringPosition spring = SpringPosition.Begin(target.gameObject, target.localPosition + constrainOffset, 13f); + spring.ignoreTimeScale = true; + spring.worldSpace = false; } return true; } diff --git a/Assembly-CSharp/Global/UI/UISprite/UISprite.cs b/Assembly-CSharp/Global/UI/UISprite/UISprite.cs index 6e511d867..8ad7e2b4a 100644 --- a/Assembly-CSharp/Global/UI/UISprite/UISprite.cs +++ b/Assembly-CSharp/Global/UI/UISprite/UISprite.cs @@ -288,38 +288,26 @@ protected void SetAtlasSprite(UISpriteData sp) public override void MakePixelPerfect() { if (!this.isValid) - { return; - } base.MakePixelPerfect(); - if (this.mType == UIBasicSprite.Type.Tiled) - { + if (this.preventPixelPerfect || this.mType == UIBasicSprite.Type.Tiled) return; - } UISpriteData atlasSprite = this.GetAtlasSprite(); if (atlasSprite == null) - { return; - } Texture mainTexture = this.mainTexture; - if (mainTexture == (UnityEngine.Object)null) - { + if (mainTexture == null) return; - } - if ((this.mType == UIBasicSprite.Type.Simple || this.mType == UIBasicSprite.Type.Filled || !atlasSprite.hasBorder) && mainTexture != (UnityEngine.Object)null) + if (this.mType == UIBasicSprite.Type.Simple || this.mType == UIBasicSprite.Type.Filled || !atlasSprite.hasBorder) { - Int32 num = Mathf.RoundToInt(this.pixelSize * (Single)(atlasSprite.width + atlasSprite.paddingLeft + atlasSprite.paddingRight)); - Int32 num2 = Mathf.RoundToInt(this.pixelSize * (Single)(atlasSprite.height + atlasSprite.paddingTop + atlasSprite.paddingBottom)); - if ((num & 1) == 1) - { - num++; - } - if ((num2 & 1) == 1) - { - num2++; - } - base.width = num; - base.height = num2; + Int32 w = Mathf.RoundToInt(this.pixelSize * (Single)(atlasSprite.width + atlasSprite.paddingLeft + atlasSprite.paddingRight)); + Int32 h = Mathf.RoundToInt(this.pixelSize * (Single)(atlasSprite.height + atlasSprite.paddingTop + atlasSprite.paddingBottom)); + if ((w & 1) == 1) + w++; + if ((h & 1) == 1) + h++; + base.width = w; + base.height = h; } } @@ -388,4 +376,7 @@ public override void OnFill(BetterList verts, BetterList uvs, [NonSerialized] private Boolean mSpriteSet; + + [NonSerialized] + public Boolean preventPixelPerfect = false; } diff --git a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Scene.cs b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Scene.cs index 3aad33280..d59e2e852 100644 --- a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Scene.cs +++ b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Scene.cs @@ -51,10 +51,7 @@ public override void Hide(SceneVoidDelegate afterFinished = null) PauseButtonGameObject.SetActive(false); HelpButtonGameObject.SetActive(false); if ((!_isFromPause || _usingMainMenu) && UIControlPanel != null && UIControlPanel.Show) - { - Configuration.Interface.SaveValues(); UIControlPanel.Show = false; - } if (!_isFromPause) RemoveCursorMemorize(); diff --git a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.AllMenuPanel.cs b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.AllMenuPanel.cs index 326bba4a5..f18201202 100644 --- a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.AllMenuPanel.cs +++ b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.AllMenuPanel.cs @@ -14,8 +14,8 @@ internal sealed class AllMenuPanel : GOBase public readonly ContainerStatus StatusContainer; public readonly PanelCommand CommandPanel; public readonly PanelTarget TargetPanel; - public readonly ScrollablePanel AbilityPanel; - public readonly ScrollablePanel ItemPanel; + public readonly GOScrollablePanel AbilityPanel; + public readonly GOScrollablePanel ItemPanel; public readonly PanelParty PartyPanel; public readonly HUDAutoAttack AutoAttackHUD; @@ -33,8 +33,8 @@ public AllMenuPanel(BattleHUD scene, GameObject obj) StatusContainer = new ContainerStatus(_scene, obj.GetChild(4)); CommandPanel = new PanelCommand(scene, obj.GetChild(5)); TargetPanel = new PanelTarget(scene, obj.GetChild(6)); - AbilityPanel = new ScrollablePanel(obj.GetChild(7)); - ItemPanel = new ScrollablePanel(obj.GetChild(8)); + AbilityPanel = new GOScrollablePanel(obj.GetChild(7)); + ItemPanel = new GOScrollablePanel(obj.GetChild(8)); PartyPanel = new PanelParty(scene, obj.GetChild(9)); AutoAttackHUD = new HUDAutoAttack(obj.GetChild(10)); } diff --git a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.ScrollablePanel.cs b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.ScrollablePanel.cs deleted file mode 100644 index 16858a215..000000000 --- a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.UI.ScrollablePanel.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Assets.Sources.Scripts.UI.Common; -using System; -using System.Collections.Generic; -using Memoria.Scenes; -using UnityEngine; - -public partial class BattleHUD : UIScene -{ - private partial class UI - { - internal sealed class ScrollablePanel : GOWidget - { - public readonly GOScrollButton ScrollButton; - public readonly GOSubPanel SubPanel; - public readonly CaptionBackground Background; - - public ScrollablePanel(GameObject obj) - : base(obj) - { - ScrollButton = new GOScrollButton(obj.GetChild(0)); - SubPanel = new GOSubPanel(obj.GetChild(1)); - Background = new CaptionBackground(obj.GetChild(2)); - } - - internal sealed class CaptionBackground : GOWidget - { - public readonly GOSprite Body; - public readonly GOSprite TopBorder; - public readonly GOSprite Border; - public readonly CaptionPanel Panel; - - public CaptionBackground(GameObject obj) - : base(obj) - { - TopBorder = new GOSprite(obj.GetChild(0)); - Border = new GOSprite(obj.GetChild(1)); - Body = new GOSprite(obj.GetChild(2)); - Panel = new CaptionPanel(obj.GetChild(3)); - } - } - - internal sealed class CaptionPanel : GOPanel - { - public readonly GOLocalizableLabel Name; - public readonly GOLocalizableLabel Info; - - public CaptionPanel(GameObject obj) - : base(obj) - { - Name = new GOLocalizableLabel(obj.GetChild(0)); - Info = new GOLocalizableLabel(obj.GetChild(1)); - } - } - } - } -} \ No newline at end of file diff --git a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Unity.cs b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Unity.cs index 7030a0ba4..de9fd211c 100644 --- a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Unity.cs +++ b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.Unity.cs @@ -78,8 +78,8 @@ private void Awake() _allTargetToggle.validator = OnAllTargetToggleValidate; _commandPanel = new UI.PanelCommand(this, CommandPanel); _targetPanel = new UI.PanelTarget(this, TargetPanel); - _abilityPanel = new UI.ScrollablePanel(AbilityPanel); - _itemPanel = new UI.ScrollablePanel(ItemPanel); + _abilityPanel = new GOScrollablePanel(AbilityPanel); + _itemPanel = new GOScrollablePanel(ItemPanel); _abilityScrollList = _abilityPanel.SubPanel.RecycleListPopulator; _itemScrollList = _itemPanel.SubPanel.RecycleListPopulator; diff --git a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.cs b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.cs index b9886327c..5ec7151d4 100644 --- a/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.cs +++ b/Assembly-CSharp/Global/battle/BattleHUD/BattleHUD.cs @@ -39,8 +39,8 @@ public partial class BattleHUD : UIScene private Byte _currentMessagePriority; private Single _battleMessageCounter; private UI.PanelCommand _commandPanel; - private UI.ScrollablePanel _abilityPanel; - private UI.ScrollablePanel _itemPanel; + private GOScrollablePanel _abilityPanel; + private GOScrollablePanel _itemPanel; private Int32 _enemyCount; private Int32 _playerCount; private Int32 _playerDetailCount; diff --git a/Assembly-CSharp/Memoria/Configuration/Access/Interface.cs b/Assembly-CSharp/Memoria/Configuration/Access/Interface.cs index b53979242..2b42675df 100644 --- a/Assembly-CSharp/Memoria/Configuration/Access/Interface.cs +++ b/Assembly-CSharp/Memoria/Configuration/Access/Interface.cs @@ -4,94 +4,124 @@ namespace Memoria { - public sealed partial class Configuration - { - public static class Interface - { - public static Boolean IsEnabled - { - get => Instance._interface.Enabled; - set => Instance._interface.Enabled.Value = value; - } - public static Boolean PSXBattleMenu - { - get => Instance._interface.PSXBattleMenu; - set => Instance._interface.PSXBattleMenu.Value = value; - } - public static Boolean ScanDisplay - { - get => Instance._interface.ScanDisplay; - set => Instance._interface.ScanDisplay.Value = value; - } - public static Int32 BattleRowCount - { - get => Math.Max(1, Instance._interface.BattleRowCount); - set => Instance._interface.BattleRowCount.Value = value; - } - public static Int32 BattleColumnCount - { - get => Math.Max(1, Instance._interface.BattleColumnCount); - set => Instance._interface.BattleColumnCount.Value = value; - } - public static Vector2 BattleMenuPos - { - get => new Vector2(Instance._interface.BattleMenuPosX, Instance._interface.BattleMenuPosY); - set + public sealed partial class Configuration + { + public static class Interface + { + public static Boolean IsEnabled + { + get => Instance._interface.Enabled; + set => Instance._interface.Enabled.Value = value; + } + public static Boolean PSXBattleMenu + { + get => Instance._interface.PSXBattleMenu; + set => Instance._interface.PSXBattleMenu.Value = value; + } + public static Boolean ScanDisplay + { + get => Instance._interface.ScanDisplay; + set => Instance._interface.ScanDisplay.Value = value; + } + public static Int32 BattleRowCount + { + get => Math.Max(1, Instance._interface.BattleRowCount); + set => Instance._interface.BattleRowCount.Value = value; + } + public static Int32 BattleColumnCount + { + get => Math.Max(1, Instance._interface.BattleColumnCount); + set => Instance._interface.BattleColumnCount.Value = value; + } + public static Vector2 BattleMenuPos + { + get => new Vector2(Instance._interface.BattleMenuPosX, Instance._interface.BattleMenuPosY); + set { - Instance._interface.BattleMenuPosX.Value = (Int32)value.x; - Instance._interface.BattleMenuPosY.Value = (Int32)value.y; - } - } - public static Vector2 BattleMenuSize - { - get => new Vector2(Instance._interface.BattleMenuWidth, Instance._interface.BattleMenuHeight); - set - { - Instance._interface.BattleMenuWidth.Value = (Int32)value.x; - Instance._interface.BattleMenuHeight.Value = (Int32)value.y; - } - } - public static Vector2 BattleDetailPos - { - get => new Vector2(Instance._interface.BattleDetailPosX, Instance._interface.BattleDetailPosY); - set - { - Instance._interface.BattleDetailPosX.Value = (Int32)value.x; - Instance._interface.BattleDetailPosY.Value = (Int32)value.y; - } - } - public static Vector2 BattleDetailSize - { - get => new Vector2(Instance._interface.BattleDetailWidth, Instance._interface.BattleDetailHeight); - set - { - Instance._interface.BattleDetailWidth.Value = (Int32)value.x; - Instance._interface.BattleDetailHeight.Value = (Int32)value.y; - } - } + Instance._interface.BattleMenuPosX.Value = (Int32)value.x; + Instance._interface.BattleMenuPosY.Value = (Int32)value.y; + } + } + public static Vector2 BattleMenuSize + { + get => new Vector2(Instance._interface.BattleMenuWidth, Instance._interface.BattleMenuHeight); + set + { + Instance._interface.BattleMenuWidth.Value = (Int32)value.x; + Instance._interface.BattleMenuHeight.Value = (Int32)value.y; + } + } + public static Vector2 BattleDetailPos + { + get => new Vector2(Instance._interface.BattleDetailPosX, Instance._interface.BattleDetailPosY); + set + { + Instance._interface.BattleDetailPosX.Value = (Int32)value.x; + Instance._interface.BattleDetailPosY.Value = (Int32)value.y; + } + } + public static Vector2 BattleDetailSize + { + get => new Vector2(Instance._interface.BattleDetailWidth, Instance._interface.BattleDetailHeight); + set + { + Instance._interface.BattleDetailWidth.Value = (Int32)value.x; + Instance._interface.BattleDetailHeight.Value = (Int32)value.y; + } + } + + public static String BattleDamageTextFormat => Instance._interface.BattleDamageTextFormat; + public static String BattleRestoreTextFormat => Instance._interface.BattleRestoreTextFormat; + public static String BattleMPDamageTextFormat => Instance._interface.BattleMPDamageTextFormat; + public static String BattleMPRestoreTextFormat => Instance._interface.BattleMPRestoreTextFormat; + public static String BattleCommandTitleFormat => Instance._interface.BattleCommandTitleFormat; + + public static Int32 MenuItemRowCount + { + get => Math.Max(1, Instance._interface.MenuItemRowCount); + set => Instance._interface.MenuItemRowCount.Value = value; + } + public static Int32 MenuAbilityRowCount + { + get => Math.Max(1, Instance._interface.MenuAbilityRowCount); + set => Instance._interface.MenuAbilityRowCount.Value = value; + } + public static Int32 MenuEquipRowCount + { + get => Math.Max(1, Instance._interface.MenuEquipRowCount); + set => Instance._interface.MenuEquipRowCount.Value = value; + } + public static Int32 MenuChocographRowCount + { + get => Math.Max(1, Instance._interface.MenuChocographRowCount); + set => Instance._interface.MenuChocographRowCount.Value = value; + } - public static String BattleDamageTextFormat => Instance._interface.BattleDamageTextFormat; - public static String BattleRestoreTextFormat => Instance._interface.BattleRestoreTextFormat; - public static String BattleMPDamageTextFormat => Instance._interface.BattleMPDamageTextFormat; - public static String BattleMPRestoreTextFormat => Instance._interface.BattleMPRestoreTextFormat; - public static String BattleCommandTitleFormat => Instance._interface.BattleCommandTitleFormat; + public static void SaveBattleValues() + { + //SaveValue(Instance._interface.Name, Instance._interface.Enabled); + SaveValue(Instance._interface.Name, Instance._interface.PSXBattleMenu); + SaveValue(Instance._interface.Name, Instance._interface.ScanDisplay); + SaveValue(Instance._interface.Name, Instance._interface.BattleRowCount); + SaveValue(Instance._interface.Name, Instance._interface.BattleColumnCount); + SaveValue(Instance._interface.Name, Instance._interface.BattleMenuPosX); + SaveValue(Instance._interface.Name, Instance._interface.BattleMenuPosY); + SaveValue(Instance._interface.Name, Instance._interface.BattleMenuWidth); + SaveValue(Instance._interface.Name, Instance._interface.BattleMenuHeight); + SaveValue(Instance._interface.Name, Instance._interface.BattleDetailPosX); + SaveValue(Instance._interface.Name, Instance._interface.BattleDetailPosY); + SaveValue(Instance._interface.Name, Instance._interface.BattleDetailWidth); + SaveValue(Instance._interface.Name, Instance._interface.BattleDetailHeight); + } - public static void SaveValues() - { - SaveValue(Instance._interface.Name, Instance._interface.Enabled); - SaveValue(Instance._interface.Name, Instance._interface.PSXBattleMenu); - SaveValue(Instance._interface.Name, Instance._interface.ScanDisplay); - SaveValue(Instance._interface.Name, Instance._interface.BattleRowCount); - SaveValue(Instance._interface.Name, Instance._interface.BattleColumnCount); - SaveValue(Instance._interface.Name, Instance._interface.BattleMenuPosX); - SaveValue(Instance._interface.Name, Instance._interface.BattleMenuPosY); - SaveValue(Instance._interface.Name, Instance._interface.BattleMenuWidth); - SaveValue(Instance._interface.Name, Instance._interface.BattleMenuHeight); - SaveValue(Instance._interface.Name, Instance._interface.BattleDetailPosX); - SaveValue(Instance._interface.Name, Instance._interface.BattleDetailPosY); - SaveValue(Instance._interface.Name, Instance._interface.BattleDetailWidth); - SaveValue(Instance._interface.Name, Instance._interface.BattleDetailHeight); - } - } - } + public static void SaveMenuValues() + { + //SaveValue(Instance._interface.Name, Instance._interface.Enabled); + SaveValue(Instance._interface.Name, Instance._interface.MenuItemRowCount); + SaveValue(Instance._interface.Name, Instance._interface.MenuAbilityRowCount); + SaveValue(Instance._interface.Name, Instance._interface.MenuEquipRowCount); + SaveValue(Instance._interface.Name, Instance._interface.MenuChocographRowCount); + } + } + } } \ No newline at end of file diff --git a/Assembly-CSharp/Memoria/Configuration/Configuration.Loading.cs b/Assembly-CSharp/Memoria/Configuration/Configuration.Loading.cs index 6300e269d..e80c07ac6 100644 --- a/Assembly-CSharp/Memoria/Configuration/Configuration.Loading.cs +++ b/Assembly-CSharp/Memoria/Configuration/Configuration.Loading.cs @@ -18,11 +18,11 @@ public sealed partial class Configuration : Ini static Configuration() { Instance = new Configuration(); - Watcher = CreareWatcher(); + Watcher = CreateWatcher(); LoadSafe(); } - private static FileSystemWatcher CreareWatcher() + private static FileSystemWatcher CreateWatcher() { FileSystemWatcher watcher = new FileSystemWatcher(); GameLoopManager.Quit += watcher.Dispose; @@ -36,31 +36,45 @@ private static FileSystemWatcher CreareWatcher() public static void SaveValue(String sectionName, IniValue value) { - sectionName = $"[{sectionName}]"; - - String[] lines = File.ReadAllLines(ConfigurationFileName); - Int32 startSection = Array.IndexOf(lines, sectionName); - if (startSection < 0) - { - AppendSection(sectionName, value, lines); + if (!Monitor.TryEnter(Watcher)) return; - } - - Int32 index; - for (index = startSection + 1; index < lines.Length; index++) + + try { - var line = lines[index]; - if (line == String.Empty || line[0] == '[') - break; + sectionName = $"[{sectionName}]"; - if (line.StartsWith(value.Name)) + String[] lines = File.ReadAllLines(ConfigurationFileName); + Int32 startSection = Array.IndexOf(lines, sectionName); + if (startSection < 0) { - ChangeValue(value, index, lines); + AppendSection(sectionName, value, lines); return; } + + Int32 index; + for (index = startSection + 1; index < lines.Length; index++) + { + var line = lines[index]; + if (line == String.Empty || line[0] == '[') + break; + + if (line.StartsWith(value.Name)) + { + ChangeValue(value, index, lines); + return; + } + } + + AppendValue(value, index, lines); + } + catch (Exception err) + { + Log.Error(err, $"Failed to update a configuration value {sectionName} {value.Name}."); + } + finally + { + Monitor.Exit(Watcher); } - - AppendValue(value, index, lines); } private static void AppendSection(String sectionName, IniValue value, String[] lines) diff --git a/Assembly-CSharp/Memoria/Configuration/Memoria.ini b/Assembly-CSharp/Memoria/Configuration/Memoria.ini index f71dbc5ea..d23b806da 100644 --- a/Assembly-CSharp/Memoria/Configuration/Memoria.ini +++ b/Assembly-CSharp/Memoria/Configuration/Memoria.ini @@ -31,6 +31,7 @@ PriorityToOGG = 0 ; SkipIntros (default 0) 0 = Don't skip / 1 = Skip logos / 2 = Skip logos and movie / 3 = Don't loop at the title ; GarnetHair (default 0) 0 = Default / 1 = Long / 2 = Short ; TileSize (default 32) Vanilla 32 / Moguri Mod 64 + ; AntiAliasing (default 0) Must be either 0, 2, 4 or 8: enable Unity's anti-aliasing algorithm to improve the render of 3D model edges Enabled = 0 BattleFPS = 30 BattleTPS = 15 @@ -45,6 +46,7 @@ WidescreenSupport = 1 SkipIntros = 0 GarnetHair = 0 TileSize = 32 +AntiAliasing = 0 [Control] ; DisableMouse (default 0) 0 = Can use the mouse to navigate in menus and move on the fields / 7 = Disable the mouse completly / 1 = Disable mouse for field menus and dialogs / 2 = Disable mouse for field movements / 4 = Disable mouse for battle menus @@ -212,7 +214,7 @@ DiscardKeepSameArrow = 0 DiscardExclusions = 56, 75, 76, 77, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 98, 99, 100 [Interface] - ; Setup UI coordinates by pressing Alt+F1 in-game + ; Setup UI parameters by pressing Alt+F1 in-game ; PSXBattleMenu (default 0) 0 = Command menu is disposed as a 2x3 table / 1 = Command menu is disposed in a column with Change/Defend accessible with left/right keys ; ScanDisplay (default 1) 0 = Informations given by Scan are displayed as successive messages / 1 = Scan opens an information panel ; BattleCommandTitleFormat (default empty) Custom format string for displaying the ability names on cast; use eg. CommandTitle + ' ([FFCC00]' + CasterName + '[FFFFFF])' to append the caster's name in yellow @@ -237,6 +239,10 @@ BattleDamageTextFormat = BattleRestoreTextFormat = BattleMPDamageTextFormat = BattleMPRestoreTextFormat = +MenuItemRowCount = 8 +MenuAbilityRowCount = 6 +MenuEquipRowCount = 5 +MenuChocographRowCount = 5 [Fixes] Enabled = 1 diff --git a/Assembly-CSharp/Memoria/Configuration/Structure/InterfaceSection.cs b/Assembly-CSharp/Memoria/Configuration/Structure/InterfaceSection.cs index cc3f460f5..d192d170d 100644 --- a/Assembly-CSharp/Memoria/Configuration/Structure/InterfaceSection.cs +++ b/Assembly-CSharp/Memoria/Configuration/Structure/InterfaceSection.cs @@ -4,48 +4,61 @@ namespace Memoria { - public sealed partial class Configuration - { - private sealed class InterfaceSection : IniSection - { - public readonly IniValue PSXBattleMenu; - public readonly IniValue ScanDisplay; - public readonly IniValue BattleRowCount; - public readonly IniValue BattleColumnCount; - public readonly IniValue BattleMenuPosX; - public readonly IniValue BattleMenuPosY; - public readonly IniValue BattleMenuWidth; - public readonly IniValue BattleMenuHeight; - public readonly IniValue BattleDetailPosX; - public readonly IniValue BattleDetailPosY; - public readonly IniValue BattleDetailWidth; - public readonly IniValue BattleDetailHeight; - public readonly IniValue BattleDamageTextFormat; - public readonly IniValue BattleRestoreTextFormat; - public readonly IniValue BattleMPDamageTextFormat; - public readonly IniValue BattleMPRestoreTextFormat; - public readonly IniValue BattleCommandTitleFormat; + public sealed partial class Configuration + { + private sealed class InterfaceSection : IniSection + { + public readonly IniValue PSXBattleMenu; + public readonly IniValue ScanDisplay; + public readonly IniValue BattleRowCount; + public readonly IniValue BattleColumnCount; + public readonly IniValue BattleMenuPosX; + public readonly IniValue BattleMenuPosY; + public readonly IniValue BattleMenuWidth; + public readonly IniValue BattleMenuHeight; + public readonly IniValue BattleDetailPosX; + public readonly IniValue BattleDetailPosY; + public readonly IniValue BattleDetailWidth; + public readonly IniValue BattleDetailHeight; + public readonly IniValue BattleDamageTextFormat; + public readonly IniValue BattleRestoreTextFormat; + public readonly IniValue BattleMPDamageTextFormat; + public readonly IniValue BattleMPRestoreTextFormat; + public readonly IniValue BattleCommandTitleFormat; - public InterfaceSection() : base(nameof(InterfaceSection), true) - { - PSXBattleMenu = BindBoolean(nameof(PSXBattleMenu), false); - ScanDisplay = BindBoolean(nameof(ScanDisplay), true); - BattleRowCount = BindInt32(nameof(BattleRowCount), 5); - BattleColumnCount = BindInt32(nameof(BattleColumnCount), 1); - BattleMenuPosX = BindInt32(nameof(BattleMenuPosX), -400); - BattleMenuPosY = BindInt32(nameof(BattleMenuPosY), -362); - BattleMenuWidth = BindInt32(nameof(BattleMenuWidth), 630); - BattleMenuHeight = BindInt32(nameof(BattleMenuHeight), 236); - BattleDetailPosX = BindInt32(nameof(BattleDetailPosX), 345); - BattleDetailPosY = BindInt32(nameof(BattleDetailPosY), -380); - BattleDetailWidth = BindInt32(nameof(BattleDetailWidth), 796); - BattleDetailHeight = BindInt32(nameof(BattleDetailHeight), 230); - BattleDamageTextFormat = BindString(nameof(BattleDamageTextFormat), String.Empty); - BattleRestoreTextFormat = BindString(nameof(BattleRestoreTextFormat), String.Empty); - BattleMPDamageTextFormat = BindString(nameof(BattleMPDamageTextFormat), String.Empty); - BattleMPRestoreTextFormat = BindString(nameof(BattleMPRestoreTextFormat), String.Empty); - BattleCommandTitleFormat = BindString(nameof(BattleCommandTitleFormat), String.Empty); - } - } - } + public readonly IniValue MenuItemRowCount; + public readonly IniValue MenuAbilityRowCount; + public readonly IniValue MenuEquipRowCount; + public readonly IniValue MenuChocographRowCount; + + public InterfaceSection() : base(nameof(InterfaceSection), true) + { + PSXBattleMenu = BindBoolean(nameof(PSXBattleMenu), false); + ScanDisplay = BindBoolean(nameof(ScanDisplay), true); + BattleRowCount = BindInt32(nameof(BattleRowCount), 5); + BattleColumnCount = BindInt32(nameof(BattleColumnCount), 1); + BattleMenuPosX = BindInt32(nameof(BattleMenuPosX), -400); + BattleMenuPosY = BindInt32(nameof(BattleMenuPosY), -362); + BattleMenuWidth = BindInt32(nameof(BattleMenuWidth), 630); + BattleMenuHeight = BindInt32(nameof(BattleMenuHeight), 236); + BattleDetailPosX = BindInt32(nameof(BattleDetailPosX), 345); + BattleDetailPosY = BindInt32(nameof(BattleDetailPosY), -380); + BattleDetailWidth = BindInt32(nameof(BattleDetailWidth), 796); + BattleDetailHeight = BindInt32(nameof(BattleDetailHeight), 230); + BattleDamageTextFormat = BindString(nameof(BattleDamageTextFormat), String.Empty); + BattleRestoreTextFormat = BindString(nameof(BattleRestoreTextFormat), String.Empty); + BattleMPDamageTextFormat = BindString(nameof(BattleMPDamageTextFormat), String.Empty); + BattleMPRestoreTextFormat = BindString(nameof(BattleMPRestoreTextFormat), String.Empty); + BattleCommandTitleFormat = BindString(nameof(BattleCommandTitleFormat), String.Empty); + + MenuItemRowCount = BindInt32(nameof(MenuItemRowCount), 8); // Default PC: 8, PSX: 11 + MenuAbilityRowCount = BindInt32(nameof(MenuAbilityRowCount), 6); // Default PC: 6, PSX: 8 + MenuEquipRowCount = BindInt32(nameof(MenuEquipRowCount), 5); // Default PC: 5, PSX: 6 + MenuChocographRowCount = BindInt32(nameof(MenuChocographRowCount), 5); // Default PC: 5, PSX: 7 + // Shop menu -- Default PC: 5/8, PSX: 7/11 (with/without portraits) + // Status menu -- Default PC: 8, PSX: 8 + // Config menu -- Default PC: 6/8, PSX: 9 + } + } + } } \ No newline at end of file diff --git a/Assembly-CSharp/Memoria/Scenes/BattleHUD/BattleUIControlPanel.cs b/Assembly-CSharp/Memoria/Scenes/BattleHUD/BattleUIControlPanel.cs index ef9b3adc6..b2544f108 100644 --- a/Assembly-CSharp/Memoria/Scenes/BattleHUD/BattleUIControlPanel.cs +++ b/Assembly-CSharp/Memoria/Scenes/BattleHUD/BattleUIControlPanel.cs @@ -54,6 +54,7 @@ public BattleUIControlPanel(BattleHUD hud) EndInitialization(UIWidget.Pivot.Bottom); SetEnabled(true); + onHide = Configuration.Interface.SaveBattleValues; } private void SetEnabled(Boolean enabled) diff --git a/Assembly-CSharp/Memoria/Scenes/ControlPanel/ControlPanel.cs b/Assembly-CSharp/Memoria/Scenes/ControlPanel/ControlPanel.cs index fe7575fa7..00ce9690c 100644 --- a/Assembly-CSharp/Memoria/Scenes/ControlPanel/ControlPanel.cs +++ b/Assembly-CSharp/Memoria/Scenes/ControlPanel/ControlPanel.cs @@ -12,6 +12,8 @@ public class ControlPanel public Int32 rowHeight = 50; public Int32 rowSeparatorHeight = 10; public Int32 elementSeparatorWidth = 10; + public Action onShow = null; + public Action onHide = null; public UIWidget BasePanel => basePanel; public List AllPanels => allPanels; @@ -19,7 +21,14 @@ public class ControlPanel public Boolean Show { get => allPanels[activePanelIndex].gameObject.activeSelf; - set => allPanels[activePanelIndex].gameObject.SetActive(value); + set + { + allPanels[activePanelIndex].gameObject.SetActive(value); + if (value && onShow != null) + onShow(); + else if (!value && onHide != null) + onHide(); + } } public ControlPanel(Transform parent, String name) @@ -288,7 +297,7 @@ public T InstantiateUIElement(out GameObject go, out Int32 defaultWidth, out } else if (typeof(T) == typeof(UISlider)) { - go = UnityEngine.Object.Instantiate(PersistenSingleton.Instance.ConfigScene.ConfigList.GetChild(1).GetChild(0).GetChild(8).GetChild(1).GetChild(1).gameObject); + go = UnityEngine.Object.Instantiate(PersistenSingleton.Instance.ConfigScene.SliderMenuTemplate.GetChild(1).GetChild(1).gameObject); UISlider slider = go.GetComponent(); slider.numberOfSteps = 0; defaultWidth = 350; @@ -408,7 +417,7 @@ private UIWidget GetParentPanel(UIWidget panel) private Dictionary panelParentLink = new Dictionary(); private Int32 activePanelIndex = 0; - private static void DebugLogComponents(GameObject startGo, Boolean recursive, Boolean recChild, Func logger) + public static void DebugLogComponents(GameObject startGo, Boolean recursive, Boolean recChild, Func logger) { foreach (Component comp in startGo.GetComponents()) { diff --git a/Assembly-CSharp/Memoria/Scenes/GOButtonPrefab.cs b/Assembly-CSharp/Memoria/Scenes/GOButtonPrefab.cs index 67ac6e4bc..eabd4e531 100644 --- a/Assembly-CSharp/Memoria/Scenes/GOButtonPrefab.cs +++ b/Assembly-CSharp/Memoria/Scenes/GOButtonPrefab.cs @@ -11,9 +11,9 @@ internal class GOButtonPrefab : GOWidget public readonly ButtonGroupState ButtonGroup; public readonly ScrollItemKeyNavigation ScrollKeyNavigation; public readonly UIDragScrollView DragScrollView; - public readonly RecycleListItem ListItem; // These can be null + public readonly RecycleListItem ListItem; public readonly UILabel NameLabel; public readonly UILabel NumberLabel; public readonly UISprite IconSprite; @@ -30,8 +30,9 @@ public GOButtonPrefab(GameObject obj) ButtonGroup = obj.GetExactComponent(); ScrollKeyNavigation = obj.GetExactComponent(); DragScrollView = obj.GetExactComponent(); - ListItem = obj.GetExactComponent(); BoxCollider = obj.GetExactComponent(); + if (obj.GetComponent() != null) + ListItem = obj.GetExactComponent(); GameObject content = obj; if (obj.GetChild(0).transform.childCount > 0) diff --git a/Assembly-CSharp/Memoria/Scenes/GOScrollablePanel.cs b/Assembly-CSharp/Memoria/Scenes/GOScrollablePanel.cs new file mode 100644 index 000000000..f161bfafb --- /dev/null +++ b/Assembly-CSharp/Memoria/Scenes/GOScrollablePanel.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine; + +namespace Memoria.Scenes +{ + internal sealed class GOScrollablePanel : GOWidget + { + public readonly GOScrollButton ScrollButton; + public readonly GOSubPanel SubPanel; + public readonly CaptionBackground Background; + + public GOScrollablePanel(GameObject obj) + : base(obj) + { + ScrollButton = new GOScrollButton(obj.GetChild(0)); + SubPanel = new GOSubPanel(obj.GetChild(1)); + Background = new CaptionBackground(obj.GetChild(2)); + } + + internal sealed class CaptionBackground : GOWidget + { + public readonly GOSprite Body; + public readonly GOSprite TopBorder; + public readonly GOSprite Border; + public readonly GOSprite Shadow = null; + public readonly CaptionPanel Panel; + + public CaptionBackground(GameObject obj) + : base(obj) + { + TopBorder = new GOSprite(obj.GetChild(0)); + Border = new GOSprite(obj.GetChild(1)); + Body = new GOSprite(obj.GetChild(2)); + if (obj.GetChild(3).GetComponent() != null) + { + Shadow = new GOSprite(obj.GetChild(2)); + Panel = new CaptionPanel(obj.GetChild(4)); + } + else + { + Shadow = null; + Panel = new CaptionPanel(obj.GetChild(3)); + } + } + } + + internal sealed class CaptionPanel : GOPanel + { + public readonly GOLocalizableLabel Name; + public readonly GOLocalizableLabel Info = null; + public readonly GOLocalizableLabel Name2 = null; + public readonly GOLocalizableLabel Info2 = null; + + public CaptionPanel(GameObject obj) + : base(obj) + { + Name = new GOLocalizableLabel(obj.GetChild(0)); + if (obj.transform.childCount == 1) + return; + Info = new GOLocalizableLabel(obj.GetChild(1)); + if (obj.transform.childCount != 4) + return; + Name2 = new GOLocalizableLabel(obj.GetChild(2)); + Info2 = new GOLocalizableLabel(obj.GetChild(3)); + } + } + } +} diff --git a/Assembly-CSharp/Memoria/Scenes/GOSubPanel.cs b/Assembly-CSharp/Memoria/Scenes/GOSubPanel.cs index 90ad4193e..d542c93e7 100644 --- a/Assembly-CSharp/Memoria/Scenes/GOSubPanel.cs +++ b/Assembly-CSharp/Memoria/Scenes/GOSubPanel.cs @@ -1,42 +1,89 @@ using System; +using System.Collections; +using System.Threading; using UnityEngine; namespace Memoria.Scenes { - internal sealed class GOSubPanel : GOBase - { - public readonly UIPanel Panel; - public readonly UIScrollView ScrollView; - public readonly Rigidbody Rigidbody; - public readonly SnapDragScrollView SnapDragScrollView; - public readonly RecycleListPopulator RecycleListPopulator; + internal sealed class GOSubPanel : GOBase + { + public readonly UIPanel Panel; + public readonly UIScrollView ScrollView; + public readonly Rigidbody Rigidbody; + public readonly SnapDragScrollView SnapDragScrollView; - public readonly GOButtonPrefab ButtonPrefab; - public readonly GOTable Table; + public readonly GOTable Table; - public GOSubPanel(GameObject obj) - : base(obj) - { - Panel = obj.GetExactComponent(); - ScrollView = obj.GetExactComponent(); - Rigidbody = obj.GetExactComponent(); - SnapDragScrollView = obj.GetExactComponent(); - RecycleListPopulator = obj.GetExactComponent(); + public Boolean HasListPopulator => RecycleListPopulator != null; + public readonly RecycleListPopulator RecycleListPopulator = null; + public readonly GOButtonPrefab ButtonPrefab = null; - ButtonPrefab = new GOButtonPrefab(RecycleListPopulator.itemPrefab.gameObject); - Table = new GOTable(obj.GetChild(0)); - } + public GOSubPanel(GameObject obj) + : base(obj) + { + Panel = obj.GetExactComponent(); + ScrollView = obj.GetExactComponent(); + Rigidbody = obj.GetExactComponent(); + SnapDragScrollView = obj.GetExactComponent(); + Table = new GOTable(obj.GetChild(0)); - public void ChangeDims(Int32 colCount, Int32 rowCount, Single colWidth, Single rowHeight) - { - SnapDragScrollView.ItemHeight = (Int32)rowHeight; - RecycleListPopulator.cellHeight = rowHeight; - Table.Table.columns = colCount; - ButtonPrefab.Widget.SetRawRect(0f, 0f, colWidth, rowHeight); - ButtonPrefab.ScrollKeyNavigation.ItemHeight = rowHeight; - Panel.baseClipRegion = new Vector4(Panel.baseClipRegion.x, Panel.baseClipRegion.y, colCount * colWidth, rowCount * rowHeight); - if (GameObject.activeInHierarchy) - RecycleListPopulator.RefreshTableView(); - } - } + if (obj.GetComponent() != null) + { + RecycleListPopulator = obj.GetExactComponent(); + ButtonPrefab = new GOButtonPrefab(RecycleListPopulator.itemPrefab.gameObject); + } + else + { + RecycleListPopulator = null; + ButtonPrefab = null; + } + } + + public void ChangeDims(Int32 colCount, Int32 rowCount, Single colWidth, Single rowHeight) + { + colCount = Math.Max(colCount, 1); + rowCount = Math.Max(rowCount, 1); + SnapDragScrollView.ItemHeight = (Int32)rowHeight; + SnapDragScrollView.VisibleItem = colCount * rowCount; + Table.Table.columns = colCount; + Panel.SetAnchor(target: null); + Panel.baseClipRegion = new Vector4(Panel.baseClipRegion.x, Panel.baseClipRegion.y, colCount * colWidth, rowCount * rowHeight); + if (HasListPopulator) + { + RecycleListPopulator.cellHeight = rowHeight; + ButtonPrefab.Widget.SetRawRect(0f, 0f, colWidth, rowHeight); + ButtonPrefab.ScrollKeyNavigation.ItemHeight = rowHeight; + if (GameObject.activeInHierarchy) + RecycleListPopulator.RefreshTableView(); + } + else + { + for (Int32 i = 0; i < Table.Count; i++) + { + GOButtonPrefab button = Table.Entries[i]; + button.Widget.SetDimensions((Int32)colWidth, (Int32)rowHeight); + } + if (GameObject.activeInHierarchy) + Table.Table.StartCoroutine(RepositionStaticList(colCount, rowCount, colWidth, rowHeight)); + } + } + + private IEnumerator RepositionStaticList(Int32 colCount, Int32 rowCount, Single colWidth, Single rowHeight) + { + yield return new WaitForEndOfFrame(); + // The "pivotOffset" pick is hacky there; it applies to the list of Chocographs, which is currently the only GOSubPanel without list populator + Vector2 pivotOffset = new Vector2(0f, 0.5f); + for (Int32 i = 0; i < Table.Count; i++) + { + GOButtonPrefab button = Table.Entries[i]; + Int32 lineNo = i / colCount; + Int32 columnNo = i % colCount; + Single posX = Table.Table.padding.x + pivotOffset.x * button.Widget.width + columnNo * (2 * Table.Table.padding.x + button.Widget.width); + Single posY = Table.Table.padding.y + pivotOffset.y * rowHeight + lineNo * (2 * Table.Table.padding.y + rowHeight); + button.Widget.SetAnchor(target: null); + button.Widget.SetRawRect(posX, -posY, (Int32)colWidth, (Int32)rowHeight); + button.ScrollKeyNavigation.ItemHeight = rowHeight; + } + } + } } \ No newline at end of file diff --git a/Assembly-CSharp/Memoria/Scenes/MenuHUD/MenuUIControlPanel.cs b/Assembly-CSharp/Memoria/Scenes/MenuHUD/MenuUIControlPanel.cs new file mode 100644 index 000000000..56531ceec --- /dev/null +++ b/Assembly-CSharp/Memoria/Scenes/MenuHUD/MenuUIControlPanel.cs @@ -0,0 +1,97 @@ +using Assets.Sources.Scripts.UI.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using FF9; +using Memoria; +using Memoria.Data; +using Memoria.Prime; +using Memoria.Assets; + +namespace Memoria.Scenes +{ + public class MenuUIControlPanel : ControlPanel + { + public const Int32 ITEM_ROW_MIN = 6; + public const Int32 ITEM_ROW_MAX = 12; + public const Int32 ABILITY_ROW_MIN = 4; + public const Int32 ABILITY_ROW_MAX = 10; + public const Int32 EQUIP_ROW_MIN = 4; + public const Int32 EQUIP_ROW_MAX = 8; + public const Int32 CHOCOGRAPH_ROW_MIN = 4; + public const Int32 CHOCOGRAPH_ROW_MAX = 8; + + public UIScene Scene; + + public MenuUIControlPanel() + : base(PersistenSingleton.Instance.MainMenuScene.transform, Localization.Get("ConfigCaption")) + { + Scene = null; + + AddSimpleLabel(Localization.Get("Item"), NGUIText.Alignment.Left, 1); + controlItemRowCount = AddRollOption(ControlRoll.GetNonEmptyIndexList(ITEM_ROW_MAX - ITEM_ROW_MIN + 1), sel => $"{sel + ITEM_ROW_MIN} rows", SetItemRowCount); + controlItemRowCount.Selection = Configuration.Interface.MenuItemRowCount - ITEM_ROW_MIN; + PanelAddRow(); + AddSimpleLabel(Localization.Get("Ability"), NGUIText.Alignment.Left, 1); + controlAbilityRowCount = AddRollOption(ControlRoll.GetNonEmptyIndexList(ABILITY_ROW_MAX - ABILITY_ROW_MIN + 1), sel => $"{sel + ABILITY_ROW_MIN} rows", SetAbilityRowCount); + controlAbilityRowCount.Selection = Configuration.Interface.MenuAbilityRowCount - ABILITY_ROW_MIN; + PanelAddRow(); + AddSimpleLabel(Localization.Get("Equip"), NGUIText.Alignment.Left, 1); + controlShopItemRowCount = AddRollOption(ControlRoll.GetNonEmptyIndexList(EQUIP_ROW_MAX - EQUIP_ROW_MIN + 1), sel => $"{sel + EQUIP_ROW_MIN} rows", SetEquipRowCount); + controlShopItemRowCount.Selection = Configuration.Interface.MenuEquipRowCount - EQUIP_ROW_MIN; + PanelAddRow(); + AddSimpleLabel(Localization.Get("Chocograph"), NGUIText.Alignment.Left, 1); + controlShopItemRowCount = AddRollOption(ControlRoll.GetNonEmptyIndexList(CHOCOGRAPH_ROW_MAX - CHOCOGRAPH_ROW_MIN + 1), sel => $"{sel + CHOCOGRAPH_ROW_MIN} rows", SetChocographRowCount); + controlShopItemRowCount.Selection = Configuration.Interface.MenuChocographRowCount - CHOCOGRAPH_ROW_MIN; + + EndInitialization(UIWidget.Pivot.Right); + onHide = () => + { + Configuration.Interface.SaveMenuValues(); + (Scene as AbilityUI)?.UpdateUserInterface(); + (Scene as ChocographUI)?.UpdateUserInterface(); + (Scene as EquipUI)?.UpdateUserInterface(); + (Scene as ItemUI)?.UpdateUserInterface(); + (Scene as ShopUI)?.UpdateUserInterface(); + Scene?.gameObject.SetActive(true); + }; + onShow = () => Scene?.gameObject.SetActive(false); + } + + public void ExitMenu() + { + if (Show) + { + Scene = null; + Show = false; + } + } + + private void SetItemRowCount(Int32 count) + { + Configuration.Interface.MenuItemRowCount = count + ITEM_ROW_MIN; + } + + private void SetAbilityRowCount(Int32 count) + { + Configuration.Interface.MenuAbilityRowCount = count + ABILITY_ROW_MIN; + } + + private void SetEquipRowCount(Int32 count) + { + Configuration.Interface.MenuEquipRowCount = count + EQUIP_ROW_MIN; + } + + private void SetChocographRowCount(Int32 count) + { + Configuration.Interface.MenuChocographRowCount = count + CHOCOGRAPH_ROW_MIN; + } + + private ControlRoll controlItemRowCount; + private ControlRoll controlKeyItemRowCount; + private ControlRoll controlShopItemRowCount; + private ControlRoll controlAbilityRowCount; + private ControlRoll controlSupportRowCount; + } +} diff --git a/Memoria.Launcher/App.cs b/Memoria.Launcher/App.cs index 85ec12e95..3e08b550c 100644 --- a/Memoria.Launcher/App.cs +++ b/Memoria.Launcher/App.cs @@ -5,7 +5,6 @@ using System.Windows; using System.Windows.Interop; using System.Windows.Media; -using Memoria.Launcher; namespace Memoria.Launcher { diff --git a/Memoria.Launcher/Ini/Memoria.ini b/Memoria.Launcher/Ini/Memoria.ini index f71dbc5ea..d23b806da 100644 --- a/Memoria.Launcher/Ini/Memoria.ini +++ b/Memoria.Launcher/Ini/Memoria.ini @@ -31,6 +31,7 @@ PriorityToOGG = 0 ; SkipIntros (default 0) 0 = Don't skip / 1 = Skip logos / 2 = Skip logos and movie / 3 = Don't loop at the title ; GarnetHair (default 0) 0 = Default / 1 = Long / 2 = Short ; TileSize (default 32) Vanilla 32 / Moguri Mod 64 + ; AntiAliasing (default 0) Must be either 0, 2, 4 or 8: enable Unity's anti-aliasing algorithm to improve the render of 3D model edges Enabled = 0 BattleFPS = 30 BattleTPS = 15 @@ -45,6 +46,7 @@ WidescreenSupport = 1 SkipIntros = 0 GarnetHair = 0 TileSize = 32 +AntiAliasing = 0 [Control] ; DisableMouse (default 0) 0 = Can use the mouse to navigate in menus and move on the fields / 7 = Disable the mouse completly / 1 = Disable mouse for field menus and dialogs / 2 = Disable mouse for field movements / 4 = Disable mouse for battle menus @@ -212,7 +214,7 @@ DiscardKeepSameArrow = 0 DiscardExclusions = 56, 75, 76, 77, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 98, 99, 100 [Interface] - ; Setup UI coordinates by pressing Alt+F1 in-game + ; Setup UI parameters by pressing Alt+F1 in-game ; PSXBattleMenu (default 0) 0 = Command menu is disposed as a 2x3 table / 1 = Command menu is disposed in a column with Change/Defend accessible with left/right keys ; ScanDisplay (default 1) 0 = Informations given by Scan are displayed as successive messages / 1 = Scan opens an information panel ; BattleCommandTitleFormat (default empty) Custom format string for displaying the ability names on cast; use eg. CommandTitle + ' ([FFCC00]' + CasterName + '[FFFFFF])' to append the caster's name in yellow @@ -237,6 +239,10 @@ BattleDamageTextFormat = BattleRestoreTextFormat = BattleMPDamageTextFormat = BattleMPRestoreTextFormat = +MenuItemRowCount = 8 +MenuAbilityRowCount = 6 +MenuEquipRowCount = 5 +MenuChocographRowCount = 5 [Fixes] Enabled = 1 diff --git a/Memoria.Launcher/Memoria.Launcher.csproj b/Memoria.Launcher/Memoria.Launcher.csproj index e4278168a..373bc8026 100644 --- a/Memoria.Launcher/Memoria.Launcher.csproj +++ b/Memoria.Launcher/Memoria.Launcher.csproj @@ -128,7 +128,10 @@ - + + PreserveNewest + Memoria.ini +