Exemplo n.º 1
0
        // Navigates in the current room only
        public bool WalkTo(Vector2 destination)
        {
            // Find and draw the navigational path
            if (wayPoints == null)
            {
                wayPoints = FindPathToLocation(destination);
                if (wayPoints.Count != 0)
                {
                    WayPoint point = wayPoints.First();
                    foreach (WayPoint w in wayPoints)
                    {
                        Debug.DrawLine(point.position, w.position, Color.red, 10.0f);
                        point = w;
                    }
                    transform.position = wayPoints.First().position;
                }
                return(false);
            }

            if (wayPoints.Count == 0)
            {
                wayPoints = null;
                return(true);
            }

            // Direction in terms of the direction walked
            Vector2 direction = wayPoints.First().position - (Vector2)transform.position;

            PixelCollider pixelCollider = transform.GetComponentInChildren <PixelCollider>();

            Debug.Assert(pixelCollider != null);
            PixelRoom pixelRoom = pixelCollider.GetPixelRoom();
            int       stepSize  = pixelRoom.stepSize;

            if (direction.sqrMagnitude < 2.5f)
            {
                wayPointVelocity = Vector2.zero;
                wayPoints.RemoveAt(0);
                return(false);
            }

            if (direction.x > 0 && direction.y > 0)
            {
                wayPointVelocity = new Vector2(2, 1);
            }
            else if (direction.x < 0 && direction.y > 0)
            {
                wayPointVelocity = new Vector2(-2, 1);
            }
            else if (direction.x > 0 && direction.y < 0)
            {
                wayPointVelocity = new Vector2(2, -1);
            }
            else if (direction.x < 0 && direction.y < 0)
            {
                wayPointVelocity = new Vector2(-2, -1);
            }

            return(false);
        }
Exemplo n.º 2
0
        // Walking in a room
        public void WalkInRoom(PixelRoom room, Vector2 walkFromPosition, Vector2 walkToPosition = default(Vector2))
        {
            if (walkToPosition == default(Vector2))
            {
                walkToPosition = room.center;
            }

            PixelCollider pixelCollider = GetComponentInChildren <PixelCollider>();

            if (room != pixelCollider.GetPixelRoom())
            {
                room.gameObject.SetActive(true);
            }

            HashSet <WayPoint> navigationMesh = room.GetNavigationalMesh(pixelCollider, walkFromPosition);
            WayPoint           closest        = navigationMesh.Aggregate((i1, i2) => Vector2.Distance(i1.position, walkToPosition) < Vector2.Distance(i2.position, walkToPosition) ? i1 : i2);

            if (room != pixelCollider.GetPixelRoom())
            {
                room.gameObject.SetActive(false);
            }

            Debug.DrawLine(transform.position, closest.position, Color.magenta, 10.0f);

            CharacterTask characterTask = new CharacterTask(GameTask.TaskType.WALKTO, closest.position);

            characterTasks.Enqueue(characterTask);
        }
Exemplo n.º 3
0
        private void OnEnable()
        {
            StartCoroutine("UpdateCharacterAction");
            PixelRoom room = transform.parent.GetComponent <PixelRoom>();

            InvokeRepeating("Movement", 0.0f, 1.0f / room.RoomWalkingSpeed);
        }
Exemplo n.º 4
0
    public IEnumerator PlayerMovementAll()
    {
        SceneManager.LoadScene("Game");
        yield return(null);

        GameObject[]     rootObjects = SceneManager.GetActiveScene().GetRootGameObjects();
        List <PixelRoom> allRooms    = new List <PixelRoom>();

        foreach (GameObject go in rootObjects)
        {
            PixelRoom room = go.GetComponent <PixelRoom>();
            if (room != null)
            {
                allRooms.Add(room);
            }
        }

        // Reorganize list
        System.Random    rand            = new System.Random();
        List <PixelRoom> randomizedRooms = allRooms.OrderBy(c => rand.Next()).Select(c => c).ToList();

        foreach (PixelRoom room in randomizedRooms)
        {
            string name = room.name;

            GameObject.Find("Game Manager").SendMessage("AddGameTask", "goto '" + name + "' 'Bed'");
            yield return(new WaitForSeconds(15.0f));

            string parent = GameObject.Find("Player").transform.parent.name;
            Assert.AreEqual(parent, name);
        }
    }
