private void CreateEntryAndExit() { Vector2Int p1 = FindOpenArea(border, border, width / 4, height - border); Vector2Int p2 = FindOpenArea(width - border - width / 4, border, width - width / 8, height - border); if (UnityEngine.Random.value < .5) { entryPoint = p1; exitPoint = p2; } else { entryPoint = p2; exitPoint = p1; } // Pathfind from exit to entry { PathMap path = new PathMap(this); path.StartSearch(entryPoint, Mathf.Infinity); bool found = path.UpdateUntilPathFound(exitPoint); //path.UpdateAll(); bool found = true; if (found) { //path.Print(); Vector2Int sq = exitPoint; //Debug.LogFormat("Pathfinding from {0}", sq); while (sq != entryPoint) { PathMap.Node node = path.nodes[sq.y, sq.x]; //Debug.LogFormat("At {0}: cost {1} direction {2}", sq, node.cost, node.direction.GetCharacter()); Vector3 worldPos = Game.GridToWorldPosition(sq); if (GetTile(sq) != Tile.Floor) { //Debug.LogFormat("Changing {0} from {1} to floor", sq, GetTile(sq)); #if UNITY_EDITOR Debug.DrawLine(worldPos + new Vector3(-.5f, -.5f, 0), worldPos + new Vector3(.5f, .5f, 0), Color.red, 5); #endif SetTile(sq, Tile.Floor); } Assert.IsTrue(node.direction.deltaPosition.sqrMagnitude != 0); sq += node.direction.GetOpposite().deltaPosition; #if UNITY_EDITOR Debug.DrawLine(worldPos, Game.GridToWorldPosition(sq), Color.green, 5); #endif } } else { Debug.LogWarning("No path found from entry to exit - creating a corridor"); MakeCorridor(entryPoint, exitPoint, Tile.Bedrock); } pathToPlayer = path; pathToPlayer.Clear(); } SetTile(entryPoint, Tile.Floor); SetTile(exitPoint, Tile.Exit); }
private void TickBeat(int beatNumber) { TileMap map = level.map; for (int i = 0, len = level.creatures.Count; i < len; ++i) { if (beatNumber % 4 != i % 4) { continue; } Level.Creature creature = level.creatures[i]; PathMap.Node node = map.pathToPlayer.nodes[creature.square.y, creature.square.x]; //Debug.LogFormat("Creature found node with cost {0} age {1} in direction {2}", node.cost, map.pathToPlayer.currentGeneration - node.generation, node.direction.GetCharacter()); int age = map.pathToPlayer.currentGeneration - node.generation + 1; float maxCost = creature.aggressivity; if (creature.inPursuit) { maxCost *= 2; } if (node.cost <= maxCost && age < creature.memory) { Vector2Int targetSquare = creature.square - node.direction.deltaPosition; if (targetSquare == playerPosition) { int damage; bool hit = creature.GetDamage(out damage); if (hit) { AddMessage(creature.name + " hits!"); AddDamage(damage, creature.name); } else { AddMessage(creature.name + " misses!"); } } else if (map.GetTile(targetSquare) == TileMap.Tile.Floor) { creature.inPursuit = true; creature.square = targetSquare; } } else { creature.inPursuit = false; } } for (int i = 0, len = level.creatures.Count; i < len; ++i) { Level.Creature creature = level.creatures[i]; if (creature.gameObject == null) { creature.gameObject = new GameObject("Creature"); creature.transform = creature.gameObject.transform; SpriteRenderer spriteRenderer = creature.gameObject.AddComponent <SpriteRenderer>(); spriteRenderer.sprite = creatureSprite; } creature.transform.position = GridToWorldPosition(creature.square); } }