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()); }
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; }
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); } } }
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); } }
public Prob(ArmyBlueprint army, NationBlueprint defender) { InvadingArmy = army; NationBlueprint = defender; }
// 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)); }
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)); }