IEnumerator DeactivatePieceOnDelay(BuiltPathPiece deactivateBPP, PathedArea pArea) { yield return(new WaitForSeconds(0.5f)); if (pArea.thisAreaFormat == AreaFormat.Procedural) { deactivateBPP.DeactivateToPool(); } else { //Deactivate fixed area pArea.fixedAreaObject.SetActive(false); //Also deactivate any connected areas for (int i = 0; i < pArea.connectionPieces.Count; i++) { PathPoolGroup ppGroup = allPathedAreas.Find(x => x.thisPathedArea.thisAreaType == pArea.connectionPieces[i].areaTo); if (ppGroup != null && ppGroup != currentPathPoolGroup) { ppGroup.pathFirstLeftPiece.DeactivateToPool(); ppGroup.pathFirstRightPiece.DeactivateToPool(); } } } }
public void PlayerEntersNewArea(PathedArea pa) { //Reset counters currentPathProgress = 0; currentPathArea = pa; ppMan.MoveToNewArea(pa.thisAreaType); Debug.Log("Player enters new area " + currentPathArea.thisAreaType); }
public BuiltPathPiece GetValidBPPForPathedArea(PathedArea pArea) { //Find the related group PathPoolGroup ppGroup = allPathedAreas.Find(x => x.thisPathedArea == pArea); //Get a random available piece from that group BuiltPathPiece availablePiece = GetProceduralBPPForGroup(ppGroup); //Return the piece return(availablePiece); }
public void PlayerEntersNewPiece(BuiltPathPiece newPieceRef) { Debug.Log("Player enters " + newPieceRef); //Area check //PathedArea pa = ppMan.GetAreaForBuiltPathPiece(newPieceRef); bool enteredNewArea = false; //[TODO] temporary? Will town pieces be BPP? if (currentBPP != null && ((currentPathArea.thisAreaFormat != AreaFormat.Fixed) || (currentPathArea.thisAreaFormat == AreaFormat.Fixed && currentPathProgress == 0))) { ppMan.DeactivatePieces(currentBPP, newPieceRef); } //Current piece is new piece currentBPP = newPieceRef; currentBPP.PlayerOnThisPiece(); currentPathProgress++; //If the player has travelled to a new area for (int i = 0; i < currentPathArea.connectionPieces.Count; i++) { //If it's a connection piece that the player entered, they are moving to a new area if (currentPathArea.connectionPieces[i].thisConnectionPiece == newPieceRef) { #region Area Change enteredNewArea = true; PathedArea newPA = ppMan.GetAreaOfType(currentPathArea.connectionPieces[i].areaTo); PlayerEntersNewArea(newPA); if (currentPathArea.thisAreaFormat == AreaFormat.Fixed) { //Spawn extensions if it's a fixed area BuildExtensionsToFixedArea(); } else if (currentPathArea.thisAreaFormat == AreaFormat.Procedural) { //Otherwise do normal spawning of extensions for procedural area StartOnProceduralPath(); } #endregion } } //If the area remains the same - continue building forward if (enteredNewArea == false) { ContinueProceduralArea(); } }
public void ActivatePathPiece_InConnectedArea(PathedArea pArea, BuiltPathPiece bppRef, bool isLeft, bool isRight) { PathPoolGroup thisGroup = allPathedAreas.Find(x => x.thisPathedArea == pArea); if (isLeft) { thisGroup.pathFirstLeftPiece = bppRef; } else if (isRight) { thisGroup.pathFirstRightPiece = bppRef; } bppRef.ActivateFromPool(); }
void PositionFixedArea(BuiltPathPiece exitPiece, PathedArea fixedArea) { //Get entrance area to align FixedAreaEntrances entranceArea = fixedArea.GetFixedAreaEntranceForAreaType(currentPathArea.thisAreaType); //"Place" entrance piece going left //entranceArea.connectedEntrancePathPiece.intendedMoveDirection = GetLeftMoveDirection(exitPiece.intendedMoveDirection); //Piece should go straight ahead entranceArea.connectedEntrancePathPiece.intendedMoveDirection = exitPiece.intendedMoveDirection; Vector3 exitPosition = GetNextPlacementPosition(entranceArea.connectedEntrancePathPiece.intendedMoveDirection, exitPiece.exitLocations[0].pathTurnLocation.position, entranceArea.connectedEntrancePathPiece); //Get rotation where "intended direction" compares to "entrance direction" int directionDiff = (int)entranceArea.connectedEntrancePathPiece.intendedMoveDirection - (int)entranceArea.entranceDirection; directionDiff++; //Because north is 1 if (directionDiff < 1) { directionDiff += 4; } else if (directionDiff > 4) { directionDiff -= 4; } MoveDirection directionDiffDir = (MoveDirection)directionDiff; Vector3 fixedEul = Vector3.zero; Vector3 newFixedAreaPos = Vector3.zero; switch (directionDiffDir) { case MoveDirection.West: fixedEul.y = 270f; break; case MoveDirection.South: fixedEul.y = 180f; break; case MoveDirection.East: fixedEul.y = 90f; break; //exit and move are same case MoveDirection.North: fixedEul.y = 0f; break; } //Update fixed area connection piece directions to work with new rotation for (int i = 0; i < fixedArea.connectionPieces.Count; i++) { int moveDirChange = (int)fixedArea.connectionPieces[i].originalPieceDirection + directionDiff; moveDirChange--; //Because north is 1 if (moveDirChange > 4) { moveDirChange -= 4; } fixedArea.connectionPieces[i].connectionPieceDirection = (MoveDirection)moveDirChange; } Debug.Log(exitPiece.intendedMoveDirection + " " + entranceArea.connectedEntrancePathPiece.intendedMoveDirection + " " + entranceArea.entranceDirection + " " + directionDiffDir); //Adjust town based on entrance fixedArea.fixedAreaObject.transform.eulerAngles = fixedEul; //Get original settings of entrancePiece to fixedArea Vector3 pieceOffset = entranceArea.connectedEntrancePathPiece.transform.position - fixedArea.fixedAreaObject.transform.position; //entranceArea.connectedEntrancePathPiece.transform.position = exitPosition; newFixedAreaPos = exitPosition - pieceOffset; Debug.Log(exitPosition + " " + pieceOffset + " " + newFixedAreaPos); fixedArea.fixedAreaObject.transform.position = newFixedAreaPos; fixedArea.fixedAreaObject.SetActive(true); exitPiece.exitLocations[0].connectedFixedArea = fixedArea; }
//[TODO] Extension code could probably / definitely be cleaned up (duplicates) //Procedural version of the above void BuildConnectionsToConnectedArea(PathConnectionPiece connectionPiece) { PathedArea connectedPathArea = ppMan.GetAreaOfType(connectionPiece.areaTo); //Move fixed areas accordingly if (connectedPathArea.thisAreaFormat == AreaFormat.Fixed) { //[TODO] properly reposition PositionFixedArea(connectionPiece.thisConnectionPiece, connectedPathArea); } //OR spawn extensions of next procedural area else { //Get Exit Location ref BuiltPathPiece extensionBPP = connectionPiece.thisConnectionPiece; //Get position for pieces to be placed Vector3 exitPosition = extensionBPP.exitLocations[0].pathTurnLocation.position; if (extensionBPP.exitLocations[0].canDoLeft) { //Spawn a left piece for this pathed area BuiltPathPiece leftPiece = ppMan.GetValidBPPForAreaType(connectionPiece.areaTo); //Position and rotate accordingly leftPiece.intendedMoveDirection = GetLeftMoveDirection(connectionPiece.connectionPieceDirection); leftPiece.transform.position = GetNextPlacementPosition(leftPiece.intendedMoveDirection, exitPosition, leftPiece); leftPiece.transform.eulerAngles = GetEulerAnglesForMoveDirection(leftPiece.intendedMoveDirection); extensionBPP.exitLocations[0].nextLeftPathPiece = leftPiece; switch (leftPiece.intendedMoveDirection) { case MoveDirection.North: extensionBPP.exitLocations[0].connectedTurnTriggerArea.northPiece = leftPiece; break; case MoveDirection.East: extensionBPP.exitLocations[0].connectedTurnTriggerArea.eastPiece = leftPiece; break; case MoveDirection.South: extensionBPP.exitLocations[0].connectedTurnTriggerArea.southPiece = leftPiece; break; case MoveDirection.West: extensionBPP.exitLocations[0].connectedTurnTriggerArea.westPiece = leftPiece; break; } //Activate piece ppMan.ActivatePathPiece_InConnectedArea(connectedPathArea, leftPiece, true, false); } if (extensionBPP.exitLocations[0].canDoRight) { //Spawn a right piece for this pathed area BuiltPathPiece rightPiece = ppMan.GetValidBPPForAreaType(connectionPiece.areaTo); //Position and rotate accordingly rightPiece.intendedMoveDirection = GetRightMoveDirection(connectionPiece.connectionPieceDirection); rightPiece.transform.position = GetNextPlacementPosition(rightPiece.intendedMoveDirection, exitPosition, rightPiece); rightPiece.transform.eulerAngles = GetEulerAnglesForMoveDirection(rightPiece.intendedMoveDirection); extensionBPP.exitLocations[0].nextRightPathPiece = rightPiece; switch (rightPiece.intendedMoveDirection) { case MoveDirection.North: extensionBPP.exitLocations[0].connectedTurnTriggerArea.northPiece = rightPiece; break; case MoveDirection.East: extensionBPP.exitLocations[0].connectedTurnTriggerArea.eastPiece = rightPiece; break; case MoveDirection.South: extensionBPP.exitLocations[0].connectedTurnTriggerArea.southPiece = rightPiece; break; case MoveDirection.West: extensionBPP.exitLocations[0].connectedTurnTriggerArea.westPiece = rightPiece; break; } //Activate piece ppMan.ActivatePathPiece_InConnectedArea(connectedPathArea, rightPiece, false, true); } } }
//Must be current area public void BuildExtensionsToFixedArea() { Debug.Log("Build fixed area extensions"); for (int i = 0; i < currentPathArea.connectionPieces.Count; i++) { PathedArea connectedPathArea = ppMan.GetAreaOfType(currentPathArea.connectionPieces[i].areaTo); Debug.Log("Build extensions for " + connectedPathArea.thisAreaType); //For each connection exit piece //Get Exit Location ref BuiltPathPiece extensionBPP = currentPathArea.connectionPieces[i].thisConnectionPiece; //Get position for pieces to be placed Vector3 exitPosition = extensionBPP.exitLocations[0].pathTurnLocation.position; if (extensionBPP.exitLocations[0].canDoLeft) { //Spawn a left piece for this pathed area BuiltPathPiece leftPiece = ppMan.GetValidBPPForAreaType(currentPathArea.connectionPieces[i].areaTo); //Position and rotate accordingly leftPiece.intendedMoveDirection = GetLeftMoveDirection(currentPathArea.connectionPieces[i].connectionPieceDirection); leftPiece.transform.position = GetNextPlacementPosition(leftPiece.intendedMoveDirection, exitPosition, leftPiece); leftPiece.transform.eulerAngles = GetEulerAnglesForMoveDirection(leftPiece.intendedMoveDirection); extensionBPP.exitLocations[0].nextLeftPathPiece = leftPiece; switch (leftPiece.intendedMoveDirection) { case MoveDirection.North: extensionBPP.exitLocations[0].connectedTurnTriggerArea.northPiece = leftPiece; break; case MoveDirection.East: extensionBPP.exitLocations[0].connectedTurnTriggerArea.eastPiece = leftPiece; break; case MoveDirection.South: extensionBPP.exitLocations[0].connectedTurnTriggerArea.southPiece = leftPiece; break; case MoveDirection.West: extensionBPP.exitLocations[0].connectedTurnTriggerArea.westPiece = leftPiece; break; } //Activate piece ppMan.ActivatePathPiece_InConnectedArea(connectedPathArea, leftPiece, true, false); } if (extensionBPP.exitLocations[0].canDoRight) { //Spawn a right piece for this pathed area BuiltPathPiece rightPiece = ppMan.GetValidBPPForAreaType(currentPathArea.connectionPieces[i].areaTo); //Position and rotate accordingly rightPiece.intendedMoveDirection = GetRightMoveDirection(currentPathArea.connectionPieces[i].connectionPieceDirection); rightPiece.transform.position = GetNextPlacementPosition(rightPiece.intendedMoveDirection, exitPosition, rightPiece); rightPiece.transform.eulerAngles = GetEulerAnglesForMoveDirection(rightPiece.intendedMoveDirection); extensionBPP.exitLocations[0].nextRightPathPiece = rightPiece; switch (rightPiece.intendedMoveDirection) { case MoveDirection.North: extensionBPP.exitLocations[0].connectedTurnTriggerArea.northPiece = rightPiece; break; case MoveDirection.East: extensionBPP.exitLocations[0].connectedTurnTriggerArea.eastPiece = rightPiece; break; case MoveDirection.South: extensionBPP.exitLocations[0].connectedTurnTriggerArea.southPiece = rightPiece; break; case MoveDirection.West: extensionBPP.exitLocations[0].connectedTurnTriggerArea.westPiece = rightPiece; break; } //Activate piece ppMan.ActivatePathPiece_InConnectedArea(connectedPathArea, rightPiece, false, true); } } }
//[TODO] deactivate from pool for recycling public void DeactivatePieces(BuiltPathPiece lastPiece, BuiltPathPiece currentPiece) { Debug.Log("Deactivate pieces"); //Deactivate last piece on delay PathedArea lastPA = GetAreaForBuiltPathPiece(lastPiece); StartCoroutine(DeactivatePieceOnDelay(lastPiece, lastPA)); //Deactivate alternate piece on delay //Deactivate non alternate exits, and children, instantly for (int i = 0; i < lastPiece.exitLocations.Count; i++) { //If player did not turn left here, disable it if (lastPiece.exitLocations[i].nextLeftPathPiece != currentPiece && lastPiece.exitLocations[i].nextLeftPathPiece != null) { PathedArea altPA = GetAreaForBuiltPathPiece(lastPiece.exitLocations[i].nextLeftPathPiece); if (altPA.thisAreaFormat == AreaFormat.Procedural) { lastPiece.exitLocations[i].nextLeftPathPiece.DeactivateToPool(); for (int j = 0; j < lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations.Count; j++) { if (lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].nextLeftPathPiece != null) { lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].nextLeftPathPiece.DeactivateToPool(); } if (lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].nextRightPathPiece != null) { lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].nextRightPathPiece.DeactivateToPool(); } if (lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].connectedFixedArea.fixedAreaObject != null) { lastPiece.exitLocations[i].nextLeftPathPiece.exitLocations[j].connectedFixedArea.fixedAreaObject.SetActive(false); } } } else { altPA.fixedAreaObject.SetActive(false); } } //If player did not turn right here, disable it if (lastPiece.exitLocations[i].nextRightPathPiece != currentPiece && lastPiece.exitLocations[i].nextRightPathPiece != null) { PathedArea altPA = GetAreaForBuiltPathPiece(lastPiece.exitLocations[i].nextRightPathPiece); if (altPA.thisAreaFormat == AreaFormat.Procedural) { lastPiece.exitLocations[i].nextRightPathPiece.DeactivateToPool(); for (int j = 0; j < lastPiece.exitLocations[i].nextRightPathPiece.exitLocations.Count; j++) { if (lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].nextLeftPathPiece != null) { lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].nextLeftPathPiece.DeactivateToPool(); } if (lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].nextRightPathPiece != null) { lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].nextRightPathPiece.DeactivateToPool(); } if (lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].connectedFixedArea.fixedAreaObject != null) { lastPiece.exitLocations[i].nextRightPathPiece.exitLocations[j].connectedFixedArea.fixedAreaObject.SetActive(false); } } } else { altPA.fixedAreaObject.SetActive(false); } } } }