Esempio n. 1
0
        public int CalculateDamage(IPokemon pokemon, IPokemon target)
        {
            int damage = 0;

            if (AdditionalEffects.ContainsEffectType(typeof(AlwaysSameDamage)))
            {
                AlwaysSameDamage alwaysSameDamage = AdditionalEffects.First(e => e is AlwaysSameDamage) as AlwaysSameDamage;
                damage = alwaysSameDamage.IsBasedOnLevel() ? pokemon.Level : (int)alwaysSameDamage.PrimaryParameter;
            }

            if (damage == 0 && Power.HasValue)
            {
                damage = DamageCalculator.CalculateAttackDamage(this, pokemon, target);
                if (damage < 1)
                {
                    damage = 1;
                }
                if (BattleHelper.IsCritical(AdditionalEffects, pokemon.IsEnergyFocused))
                {
                    damage *= 2;
                    //_battleLogController.SetText("Critical hit!");
                }
            }
            return(damage);
        }
Esempio n. 2
0
        /// <inheritdoc />
        public override AttackResult CalculateDamages()
        {
            var attackResult = new AttackResult
            {
                Flags = AttackFlags.AF_MAGIC
            };

            AttackResult weaponAttackResult = null;

            if (Attacker is IPlayerEntity player)
            {
                Item wandWeapon = player.Inventory.GetEquipedItem(ItemPartType.RightWeapon) ?? player.Hand;

                weaponAttackResult = BattleHelper.GetWeaponAttackPower(Attacker, wandWeapon);
                var weaponAttackDamages = BattleHelper.GetWeaponAttackDamages(WeaponType.MAGIC_WAND, player);

                weaponAttackResult.AttackMin += weaponAttackDamages;
                weaponAttackResult.AttackMax += weaponAttackDamages;
            }

            if (weaponAttackResult != null)
            {
                attackResult.Damages  = RandomHelper.Random(weaponAttackResult.AttackMin, weaponAttackResult.AttackMax);
                attackResult.Damages += Math.Max(0, Attacker.Attributes[DefineAttributes.CHR_DMG]);
                attackResult.Damages  = (int)(attackResult.Damages * GetWandAttackMultiplier());
            }

            return(attackResult);
        }
Esempio n. 3
0
        private static void ActionSequence(Character activePlayer, Character reactivePlayer, BaseAction activePlayerAction, List <ActionStep> steps)
        {
            steps.Add(new ActionStep {
                Author = activePlayer, StepMessage = activePlayer.Name.ToString() + ":look-at"
            });


            var damage = activePlayerAction.Power;

            var step = new ActionStep
            {
                Author      = activePlayer,
                StepMessage = activePlayer.Name.ToString() + ":hit",
                ActionRef   = activePlayerAction,
                StepType    = ActionStepType.Attack
            };

            step.Run = delegate()
            {
                if (BattleHelper.CheckAttackRange(activePlayer.Position, reactivePlayer.Position, activePlayerAction.MinRange, activePlayerAction.MaxRange))
                {
                    reactivePlayer.HP -= damage;
                }

                activePlayer.Position = activePlayerAction.MoveTo;
            };

            steps.Add(step);
        }
Esempio n. 4
0
 IEnumerator StartSpawnFoods()
 {
     while (true)
     {
         var spawnFoodCount = Constants.INIT_FOOD_COUNT - battle.IdToFoods.Count;
         // 获取最大食物 id
         PlayArray spawnFoods = new PlayArray();
         var       nextFoodId = battle.NextFoodId;
         for (int i = 0; i < spawnFoodCount; i++)
         {
             var foodId  = nextFoodId + i;
             var foodPos = BattleHelper.RandomPos();
             var food    = new Food {
                 Id   = foodId,
                 Type = i % 3,
                 X    = foodPos.X,
                 Y    = foodPos.Y
             };
             spawnFoods.Add(food);
         }
         var eventData = new PlayObject {
             { "foods", spawnFoods },
             { "nextFoodId", nextFoodId + spawnFoodCount }
         };
         var client = LeanCloudUtils.GetClient();
         client.SendEvent(Constants.SPAWN_FOOD_EVENT, eventData);
         yield return(new WaitForSeconds(Constants.SPWAN_FOOD_DURATION));
     }
 }
