Exemplo n.º 1
0
        private void cache()
        {
            if (needToCache)
            {
                for (int x = 0; x < tiles.GetLength(0); x++)
                {
                    for (int y = 0; y < tiles.GetLength(1); y++)
                    {
                        cachedSolid[x, y] = tiles[x, y].isSolid;
                    }
                }

                foreach (IntVec position in CharacterEntities.Positions())
                {
                    cachedSolid[position.X, position.Y] = true;
                }

                foreach (Tuple <IEnvironmentObject, IntVec> enviro in Environment.Tuples())
                {
                    cachedSolid[enviro.Item2.X, enviro.Item2.Y] |= enviro.Item1.IsSolid();
                }

                foreach (Tuple <IInteractable, IntVec> enviro in InteractableEnvironment.Tuples())
                {
                    cachedSolid[enviro.Item2.X, enviro.Item2.Y] |= enviro.Item1.IsSolid();
                }

                foreach (Tuple <ILightSource, IntVec> enviro in LightSources.Tuples())
                {
                    //cachedSolid[enviro.Item2.X, enviro.Item2.Y] = true;
                }
                needToCache = false;
            }
        }
Exemplo n.º 2
0
        public void render()
        {
            for (int x = 0; x < tiles.GetLength(0); x++)
            {
                for (int y = 0; y < tiles.GetLength(1); y++)
                {
                    Engine.Engine.Draw(tiles[x, y].GetSprite(), new IntVec(x, y));
                }
            }

            Environment.Draw();
            //drawAStar();
            InteractableEnvironment.Draw();

            DroppedItems.Draw();
            LightSources.Draw();
            CharacterEntities.Draw();

            //CharacterEntities.InvokeOnAll( (GameCharacter character, IntVec position) =>
            //{
            //    position.X += character.GetSprite().Direction.X;
            //    position.Y += character.GetSprite().Direction.Y;
            //});

            //foreach (var pair in CharacterEntities.Tuples())
            //{
            //    pair.Item2.X += pair.Item1.GetSprite().Direction.X;
            //    pair.Item2.Y += pair.Item1.GetSprite().Direction.Y;
            //}
        }
    // grabs the closest valid search node for an enemy
    public SearchNode GetMyNextNode(Enemy enemy, Room.Names room, int floor, InteractableEnvironment environment)
    {
        SearchNode closestNode = null;
        float      closestDist = Mathf.Infinity;

        if (SearchNode.allSearchNodes == null || SearchNode.allSearchNodes.Length == 0 || SearchNode.allSearchNodes.Contains(null))
        {
            SearchNode.FindAllSearchNodes();
            return(GetMyNextNode(enemy, room, floor, environment));
        }

        for (int i = 0; i < SearchNode.allSearchNodes.Length; i++)
        {
            if (SearchNode.allSearchNodes[i] == null)
            {
                continue;
            }
            if (SearchNode.allSearchNodes[i].roomName == room && SearchNode.allSearchNodes[i].floor == floor && SearchNode.allSearchNodes[i].environment == environment && SearchNode.allSearchNodes[i].IsSearchable())
            {
                float distToNode = Vector3.Distance(enemy.transform.position, SearchNode.allSearchNodes[i].transform.position);
                if (distToNode < closestDist)
                {
                    closestNode = SearchNode.allSearchNodes[i];
                    closestDist = distToNode;
                }
            }
        }

        return(closestNode);
    }
    // finds all enemies in a state, room, floor, and for an elevator/door
    public Enemy[] FindEnemies(State.Name[] states, Room.Names room, int floor, InteractableEnvironment environment)
    {
        // if there is only one element in the states array, run through everything once and return
        if (states.Length == 1)
        {
            State.Name state = states[0];
            return(_enemies.FindAll(enemy => enemy.stateManager.currentState.name == state && enemy.currentRoom == room && enemy.currentFloor == floor && enemy.securePoint == environment).ToArray());
        }

        // makea  list of enemies and add to it as you find applicable enemies
        List <Enemy> relevantEnemies = new List <Enemy>();

        for (int i = 0; i < states.Length; i++)
        {
            State.Name state = states[i];
            for (int j = 0; j < _enemies.Count; j++)
            {
                Enemy enemy = _enemies[j];
                if (enemy.stateManager.currentState.name == state && enemy.currentRoom == room && enemy.currentFloor == floor && enemy.securePoint == environment)
                {
                    relevantEnemies.Add(enemy);
                }
            }
        }
        return(relevantEnemies.ToArray());
    }
 // For guards to check the elevator/door they are assigned to
 public void SecureEnvironment(InteractableEnvironment environment)
 {
     Enemy[] guards = FindGuardsFor(environment);
     foreach (Enemy guard in guards)
     {
         guard.SecureEnvironment();
     }
 }
 // sets all search nodes back to an unsearched mode
 public void ResetSearchNodes(Room.Names room, int floor, InteractableEnvironment environment)
 {
     SearchNode[] nodesToReset = SearchNode.allSearchNodes.Where(searchNode => searchNode.roomName == room && searchNode.floor == floor && searchNode.environment == environment && !searchNode.IsSearchable()).ToArray();
     for (int i = 0; i < nodesToReset.Length; i++)
     {
         nodesToReset[i].HardReset();
     }
     _visitedSearchNodes.Clear();
 }