Exemplo n.º 5
0
        // Navigate the entire world. Uses breath first search
        List <PixelDoor> FindPathToRoom(PixelRoom destination)
        {
            // Variables
            Queue <PixelRoom>   OpenSet   = new Queue <PixelRoom>();
            HashSet <PixelRoom> ClosedSet = new HashSet <PixelRoom>();
            Dictionary <PixelRoom, List <PixelDoor> > Meta = new Dictionary <PixelRoom, List <PixelDoor> >();

            // Initalization
            PixelCollider pixelCollider = transform.GetComponentInChildren <PixelCollider>();
            PixelRoom     start         = pixelCollider.GetPixelRoom();

            Debug.Assert(start != null);
            OpenSet.Enqueue(start);

            while (OpenSet.Count > 0)
            {
                PixelRoom subtreeRoot = OpenSet.Dequeue();
                if (subtreeRoot == destination)
                {
                    List <PixelDoor> actionList = new List <PixelDoor>();
                    PixelRoom        state      = subtreeRoot;

                    while (Meta.ContainsKey(state) && Meta[state].Count() >= 0)
                    {
                        actionList.Add(Meta[state].First());
                        state = Meta[state].First().source;
                    }
                    actionList.Reverse();
                    return(actionList);
                }

                foreach (PixelDoor pixeldoor in subtreeRoot.pixelDoors)
                {
                    if (ClosedSet.Contains(pixeldoor.destination))
                    {
                        continue;
                    }

                    if (!OpenSet.Contains(pixeldoor.destination))
                    {
                        if (!Meta.ContainsKey(pixeldoor.destination))
                        {
                            Meta.Add(pixeldoor.destination, new List <PixelDoor>());
                        }
                        Meta[pixeldoor.destination].Add(pixeldoor);
                        OpenSet.Enqueue(pixeldoor.destination);
                    }
                }

                ClosedSet.Add(subtreeRoot);
            }

            return(null);
        }
Exemplo n.º 6
0
        public void EnterDoor(PixelDoor door)
        {
            PixelRoom room         = door.destination;
            Transform originalroom = transform.parent;

            Vector2 originalposition = transform.position;

            transform.parent = null;             // Prevents disabling the player

            originalroom.gameObject.SetActive(false);
            room.transform.gameObject.SetActive(true);

            Vector2 destinationOffset = door.dropOffWorldLocation;

            facingDirection = destinationOffset - (Vector2)transform.position;
            if (!(door is PixelStair))
            {
                transform.position = destinationOffset;
            }

            transform.parent = room.transform;

            room.OnEnable();

            UpdateSortingLayer();

            CancelInvoke("Movement");
            AnimateMovement();
            InvokeRepeating("Movement", 0.0f, 1.0f / room.RoomWalkingSpeed);

            if (door is PixelStair)
            {
                transform.position = originalposition;
            }

            return;
        }
