Example #1
0
 // Use this for initialization
 void Start()
 {
     flagCtrl      = transform.GetChild(0);
     strCtrl       = GameObject.FindWithTag("StrategyController").GetComponent <StrategyController>();
     pathfinding   = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
     cityFlagsCtrl = GameObject.FindWithTag("CityFlags").GetComponent <FlagsController>();
 }
Example #2
0
    public void InitArmyInfo(ArmyInfo ai)
    {
        armyInfo          = ai;
        armyInfo.armyCtrl = GetComponent <ArmyController>();

        SetArmyKingFlag();

        if (armyInfo.cityTo != -1)
        {
            if (pathfinding == null)
            {
                pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
            }
            SetRoute(pathfinding.GetRoute(armyInfo.pos, armyInfo.cityTo));
        }

        state    = (ArmyState)armyInfo.state;
        timeTick = armyInfo.timeTick;

        if (state == ArmyState.Garrison)
        {
            exSprite          moveSprite = GetComponent <exSprite>();
            exSpriteAnimation moveAnim   = GetComponent <exSpriteAnimation>();
            moveAnim.Stop();

            int frame = armyInfo.direction;
            if (frame == -1)
            {
                frame = 0;
            }
            moveAnim.SetFrame("ArmyGarrison", frame);

            Vector3 pos = flagPos[3 + frame];
            if (!armyInfo.isFlipped)
            {
                pos.x = -pos.x;
            }
            else
            {
                isHFlipped = true;
                moveSprite.HFlip();

                exSprite    flagSprite = flagCtrl.GetComponent <exSprite>();
                BoxCollider flagCol    = flagCtrl.GetComponent <BoxCollider>();
                flagSprite.HFlip();
                flagCol.center = new Vector3(-flagCol.center.x, flagCol.center.y, flagCol.center.z);
            }

            flagCtrl.localPosition = pos;
        }
        else
        {
            CalcDirection();
        }
    }
Example #3
0
    // Use this for initialization
    void Start()
    {
        state       = State.Normal;
        pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
        Camera.main.transform.position = strategyCamPos;

        CheckCorrection();
        InitArmys();

        CheckGameState();

        SoundController.Instance.PlayBackgroundMusic("Music03");
    }
Example #4
0
    void CheckCorrection()
    {
        for (int i = 0; i < Informations.Instance.cityNum; i++)
        {
            CityInfo cInfo = Informations.Instance.GetCityInfo(i);

            if (cInfo.generals.Count <= 10)
            {
                continue;
            }

            do
            {
                ArmyInfo ai = new ArmyInfo();
                ai.king  = cInfo.king;
                ai.state = (int)ArmyController.ArmyState.Garrison;

                if (pathfinding == null)
                {
                    pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
                }
                ai.pos = pathfinding.GetCityPos(i);

                Informations.Instance.armys.Add(ai);

                int count = cInfo.generals.Count;
                int min   = count - 5;
                min = Mathf.Clamp(min, 10, count);
                for (int j = count - 1; j >= min; j--)
                {
                    int g = cInfo.generals[j];
                    ai.generals.Add(g);
                    cInfo.generals.RemoveAt(j);

                    Informations.Instance.GetGeneralInfo(g).city = -1;

                    if (cInfo.prefect == g)
                    {
                        cInfo.prefect = FindCommander(cInfo.generals, cInfo.king);
                    }
                }

                ai.commander = FindCommander(ai.generals, ai.king);
            } while(cInfo.generals.Count > 10);
        }
    }
    private void GenerateMap()
    {
        myPathfinding = GetComponent <MyPathfinding>();
        map           = new int[width, height];
        RandomFillMap();
        while (changes > 0)
        {
            changes = 0;
            SmoothMap();
        }
        changes = 1;

        CheckWalls();
        PlaceEnemies();
        GenerateTrees();
        GenerateChests();
        PlaceDoors();
        myPathfinding.OnStart(new Vector2(width, height) * scale);
    }
        public override void LoadData()
        {
            base.LoadData();

            if (MyPerGameSettings.EnableAi)
            {
                Sync.Players.NewPlayerRequestSucceeded += PlayerCreated;
                Sync.Players.LocalPlayerLoaded         += LocalPlayerLoaded;
                Sync.Players.NewPlayerRequestFailed    += Players_NewPlayerRequestFailed;
                if (Sync.IsServer)
                {
                    Sync.Players.PlayerRemoved    += Players_PlayerRemoved;
                    Sync.Players.PlayerRequesting += Players_PlayerRequesting;
                }

                m_pathfinding                     = new MyPathfinding();
                m_behaviorTreeCollection          = new MyBehaviorTreeCollection();
                m_botCollection                   = new MyBotCollection(m_behaviorTreeCollection);
                m_loadedLocalPlayers              = new List <int>();
                m_loadedBotObjectBuildersByHandle = new Dictionary <int, MyObjectBuilder_Bot>();
                m_agentsToSpawn                   = new Dictionary <int, AgentSpawnData>();
                m_removeQueue                     = new MyConcurrentQueue <BotRemovalRequest>();
                m_maxBotNotification              = new MyHudNotification(MyCommonTexts.NotificationMaximumNumberBots, 2000, MyFontEnum.Red);
                m_processQueue                    = new MyConcurrentQueue <AgentSpawnData>();
                m_lock = new FastResourceLock();

#if !XB1
                if (MyFakes.ENABLE_BEHAVIOR_TREE_TOOL_COMMUNICATION)
                {
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_UPLOAD_TREE, OnUploadNewTree);
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_STOP_SENDING, OnBreakDebugging);
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_RESUME_SENDING, OnResumeDebugging);
                }
