public override void LoadState(ItemState state) { MealState mState = state as MealState; meal = mState; HeldIngredients.Clear(); HeldIngredients.AddRange(mState.ContainedIngredientIDs.Select(id => GetItemManager().ItemList[id] as Ingredient)); IsSpawned = mState.IsSpawned(); CookDuration = mState.cookDuration; IsBurnt = mState.IsBurnt(); IsCooked = mState.IsCooked(); UpdateVisuals(); }
private int CombineCookDurations_Stephen(MealState meal1, MealState meal2) { int cookDuration = 0; if (meal2.IsSpawned()) { cookDuration = Mathf.Min(Mathf.Min(meal1.cookDuration, meal1.ContainedIngredientIDs.Count * MealState.COOK_TIME_PER_INGREDIENT + 1), Mathf.Min(meal2.cookDuration, meal2.ContainedIngredientIDs.Count * MealState.COOK_TIME_PER_INGREDIENT + 1)); } else { cookDuration = meal1.cookDuration; } return(cookDuration); }
public virtual AIState ApplyAction(AIState currentState) { AIState cloneState = currentState.Clone() as AIState; foreach (int id in cloneState.PotStateIndexList) { if (id == currentState.CurrentPlayerState.HoldingItemID) { continue; } PotState pot = cloneState.ItemStateList[id] as PotState; MealState meal = cloneState.ItemStateList[pot.mealID] as MealState; if (meal.IsSpawned()) { meal.CookIngredients(); } } return(cloneState); }
public float GetHeuristic(AIState state) { if (state.Heuristic >= 0) { return(state.Heuristic); } if (HeuristicPerIngredient == null) { Init(state); } else { for (int i = 0; i < HeuristicPerIngredient.Count; ++i) { HeuristicPerIngredient[i].Clear(); } } foreach (int ingredientID in state.IngredientStateIndexList) { IngredientState iState = state.ItemStateList[ingredientID] as IngredientState; HeuristicPerIngredient[(int)iState.ingredientType].Add(IngredientHeuristic(iState)); } int ingredientHeuristicSum = 0; for (int i = 0; i < HeuristicPerIngredient.Count; ++i) { HeuristicPerIngredient[i].Sort(); ingredientHeuristicSum += HeuristicPerIngredient[i].Take(CountOfEachIngredient[i]).Sum(); } int cooktimeHeuristic = 0; int submittedHeuristic = 0; int[,] mealIngredientCounts = state.GetMealIngredientCounts(); for (int goalIndex = 0; goalIndex < Goal.GoalRecipes.Count; ++goalIndex) { int neededCookTime = Goal.GoalRecipes[goalIndex].Count * MealState.COOK_TIME_PER_INGREDIENT + 1; int minGoalCookTime = neededCookTime; bool submitted = false; List <int> goalRecipe = Goal.IngredientCountsPerRecipe[goalIndex]; for (int mealListIndex = 0; mealListIndex < state.MealStateIndexList.Count; ++mealListIndex) { MealState meal = state.ItemStateList[state.MealStateIndexList[mealListIndex]] as MealState; if (!meal.IsSpawned()) { continue; } int onionCount = mealIngredientCounts[mealListIndex, (int)IngredientType.ONION]; int mushroomCount = mealIngredientCounts[mealListIndex, (int)IngredientType.MUSHROOM]; if (meal.IsBurnt() || onionCount > goalRecipe[(int)IngredientType.ONION] || mushroomCount > goalRecipe[(int)IngredientType.MUSHROOM]) { continue; } // Found qualifying meal. bool foundPlate = false; // Is there a plate holding this meal...? foreach (int plateID in state.PlateStateIndexList) { PlateState plate = state.ItemStateList[plateID] as PlateState; if (plate.mealID != meal.ID) { continue; } foundPlate = true; if (plate.IsSubmitted) { // Check if the meal completely matches if (meal.IsCooked() && onionCount == goalRecipe[(int)IngredientType.ONION] && mushroomCount == goalRecipe[(int)IngredientType.MUSHROOM]) { // Good job. submitted = true; minGoalCookTime = 0; } else { // Submitted meal that doesn't match the recipe or is uncooked // skip. } } else { // Qualifying meal on a plate that hasn't been submitted. int currentCookDuration = Mathf.Min(meal.cookDuration, meal.ContainedIngredientIDs.Count * MealState.COOK_TIME_PER_INGREDIENT + 1); int remainingCookTime = Mathf.Max(0, neededCookTime - currentCookDuration); minGoalCookTime = Mathf.Min(minGoalCookTime, remainingCookTime); } break; } if (!foundPlate) { // Meal is in a pot. int currentCookDuration = Mathf.Min(meal.cookDuration, meal.ContainedIngredientIDs.Count * MealState.COOK_TIME_PER_INGREDIENT + 1); int remainingCookTime = Mathf.Max(0, neededCookTime - currentCookDuration); minGoalCookTime = Mathf.Min(minGoalCookTime, remainingCookTime); } } //cooktimeHeuristic = Mathf.Max(cooktimeHeuristic, minGoalCookTime); cooktimeHeuristic += minGoalCookTime; submittedHeuristic += submitted ? 0 : 1; } //state.Heuristic = Mathf.Max(ingredientHeuristicSum + submittedHeuristic, cooktimeHeuristic); //state.Heuristic = ingredientHeuristicSum + submittedHeuristic; float parallelism = Mathf.Min(Goal.GoalRecipes.Count, state.PotStateIndexList.Count); state.Heuristic = ingredientHeuristicSum + (cooktimeHeuristic / parallelism) + submittedHeuristic; return(state.Heuristic); }
/// <summary> /// Used to get all of the valid actions for the current state /// </summary> /// <returns></returns> public List <Action> GetValidActions(AIState state) { List <Action> validActions = new List <Action>(); //Waiting around validActions.Add(new IdleAction()); //Things you can do when your hands are free if (state.CurrentPlayerState.HandsFree()) { //Spawning items foreach (IngredientType type in System.Enum.GetValues(typeof(IngredientType))) { SpawnAction spawnAction = new SpawnAction(type); if (spawnAction.isValid(state)) { validActions.Add(spawnAction); } } PickUpAction pickupAction; //Picking up everything //Ingredients foreach (int ingredientID in state.IngredientStateIndexList) { IngredientState ingredient = state.ItemStateList[ingredientID] as IngredientState; if (ingredient.IsSpawned && !ingredient.IsInMeal) { pickupAction = new PickUpAction(ingredient.ID); validActions.Add(pickupAction); } } //Pots foreach (int potID in state.PotStateIndexList) { PotState pot = state.ItemStateList[potID] as PotState; pickupAction = new PickUpAction(pot.ID); validActions.Add(pickupAction); } //Plates foreach (int plateID in state.PlateStateIndexList) { PlateState plate = state.ItemStateList[plateID] as PlateState; pickupAction = new PickUpAction(plate.ID); validActions.Add(pickupAction); } PrepareAction prepAction; foreach (int boardID in state.BoardStateIndexList) { BoardState bState = state.ItemStateList[boardID] as BoardState; if (!bState.IsFree()) { IngredientState iState = state.ItemStateList[bState.HoldingItemID] as IngredientState; if (iState != null && !iState.IsPrepared) { prepAction = new PrepareAction(boardID); validActions.Add(prepAction); } } } } //Things you can do when you have something in hand else { DropOffAction dropoffAction; TransferAction transferAction; ItemState itemState = state.ItemStateList[state.CurrentPlayerState.HoldingItemID]; ItemType type = itemState.MyItemType; if (type == ItemType.INGREDIENT) { //Putting things on the table foreach (int tableID in state.TableStateIndexList) { TableSpace table = state.ItemStateList[tableID] as TableSpace; if (table.IsFree()) { dropoffAction = new DropOffAction(table.ID); validActions.Add(dropoffAction); } } //Moving ingredients to a cutting board foreach (int boardID in state.BoardStateIndexList) { BoardState board = state.ItemStateList[boardID] as BoardState; if (board.IsFree()) { dropoffAction = new DropOffAction(board.ID); validActions.Add(dropoffAction); } } if ((itemState as IngredientState).IsPrepared) { //Moving ingredients to a pot foreach (int potID in state.PotStateIndexList) { PotState pot = state.ItemStateList[potID] as PotState; MealState meal = state.ItemStateList[pot.mealID] as MealState; if (meal.MealSize() + 1 <= PotState.MAX_ITEMS_PER_POT && !meal.IsBurnt()) { dropoffAction = new DropOffAction(pot.ID); validActions.Add(dropoffAction); } } //Moving ingredients to a plate foreach (int plateID in state.PlateStateIndexList) { PlateState plate = state.ItemStateList[plateID] as PlateState; MealState meal = state.ItemStateList[plate.mealID] as MealState; if (!plate.IsSubmitted && !meal.IsBurnt()) { dropoffAction = new DropOffAction(plate.ID); validActions.Add(dropoffAction); } } } } if (type == ItemType.POT) { PotState pot = itemState as PotState; MealState meal = state.ItemStateList[pot.mealID] as MealState; //Putting the pot on the table foreach (int tableID in state.TableStateIndexList) { TableSpace table = state.ItemStateList[tableID] as TableSpace; if (table.IsFree()) { dropoffAction = new DropOffAction(table.ID); validActions.Add(dropoffAction); } } //Moving meal to a pot transferAction = new TransferAction(Item.NOTHING_ID); foreach (int potID in state.PotStateIndexList) { transferAction.id = potID; if (transferAction.isValid(state)) { validActions.Add(transferAction); transferAction = new TransferAction(Item.NOTHING_ID); } } //Moving the meal to another plate foreach (int plateID in state.PlateStateIndexList) { transferAction.id = plateID; if (transferAction.isValid(state)) { validActions.Add(transferAction); transferAction = new TransferAction(Item.NOTHING_ID); } } } if (type == ItemType.PLATE) { PlateState plate = itemState as PlateState; //Putting things on the table foreach (int tableID in state.TableStateIndexList) { TableSpace table = state.ItemStateList[tableID] as TableSpace; if (table.IsFree()) { dropoffAction = new DropOffAction(table.ID); validActions.Add(dropoffAction); } } //If the plate is non-empty MealState heldMeal = state.ItemStateList[plate.mealID] as MealState; if (heldMeal.IsSpawned()) { //Submitting the meal if (heldMeal.IsCooked()) { SubmitOrderAction submitAction = new SubmitOrderAction(); validActions.Add(submitAction); } //Moving meal to a pot transferAction = new TransferAction(Item.NOTHING_ID); foreach (int potID in state.PotStateIndexList) { transferAction.id = potID; if (transferAction.isValid(state)) { validActions.Add(transferAction); transferAction = new TransferAction(Item.NOTHING_ID); } } //Moving the meal to another plate foreach (int plateID in state.PlateStateIndexList) { transferAction.id = plateID; if (transferAction.isValid(state)) { validActions.Add(transferAction); transferAction = new TransferAction(Item.NOTHING_ID); } } } } } return(validActions); }