Example #1
0
        public void CastSpell(Fighter fighter, Game.Spells.WorldSpell spell, int level, int cellid)
        {
            Engines.Spells.SpellLevel spellLevel = spell.Template.Engine.GetLevel(level);

            if (fighter.CurrentAP >= spellLevel.CostPA)
            {
                if (!fighter.CanCastSpell(spellLevel.Engine.Spell.ID))
                {
                    fighter.Client.Action.SystemMessage("Le cooldown du sort n'est pas encore lever !");
                    return;
                }

                fighter.Send("GAS" + fighter.ID);
                fighter.CurrentAP -= spellLevel.CostPA;

                bool failedHit = false;

                if (Utilities.Basic.Rand(0, spellLevel.TauxEC) == 1)
                {
                    failedHit = true;
                }

                if (!failedHit)
                {
                    this.Send("GA;300;" + fighter.ID + ";" + spell.Template.ID + ","
                        + cellid + "," + spell.Template.SpriteID + "," + level + "," + spell.Template.SpriteInfos);

                    bool criticatHit = false;
                    int tauxCC = spellLevel.TauxCC - fighter.Stats.CriticalBonus.Total;
                    if (tauxCC < 2) tauxCC = 2;

                    if (Utilities.Basic.Rand(0, tauxCC) == 1)
                    {
                        criticatHit = true;
                    }

                    if (fighter.IsHuman)
                    {
                        if (fighter.Client.Action.GodMode)
                        {
                            criticatHit = true;
                        }
                    }

                    if (criticatHit && spellLevel.Effects.FindAll(x => x.Effect != Enums.SpellsEffects.DoNothing && x.Effect != Enums.SpellsEffects.None).Count > 0)
                    {
                        this.Send("GA;301;" + fighter.ID + ";" + spell.SpellID);
                        this.ApplyEffects(fighter, spellLevel, spellLevel.Effects, cellid, criticatHit, false);
                    }
                    else
                    {
                        this.ApplyEffects(fighter, spellLevel, spellLevel.CriticalEffects, cellid, criticatHit, false);
                    }

                    //Apply new cooldown (FIXED IN THE 1.0.2.1)
                    if (spellLevel.TurnNumber > 0)
                    {
                        if (!fighter.Cooldowns.ContainsKey(spellLevel.Engine.Spell.ID))
                        {
                            fighter.Cooldowns.Add(spellLevel.Engine.Spell.ID, new FightSpellCooldown(spellLevel.Engine.Spell.ID, spellLevel.TurnNumber));
                        }
                    }
                }
                else
                {
                    this.Send("GA;302;" + fighter.ID + ";" + spell.SpellID);
                    if (spellLevel.ECCanEndTurn)
                    {
                        FinishTurnRequest(fighter);
                    }
                }

                this.Send("GA;102;" + fighter.ID + ";" + fighter.ID + ",-" + spellLevel.CostPA);
                fighter.Send("GAF0|" + fighter.ID);
            }
            else
            {
                fighter.Client.Action.SystemMessage("Le nombre de PA requis est supérieur aux votre actuellement !");
            }
        }
Example #2
0
 public void ChangePlayerPlace(Fighter fighter, int cellID)
 {
     if (fighter.Team.PlacementsPlaces.Contains(cellID))
     {
         if (!fighter.Team.HaveFightersOnThisPlace(cellID) && !fighter.IsReady)
         {
             fighter.CellID = cellID;
             this.Send("GIC|" + fighter.ID + ";" + cellID + ";1");
         }
         else
         {
             fighter.Send("BN");
         }
     }
 }
