Example #1
0
        public List<Fighter> RemixTargets(Fighter caster, List<Fighter> targets)
        {
            List<Fighter> remixedTargets = new List<Fighter>();

            foreach (Fighter target in targets)
            {
                if (Enemies && caster.Team != target.Team)
                {
                    remixedTargets.Add(target);
                    continue;
                }

                if (Allies && caster.ID != target.ID && caster.Team == target.Team)
                {
                    remixedTargets.Add(target);
                    continue;
                }

                if (Launcher && caster.ID == target.ID)
                {
                    remixedTargets.Add(target);
                    continue;
                }
            }

            if (AddLauncher && !remixedTargets.Contains(caster))
                remixedTargets.Add(caster);

            return remixedTargets;
        }
Example #2
0
        public override void PlayerLeave(Fighter fighter)
        {
            switch (State)
            {
                case FightState.STARTING:

                    if (fighter.IsLeader)
                    {
                        fighter.Left = true;

                        FightEnd(GetEnnemyTeam(fighter.Team), fighter.Team);
                    }
                    else
                    {
                        fighter.Team.FighterLeave(fighter);

                        fighter.Character.State.InFight = false;
                        fighter.Character.Fight = null;
                        fighter.Character.Fighter = null;

                        Send(FormatFighterDestroy(fighter));
                        Map.Send(FormatFlagFighterDestroy(fighter));
                        fighter.Character.NClient.Send(FormatLeave());
                    }

                    break;

                case FightState.PLAYING:

                    if (CurrentFighter == fighter)
                        TurnEnd();

                    fighter.Left = true;

                    if (GetWinners() != null)
                    {
                        FightEnd(GetEnnemyTeam(fighter.Team), fighter.Team);
                    }
                    else
                    {
                        fighter.Buffs.Debuff();

                        fighter.Character.State.InFight = false;
                        fighter.Character.Fight = null;
                        fighter.Character.Fighter = null;

                        Send(FormatFighterDestroy(fighter));
                        fighter.Character.NClient.Send(FormatLeave());
                    }

                    break;
            }
        }
Example #3
0
        public void PlayerFightReady(Fighter fighter, bool ready)
        {
            if (myState != FightState.STARTING)
                return;

            fighter.FightReady = ready;

            Send(FormatFightReady(fighter));

            if (IsAllFightReady())
                FightStart();
        }
Example #4
0
 public abstract void PlayerLeave(Fighter fighter);
Example #5
0
        public void FighterJoin(Fighter Fighter, bool isLeader = false)
        {
            Fighter.Team = this;
            Fighter.Cell = GetAvailablePlace();

            if (isLeader)
            {
                myLeader = Fighter;
                myCell = Fighter.Character.MapCell;
            }

            myFighters.Add(Fighter);
        }
Example #6
0
        public void LaunchSpell(Fighter fighter, CharacterSpell spell, int cellID)
        {
            if (myState != FightState.PLAYING)
                return;

            Fighter firstTarget = GetAliveFighters().FirstOrDefault(x => x.Cell == cellID);
            int targetID = firstTarget == null ? -1 : firstTarget.ID;

            if (!CanLaunchSpell(fighter, spell, cellID, targetID))
                return;

            fighter.AP -= spell.LevelModel.Cost;

            bool isEchec = false;

            if (spell.LevelModel.EC != 0)
            {
                int echecRate = spell.LevelModel.EC - fighter.Stats.GetStat(StatEnum.EchecCritic).Total;

                if (echecRate < 2)
                    echecRate = 2;

                if (Basic.Rand(1, echecRate) == 1)
                    isEchec = true;
            }

            if (isEchec)
            {
                Send("GA;302;" + fighter.ID + ';' + spell.ID);
            }
            else
            {
                fighter.SpellController.OnLaunchSpell(spell, targetID);

                Send("GA;300;" + fighter.ID + ';' + spell.ID + ',' + cellID + ',' + spell.Model.Sprite + ',' + spell.Level + ',' + spell.Model.SpriteInfos);

                bool isCritic = false;

                if (spell.LevelModel.CC != 0 & spell.LevelModel.CriticalEffects.Count > 0)
                {
                    int criticRate = spell.LevelModel.CC - fighter.Stats.GetStat(StatEnum.DamageCritic).Total;

                    if (criticRate < 2)
                        criticRate = 2;

                    if (Basic.Rand(1, criticRate) == 1)
                        isCritic = true;
                }

                if (isCritic)
                    Send("GA;301;" + fighter.ID + ';' + spell.ID);

                List<EffectSpell> effects = isCritic ? spell.LevelModel.CriticalEffects : spell.LevelModel.Effects;
                List<Fighter> targets = new List<Fighter>();

                foreach (int cell in CellZone.GetCells(myMap, cellID, fighter.Cell, spell.LevelModel.Type))
                {
                    Fighter target = GetAliveFighters().FirstOrDefault(x => x.Cell == cell);

                    if (target != null)
                        targets.Add(target);
                }

                int actualChance = 0;

                foreach (EffectSpell effect in effects)
                {
                    if (effect.Chance > 0)
                    {
                        if (Basic.Rand(1, 100) > effect.Chance + actualChance)
                        {
                            actualChance += effect.Chance;
                            continue;
                        }

                        actualChance -= 100;
                    }

                    targets.RemoveAll(x => x.Dead);

                    EffectProcessor.ApplyEffect(new EffectCast
                        ((EffectEnum)effect.ID, spell.ID, cellID, effect.Value, effect.Value2, effect.Value3, effect.Chance, effect.Round, (spell.LevelModel.MinRP == 1 & spell.LevelModel.MaxRP == 1), fighter, effect.Target.RemixTargets(fighter, targets)));
                }
            }

            Send("GA;102;" + fighter.ID + ';' + fighter.ID + ",-" + spell.LevelModel.Cost);

            if (GetWinners() != null)
                FightEnd(GetWinners(), GetEnnemyTeam(GetWinners()));
            else if (isEchec & spell.LevelModel.isECEndTurn)
                TurnEnd();
        }
