예제 #1
0
    private TunnelPiece takeFromPool(int index)
    {
        TunnelPiece piece = availablePool [index];

        availablePool.RemoveAt(index);
        return(piece);
    }
예제 #2
0
	private void updateClearRun(TunnelPiece newPiece) {
		if (newPiece.clearRun) {
			currentClearRun += newPiece.length();
		} else {
			currentClearRun = 0;
		}
	}
예제 #3
0
    private void spawnNewInstance(TunnelPiece template)
    {
        TunnelPiece instance = Instantiate <TunnelPiece> (template);

        instance.findBall();
        returnToPool(instance);
    }
예제 #4
0
	private TunnelSelectionPreferences buildPreferences() {
		TunnelSelectionPreferences prefs = new TunnelSelectionPreferences ();
		LinkedListNode<TunnelPiece> currentNode = tunnel.Last;

		float distanceToEndOfTunnel = 0f;
		float currentTunnelDifficulty = 0f;
		int numPieces = 0;

		while (distanceToEndOfTunnel < maxDistanceToCheckPreferenceModifiers && currentNode != null) {
			TunnelPiece piece = currentNode.Value;
			prefs = piece.updatePreferences(prefs, distanceToEndOfTunnel);
			distanceToEndOfTunnel += piece.length();
			currentTunnelDifficulty += piece.difficultyLevel;
			currentNode = currentNode.Previous;
			numPieces++;
		}

		//set the average difficulty in case anyone cares
		currentAverageDifficulty = currentTunnelDifficulty / numPieces;
		//int bucketLevel = calculateBucketLevel ();
		prefs.maxBucketLevel = (int) Mathf.Lerp(0, maxBucketLevel, ball.position.z / distanceToMaxSettings);
		prefs.maxDifficulty = Mathf.Lerp(baseDifficulty, maxDifficulty, ball.position.z / distanceToMaxSettings) - currentTunnelDifficulty;
		prefs.preferredDifficulty = prefs.maxDifficulty / 2f;
		return prefs;
	}
예제 #5
0
	private void extendTunnelEnd() {
		while (tunnelLength() < minTunnelLength) {
			TunnelPiece newPiece = tunnel.Last.Value.spawnChildPiece(buildPreferences());
			updateClearRun(newPiece);
			deadZone.position = deadZone.position + newPiece.endOffset;
			tunnel.AddLast(newPiece);
		}
	}
예제 #6
0
    //This method of selecting pieces is no longer used
    public TunnelPiece takeRandomPieceFromPool()
    {
        int         index = Random.Range(0, (availablePool.Count));
        TunnelPiece piece = availablePool [index];

        availablePool.RemoveAt(index);
        return(piece);
    }
예제 #7
0
    public virtual void setup(TunnelSelectionPreferences prefs, TunnelPiece parent)
    {
        position = transform.position;
        float flyInTime = Mathf.Lerp(0, maxFlyInTime, 1 / (ball.GetTargetVelocity().magnitude / 30f));

        //Debug.Log ("Fly in time: " + flyInTime + " for ball speed of: " + ball.GetTargetVelocity ().magnitude);
        transform.position = transform.position + (((Vector3.down * Random.Range(-1, 2)) + (Vector3.left * Random.Range(-1, 2))) * maxFlyInDistance);
        transform.DOMove(position, flyInTime).Play();
    }
예제 #8
0
    public TunnelPiece spawnChildPiece(TunnelSelectionPreferences prefs)
    {
        TunnelPiece child = TunnelPiecePool.INSTANCE.takeWeightedRandomPieceFromPool(prefs);

        child.transform.position = position + endOffset;
        child.gameObject.SetActive(true);
        child.setup(prefs, this);
        child.choosePotentialCollectableSlot();
        return(child);
    }
예제 #9
0
 private void initPool()
 {
     availablePool = new List <TunnelPiece> ();
     for (int i = 0; i < tunnelPiecePrefabs.Length; i++)
     {
         TunnelPiece template = tunnelPiecePrefabs[i];
         for (int j = 0; j < template.frequency; j++)
         {
             spawnNewInstance(template);
         }
     }
 }
