コード例 #1
0
        public void Leave()
        {
            if (!Fight.Started)
            {
                RemoveCompanion();
                Fight.Send(new GameFightRemoveTeamMemberMessage((short)Fight.Id, Team.Id, ContextualId));
                if (Fight.FightType != FightTypeEnum.FIGHT_TYPE_PVP_ARENA)
                {
                    Fight.Map.Instance.OnFighterRemoved(Fight.Id, Team.Id, ContextualId);
                }
                Team.RemoveFighter(this);
                Fight.CheckFightEnd();
                Client.Character.RejoinMap(Fight.SpawnJoin, false);
            }
            else
            {
                if (HasLeft)
                {
                    Client.Character.NotificationError("You already left the fight");
                    return;
                }

                RemoveCompanion();
                if (!Dead)
                {
                    Die();
                }
                HasLeft = true;
                Fight.Synchronizer.Start(AknowlegeAndLeave);
            }
        }
コード例 #2
0
 public void HandleWeaponEffect(short cellid, List <ExtendedSpellEffect> handledEffects, FightSpellCastCriticalEnum critical)
 {
     foreach (var effect in handledEffects)
     {
         Fight.TryStartSequence(ContextualId, 1);
         short[] cells  = ShapesProvider.Handle(effect.ZoneShape, cellid, CellId, effect.ZoneSize).ToArray();
         var     actors = GetAffectedActors(cells, effect.Targets);
         SpellEffectsHandler.Handle(this, null, effect, actors, cellid);
         Fight.TryEndSequence(1, 0);
     }
     Fight.CheckFightEnd();
 }
コード例 #3
0
 public virtual void StartTurn()
 {
     if (CheckFighterDie())
     {
         Fight.CheckFightEnd();
         return;
     }
     IncrementBombs();
     LastTurnPosition = CellId;
     UpdateBuffs();
     DecrementGlyphsDuration();
     ApplyFighterEvent(FighterEventType.ON_TURN_STARTED, null);
     Fight.Send(new GameFightTurnStartMessage(ContextualId, FightTurnEngine.TURN_TIMEMOUT / 100));
     IsPlaying = true;
     RefreshStats();
     m_turnEngine.StartTurn();
 }
コード例 #4
0
ファイル: FightTeam.cs プロジェクト: Zaetic/Symbioz-2.38-RED
        public void KillTeam()
        {
            bool sequence = Fight.SequencesManager.StartSequence(SequenceTypeEnum.SEQUENCE_SPELL);

            foreach (var fighter in GetFighters())
            {
                fighter.Stats.CurrentLifePoints = 0;
            }

            Fight.CheckDeads();
            if (sequence)
            {
                Fight.SequencesManager.EndSequence(SequenceTypeEnum.SEQUENCE_SPELL);
            }

            Fight.CheckFightEnd();
        }
コード例 #5
0
        private bool CloseCombat(SpellLevelRecord level, MapPoint castPoint, string rawZone, ushort weaponGId = 0)
        {
            SpellCastResultEnum canCast = CanCastSpell(level, CellId, castPoint.CellId);

            if (canCast != SpellCastResultEnum.Ok)
            {
                OnSpellCastFailed(canCast, level);
                return(false);
            }

            if (OnWeaponUsedEvt != null)
            {
                OnWeaponUsedEvt(this);
            }

            Fight.SequencesManager.StartSequence(SequenceTypeEnum.SEQUENCE_WEAPON);

            FightSpellCastCriticalEnum fightSpellCastCriticalEnum = this.RollCriticalDice(level);
            bool criticalHit = fightSpellCastCriticalEnum == FightSpellCastCriticalEnum.CRITICAL_HIT;

            EffectInstance[] effects = (criticalHit ? level.CriticalEffects : level.Effects).ToArray();



            Fight.Send(new GameActionFightCloseCombatMessage((ushort)ActionsEnum.ACTION_FIGHT_CLOSE_COMBAT,
                                                             Id, false, false, 0, castPoint.CellId, (sbyte)fightSpellCastCriticalEnum, weaponGId));

            SpellEffectsManager.Instance.HandleEffects(this, effects, level, castPoint, rawZone,
                                                       WeaponManager.WeaponTargetMask, criticalHit);



            this.UseAp(level.ApCost);

            this.OnSpellCasted(level, CellId, fightSpellCastCriticalEnum);
            Fight.SequencesManager.EndSequence(SequenceTypeEnum.SEQUENCE_WEAPON);
            Fight.CheckDeads();
            Fight.CheckFightEnd();
            return(true);
        }