#endif

                MyToolbarComponent.CurrentToolbar.SelectedSlotChanged += CurrentToolbar_SelectedSlotChanged;
                MyToolbarComponent.CurrentToolbar.SlotActivated       += CurrentToolbar_SlotActivated;
                MyToolbarComponent.CurrentToolbar.Unselected          += CurrentToolbar_Unselected;
            }
        }
        protected override void UnloadData()
        {
            base.UnloadData();

            if (MyPerGameSettings.EnableAi)
            {
                Sync.Players.NewPlayerRequestSucceeded -= PlayerCreated;
                Sync.Players.LocalPlayerRemoved        -= LocalPlayerRemoved;
                Sync.Players.LocalPlayerLoaded         -= LocalPlayerLoaded;
                Sync.Players.NewPlayerRequestFailed    -= Players_NewPlayerRequestFailed;
                if (Sync.IsServer)
                {
                    Sync.Players.PlayerRequesting -= Players_PlayerRequesting;
                    Sync.Players.PlayerRemoved    -= Players_PlayerRemoved;
                }

                m_pathfinding.UnloadData();
                m_botCollection.UnloadData();

                m_botCollection = null;
                m_pathfinding   = null;

#if !XB1
                if (MyFakes.ENABLE_BEHAVIOR_TREE_TOOL_COMMUNICATION)
                {
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_UPLOAD_TREE, OnUploadNewTree);
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_STOP_SENDING, OnBreakDebugging);
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_RESUME_SENDING, OnResumeDebugging);
                }
#endif

                if (MyToolbarComponent.CurrentToolbar != null)
                {
                    MyToolbarComponent.CurrentToolbar.SelectedSlotChanged -= CurrentToolbar_SelectedSlotChanged;
                    MyToolbarComponent.CurrentToolbar.SlotActivated       -= CurrentToolbar_SlotActivated;
                    MyToolbarComponent.CurrentToolbar.Unselected          -= CurrentToolbar_Unselected;
                }
            }
        }
Example #8
0
        public MyPath<MyNavigationPrimitive> FindHighLevelPath(MyPathfinding pathfinding, MyHighLevelPrimitive startPrimitive)
        {
            m_pathfindingStatic = this;
            var path = pathfinding.FindPath(startPrimitive, m_hlPathfindingHeuristic, m_hlTerminationCriterion, null, returnClosest: false);
            pathfinding.LastHighLevelTimestamp = pathfinding.GetCurrentTimestamp();
            m_pathfindingStatic = null;

            return path;
        }
