Пример #1
0
    private void Effect()
    {
        List <BuildingAI> affectedBuildings = new List <BuildingAI>();
        int distanceSqrt = this.Scope * this.Scope;

        Vector2      targetPosition = (Vector2)this.transform.position;
        TilePosition targetTile     = PositionConvertor.GetActorTileIndexFromWorldPosition(this.transform.position);
        int          radius         = Mathf.CeilToInt(this.Scope / (float)Mathf.Min(ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.width,
                                                                                    ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.height));

        List <TilePosition> affectedTiles = RoundHelper.FillCircle(targetTile.Column, targetTile.Row, radius);

        foreach (TilePosition tile in affectedTiles)
        {
            if (tile.IsValidActorTilePosition())
            {
                Vector2 p   = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(tile);
                Vector2 dis = p - targetPosition;
                if (dis.sqrMagnitude <= distanceSqrt)
                {
                    GameObject building = BattleMapData.Instance.GetBulidingObjectFromActorObstacleMap(tile.Row, tile.Column);
                    if (building != null)
                    {
                        BuildingAI ai = building.GetComponent <BuildingAI>();
                        if (ai != null && !affectedBuildings.Contains(ai))
                        {
                            affectedBuildings.Add(ai);
                            ai.SetTarget(this.gameObject, (Vector2)this.transform.position);
                        }
                    }
                }
            }
        }
    }