Esempio n. 5
0
        public override void Update(SkillObjMoveController ctrl, SkillBulletMove move, float deltaTime, float timeMS)
        {
            double MoveDir = move.GetSpeedDirection_Radian();
            int    tarId   = ctrl.GetTarID();
            var    target  = ctrl.GetTar();

            if (target != null && !target.IsDead())
            {
                MoveDir = BattleHelper.Radian2PI(MoveDir);
                var         tarPos  = target.GetPos();
                Vector3_Hzy selfPos = ctrl.GetPos();
                double      radian  = BattleHelper.RadianA2B_2D(tarPos, selfPos);
                radian = BattleHelper.Radian2PI(radian);
                if (radian != MoveDir)
                {
                    float  tickRadian   = ctrl.GetMovingFloatParam(Key_TickRadian_MovingFloatParam);
                    double something    = ((5 + tickRadian) * System.Math.PI / 180);
                    double changeRadian = BattleHelper.RadianA2B_Sym(radian, MoveDir, something);
                    tickRadian += deltaTime * 0.6f / 30;
                    ctrl.SetMovingFloatParam(Key_TickRadian_MovingFloatParam, tickRadian);
                    MoveDir = BattleHelper.Radian2PI(MoveDir + changeRadian);
                    move.SetSpeedDirection((float)MoveDir);
                }
            }
            else
            {
                ctrl.SetLifeTime(-1);
                return;
            }
            base.Update(ctrl, move, deltaTime, timeMS);
        }
Esempio n. 6
0
        /// <summary>
        /// Gets the attacker skill power.
        /// </summary>
        /// <returns>Skill power.</returns>
        protected int GetAttackerSkillPower()
        {
            var referStatistic1 = Attacker.Attributes[Skill.Data.ReferStat1];
            var referStatistic2 = Attacker.Attributes[Skill.Data.ReferStat2];

            if (Skill.Data.ReferTarget1 == SkillReferTargetType.Attack && referStatistic1 != 0)
            {
                referStatistic1 = (int)(Skill.Data.ReferValue1 / 10f * referStatistic1 + Skill.Level * (referStatistic1 / 50f));
            }

            if (Skill.Data.ReferTarget2 == SkillReferTargetType.Attack && referStatistic2 != 0)
            {
                referStatistic2 = (int)(Skill.Data.ReferValue2 / 10f * referStatistic2 + Skill.Level * (referStatistic2 / 50f));
            }

            var referStatistic = referStatistic1 + referStatistic2;
            int attackMin;
            int attackMax;

            if (Attacker.Type == WorldEntityType.Player && Defender.Type == WorldEntityType.Player)
            {
                attackMin = Skill.LevelData.AbilityMinPVP;
                attackMax = Skill.LevelData.AbilityMaxPVP;
            }
            else
            {
                attackMin = Skill.LevelData.AbilityMin;
                attackMax = Skill.LevelData.AbilityMax;
            }

            Item weaponItem = Attacker.Hand;

            if (Attacker is IPlayerEntity player)
            {
                weaponItem = player.Inventory.GetEquipedItem(ItemPartType.RightWeapon);

                if (weaponItem.Id == -1)
                {
                    weaponItem = InventorySystem.Hand;
                }
            }

            AttackResult weaponAttackPower  = BattleHelper.GetWeaponAttackPower(Attacker, weaponItem);
            var          weaponExtraDamages = BattleHelper.GetWeaponExtraDamages(Attacker, weaponItem);

            attackMin += weaponItem.Data.AttackSkillMin;
            attackMax += weaponItem.Data.AttackSkillMax;

            float powerMin = (weaponAttackPower.AttackMin + attackMin * 5 + referStatistic - 20) * (16 + Skill.Level) / 13;
            float powerMax = (weaponAttackPower.AttackMax + attackMax * 5 + referStatistic - 20) * (16 + Skill.Level) / 13;

            // TODO: check CHR_DMG
            powerMin += weaponExtraDamages;
            powerMax += weaponExtraDamages;

            var attackMinMax = Math.Max(powerMax - powerMin + 1, 1);

            return((int)(powerMin + RandomHelper.FloatRandom(1f, attackMinMax)));
        }
Esempio n. 7
0
 public QueueService(
     IBattleService battleService)
 {
     _battleService = battleService;
     _botsRandom    = new Random();
     _bots          = new HashSet <BotDefinition>();
     _queues        = BattleHelper.GetNewModeQueue();
 }