Example #9
0
    void WarResult(ArmyInfo winner, ArmyInfo loser)
    {
        winner.armyCtrl.SetArmyVictory();

        for (int i = 0; i < winner.generals.Count; i++)
        {
            GeneralInfo wgInfo = Informations.Instance.GetGeneralInfo(winner.generals[i]);
            wgInfo.prisonerIdx = -1;
            CheckIsLevelUp(wgInfo);
        }

        int count = loser.generals.Count;

        for (int i = count - 1; i >= 0; i--)
        {
            int gIdx = loser.generals[i];
            if (Informations.Instance.GetGeneralInfo(gIdx).prisonerIdx == winner.king)
            {
                winner.prisons.Add(gIdx);

                Informations.Instance.GetKingInfo(loser.king).generals.Remove(gIdx);
                loser.generals.RemoveAt(i);

                if (gIdx == Informations.Instance.GetKingInfo(loser.king).generalIdx)
                {
                    SetKingOver(loser.king);
                }
            }
        }

        if (loser.generals.Count == 0)
        {
            for (int i = 0; i < loser.prisons.Count; i++)
            {
                Informations.Instance.GetGeneralInfo(loser.prisons[i]).prisonerIdx = winner.king;
            }

            winner.prisons.AddRange(loser.prisons);
            loser.prisons.Clear();

            winner.money += loser.money;

            Destroy(loser.armyCtrl.gameObject);
            Informations.Instance.armys.Remove(loser);
        }
        else
        {
            loser.armyCtrl.FindArmyCommander();

            int tmp = loser.cityTo;
            loser.cityTo   = loser.cityFrom;
            loser.cityFrom = tmp;

            if (pathfinding == null)
            {
                pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
            }

            loser.armyCtrl.SetRoute(pathfinding.GetRoute(loser.armyCtrl.transform.position, loser.cityTo));
            loser.armyCtrl.SetArmyEscape();
        }
    }
Example #10
0
        public override void LoadData()
        {
            base.LoadData();

            if (MyPerGameSettings.EnableAi)
            {
                Sync.Players.NewPlayerRequestSucceeded += PlayerCreated;
                Sync.Players.LocalPlayerLoaded += LocalPlayerLoaded;
                Sync.Players.NewPlayerRequestFailed += Players_NewPlayerRequestFailed;
                if (Sync.IsServer)
                {
                    Sync.Players.PlayerRemoved += Players_PlayerRemoved;
                    Sync.Players.PlayerRequesting += Players_PlayerRequesting;
                }

                m_pathfinding = new MyPathfinding();
                m_behaviorTreeCollection = new MyBehaviorTreeCollection();
                m_botCollection = new MyBotCollection(m_behaviorTreeCollection);
                m_loadedLocalPlayers = new List<int>();
                m_loadedBotObjectBuildersByHandle = new Dictionary<int, MyObjectBuilder_Bot>();
                m_agentsToSpawn = new Dictionary<int, AgentSpawnData>();
                m_removeQueue = new Queue<int>();
                m_maxBotNotification = new MyHudNotification(MySpaceTexts.NotificationMaximumNumberBots, 2000, MyFontEnum.Red);

                if (MyFakes.ENABLE_BEHAVIOR_TREE_TOOL_COMMUNICATION)
                {
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_UPLOAD_TREE, OnUploadNewTree);
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_STOP_SENDING, OnBreakDebugging);
                    MyMessageLoop.AddMessageHandler(MyWMCodes.BEHAVIOR_GAME_RESUME_SENDING, OnResumeDebugging);
                }

                MyToolbarComponent.CurrentToolbar.SelectedSlotChanged += CurrentToolbar_SelectedSlotChanged;
                MyToolbarComponent.CurrentToolbar.SlotActivated += CurrentToolbar_SlotActivated;
                MyToolbarComponent.CurrentToolbar.Unselected += CurrentToolbar_Unselected;
            }
        }