Example #3
0
        public void UseWeapon(Fighter fighter, int cellID)
        {
            if (fighter.Character.Items.GetItemAtPos(1) != null)
            {
                fighter.Send("GAS" + fighter.ID);

                Database.Records.WorldItemRecord item = fighter.Character.Items.GetItemAtPos(1);

                bool failedHit = false;

                if (Utilities.Basic.Rand(0, item.GetTemplate.Engine.TauxEC) == 1)
                {
                    failedHit = true;
                }

                if (!failedHit)
                {
                    if (fighter.CurrentAP >= item.Engine.CostInPa)
                    {
                        fighter.CurrentAP -= item.Engine.CostInPa;

                        bool criticatHit = false;
                        int tauxCC = item.Engine.TauxCC - fighter.Character.Stats.CriticalBonus.Total;
                        if (tauxCC < 2) tauxCC = 2;

                        if (Utilities.Basic.Rand(0, tauxCC) == 1)
                        {
                            criticatHit = true;
                        }

                        if (fighter.Client.Action.GodMode)
                        {
                            criticatHit = true;
                        }

                        this.Send("GA;303;" + fighter.ID + ";" + cellID);
                        List<Fighter> targets = GetFighterInZoneForWeapon(fighter, item.GetTemplate.Type, cellID);
                        foreach (Fighter target in targets)
                        {
                            foreach (World.Handlers.Items.Effect effect in item.Engine.Effects)
                            {
                                if (item.Engine.IsWeaponEffect(effect.ID))
                                {
                                    int baseDamage = 0;
                                    if (criticatHit)
                                    {
                                        this.Send("GA;301;" + fighter.ID + ";");
                                        baseDamage = Utilities.Basic.Rand(effect.Des.Min, effect.Des.Max);
                                    }
                                    else
                                    {
                                        baseDamage = Utilities.Basic.Rand(effect.Des.Min, effect.Des.Max);
                                    }
                                    if (GetElementForEffect(effect.ID) != 0)
                                    {
                                        int damages = FightSpellEffects.RandomDamages(baseDamage, fighter, GetElementForEffect(effect.ID));
                                        target.TakeDamages(target.ID, -damages, GetElementForEffect(effect.ID));
                                    }
                                    else if(GetStealElementForEffect(effect.ID) != 0)
                                    {
                                        int damages = FightSpellEffects.RandomDamages(baseDamage, fighter, GetStealElementForEffect(effect.ID));
                                        int stealedLife = (int)Math.Truncate((double)(damages / 2));
                                        target.TakeDamages(target.ID, -damages, GetStealElementForEffect(effect.ID));
                                        fighter.Heal(fighter.ID, stealedLife, GetStealElementForEffect(effect.ID));
                                    }
                                }
                            }
                        }
                    }
                    this.Send("GA;102;" + fighter.ID + ";" + fighter.ID + ",-" + item.Engine.CostInPa);
                }
                this.Send("GAF0|" + fighter.ID);
            }
        }
Example #4
0
        public void ShowFightToClient(Fighter fighter)
        {
            this.Send("GM|+" + fighter.DisplayPattern);
            switch (this.FightType)
            {
                case Enums.FightTypeEnum.Challenge:
                    fighter.Send("GJK2|1|1|0|0|0");
                    break;

                case Enums.FightTypeEnum.PvM:
                    fighter.Send("GJK2|0|1|0|29999|4");
                    break;

                case Enums.FightTypeEnum.Kolizeum:
                case Enums.FightTypeEnum.Agression:
                    fighter.Send("GJK2|0|1|0|29999|1");
                    break;
            }
            fighter.Send("GP" + this.DisplayPatternPlace + "|" + fighter.Team.ID);
            fighter.Send("GM" + this.DisplayPatternFighters);
        }