Esempio n. 8
0
        public void ProcessMessage(GameReady gameReadyMessage)
        {
            battleViewer.DisableCancelFindButton();
            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            LocalPlayer  = new LocalPlayer(battleViewer, kernelPlayer1, this, gameManager.UserName);
            OnlinePlayer = new OnlinePlayer(kernelPlayer2, this, gameReadyMessage.Opponent.Login);
            ((OnlinePlayer)OnlinePlayer).OnEnable();
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameReadyMessage.OpponentTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);

            // The opponent team is obtained from the server with the correctly set positions.
            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, gameReadyMessage.OpponentTeam.Positions.ToArray());

            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(gameReadyMessage.MapId, battleViewer.GameMode);

            var fruitons = new haxe.root.Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            IsLocalPlayerFirst = gameReadyMessage.StartsFirst;
            Player player1;
            Player player2;

            // If the local player begins, the game will be started with kernelPlayer1 as first argument.
            if (IsLocalPlayerFirst)
            {
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, GameManager.Instance.CurrentFruitonTeam.Positions.ToArray());
                player1 = kernelPlayer1;
                player2 = kernelPlayer2;
            }
            // If the online opponent begins, we need to flip the positions to the opposite side because we do not receive
            // the new positions from the server. The first argument has to be the online opponent = kernelPlayer2.
            else
            {
                var width            = GameState.WIDTH;
                var height           = GameState.HEIGHT;
                var flippedPositions = BattleHelper.FlipCoordinates(GameManager.Instance.CurrentFruitonTeam.Positions, width, height);
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, flippedPositions.ToArray());
                player1 = kernelPlayer2;
                player2 = kernelPlayer1;
                battleViewer.DisableEndTurnButton();
            }
            Kernel = new Kernel(player1, player2, fruitons, kernelSettings, false, false);

            SendReadyMessage();
            battleViewer.InitializePlayersInfo();
            BattleReady();
        }
Esempio n. 9
0
        public AIBattle(BattleViewer battleViewer, AIType aiType)
            : base(battleViewer)
        {
            int[] aiTeamIDs;

            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            HumanPlayer = new LocalPlayer(battleViewer, kernelPlayer1, this, GameManager.Instance.UserName);
            AiPlayer    = CreateAI(aiType, battleViewer, kernelPlayer2, this, out aiTeamIDs);

            IEnumerable <GameObject> humanTeam;
            IEnumerable <Position>   coords;
            IEnumerable <Position>   flippedCoords;
            IEnumerable <GameObject> aiTeam = ClientFruitonFactory.CreateClientFruitonTeam(aiTeamIDs, battleViewer.Board);

            if (aiType == AIType.Tutorial)
            {
                int[] humanTeamIDs = { 2, 5, 15, 14, 12, 17, 21, 21, 30, 25 };
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(humanTeamIDs, battleViewer.Board);
                coords    = Tutorial.CreatePositionsForArtificialTeam(humanTeam.Select(gameObject =>
                                                                                       gameObject.GetComponent <ClientFruiton>().KernelFruiton));
            }
            else
            {
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
                coords    = gameManager.CurrentFruitonTeam.Positions;
            }
            battleViewer.InitializeTeam(humanTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);
            battleViewer.InitializeTeam(aiTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in humanTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in aiTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            bool infiniteTurnTime = battleViewer.battleType == BattleType.TutorialBattle;

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, infiniteTurnTime);
            BattleReady();
        }
Esempio n. 10
0
 public IEnumerable <SynchronizerDto> GetAllUserSynchronizationInfos(string userId)
 {
     return(_scenes
            .Where(scene => scene.IsActive && scene.ShortPlayers.FirstOrDefault(x => x.UserId == userId && !x.Left) != null)
            .Select(scene =>
     {
         var player = scene.ShortPlayers.First(x => x.UserId == userId);
         var synchronizer = BattleHelper.GetFullSynchronizationData(scene, userId);
         BattleHelper.CalculateReward(ref synchronizer, scene, player.Id);
         return synchronizer;
     })
            .ToHashSet());
 }