Example #11
0
        protected override void UnloadData()
        {
            base.UnloadData();

            if (MyPerGameSettings.EnableAi)
            {
                Sync.Players.NewPlayerRequestSucceeded -= PlayerCreated;
                Sync.Players.LocalPlayerRemoved -= LocalPlayerRemoved;
                Sync.Players.LocalPlayerLoaded -= LocalPlayerLoaded;
                Sync.Players.NewPlayerRequestFailed -= Players_NewPlayerRequestFailed;
                if (Sync.IsServer)
                {
                    Sync.Players.PlayerRequesting -= Players_PlayerRequesting;
                    Sync.Players.PlayerRemoved -= Players_PlayerRemoved;
                }

                m_pathfinding.UnloadData();
                m_botCollection.UnloadData();

                m_botCollection = null;
                m_pathfinding = null;

                if (MyFakes.ENABLE_BEHAVIOR_TREE_TOOL_COMMUNICATION)
                {
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_UPLOAD_TREE, OnUploadNewTree);
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_STOP_SENDING, OnBreakDebugging);
                    MyMessageLoop.RemoveMessageHandler(MyWMCodes.BEHAVIOR_GAME_RESUME_SENDING, OnResumeDebugging);
                }

                if (MyToolbarComponent.CurrentToolbar != null)
                {
                    MyToolbarComponent.CurrentToolbar.SelectedSlotChanged -= CurrentToolbar_SelectedSlotChanged;
                    MyToolbarComponent.CurrentToolbar.SlotActivated -= CurrentToolbar_SlotActivated;
                    MyToolbarComponent.CurrentToolbar.Unselected -= CurrentToolbar_Unselected;
                }
            }
        }
Example #12
0
 public void SetPathfinder(MyPathfinding _pathfinder)
 {
     pathfinder = _pathfinder;
 }
Example #13
0
    void SetEscapeFromCity(int cIdx)
    {
        CityInfo cInfo = Informations.Instance.GetCityInfo(cIdx);

        do
        {
            ArmyInfo ai = new ArmyInfo();
            ai.king  = cInfo.king;
            ai.money = 0;

            Informations.Instance.armys.Add(ai);

            int count = cInfo.generals.Count;
            int min   = count - 5;
            min = Mathf.Clamp(min, 0, count);
            for (int i = count - 1; i >= min; i--)
            {
                int g = cInfo.generals[i];
                ai.generals.Add(g);
                cInfo.generals.RemoveAt(i);

                Informations.Instance.GetGeneralInfo(g).city = -1;
            }

            ai.commander = -1;
            FindArmyCommander(ai);

            int        cityEscTo = -1;
            List <int> clist     = MyPathfinding.GetCityNearbyIdx(cIdx);
            List <int> canGoList = new List <int>();

            if (clist.Count == 1)
            {
                cityEscTo = clist[0];
            }
            else
            {
                for (int i = 0; i < clist.Count; i++)
                {
                    if (Informations.Instance.GetCityInfo(clist[i]).king == ai.king)
                    {
                        canGoList.Add(clist[i]);
                    }
                }

                if (canGoList.Count > 0)
                {
                    cityEscTo = canGoList[Random.Range(0, canGoList.Count)];
                }

                if (cityEscTo == -1)
                {
                    for (int i = 0; i < clist.Count; i++)
                    {
                        if (Informations.Instance.GetCityInfo(clist[i]).king == -1)
                        {
                            canGoList.Add(clist[i]);
                        }
                    }

                    if (canGoList.Count > 0)
                    {
                        cityEscTo = canGoList[Random.Range(0, canGoList.Count)];
                    }
                }

                if (cityEscTo == -1)
                {
                    cityEscTo = clist[Random.Range(0, clist.Count)];
                }
            }

            ai.cityFrom = cityAttacked;
            ai.cityTo   = cityEscTo;

            ai.state = (int)ArmyController.ArmyState.Escape;
            ai.pos   = Vector3.zero;
        } while(cInfo.generals.Count > 0);
    }
Example #14
0
 // Use this for initialization
 void Start()
 {
     pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
     armyMoving  = GetComponent <ArmyController>();
 }
