private void Start() { playerMovement = GetComponent <PlayerMovement>(); cameraMove = GetComponent <CameraMove>(); if (GameManager.GetCurrentLevel().isPortalLevel) { portals = GameObject.FindGameObjectWithTag("Portal").GetComponent <PortalPair>(); } }
void PairCreateTeleportPoint(PortalPair pp) { TeleportPoint tpA = CreateTeleportPoint(pp.portalA); TeleportPoint tpB = CreateTeleportPoint(pp.portalB); TeleportThroughPortal ttpA = CreateTeleportThroughPortal(pp.portalA); TeleportThroughPortal ttpB = CreateTeleportThroughPortal(pp.portalB); ttpA.otherPoint = tpB; ttpB.otherPoint = tpA; }
void CreateStereoRendererPair(PortalPair pp) { StereoRenderer srA = CreateStereoRenderer(pp.portalA); StereoRenderer srB = CreateStereoRenderer(pp.portalB); srA.canvasOrigin = pp.portalA.transform; srA.anchorTransform = pp.portalB.transform; srB.canvasOrigin = pp.portalB.transform; srB.anchorTransform = pp.portalA.transform; GetRenderPlane(pp.portalA).AddComponent <DisableOutOfView>(); GetRenderPlane(pp.portalB).AddComponent <DisableOutOfView>(); }
private void OnTriggerEnter(Collider other) { if (other.tag == "Player") { // Translate and rotate the player to go through the portal float rotationDiff = Vector3.SignedAngle(transform.up, receiver.up, Vector3.up); Debug.Log(rotationDiff); player.transform.Rotate(Vector3.up, rotationDiff + 180); float oldY = player.transform.position.y; player.enabled = false; player.transform.position = receiver.position + (playerDiameter + offset) * receiver.up; player.transform.position += Vector3.down * oldY; player.enabled = true; // Let everyone know where the player is PortalPair.SetCurrentPlayerRoomID(otherRoomID); } }
protected override void GenerateObjects() { for (int i = 0; i < ENEMY_COUNT; i++) { Vector2 loc = ENEMY_LOCATION[i]; MakeEnemy(loc.x, loc.y, SpriteLibrary.library.GetEnemy(ENEMY_ID[i])); } for (int i = 0; i < HOLE_COUNT; i++) { GameObject pair = Object.Instantiate(portalPair); PortalPair pp = pair.GetComponent <PortalPair>(); pp.StartPosition = HOLE_START[i]; pp.EndPosition = HOLE_END[order[i]]; PutObject(0, 0, pair); } PutObject((int)DIGSPOT.x, (int)DIGSPOT.y, Object.Instantiate(bossUnlock)); }
private void OnEnable() { portalPair = (PortalPair)target; }
public virtual void OnDisconnected(PortalPair pair) { }
/// <inheritdoc /> public string Part1() { // find all portals List <Portal> portals = new List <Portal>(); for (int i = 0; i < inputGrid.Count; i++) { for (int j = 0; j < inputGrid[i].Count; j++) { // teleporter part if (char.IsUpper(inputGrid[i][j])) { // check right if (j < inputGrid[i].Count - 1 && char.IsUpper(inputGrid[i][j + 1])) { // check if open tile is right if (j + 1 < inputGrid[i].Count - 1 && inputGrid[i][j + 2] == '.') { portals.Add(new Portal() { Position = new Vector2Int(j + 2, i), //Position = new Vector2Int(i, j + 2), Name = $"{inputGrid[i][j]}{inputGrid[i][j + 1]}" }); } // otherwise it has to be left else { portals.Add(new Portal() { Position = new Vector2Int(j - 1, i), //Position = new Vector2Int(j - 2, i), Name = $"{inputGrid[i][j]}{inputGrid[i][j + 1]}" }); } } // check down else if (i < inputGrid.Count - 1 && char.IsUpper(inputGrid[i + 1][j])) { // check open tile below if (i + 1 < inputGrid.Count - 1 && inputGrid[i + 2][j] == '.') { portals.Add(new Portal() { Position = new Vector2Int(j, i + 2), //Position = new Vector2Int(i + 2,j), Name = $"{inputGrid[i][j]}{inputGrid[i + 1][j]}" }); } // otherwise it has to be above else { portals.Add(new Portal() { Position = new Vector2Int(j, i - 1), //Position = new Vector2Int(i - 1, j), Name = $"{inputGrid[i][j]}{inputGrid[i + 1][j]}" }); } } } } } // generate all accessible portals Dictionary <Portal, List <PortalPath> > accessiblePortals = new Dictionary <Portal, List <PortalPath> >(); foreach (Portal portal in portals) { accessiblePortals[portal] = GeneratePairs(portal, portals); //Console.WriteLine(accessiblePortals[portal].Count); } // link portals List <PortalPair> portalPairs = new List <PortalPair>(); foreach (Portal portal in portals) { // combine on name PortalPair portalPair = portalPairs.FirstOrDefault(pair => pair.PortalA.Name.Equals(portal.Name)); // new if (portalPair == null) { portalPairs.Add(new PortalPair() { PortalA = portal }); } // existing else { portalPair.PortalB = portal; portalPair.Distance = Vector2Int.DistanceManhattan(portalPair.PortalA.Position, portalPair.PortalB.Position); } } Portal startPortal = portalPairs.FirstOrDefault(p => p.PortalA.Name == "AA")?.PortalA; Portal endPortal = portalPairs.FirstOrDefault(p => p.PortalA.Name == "ZZ")?.PortalA; return(MinimumSteps(portalPairs, accessiblePortals, startPortal, endPortal).ToString()); }
private int MinimumSteps2(List <PortalPair> pairs, Dictionary <Portal, List <PortalPath> > accessiblePortals, Portal startPortal, Portal endPortal) { int shortestRoute = int.MaxValue; HashSet <Path> seenPaths = new HashSet <Path>(); Queue <Path> pathsLeft = new Queue <Path>(); pathsLeft.Enqueue(new Path() { CurrentPortal = startPortal, }); int minX = 2; int minY = 2; int maxX = Math.Max(pairs.Select(p => p.PortalA.Position.X).Max(), pairs.Select(p => p.PortalB == null ? 0 : p.PortalB.Position.X).Max()); int maxY = Math.Max(pairs.Select(p => p.PortalA.Position.Y).Max(), pairs.Select(p => p.PortalB == null ? 0 : p.PortalB.Position.Y).Max()); while (pathsLeft.Count > 0) { Path currentPath = pathsLeft.Dequeue(); // skip over seen if (seenPaths.Contains(currentPath)) { continue; } // new path that hasn't been seen before seenPaths.Add(currentPath); // skip over start if (currentPath.Level > 0 && currentPath.CurrentPortal.Equals(startPortal)) { continue; } // skip over end if (currentPath.CurrentPortal.Equals(endPortal)) { continue; } /* * // check if ended * if (currentPath.CurrentPortal.Equals(endPortal)) * { * if (currentPath.Level == 0 && currentPath.TotalLength + currentPath.TeleportersTaken - 1 < shortestRoute) * { * shortestRoute = currentPath.TotalLength + currentPath.TeleportersTaken - 1; * Console.WriteLine($"Found route of {currentPath.TotalLength + currentPath.TeleportersTaken - 1} steps using {currentPath.TeleportersTaken} teleporters"); * } * * //Console.WriteLine($"Found route of {currentPath.TotalLength + currentPath.TeleportersTaken - 1} steps using {currentPath.TeleportersTaken} teleporters"); * * * continue; * } */ // try another couple teleporters till they were basically all seen if (currentPath.TeleportersTaken < 200) { foreach (PortalPath portalPath in accessiblePortals[currentPath.CurrentPortal]) { // if there's no other portal or it's the current portal for some reason, skip it if (portalPath.OtherPortal == null || portalPath.OtherPortal.Equals(currentPath.CurrentPortal)) { continue; } PortalPair pair = pairs.FirstOrDefault(p => p.PortalA.Position.Equals(portalPath.OtherPortal.Position) || (p.PortalB != null && p.PortalB.Position.Equals(portalPath.OtherPortal.Position))); Portal newPortal = null; if (pair.PortalA.Position.Equals(portalPath.OtherPortal.Position)) { newPortal = pair.PortalB; } else { newPortal = pair.PortalA; } // for ZZ if (newPortal == null) { newPortal = pair.PortalA; } if (newPortal != null) { bool isOutside = portalPath.OtherPortal.Position.X == minX || portalPath.OtherPortal.Position.X == maxX || portalPath.OtherPortal.Position.Y == minY || portalPath.OtherPortal.Position.Y == maxY; // outside if (isOutside) { // found it if (currentPath.Level == 0 && newPortal.Name == "ZZ") { return(currentPath.TotalLength + portalPath.Distance + currentPath.TeleportersTaken); } if (currentPath.Level > 0) { pathsLeft.Enqueue(new Path() { CurrentPortal = newPortal, TeleportersTaken = currentPath.TeleportersTaken + 1, TotalLength = currentPath.TotalLength + portalPath.Distance, Level = currentPath.Level - 1 }); } } // inside else { pathsLeft.Enqueue(new Path() { CurrentPortal = newPortal, TeleportersTaken = currentPath.TeleportersTaken + 1, TotalLength = currentPath.TotalLength + portalPath.Distance, Level = currentPath.Level + 1 }); } /* * pathsLeft.Enqueue(new Path() * { * CurrentPortal = newPortal, * TeleportersTaken = currentPath.TeleportersTaken + 1, * TotalLength = currentPath.TotalLength + portalPath.Distance, * Level = currentPath.Level + ((isOutside) ? +1 : -1) * }); */ } } } } return(shortestRoute); }
private int MinimumSteps(List <PortalPair> pairs, Dictionary <Portal, List <PortalPath> > accessiblePortals, Portal startPortal, Portal endPortal) { int shortestRoute = int.MaxValue; HashSet <Path> seenPaths = new HashSet <Path>(); Queue <Path> pathsLeft = new Queue <Path>(); pathsLeft.Enqueue(new Path() { CurrentPortal = startPortal, }); while (pathsLeft.Count > 0) { Path currentPath = pathsLeft.Dequeue(); // skip over seen if (seenPaths.Contains(currentPath)) { continue; } // new path that hasn't been seen before seenPaths.Add(currentPath); // check if ended if (currentPath.CurrentPortal.Equals(endPortal)) { if (currentPath.TotalLength + currentPath.TeleportersTaken - 1 < shortestRoute) { shortestRoute = currentPath.TotalLength + currentPath.TeleportersTaken - 1; } continue; } // try another couple teleporters till they were basically all seen if (currentPath.TeleportersTaken < 29) { foreach (PortalPath portalPath in accessiblePortals[currentPath.CurrentPortal]) { // if there's no other portal if (portalPath.OtherPortal == null || portalPath.OtherPortal.Equals(currentPath.CurrentPortal)) { continue; } PortalPair pair = pairs.FirstOrDefault(p => p.PortalA.Position.Equals(portalPath.OtherPortal.Position) || (p.PortalB != null && p.PortalB.Position.Equals(portalPath.OtherPortal.Position))); Portal newPortal = null; if (pair.PortalA.Position.Equals(portalPath.OtherPortal.Position)) { newPortal = pair.PortalB; } else { newPortal = pair.PortalA; } // for ZZ if (newPortal == null) { newPortal = pair.PortalA; } if (newPortal != null) { pathsLeft.Enqueue(new Path() { CurrentPortal = newPortal, TeleportersTaken = currentPath.TeleportersTaken + 1, TotalLength = currentPath.TotalLength + portalPath.Distance }); } } } } return(shortestRoute); }