Esempio n. 11
0
    void OnBallAndBallCollision(BallCollisionArgs args)
    {
        var ball1 = args.Ball1;
        var ball2 = args.Ball2;
        // 判断胜负
        var    weight1 = ball1.Player.CustomProperties.GetFloat("weight");
        var    weight2 = ball2.Player.CustomProperties.GetFloat("weight");
        Player winner, loser;

        if (weight1 > weight2)
        {
            winner = ball1.Player;
            loser  = ball2.Player;
        }
        else
        {
            winner = ball2.Player;
            loser  = ball1.Player;
        }
        var winnerWeight = weight1 + weight2;
        var props        = new PlayObject {
            { "weight", winnerWeight }
        };

        // 设置胜利方
        winner.SetCustomProperties(props);
        // 重置失败方
        var loserWeight = Mathf.Pow(Constants.BORN_SIZE, 2);
        var pos         = BattleHelper.RandomPos();

        props = new PlayObject {
            { "pos", pos },
            { "weight", loserWeight },
            { "move", null }
        };
        loser.SetCustomProperties(props);
        // 通知胜负情况
        var client    = LeanCloudUtils.GetClient();
        var eventData = new PlayObject {
            { "winnerId", winner.ActorId },
            { "loserId", loser.ActorId }
        };

        client.SendEvent(Constants.KILL_EVENT, eventData);
        // 通知重生
        eventData = new PlayObject {
            { "playerId", loser.ActorId }
        };
        client.SendEvent(Constants.REBORN_EVENT, eventData);
    }
    public void SetInfo(int rank, string name, int weight, bool isLocal)
    {
        var color = Color.white;

        if (isLocal)
        {
            color = Color.yellow;
        }
        rankText.color   = color;
        nameText.color   = color;
        weightText.color = color;

        rankText.text   = rank.ToString();
        nameText.text   = name;
        weightText.text = BattleHelper.ToReadableWeight(weight);
    }
    public void OnClick()
    {
        A_TypeEffectiveness typeEffectiveness = BattleHelper.GetTypeEffectiveness(AttackType, DefendType0, DefendType1);

        if (DefendType1 != P_Type.none)
        {
            Logger.Debug(GetType(), "'" + AttackType.ToString() + "' is '" + typeEffectiveness.ToString() + "' on '" +
                         DefendType0.ToString() + "' & '" + DefendType1.ToString() + "'.");
        }
        else
        {
            Logger.Debug(GetType(), "'" + AttackType.ToString() + "' is '" + typeEffectiveness.ToString() + "' on '" +
                         DefendType0.ToString() + "'.");
        }

        Logger.Debug(GetType(), TypeData.GetColor(AttackType).ToString());
    }
Esempio n. 14
0
        public SynchronizerDto GetUserSynchronizationInfo(string userId, Guid?sceneId)
        {
            IScene scene;

            scene = _scenes
                    .FirstOrDefault(scene => scene.IsActive &&
                                    (sceneId == null || sceneId == scene.Id) &&
                                    scene.ShortPlayers.FirstOrDefault(x => x.UserId == userId && !x.Left) != null);

            if (scene == null)
            {
                return(null);
            }

            var player       = scene.ShortPlayers.First(x => x.UserId == userId);
            var synchronizer = BattleHelper.GetFullSynchronizationData(scene, userId);

            BattleHelper.CalculateReward(ref synchronizer, scene, player.Id);
            return(synchronizer);
        }
Esempio n. 15
0
        public bool IsAbleToAttack()
        {
            if (IsFlinched)
            {
                IsFlinched = false;
                //_battleLogController.SetText($"{attackingPokemon.Name} is flinched");
                return(false);
            }

            if (IsConfused && BattleHelper.HasFailedConfusion(this))
            {
                var confusionHit = PokemonAttacksFactory.CreateAttack("ConfusionHit");
                int damage       = DamageCalculator.CalculateAttackDamage(confusionHit, this, this);
                Hurt(damage);

                //_battleLogController.SetText($"{attackingPokemon.Name} hurts itself in its confusion");
                return(IsPokemonAlive());
            }

            return(true);
        }
Esempio n. 16
0
    async void NewPlayer(Player player)
    {
        var weight = Mathf.Pow(Constants.BORN_SIZE, 2);
        var pos    = BattleHelper.RandomPos();
        var props  = new PlayObject {
            { "weight", weight },
            { "pos", pos }
        };
        await player.SetCustomProperties(props);

        var client = LeanCloudUtils.GetClient();
        // 打包内存中的食物数据
        var foods     = battle.GetFoods();
        var eventData = new PlayObject {
            { "foods", foods }
        };
        await client.SendEvent(Constants.BORN_EVENT, eventData, new SendEventOptions {
            TargetActorIds = new List <int> {
                player.ActorId
            }
        });

        // 告知「其他玩家」有新玩家加入
        var otherIds = new List <int>();

        foreach (Player p in client.Room.PlayerList)
        {
            if (p == player)
            {
                continue;
            }
            otherIds.Add(p.ActorId);
        }
        eventData = new PlayObject {
            { "pId", player.ActorId }
        };
        await client.SendEvent(Constants.PLAYER_JOINED_EVENT, eventData, new SendEventOptions {
            TargetActorIds = otherIds
        });
    }