Example #7
0
        public void Toggle(Fighter fighter, ToggleType toggle)
        {
            if (!fighter.IsLeader)
                return;

            bool isToggle = !fighter.Team.IsToggle(toggle);

            fighter.Team.Toggle(toggle, isToggle);

            if (myState == FightState.STARTING)
                myMap.Send(FormatFlagOption(toggle, fighter.Team));

            switch (toggle)
            {
                case ToggleType.LOCK:
                    if (isToggle)
                        fighter.Team.Send("Im095");
                    else
                        fighter.Team.Send("Im096");
                    break;

                case ToggleType.HELP:
                    if (isToggle)
                        fighter.Team.Send("Im0103");
                    else
                        fighter.Team.Send("Im0104");
                    break;

                case ToggleType.PARTY:
                    if (isToggle)
                    {
                        KickNoParty(fighter.Team);
                        fighter.Team.Send("Im093");
                    }
                    else
                    {
                        fighter.Team.Send("Im094");
                    }
                    break;

                case ToggleType.SPECTATOR:
                    if (isToggle)
                    {
                        KickSpectator();
                        fighter.Team.Send("Im040");
                    }
                    else
                    {
                        fighter.Team.Send("Im039");
                    }
                    break;
            }
        }
Example #8
0
        private void NextFighter()
        {
            do
            {
                if (myCurrentFighter == null || myCurrentFighter == myTurnFighters.LastOrDefault())
                    myCurrentFighter = myTurnFighters[0];
                else
                    myCurrentFighter = myTurnFighters[myTurnFighters.IndexOf(myCurrentFighter) + 1];

            }
            while (myCurrentFighter.Dead);
        }
Example #9
0
 public string FormatFighterShow(Fighter fighter)
 {
     return new StringBuilder("GM|+").Append(fighter.GetPattern()).ToString();
 }
Example #10
0
        public void PlayerTurnReady(Fighter fighter)
        {
            if (myState != FightState.WAITING)
                return;

            fighter.TurnReady = true;

            fighter.Character.NClient.Send("BN");

            if (IsAllTurnReady())
                TurnStart();
        }
Example #11
0
 public string FormatFighterDestroy(Fighter fighter)
 {
     return new StringBuilder("GM|-").Append(fighter.ID).ToString();
 }
Example #12
0
        public string FormatFighterShow(Fighter[] fighters)
        {
            StringBuilder builder = new StringBuilder("GM");

            foreach (Fighter fighter in fighters)
                builder.Append("|+").Append(fighter.GetPattern());

            return builder.ToString();
        }
Example #13
0
        public void FightInit(Fighter attacker, Fighter defender)
        {
            FighterJoin(attacker, 0, true);
            FighterJoin(defender, 1, true);

            myMap.Send(FormatFlagShow());
            myMap.Send(myMap.FormatFightCount());
            myMap.Send(FormatFlagFighterShow(myTeam1.Leader));
            myMap.Send(FormatFlagFighterShow(myTeam2.Leader));

            myStartTimeOut = Environment.TickCount + StartTime();
        }
Example #14
0
        public void FighterJoin(Fighter fighter, int team, bool isLeader = false)
        {
            switch (fighter.Type)
            {
                case FighterType.CHARACTER:

                    fighter.Character.GetMap().DelPlayer(fighter.Character);
                    fighter.Character.State.InFight = true;

                    switch (team)
                    {
                        case 0: myTeam1.FighterJoin(fighter, isLeader); break;
                        case 1: myTeam2.FighterJoin(fighter, isLeader); break;
                    }

                    Send(FormatFighterShow(fighter), fighter);

                    if (!isLeader)
                        myMap.Send(FormatFlagFighterShow(fighter));

                    fighter.Character.NClient.Send(FormatJoinInformation());
                    fighter.Character.NClient.Send(FormatJoinPlaces(team));
                    fighter.Character.NClient.Send(FormatFighterShow(GetFighters()));

                    foreach (Fighter forFighter in GetFighters())
                        if (forFighter.FightReady) fighter.Character.NClient.Send(FormatFightReady(forFighter));

                    break;
            }
        }
