using System; using JetBrains.Annotations; using SharpUI.Source.Common.UI.Base.Component; using SharpUI.Source.Common.UI.Elements.ActionBars; using SharpUI.Source.Common.UI.Elements.Button; using SharpUI.Source.Common.UI.Elements.SkillBars; using SharpUI.Source.Common.UI.Util.Keyboard; using SharpUI.Source.Common.Util.Extensions; using UnityEngine; using Notification = SharpUI.Source.Common.UI.Elements.Notifications.Notification; namespace SharpUI.Source.Client.UI.Game.GameScreen { public class GameSceneComponent : MonoBehaviourComponent, IGameSceneComponent { [SerializeField] public GameObject skillBarPrefab; [SerializeField] public Notification notificationAchievement; [SerializeField] public Notification notificationSkills; [SerializeField] public GameObject castingSkillBarContainer; // Settings [SerializeField] public IconButton settingsButton; [SerializeField] public IconButton vendorButton; [SerializeField] public IconButton skillsButton; // Debuffs [SerializeField] public SkillBar queensVenom; [SerializeField] public SkillBar deadlyPoison; [SerializeField] public SkillBar thunderstruck; [SerializeField] public SkillBar backstab; // Action bar top buttons [SerializeField] public ActionBarButton actionBarTop1; [SerializeField] public ActionBarButton actionBarTop2; [SerializeField] public ActionBarButton actionBarTop3; [SerializeField] public ActionBarButton actionBarTop4; [SerializeField] public ActionBarButton actionBarTop5; [SerializeField] public ActionBarButton actionBarTop6; [SerializeField] public ActionBarButton actionBarTop7; [SerializeField] public ActionBarButton actionBarTop8; [SerializeField] public ActionBarButton actionBarTop9; [SerializeField] public ActionBarButton actionBarTop0; // Action bar bottom buttons [SerializeField] public ActionBarButton actionBarBottom1; [SerializeField] public ActionBarButton actionBarBottom2; [SerializeField] public ActionBarButton actionBarBottom3; [SerializeField] public ActionBarButton actionBarBottom4; [SerializeField] public ActionBarButton actionBarBottom5; [SerializeField] public ActionBarButton actionBarBottom6; [SerializeField] public ActionBarButton actionBarBottom7; [SerializeField] public ActionBarButton actionBarBottom8; [SerializeField] public ActionBarButton actionBarBottom9; [SerializeField] public ActionBarButton actionBarBottom0; protected override GameSceneComponent GetComponent() => this; [CanBeNull] private IGameScenePresenter _presenter; private SkillBar _activeSkillBar; public void SetupComponent() { _presenter = GetPresenter(); notificationAchievement.SetTitle("Achievement"); notificationAchievement.SetSubtitle("Reckless & Furious"); notificationAchievement.ObserveOnClick().SubscribeWith(this, _ => { /* Show achievements */ }); notificationSkills.SetTitle("Click to open Skills"); notificationSkills.SetSubtitle("New Skills Unlocked!"); notificationSkills.ObserveOnClick().SubscribeWith(this, _ => _presenter?.OnSkillsClicked()); settingsButton.GetEventListener().ObserveOnClicked().SubscribeWith(this, _ => _presenter?.OnSettingsClicked()); vendorButton.GetEventListener().ObserveOnClicked().SubscribeWith(this, _ => _presenter?.OnVendorClicked()); skillsButton.GetEventListener().ObserveOnClicked().SubscribeWith(this, _ => _presenter?.OnSkillsClicked()); StartDebuffs(); ObserveKeysAndCoolDownBottom(); ObserveKeysAndCoolDownTop(); ObserveEscapeKey(); } private void StartDebuffs() { queensVenom.ObserveCooldownFinished().SubscribeWith(this, _ => queensVenom.RestartCooldown()); deadlyPoison.ObserveCooldownFinished().SubscribeWith(this, _ => deadlyPoison.RestartCooldown()); thunderstruck.ObserveCooldownFinished().SubscribeWith(this, _ => thunderstruck.RestartCooldown()); backstab.ObserveCooldownFinished().SubscribeWith(this, _ => backstab.RestartCooldown()); queensVenom.StartCooldown(); deadlyPoison.StartCooldown(); thunderstruck.StartCooldown(); backstab.StartCooldown(); } private void ShowSkillBarCast( string skillName, float castTime, Color skillColor, Sprite skillSprite, Action action) { // If already casting this skill, don't restart :-) if (_activeSkillBar && _activeSkillBar.skillName == skillName) return; if (_activeSkillBar) CancelActiveSkillBarCast(); castingSkillBarContainer.SetActive(false); _activeSkillBar = Instantiate(skillBarPrefab, castingSkillBarContainer.transform).GetComponent(); _activeSkillBar.skillName = skillName; _activeSkillBar.skillCooldown = castTime; _activeSkillBar.skillCooldownRemaining = castTime; _activeSkillBar.skillBarImage.color = skillColor; _activeSkillBar.skillIconImage.sprite = skillSprite; _activeSkillBar.skillIconImage.color = skillColor; _activeSkillBar.consumeType = SkillBar.CooldownConsumeType.Fill; _activeSkillBar.depleteWhenCompleted = true; _activeSkillBar.ObserveCooldownFinished().SubscribeWith(this, _ => action.Invoke()); castingSkillBarContainer.SetActive(true); _activeSkillBar.StartCooldown(); } private void CancelActiveSkillBarCast() { if (_activeSkillBar) _activeSkillBar.Cancel(); } private void ObserveEscapeKey() { var escKeyListener = new GameObject().AddComponent(); escKeyListener.ListenToKey(KeyCode.Escape); escKeyListener.ObserveDown().SubscribeWith(this, _ => CancelActiveSkillBarCast()); } private void ObserveKeysAndCoolDownBottom() { ObserveActionBarBottom1(); ObserveActionBarBottom2(); ObserveActionBarBottom3(); ObserveActionBarBottom4(); ObserveActionBarBottom5(); ObserveActionBarBottom6(); ObserveActionBarBottom7(); ObserveActionBarBottom8(); ObserveActionBarBottom9(); ObserveActionBarBottom0(); } private void ObserveKeysAndCoolDownTop() { ObserveActionBarTop1(); ObserveActionBarTop2(); ObserveActionBarTop3(); ObserveActionBarTop4(); ObserveActionBarTop5(); ObserveActionBarTop6(); ObserveActionBarTop7(); ObserveActionBarTop8(); ObserveActionBarTop9(); ObserveActionBarTop0(); } private void ObserveActionBarBottom1() { actionBarBottom1.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { if (actionBarBottom1.IsCoolingDown()) return; ShowSkillBarCast("Quick Stab", 1f, actionBarBottom1.iconImage.color, actionBarBottom1.iconImage.sprite, () => actionBarBottom1.CoolDown(3.8f)); }); actionBarBottom1.GetKeyListener().ListenToKey(KeyCode.Alpha1); } private void ObserveActionBarBottom2() { actionBarBottom2.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { if (actionBarBottom2.IsCoolingDown()) return; ShowSkillBarCast("Fireball", 3.7f, actionBarBottom2.iconImage.color, actionBarBottom2.iconImage.sprite, () => actionBarBottom2.CoolDown(9.6f)); }); actionBarBottom2.GetKeyListener().ListenToKey(KeyCode.Alpha2); } private void ObserveActionBarBottom3() { actionBarBottom3.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { if (actionBarBottom3.IsCoolingDown()) return; ShowSkillBarCast("North Wind", 2.8f, actionBarBottom3.iconImage.color, actionBarBottom3.iconImage.sprite, () => actionBarBottom3.CoolDown(180f)); }); actionBarBottom3.GetKeyListener().ListenToKey(KeyCode.Alpha3); } private void ObserveActionBarBottom4() { actionBarBottom4.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { if (actionBarBottom4.IsCoolingDown()) return; ShowSkillBarCast("Lightning Coil", 1f, actionBarBottom4.iconImage.color, actionBarBottom4.iconImage.sprite, () => actionBarBottom4.CoolDown(45f)); }); actionBarBottom4.GetKeyListener().ListenToKey(KeyCode.Alpha4); } private void ObserveActionBarBottom5() { actionBarBottom5.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { if (actionBarBottom5.IsCoolingDown()) return; ShowSkillBarCast("On Guard", 6f, actionBarBottom5.iconImage.color, actionBarBottom5.iconImage.sprite, () => actionBarBottom5.CoolDown(120f)); }); actionBarBottom5.GetKeyListener().ListenToKey(KeyCode.Alpha5); } private void ObserveActionBarBottom6() { actionBarBottom6.GetKeyListener().ListenToKey(KeyCode.Alpha6); } private void ObserveActionBarBottom7() { actionBarBottom7.GetKeyListener().ListenToKey(KeyCode.Alpha7); } private void ObserveActionBarBottom8() { actionBarBottom8.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarBottom8.CoolDown(120f); }); actionBarBottom8.GetKeyListener().ListenToKey(KeyCode.Alpha8); } private void ObserveActionBarBottom9() { actionBarBottom9.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarBottom9.CoolDown(60f); }); actionBarBottom9.GetKeyListener().ListenToKey(KeyCode.Alpha9); } private void ObserveActionBarBottom0() { actionBarBottom0.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarBottom0.CoolDown(30f); }); actionBarBottom0.GetKeyListener().ListenToKey(KeyCode.Alpha0); } private void ObserveActionBarTop1() { actionBarTop1.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop1.CoolDown(25f); }); actionBarTop1.GetKeyListener().ListenToKey(KeyCode.Q); } private void ObserveActionBarTop2() { actionBarTop2.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop2.CoolDown(125f); }); actionBarTop2.GetKeyListener().ListenToKey(KeyCode.E); } private void ObserveActionBarTop3() { actionBarTop3.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop3.CoolDown(15f); }); actionBarTop3.GetKeyListener().ListenToKey(KeyCode.R); } private void ObserveActionBarTop4() { actionBarTop4.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop4.CoolDown(5f); }); actionBarTop4.GetKeyListener().ListenToKey(KeyCode.T); } private void ObserveActionBarTop5() { actionBarTop5.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop5.CoolDown(2f); }); actionBarTop5.GetKeyListener().ListenToKey(KeyCode.F); } private void ObserveActionBarTop6() { actionBarTop6.GetKeyListener().ListenToKey(KeyCode.G); } private void ObserveActionBarTop7() { actionBarTop7.GetKeyListener().ListenToKey(KeyCode.C); } private void ObserveActionBarTop8() { actionBarTop8.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop8.CoolDown(120f); }); actionBarTop8.GetKeyListener().ListenToKey(KeyCode.Q); actionBarTop8.GetKeyListener().RequireAnyShift(); actionBarTop8.GetKeyListener().RequireAnyControl(); } private void ObserveActionBarTop9() { actionBarTop9.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop9.CoolDown(60f); }); actionBarTop9.GetKeyListener().ListenToKey(KeyCode.E); actionBarTop9.GetKeyListener().RequireAnyShift(); } private void ObserveActionBarTop0() { actionBarTop0.GetEventListener().ObserveOnClicked() .SubscribeWith(this, _ => { CancelActiveSkillBarCast(); actionBarTop0.CoolDown(30f); }); actionBarTop0.GetKeyListener().ListenToKey(KeyCode.R); actionBarTop0.GetKeyListener().RequireAnyControl(); } } }