// 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);
        }
    }
Beispiel #2
0
    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;
        }
    }