Example #15
0
    void CityAct(int cIdx)
    {
        CityInfo cInfo = Informations.Instance.GetCityInfo(cIdx);

        if (cInfo.king == -1 ||
            cInfo.king == Controller.kingIndex ||
            cInfo.king == Informations.Instance.kingNum)
        {
            return;
        }

        foreach (int gIdx in cInfo.generals)
        {
            if (cInfo.reservist == 0)
            {
                break;
            }

            GeneralInfo gInfo = Informations.Instance.GetGeneralInfo(gIdx);

            if (gInfo.knightCur < gInfo.knightMax)
            {
                int soldierAdd = gInfo.knightMax - gInfo.knightCur;
                soldierAdd = Mathf.Clamp(soldierAdd, 0, cInfo.reservist);

                gInfo.knightCur += soldierAdd;
                cInfo.reservist -= soldierAdd;
            }

            if (cInfo.reservist == 0)
            {
                break;
            }

            if (gInfo.soldierCur < gInfo.soldierMax)
            {
                int soldierAdd = gInfo.soldierMax - gInfo.soldierCur;
                soldierAdd = Mathf.Clamp(soldierAdd, 0, cInfo.reservist);

                gInfo.soldierCur += soldierAdd;
                cInfo.reservist  -= soldierAdd;
            }
        }

        List <int> cities = MyPathfinding.GetCityNearbyIdx(cIdx);

        for (int i = 0; i < cities.Count; i++)
        {
            CityInfo cityNeighbor = Informations.Instance.GetCityInfo(cities[i]);

            int count = 0;
            for (int j = 0; j < cInfo.generals.Count; j++)
            {
                GeneralInfo gInfo = Informations.Instance.GetGeneralInfo(cInfo.generals[j]);
                if (gInfo.healthCur > 50 && (gInfo.soldierCur + gInfo.knightCur) > (gInfo.soldierMax + gInfo.knightMax) / 2)
                {
                    count++;
                }
            }

            if (cityNeighbor.king == cInfo.king)
            {
                if (count < 8 && cityNeighbor.generals.Count > 2 && Random.Range(0, 100) > 88)
                {
                    SetArmyMove(cities[i], cIdx, Random.Range(1, cityNeighbor.generals.Count), 5);
                    break;
                }
            }
            else
            {
                if (cityNeighbor.king == -1)
                {
                    if (count > 3 && Random.Range(0, 100) > 80)
                    {
                        SetArmyMove(cIdx, cities[i], Random.Range(1, cInfo.generals.Count), 5);
                        break;
                    }
                }
                else
                {
                    if (count > 2 && Random.Range(0, 100) > 88)
                    {
                        if (count - cityNeighbor.generals.Count >= 2)
                        {
                            SetArmyMove(cIdx, cities[i], Random.Range(cityNeighbor.generals.Count + 1, cInfo.generals.Count), 5);
                            break;
                        }
                        else if (count - cityNeighbor.generals.Count > 0 && Random.Range(0, 100) > 50)
                        {
                            SetArmyMove(cIdx, cities[i], cityNeighbor.generals.Count, 5);
                            break;
                        }
                        else if (count - cityNeighbor.generals.Count == 0 && Random.Range(0, 100) > 88)
                        {
                            SetArmyMove(cIdx, cities[i], cityNeighbor.generals.Count - 1, 5);
                            break;
                        }
                    }
                }
            }
        }
    }
