Beispiel #1
0
        private void FindAttackTarget()
        {
            BattleCalculateManager  calculateManager  = Global.battleManager.calculateManager;
            BattleTilesManager      tilesManager      = Global.battleManager.tilesManager;
            BattleCharactersManager charactersManager = Global.charactersManager;

            attackTarget = null;
            targetTile   = null;
            if (mCharacter.currentSkill == null)
            {
                return;
            }
            float tileAid = 0;

            foreach (MCharacter character in charactersManager.mCharacters)
            {
                if (character.hp == 0 || character.isHide)
                {
                    continue;
                }
                if (charactersManager.IsSameBelong(mCharacter.belong, character.belong))
                {
                    continue;
                }
                VTile vTile = GetNearestNode(character, tilesManager.currentMovingTiles);
                //可否攻击
                bool canAttack = charactersManager.IsInSkillDistance(character.coordinate, vTile.coordinate, mCharacter);
                if (!canAttack)
                {
                    continue;
                }
                if (attackTarget == null)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否可杀死
                bool aCanKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0;
                if (aCanKill)
                {
                    continue;
                }
                bool bCanKill = calculateManager.Hert(mCharacter, character, targetTile) - character.hp >= 0;
                if (!aCanKill && bCanKill)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //是否反击
                bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.coordinate, attackTarget.coordinate);
                bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, character, vTile.coordinate, character.coordinate);
                if (!aCanCounter && bCanCounter)
                {
                    continue;
                }
                else if (aCanCounter && !bCanCounter)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = 0;
                    continue;
                }
                //地形优势
                float aTileAid = tileAid;
                if (Global.IsFloatZero(aTileAid))
                {
                    aTileAid = attackTarget.TileAid(targetTile);
                }
                float bTileAid = character.TileAid(vTile);
                if (aTileAid > bTileAid)
                {
                    attackTarget = character;
                    targetTile   = vTile;
                    tileAid      = bTileAid;
                    continue;
                }
            }
        }
Beispiel #2
0
        private VTile GetNearestNode(MCharacter target, List <VTile> tiles)
        {
            BattleCalculateManager  calculateManager  = Global.battleManager.calculateManager;
            BattleCharactersManager charactersManager = Global.charactersManager;
            TileMap mapSearch = Global.mapSearch;

            Debug.LogError("GetNearestNode tiles = " + tiles.Count);
            if (mCharacter.mission == Mission.defensive)
            {
                return(tiles.Find(t => t.coordinate.Equals(mCharacter.coordinate)));
            }
            if (tiles.Count == 1)
            {
                return(tiles[0]);
            }
            tiles.Sort((a, b) => {
                bool aNotRoad = charactersManager.mCharacters.Exists((c) => {
                    return(c.hp > 0 && !c.isHide && c.coordinate.Equals(a.coordinate));
                });
                if (aNotRoad)
                {
                    return(1);
                }
                bool aCanAttack = charactersManager.IsInSkillDistance(target.coordinate, a.coordinate, mCharacter);
                bool bCanAttack = charactersManager.IsInSkillDistance(target.coordinate, b.coordinate, mCharacter);
                if (aCanAttack && !bCanAttack)
                {
                    return(-1);
                }
                else if (!aCanAttack && bCanAttack)
                {
                    return(1);
                }
                else if (aCanAttack && bCanAttack)
                {
                    bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, target, a.coordinate, target.coordinate);
                    bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, target, b.coordinate, target.coordinate);
                    if (aCanCounter && !bCanCounter)
                    {
                        return(1);
                    }
                    else if (!aCanCounter && bCanCounter)
                    {
                        return(-1);
                    }
                    else if (aCanCounter && bCanCounter)
                    {
                        //地形优势
                        float aTileAid = mCharacter.TileAid(a);
                        float bTileAid = mCharacter.TileAid(b);
                        if (aTileAid < bTileAid)
                        {
                            return(-1);
                        }
                        else if (aTileAid > bTileAid)
                        {
                            return(1);
                        }
                    }
                }
                int aDistance = mapSearch.GetDistance(mCharacter.coordinate, a.coordinate);
                int bDistance = mapSearch.GetDistance(mCharacter.coordinate, b.coordinate);
                return(aDistance - bDistance);
            });
            return(tiles[0]);
        }