Exemplo n.º 7
0
    public static List <GameTask> CreateGameTasks(string actionString)
    {
        List <GameTask> gameTasks     = new List <GameTask>();
        List <string>   actionStrings = BreakUpString(actionString);

        Character taskCharacter;
        TaskType  type = IdentifyTaskType(actionStrings, out taskCharacter);

        if (type == TaskType.NAVIGATE)
        {
            GameTask gameTask = new GameTask();
            gameTask.taskType = TaskType.NAVIGATE;
            Debug.Assert(taskCharacter != null);

            if (actionStrings.Count == 3)
            {
                PixelCollider pc       = taskCharacter.GetComponentInChildren <PixelCollider>();
                string        roomName = pc.GetPixelRoom().name;
                actionStrings.Insert(2, roomName);
            }

            string    locationString = actionStrings[2];
            PixelRoom room           = GetObjectOfType <PixelRoom>(locationString);
            gameTask.arguments.Add(room);

            string        objectString  = actionStrings[3];
            PixelCollider pixelCollider = GetObjectOfType <PixelCollider>(objectString, room.transform);
            gameTask.arguments.Add(pixelCollider);
            gameTask.character = taskCharacter;

            Direction direction = Direction.All;
            if (actionStrings.Count > 4)
            {
                string directionString = actionStrings[4];
                if (directionString == "NE")
                {
                    direction = Direction.NE;
                }
                if (directionString == "SE")
                {
                    direction = Direction.SE;
                }
                if (directionString == "SW")
                {
                    direction = Direction.SW;
                }
                if (directionString == "NW")
                {
                    direction = Direction.NW;
                }
            }

            GameTask faceTask = new GameTask();
            faceTask.taskType = TaskType.FACEDIRECTION;
            faceTask.duration = 0.1f;
            faceTask.arguments.Add(direction);
            faceTask.character = taskCharacter;

            gameTasks.Add(gameTask);
            gameTasks.Add(faceTask);
        }
        else if (type == TaskType.CREATE)
        {
            GameTask createItemTask = new GameTask();
            createItemTask.taskType = TaskType.CREATE;
            createItemTask.duration = 0.0f;

            GameObject itemObj = null;

            int  number    = 1;
            bool hasNumber = int.TryParse(actionStrings[2], out number);
            if (!hasNumber)
            {
                number = 1;
                actionStrings.Insert(2, number.ToString());
            }

            Debug.Assert(number >= 1 && number <= 4);
            itemObj = Resources.Load("Items/" + actionStrings[3]) as GameObject;
            if (itemObj == null)
            {
                Debug.LogWarning(actionStrings[3] + " is not an item");
            }

            Debug.Assert(itemObj != null);
            createItemTask.arguments.Add(number);
            createItemTask.arguments.Add(itemObj);
            createItemTask.character = taskCharacter;

            gameTasks.Add(createItemTask);
        }
        else if (type == TaskType.PUTS || type == TaskType.TAKES)
        {
            // Navigate first
            int  number    = 1;
            bool hasNumber = int.TryParse(actionStrings[2], out number);

            if (!hasNumber)
            {
                number = 1;
                actionStrings.Insert(2, "1");
            }

            if (actionStrings.Count == 5)
            {
                PixelCollider pc       = taskCharacter.GetComponentInChildren <PixelCollider>();
                string        roomName = pc.GetPixelRoom().name;
                actionStrings.Insert(4, roomName);
            }

            PixelInventory inv = taskCharacter.GetComponentInChildren <PixelInventory>();
            Debug.Assert(inv != null);

            string    locationString = actionStrings[4];
            PixelRoom room           = GetObjectOfType <PixelRoom>(locationString);

            string        objectString  = actionStrings[5];
            PixelCollider pixelCollider = GetObjectOfType <PixelCollider>(objectString, room.transform);

            PixelStorage storage = pixelCollider.transform.parent.GetComponent <PixelStorage>();
            if (storage == null)
            {
                Debug.LogWarning("Cannot Place Item in " + actionStrings[5]);
                return(gameTasks);
            }

            // Navigate First
            GameTask navigateTask = new GameTask();
            navigateTask.taskType  = TaskType.NAVIGATE;
            navigateTask.character = taskCharacter;
            navigateTask.arguments.Add(room);
            navigateTask.arguments.Add(pixelCollider);
            gameTasks.Add(navigateTask);

            // Then Put
            GameTask putsItemTask = new GameTask();
            putsItemTask.taskType = type;
            putsItemTask.arguments.Add(number);
            putsItemTask.arguments.Add(actionStrings[3]);
            putsItemTask.arguments.Add(storage);
            putsItemTask.character = taskCharacter;
            gameTasks.Add(putsItemTask);
        }
        else if (type == TaskType.GIVES || type == TaskType.STEALS)         // player gives hamen key
        {
            string    characterName = actionStrings[2];
            Character toCharacter   = GetCharacter(characterName);
            if (toCharacter == null)
            {
                Debug.LogWarning("Character: " + toCharacter.name + " does not exist");
            }

            PixelInventory fromInventory = taskCharacter.GetComponentInChildren <PixelInventory>();
            PixelInventory toInventory   = toCharacter.GetComponentInChildren <PixelInventory>();
            Debug.Assert(fromInventory != null && toInventory != null);

            PixelCollider toCharacterCollider = toCharacter.GetComponentInChildren <PixelCollider>();
            PixelRoom     room = toCharacterCollider.GetPixelRoom();
            Debug.Assert(toCharacterCollider != null && room != null);

            int  count     = 1;
            bool hasNumber = int.TryParse(actionStrings[3], out count);
            if (!hasNumber)
            {
                count = 1;
                actionStrings.Insert(3, "1");
            }

            string itemName = actionStrings[4];

            // Navigate to the player
            GameTask navigateTask = new GameTask();
            navigateTask.taskType  = TaskType.NAVIGATE;
            navigateTask.character = taskCharacter;
            navigateTask.arguments.Add(room);
            navigateTask.arguments.Add(toCharacterCollider);
            gameTasks.Add(navigateTask);

            // Then Gives
            GameTask givesItemTask = new GameTask();
            givesItemTask.taskType = type;
            givesItemTask.arguments.Add(count);
            givesItemTask.arguments.Add(itemName);
            givesItemTask.arguments.Add(toCharacter);
            givesItemTask.character = taskCharacter;
            gameTasks.Add(givesItemTask);
        }
        else if (type == TaskType.MOUNT)         // player gives hamen key
        {
            // TODO 1. create a gametask for mounting an object. Must pass in the correct arguments in the gametask that
            // gets passed into the character task
        }
        return(gameTasks);
    }