Esempio n. 17
0
    public bool AttackCharacter(Vector2 from, Vector2 to)
    {
        var attacker = GetCharacterFromTile(from);
        var defender = GetCharacterFromTile(to);                             //TODO: Change to get all defenders in range (pass range of attack).

        var tile   = GetTile(to);                                            //TODO: Idem defender.
        var damage = BattleHelper.CalculateDamage(attacker, defender, tile); // TODO: foreach defender.

        attacker.Attack(to);
        defender.GetHit(damage); //TODO: do "on hit" del defender, pasarle daño, que el mismo defender chequee si muere o no.
        if (defender.Stats.HP <= 0)
        {
            attacker.GainExp(30);
            UIManager.CreateExpText(attacker, 30, 2f);
            Personajes.Remove(defender);
        }
        else
        {
            attacker.GainExp(10);
            UIManager.CreateExpText(attacker, 10, 2f);
        }
        return(true);
    }
Esempio n. 18
0
        private void SynchronizationInfoEventHandler(object sender, ISyncEventArgs e)
        {
            var battleHub = _serviceProvider.GetRequiredService <IHubContext <ArenaHub.ArenaHub> >();

            string actionName = BattleHelper.GetBattleActionMethodName(e.Action);

            var uniqueUsers = e.Scene.ShortPlayers
                              .GroupBy(key => key.UserId, res => res, (key, res) => new
            {
                UserId  = key,
                Players = res
            })
                              .ToList();

            foreach (var userPlayers in uniqueUsers)
            {
                if (userPlayers.Players.All(x => x.Left))
                {
                    continue;
                }

                var user = battleHub.Clients.User(userPlayers.UserId);
                if (user != null)
                {
                    var synchronizer = BattleHelper.MapSynchronizer(e, userPlayers.UserId);
                    foreach (var player in userPlayers.Players)
                    {
                        if (BattleHelper.CalculateReward(ref synchronizer, e.Scene, player.Id))
                        {
                            Task.Run(async() => await PayRewardAsync(synchronizer.Reward, player.UserId));
                        }
                    }

                    battleHub.Clients.User(userPlayers.UserId).SendAsync(actionName, synchronizer);
                }
            }
        }
Esempio n. 19
0
        public OfflineBattle(BattleViewer battleViewer) : base(battleViewer)
        {
            var    kernelPlayer1 = new Player(0);
            var    kernelPlayer2 = new Player(1);
            string login         = GameManager.Instance.UserName;

            Player1 = new LocalPlayer(battleViewer, kernelPlayer1, this, "Player 1");
            Player2 = new LocalPlayer(battleViewer, kernelPlayer2, this, "Player 2");

            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.OfflineOpponentTeam.FruitonIDs, battleViewer.Board);

            RepeatedField <Position> coords = gameManager.CurrentFruitonTeam.Positions;

            battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            RepeatedField <Position> flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);

            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, false);
            BattleReady();
        }