コード例 #6
0
        public void UsePunch(short cellid)
        {
            Fight.TryStartSequence(this.ContextualId, 2);
            Fighter          target = Fight.GetFighter(cellid);
            SpellLevelRecord spell  = GetSpellLevel((ushort)PUNCH_SPELL);

            if (target != null)
            {
                Fight.Send(new GameActionFightCloseCombatMessage(0, this.ContextualId, target.ContextualId, cellid, 0, false, 0));
                var jet = CalculateJet(spell.Effects[0], FighterStats.Stats.Strength);
                target.TakeDamages(new TakenDamages(jet, ElementType.Earth), this.ContextualId);
            }
            else
            {
                Fight.Send(new GameActionFightCloseCombatMessage(0, this.ContextualId, 0, cellid, 0, false, 0));
            }
            GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_USE, (short)-spell.ApCost);
            FighterStats.Stats.ActionPoints -= spell.ApCost;
            RefreshStats();
            Fight.TryEndSequence(2, 0);

            Fight.CheckFightEnd();
        }
コード例 #7
0
        public void AknowlegeAndLeave()
        {
            try // if two players leave at the same time, because of non acknowlege action
            {
                if (IsPlaying)
                {
                    EndTurn();
                }
                Fight.CheckFightEnd();
                Fight.Send(new GameFightLeaveMessage(ContextualId));

                if (Fight.Started && Fight.FightType != FightTypeEnum.FIGHT_TYPE_PVP_ARENA)
                {
                    Fight.ShowFightResults(Fight.GetFightResults(GetOposedTeam().TeamColor), Client);
                }
                if (Fight.FightType == FightTypeEnum.FIGHT_TYPE_PVP_ARENA)
                {
                    Client.Send(new GameRolePlayArenaRegistrationStatusMessage(false, (sbyte)PvpArenaStepEnum.ARENA_STEP_UNREGISTER, ArenaProvider.FIGHTERS_PER_TEAM));
                }
                Client.Character.RejoinMap(Fight.SpawnJoin, false);
            }
            catch { }
        }
コード例 #8
0
        public void Leave(bool teleportToSpawn)
        {
            if (!Fight.Started)
            {
                Team.RemoveFighter(this);

                if (OnLeavePreFightEvt != null)
                {
                    OnLeavePreFightEvt();
                }


                if (!Fight.CheckFightEnd())
                {
                    Fight.CheckFightStart();
                }

                if (teleportToSpawn)
                {
                    Character.RejoinMap(Fight.FightType, false, Fight.SpawnJoin);
                }
                else
                {
                    Character.RejoinMap(Fight.FightType, false, false);
                }
            }
            else
            {
                if (!Left)
                {
                    if (Alive)
                    {
                        this.Stats.CurrentLifePoints = 0;
                        this.Fight.CheckDeads();
                    }
                    if (!Fight.Ended)
                    {
                        Synchronizer sync = new Synchronizer(this.Fight, new PlayableFighter[]
                        {
                            this
                        });
                        sync.Success += delegate(Synchronizer obj)
                        {
                            this.OnPlayerReadyToLeave();
                        };
                        sync.Timeout += delegate(Synchronizer obj, PlayableFighter[] laggers)
                        {
                            this.OnPlayerReadyToLeave();
                        };
                        this.PersonalSynchronizer = sync;
                        sync.Start();
                    }
                    //if (Fight.SequencesManager.SequencesCount == 0)
                    //    OnPlayerReadyToLeave();
                    //else
                    //{
                    //    this.WaitAcknolegement = true;
                    //    this.OnSequencesAcknowleged = OnPlayerReadyToLeave;
                    //}

                    this.Left = true;
                }
            }
        }
