// Update is called once per frame void Update() { float oldTimeStamp = timeStamp; timeStamp += Time.deltaTime * 8; if ((int)oldTimeStamp != (int)timeStamp && toConvert.Count > 0) //IE: Every 1/8th second... { CubeConversionRequest request = toConvert[UnityEngine.Random.Range(0, toConvert.Count)]; //float spinnerFloaterOffset = UnityEngine.Random.Range(.6f, 1.6f); float spinnerFloaterOffset = UnityEngine.Random.Range(.1f, .3f); //Very little swirl GameObject go = new GameObject(); go.transform.SetParent(this.transform); go.transform.position = request.gameCube.transform.position + new Vector3(spinnerFloaterOffset, 0, 0); SpinnerFloater spinnerFloater = go.AddComponent <SpinnerFloater>(); InvisibleDelayedChargeGiver chargeGiver = GameObject.Instantiate <InvisibleDelayedChargeGiver>(chargeGiverPrefab); chargeGiver.target = player; chargeGiver.delay = tweenTime + particleToShipTime; chargeGiver.type = request.type; chargeGiver.SetAmountForOneCube(request.type); spinnerFloater.chargeToGive = chargeGiver.amount; chargeGiver = GameObject.Instantiate <InvisibleDelayedChargeGiver>(chargeGiverPrefab); chargeGiver.target = player; chargeGiver.delay = infusionParticleSpawnTime; chargeGiver.type = PowerupType.ENERGY; chargeGiver.SetAmountAsEnergyCostForOneCube(request.type); spinnerFloater.energyToDrain = chargeGiver.amount * -1; spinnerFloater.cubeIOwn = request.gameCube; spinnerFloater.startPosition = go.transform.position; spinnerFloater.startRotation = spinnerFloater.cubeIOwn.transform.rotation; Transform target = player.getNextAttackCubeHolderPosition(); spinnerFloater.endPosition = target.position; spinnerFloater.endRotation = target.rotation; spinnerFloater.offset = spinnerFloaterOffset; spinnerFloater.tweenTime = tweenTime - .1f; spinnerFloater.toDrainEnergyFrom = player; spinnerFloater.infusionParticleSpawnTime = infusionParticleSpawnTime; spinnerFloater.powerupEffect = powerupEffectPrefab; spinnerFloater.type = request.type; request.gameCube.transform.parent = spinnerFloater.transform; toConvert.Remove(request); } }
public void DropPiece() { //Place the cubes from the piece to the board. for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { if (currentPiece.HasBlockAt(x, y)) { GameCube cube = currentPiece.GetCubeAt(x, y); grid[currentPiecePosition.x + x - 1, currentPiecePosition.y + y - 1] = cube; cube.transform.parent = this.transform; cube.transform.localPosition = new Vector3(currentPiecePosition.x - numCells.x / 2f + x - 1 + .5f, 0, currentPiecePosition.y - numCells.y / 2f + y - 1 + .5f); } } } //Check for squares List <GameCube> cubesToExplode = new List <GameCube>(); int numberOfSquaresMade = 0; for (int x = 0; x < numCells.x - 2; x++) { for (int y = 0; y < numCells.y - 2; y++) { if (IsCornerOfSquare(x, y)) { AddCubesFromSquareToList(x, y, cubesToExplode); numberOfSquaresMade++; } } } int numberOfParticles = numberOfSquaresMade * 3; List <float> delays = new List <float>(); for (int x = 0; x < numberOfParticles; x++) { float delay = UnityEngine.Random.Range(0, Mathf.Sqrt(numberOfSquaresMade / 2)); delays.Add(delay); } delays.Sort(); player.StartNewParticleBarrage(); foreach (float delay in delays) { if (player.HasRoomForMoreEnergy()) { PowerupEffect pe = GameObject.Instantiate <PowerupEffect>(powerUpEffect); GameCube sourceCube = cubesToExplode[UnityEngine.Random.Range(0, cubesToExplode.Count)]; pe.Initialize(sourceCube.transform.position, player.GetTargetOfParticle(PowerupType.ENERGY, 3), delay, PowerupType.ENERGY); InvisibleDelayedChargeGiver chargeGiver = GameObject.Instantiate <InvisibleDelayedChargeGiver>(chargeGiverPrefab); chargeGiver.target = player; chargeGiver.delay = delay + 1; chargeGiver.type = PowerupType.ENERGY; chargeGiver.SetAmountForOneCube(PowerupType.ENERGY); chargeGiver.amount /= 3; //(3 particles per square made); } } if (numberOfSquaresMade != 0) { matchSound.Play(); if (numberOfSquaresMade >= 2) { Vector3 centroid = FindCentroid(cubesToExplode); GameObject comboParticles = comboParticleHolder.comboParticles[numberOfSquaresMade].gameObject; GameObject go = GameObject.Instantiate(comboParticles); go.transform.position = centroid; } } else { dropSound.Play(); } //This is where we handle explosions based on tile color. for (int x = 0; x < numCells.x; x++) { for (int y = 0; y < numCells.y; y++) { if (grid[x, y] != null && cubesToExplode.Contains(grid[x, y])) { //A cube that has exploded is on a tile. What kind? switch (cellTypes[x, y]) { case CellType.ATTACK: cubeConversionManager.QueueCube(grid[x, y], PowerupType.ATTACK); cubesToExplode.Remove(grid[x, y]); grid[x, y] = null; break; case CellType.SHIELD: cubeConversionManager.QueueCube(grid[x, y], PowerupType.SHIELDS); cubesToExplode.Remove(grid[x, y]); grid[x, y] = null; break; } } } } foreach (GameCube cube in cubesToExplode) { RemoveCubeFromGrid(cube); cube.Sink(UnityEngine.Random.Range(0, Mathf.Sqrt(numberOfSquaresMade))); } Destroy(currentPiece.gameObject); currentPiece = nextPiece; currentPiece.transform.parent = this.transform; currentPiecePosition = new Vector2Int(1, 1); UpdateCurrentPieceTransform(); nextPiece = MakeAPiece(); nextPiece.transform.parent = nextPieceHolder; nextPiece.transform.localPosition = Vector3.zero; prevPieceRotation = currentPieceRotation = 0; //For tutorials; hack in a callback; if (MissionManager.triggerCallbacksOnBlockDrop) { MissionManager.instance.grossCallbackHack.enabled = true; } }