Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
Arquivo: Game.cs Projeto: vilcans/LD41
    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);
        }
    }