public RDungeonMap(DataManager.Maps.RDungeonMap baseMap) : base(baseMap) { this.baseMap = baseMap; }
public static RDungeonMap GenerateFloor(Client client, int dungeonIndex, int floorNum, GeneratorOptions options) { RDungeon dungeon = RDungeonManager.RDungeons[dungeonIndex]; RDungeonFloor floor = dungeon.Floors[floorNum]; //decide on a chamber RDungeonChamberReq req = null; int chamber = -1; if (options.Chambers.Count > 0) { chamber = Math.Rand(0, options.Chambers.Count); req = (RDungeonChamberReq)Scripting.ScriptManager.InvokeFunction("GetChamberReq", options.Chambers[chamber].ChamberNum, options.Chambers[chamber].String1, options.Chambers[chamber].String2, options.Chambers[chamber].String3); } // Generate the ASCII map DungeonArrayFloor arrayFloor = new DungeonArrayFloor(options, req); //int[,] arrayMap = ASCIIFloorGen.GenASCIIMap(options); //ASCIIFloorGen.TextureDungeon(arrayMap); System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); // Prepare the base map DataManager.Maps.RDungeonMap rDungeonMap = new DataManager.Maps.RDungeonMap(MapManager.GenerateMapID(RDungeonMap.ID_PREFIX)); rDungeonMap.MaxX = arrayFloor.MapArray.GetUpperBound(0); rDungeonMap.MaxY = arrayFloor.MapArray.GetUpperBound(1); rDungeonMap.Tile = new DataManager.Maps.Tile[rDungeonMap.MaxX + 1, rDungeonMap.MaxY + 1]; rDungeonMap.RDungeonIndex = dungeonIndex; rDungeonMap.RDungeonFloor = floorNum; RDungeonMap map = new RDungeonMap(rDungeonMap); for (int x = 0; x <= rDungeonMap.Tile.GetUpperBound(0); x++) { for (int y = 0; y <= rDungeonMap.Tile.GetUpperBound(1); y++) { AmbiguateTile(map.Tile[x,y]); } } map.Name = GenerateName(dungeonIndex, floorNum); map.Revision = 0; map.OriginalDarkness = floor.Darkness; map.HungerEnabled = true; map.RecruitEnabled = dungeon.Recruitment; map.ExpEnabled = dungeon.Exp; map.TimeLimit = dungeon.WindTimer; map.DungeonIndex = dungeon.DungeonIndex; map.MinNpcs = floor.NpcMin; map.MaxNpcs = floor.NpcMax; map.NpcSpawnTime = floor.NpcSpawnTime; if (Globals.ServerWeather != Enums.Weather.Ambiguous) { map.Weather = Globals.ServerWeather; } else if (floor.Weather.Count > 0) { map.Weather = floor.Weather[Server.Math.Rand(0, floor.Weather.Count)]; } map.Music = floor.Music; //texture chamber if (arrayFloor.Chamber.X != -1 && arrayFloor.Chamber.Y != -1) { Scripting.ScriptManager.InvokeSub("CreateChamber", map, arrayFloor, options.Chambers[chamber].ChamberNum, options.Chambers[chamber].String1, options.Chambers[chamber].String2, options.Chambers[chamber].String3); } DungeonArrayFloor.TextureDungeon(arrayFloor.MapArray); for (int x = 0; x <= rDungeonMap.Tile.GetUpperBound(0); x++) { for (int y = 0; y <= rDungeonMap.Tile.GetUpperBound(1); y++) { map.Tile[x, y].RDungeonMapValue = arrayFloor.MapArray[x, y]; } } TextureDungeonMap(map); //block borders for (int y = 0; y <= map.MaxY; y++) { map.Tile[0, y].Type = Enums.TileType.Blocked; map.Tile[map.MaxX, y].Type = Enums.TileType.Blocked; } for (int x = 0; x <= map.MaxX; x++) { map.Tile[x, 0].Type = Enums.TileType.Blocked; map.Tile[x, map.MaxY].Type = Enums.TileType.Blocked; } watch.Stop(); foreach (MapNpcPreset npc in floor.Npcs) { MapNpcPreset newNpc = new MapNpcPreset(); newNpc.NpcNum = npc.NpcNum; newNpc.MinLevel = npc.MinLevel; newNpc.MaxLevel = npc.MaxLevel; newNpc.SpawnX = npc.SpawnX; newNpc.SpawnY = npc.SpawnY; newNpc.AppearanceRate = npc.AppearanceRate; newNpc.StartStatus = npc.StartStatus; newNpc.StartStatusCounter = npc.StartStatusCounter; newNpc.StartStatusChance = npc.StartStatusChance; map.Npc.Add(newNpc); } map.SpawnItems(); int n = Server.Math.Rand(options.ItemMin, options.ItemMax + 1); if (floor.Items.Count == 0) { n = 0; } else if (n > Constants.MAX_MAP_ITEMS) { n = Constants.MAX_MAP_ITEMS; } int slot = 0; int itemX = -1, itemY = -1; for (int i = 0; i < n; i++) { for (int j = 0; j < 100; j++) { bool spawned = false; if (Server.Math.Rand(0, 100) < floor.Items[slot].AppearanceRate) { arrayFloor.GenItem(floor.Items[slot].OnGround, floor.Items[slot].OnWater, floor.Items[slot].OnWall, ref itemX, ref itemY); if (itemX > -1) { map.SpawnItem(floor.Items[slot].ItemNum, Server.Math.Rand(floor.Items[slot].MinAmount, floor.Items[slot].MaxAmount + 1), (Server.Math.Rand(0, 100) < floor.Items[slot].StickyRate), floor.Items[slot].Hidden, floor.Items[slot].Tag, itemX, itemY, null); spawned = true; } } slot++; if (slot >= floor.Items.Count) slot = 0; if (spawned) break; } } //map.SpawnNpcs(); map.NpcSpawnWait = new TickCount(Core.GetTickCount().Tick); return map; }
public RDungeonMap(DataManager.Maps.RDungeonMap baseMap) : base(baseMap) { this.baseMap = baseMap; }