Esempio n. 20
0
    //执行指令
    public void ExecuteCommand(string command, List <GameObject> paraGameObjects)
    {
        if (string.IsNullOrEmpty(command))
        {
            return;
        }

        m_ParaGameObjects = paraGameObjects;

        string cmd   = command.Split('#')[0].ToLower();
        string value = command.Substring(cmd.Length + 1); //command.Split('#')[1];

        if (cmd == "dialog")
        {
            //dialogPanel.Show("", value, null);
            Jyx2_UIManager.Instance.ShowUI("ChatUIPanel", ChatType.RoleKey, "", value);
        }
        else if (cmd == "selfsay")
        {
            GameRuntimeData.Instance.Player.View.Say(value);
        }
        else if (cmd == "loadlevel")
        {
            SceneManager.LoadScene(value);
        }
        else if (cmd == "loadmap")
        {
            var loadPara = new LevelMaster.LevelLoadPara()
            {
                loadType = LevelMaster.LevelLoadPara.LevelLoadType.Load
            };
            LevelLoader.LoadGameMap(value, loadPara);
        }
        else if (cmd == "mapevt")
        {
            MapEvt mapEvt = ConfigTable.Get <MapEvt>(value);

            if (mapEvt != null)
            {
                //如果已经执行过,返回
                if (mapEvt.IsFinished(runtime))
                {
                    return;
                }

                //标记为正在执行
                mapEvt.MarkAsExecuting(runtime);

                m_CurrentMapEvt = mapEvt;
                PlayStory(mapEvt.ExecuteCode.Split('\n'), mapEvt.Result);
            }
            else
            {
                Debug.LogError("载入了错误的mapevt:" + value);
            }
        }
        else if (cmd == "timeline")
        {
            PlayTimeline(value, null);
        }
        else if (cmd == "runtimestory")
        {
            PlayStory(new string[] { value }, "");
        }
        else if (cmd == "transport")
        {
            var levelMaster = FindObjectOfType <LevelMaster>();
            levelMaster.Transport(value);
        }
        else if (cmd == "win")
        {
            BattleHelper battleHelper = FindObjectOfType <BattleHelper>();
            var          model        = battleHelper.GetModel();
            foreach (var role in model.Roles)
            {
                if (role.team != 0)
                {
                    role.Hp = 0;
                }
                role.CheckDeath();
            }

            HSUtilsEx.CallWithDelay(this, () => {
                battleHelper.SwitchStatesTo(BattleHelper.BattleViewStates.WaitingForNextActiveBattleRole);
            }, 1f);
        }
        else if (cmd == "lose")
        {
            BattleHelper battleHelper = FindObjectOfType <BattleHelper>();
            var          model        = battleHelper.GetModel();
            foreach (var role in model.Roles)
            {
                if (role.team == 0)
                {
                    role.Hp = 0;
                }
                role.CheckDeath();
            }
            HSUtilsEx.CallWithDelay(this, () =>
            {
                battleHelper.SwitchStatesTo(BattleHelper.BattleViewStates.WaitingForNextActiveBattleRole);
            }, 1f);
        }
        else if (cmd == "testlua")
        {
            LuaExecutor.Execute(value);
        }
        else if (cmd == "jyx2event")
        {
            LuaExecutor.Execute("jygame/ka" + value);
        }
        else if (cmd == "battle")
        {
            LevelLoader.LoadBattle(int.Parse(value), null);
        }
    }
Esempio n. 21
0
 public bool OnRange(int oponentPosition)
 {
     return(BattleHelper.CheckAttackRange(this.Author.Position, oponentPosition, this.ActionRef.MinRange, this.ActionRef.MaxRange));
 }
Esempio n. 22
0
        /// <inheritdoc />
        public override AttackResult CalculateDamages()
        {
            var attackResult = new AttackResult
            {
                Flags = GetAttackFlags()
            };

            if (attackResult.Flags.HasFlag(AttackFlags.AF_MISS))
            {
                return(attackResult);
            }

            if (Attacker is IPlayerEntity player)
            {
                Item rightWeapon = player.Inventory.GetEquipedItem(ItemPartType.RightWeapon) ?? player.Hand;

                // TODO: GetDamagePropertyFactor()
                var weaponAttack = BattleHelper.GetWeaponAttackDamages(rightWeapon.Data.WeaponType, player);
                attackResult.AttackMin = rightWeapon.Data.AbilityMin * 2 + weaponAttack;
                attackResult.AttackMax = rightWeapon.Data.AbilityMax * 2 + weaponAttack;
            }
            else if (Attacker is IMonsterEntity monster)
            {
                if (attackResult.Flags.HasFlag(AttackFlags.AF_MISS))
                {
                    return(attackResult);
                }

                attackResult.AttackMin = monster.Data.AttackMin;
                attackResult.AttackMax = monster.Data.AttackMax;
            }

            if (IsCriticalAttack(Attacker, attackResult.Flags))
            {
                attackResult.Flags |= AttackFlags.AF_CRITICAL;
                CalculateCriticalDamages(attackResult);

                if (IsKnockback(attackResult.Flags))
                {
                    attackResult.Flags |= AttackFlags.AF_FLYING;
                }
            }

            attackResult.Damages  = RandomHelper.Random(attackResult.AttackMin, attackResult.AttackMax);
            attackResult.Damages -= GetDefenderDefense(attackResult);

            if (attackResult.Damages > 0)
            {
                var blockFactor = GetDefenderBlockFactor();
                if (blockFactor < 1f)
                {
                    attackResult.Flags  |= AttackFlags.AF_BLOCKING;
                    attackResult.Damages = (int)(attackResult.Damages * blockFactor);
                }
            }
            else
            {
                attackResult.Damages = 0;
                attackResult.Flags  &= ~AttackFlags.AF_CRITICAL;
                attackResult.Flags  &= ~AttackFlags.AF_FLYING;
            }

            return(attackResult);
        }