IEnumerator startCooking() { int veg = currentLockedPlayer.PlayerInventory.peekNextItem(); if (!Vegetables.isRawVegetable(veg))// if only it is vegetable then allow cooking. { resetData(); yield break; } // Enable salad canvas if (!saladCanvas.gameObject.activeSelf) { saladCanvas.gameObject.SetActive(true); } veg = currentLockedPlayer.PlayerInventory.getNextItem(); currentStack |= (int)Vegies.oneItemSaladHandle;// Adding salad handler enum value preparingVegData = ChefSaladManager.getVegetableData(veg); prepareTimeLeft = preparingVegData.preparationTime; // Wait and pass on this frame so calculation start from next frame. yield return(new WaitForEndOfFrame()); while (true) { // Moving player to stove's preparation point if ((stoveStandingSpot.position - currentLockedPlayer.transform.position).magnitude > 0.02) { currentLockedPlayer.transform.position += 2 * (stoveStandingSpot.position - currentLockedPlayer.transform.position) * Time.deltaTime; currentLockedPlayer.transform.rotation = stoveStandingSpot.rotation; } prepareTimeLeft -= Time.deltaTime; if (prepareTimeLeft <= 0)// if preparation time ends it means vegetable is prepared. { ingredientPrepared(veg); // Check for if player has more vegetable to add if yes then continue with next item he has. if (currentLockedPlayer.PlayerInventory.hasAnyItem()) { veg = currentLockedPlayer.PlayerInventory.peekNextItem(); // if next ingredient is already added then stop cooking or if salad still has space to add ingredient if ((currentStack & veg) != 0 || currentIngredientCount >= ChefSaladManager.MAX_INGREDIENT_COUNT) { break; } veg = currentLockedPlayer.PlayerInventory.getNextItem(); preparingVegData = ChefSaladManager.getVegetableData(veg); prepareTimeLeft = preparingVegData.preparationTime; } else { break; } } yield return(new WaitForEndOfFrame()); } resetData(); }
public override void interact(GameObject interactor) { Player player = interactor.GetComponent <Player>(); int item = player.PlayerInventory.getNextItem(); // if is vegetable then cost can be determined from vegetable data if (Vegetables.isRawVegetable(item)) { VegetableData vegData = ChefSaladManager.getVegetableData(item); if (onItemTrashed != null) { onItemTrashed.Invoke(player.GetId, vegData.Penalty); } } else // if it is salad we get each individual vegetable by bit shifting vegetable integer and finding its vegetable data { float cost = 0; int itemMask = item; for (int i = 0; i < (int)Vegies.count; i++) { if ((itemMask & 1) > 0) { int veg = (int)Mathf.Pow(2, i); VegetableData vegData = ChefSaladManager.getVegetableData(veg); cost += vegData.Penalty; } itemMask >>= 1; } if (onItemTrashed != null) { onItemTrashed.Invoke(player.GetId, cost); } } }
public override void interact(GameObject interactor) { BasicPawn pawn = interactor.GetComponent <BasicPawn>(); if (pawn.controller is NpcController) // If is NPC then set all data that customer is bringing in to counter. { resetData(); waitingController = (NpcController)pawn.controller; progressionBar.gameObject.SetActive(true); // Make controller stop waitingController.IsMobile = false; // Hard coded value to make npc go off screen after waiting waitingController.MoveTo = new Vector3(transform.parent.position.x, transform.parent.position.y + 7, waitingController.GetControlledPawn.transform.position.z); int itemMask = waitingController.attributes.salad; for (int i = 0; i < (int)Vegies.count; i++)// Using bit shifting to find ingredients. { if ((itemMask & 1) > 0) { int veg = (int)Mathf.Pow(2, i); VegetableData vegData = ChefSaladManager.getVegetableData(veg); scoreOnSuccess += vegData.Reward; penaltyOnFailure += vegData.Penalty; saladCanvas.addItem(vegData); } itemMask >>= 1; } scoreOnSuccess += scoreOnSuccess * waitingController.attributes.scoreMultiplier; penaltyOnFailure += waitingController.attributes.scoreMultiplier; } else //If it is player then get salad and do the processing. { Player player = (Player)pawn; int salad = player.PlayerInventory.getFirstItem(false) & (~(int)Vegies.oneItemSaladHandle); #if GAME_DEBUG Debug.Log("Player Serving salad " + salad + " Customer requested salad " + waitingController.attributes.salad); #endif if ((salad ^ waitingController.attributes.salad) == 0) // If salad ingredient match required ingredient do below { playerIds.Clear(); playerIds.Add(player.GetId); waitOver(scoreOnSuccess); } else // If not matching then add the player to player ids that needs to be affected by penalty. { playerIds.Add(player.GetId); if (timeMultiplier == 1)// Only increase time multiplier once rest of failure does not affect { timeMultiplier *= waitingController.attributes.failureTimeMultiplier; } } } }
private void ingredientPrepared(int vegMask) { // Adding the vegetable to salad and triggering the event. currentStack |= vegMask; currentIngredientCount++; #if GAME_DEBUG Debug.Log("Chopped Vegetable " + vegMask + " Salad " + currentStack); #endif if (ingredientPreparedEvent != null) { ingredientPreparedEvent.Invoke(vegMask, currentStack); } saladCanvas.addItem(ChefSaladManager.getVegetableData(vegMask)); }
/// <summary> /// Refreshes and recreates inventory data of player /// </summary> public void inventoryRefresh() { if (playerInventory == null) { return; } int[] items = playerInventory.getItemsInArray(); while (inventoryPanel.transform.childCount != 0) { GameObject go = inventoryPanel.transform.GetChild(0).gameObject; go.transform.SetParent(null); Destroy(go); } if (reverseInventory) { Array.Reverse(items); } foreach (int item in items) { if (Vegetables.isRawVegetable(item)) { GameObject go = Instantiate(vegItemIconPrefab); SaladIngredientCanvasScript saladIngredient = go.GetComponent <SaladIngredientCanvasScript>(); saladIngredient.itemImageSprite.sprite = ChefSaladManager.getVegetableData(item).vegTexture; go.transform.SetParent(inventoryPanel.transform); } else { GameObject go = Instantiate(saladItemIconPrefab); SaladCanvasScript saladCanvas = go.GetComponent <SaladCanvasScript>(); go.transform.SetParent(inventoryPanel.transform); int itemMask = item; for (int i = 0; i < (int)Vegies.count; i++) { if ((itemMask & 1) > 0) { int veg = (int)Mathf.Pow(2, i); saladCanvas.addItem(ChefSaladManager.getVegetableData(veg)); } itemMask >>= 1; } } } }
public override void interact(GameObject interactor) { Player player = interactor.GetComponent <Player>(); if (vegetable == 0)// If dish is empty try get first vegetable from player inventory and store it here. { int veg = player.PlayerInventory.getFirstItem(true); if (veg != 0) { vegetable = veg; vegetableSprite.sprite = ChefSaladManager.getVegetableData(veg).vegTexture; } } else// If dish has vegetable add it to player inventory. { player.PlayerInventory.addItem(vegetable); vegetable = 0; vegetableSprite.sprite = null; } }
private void Awake() { // Destroy in case more object exists as it is singleton. if (manager != null) { Destroy(gameObject); return; } HIGHSCORE_SAVE_PATH = Path.Combine(Application.persistentDataPath, "highscores.sav"); manager = this; trashCan.onItemTrashed += itemTrashed; // Creating all Player ,Player controller,Player input manager combination and setting necessary data for them at start of game. foreach (PlayerSpawnData psd in playersToSpawn) { BasicPawn pawn = ((GameObject)Instantiate(playerPrefab, psd.spawnTransform.position, Quaternion.identity)).GetComponent <BasicPawn>(); if (!pawn) { throw new Exception("Add proper Pawn Prefab in game manager"); } pawn.name = psd.playerName; pawn.GetComponent <SpriteRenderer>().color = psd.spriteColor; PlayerController controller = ((GameObject)Instantiate(playerControllerPrefab)).GetComponent <PlayerController>(); if (!controller) { throw new Exception("Add proper Pawn Controller Prefab in game manager"); } controller.name = psd.playerName + "Controller"; InputManager inputManager = new GameObject(controller.name + "InputManager").AddComponent <InputManager>(); playersList.Add(controller.GetID, controller); controller.InputPrefix = psd.playerInputPrefix; controller.playerName = psd.playerName; controller.controlPawn(pawn); controller.setupInputs(inputManager); controller.PlayerState.onScoreChanged += scoreChangedFor; psd.playerHud.PlayerInventory = controller.PlayerInventory; psd.playerHud.PlayerState = controller.PlayerState; psd.stove.userId = psd.dish.userId = controller.GetID; } // Creating all NPC controller needed,One for each counter. foreach (GameObject counterObj in customerCounters) { CustomerCounter counter = counterObj.GetComponentInChildren <CustomerCounter>(); GameObject go = Instantiate(npcControllerPrefab); go.name = counter.name + "NpcController"; BasicController controller = go.GetComponent <BasicController>(); npcControllers.Add(controller); counter.onCustomerLeaving += customerLeft; } resultScreen = gameEndCanvas.GetComponentInChildren <ResultDisplay>(); resultScreen.restartButton.onClick.AddListener(restartLevel); }
private void restartLevel() { manager = null; SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex, LoadSceneMode.Single); }
/// <summary> /// Creates new NPC Attributes and sends the customer to chosen counter. /// </summary> private void createCustomer() { int index = -1; GameObject counter = ChefSaladManager.selectRandomUsableCounter(out index);// Select random available counter. if (counter == null) { return; } // Register to customer leaving that counter event of the counter. counter.GetComponentInChildren <CustomerCounter>().onCustomerLeaving += onNpcReturning; // Get NPC Controller of the counter. NpcController controller = (NpcController)ChefSaladManager.getNpcController(index); // Get Next NPC pawn from queue. NpcPawn pawn = npcsAvailable.Dequeue(); // Set Pawn's start position. pawn.transform.position = new Vector3(counter.transform.position.x, counter.transform.position.y + 7, pawn.transform.position.z); // Set controller variables and attributes. controller.MoveTo = new Vector3(counter.transform.position.x, counter.transform.position.y, pawn.transform.position.z); controller.IsMobile = true; controller.counterTransform = counter.transform; controller.attributes.failureTimeMultiplier = UnityEngine.Random.Range(minFailureTimeMultiplier, maxFailureTimeMultiplier); controller.attributes.scoreMultiplier = UnityEngine.Random.Range(minScoreMultiplier, maxScoreMultiplier); controller.attributes.maxWaitTime = 0; // Chose random number of ingredients. int noOfIngredient = UnityEngine.Random.Range(1, ChefSaladManager.MAX_INGREDIENT_COUNT); int salad = 0; // Selecting vegetable that the salad needs to be made of randomly and not repeating. for (int i = 0, trial = 0; i < noOfIngredient; i++, trial = 0) { int choosen = 0; int pow = 0; VegetableData vegData = null; while (trial < 3 && choosen == 0) { pow = UnityEngine.Random.Range(0, (int)Vegies.count); choosen = (int)Mathf.Pow(2, pow); if ((choosen & salad) == 0) { salad |= choosen; vegData = ChefSaladManager.getVegetableData(choosen); controller.attributes.maxWaitTime += (int)(vegData.preparationTime + (vegData.preparationTime * 4f)); } else { choosen = 0; trial++; } } if (choosen != 0) { continue; } pow = UnityEngine.Random.Range(0, (int)Vegies.count); choosen = (int)Mathf.Pow(2, pow); while ((choosen & salad) != 0) { pow++; choosen = (int)Mathf.Pow(2, pow % (int)Vegies.count); } vegData = ChefSaladManager.getVegetableData(choosen); controller.attributes.maxWaitTime += (int)(vegData.preparationTime + (vegData.preparationTime * 4f)); salad |= choosen; } controller.attributes.salad = salad; // Starting to control the selected pawn from selected controller. controller.controlPawn(pawn); }