예제 #10
0
    public override void setup(TunnelSelectionPreferences prefs, TunnelPiece parent)
    {
        base.setup(prefs, parent);
        jumpExtension = Mathf.Clamp(((TunnelSpawnController.INSTANCE.getCurrentClearRun())) / 4, 0, maxJumpExtension);
        float difficultyBasedMaxJumpRise = Mathf.Lerp(0, maxJumpRise, (1 - (2 * TunnelSpawnController.INSTANCE.GetCurrentAverageDifficulty())));

        jumpRise = Mathf.Lerp(0, difficultyBasedMaxJumpRise, jumpExtension / maxJumpExtension);
        Debug.Log("Jump rise = " + jumpRise + ", Jump extension = " + jumpExtension + ", Ave Difficulty = " + TunnelSpawnController.INSTANCE.GetCurrentAverageDifficulty());
        jumpEnd.position = jumpEnd.position + (Vector3.forward * jumpExtension) + (Vector3.up * jumpRise);
        this.endOffset   = this.endOffset + (Vector3.forward * jumpExtension);
        this.endOffset   = this.endOffset + (Vector3.up * jumpRise);
    }
예제 #11
0
	private void trimTunnelStart() {
		TunnelPiece toTrim = tunnel.First.Value;
		while (ball.position.z - (toTrim.transform.position.z + toTrim.endOffset.z) > minTunnelLengthBehind) { 
			toTrim.tearDown ();
			if (!isStarterPiece (toTrim)) {
				TunnelPiecePool.INSTANCE.returnToPool (toTrim);		 
			} else {
				toTrim.gameObject.SetActive (false);
			}
			tunnel.RemoveFirst ();
			toTrim = tunnel.First.Value;
		}
	}
예제 #12
0
    public TunnelPiece takeWeightedRandomPieceFromPool(TunnelSelectionPreferences prefs)
    {
        float[] cumulativeSumOfWeights = new float[availablePool.Count];

        //Created a cumulative sum array based on piece weights for the supplied selection preferences
        float  weightSum    = 0;
        string weightedPool = "";

        for (int i = 0; i < availablePool.Count; i++)
        {
            TunnelPiece tp     = availablePool[i];
            float       weight = tp.calculateWeight(prefs);
            weightSum += weight;
            cumulativeSumOfWeights[i] = weightSum;

            if (Debug.isDebugBuild)
            {
                weightedPool = weightedPool + tp.name + ": " + weight + "\n";
            }
        }

        //Randomly select a piece based upon the weights calculated above (note that a zero weight can never be selected so the piece taken here is already guaranteed valid)
        float rand = Random.Range(0f, weightSum);

        for (int i = 0; i < availablePool.Count; i++)
        {
            if (cumulativeSumOfWeights[i] >= rand)
            {
                TunnelPiece chosen = takeFromPool(i);
                if (Debug.isDebugBuild)
                {
                    TunnelSpawnController.INSTANCE.debug.text = weightedPool
                                                                + "Chosen Piece: " + chosen.name + "\n"
                                                                + "Bucket Level: " + prefs.maxBucketLevel + "\n"
                                                                + "Max Difficulty: " + prefs.maxDifficulty;
                }
                return(chosen);
            }
        }

        //This shouldn't ever happen
        return(takeFromPool(0));
    }
예제 #13
0
 public override void setup(TunnelSelectionPreferences prefs, TunnelPiece parent)
 {
     base.setup(prefs, parent);
     axisRot.enabled = (prefs.maxBucketLevel >= spinBucketLevel && Random.Range(0f, 2f) <= 1f);
 }
예제 #14
0
 public override void setup(TunnelSelectionPreferences prefs, TunnelPiece parent)
 {
     base.setup(prefs, parent);
     //extendDrop (prefs);
     extendBody(prefs);
 }
예제 #15
0
 public void returnToPool(TunnelPiece piece)
 {
     piece.gameObject.SetActive(false);
     availablePool.Add(piece);
 }
예제 #16
0
	private bool isStarterPiece(TunnelPiece piece) {
		return piece.CompareTag ("FirstPipe") || piece.CompareTag ("SecondPipe");
	}
예제 #17
0
 public override void setup(TunnelSelectionPreferences prefs, TunnelPiece parent)
 {
     base.setup(prefs, parent);
     configInUse = getRandomConfig(prefs);
     applyConfig(configInUse);
 }