Пример #2
0
    public override void AICalculate()
    {
        float distanceSqr = Vector2.SqrMagnitude((Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex
                                                     (this.m_TargetPosition) - (Vector2)this.m_AIBehavior.transform.position);

        if (this.m_Target == null)
        {
            InvaderIdleState idleState = new InvaderIdleState(this.m_AIBehavior, false);
            this.m_AIBehavior.ChangeState(idleState);
        }
        else
        {
            if (distanceSqr <= this.CharacterAI.AttackBehavior.AttackScopeSqr)
            {
                BuildingBasePropertyBehavior property = this.m_Target.GetComponent <BuildingBasePropertyBehavior>();
                AttackState attackState;
                if (property == null)
                {
                    attackState = new InvaderAttackState(this.m_AIBehavior, new AITargetObject(this.m_Target, this.m_Target.transform.position), this.CharacterAI.AttackBehavior);
                }
                else
                {
                    attackState = new InvaderAttackState(this.m_AIBehavior,
                                                         new AITargetObject(this.m_Target, (Vector2)(PositionConvertor.GetWorldPositionFromActorTileIndex(this.m_TargetPosition))), this.CharacterAI.AttackBehavior);
                }
                this.m_AIBehavior.ChangeState(attackState);
            }
            else
            {
                base.AICalculate();
            }
        }
    }
Пример #3
0
    public void SendBuilderBuild(int builderNO, int builderLevel, IObstacleInfo targetInfo, IMapData mapData)
    {
        GameObject builder = null;

        if (this.m_Builders.ContainsKey(builderNO))
        {
            builder = this.m_Builders[builderNO];
            builder.SetActive(true);
        }
        else
        {
            builder = this.GenerateBuilder(builderNO, builderLevel);
            this.m_Builders.Add(builderNO, builder);
        }


        TilePosition buildPoint = BorderPointHelper.FindValidInflateOneBorderPoint(targetInfo);

        builder.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(buildPoint);

        BuilderAI builderAI = builder.GetComponent <BuilderAI>();

        builderAI.MapData   = mapData;
        builderAI.BuilderNO = builderNO;
        builderAI.Build(targetInfo, buildPoint);
    }
Пример #4
0
    private void Appear()
    {
        List <IBuildingInfo> buildings = ((VillagerAI)this.m_AIBehavior).SceneHelper.GetBuildingsOfTypes(this.m_AppearBuildings);
        int           index            = Random.Range(0, buildings.Count);
        IBuildingInfo appearBuilding   = buildings[index];

        while (appearBuilding.IsBuildingHover(((VillagerAI)this.m_AIBehavior).MapData))
        {
            index          = Random.Range(0, buildings.Count);
            appearBuilding = buildings[index];
        }


        List <TilePosition> borders = BorderPointHelper.GetBorder(appearBuilding);

        index = Random.Range(0, borders.Count);
        TilePosition appearPoint = appearBuilding.ActorPosition + borders[index];

        while (!appearPoint.IsValidActorTilePosition())
        {
            index       = Random.Range(0, borders.Count);
            appearPoint = appearBuilding.BuildingPosition + borders[index];
        }

        this.m_AIBehavior.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(appearPoint);
        this.m_AnimationController.SetVisible();
    }
Пример #5
0
    public void FindTargetObject(IBuildingInfo buildingInfo, TilePosition startPosition)
    {
        List <IBuildingInfo> buildings = this.SceneHelper.GetAllBuildings();

        int           index = Random.Range(0, buildings.Count);
        IBuildingInfo targetBuildingInfo = buildings[index];

        if (buildingInfo != null)
        {
            while (buildingInfo == targetBuildingInfo)
            {
                index = Random.Range(0, buildings.Count);
                targetBuildingInfo = buildings[index];
            }
        }

        TilePosition targetPoint = BorderPointHelper.FindValidInflateOneBorderPoint(targetBuildingInfo);

        if (startPosition != null)
        {
            this.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(startPosition);
        }
        VillagerWalkState walkState = new VillagerWalkState(this.MapData, targetPoint, this, targetBuildingInfo);

        this.ChangeState(walkState);
    }
Пример #6
0
 public override void AICalculate()
 {
     if (this.m_Target == null)
     {
         BombermanIdleState idleState = new BombermanIdleState(this.m_AIBehavior, false);
         this.m_AIBehavior.ChangeState(idleState);
     }
     else
     {
         float distanceSqr = Vector2.SqrMagnitude((Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex
                                                      (this.m_TargetPosition) - (Vector2)this.m_AIBehavior.transform.position);
         if (distanceSqr <= this.CharacterAI.AttackBehavior.AttackScopeSqr)
         {
             this.m_HPBehavior.Bomb();
             List <GameObject> relatedBuildings = new List <GameObject>();
             if (this.CharacterAI.AttackBehavior.DamageScope > 0)
             {
                 relatedBuildings = BattleSceneHelper.Instance.GetNearByBuilding(this.m_AIBehavior.transform.position, this.CharacterAI.AttackBehavior.DamageScope);
             }
             else
             {
                 relatedBuildings.Add(this.m_Target);
             }
             foreach (GameObject building in relatedBuildings)
             {
                 BuildingHPBehavior targetHP = building.GetComponent <BuildingHPBehavior>();
                 targetHP.DecreaseHP(this.CharacterAI.AttackBehavior.AttackValue, this.CharacterAI.AttackBehavior.AttackCategory);
             }
         }
         else
         {
             base.AICalculate();
         }
     }
 }
Пример #7
0
    public List <GameObject> GetNearByBuilding(Vector3 position, int scope)
    {
        List <GameObject> result = new List <GameObject>();
        int distanceSqrt         = scope * scope;

        TilePosition tilePosition = PositionConvertor.GetActorTileIndexFromWorldPosition(position);
        int          radius       = Mathf.CeilToInt(scope / (float)Mathf.Min(ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.width,
                                                                             ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.height));
        List <TilePosition> affectedTiles = RoundHelper.FillCircle(tilePosition.Column, tilePosition.Row, radius);

        foreach (TilePosition tile in affectedTiles)
        {
            if (tile.IsValidActorTilePosition())
            {
                Vector2 p   = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(tile);
                Vector2 dis = p - (Vector2)position;
                if (dis.sqrMagnitude <= distanceSqrt)
                {
                    GameObject building = BattleMapData.Instance.GetBulidingObjectFromActorObstacleMap(tile.Row, tile.Column);
                    if (building != null && !result.Contains(building) && building.GetComponent <BuildingHPBehavior>() != null)
                    {
                        result.Add(building);
                    }
                }
            }
        }
        return(result);
    }
Пример #8
0
    protected override void FindPath()
    {
        List <TilePosition> aStarPath;
        List <TilePosition> linePath = AStarPathFinder.CalculatePathTile(this.FindPathStrategy, this.CharacterAI.BattleMapData.ActorObstacleArray,
                                                                         this.m_PreviousPosition, this.m_TargetPosition, out aStarPath);

        //this.CharacterAI.DrawPath(aStarPath);

        /*
         * Debug.Log("AStar Path Length is:" + aStarPath.Count);
         * foreach(TilePosition at in aStarPath)
         * {
         *      Debug.Log("row:" + at.Row + " ,column:" + at.Column);
         * }
         * Debug.Log("Line Path Length is:" + linePath.Count);
         * foreach (TilePosition lt in linePath)
         * {
         *      Debug.Log("row:" + lt.Row + " ,column:" + lt.Column);
         * }
         */
        this.SetPath(linePath);
        if (linePath.Count == 0)
        {
            this.OnTargetReached();
        }
        else
        {
            TilePosition targetTilePosition = linePath[linePath.Count - 1];

            if (this.m_MapData.GetBulidingObjectFromActorObstacleMap(targetTilePosition.Row, targetTilePosition.Column) !=
                this.m_Target)
            {
                Vector2      reachablePosition = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(linePath[linePath.Count - 2]);
                TilePosition targetTile        = aStarPath[aStarPath.Count - 1];
                for (int i = 1; i < aStarPath.Count; i++)
                {
                    if (this.m_MapData.GetBulidingObjectFromActorObstacleMap(aStarPath[i].Row, aStarPath[i].Column) == this.m_Target)
                    {
                        targetTile = aStarPath[i];
                        break;
                    }
                }
                Vector2 targetPosition = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(targetTile);

                if (Vector2.SqrMagnitude(targetPosition - reachablePosition) <= this.CharacterAI.AttackBehavior.AttackScopeSqr)
                {
                    this.m_TargetPosition = targetTile;
                    this.ShowTarget();
                    return;
                }
            }

            this.m_TargetPosition = targetTilePosition;
            this.m_Target         = this.CharacterAI.BattleMapData.GetBulidingObjectFromActorObstacleMap
                                        (this.m_TargetPosition.Row, this.m_TargetPosition.Column);
            this.ShowTarget();
        }
    }
Пример #9
0
    public void GenerateArmyInCamp(IBuildingInfo campInfo)
    {
        this.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(
            this.FindCampStandablePoint(campInfo)) + new Vector3(Random.Range(-ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.width / 2, ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.height / 2),
                                                                 Random.Range(-ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.width / 2, ClientSystemConstants.ACTOR_TILE_MAP_TILE_SIZE.height / 2), 0);
        ArmyIdleState idleState = new ArmyIdleState(this, campInfo);

        this.ChangeState(idleState);
    }
Пример #10
0
    public void SendMercenaryToCamp(MercenaryType mercenaryType, IBuildingInfo campInfo, IBuildingInfo factoryInfo)
    {
        GameObject   mercenary    = this.GenerateMercenary(mercenaryType);
        TilePosition initialPoint = BorderPointHelper.FindValidInflateOneBorderPoint(factoryInfo);

        mercenary.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(initialPoint);

        ArmyAI ai = mercenary.GetComponent <ArmyAI>();

        ai.SendArmyToCamp(campInfo);
    }
Пример #11
0
    public void SendArmyToCamp(ArmyType armyType, int level, IBuildingInfo campInfo, IBuildingInfo factoryInfo)
    {
        GameObject   army         = this.GenerateArmy(armyType, level);
        TilePosition initialPoint = BorderPointHelper.FindValidInflateOneBorderPoint(factoryInfo);

        army.transform.position = PositionConvertor.GetWorldPositionFromActorTileIndex(initialPoint);

        ArmyAI ai = army.GetComponent <ArmyAI>();

        ai.SendArmyToCamp(campInfo);
    }
Пример #12
0
    public override void AICalculate()
    {
        if (this.m_IsFindInstantly || this.m_AIBehavior.CanTakeResponse)
        {
            CharacterAI ai = (CharacterAI)this.m_AIBehavior;

            TilePosition currentPosition = PositionConvertor.GetActorTileIndexFromWorldPosition(this.m_AIBehavior.transform.position);
            if (!BattleMapData.Instance.ActorCanPass(currentPosition.Row, currentPosition.Column))
            {
                GameObject         go       = BattleMapData.Instance.GetBulidingObjectFromActorObstacleMap(currentPosition.Row, currentPosition.Column);
                BuildingHPBehavior targetHP = go.GetComponent <BuildingHPBehavior>();
                if (targetHP != null)
                {
                    CharacterAttack attack = ai.AttackBehavior;
                    targetHP.DecreaseHP(attack.AttackValue, attack.AttackCategory);
                }

                KodoHPBehavior hp = this.m_AIBehavior.GetComponent <KodoHPBehavior>();
                hp.Bomb();
            }
            else
            {
                List <GameObject> targets = BattleSceneHelper.Instance.GetBuildingsOfCategory(ai.FavoriteCategory);
                if (targets.Count > 0)
                {
                    int        i        = BattleRandomer.Instance.GetRandomNumber(0, targets.Count);
                    GameObject targetGo = targets[i];
                    BuildingBasePropertyBehavior targetProperty = targetGo.GetComponent <BuildingBasePropertyBehavior>();
                    i = BattleRandomer.Instance.GetRandomNumber(0, targetProperty.ActorObstacleList.Count);
                    TilePosition targetTile     = targetProperty.ActorPosition + targetProperty.ActorObstacleList[i];
                    Vector2      targetPosition = PositionConvertor.GetWorldPositionFromActorTileIndex(targetTile);

                    CrazyKodoWalkState walkState = new CrazyKodoWalkState(this.m_AIBehavior, targetGo, targetPosition);
                    this.m_AIBehavior.ChangeState(walkState);
                }
            }
        }
    }
Пример #13
0
	public override void AICalculate ()
	{
		if(this.m_Target == null)
		{
			KodoIdleState idleState = new KodoIdleState(this.m_AIBehavior, false);
			this.m_AIBehavior.ChangeState(idleState);
		}
		else
		{
			float distanceSqr = Vector2.SqrMagnitude((Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex
				(this.m_TargetPosition) - (Vector2)this.m_AIBehavior.transform.position);
			if(distanceSqr <= this.CharacterAI.AttackBehavior.AttackScopeSqr)
			{
				this.m_HPBehavior.Bomb();
				BuildingHPBehavior targetHP = this.m_Target.transform.GetComponent<BuildingHPBehavior>();
				targetHP.DecreaseHP(this.CharacterAI.AttackBehavior.AttackValue, this.CharacterAI.AttackBehavior.AttackCategory);
			}
			else
			{
				base.AICalculate();
			}
		}
	}
Пример #14
0
    public override void Initial()
    {
        ActorConfig config = ActorPrefabConfig.Instance.GetComponent <ActorConfig>();

        this.m_CurrentFrame = config.BuildAnimationFrame;

        if (SceneManager.Instance != null)
        {
            GameObject go = SceneManager.Instance.GetBuildingObjectFromBuildingObstacleMap(this.m_TargetInfo.BuildingPosition.Row,
                                                                                           this.m_TargetInfo.BuildingPosition.Column);
            if (go != null)
            {
                Transform anchorPosition = go.transform.FindChild(ClientStringConstants.BUILDING_ANCHOR_OBJECT_NAME);
                if (anchorPosition != null)
                {
                    this.m_AnimationController.PlayBuildAnimation(anchorPosition.position);
                }
                else
                {
                    this.m_AnimationController.PlayBuildAnimation(PositionConvertor.GetWorldPositionFromActorTileIndex(this.m_TargetInfo.ActorPosition));
                }
            }
        }
        else
        {
            BuildingBasePropertyBehavior property = this.m_TargetInfo as BuildingBasePropertyBehavior;
            if (property != null)
            {
                this.m_AnimationController.PlayBuildAnimation(property.AnchorTransform.position);
            }
            else
            {
                this.m_AnimationController.PlayBuildAnimation(PositionConvertor.GetWorldPositionFromActorTileIndex(this.m_TargetInfo.ActorPosition));
            }
        }
    }
Пример #15
0
    public override void AICalculate()
    {
        if (this.m_LinePath.Count == 0)
        {
            this.OnTargetReached();
        }
        else
        {
            Vector2 sourcePosition      = this.m_AIBehavior.transform.position;
            Vector2 destinationPosition = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(this.m_LinePath.Peek());
            if (this.m_LinePath.Count == 1)
            {
                destinationPosition += this.m_TargetOffset;
            }

            float move     = this.WalkVelocity;
            float distance = Vector2.Distance(sourcePosition, destinationPosition);

            Vector2 result      = Vector2.zero;
            Vector2 deltaVector = destinationPosition - sourcePosition;

            while (distance <= move)
            {
                this.m_LinePath.Dequeue();
                result += deltaVector;
                move   -= distance;

                sourcePosition = destinationPosition;
                if (this.m_LinePath.Count == 0)
                {
                    distance = 0;
                    break;
                }
                destinationPosition = (Vector2)PositionConvertor.GetWorldPositionFromActorTileIndex(this.m_LinePath.Peek());
                if (this.m_LinePath.Count == 1)
                {
                    destinationPosition += this.m_TargetOffset;
                }
                distance    = Vector2.Distance(sourcePosition, destinationPosition);
                deltaVector = destinationPosition - sourcePosition;
            }

            if (distance.IsZero())
            {
                result = deltaVector;
            }
            else
            {
                float percentage = move / distance;
                result += deltaVector * percentage;
            }

            this.m_MoveVector = result;

            this.m_AIBehavior.transform.position += new Vector3(result.x, result.y, 0);

            TilePosition currentPosition = PositionConvertor.GetActorTileIndexFromWorldPosition(this.m_AIBehavior.transform.position);
            if (!currentPosition.Equals(this.m_PreviousPosition))
            {
                this.OnPositionTileChanged(this.m_PreviousPosition, currentPosition);
                this.m_PreviousPosition = currentPosition;
            }

            this.m_AnimationController.PlayWalkAnimation(this.m_MoveVector);
        }
    }