IEnumerator harvestLetter() { //signal the start of the harvest process bool colliding = pphysics.CheckLetterCollision(); //the rays haven't been updated after fixedUpdate...we have to make sure we're still on a letter if (!harvesting && harvestableLetter != null && !harvestableLetter.Rotating && colliding) { pphysics.horizontal_move(0, true, false); setPlayerActive(false); harvesting = true; anim.SetBool("harvesting", true); harvestableLetter.setAsHarvested(); float startTime = Time.time; while (Time.time - startTime < 1f) { if (harvestableLetter.HasDisappeared) { break; } yield return(new WaitForEndOfFrame()); } anim.SetBool("harvesting", false); //if the letter disappeared while we were harvesting if (!harvestableLetter.HasDisappeared) { bool newPowerup = false; string l = harvestableLetter.letter; int powerup_count = 1; bool check_if_POTD = GameManager.IsPOTD(l); //add checks for all POTD items if (check_if_POTD && IncrementPOTDIfExists(l) != null) //include all place once and destroy objects { EventHandler <NewLetterEvent> handler = PowerupChange; if (handler != null) { handler(this, new NewLetterEvent(harvestableLetter, 1)); } } else //permanent buffs { Letter eventLetter = harvestableLetter; //can only replicate the item in slot 1 //need to switch the letter to the powerup[0] slot before we send the event if (harvestableLetter.letter == "C") { sendHandlerEvent(eventLetter, powerups [0].count > 1 ? powerups [0].count : 0); if (powerups.Count > 0 && powerups [0] != null) { eventLetter.letter = powerups [0].letter.letter; powerup_count = powerups [0].count; newPowerup = true; } } //can only use the N powerup with an item in slot 1 else if (harvestableLetter.letter == "N") { if (powerups.Count > 0) { while (powerups.Count > 0) { PowerupRemoved(powerups [powerups.Count - 1]); powerups.RemoveAt(powerups.Count - 1); } } sendHandlerEvent(eventLetter, 0); } else if (harvestableLetter.letter == "X") { foreach (Powerup p in powerups) { if (GameManager.IsPOTD(p.letter.letter)) { p.count++; } } sendHandlerEvent(eventLetter, 0); } else if (harvestableLetter.letter == "P") { sendHandlerEvent(eventLetter, -2); transform.position = originalPosition; List <Letter> letters = GameObject.FindGameObjectsWithTag("Letter").Select(a => a.GetComponent <Letter> ()).ToList(); foreach (Letter a in letters) { if (a != pphysics.collisionLetter) { a.ResetLetter(); } } //should we also destroy in air throwables? } //we're picking up a new powerup else { newPowerup = true; sendHandlerEvent(eventLetter, 0); } } if (newPowerup) { Powerup power = new Powerup(harvestableLetter); power.count = powerup_count; PowerupAdded(power); if (powerups.Count > 1 && powerups [0] == null) { //if item2 is defined but item1 is null (POTD was used) powerups [0] = power; } else { powerups.Insert(0, power); } while (powerups.Count > 2) { PowerupRemoved(powerups [powerups.Count - 1]); powerups.RemoveAt(powerups.Count - 1); } //if something is already mapped to x, store mapping as y if (getIndexFromMapping("X") >= 0) { powerups [0].buttonMapping = "Y"; } else { powerups [0].buttonMapping = "X"; } } } harvestableLetter = null; harvesting = false; if (GameManager.letters_active > 0) { setPlayerActive(true); } } yield return(null); }