diff --git a/MiraAPI/Patches/RoleGuidePatches.cs b/MiraAPI/Patches/RoleGuidePatches.cs index 978cb57..1a18950 100644 --- a/MiraAPI/Patches/RoleGuidePatches.cs +++ b/MiraAPI/Patches/RoleGuidePatches.cs @@ -8,6 +8,7 @@ using Innersloth.Assets; using MiraAPI.Modifiers; using MiraAPI.Modifiers.Types; using MiraAPI.Roles; +using MiraAPI.Translation; using MiraAPI.Utilities; using MiraAPI.Utilities.Assets; using Reactor.Utilities.Extensions; @@ -134,44 +135,43 @@ public static class RoleGuidePatches HudManager.Instance.SettingsButton, __instance.TabButtons[2].transform.parent); SearchSortingOrderButton = sortingOrderButton.GetComponent(); - SearchSortingOrderButton.name = "SearchSortingOrderButton"; - _searchSortingOrderIdle = SearchSortingOrderButton.inactiveSprites.GetComponent(); - _searchSortingOrderIdle.sprite = MiraAssets.SortingAzIdleSprite; - _searchSortingOrderHover = SearchSortingOrderButton.activeSprites.GetComponent(); - _searchSortingOrderHover.sprite = MiraAssets.SortingAzHoverSprite; - SearchSortingOrderButton.OnClick = new Button.ButtonClickedEvent(); - SearchSortingOrderButton.OnClick.AddListener(new Action(SwitchMethod)); - sortingOrderButton.transform.localPosition = new Vector3(2.4f, 0.765f, -0.1f); - sortingOrderButton.transform.localScale = Vector3.one; - sortingOrderButton.transform.GetChild(2).gameObject.SetActive(false); + FixSearchButton( + SearchSortingOrderButton, + "SearchSortingOrderButton", + SwitchMethod, + MiraAssets.SortingAzIdleSprite, + MiraAssets.SortingAzHoverSprite, + new Vector3(2.4f, 0.765f, -0.1f), + out _searchSortingOrderIdle, + out _searchSortingOrderHover); var sortingGroupButton = Object.Instantiate( sortingOrderButton, sortingOrderButton.transform.parent); SearchSortingGroupButton = sortingGroupButton.GetComponent(); - SearchSortingGroupButton.name = "SearchSortingGroupButton"; - _searchSortingGroupIdle = SearchSortingGroupButton.inactiveSprites.GetComponent(); - _searchSortingGroupIdle.sprite = MiraAssets.GroupNoneIdleSprite; - _searchSortingGroupHover = SearchSortingGroupButton.activeSprites.GetComponent(); - _searchSortingGroupHover.sprite = MiraAssets.GroupNoneHoverSprite; - SearchSortingGroupButton.OnClick = new Button.ButtonClickedEvent(); - SearchSortingGroupButton.OnClick.AddListener(new Action(SwitchGrouping)); - sortingGroupButton.transform.localPosition = new Vector3(1.8f, 0.765f, -0.1f); - sortingGroupButton.transform.localScale = Vector3.one; + FixSearchButton( + SearchSortingGroupButton, + "SearchSortingGroupButton", + SwitchGrouping, + MiraAssets.GroupNoneIdleSprite, + MiraAssets.GroupNoneHoverSprite, + new Vector3(1.8f, 0.765f, -0.1f), + out _searchSortingGroupIdle, + out _searchSortingGroupHover); var sortingFilterButton = Object.Instantiate( sortingOrderButton, sortingOrderButton.transform.parent); SearchSortingFilterButton = sortingFilterButton.GetComponent(); - SearchSortingFilterButton.name = "SearchSortingFilterButton"; - _searchSortingFilterIdle = SearchSortingFilterButton.inactiveSprites.GetComponent(); - _searchSortingFilterIdle.sprite = MiraAssets.VisibleOnIdleSprite; - _searchSortingFilterHover = SearchSortingFilterButton.activeSprites.GetComponent(); - _searchSortingFilterHover.sprite = MiraAssets.VisibleOnHoverSprite; - SearchSortingFilterButton.OnClick = new Button.ButtonClickedEvent(); - SearchSortingFilterButton.OnClick.AddListener(new Action(SwitchFilter)); - sortingFilterButton.transform.localPosition = new Vector3(1f, 0.765f, -0.1f); - sortingFilterButton.transform.localScale = Vector3.one; + FixSearchButton( + SearchSortingFilterButton, + "SearchSortingFilterButton", + SwitchFilter, + MiraAssets.VisibleOnIdleSprite, + MiraAssets.VisibleOnHoverSprite, + new Vector3(1f, 0.765f, -0.1f), + out _searchSortingFilterIdle, + out _searchSortingFilterHover); __instance.numOfTabs = 4; __instance.TabButtons[2].SelectButton(true); @@ -228,15 +228,15 @@ public static class RoleGuidePatches sortingOrderButton, sortingOrderButton.transform.parent); SearchIconButton = searchIconButton.GetComponent(); - SearchIconButton.name = "SearchIconButton"; - _searchIconIdle = SearchIconButton.inactiveSprites.GetComponent(); - _searchIconIdle.sprite = MiraAssets.SearchIconIdleSprite; - _searchIconHover = SearchIconButton.activeSprites.GetComponent(); - _searchIconHover.sprite = MiraAssets.SearchIconHoverSprite; - SearchIconButton.OnClick = new Button.ButtonClickedEvent(); - SearchIconButton.OnClick.AddListener(new Action(ClearSearchText)); - searchIconButton.transform.localPosition = new Vector3(-2.79f, 0.765f, -0.1f); - searchIconButton.transform.localScale = Vector3.one; + FixSearchButton( + SearchIconButton, + "SearchIconButton", + ClearSearchText, + MiraAssets.SearchIconIdleSprite, + MiraAssets.SearchIconHoverSprite, + new Vector3(-2.79f, 0.765f, -0.1f), + out _searchIconIdle, + out _searchIconHover); var searchBox = Object.Instantiate( __instance.TabButtons[2].gameObject, @@ -301,83 +301,40 @@ public static class RoleGuidePatches searchBoxTmp.transform.localPosition = new Vector3(-1.438f, 0.756f, -0.2f); var playerButton = __instance.TabButtons[0]; - var playerCollider = playerButton.GetComponent(); - playerButton.transform.GetChild(0).gameObject.SetActive(false); - var playerBtnInactive = playerButton.inactiveSprites.GetComponent(); - playerBtnInactive.sprite = MiraAssets.WikiPlayersButtonIdleSprite; - playerBtnInactive.size = Vector2.one; - playerBtnInactive.transform.GetChild(0).gameObject.SetActive(false); - var playerBtnSelected = playerButton.selectedSprites.GetComponent(); - playerBtnSelected.sprite = MiraAssets.WikiPlayersButtonOpenSprite; - playerBtnSelected.size = Vector2.one; - playerBtnSelected.transform.GetChild(0).gameObject.SetActive(false); - var playerBtnHighlight = playerButton.activeSprites.GetComponent(); - playerBtnHighlight.sprite = MiraAssets.WikiPlayersButtonHoverSprite; - playerBtnHighlight.size = Vector2.one; - playerBtnHighlight.transform.GetChild(0).gameObject.SetActive(false); + FixTabButton( + playerButton, + MiraAssets.WikiPlayersButtonIdleSprite, + MiraAssets.WikiPlayersButtonOpenSprite, + MiraAssets.WikiPlayersButtonHoverSprite); var settingButton = __instance.TabButtons[1]; - var settingsCollider = settingButton.GetComponent(); - settingButton.transform.GetChild(0).gameObject.SetActive(false); - var settingBtnInactive = settingButton.inactiveSprites.GetComponent(); - settingBtnInactive.sprite = MiraAssets.WikiSettingsButtonIdleSprite; - settingBtnInactive.size = Vector2.one; - settingBtnInactive.transform.GetChild(0).gameObject.SetActive(false); - var settingBtnSelected = settingButton.selectedSprites.GetComponent(); - settingBtnSelected.sprite = MiraAssets.WikiSettingsButtonOpenSprite; - settingBtnSelected.size = Vector2.one; - settingBtnSelected.transform.GetChild(0).gameObject.SetActive(false); - var settingBtnHighlight = settingButton.activeSprites.GetComponent(); - settingBtnHighlight.sprite = MiraAssets.WikiSettingsButtonHoverSprite; - settingBtnHighlight.size = Vector2.one; - settingBtnHighlight.transform.GetChild(0).gameObject.SetActive(false); + FixTabButton( + settingButton, + MiraAssets.WikiSettingsButtonIdleSprite, + MiraAssets.WikiSettingsButtonOpenSprite, + MiraAssets.WikiSettingsButtonHoverSprite); var rolesButton = __instance.TabButtons[2]; + FixTabButton( + rolesButton, + MiraAssets.WikiRolesButtonIdleSprite, + MiraAssets.WikiRolesButtonOpenSprite, + MiraAssets.WikiRolesButtonHoverSprite); rolesButton.OnClick = new Button.ButtonClickedEvent(); rolesButton.OnClick.AddListener((Action)(() => OpenRolesTab())); - var rolesCollider = rolesButton.GetComponent(); - rolesButton.transform.GetChild(0).gameObject.SetActive(false); - var rolesBtnInactive = rolesButton.inactiveSprites.GetComponent(); - rolesBtnInactive.sprite = MiraAssets.WikiRolesButtonIdleSprite; - rolesBtnInactive.size = Vector2.one; - rolesBtnInactive.transform.GetChild(0).gameObject.SetActive(false); - var rolesBtnSelected = rolesButton.selectedSprites.GetComponent(); - rolesBtnSelected.sprite = MiraAssets.WikiRolesButtonOpenSprite; - rolesBtnSelected.size = Vector2.one; - rolesBtnSelected.transform.GetChild(0).gameObject.SetActive(false); - var rolesBtnHighlight = rolesButton.activeSprites.GetComponent(); - rolesBtnHighlight.sprite = MiraAssets.WikiRolesButtonHoverSprite; - rolesBtnHighlight.size = Vector2.one; - rolesBtnHighlight.transform.GetChild(0).gameObject.SetActive(false); var modifiersButton = Object.Instantiate( __instance.TabButtons[2], __instance.TabButtons[2].transform.parent); + FixTabButton( + modifiersButton, + MiraAssets.WikiRolesButtonIdleSprite, + MiraAssets.WikiRolesButtonOpenSprite, + MiraAssets.WikiRolesButtonHoverSprite); modifiersButton.OnClick = new Button.ButtonClickedEvent(); modifiersButton.OnClick.AddListener((Action)(() => OpenModifiersTab())); - var modifiersCollider = modifiersButton.GetComponent(); - modifiersButton.transform.GetChild(0).gameObject.SetActive(false); - var modifiersBtnInactive = modifiersButton.inactiveSprites.GetComponent(); - modifiersBtnInactive.sprite = MiraAssets.WikiRolesButtonIdleSprite; - modifiersBtnInactive.size = Vector2.one; - modifiersBtnInactive.transform.GetChild(0).gameObject.SetActive(false); - var modifiersBtnSelected = modifiersButton.selectedSprites.GetComponent(); - modifiersBtnSelected.sprite = MiraAssets.WikiRolesButtonOpenSprite; - modifiersBtnSelected.size = Vector2.one; - modifiersBtnSelected.transform.GetChild(0).gameObject.SetActive(false); - var modifiersBtnHighlight = modifiersButton.activeSprites.GetComponent(); - modifiersBtnHighlight.sprite = MiraAssets.WikiRolesButtonHoverSprite; - modifiersBtnHighlight.size = Vector2.one; - modifiersBtnHighlight.transform.GetChild(0).gameObject.SetActive(false); __instance.TabButtons.Add(modifiersButton); - playerCollider.size = settingsCollider.size = - rolesCollider.size = modifiersCollider.size = new Vector2(0.8f, 0.74f); - playerCollider.offset = settingsCollider.offset = - rolesCollider.offset = modifiersCollider.offset = Vector2.zero; - playerButton.transform.localScale = settingButton.transform.localScale = - rolesButton.transform.localScale = - modifiersButton.transform.localScale = new Vector3(0.7f, 0.7f, 1); playerButton.transform.localPosition = new Vector3(-3.6f, 0.656f, -0.2f); settingButton.transform.localPosition = new Vector3(-3.6f, 0.056f, -0.2f); rolesButton.transform.localPosition = new Vector3(-3.6f, -0.544f, -0.2f); @@ -409,6 +366,40 @@ public static class RoleGuidePatches return false; } + public static void FixTabButton(MatchInfoGuideTabButton button, Sprite inactive, Sprite selected, Sprite hover) + { + var buttonCollider = button.GetComponent(); + button.transform.GetChild(0).gameObject.SetActive(false); + var settingBtnInactive = button.inactiveSprites.GetComponent(); + settingBtnInactive.sprite = inactive; + settingBtnInactive.transform.GetChild(0).gameObject.SetActive(false); + var settingBtnSelected = button.selectedSprites.GetComponent(); + settingBtnSelected.sprite = selected; + settingBtnSelected.transform.GetChild(0).gameObject.SetActive(false); + var settingBtnHighlight = button.activeSprites.GetComponent(); + settingBtnHighlight.sprite = hover; + settingBtnInactive.size = settingBtnSelected.size = settingBtnHighlight.size = Vector2.one; + settingBtnHighlight.transform.GetChild(0).gameObject.SetActive(false); + buttonCollider.size = new Vector2(0.8f, 0.74f); + buttonCollider.offset = Vector2.zero; + button.transform.localScale = new Vector3(0.7f, 0.7f, 1); + } + + public static void FixSearchButton(PassiveButton button, string objName, Action onClick, Sprite inactive, Sprite hover, Vector3 pos, out SpriteRenderer inactiveSprite, out SpriteRenderer hoverSprite) + { + button.name = objName; + inactiveSprite = button.inactiveSprites.GetComponent(); + inactiveSprite.sprite = inactive; + hoverSprite = button.activeSprites.GetComponent(); + hoverSprite.sprite = hover; + button.OnClick = new Button.ButtonClickedEvent(); + button.OnClick.AddListener(onClick); + + button.transform.localPosition = pos; + button.transform.localScale = Vector3.one; + button.transform.GetChild(2).gameObject.SetActive(false); + } + public static void OpenModifiersTab() { _advancedInfoTabScroller?.gameObject.SetActive(false); @@ -716,7 +707,7 @@ public static class RoleGuidePatches modifier.ParentMod.MiraPlugin.GetAbbreviatedModName())); } - foreach (var roleBehaviour in RoleManager.Instance.AllRoles.ToArray().OrderBy(x => x.GetRoleName())) + foreach (var roleBehaviour in CustomRoleManager.AllStoredRoleBehaviours) { if (roleBehaviour.Role is not RoleTypes.Crewmate and not RoleTypes.Impostor and not RoleTypes.CrewmateGhost and @@ -725,11 +716,25 @@ public static class RoleGuidePatches var panel = Object.Instantiate( instance.MatchInfoRolePanelPrefab, inner); - var amount = - GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleBehaviour.Role); - var chance = - GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleBehaviour.Role); - panel.SetPanel( + string abbreviation; + int amount; + int chance; + if (roleBehaviour is ICustomRole custom) + { + amount = custom.GetCount().GetValueOrDefault(0); + chance = custom.GetChance().GetValueOrDefault(0); + abbreviation = custom.ParentMod.MiraPlugin.GetAbbreviatedModName(); + } + else + { + abbreviation = "AU"; + amount = + GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleBehaviour.Role); + chance = + GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleBehaviour.Role); + } + + panel.SetRolePanel( roleBehaviour, amount, chance); @@ -752,9 +757,7 @@ public static class RoleGuidePatches panel, roleBehaviour.GetRoleName(), roleBehaviour.GetCategoryTitle(), - roleBehaviour is ICustomRole custom - ? custom.ParentMod.MiraPlugin.GetAbbreviatedModName() - : "AU")); + abbreviation)); } } } @@ -840,16 +843,27 @@ public static class RoleGuidePatches foreach (var (roleData, holder) in RolePanels) { var panel = holder.Panel; - var amount = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleData.Role); - var chance = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleData.Role); - var showVal = roleData is ICustomRole custom ? custom.ForceShowRoleOnWiki : null; - var forciblyShow = showVal switch + int amount; + int chance; + int forciblyShow = 0; + if (roleData is ICustomRole custom) { - true => 2, - false => 1, - _ => 0, - }; - panel.SetPanel( + amount = custom.GetCount().GetValueOrDefault(0); + chance = custom.GetChance().GetValueOrDefault(0); + if (custom.ForceShowRoleOnWiki.HasValue) + { + forciblyShow = custom.ForceShowRoleOnWiki.Value ? 2 : 1; + } + } + else + { + amount = + GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleData.Role); + chance = + GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleData.Role); + } + + panel.SetRolePanel( roleData, amount, chance); @@ -1026,11 +1040,28 @@ public static class RoleGuidePatches [HarmonyPostfix] [HarmonyPriority(Priority.First)] [HarmonyPatch(typeof(MatchInfoGuide), nameof(MatchInfoGuide.SetActiveTab))] - private static void SetActiveTab() + private static void SetActiveTab(int tabIndex) { if (titleText) { - titleText.text = TranslationController.Instance.GetString(StringNames.MatchInfoGuideTitle); + switch (tabIndex) + { + case 0: + titleText.text = MiraLocaleManager.Get("MiraApi.Wiki.PlayersTab"); + break; + case 1: + titleText.text = MiraLocaleManager.Get("MiraApi.Wiki.SettingsTab"); + break; + case 2: + titleText.text = MiraLocaleManager.Get("Roles"); + break; + case 3: + titleText.text = MiraLocaleManager.Get("Modifiers"); + break; + default: + titleText.text = TranslationController.Instance.GetString(StringNames.MatchInfoGuideTitle); + break; + } } _advancedInfoTabScroller?.gameObject.SetActive(false); @@ -1143,6 +1174,41 @@ public static class RoleGuidePatches return false; } + public static void SetRolePanel( + this MatchInfoRolePanel instance, + RoleBehaviour role, + int numPerGame, + int chancePerGame) + { + instance.roleCount.text = string.Format( + CultureInfo.InvariantCulture, + "{0} at {1}%", + numPerGame.ToString(CultureInfo.InvariantCulture), + chancePerGame); + if (role is ICustomRole customRole) + { + instance.roleName.text = customRole.RoleName; + instance.roleDescription.text = + $"{role.GetCategoryTitle()}\n" + customRole.RoleMedDescription; + instance.roleIcon.sprite = customRole.Configuration.Icon?.LoadAsset(); + instance.roleCount.text += $" ({customRole.ParentMod.MiraPlugin.GetAbbreviatedModName()})"; + } + else + { + instance.roleName.text = role.NiceName; + instance.roleDescription.text = $"{role.GetCategoryTitle()}\n" + role.BlurbMed; + instance.roleIcon.sprite = role.RoleIconColor; + instance.roleCount.text += " (AU)"; + } + + instance.roleIcon.SetSizeLimit(0.13f); + instance.roleIcon.material.SetInt(PlayerMaterial.MaskLayer, 50); + instance.roleName.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f); + instance.roleDescription.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f); + instance.roleCount.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f); + instance.roleIcon.transform.localScale = new Vector3(4f, 4f, 1f); + } + public static void SetModifierPanel( this MatchInfoRolePanel instance, GameModifier modifier, diff --git a/MiraAPI/Resources/Locale/en_US.xml b/MiraAPI/Resources/Locale/en_US.xml index 028119a..245b7ae 100644 --- a/MiraAPI/Resources/Locale/en_US.xml +++ b/MiraAPI/Resources/Locale/en_US.xml @@ -53,4 +53,6 @@ Outlive the timer or eliminate the crew. Selective Meeting Ability Meeting Menu Ability Options + Player List + Game Settings diff --git a/MiraAPI/Roles/CustomRoleManager.cs b/MiraAPI/Roles/CustomRoleManager.cs index 060b1a5..25ab64e 100644 --- a/MiraAPI/Roles/CustomRoleManager.cs +++ b/MiraAPI/Roles/CustomRoleManager.cs @@ -45,6 +45,11 @@ public static class CustomRoleManager /// public static IReadOnlyList CustomRoleBehaviours { get; private set; } = []; + /// + /// Gets the of all roles as objects. + /// + public static IReadOnlyList AllStoredRoleBehaviours { get; private set; } = []; + /// /// Gets the of custom roles as objects. /// @@ -77,6 +82,7 @@ public static class CustomRoleManager CustomRoleBehaviours = [.. CustomRoles.Values]; CustomMiraRoles = [.. CustomRoles.Values.OfType()]; + AllStoredRoleBehaviours = [.. RoleManager.Instance.AllRoles]; } internal static void RegisterRoleTypes(List roles, MiraPluginInfo pluginInfo)