Exemplo n.º 7
0
        internal void testUpdate()
        {
#if DEBUG
            if (MouseController.RightClicked())
            {
                IntVec pos = MouseController.MouseGridPosition();
                if (KeyboardController.IsDown('8'))
                {
                    Item[] items = new Item[statRand.Next(2, 8)];
                    for (int i = 0; i < items.Length; i++)
                    {
                        items[i] = Item.randomItem(DungeonLevel, 1);
                    }
                    InteractableEnvironment.Add(new Chest(items), pos);
                }

                if (KeyboardController.IsDown('9'))
                {
                    CharacterEntities.Add(Enemies.EnemyCreator.GetRandomEnemy(1, DungeonLevel)[0], pos);
                }

                if (KeyboardController.IsDown('0'))
                {
                    CharacterEntities.Add(Enemies.EnemyCreator.GetRandomBoss(DungeonLevel), pos);
                }
            }

            IntVec aMove = new IntVec((KeyboardController.IsTyped('H', 0) ? 1 : 0) - (KeyboardController.IsTyped('F', 0) ? 1 : 0), (KeyboardController.IsTyped('G', 0) ? 1 : 0) - (KeyboardController.IsTyped('T', 0) ? 1 : 0));
            IntVec bMove = new IntVec((KeyboardController.IsPressed('M') ? 1 : 0) - (KeyboardController.IsPressed('B') ? 1 : 0), (KeyboardController.IsPressed('N') ? 1 : 0) - (KeyboardController.IsPressed('J') ? 1 : 0));
            actionsToTake += (KeyboardController.IsDown('2') ? 1 : 0) - (KeyboardController.IsDown('1') ? 1 : 0);

            if (aMove.X != 0 || aMove.Y != 0 || bMove.X != 0 || bMove.Y != 0)
            {
                if (!isSolid(a + aMove))
                {
                    a += aMove;
                }

                if (!isSolid(b + bMove))
                {
                    b += bMove;
                }

                path = AStar.getPathBetween(this, a, b);

                actionsToTake = 1;

                int movement = Math.Abs(aMove.X) + Math.Abs(aMove.Y) + Math.Abs(bMove.X) + Math.Abs(bMove.Y);

                Engine.Engine.Log(string.Format("New A* path length: {0}", path.Length.ToString()));
                if (previousPathDistance != -1 && Math.Abs(previousPathDistance - path.Length) > movement)
                {
                    Engine.Engine.Log(string.Format("<INCONSISTENT PATHFIND; MOVEMENTDELTA={0},PATHDELTA={1}>", movement, Math.Abs(previousPathDistance - path.Length)));
                }

                //moveset = AStar.getTargetLine(this, startPoint, a, true);
                //moveset = AStar.getPossiblePositionsFrom(this, a, 15, AStar.CharacterTargeting.TARGET_FIRST, true);
                moveset = AStar.getPossiblePositionsInBox(this, a, 2, 2, AStar.CharacterTargeting.TARGET_FIRST, true);

                previousPathDistance = path.Length;
            }

            if (KeyboardController.IsPressed('Z'))
            {
                for (int i = 0; i < 100; i++)
                {
                    Item item = Item.getDesireditem(30, 30);

                    Engine.Engine.Log(string.Format("Item Generated: {0}", item.Name));

                    DroppedItems.Add(item, findRandomOpenPosition());
                }
            }

            if (KeyboardController.IsPressed('Q'))
            {
                for (int i = 0; i < 100; i++)
                {
                    Item item = Item.randomLegendary(30, 35);

                    Engine.Engine.Log(string.Format("Item Generated: {0}", item.Name));

                    DroppedItems.Add(item, findRandomOpenPosition());
                }
            }
#endif
        }
 // gets all guards assigned to an elevator/door
 private Enemy[] FindGuardsFor(InteractableEnvironment environment)
 {
     return(_enemies.FindAll(enemy => enemy.securePoint == environment && enemy.currentRoom == _player.currentRoom && enemy.currentFloor == _player.currentFloor).ToArray());
 }