Example #16
0
    void AttackCity(int cIdx)
    {
        CityInfo cInfo = Informations.Instance.GetCityInfo(cIdx);

        int result   = 0;
        int selfIdx  = 0;
        int enemyIdx = 0;

        if (cInfo.king != -1)
        {
            if (cInfo.king == Controller.kingIndex)
            {
                strCtrl.SetWarDialogue(cIdx, armyInfo);
                return;
            }
            else if (armyInfo.king == Controller.kingIndex)
            {
                strCtrl.SetWarDialogue(armyInfo, cIdx);
                return;
            }
        }
        else
        {
            result = 1;
        }

        while (result == 0)
        {
            GeneralInfo selfGeneral  = Informations.Instance.GetGeneralInfo(armyInfo.generals[selfIdx]);
            GeneralInfo enemyGeneral = Informations.Instance.GetGeneralInfo(cInfo.generals[enemyIdx]);

            int power1 = selfGeneral.level * 5 + selfGeneral.knightCur * 6 + selfGeneral.soldierCur * 3 + selfGeneral.strength * 2 + selfGeneral.healthCur + selfGeneral.manaCur / 2 + Random.Range(0, 20);
            int power2 = enemyGeneral.level * 5 + enemyGeneral.knightCur * 6 + enemyGeneral.soldierCur * 3 + enemyGeneral.strength * 2 + enemyGeneral.healthCur + enemyGeneral.manaCur / 2 + cInfo.defense / 10 + Random.Range(0, 20);

            if (power1 > power2)
            {
                WarResult(selfGeneral, enemyGeneral, power2);
                enemyIdx++;
            }
            else
            {
                WarResult(enemyGeneral, selfGeneral, power1);
                selfIdx++;
            }

            if (selfIdx >= armyInfo.generals.Count)
            {
                result = 2;
            }
            else if (enemyIdx >= cInfo.generals.Count)
            {
                result = 1;
            }
        }

        if (result == 1)
        {
            for (int i = 0; i < armyInfo.generals.Count; i++)
            {
                Informations.Instance.GetGeneralInfo(armyInfo.generals[i]).prisonerIdx = -1;
                Informations.Instance.GetGeneralInfo(armyInfo.generals[i]).city        = cIdx;
                Informations.Instance.GetGeneralInfo(armyInfo.generals[i]).escape      = 0;
                CheckIsLevelUp(Informations.Instance.GetGeneralInfo(armyInfo.generals[i]));
            }

            int count = cInfo.generals.Count;
            for (int i = count - 1; i >= 0; i--)
            {
                if (Informations.Instance.GetGeneralInfo(cInfo.generals[i]).prisonerIdx == armyInfo.king)
                {
                    cInfo.prisons.Add(cInfo.generals[i]);
                    Informations.Instance.GetKingInfo(cInfo.king).generals.Remove(cInfo.generals[i]);

                    if (cInfo.generals[i] == Informations.Instance.GetKingInfo(cInfo.king).generalIdx)
                    {
                        SetKingOver(cInfo.king);
                    }

                    cInfo.generals.RemoveAt(i);
                }
            }

            count = cInfo.generals.Count;
            if (count > 0)
            {
                SetEscapeFromCity(cIdx);
            }

            //cInfo.generals.Clear();
            cInfo.generals.AddRange(armyInfo.generals);
            cInfo.prefect = armyInfo.commander;

            for (int i = 0; i < cInfo.prisons.Count; i++)
            {
                Informations.Instance.GetGeneralInfo(cInfo.prisons[i]).prisonerIdx = armyInfo.king;
            }

            for (int i = 0; i < armyInfo.prisons.Count; i++)
            {
                Informations.Instance.GetGeneralInfo(armyInfo.prisons[i]).city = cIdx;
            }

            cInfo.prisons.AddRange(armyInfo.prisons);
            cInfo.money += armyInfo.money;

            Informations.Instance.armys.Remove(armyInfo);
            Destroy(armyInfo.armyCtrl.gameObject);

            if (cInfo.king != -1)
            {
                KingInfo kInfo = Informations.Instance.GetKingInfo(cInfo.king);
                kInfo.cities.Remove(cIdx);
            }

            cInfo.king = armyInfo.king;
            cityFlagsCtrl.SetFlag(cIdx);
            Informations.Instance.GetKingInfo(armyInfo.king).cities.Add(cIdx);
        }
        else if (result == 2)
        {
            for (int i = 0; i < cInfo.generals.Count; i++)
            {
                Informations.Instance.GetGeneralInfo(cInfo.generals[i]).prisonerIdx = -1;
                CheckIsLevelUp(Informations.Instance.GetGeneralInfo(cInfo.generals[i]));
            }

            int count = armyInfo.generals.Count;
            for (int i = count - 1; i >= 0; i--)
            {
                int gIdx = armyInfo.generals[i];
                if (Informations.Instance.GetGeneralInfo(gIdx).prisonerIdx == cInfo.king)
                {
                    if (gIdx == Informations.Instance.GetKingInfo(armyInfo.king).generalIdx)
                    {
                        SetKingOver(armyInfo.king);
                    }

                    cInfo.prisons.Add(gIdx);
                    Informations.Instance.GetGeneralInfo(gIdx).city = cIdx;

                    Informations.Instance.GetKingInfo(armyInfo.king).generals.Remove(gIdx);
                    armyInfo.generals.RemoveAt(i);
                }
            }

            if (armyInfo.generals.Count == 0)
            {
                for (int i = 0; i < armyInfo.prisons.Count; i++)
                {
                    Informations.Instance.GetGeneralInfo(armyInfo.prisons[i]).prisonerIdx = cInfo.king;
                    Informations.Instance.GetGeneralInfo(armyInfo.prisons[i]).city        = cIdx;
                }

                cInfo.prisons.AddRange(armyInfo.prisons);
                armyInfo.prisons.Clear();

                cInfo.money += armyInfo.money;

                state = ArmyState.Escape;
                Destroy(armyInfo.armyCtrl.gameObject);
                Informations.Instance.armys.Remove(armyInfo);
            }
            else
            {
                FindArmyCommander();

                int tmp = armyInfo.cityTo;
                armyInfo.cityTo   = armyInfo.cityFrom;
                armyInfo.cityFrom = tmp;

                if (pathfinding == null)
                {
                    pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
                }

                SetRoute(pathfinding.GetRoute(transform.position, armyInfo.cityTo));

                armyInfo.armyCtrl.SetArmyEscape();
            }
        }
    }