Exemplo n.º 8
0
        public bool NavigateObject(PixelRoom room, PixelCollider pixelCollider, Direction direction = Direction.All)
        {
            PixelRoom     pixelRoom      = pixelCollider.GetPixelRoom();
            PixelCollider playerCollider = GetComponentInChildren <PixelCollider>();

            // Find last location
            // Closest from the door or the players position
            List <PixelDoor> path = FindPathToRoom(room);

            Vector2 startPosition;

            if (path.Count != 0)
            {
                room.gameObject.SetActive(true);
                room.GetNavigationalMesh(playerCollider, path.Last().dropOffWorldLocation);
                room.gameObject.SetActive(false);
                startPosition = path.Last().dropOffWorldLocation;
            }
            else
            {
                startPosition = transform.position;
            }

            // Navigate from the last location to find the pixel pose
            PixelPose pixelPose;

            if (pixelCollider != null)
            {
                pixelRoom.GetNavigationalMesh(playerCollider, startPosition);

                // Object is movable
                if (pixelCollider.transform.parent.GetComponent <MovableObject>())
                {
                    if (direction != Direction.All)
                    {
                        WayPoint wayPoint = pixelCollider.FindWayPointInDirection(direction);
                        pixelPose = new PixelPose(pixelRoom, direction, wayPoint.position);
                    }
                    else
                    {
                        // Player moves to the characters position first
                        KeyValuePair <PixelPose, float> bestPlayerMovementWayPoint = pixelCollider.FindBestWayPoint();
                        pixelPose = bestPlayerMovementWayPoint.Key;

                        Debug.DrawLine(transform.position, pixelPose.position, Color.red, 10.0f);

                        // Character enqueues a movement to the best place for that position
                        Character character = pixelCollider.GetComponentInParent <Character>();
                        if (character != null)
                        {
                            PixelPose translatedPose = pixelPose.TranslatePose(2 * (pixelCollider.navigationMargin + playerCollider.navigationMargin));
                            PixelPose flippedPose    = translatedPose.Flip();

                            GameTask characterNavTask = new GameTask(GameTask.TaskType.NAVIGATE);
                            characterNavTask.character = character;
                            characterNavTask.arguments.Add(flippedPose);
                            character.characterTasks.Enqueue(characterNavTask);
                        }
                    }
                }
                else
                {
                    if (direction != Direction.All)
                    {
                        WayPoint wayPoint = pixelCollider.FindWayPointInDirection(direction);
                        pixelPose = new PixelPose(pixelRoom, direction, wayPoint.position);
                    }
                    else
                    {
                        PixelCollider characterCollider = GetComponentInChildren <PixelCollider>();
                        pixelPose = pixelCollider.FindBestWayPointPosition(startPosition);
                    }
                }
                Navigate(pixelPose);
            }
            return(true);
        }
