public InvasionSolution(ArmyBlueprint initialArmy, NationBlueprint initialNation,
                         ArmyBlueprint finalArmy, NationBlueprint finalNation,
                         List <InvasionWave> invasionOrder, bool isCompleteSolution)
 {
     InvasionOrder      = invasionOrder;
     InitialArmy        = initialArmy;
     InitialNation      = initialNation;
     FinalArmy          = finalArmy;
     FinalNation        = finalNation;
     IsCompleteSolution = isCompleteSolution;
 }
    public void BeginSimulation()
    {
        Debug.Assert(mSearchComplete);
        InvasionInputParent.gameObject.SetActive(false);
        InvasionAnimationParent.gameObject.SetActive(false);
        InvasionResultsParent.SetActive(true);

        mInitialInvaders = new ArmyBlueprint(SoldierCounter.InvaderCount, HealerCounter.InvaderCount, ArcherCounter.InvaderCount);
        mInitialNation   = new NationBlueprint(NationLayoutController.GetNationLayout());
        StartCoroutine(_BeginSimulation());
    }
Exemple #3
0
 public SearchState(ArmyBlueprint army, NationBlueprint defender, int depth, SearchState parent, InvasionWave fromParent)
 {
     if (depth == 0)
     {
         sStateNumber = 0;
     }
     mStateNumber         = sStateNumber++;
     Depth                = depth;
     Prob                 = new Prob(army, defender);
     ParentProblem        = parent;
     TransitionFromParent = fromParent != null ? new InvasionWave(fromParent.Wave) : null;
 }
Exemple #4
0
 public void UpgradeForts(float overSeconds)
 {
     mNation = new NationBlueprint(mNation, mDestroyedForts);
     mDestroyedForts.Clear();
     foreach (Fortification fort in mNation.Fortifications)
     {
         if (!mNation.IsCapturedMap[fort.FortificationId])
         {
             mFortLookup[fort.FortificationId].Upgrade(fort.Defense, fort.FortificationLevel, overSeconds);
         }
     }
 }
Exemple #5
0
        public void InitializeNation(NationBlueprint nation)
        {
            mNation = nation;
            Vector2 fortDimensions = FortPrefab.GetComponent <RectTransform>().rect.size + Vector2.one * 40f; // padding
            Vector2 nationSize     = fortDimensions * nation.NationSize;
            Vector2 currentSize    = GetComponent <RectTransform>().rect.size;
            float   scaleX         = currentSize.x / nationSize.x;
            float   scaleY         = currentSize.y / nationSize.y;
            float   scaleFactor    = Mathf.Min(scaleX, scaleY, 1);

            fortDimensions *= scaleFactor;

            // create a fortController for each fort
            foreach (Fortification fort in nation.Fortifications)
            {
                FortController script           = script = Instantiate(FortPrefab, transform);
                Vector2        positionInNation = fort.PositionInNation(nation.NationSize);
                script.transform.localScale    = new Vector3(scaleFactor, scaleFactor, 1);
                script.transform.localPosition = new Vector2(positionInNation.x * fortDimensions.x, positionInNation.y * fortDimensions.y);
                script.Initialize(fort.Defense, fort.FortificationId, fort.FortificationLevel);
                mFortLookup.Add(fort.FortificationId, script);
            }
        }
Exemple #6
0
 public Prob(ArmyBlueprint army, NationBlueprint defender)
 {
     InvadingArmy    = army;
     NationBlueprint = defender;
 }
Exemple #7
0
        // Helper function to convert the invasion stack into a solution
        public static InvasionSolution ToSolution(SearchState state, ArmyBlueprint initialArmy, NationBlueprint initialNation)
        {
            SearchState         currentState  = state;
            List <InvasionWave> invasionOrder = new List <InvasionWave>();

            while (currentState.TransitionFromParent != null)
            {
                invasionOrder.Add(currentState.TransitionFromParent);
                currentState = currentState.ParentProblem;
            }
            invasionOrder.Reverse();
            return(new InvasionSolution(initialArmy, initialNation,
                                        state.Prob.InvadingArmy, state.Prob.NationBlueprint,
                                        invasionOrder, state.IsSolved));
        }
Exemple #8
0
        public SearchResults SearchForSolutions(ArmyBlueprint attackers, NationBlueprint defenders, bool optimize)
        {
            mInitialArmy   = attackers;
            mInitialNation = defenders;
            mIsOptimized   = true; /* = optimize; Replace after data collection*/

            // Initialize start variables and start invasion search
            SearchState initialState = new SearchState(attackers, defenders, 0, null, null);

            mOpenLeafs.Clear();
            // orrient the nations layout relative to the army. TODO: allow for dynamic invasion direction
            initialState.Prob.NationBlueprint.BeginInvasion(Vector2.right);

            // Do the default search keeping the units together
            mOpenLeafs.AddLast(initialState);
            mPruneSolutions = true;                    // only care about the best solution with army grouped up. Only record
            mMaxDepthOfTree = mBestSolutionDepth = -1; // max depth = -1 until a solution is found creating a limit to depth

            // Search for solutions with linear invasion strategy
            while (mOpenLeafs.Count > 0)
            {
                SearchState pop = mOpenLeafs.Last.Value;
                mOpenLeafs.RemoveLast();
                Search(pop, true);
            }
            // record default invasion stats
            InvasionSolution linearSolution = null;

            if (mBestSolution == null) // no solution was found
            {
                // record the best result possible
                linearSolution = ToSolution(mBestPartialSolution, mInitialArmy, mInitialNation);
            }
            else
            {
                linearSolution = mBestSolution;
            }

            int bestLinearDepth = linearSolution != null ? mBestSolutionDepth : -1;

            // update the max depth of the optimized search to be the depth of the default time
            mMaxDepthOfTree = bestLinearDepth;
            //Debug.Log("Best Case Group Scenario took " + mMaxDepthOfTree + " turns to complete, needing " + (mMaxDepthOfTree - initialState.Prob.NationBlueprint.NumCitiesRemaining) + " turns to heal");
            // reset search variables for the optimized search
            mPruneSolutions = optimize;
            mOpenLeafs.Clear();
            mBestSolution        = null;
            mBestPartialSolution = null;

            mOpenLeafs.AddLast(initialState);
            // search for parallel attack strategy solutions
            while (mOpenLeafs.Count > 0)
            {
                SearchState pop = mOpenLeafs.Last.Value;
                mOpenLeafs.RemoveLast();
                Search(pop, false);
            }


            // Record optimized Solution
            InvasionSolution parallelSolution = null;

            if (mBestSolution == null)
            {
                parallelSolution = ToSolution(mBestPartialSolution, mInitialArmy, mInitialNation);
            }
            else
            {
                parallelSolution = mBestSolution;
            }

            int bestOptimizedDepth = parallelSolution != null ? mBestSolutionDepth : -1;

            return(new SearchResults(mNumLeafsCreated, mNumSolutionsFound,
                                     linearSolution, parallelSolution));
        }