/// <summary> /// /// </summary> /// <param name="fighter"></param> public void EndTurn(AbstractFighter fighter) { foreach (var challenge in m_challenges) { challenge.EndTurn(fighter); } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="weapon"></param> public void CheckWeapon(AbstractFighter fighter, ItemTemplateDAO weapon) { foreach (var challenge in m_challenges) { challenge.CheckWeapon(fighter, weapon); } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void CheckDeath(AbstractFighter fighter) { foreach (var challenge in m_challenges) { challenge.CheckDeath(fighter); } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="beginCell"></param> /// <param name="endCell"></param> /// <param name="movementLength"></param> public void CheckMovement(AbstractFighter fighter, int beginCell, int endCell, int movementLength) { foreach (var challenge in m_challenges) { challenge.CheckMovement(fighter, beginCell, endCell, movementLength); } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="castInfos"></param> public void CheckSpell(AbstractFighter fighter, CastInfos castInfos) { foreach (var challenge in m_challenges) { challenge.CheckSpell(fighter, castInfos); } }
/// <summary> /// /// </summary> /// <param name="map"></param> /// <param name="id"></param> /// <param name="aggressor"></param> /// <param name="victim"></param> public AlignmentFight(MapInstance map, long id, AbstractFighter aggressor, CharacterEntity victim) : base(FightTypeEnum.TYPE_AGGRESSION, map, id, aggressor.Id, aggressor.AlignmentId, aggressor.CellId, victim.Id, victim.AlignmentId, victim.CellId, WorldConfig.AGGRESSION_START_TIMEOUT, WorldConfig.AGGRESSION_TURN_TIME, false, true, new HonorGainBehavior()) { IsNeutralAgression = victim.AlignmentId == (int)AlignmentTypeEnum.ALIGNMENT_NEUTRAL; JoinFight(aggressor, Team0); JoinFight(victim, Team1); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="cellId"></param> /// <param name="spellId"></param> /// <param name="spellLevel"></param> /// <param name="sprite"></param> /// <param name="spriteInfos"></param> /// <param name="duration"></param> /// <param name="callback"></param> public GameFightSpellAction(AbstractFighter fighter, int cellId, int spellId, int spellLevel, string sprite, string spriteInfos, long duration, System.Action callback) : base(GameActionTypeEnum.FIGHT_SPELL_LAUNCH, fighter, duration) { Callback = callback; CellId = cellId; SpellId = spellId; SpellLevel = spellLevel; Sprite = sprite; SpriteInfos = spriteInfos; }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void SummonFighter(AbstractFighter fighter) { var index = m_fighterTurns.IndexOf(fighter.Invocator) + 1; if (index == 0) { index = m_fighterTurns.Count; } m_fighterTurns.Insert(index, fighter); }
/// <summary> /// /// </summary> /// <param name="id"></param> /// <param name="monsterGrade"></param> /// <param name="invocator"></param> /// <param name="staticInvocation"></param> public MonsterEntity(long id, MonsterGradeDAO monsterGrade, AbstractFighter invocator = null, bool staticInvocation = false) : base(EntityTypeEnum.TYPE_MONSTER_FIGHTER, id, staticInvocation) { Grade = monsterGrade; Statistics = new GenericStats(monsterGrade); SpellBook = SpellBookFactory.Instance.Create(this); RealLife = MaxLife; SkinSize = SkinSizeBase; Invocator = invocator; }
/// <summary> /// /// </summary> public void OnDeath(AbstractFighter killer) { if (!DeclaredDead) { DeclaredDead = true; if (Cell != null) { Cell.RemoveObject(this); Cell = null; } } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void RemoveFighter(AbstractFighter fighter) { var index = m_fighterTurns.IndexOf(fighter); if (index == -1) { return; } m_fighterTurns.Remove(fighter); if (index <= m_currentIndex) { m_currentIndex--; } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void SendChallengeInfos(AbstractFighter fighter) { foreach (var challenge in m_challenges) { fighter.Dispatch(WorldMessage.FIGHT_CHALLENGE_INFORMATIONS(challenge.Id, challenge.ShowTarget, challenge.TargetId, challenge.BasicXpBonus, challenge.TeamXpBonus, challenge.BasicDropBonus, challenge.TeamDropBonus, challenge.Success)); } }
/// <summary> /// /// </summary> /// <param name="type"></param> /// <param name="activeType"></param> /// <param name="fight"></param> /// <param name="caster"></param> /// <param name="castInfos"></param> /// <param name="cell"></param> /// <param name="duration"></param> /// <param name="actionId"></param> /// <param name="canGoThrough"></param> /// <param name="canStack"></param> /// <param name="hide"></param> protected AbstractActivableObject(FightObstacleTypeEnum type, ActiveType activeType, AbstractFight fight, AbstractFighter caster, CastInfos castInfos, int cell, int duration, int actionId, bool canGoThrough, bool canStack, bool hide = false) { m_fight = fight; m_caster = caster; m_spellId = castInfos.SpellId; m_actionSpell = SpellManager.Instance.GetTemplate(castInfos.Value1); m_actionEffect = m_actionSpell.GetLevel(castInfos.Value2); Cell = fight.GetCell(cell); ObstacleType = type; ActivationType = activeType; CanGoThrough = canGoThrough; CanStack = canStack; Color = castInfos.Value3; Targets = new List <AbstractFighter>(); Length = Pathfinding.GetDirection(castInfos.RangeType[1]); AffectedCells = new List <FightCell>(); Duration = duration; ActionId = actionId; Hide = hide; foreach (var effect in m_actionEffect.Effects) { if (CastInfos.IsDamageEffect(effect.TypeEnum)) { Priority--; } } // On ajout l'objet a toutes les cells qu'il affecte foreach (var cellId in CellZone.GetCircleCells(fight.Map, cell, Length)) { var fightCell = m_fight.GetCell(cellId); if (fightCell != null) { fightCell.AddObject(this); AffectedCells.Add(fightCell); } } if (Hide) { Appear(caster.Team); } else { AppearForAll(); } }
/// <summary> /// /// </summary> /// <param name="target"></param> public void LoadTargets(AbstractFighter target) { if (!Targets.Contains(target)) { Targets.Add(target); } switch (ActivationType) { case ActiveType.ACTIVE_ENDMOVE: foreach (var cell in AffectedCells) { Targets.AddRange(cell.FightObjects.OfType <AbstractFighter>().Where(fighter => !Targets.Contains(fighter))); } break; } }
/// <summary> /// /// </summary> /// <param name="type"></param> /// <param name="activeType"></param> /// <param name="fight"></param> /// <param name="caster"></param> /// <param name="castInfos"></param> /// <param name="cell"></param> /// <param name="duration"></param> /// <param name="actionId"></param> /// <param name="canGoThrough"></param> /// <param name="canStack"></param> /// <param name="hide"></param> protected AbstractActivableObject(FightObstacleTypeEnum type, ActiveType activeType, AbstractFight fight, AbstractFighter caster, CastInfos castInfos, int cell, int duration, int actionId, bool canGoThrough, bool canStack, bool hide = false) { m_fight = fight; m_caster = caster; m_spellId = castInfos.SpellId; m_actionSpell = SpellManager.Instance.GetTemplate(castInfos.Value1); m_actionEffect = m_actionSpell.GetLevel(castInfos.Value2); Cell = fight.GetCell(cell); ObstacleType = type; ActivationType = activeType; CanGoThrough = canGoThrough; CanStack = canStack; Color = castInfos.Value3; Targets = new List<AbstractFighter>(); Length = Pathfinding.GetDirection(castInfos.RangeType[1]); AffectedCells = new List<FightCell>(); Duration = duration; ActionId = actionId; Hide = hide; foreach(var effect in m_actionEffect.Effects) { if(CastInfos.IsDamageEffect(effect.TypeEnum)) { Priority--; } } // On ajout l'objet a toutes les cells qu'il affecte foreach (var cellId in CellZone.GetCircleCells(fight.Map, cell, Length)) { var fightCell = m_fight.GetCell(cellId); if (fightCell != null) { fightCell.AddObject(this); AffectedCells.Add(fightCell); } } if (Hide) Appear(caster.Team); else AppearForAll(); }
/// <summary> /// /// </summary> /// <param name="activator"></param> public void Activate(AbstractFighter activator) { Activated = true; m_fight.CurrentProcessingFighter = activator; m_fight.Dispatch(WorldMessage.GAME_ACTION(ActionId, activator.Id, m_spellId + "," + Cell.Id + "," + m_actionSpell.Sprite + "," + m_actionEffect.Level + ",1," + m_caster.Id)); foreach (var target in Targets) { if (!target.IsFighterDead) { foreach (var effect in m_actionEffect.Effects) { m_fight.AddProcessingTarget(new CastInfos( effect.TypeEnum, m_spellId, Cell.Id, effect.Value1, effect.Value2, effect.Value3, effect.Chance, effect.Duration, m_caster, target, "", target.Cell.Id, isTrap: ObstacleType == FightObstacleTypeEnum.TYPE_TRAP) ); } } } Targets.Clear(); if (ObstacleType == FightObstacleTypeEnum.TYPE_TRAP) { Remove(); } }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="weapon"></param> public void CheckWeapon(AbstractFighter fighter, ItemTemplateDAO weapon) { foreach (var challenge in m_challenges) challenge.CheckWeapon(fighter, weapon); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="team"></param> public void JoinFight(AbstractFighter fighter, FightTeam team) { if (team.FreePlace == null) return; if (!fighter.IsDisconnected) { if(fighter.Type == EntityTypeEnum.TYPE_CHARACTER) OnCharacterJoin(fighter as CharacterEntity, team); fighter.JoinFight(this, team); Dispatch(WorldMessage.GAME_MAP_INFORMATIONS(OperatorEnum.OPERATOR_ADD, fighter)); } if (fighter.MapId == Map.Id) SendFightJoinInfos(fighter); }
/// <summary> /// /// </summary> /// <param name="fight"></param> /// <param name="caster"></param> /// <param name="effect"></param> /// <param name="cell"></param> public FightTrap(AbstractFight fight, AbstractFighter caster, CastInfos effect, int cell) : base(FightObstacleTypeEnum.TYPE_TRAP, ActiveType.ACTIVE_ENDMOVE, fight, caster, effect, cell, 0, 306, true, false, true) { }
/// <summary> /// /// </summary> public void Dispose() { m_fighterTurns.Clear(); m_fighterTurns = null; m_currentFighter = null; }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void SendChallengeInfos(AbstractFighter fighter) { foreach (var challenge in m_challenges) fighter.Dispatch(WorldMessage.FIGHT_CHALLENGE_INFORMATIONS(challenge.Id, challenge.ShowTarget, challenge.TargetId, challenge.BasicXpBonus, challenge.TeamXpBonus, challenge.BasicDropBonus, challenge.TeamDropBonus, challenge.Success)); }
/// <summary> /// /// </summary> /// <param name="entity"></param> /// <param name="path"></param> public GameFightMovementAction(AbstractFighter entity, MovementPath path) : base(GameActionTypeEnum.MAP_MOVEMENT, entity, entity.Type == EntityTypeEnum.TYPE_CHARACTER ? 5000 : (long)path.MovementTime) { Path = path; }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public BuffEffectManager(AbstractFighter fighter) { m_fighter = fighter; }
/// <summary> /// /// </summary> public void Dispose() { m_states.Clear(); m_states = null; m_fighter = null; }
/// <summary> /// /// </summary> /// <param name="fight"></param> /// <param name="caster"></param> /// <param name="effect"></param> /// <param name="cell"></param> /// <param name="duration"></param> public FightGlyph(AbstractFight fight, AbstractFighter caster, CastInfos effect, int cell, int duration) : base(FightObstacleTypeEnum.TYPE_GLYPH, ActiveType.ACTIVE_BEGINTURN, fight, caster, effect, cell, duration, 307, true, true) { }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public FighterStateManager(AbstractFighter fighter) { m_fighter = fighter; }
/// <summary> /// /// </summary> /// <param name="taxCollectorId"></param> /// <param name="attacker"></param> public void TaxColectorAttackerLeave(long taxCollectorId, AbstractFighter attacker) { m_taxCollectorDispatcher.Dispatch(WorldMessage.GUILD_TAXCOLLECTOR_ATTACKER_LEAVE(taxCollectorId, attacker.Id)); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public virtual void OnKill(AbstractFighter target) { FireEvent(EntityEventType.FIGHT_KILL, target); }
/// <summary> /// /// </summary> /// <param name="caster"></param> /// <param name="lostPoint"></param> /// <param name="mp"></param> /// <returns></returns> public int CalculDodgeAPMP(AbstractFighter caster, int lostPoint, bool mp = false) { var reality = 0; if (!mp) { var dodgeAPCaster = caster.APDodge; var dodgeAPTarget = APDodge; if (dodgeAPTarget == 0) { dodgeAPTarget = 1; } for (int i = 0; i < lostPoint; i++) { var actualAP = AP - reality; var realAP = AP; if (realAP == 0) { realAP = 1; } var percentLastAP = (double)actualAP / realAP; var chance = 0.5 * ((double)dodgeAPCaster / dodgeAPTarget) * percentLastAP; var percentChance = chance * 100; if (percentChance > 100) { percentChance = 90; } else if (percentChance < 10) { percentChance = 10; } if (Util.Next(0, 100) < percentChance) { reality++; } } } else { var dodgeMPCaster = caster.MPDodge; var dodgeMPTarget = MPDodge; if (dodgeMPTarget == 0) { dodgeMPTarget = 1; } for (int i = 0; i < lostPoint; i++) { var actualMP = MP - reality; var realMP = MP; if (realMP == 0) { realMP = 1; } var percentLastMP = (double)actualMP / realMP; var chance = 0.5 * ((double)dodgeMPCaster / dodgeMPTarget) * percentLastMP; var percentChance = chance * 100; if (percentChance > 100) { percentChance = 90; } else if (percentChance < 10) { percentChance = 10; } if (Util.Next(0, 100) < percentChance) { reality++; } } } return(reality); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void EndTurn(AbstractFighter fighter) { foreach (var challenge in m_challenges) challenge.EndTurn(fighter); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void RemoveFighter(AbstractFighter fighter) { m_fighters.Remove(fighter); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void SummonFighter(AbstractFighter fighter) { var index = m_fighterTurns.IndexOf(fighter.Invocator) + 1; if (index == 0) index = m_fighterTurns.Count; m_fighterTurns.Insert(index, fighter); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void AddFighter(AbstractFighter fighter) { m_fighters.Add(fighter); }
/// <summary> /// /// </summary> /// <param name="type"></param> /// <param name="fighter"></param> /// <param name="timeout"></param> public AbstractGameFightAction(GameActionTypeEnum type, AbstractFighter fighter, long duration) : base(type, fighter, duration) { Fighter = fighter; Timeout = Fighter.Fight.UpdateTime + duration; }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void CheckDeath(AbstractFighter fighter) { foreach (var challenge in m_challenges) challenge.CheckDeath(fighter); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> public void RemoveFighter(AbstractFighter fighter) { var index = m_fighterTurns.IndexOf(fighter); if (index == -1) return; m_fighterTurns.Remove(fighter); if(index <= m_currentIndex) m_currentIndex--; }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="beginCell"></param> /// <param name="endCell"></param> /// <param name="movementLength"></param> public void CheckMovement(AbstractFighter fighter, int beginCell, int endCell, int movementLength) { foreach (var challenge in m_challenges) challenge.CheckMovement(fighter, beginCell, endCell, movementLength); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="castInfos"></param> public void CheckSpell(AbstractFighter fighter, CastInfos castInfos) { foreach (var challenge in m_challenges) challenge.CheckSpell(fighter, castInfos); }
/// <summary> /// /// </summary> /// <param name="caster"></param> /// <param name="lostPoint"></param> /// <param name="mp"></param> /// <returns></returns> public int CalculDodgeAPMP(AbstractFighter caster, int lostPoint, bool mp = false) { var reality = 0; if (!mp) { var dodgeAPCaster = caster.APDodge; var dodgeAPTarget = APDodge; if (dodgeAPTarget == 0) dodgeAPTarget = 1; for (int i = 0; i < lostPoint; i++) { var actualAP = AP - reality; var realAP = AP; if (realAP == 0) realAP = 1; var percentLastAP = (double)actualAP / realAP; var chance = 0.5 * ((double)dodgeAPCaster / dodgeAPTarget) * percentLastAP; var percentChance = chance * 100; if (percentChance > 100) percentChance = 90; else if (percentChance < 10) percentChance = 10; if (Util.Next(0, 100) < percentChance) reality++; } } else { var dodgeMPCaster = caster.MPDodge; var dodgeMPTarget = MPDodge; if (dodgeMPTarget == 0) dodgeMPTarget = 1; for (int i = 0; i < lostPoint; i++) { var actualMP = MP - reality; var realMP = MP; if (realMP == 0) realMP = 1; var percentLastMP = (double)actualMP / realMP; var chance = 0.5 * ((double)dodgeMPCaster / dodgeMPTarget) * percentLastMP; var percentChance = chance * 100; if (percentChance > 100) percentChance = 90; else if (percentChance < 10) percentChance = 10; if (Util.Next(0, 100) < percentChance) reality++; } } return reality; }
/// <summary> /// /// </summary> /// <param name="taxCollectorId"></param> /// <param name="attacker"></param> public void TaxCollectorAttackerJoin(long taxCollectorId, AbstractFighter attacker) { m_taxCollectorDispatcher.Dispatch(WorldMessage.GUILD_TAXCOLLECTOR_ATTACKER_JOIN(taxCollectorId, attacker)); }
/// <summary> /// /// </summary> /// <param name="activator"></param> public void Activate(AbstractFighter activator) { Activated = true; m_fight.CurrentProcessingFighter = activator; m_fight.Dispatch(WorldMessage.GAME_ACTION(ActionId, activator.Id, m_spellId + "," + Cell.Id + "," + m_actionSpell.Sprite + "," + m_actionEffect.Level + ",1," + m_caster.Id)); foreach (var target in Targets) { if (!target.IsFighterDead) { foreach (var effect in m_actionEffect.Effects) { m_fight.AddProcessingTarget(new CastInfos( effect.TypeEnum, m_spellId, Cell.Id, effect.Value1, effect.Value2, effect.Value3, effect.Chance, effect.Duration, m_caster, target, "", target.Cell.Id, isTrap: ObstacleType == FightObstacleTypeEnum.TYPE_TRAP) ); } } } Targets.Clear(); if (ObstacleType == FightObstacleTypeEnum.TYPE_TRAP) Remove(); }
/// <summary> /// /// </summary> /// <param name="fighter"></param> /// <param name="cellId"></param> /// <param name="duration"></param> /// <param name="callback"></param> public GameFightWeaponAction(AbstractFighter fighter, int cellId, long duration, System.Action callback) : base(GameActionTypeEnum.FIGHT_WEAPON_USE, fighter, duration) { Callback = callback; CellId = cellId; }
/// <summary> /// /// </summary> /// <param name="target"></param> public void LoadTargets(AbstractFighter target) { if(!Targets.Contains(target)) Targets.Add(target); switch (ActivationType) { case ActiveType.ACTIVE_ENDMOVE: foreach (var cell in AffectedCells) { Targets.AddRange(cell.FightObjects.OfType<AbstractFighter>().Where(fighter => !Targets.Contains(fighter))); } break; } }