protected override IEnumerator InternalExecuteRoutine(Effector effect, Result <bool> result) { DirectionCursor cursor = battle.SpawnDirectionCursor(actor.location); Result <EightDir> dirResult = new Result <EightDir>(); yield return(cursor.SelectTargetDirRoutine(dirResult, actor, (Vector2Int v) => { float d = Mathf.Abs(actor.battler.transform.position.y - map.terrain.HeightAt(v.x, v.y)); return d <= BattleEvent.AttackHeightMax && DefaultSelectRule(effect)(v); }, true)); battle.DespawnDirCursor(); if (dirResult.canceled) { result.Cancel(); } else { float d = Mathf.Abs(actor.battler.transform.position.y - map.terrain.HeightAt(actor.battler.location + dirResult.value.XY())); if (d <= BattleEvent.AttackHeightMax) { yield return(effect.ExecuteDirectionRoutine(dirResult.value)); result.value = true; } else { result.Cancel(); } } }
// === INITIALIZATION ========================================================================== public void Start() { if (pcEvent != null) { Global.Instance().Maps.pc = pcEvent.GetComponent <PCEvent>(); } else { pcEvent = Global.Instance().Maps.pc.GetComponent <BattleEvent>(); } pc = new BattleUnit(Instantiate(pcEvent.unitSerialized), this); pcEvent.unit = pc; units = new List <BattleUnit>() { pcEvent.unit }; battlers = new Dictionary <BattleUnit, BattleEvent>(); battlers[pcEvent.unit] = pcEvent; cursor = Cursor.GetInstance(); cursor.gameObject.transform.SetParent(GetComponent <Map>().objectLayer.transform); cursor.gameObject.SetActive(false); dirCursor = DirectionCursor.GetInstance(); dirCursor.gameObject.transform.SetParent(GetComponent <Map>().objectLayer.transform); dirCursor.gameObject.SetActive(false); ui = FindObjectOfType <RogueUI>(); ui.Populate(); AddUnitsFromMap(); if (immediateMode) { StartCoroutine(CoUtils.RunAfterDelay(0.1f, () => { StartCoroutine(BattleRoutine()); })); } }