Beispiel #1
0
 private void Start()
 {
     playerMovement = GetComponent <PlayerMovement>();
     cameraMove     = GetComponent <CameraMove>();
     if (GameManager.GetCurrentLevel().isPortalLevel)
     {
         portals = GameObject.FindGameObjectWithTag("Portal").GetComponent <PortalPair>();
     }
 }
Beispiel #2
0
    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;
    }
Beispiel #3
0
    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>();
    }
Beispiel #4
0
    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);
        }
    }
Beispiel #5
0
    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));
    }
Beispiel #6
0
 private void OnEnable()
 {
     portalPair = (PortalPair)target;
 }
Beispiel #7
0
 public virtual void OnDisconnected(PortalPair pair)
 {
 }
Beispiel #8
0
        /// <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());
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
        }