public override void HandleVisibility() { localCreatures = new List <Creature>(); RayCaster.SetAllInvis(Position, SightDist + 5); int localDangerCount = 0; foreach (Point point in VisiblePoints) { Program.WorldMap.LocalTile[point.X, point.Y].Visible = true; Program.WorldMap.LocalTile[point.X, point.Y].Explored = true; if (Program.WorldMap.LocalTile[point.X, point.Y].Opaque == false) { Program.WorldMap.LocalTile.Floor[point.X * Program.WorldMap.LocalTile.Width + point.Y].Explored = true; Program.WorldMap.LocalTile.Floor[point.X * Program.WorldMap.LocalTile.Width + point.Y].Visible = true; } // add items to memory map, remove them if there is a mismatch between memory map and local map if (Program.WorldMap.LocalTile[point.X, point.Y] is Item) { Program.WorldMap.LocalTile.MemoryMap[point.X * Program.WorldMap.LocalTile.Width + point.Y] = Program.WorldMap.LocalTile[point.X, point.Y]; } else if (Program.WorldMap.LocalTile.MemoryMap[point.X * Program.WorldMap.LocalTile.Width + point.Y] != null) { Program.WorldMap.LocalTile.MemoryMap[point.X * Program.WorldMap.LocalTile.Width + point.Y] = null; } if (Program.WorldMap.LocalTile[point.X, point.Y] is Monster && ((Creature)Program.WorldMap.LocalTile[point.X, point.Y]).Friendly == false && ((Creature)Program.WorldMap.LocalTile[point.X, point.Y]).Alive) { localDangerCount++; } if (Program.WorldMap.LocalTile[point.X, point.Y] is Creature creature) { localCreatures.Add(creature); } } if (localDangerCount > 0) { if (dangerCount < localDangerCount) { Program.Player.Path = null; } dangerCount = localDangerCount; } else { dangerCount = localDangerCount; } }
public override void HandleVisibility() { localCreatures = new List <Creature>(); RayCaster.SetAllInvis(Position, SightDist + 5, WorldIndex, CurrentFloor); Block[] blocks = CurrentFloor >= 0 ? Program.WorldMap[WorldIndex.X, WorldIndex.Y].Dungeon.Floors[CurrentFloor].Blocks : Program.WorldMap[WorldIndex.X, WorldIndex.Y].Blocks; Tile[] tiles = CurrentFloor >= 0 ? Program.WorldMap[WorldIndex.X, WorldIndex.Y].Dungeon.Floors[CurrentFloor].Floor : Program.WorldMap[WorldIndex.X, WorldIndex.Y].Floor; int width = Program.WorldMap[WorldIndex.X, WorldIndex.Y].Width; int localDangerCount = 0; foreach (Point point in VisiblePoints) { blocks[point.X * width + point.Y].Visible = true; blocks[point.X * width + point.Y].Explored = true; if (blocks[point.X * width + point.Y].Opaque == false) { tiles[point.X * width + point.Y].Visible = true; tiles[point.X * width + point.Y].Explored = true; } //// add items to memory map, remove them if there is a mismatch between memory map and local map //if (blocks[point.X * width + point.Y] is Item) // Program.WorldMap[WorldIndex.X, WorldIndex.Y].MemoryMap[point.X * width + point.Y] = blocks[point.X * width + point.Y]; //else if (Program.WorldMap[WorldIndex.X, WorldIndex.Y].MemoryMap[point.X * width + point.Y] != null) // Program.WorldMap[WorldIndex.X, WorldIndex.Y].MemoryMap[point.X * width + point.Y] = null; if (blocks[point.X * width + point.Y] is Creature creature) { localCreatures.Add(creature); if (creature is Monster monster && (monster.Faction.Equals(Faction) == false && monster.Alive)) { localDangerCount++; } } } if (localDangerCount > 0) { if (dangerCount < localDangerCount) { Program.Player.Path = null; } dangerCount = localDangerCount; } else { dangerCount = localDangerCount; } }
public static bool HandleMapSwitching(Creature creature) { // set all visibile cells to invisible so before switching maps RayCaster.SetAllInvis(creature.Position, creature.SightDist + 5); bool success = false; if (creature.Position.X == 0 && Program.WorldMap.WorldIndex.X != 0) { success = creature.MoveMaps(new Point(Program.WorldMap.LocalTile.Width - 1, creature.Position.Y), Program.WorldMap.LocalTile, Program.WorldMap[Program.WorldMap.WorldIndex.X - 1, Program.WorldMap.WorldIndex.Y]); if (success) { Program.WorldMap.WorldIndex.X -= 1; } } else if (creature.Position.Y == Program.WorldMap.LocalTile.Height - 1 && Program.WorldMap.WorldIndex.Y != 4) { success = creature.MoveMaps(new Point(creature.Position.X, 0), Program.WorldMap.LocalTile, Program.WorldMap[Program.WorldMap.WorldIndex.X, Program.WorldMap.WorldIndex.Y + 1]); if (success) { Program.WorldMap.WorldIndex.Y += 1; } } else if (creature.Position.X == Program.WorldMap.LocalTile.Width - 1 && Program.WorldMap.WorldIndex.X != 4) { success = creature.MoveMaps(new Point(0, creature.Position.Y), Program.WorldMap.LocalTile, Program.WorldMap[Program.WorldMap.WorldIndex.X + 1, Program.WorldMap.WorldIndex.Y]); if (success) { Program.WorldMap.WorldIndex.X += 1; } } else if (creature.Position.Y == 0 && Program.WorldMap.WorldIndex.Y != 0) { success = creature.MoveMaps(new Point(creature.Position.X, Program.WorldMap[0, 0].Height - 1), Program.WorldMap.LocalTile, Program.WorldMap[Program.WorldMap.WorldIndex.X, Program.WorldMap.WorldIndex.Y - 1]); if (success) { Program.WorldMap.WorldIndex.Y -= 1; } } return(success); }
// behaviors // public void UpdateFOV() { visiblePoints = RayCaster.CalculateFOV(sightDist, this).ToList(); }