public List <GameEvent>[] Assemble() { //--Get the selector EventSelector selector = EventSelector.Instance; if (selector == null) { Debug.Log("selector list cannot be null!"); } //--Get the obtsacles list List <GameEvent> obstacles = selector.GetList("Obstacles"); if (obstacles == null) { Debug.Log("obstacles list cannot be null!"); } //--Get the goods list List <GameEvent> goods = selector.GetList("Goods"); if (goods == null) { Debug.Log("goods list cannot be null!"); } //--Shuffle the lists FisherYatesShuffle.Shuffle(obstacles); FisherYatesShuffle.Shuffle(goods); //--Initaite the game event list array List <GameEvent>[] gameEventsListArray = new List <GameEvent> [ApplicationConstants.NumberOfScenes]; for (int i = 0; i < ApplicationConstants.NumberOfScenes; i++) { gameEventsListArray[i] = new List <GameEvent>(); } //--this is the list of available constructs the assembler can choose from. List <string> availableConstructsTypes = new List <string>(); int offset = 0; //--While the lists are not empty while (obstacles.Count > 0 || goods.Count > 0) { availableConstructsTypes.Clear(); //--we add the null type because it is always an option availableConstructsTypes.Add("Null"); //--we init the offset of the created structs to 0 int layerMaxWidth = 0; if (goods.Count > 0) { availableConstructsTypes.Add("Goods"); } if (obstacles.Count > 0) { availableConstructsTypes.Add("Obstacle"); } //--this value is used the offset the chosen scene by a random amount int sceneOffset = UnityEngine.Random.Range(0, ApplicationConstants.NumberOfScenes - 1); //--For each scene for (int i = 0; i < ApplicationConstants.NumberOfScenes; i++) { //--generate a random number int rand = UnityEngine.Random.Range(0, availableConstructsTypes.Count); GameEvent gameEventToAdd = null; string constructType = availableConstructsTypes[rand]; //--if the construct type chosen is null continue to next scene if (constructType.Equals("Null")) { continue; } else if (constructType.Equals("Obstacle")) { //--We remove the obstacle from the type list in order to prevent 2 obstacles in 1 layer availableConstructsTypes.Remove("Obstacle"); //--get the obstacle from the list gameEventToAdd = obstacles[0]; obstacles.RemoveAt(0); } else if (constructType.Equals("Goods")) { //--get the obstacle from the list gameEventToAdd = goods[0]; goods.RemoveAt(0); if (goods.Count == 0) { availableConstructsTypes.Remove("Goods"); } } if (gameEventToAdd == null) { Debug.Log("Game event to add is null, this should not happen"); } layerMaxWidth = Math.Max(layerMaxWidth, gameEventToAdd.ConstructData.w); i = (i + sceneOffset) % ApplicationConstants.NumberOfScenes; //ConstructData constructData = Utils.ParseJsonData<ConstructData>(gameEventToAdd.mJsonData); gameEventToAdd.SetOffset(offset); gameEventsListArray[i].Add(gameEventToAdd); } offset += layerMaxWidth; } return(gameEventsListArray); }
public List <GameEvent>[] Assemble(LinkedList <GameEvent> mGameEventList, int tubeCapacity) { if (mGameEventList.Count == 0) { return(null); } EventSelector selector = EventSelector.Instance; Debug.unityLogger.Log(TAG, string.Format("Event Assembler now has {0} money", selector.GetMoney())); int maxCost = GetMaxCost(mGameEventList); //return null; selector.GiveMoney(maxCost); Debug.unityLogger.Log(TAG, string.Format("Event Assembler now has {0} money", selector.GetMoney())); //collect gameEvents from the bank FisherYatesShuffle.Shuffle(mGameEventList); //Choose one random game event LinkedList <GameEvent> .Enumerator enumarator = mGameEventList.GetEnumerator(); enumarator.MoveNext(); //Iterate the list until we find an event we can buy int cost = enumarator.Current.GetCost(); string name = enumarator.Current.mName; while (selector.GetMoney() < cost) { //This means we couldn't find any GameEvent if (!enumarator.MoveNext()) { return(null); } cost = enumarator.Current.GetCost(); } //--Initialize the result array List <GameEvent>[] gameEventsListArray = new List <GameEvent> [ApplicationConstants.NumberOfScenes]; for (int i = 0; i < ApplicationConstants.NumberOfScenes; i++) { gameEventsListArray[i] = new List <GameEvent>(); } //List<GameEvent> gEvents = new List<GameEvent>(); List <int> scenesLeft = new List <int>() { 1, 2, 3 }; int selectedScene = UnityEngine.Random.Range(0, ApplicationConstants.NumberOfScenes); scenesLeft.Remove(selectedScene); GameEvent gEventFirst = enumarator.Current; gEventFirst.SetScene(selectedScene); gameEventsListArray[selectedScene].Add(gEventFirst); selector.ChargeMoney(cost); string gameEventType = gEventFirst.GetEventType(); Debug.unityLogger.Log(TAG, string.Format("Event Assembler bought {0} that cost {1} of type {2}, it was" + "deployed to scene {3}", name, cost, gameEventType, selectedScene)); //enumarator.MoveNext(); mGameEventList.Remove(gEventFirst); //Move current to first node //GameEvent currentGEvent = gEventFirst; //Populate the remaining scenes list //scenesLeft.AddLast(0); //scenesLeft.AddLast(1); //scenesLeft.AddLast(2); //Shuffle the last to generate randomness //FisherYatesShuffle.Shuffle(scenesLeft); //Draw a random scene //int currScene = scenesLeft.Last.Value; //scenesLeft.RemoveLast(); //gEventFirst.SetScene(selectedScene); //Release variables for an additional use //enumarator.Dispose() ; //cost = -1; //Get list enumarator //enumarator = mGameEventList.GetEnumerator(); //enumarator.MoveNext(); bool cantFind = false; bool isReady = false; int guessesLeft = 2; int count0 = 0; int count1 = 0; int count2 = 0; GameEvent gEventInspected; float random = UnityEngine.Random.Range(0f, 1f); enumarator = mGameEventList.GetEnumerator(); enumarator.MoveNext(); //iterate the list looking for a matching puzzle piece that is also while (guessesLeft > 0 && random < .7f && scenesLeft.Count > 0 && ++count1 != 100) { if (count1 == 9) { Debug.Log("help"); } guessesLeft--; gEventInspected = enumarator.Current; cost = gEventInspected.GetCost(); name = gEventInspected.mName; gameEventType = gEventInspected.GetEventType(); Debug.unityLogger.Log(TAG, string.Format("Event Assembler got a chance to buy")); //Update current Event //currentGEvent = gEventInspected; if (selector.GetMoney() >= cost) { //Random if should add to scene ot change to a different one random = UnityEngine.Random.Range(0f, 1f); if (random > .5f) { selectedScene = mod((selectedScene + 1), ApplicationConstants.NumberOfScenes); scenesLeft.Remove(selectedScene); } gEventInspected.SetScene(selectedScene); selector.ChargeMoney(cost); //Debug.unityLogger.Log(TAG, string.Format("Event Assembler bought {0} that cost {1} of type {2}", name, cost, gameEventType)); Debug.unityLogger.Log(TAG, string.Format("Event Assembler bought {0} that cost {1} of type {2}, it was" + "deployed to scene {3}", name, cost, gameEventType, selectedScene)); gameEventsListArray[selectedScene].Add(gEventInspected); } enumarator.MoveNext(); //attach the pieces together //currentGEvent.Attach(gEventInspected); random = UnityEngine.Random.Range(0f, 1f); //Update Current Scene ////Populate the Remaining moves left //LinkedList<AttachmentType> attachmentList // = PopulateAttachmentsList(currScene, scenesLeft); ////Shuffle the moves list to generate randomnes //FisherYatesShuffle.Shuffle(attachmentList); ////Draw a random move //AttachmentType attachment = attachmentList.Last.Value; //attachmentList.RemoveLast(); // if (GameEventRules.IsValidCombination(currentGEvent, gEventInspected, attachment)) // { // //Update Current Scene // currScene = GetSceneAfterAttachment(currScene, attachment); // //attach the pieces together // currentGEvent.Attach(attachment, gEventInspected); // mGameEventList.Remove(gEventInspected); // //Charge for attachment // money -= cost; // tubeCapacity -= cost; // //Update current Event // currentGEvent = gEventInspected; // currentGEvent.SetScene(currScene); // //Restarting the enumarator // enumarator = mGameEventList.GetEnumerator(); // enumarator.MoveNext(); // break; // } // //Draw a random move // attachment = attachmentList.Last.Value; // attachmentList.RemoveLast(); //} //if (!enumarator.MoveNext()) //{ // cantFind = true; // break; //} } Debug.unityLogger.Log(TAG, string.Format("Event Assembler now has {0} money", selector.GetMoney())); //return the combined piece return(gameEventsListArray); }