private void AddSubscription(List <IDisposable> subscriptions, Bard.Bard bard, CharacterControl character, Melody melody) { subscriptions.Add( character.gameObject.OnMouseDownAsObservable() .Subscribe(__ => { bard.SelectMelody(melody, character); subscriptions.ForEach(s => s.Dispose()); foreach (CharacterControl chara in CombatManager.Instance.teams.SelectMany(team => team)) { chara.gameObject.transform.Find("HighLight").gameObject.SetActive(false); } })); }
public void Init(Bard.Bard bard) { CombatManager.Instance.combatPhase.Subscribe(phase => { switch (phase) { case "selectMelody": case "combatTurn": musicMenu.SetActive(false); melodyMenu.SetActive(true); break; case "rhythmGame": musicMenu.SetActive(true); melodyMenu.SetActive(false); break; } }); GameObject buttonPrefab = Utils.LoadResourceFromDir <GameObject>("", "Button"); GameObject separatorPrefab = Utils.LoadResourceFromDir <GameObject>("", "Separator"); for (int i = 0; i < bard.instruments.Count; ++i) { RectTransform panel = instPanels[i]; Instrument inst = bard.instruments[i]; int currentTier = 1; foreach (var melody in inst.melodies) { if (melody.tier > currentTier) { Instantiate(separatorPrefab, panel); currentTier = melody.tier; } GameObject buttonGo = Instantiate(buttonPrefab, panel); Button button = buttonGo.GetComponent <Button>(); TextMeshProUGUI label = buttonGo.GetComponentInChildren <TextMeshProUGUI>(); label.text = Utils.SplitPascalCase(melody.name); buttonGo.GetComponent <Image>().sprite = melody.sprite; button.OnClickAsObservable() .Subscribe(_ => { List <IDisposable> subscriptions = new List <IDisposable>(); switch (melody.targetMode) { case MelodyTargetMode.EveryAlly: case MelodyTargetMode.EveryEnemy: case MelodyTargetMode.Everyone: bard.SelectMelody(melody); break; case MelodyTargetMode.OneAlly: foreach (CharacterControl character in CombatManager.Instance.teams[0].Where(c => !c.HasEffect(EffectType.Deaf))) { character.gameObject.transform.Find("HighLight").gameObject.SetActive(true); AddSubscription(subscriptions, bard, character, melody); } break; case MelodyTargetMode.OneEnemy: foreach (CharacterControl character in CombatManager.Instance.teams[1].Where(c => !c.HasEffect(EffectType.Deaf))) { character.gameObject.transform.Find("HighLight").gameObject.SetActive(true); AddSubscription(subscriptions, bard, character, melody); } break; case MelodyTargetMode.Anyone: foreach (CharacterControl character in CombatManager.Instance.teams.SelectMany(team => team) .Where(c => !c.HasEffect(EffectType.Deaf))) { character.gameObject.transform.Find("HighLight").gameObject.SetActive(true); AddSubscription(subscriptions, bard, character, melody); } break; default: Debug.Log("Warning : Melody [" + melody.name + "] " + "has no known targetMode (" + melody.targetMode + ")"); break; } }) .AddTo(button); melody.isPlayable.Subscribe(x => { button.interactable = x; }).AddTo(button); button.OnPointerEnterAsObservable() .Subscribe(_ => { }) .AddTo(button); } bard.actionPoints.Subscribe(p => { int nbrSquare = (bard.maxActionPoints.Value - p) / 8; //- - - - - WARNING MAGIC NUMBER NBR NOTE PER BEAT int colored = 0; List <Image> actionImages = actionPanel.GetComponentsInChildren <Image>().ToList(); actionImages.RemoveAt(0); actionImages.Reverse(); foreach (Image image in actionImages) { image.color = colored >= nbrSquare ? Color.white : Color.red; colored++; } }); bard.inspiration.current.Subscribe(inspi => { inspiJauge.localScale = new Vector3(1, inspi / (float)bard.inspiration.maximumValue, 1); }); } }