コード例 #9
0
        public virtual bool CastSpellOnCell(ushort spellid, short cellid, int targetId = 0)
        {
            SpellLevelRecord spellLevl = GetSpellLevel(spellid);

            if (!IsPlaying)
            {
                OnSpellCastFailed(CastFailedReason.NOT_PLAYING, spellLevl);
                return(false);
            }
            if (Fight.Ended)
            {
                OnSpellCastFailed(CastFailedReason.FIGHT_ENDED, spellLevl);
                return(false);
            }

            if (!ValidState(spellLevl))
            {
                OnSpellCastFailed(CastFailedReason.FORBIDDEN_STATE, spellLevl);
                return(false);
            }
            if (spellLevl.ApCost > FighterStats.Stats.ActionPoints)
            {
                OnSpellCastFailed(CastFailedReason.AP_COST, spellLevl);
                return(false);
            }
            if ((SpellIdEnum)spellid == SpellIdEnum.Punch)
            {
                UsingWeapon = true;
                bool result = UseWeapon(cellid);
                UsingWeapon = false;
                return(result);
            }
            if (targetId == 0)
            {
                var target = Fight.GetFighter(cellid);
                if (target != null)
                {
                    targetId = target.ContextualId;
                }
            }
            if (!SpellHistory.CanCast(spellLevl, targetId))
            {
                OnSpellCastFailed(CastFailedReason.CAST_LIMIT, spellLevl);
                return(false);
            }

            this.Fight.TryStartSequence(this.ContextualId, 1);
            FightSpellCastCriticalEnum critical = RollCriticalDice(spellLevl);

            short[] portals = new short[0];// WHAT THE F**K

            this.Fight.Send(new GameActionFightSpellCastMessage(0, ContextualId, targetId, cellid, (sbyte)critical, false, spellid, spellLevl.Grade, portals));
            this.SpellHistory.Add(spellLevl, targetId);

            #region EffectHandler

            if (CustomSpellEffectsProvider.Exist(spellid))
            {
                Fight.TryStartSequence(ContextualId, 1);
                CustomSpellEffectsProvider.Handle(spellid, spellLevl.Effects, this);
                Fight.TryEndSequence(1, 0);
            }
            else
            {
                HandleSpellEffects(spellLevl, cellid, critical);
            }
            #endregion

            FighterStats.Stats.ActionPoints -= spellLevl.ApCost;
            GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_USE, (short)-spellLevl.ApCost);
            if (CharacterRecord.GetCharacterRecordById(this.ContextualId) != null && CharacterRecord.GetCharacterRecordById(this.ContextualId).GodMod)
            {
                FighterStats.Stats.ActionPoints += spellLevl.ApCost;
                GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_WIN, (short)spellLevl.ApCost);
            }
            Fight.CheckFightEnd();

            if (Fight.Ended)
            {
                return(true);
            }
            RefreshStats();
            OnSpellCasted(spellLevl);
            this.Fight.TryEndSequence(1, 100);
            ApplyFighterEvent(FighterEventType.AFTER_USED_AP, spellLevl.ApCost);
            return(true);
        }
コード例 #10
0
        public override bool CastSpell(SpellCastInformations cast)
        {
            if (!IsFighterTurn() && !cast.Force)
            {
                return(false);
            }

            // not a weapon attack
            if (cast.Spell.Id != 0 || Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON) == null)
            {
                return(base.CastSpell(cast));
            }

            var weapon = Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON);

            if (!(weapon.Template is WeaponTemplate weaponTemplate) || !CanUseWeapon(cast.TargetedCell, weaponTemplate))
            {
                OnSpellCastFailed(cast);
                return(false);
            }

            using (Fight.StartSequence(SequenceTypeEnum.SEQUENCE_WEAPON))
            {
                var random   = new AsyncRandom();
                var critical = RollCriticalDice(weaponTemplate);

                switch (critical)
                {
                case FightSpellCastCriticalEnum.CRITICAL_FAIL:
                    OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, false);

                    if (!cast.ApFree)
                    {
                        UseAP((short)weaponTemplate.ApCost);
                    }

                    PassTurn();

                    return(false);

                case FightSpellCastCriticalEnum.CRITICAL_HIT:
                    m_criticalWeaponBonus = weaponTemplate.CriticalHitBonus;
                    break;
                }

                m_isUsingWeapon = true;
                var effects =
                    weapon.Effects.Where(entry => EffectManager.Instance.IsUnRandomableWeaponEffect(entry.EffectId)).OfType <EffectDice>();
                var handlers = new List <SpellEffectHandler>();
                foreach (var effect in effects)
                {
                    if (effect.Random > 0)
                    {
                        if (random.NextDouble() > effect.Random / 100d)
                        {
                            // effect ignored
                            continue;
                        }
                    }

                    var handler = EffectManager.Instance.GetSpellEffectHandler(effect, this, new DefaultSpellCastHandler(cast), cast.TargetedCell,
                                                                               critical == FightSpellCastCriticalEnum.CRITICAL_HIT);

                    handler.EffectZone = new Zone(weaponTemplate.Type.ZoneShape, (byte)weaponTemplate.Type.ZoneSize, (byte)weaponTemplate.Type.ZoneMinSize,
                                                  handler.CastPoint.OrientationTo(handler.TargetedPoint), (int)weaponTemplate.Type.ZoneEfficiencyPercent, (int)weaponTemplate.Type.ZoneMaxEfficiency);

                    handler.Targets = new TargetCriterion[]
                    { new TargetTypeCriterion(SpellTargetType.ALLY_ALL_EXCEPT_SELF, false), new TargetTypeCriterion(SpellTargetType.ENEMY_ALL, false) };     // everyone but caster

                    handlers.Add(handler);
                }

                var silentCast = handlers.Any(entry => entry.RequireSilentCast());

                OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, silentCast);

                if (!cast.ApFree)
                {
                    UseAP((short)weaponTemplate.ApCost);
                }

                foreach (var handler in handlers)
                {
                    handler.Apply();
                }
            }

            m_isUsingWeapon       = false;
            m_criticalWeaponBonus = 0;

            // is it the right place to do that ?
            Fight.CheckFightEnd();

            return(true);
        }