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