Exemple #1
0
    public PathInteriorGraph(IBuildingInteriorManager interior) : base()
    {
        // Generate graph for navigating interior spaces, such as houses, to avoid walls
        if (interior == null)
        {
            Debug.Log("interior is null");
            return;
        }

        for (int x = 0; x < interior.Width(); x++)
        {
            for (int y = 0; y < interior.Height(); y++)
            {
                PathNode node = new PathNode();
                node.data = new Vector2(x, y);
                nodes.Add(new Vector2(x, y), node);
            }
        }

        foreach (Vector2 pos in nodes.Keys)
        {
            PathNode        node      = nodes[pos];
            List <PathEdge> edges     = new List <PathEdge>();
            Vector2[]       neighbors = interior.Neighbors((int)pos.x, (int)pos.y);
            for (int i = 0; i < neighbors.Length; i++)
            {
                if (neighbors[i].x != -1 && neighbors[i].y != -1)
                {
                    PathEdge edge = new PathEdge();
                    if (interior.IsWall((int)pos.x, (int)pos.y, (int)neighbors[i].x, (int)neighbors[i].y))
                    {
                        edge.cost = 0;
                    }
                    else
                    {
                        edge.cost = 1;
                    }
                    edge.node = nodes[neighbors[i]];
                    edges.Add(edge);
                }
            }
            node.edges = edges.ToArray();
        }
    }
Exemple #2
0
    private void OnEKeyClicked(int isClicked)
    {
        if (isClicked != 0)
        {
            return;
        }

        // Switches all attributes from outside to inside or vice versa
        if (isInside)
        {
            PlayerManager.Instance.possessed.Move((Vector2)roomParent.transform.position, false, false);

            cityParent.SetActive(true);

            roomParent.SetActive(false);
            foreach (Transform child in roomParent.transform)
            {
                Destroy(child.gameObject);
            }

            isInside = false;

            // Keeps track of outside and inside people and switches them when exiting or entering
            PeopleManager.Instance.SetCurrPeople(outsidePeople);
            for (int i = 0; i < outsidePeople.Count; i++)
            {
                outsidePeople[i].objTransform.localScale = new Vector3(outsidePersonScale, outsidePersonScale, outsidePersonScale);
            }
        }
        else
        {
            if (buildingPos.x != -1 && buildingPos.y != -1 && isMainAction && !CityManager.Instance.IsWalkable((int)buildingPos.x, (int)buildingPos.y))
            {
                BuildingInteriorType type = CityManager.Instance.InteriorAt((int)buildingPos.x, (int)buildingPos.y);

                if (type == BuildingInteriorType.NonEnterable)
                {
                    return;
                }

                spawnPos = buildingPos;
                // Debug.Log((int)spawnPos.x + "" + (int)spawnPos.y + "" + floor + "" + generalSeed);
                roomParent.transform.position = PlayerManager.Instance.possessed.pos;
                outsidePeople = PeopleManager.Instance.currPeople;
                isInside      = true;

                List <Person> insidePeople = new List <Person>();

                // Generates interior based on type by deferring to other manager
                switch (type)
                {
                case BuildingInteriorType.Residential:
                    insidePeople = residentialManager.GenerateInterior(int.Parse(spawnPos.x + "" + spawnPos.y + "" + floor + "" + generalSeed), spawnPos);
                    cityParent.SetActive(false);
                    roomParent.SetActive(true);
                    residentialManager.DisplayInterior();
                    pathfindingGraph = new PathInteriorGraph(residentialManager);
                    interior         = residentialManager;
                    PlayerManager.Instance.possessed.Move((Vector2)PlayerManager.Instance.possessed.pos + residentialManager.SpawnPos(spawnPos), false, false);
                    break;

                case BuildingInteriorType.Store:
                    insidePeople = storeManager.GenerateInterior(int.Parse(spawnPos.x + "" + spawnPos.y + "" + floor + "" + generalSeed), spawnPos);
                    cityParent.SetActive(false);
                    roomParent.SetActive(true);
                    storeManager.DisplayInterior();
                    pathfindingGraph = new PathInteriorGraph(storeManager);
                    interior         = storeManager;
                    PlayerManager.Instance.possessed.Move((Vector2)PlayerManager.Instance.possessed.pos + storeManager.SpawnPos(spawnPos), false, false);
                    break;

                case BuildingInteriorType.Office:
                    insidePeople = officeManager.GenerateInterior(int.Parse(spawnPos.x + "" + spawnPos.y + "" + floor + "" + generalSeed), spawnPos);
                    cityParent.SetActive(false);
                    roomParent.SetActive(true);
                    officeManager.DisplayInterior();
                    pathfindingGraph = new PathInteriorGraph(officeManager);
                    interior         = officeManager;
                    PlayerManager.Instance.possessed.Move((Vector2)PlayerManager.Instance.possessed.pos + officeManager.SpawnPos(spawnPos), false, false);
                    break;

                case BuildingInteriorType.Special:
                    insidePeople = specialBuildingManager.GenerateInterior(int.Parse(spawnPos.x + "" + spawnPos.y + "" + floor + "" + generalSeed), spawnPos);
                    cityParent.SetActive(false);
                    roomParent.SetActive(true);
                    specialBuildingManager.DisplayInterior();
                    pathfindingGraph = new PathInteriorGraph(specialBuildingManager);
                    interior         = specialBuildingManager;
                    PlayerManager.Instance.possessed.Move((Vector2)PlayerManager.Instance.possessed.pos + specialBuildingManager.SpawnPos(spawnPos), false, false);
                    break;
                }

                // Keeps track of outside and inside people and switches them when exiting or entering
                PeopleManager.Instance.SetCurrPeople(insidePeople);
                for (int i = 0; i < insidePeople.Count; i++)
                {
                    insidePeople[i].objTransform.localScale = new Vector3(insidePersonScale, insidePersonScale, insidePersonScale);
                }
            }
        }
    }