Example #15
0
        public bool CanLaunchSpell(Fighter fighter, CharacterSpell spell, int spellCell, long target)
        {
            if (fighter != myCurrentFighter)
                return false;

            //if (!myMap.RushablesCells.Contains(spellCell))
            //    return false;

            if (fighter.AP < spell.LevelModel.Cost)
                return false;

            int distance = Pathfinding.GetDistanceBetween(myMap, fighter.Cell, spellCell);
            int maxPO = spell.LevelModel.MaxRP + (spell.LevelModel.isAlterablePO ? fighter.Stats.GetStat(StatEnum.PO).Total : 0);

            if (maxPO < spell.LevelModel.MinRP)
                maxPO = spell.LevelModel.MinRP;

            if (distance > maxPO || distance < spell.LevelModel.MinRP)
                return false;

            return fighter.SpellController.CanLaunchSpell(spell, target);
        }
Example #16
0
        public void PlayerPlace(Fighter fighter, int cell)
        {
            if (myState != FightState.STARTING)
                return;

            if (fighter.FightReady)
                return;

            if (!fighter.Team.IsAvailablePlace(cell))
                return;

            fighter.Cell = cell;

            Send(FormatPlace(fighter));
        }
Example #17
0
 public string FormatFightReady(Fighter fighter)
 {
     return new StringBuilder("GR").Append(fighter.FightReady ? "1" : "0").Append(fighter.ID).ToString();
 }
Example #18
0
        public void PlayerTurnPass(Fighter fighter)
        {
            if (myState != FightState.PLAYING)
                return;

            if (myCurrentFighter != fighter)
                return;

            TurnEnd();
        }
Example #19
0
        public string FormatFlagFighter(Fighter[] fighters)
        {
            StringBuilder builder = new StringBuilder("Gt");
            builder.Append(fighters[0].Team.Leader.ID);

            foreach (Fighter fighter in fighters)
                builder.Append("|+").Append(fighter.ID).Append(";").Append(fighter.Name).Append(";").Append(fighter.Level);

            return builder.ToString();
        }
Example #20
0
        public void Send(string packet, Fighter except = null)
        {
            foreach (Fighter fighter in GetFighters())
                if (fighter != except & fighter.Type == FighterType.CHARACTER && fighter.Character.State.InFight) fighter.Character.NClient.Send(packet);

            foreach (Character spectator in mySpectators)
                spectator.NClient.Send(packet);
        }
Example #21
0
        public int CalculDodgeAPMP(Fighter caster, int lostPoint, bool IsMP = false)
        {
            int realLostPoint = 0;
            int dodgeCaster;
            int dodgeTarget;

            if (!IsMP)
            {
                dodgeCaster = caster.Stats.GetStat(StatEnum.EsquivePA).Total + 1;
                dodgeTarget = Stats.GetStat(StatEnum.EsquivePA).Total + 1;
            }
            else
            {
                dodgeCaster = caster.Stats.GetStat(StatEnum.EsquivePM).Total;
                dodgeTarget = Stats.GetStat(StatEnum.EsquivePM).Total;
            }

            if (dodgeTarget <= 0)
                dodgeTarget = 1;

            for (int i = 0; i < lostPoint; i++)
            {
                int actualPoint = (!IsMP ? AP : MP) - realLostPoint;
                int percentLastPoint = actualPoint / (!IsMP ? AP : MP);
                double chance = 0.5 * (dodgeCaster / dodgeTarget) * percentLastPoint;
                double percentChance = chance * 100;

                if (percentChance > 100) percentChance = 90;
                if (percentChance < 10) percentChance = 10;

                if (Utilities.Basic.Rand(0, 99) < percentChance) realLostPoint++;
            }

            return realLostPoint;
        }
Example #22
0
        public bool TryMove(Fighter fighter, Pathfinding path)
        {
            if (myState != FightState.PLAYING)
                return false;

            if (myCurrentFighter != fighter)
                return false;

            int length = path.GetLength();

            if (length > fighter.MP)
                return false;

            fighter.MP -= length;
            Send("GA;129;" + fighter.ID + ';' + fighter.ID + ",-" + length);

            fighter.Buffs.OnMoveEnd();

            return true;
        }
Example #23
0
 public string FormatPlace(Fighter fighter)
 {
     return new StringBuilder("GIC|").Append(fighter.ID).Append(";").Append(fighter.Cell).Append(";1").ToString();
 }
Example #24
0
 public string FormatFlagFighterShow(Fighter fighter)
 {
     return new StringBuilder("Gt").Append(fighter.Team.Leader.ID).Append("|+").Append(fighter.ID).Append(";").Append(fighter.Name).Append(";").Append(fighter.Level).ToString();
 }
Example #25
0
 public void FighterLeave(Fighter Fighter)
 {
     myFighters.Remove(Fighter);
 }