Example #5
0
        public void QuitBattle(Fighter fighter, bool loop = false, bool abandon = false)
        {
            this.Send("GM|-" + fighter.ID);
            if (fighter.IsHuman)
            {
                if (FightType == Enums.FightTypeEnum.PvM)
                {
                    fighter.Character.CurrentLife = 1;
                    World.Network.World.GoToMap(fighter.Client, fighter.Client.Character.SaveMap, fighter.Client.Character.SaveCell);
                }
                else if (abandon && FightType == Enums.FightTypeEnum.Agression)
                {
                    fighter.Client.Character.FactionHonor -= 250;
                    fighter.Client.Action.SystemMessage("Vous avez perdu <b>250</b> points d'honneur suite a votre abandon");
                }
                else if (FightType == Enums.FightTypeEnum.Kolizeum)
                {
                    fighter.Client.Action.KolizeumMessage("Votre combat est terminer, vos points de vie on ete remis au maximum !");
                    fighter.Character.CurrentLife = fighter.Character.Stats.MaxLife;
                    World.Network.World.GoToMap(fighter.Client, fighter.Client.Action.KolizeumLastMapID, fighter.Client.Action.KolizeumLastCellID);
                }
            }
            fighter.Team.Fighters.Remove(fighter);
            switch (this.State)
            {
                case FightState.PlacementsPhase:
                    if (!IsAvailableBattle() && !loop)
                    {
                        foreach (Fighter otherFighter in Fighters)
                        {
                            /* Loop is a true, for prevent stack overflow exception */
                            this.QuitBattle(otherFighter, true);
                        }
                        this.EndFightEngine();
                        this.Map.RemoveFightOnMap(this);
                    }
                    break;

                case FightState.Fighting:
                    if (!IsAvailableBattle() && !loop)
                    {
                        foreach (Fighter otherFighter in Fighters)
                        {
                            /* Loop is a true, for prevent stack overflow exception */
                            this.QuitBattle(otherFighter, true);
                        }
                        this.EndFightResult();
                        this.RedTeam.Fighters.Clear();
                        this.BlueTeam.Fighters.Clear();
                        this.EndFightEngine();
                        this.Map.RemoveFightOnMap(this);
                        this.TimeLine.RemixTimeLine();
                    }
                    break;
            }
            fighter.Buffs.ForEach(x => x.BuffRemoved());
            fighter.Buffs.Clear();
            if (fighter.IsHuman)
            {
                fighter.Character.Fighter = null;
            }
            fighter.Send("GV");
        }
Example #6
0
        public void PlayerWantMove(Fighter fighter, string path)
        {
            if (this.State == FightState.Fighting && this.TimeLine.CurrentFighter.ID == fighter.ID)
            {
                Engines.Pathfinding pathfinding = new Engines.Pathfinding(path, this.Map.Map,
                                                                        fighter.CellID, fighter.Dir);

                int distance = pathfinding.GetDistanceBetween(fighter.CellID, pathfinding.Destination);

                if (fighter.CurrentMP >= distance)
                {
                    string remakePath = pathfinding.GetStartPath + pathfinding.RemakePath();

                    if (fighter.ByWearFighter != null)
                    {
                        fighter.UnWear();
                    }

                    fighter.Send("GAS" + fighter.ID);
                    this.Send("GA0;1;" + fighter.ID + ";" + remakePath);

                    /* Remove MP */
                    fighter.CurrentMP -= distance;

                    fighter.NextCell = pathfinding.Destination;
                    fighter.NextDir = pathfinding.NewDirection;
                }
                else
                {
                    fighter.Send("BN");
                }
            }
            else
            {
                fighter.Send("BN");
            }
        }
Example #7
0
        public void PlayerEndMove(Fighter fighter)
        {
            if (this.State == FightState.Fighting && this.TimeLine.CurrentFighter.ID == fighter.ID)
            {
                if (fighter.NextCell != -1 && fighter.NextDir != -1)
                {
                    int distance = this.Map.PathfindingMaker.GetDistanceBetween(fighter.CellID, fighter.NextCell);
                    this.Send("GA;129;" + fighter.ID + ";" + fighter.ID + ",-" + distance);
                    fighter.Send("GAF2|" + fighter.ID);

                    /* Set new position */
                    fighter.CellID = fighter.NextCell;
                    fighter.Dir = fighter.NextDir;

                    if (fighter.WearedFighter != null)
                    {
                        fighter.WearedFighter.CellID = fighter.CellID;
                        fighter.WearedFighter.Dir = fighter.Dir;
                    }

                    /* Reset next position result for next move */
                    fighter.NextCell = -1;
                    fighter.NextDir = -1;

                    fighter.CurrentUsedPmThisTurn += distance;
                    this.CheckZombieChallenge(fighter);

                    CheckTraps(fighter);
                }
            }
            else
            {
                fighter.Send("BN");
            }
        }