internal static void Init(Battle _battle, Hero _hero) { int[] eventIDs = new int[_hero.sds.GetAuras().Length]; for (int i = 0; i < _hero.sds.GetAuras().Length; i++) { int auraID = _hero.sds.GetAuras()[i]; IAuraSDS auraSDS = Battle.GetAuraData(auraID); SuperEventListenerV.EventCallBack <float> dele = delegate(SuperEvent e, ref float _value) { TriggerAura(_battle, _hero, auraSDS, e, ref _value); }; eventIDs[i] = _battle.eventListenerV.AddListener(GetEventName(auraSDS.GetAuraTarget() == AuraTarget.ALLY ? _hero.isMine : !_hero.isMine, auraSDS.GetAuraEffect()), dele); } Action <SuperEvent> dieDele = delegate(SuperEvent e) { for (int i = 0; i < eventIDs.Length; i++) { _battle.eventListenerV.RemoveListener(eventIDs[i]); } _battle.eventListener.RemoveListener(e.index); }; _battle.eventListener.AddListener(HeroSkill.GetEventName(_hero.uid, SkillTime.DIE), dieDele); }
internal static void Init(BattleCore _battleCore, Unit _unit, int _auraID, AuraRegisterType _registerType, int _nowTime) { IAuraSDS sds = BattleCore.GetAuraData(_auraID); List <int> ids = new List <int>(); int id = RegisterAura(_battleCore, _unit, sds, _registerType); ids.Add(id); SuperEventListener.SuperFunctionCallBack3 <Unit, Unit, int> dele = delegate(int _index, Unit _triggerUnit, Unit _otherUnit, int _time) { if (_triggerUnit == _unit) { for (int i = 0; i < ids.Count; i++) { _battleCore.eventListener.RemoveListener(ids[i]); } } }; id = _battleCore.eventListener.AddListener(BattleConst.DIE, dele); ids.Add(id); if (_registerType == AuraRegisterType.EFFECT) { id = _battleCore.eventListener.AddListener(BattleConst.BE_CLEAN, dele); ids.Add(id); } if (sds.GetTime() > 0) { int overTime = _nowTime + sds.GetTime(); SuperEventListener.SuperFunctionCallBack1 <int> dele2 = delegate(int _index, int _time) { if (_time >= overTime) { for (int i = 0; i < ids.Count; i++) { _battleCore.eventListener.RemoveListener(ids[i]); } } }; id = _battleCore.eventListener.AddListener(BattleConst.TIME_OVER, dele2); ids.Add(id); } for (int i = 0; i < sds.GetRemoveEventNames().Length; i++) { id = _battleCore.eventListener.AddListener(sds.GetRemoveEventNames()[i], dele); ids.Add(id); } }
private static void TriggerAura(Battle _battle, Hero _hero, IAuraSDS _auraSDS, SuperEvent e, ref float _value) { Hero targetHero = e.datas[0] as Hero; if (targetHero == _hero) { return; } List <int> pos = BattlePublicTools.GetNeighbourPos(_battle.mapData.neighbourPosMap, _hero.pos); if (pos.Contains(targetHero.pos)) { _value = _value * _auraSDS.GetAuraDatas()[0]; } }
private static int RegisterAura(BattleCore _battleCore, Unit _unit, IAuraSDS _sds, AuraRegisterType _registerType) { int result; switch (_sds.GetAuraType()) { case AuraType.ADD_INT: SuperEventListener.SuperFunctionCallBackV2 <int, Unit, Unit> dele1 = delegate(int _index, ref int _result, Unit _triggerUnit, Unit _otherUnit) { if (CheckAuraIsBeSilenced(_battleCore, _unit, _registerType) && CheckAuraTrigger(_battleCore, _unit, _triggerUnit, _sds)) { _result += _sds.GetEffectData()[0]; } }; result = _battleCore.eventListener.AddListener(_sds.GetEventName(), dele1, _sds.GetPriority()); break; case AuraType.SET_INT: SuperEventListener.SuperFunctionCallBackV2 <int, Unit, Unit> dele3 = delegate(int _index, ref int _result, Unit _triggerHero, Unit _otherUnit) { if (CheckAuraIsBeSilenced(_battleCore, _unit, _registerType) && CheckAuraTrigger(_battleCore, _unit, _triggerHero, _sds)) { _result = _sds.GetEffectData()[0]; } }; result = _battleCore.eventListener.AddListener(_sds.GetEventName(), dele3, _sds.GetPriority()); break; case AuraType.MULTI_INT: SuperEventListener.SuperFunctionCallBackV2 <int, Unit, Unit> dele4 = delegate(int _index, ref int _result, Unit _triggerHero, Unit _otherUnit) { if (CheckAuraIsBeSilenced(_battleCore, _unit, _registerType) && CheckAuraTrigger(_battleCore, _unit, _triggerHero, _sds)) { _result = (int)(0.001f * _sds.GetEffectData()[0] * _result); } }; result = _battleCore.eventListener.AddListener(_sds.GetEventName(), dele4, _sds.GetPriority()); break; case AuraType.CAST_SKILL: SuperEventListener.SuperFunctionCallBack3 <Unit, Unit, int> dele2 = delegate(int _index, Unit _triggerUnit, Unit _otherUnit, int _time) { if (CheckAuraIsBeSilenced(_battleCore, _unit, _registerType) && CheckAuraTrigger(_battleCore, _unit, _triggerUnit, _sds)) { switch (_sds.GetEffectTarget()) { case AuraTarget.OWNER: Effect.UnitTakeEffect(_battleCore, _unit, _sds.GetEffectData(), _time); break; case AuraTarget.TRIGGER: Effect.UnitTakeEffect(_battleCore, _triggerUnit, _sds.GetEffectData(), _time); break; case AuraTarget.OTHER: if (_otherUnit != null) { Effect.UnitTakeEffect(_battleCore, _otherUnit, _sds.GetEffectData(), _time); } break; } } }; result = _battleCore.eventListener.AddListener(_sds.GetEventName(), dele2); break; default: throw new Exception("Unknown AuraType:" + _sds.GetAuraType().ToString()); } return(result); }
private static bool CheckAuraTrigger(BattleCore _battleCore, Unit _unit, Unit _triggerUnit, IAuraSDS _sds) { switch (_sds.GetTrigger()) { case AuraTrigger.OWNER: return(_triggerUnit == _unit); case AuraTrigger.ENEMY: return(_triggerUnit.isMine != _unit.isMine); case AuraTrigger.COL_ENEMY: if (_triggerUnit.isMine != _unit.isMine) { Turrent[] turrents = _triggerUnit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; int x = _unit.pos % BattleConst.MAP_WIDTH; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix >= BattleConst.MAP_WIDTH) { return(false); } int nowX = x + posFix % BattleConst.MAP_WIDTH; nowX = BattleConst.MAP_WIDTH - 1 - nowX; for (int m = 0; m < BattleConst.MAP_HEIGHT; m++) { int targetPos = m * BattleConst.MAP_WIDTH + nowX; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.FRONT_ENEMY: if (_triggerUnit.isMine != _unit.isMine) { Turrent[] turrents = _triggerUnit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; int x = _unit.pos % BattleConst.MAP_WIDTH; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix >= BattleConst.MAP_WIDTH) { return(false); } int nowX = x + posFix % BattleConst.MAP_WIDTH; nowX = BattleConst.MAP_WIDTH - 1 - nowX; for (int m = 0; m < BattleConst.MAP_HEIGHT; m++) { int targetPos = m * BattleConst.MAP_WIDTH + nowX; Turrent turrent = turrents[targetPos]; if (turrent != null) { if (turrent.parent == _triggerUnit) { return(true); } else { break; } } } } } return(false); case AuraTrigger.OWNER_NEIGHBOUR_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; int nowPos = _unit.pos + posFix; int nowX = nowPos % BattleConst.MAP_WIDTH; int targetPos; if (nowX > 0) { targetPos = nowPos - 1; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } if (nowX < BattleConst.MAP_WIDTH - 1) { targetPos = nowPos + 1; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } targetPos = nowPos - BattleConst.MAP_WIDTH; if (targetPos >= 0) { Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } targetPos = nowPos + BattleConst.MAP_WIDTH; if (targetPos < BattleConst.MAP_WIDTH * BattleConst.MAP_HEIGHT) { Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.OWNER_ALLY: return(_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine); case AuraTrigger.OWNER_ROW_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; int y = _unit.pos / BattleConst.MAP_WIDTH; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix % BattleConst.MAP_WIDTH != 0) { continue; } int nowY = y + posFix / BattleConst.MAP_WIDTH; for (int m = 0; m < BattleConst.MAP_WIDTH; m++) { int targetPos = nowY * BattleConst.MAP_WIDTH + m; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.OWNER_COL_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; int x = _unit.pos % BattleConst.MAP_WIDTH; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix >= BattleConst.MAP_WIDTH) { return(false); } int nowX = x + posFix % BattleConst.MAP_WIDTH; for (int m = 0; m < BattleConst.MAP_HEIGHT; m++) { int targetPos = m * BattleConst.MAP_WIDTH + nowX; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.OWNER_FRONT_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix >= BattleConst.MAP_WIDTH) { return(false); } int nowPos = _unit.pos + posFix; for (int m = 1; m < BattleConst.MAP_HEIGHT; m++) { int targetPos = nowPos - m * BattleConst.MAP_WIDTH; if (targetPos < 0) { break; } Turrent turrent = turrents[targetPos]; if (turrent != null) { if (turrent.parent == _triggerUnit) { return(true); } else { break; } } } } } return(false); case AuraTrigger.OWNER_BACK_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix >= BattleConst.MAP_WIDTH) { return(false); } int nowPos = _unit.pos + posFix; for (int m = 1; m < BattleConst.MAP_HEIGHT; m++) { int targetPos = nowPos + m * BattleConst.MAP_WIDTH; if (targetPos >= BattleConst.MAP_WIDTH * BattleConst.MAP_HEIGHT) { break; } Turrent turrent = turrents[targetPos]; if (turrent != null) { if (turrent.parent == _triggerUnit) { return(true); } else if (turrent.parent != _unit) { break; } } } } } return(false); case AuraTrigger.OWNER_BESIDE_ALLY: if (_triggerUnit != _unit && _triggerUnit.isMine == _unit.isMine) { Turrent[] turrents = _unit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; int nowPos = _unit.pos + posFix; int nowX = nowPos % BattleConst.MAP_WIDTH; if (nowX > 0) { int targetPos = nowPos - 1; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } if (nowX < BattleConst.MAP_WIDTH - 1) { int targetPos = nowPos + 1; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.ROW_ENEMY: if (_triggerUnit.isMine != _unit.isMine) { Turrent[] turrents = _triggerUnit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; int y = _unit.pos / BattleConst.MAP_WIDTH; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; if (posFix % BattleConst.MAP_WIDTH != 0) { continue; } int nowY = y + posFix / BattleConst.MAP_WIDTH; for (int m = 0; m < BattleConst.MAP_WIDTH; m++) { int targetPos = nowY * BattleConst.MAP_WIDTH + m; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } } return(false); case AuraTrigger.POS_ENEMY: if (_triggerUnit.isMine != _unit.isMine) { Turrent[] turrents = _triggerUnit.isMine ? _battleCore.mTurrent : _battleCore.oTurrent; for (int i = 0; i < _unit.sds.GetPos().Length; i++) { int posFix = _unit.sds.GetPos()[i]; int nowPos = _unit.pos + posFix; int nowX = nowPos % BattleConst.MAP_WIDTH; int nowY = nowPos / BattleConst.MAP_WIDTH; nowPos = BattleConst.MAP_WIDTH - 1 - nowPos; int targetPos = nowY * BattleConst.MAP_WIDTH + nowX; Turrent turrent = turrents[targetPos]; if (turrent != null && turrent.parent == _triggerUnit) { return(true); } } } return(false); default: throw new Exception("CheckAuraTrigger error:" + _sds.GetTrigger()); } }