Example #17
0
    void SetEscapeFromCity(int cIdx)
    {
        CityInfo cInfo = Informations.Instance.GetCityInfo(cIdx);

        do
        {
            GameObject     go = (GameObject)Instantiate(armyPrefab, pathfinding.GetCityPos(cIdx), transform.rotation);
            ArmyController ac = go.GetComponent <ArmyController>();
            ArmyInfo       ai = new ArmyInfo();
            ai.king     = cInfo.king;
            ai.money    = 0;
            ai.armyCtrl = ac;

            ac.armyInfo = ai;
            ac.SetArmyKingFlag();

            Informations.Instance.armys.Add(ai);
            ai.armyCtrl.SetArmyKingFlag();

            go.transform.parent = GameObject.Find("ArmiesRoot").transform;

            int count = cInfo.generals.Count;
            int min   = count - 5;
            min = Mathf.Clamp(min, 0, count);
            for (int i = count - 1; i >= min; i--)
            {
                int g = cInfo.generals[i];
                ai.generals.Add(g);
                cInfo.generals.RemoveAt(i);

                Informations.Instance.GetGeneralInfo(g).city = -1;
            }

            ai.commander = -1;
            ai.armyCtrl.FindArmyCommander();

            int        cityEscTo = -1;
            List <int> clist     = MyPathfinding.GetCityNearbyIdx(cIdx);
            List <int> canGoList = new List <int>();

            if (clist.Count == 1)
            {
                cityEscTo = clist[0];
            }
            else
            {
                for (int i = 0; i < clist.Count; i++)
                {
                    if (Informations.Instance.GetCityInfo(clist[i]).king == ai.king)
                    {
                        canGoList.Add(clist[i]);
                    }
                }

                if (canGoList.Count > 0)
                {
                    cityEscTo = canGoList[Random.Range(0, canGoList.Count)];
                }

                if (cityEscTo == -1)
                {
                    for (int i = 0; i < clist.Count; i++)
                    {
                        if (Informations.Instance.GetCityInfo(clist[i]).king == -1)
                        {
                            canGoList.Add(clist[i]);
                        }
                    }

                    if (canGoList.Count > 0)
                    {
                        cityEscTo = canGoList[Random.Range(0, canGoList.Count)];
                    }
                }

                if (cityEscTo == -1)
                {
                    cityEscTo = clist[Random.Range(0, clist.Count)];
                }
            }

            ai.cityFrom = cIdx;
            ai.cityTo   = cityEscTo;

            if (pathfinding == null)
            {
                pathfinding = GameObject.FindWithTag("Pathfinding").GetComponent <MyPathfinding>();
            }

            ai.armyCtrl.SetRoute(pathfinding.GetRoute(ai.armyCtrl.transform.position, ai.cityTo));
            ai.armyCtrl.SetArmyEscape();
        } while (cInfo.generals.Count > 0);
    }
Example #18
0
 public MySmartPath(MyPathfinding pathfinding)
 {
     m_pathfinding = pathfinding;
     m_pathNodes = new List<MyHighLevelPrimitive>();
     m_expandedPath = new List<Vector4D>();
 }
Example #19
0
 public MyPath<MyNavigationPrimitive> FindPath(MyPathfinding pathfinding, MyNavigationPrimitive startPrimitive)
 {
     throw new NotImplementedException();
 }