Exemplo n.º 9
0
        List <WayPoint> FindPathToLocation(Vector2 destination)
        {
            PixelCollider pixelCollider = transform.GetComponentInChildren <PixelCollider>();

            Debug.Assert(pixelCollider != null);
            PixelRoom pixelRoom = pixelCollider.GetPixelRoom();

            Debug.Assert(pixelRoom != null);

            // Dijkstra's Algorithm Parameters
            int   stepSize            = pixelRoom.stepSize;
            float minDistanceToTarget = stepSize * 2;

            // Initialization
            HashSet <WayPoint> Q      = pixelRoom.GetNavigationalMesh(pixelCollider);
            WayPoint           target = new WayPoint
            {
                position = destination,
                distance = float.MaxValue,
                previous = null
            };
            WayPoint current = Q.Aggregate((i1, i2) => (i1.position - (Vector2)transform.position).sqrMagnitude < (i2.position - (Vector2)transform.position).sqrMagnitude ? i1 : i2);

            current.distance = 0;

            // Propogation
            while (Q.Count > 0)
            {
                WayPoint u = Q.Aggregate((i1, i2) => i1.distance < i2.distance ? i1 : i2);
                Q.Remove(u);

                if (WayPoint.Distance(u, target) < minDistanceToTarget)
                {
                    target.previous = u;

                    List <WayPoint> path = new List <WayPoint>();
                    if (u.previous == null)
                    {
                        return(path);
                    }
                    while (u.previous != null)
                    {
                        path.Add(u);
                        u = u.previous;
                    }
                    path.Add(u);
                    path.Reverse();
                    return(path);
                }

                foreach (WayPoint v in u.neighbours)
                {
                    float alt = u.distance + WayPoint.Distance(u, v);
                    if (alt < v.distance)
                    {
                        v.distance = alt;
                        v.previous = u;
                    }
                }
            }

            return(new List <WayPoint>());
        }
Exemplo n.º 10
0
        void MouseClicked()
        {
            if (DebugWindowOpen)
            {
                return;
            }

            if (Input.GetMouseButtonDown(0))
            {
                Vector3 castStart = mousePosition;
                castStart.z = -10.0f;

                RaycastHit2D[] raycastHits = Physics2D.CircleCastAll(mousePosition, 30.0f, Vector2.zero);

                // Detected inspected objects
                foreach (var hit in raycastHits)
                {
                    GameObject obj = hit.collider.gameObject;
                    if (obj == this)
                    {
                        continue;
                    }

                    PixelCollider pixelCollider = obj.GetComponent <PixelCollider>();
                    if (pixelCollider != null)
                    {
                        if (pixelCollider.inspectChildObjects)
                        {
                            continue;
                        }
                        PixelCollider characterCollider = this.GetComponentInChildren <PixelCollider>();
                        if (pixelCollider.GetPixelRoom() != characterCollider.GetPixelRoom())
                        {
                            continue;
                        }
                        if (pixelCollider.transform.parent.name == "VirtualObject")
                        {
                            continue;
                        }
                        if (pixelCollider.transform.parent.name == "Player")
                        {
                            continue;
                        }

                        bool withinCollider = pixelCollider.CheckForWithinCollider(mousePosition);
                        if (withinCollider)
                        {
                            Debug.Log(pixelCollider.transform.parent.name);

                            NavigateObject(pixelCollider.GetPixelRoom(), pixelCollider);

                            // Inspect Object
                            PixelCollision pc = new PixelCollision();
                            pc.pixelCollider = pixelCollider;
                            pc.direction     = Direction.All;
                            CharacterTask inspectTask = new CharacterTask(GameTask.TaskType.INSPECT, pc);
                            characterTasks.Enqueue(inspectTask);

                            return;
                        }
                    }
                }

                // Detected inspected rooms (for navigation)
                foreach (var hit in raycastHits)
                {
                    GameObject obj = hit.collider.gameObject;
                    if (obj == this)
                    {
                        continue;
                    }

                    PixelRoom pixelRoom = obj.GetComponent <PixelRoom>();
                    if (pixelRoom != null)
                    {
                        PixelCollider pixelCollider = gameObject.GetComponentInChildren <PixelCollider>();
                        if (pixelCollider == null)
                        {
                            continue;
                        }
                        if (pixelCollider.GetPixelRoom() != pixelRoom)
                        {
                            continue;
                        }

                        Debug.Log(pixelRoom.name);

                        // Navigate Maze Room
                        CharacterTask characterTask = new CharacterTask(GameTask.TaskType.WALKTO, mousePosition);
                        characterTasks.Enqueue(characterTask);
                    }
                }
            }
        }