public SoundEffect(int id, Dungeon eventReceiver, long soundTime, double soundMagnitude, int soundLevel, Point soundLocation) { ID = id; SoundTime = soundTime; SoundMagnitude = soundMagnitude; MapLocation = soundLocation; LevelLocation = soundLevel; }
public DungeonEffect(Dungeon eventReceiver) { this.dungeon = eventReceiver; }
private void SetupDungeon() { //Create dungeon and set it as current in Game dungeon = new Dungeon(); Game.Dungeon = dungeon; //Randomer Random rand = new Random(); //Create dungeon map (at least level 1) MapGeneratorBSP mapGen1 = new MapGeneratorBSP(); //MapGeneratorRogue mapGen = new MapGeneratorRogue(); mapGen1.Width = 80; mapGen1.Height = 25; int extraCorridors = rand.Next(10); Map level1 = mapGen1.GenerateMap(extraCorridors); MapGeneratorBSP mapGen2 = new MapGeneratorBSP(); mapGen2.Width = 80; mapGen2.Height = 25; Map level2 = mapGen2.GenerateMap(extraCorridors); MapGeneratorCave cave1 = new MapGeneratorCave(); cave1.Width = 80; cave1.Height = 25; Map cave = cave1.GenerateMap(); //KeyPress userKey = Keyboard.WaitForKeyPress(true); //Test //for (int i = 0; i < 10000; i++) //{ // mapGen.GenerateMap(); //} //Give map to dungeon dungeon.AddMap(level1); //level 1 //dungeon.AddMap(level2); //level 2 int caveLevel = dungeon.AddMap(cave); cave1.AddStaircases(caveLevel); //Load level 3 from file try { MapGeneratorFromASCIIFile mapGen3 = new MapGeneratorFromASCIIFile(); mapGen3.LoadASCIIFile("test1.txt"); mapGen3.AddMapToDungeon(); } catch (Exception ex) { MessageBox.Show("failed to add level 3: " + ex.Message); } //Setup PC Player player = dungeon.Player; player.Representation = '@'; player.LocationMap = level1.PCStartLocation; player.Hitpoints = 100; player.MaxHitpoints = 100; //Give the player some items //player.PickUpItem(new Items.Potion()); //Add a down staircase where the player is standing AddFeatureToDungeon(new Features.StaircaseDown(), 0, new Point(player.LocationMap.x, player.LocationMap.y)); //Add a test short sword dungeon.AddItem(new Items.ShortSword(), 0, new Point(player.LocationMap.x, player.LocationMap.y)); //Create creatures and start positions //Add some random creatures int noCreatures = rand.Next(10) + 215; for (int i = 0; i < noCreatures; i++) { Monster creature = new Creatures.Rat(); creature.Representation = Convert.ToChar(65 + rand.Next(26)); //int level = rand.Next(2); int level = 0; Point location = new Point(0, 0); //Loop until we find an acceptable location and the add works do { if (level == 0) location = mapGen1.RandomWalkablePoint(); else if (level == 1) location = mapGen2.RandomWalkablePoint(); LogFile.Log.LogEntryDebug("Creature " + i.ToString() + " pos x: " + location.x + " y: " + location.y, LogDebugLevel.Low); } while (!dungeon.AddMonster(creature, level, location)); } //Create features //Add some random features /* int noFeatures = rand.Next(5) + 2; for (int i = 0; i < noFeatures; i++) { Features.StaircaseUp feature = new Features.StaircaseUp(); feature.Representation = Convert.ToChar(58 + rand.Next(6)); AddFeatureToDungeon(feature, mapGen1, 0); }*/ //Add staircases to dungeons level 1 and 2 AddFeatureToDungeonRandomPoint(new Features.StaircaseDown(), mapGen1, 0); //AddFeatureToDungeonRandomPoint(new Features.StaircaseUp(), mapGen2, 1); //Create objects and start positions //Add some random objects int noItems = rand.Next(10) + 5; for (int i = 0; i < noItems; i++) { Item item; if (rand.Next(2) < 1) { item = new Items.Potion(); } else { item = new Items.ShortSword(); } //item.Representation = Convert.ToChar(33 + rand.Next(12)); int level = 0; Point location; //Loop until we find an acceptable location and the add works do { location = mapGen1.RandomWalkablePoint(); } while (!dungeon.AddItem(item, level, location)); } }
public Pathing(Dungeon dungeon, Algorithms.IPathFinder pathFinding) { this.pathFinding = pathFinding; this.dungeon = dungeon; }
private void SpawnRandomMap(Dungeon dungeon, int level) { MapGeneratorBSP hallsGen = new MapGeneratorBSP(); //Clip to 60 hallsGen.Width = (int)Math.Min(40 + Game.Random.Next(25), 60); hallsGen.Height = 25; Map hallMap = hallsGen.GenerateMap(hallsExtraCorridorDefinite + Game.Random.Next(hallsExtraCorridorRandom)); int levelNo = Game.Dungeon.AddMap(hallMap); //Store the hallGen //Will get sorted in level order levelGen.Add(level, hallsGen); //Add standard dock triggers (allows map abortion & completion) AddStandardEntryExitTriggers(dungeon, hallsGen, levelNo); //Place dock bay feature at PC startloc Game.Dungeon.AddFeature(new Features.DockBay(), levelNo, Game.Dungeon.Levels[levelNo].PCStartLocation); }
private static void AddStandardEntryExitTriggers(Dungeon dungeon, MapGeneratorBSP hallsGen, int levelNo) { List<Point> surroundingDock = hallsGen.GetEntryDoor(); foreach(Point p in surroundingDock) Game.Dungeon.AddTrigger(levelNo, p, new Triggers.DockDoor()); //Add exit trigger Game.Dungeon.AddTrigger(levelNo, Game.Dungeon.Levels[levelNo].PCStartLocation, new Triggers.LeaveByDock()); }
private void LoadGame(string playerName) { //Save game filename string filename = playerName + ".sav"; //Deserialize the save game XmlSerializer serializer = new XmlSerializer(typeof(SaveGameInfo)); Stream stream = null; GZipStream compStream = null; try { stream = File.OpenRead(filename); //compStream = new GZipStream(stream, CompressionMode.Decompress, true); //SaveGameInfo readData = (SaveGameInfo)serializer.Deserialize(compStream); SaveGameInfo readData = (SaveGameInfo)serializer.Deserialize(stream); //Build a new dungeon object from the stored data Dungeon newDungeon = new Dungeon(); newDungeon.Features = readData.features; newDungeon.Items = readData.items; newDungeon.Effects = readData.effects; newDungeon.Monsters = readData.monsters; newDungeon.Spells = readData.spells; newDungeon.Player = readData.player; newDungeon.SpecialMoves = readData.specialMoves; newDungeon.WorldClock = readData.worldClock; newDungeon.HiddenNameInfo = readData.hiddenNameInfo; newDungeon.Triggers = readData.triggers; newDungeon.Difficulty = readData.difficulty; newDungeon.DungeonInfo = readData.dungeonInfo; newDungeon.dateCounter = readData.dateCounter; newDungeon.nextUniqueID = readData.nextUniqueID; newDungeon.nextUniqueSoundID = readData.nextUniqueSoundID; newDungeon.Effects = readData.effects; newDungeon.DungeonMaker = readData.dungeonMaker; Game.MessageQueue.TakeMessageHistoryFromList(readData.messageLog); //Process the maps back into map objects foreach (SerializableMap serialMap in readData.levels) { //Add a map. Note that this builds a TCOD map too newDungeon.AddMap(serialMap.MapFromSerializableMap()); } //Build TCOD maps newDungeon.RefreshAllLevelPathingAndFOV(); //Worry about inventories generally //Problem right now is that items in creature inventories will get made twice, once in dungeon and once on the player/creature //Fix is to remove them from dungeon when in a creature's inventory and vice versa //Rebuild InventoryListing for the all creatures //Recalculate combat stats foreach (Monster monster in newDungeon.Monsters) { monster.Inventory.RefreshInventoryListing(); monster.CalculateCombatStats(); } newDungeon.Player.Inventory.RefreshInventoryListing(); //Set this new dungeon and player as the current global Game.Dungeon = newDungeon; newDungeon.Player.CalculateCombatStats(); //Give player free turn (save was on player's turn so don't give the monsters a free go cos they saved) Game.Dungeon.PlayerBonusTurn = true; Game.MessageQueue.AddMessage("Game : " + playerName + " loaded successfully."); LogFile.Log.LogEntry("Game : " + playerName + " loaded successfully"); } catch (Exception ex) { Game.MessageQueue.AddMessage("Game : " + playerName + " failed to load."); LogFile.Log.LogEntry("Game : " + playerName + " failed to load: " + ex.Message); } finally { if (compStream != null) { compStream.Close(); } if (stream != null) { stream.Close(); } } }
private void AddMonstersToRoomsOnLevelGaussianDistribution(MapInfo mapInfo, int level, IEnumerable <Monster> monster) { //Get the number of rooms var allRoomsAndCorridors = mapInfo.GetRoomIndicesForLevel(level).Except(new List <int> { mapInfo.StartRoom }); var rooms = mapInfo.FilterOutCorridors(allRoomsAndCorridors).ToList(); var candidatePointsInRooms = rooms.Select(room => mapInfo.GetAllPointsInRoomOfTerrain(room, RoomTemplateTerrain.Floor)); var roomsAndPointsInRooms = rooms.Zip(candidatePointsInRooms, Tuple.Create); var monstersToPlaceRandomized = monster.Shuffle().ToList(); int noMonsters = monstersToPlaceRandomized.Count; int noRooms = rooms.Count(); LogFile.Log.LogEntryDebug("No rooms: " + noRooms + " Total monsters to place (level: " + level + "): " + noMonsters, LogDebugLevel.Medium); //Distribution amongst rooms, mostly evenly, scaled by room size var roomMonsterRatio = roomsAndPointsInRooms.Select(rp => Math.Max(0, Gaussian.BoxMuller(5, 3)) * rp.Item2.Count()); double totalMonsterRatio = roomMonsterRatio.Sum(); double ratioToTotalMonsterBudget = noMonsters / totalMonsterRatio; int[] monstersPerRoom = new int[noRooms]; double remainder = 0.0; for (int i = 0; i < noRooms; i++) { double monsterBudget = roomMonsterRatio.ElementAt(i) * ratioToTotalMonsterBudget + remainder; double actualMonstersToPlace = Math.Floor(monsterBudget); double levelBudgetSpent = actualMonstersToPlace; double levelBudgetLeftOver = monsterBudget - levelBudgetSpent; monstersPerRoom[i] = (int)actualMonstersToPlace; remainder = levelBudgetLeftOver; //Any left over monster ratio gets added to the next level up } //Calculate actual number of monster levels placed int totalMonsters = monstersPerRoom.Sum(); LogFile.Log.LogEntryDebug("Total monsters actually placed (level: " + level + "): " + noMonsters, LogDebugLevel.Medium); //Place monsters in rooms Dungeon dungeon = Game.Dungeon; int monsterPos = 0; for (int r = 0; r < noRooms; r++) { int monstersToPlaceInRoom = monstersPerRoom[r]; var candidatePointsInRoom = roomsAndPointsInRooms.ElementAt(r).Item2.Shuffle(); int monstersPlacedInRoom = 0; foreach (var p in candidatePointsInRoom) { if (monsterPos >= monstersToPlaceRandomized.Count) { LogFile.Log.LogEntryDebug("Trying to place too many monsters", LogDebugLevel.High); monsterPos++; break; } Monster mon = monstersToPlaceRandomized[monsterPos]; GiveMonsterStandardItems(mon); bool placedSuccessfully = Game.Dungeon.AddMonster(mon, level, p); if (placedSuccessfully) { monsterPos++; monstersPlacedInRoom++; } if (monstersPlacedInRoom >= monstersToPlaceInRoom) { break; } } } }