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(); } }
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); } } } }