public static MobSpawner CreateMobSpawner(RoomKey roomKey, MobSpawnerTemplate template, MobSpawnTableSet spawnTableSet, Random rng) { MobSpawner newMobSpawner = new MobSpawner(); newMobSpawner.m_room_key = new RoomKey(roomKey); newMobSpawner.m_mob_spawner_id = -1; // spawner ID not set until this gets saved into the DB newMobSpawner.m_position = new Point3d(template.Position); newMobSpawner.m_remaining_spawn_count = RNGUtilities.RandomInt(rng, 0, template.MaxSpawnCount); newMobSpawner.m_random_seed = rng.Next(); newMobSpawner.m_spawn_table = spawnTableSet.GetMobSpawnTableByName(template.SpawnTableName); return(newMobSpawner); }
private int CreateFullyConnectedRoomGrid( Random rng) { int lateralRoomCount = m_worldTemplate.DungeonLateralRoomCount; int floorCount = m_worldTemplate.DungeonFloorCount; int totalRoomCount = lateralRoomCount * lateralRoomCount * floorCount; m_roomGrid = new RoomLayout[lateralRoomCount, lateralRoomCount, floorCount]; m_minRoomKey = new RoomKey(m_gameId, -lateralRoomCount / 2, -lateralRoomCount / 2, 0); // Fully connect the rooms on each floor, but leave each floor unconnected initially for (RoomIndexIterator iterator = new RoomIndexIterator(m_roomGrid, RoomIndexIterator.eIterationType.allRooms); iterator.Valid; iterator.Next()) { RoomIndex roomIndex = iterator.Current; RoomKey roomKey = new RoomKey( m_gameId, roomIndex.X - lateralRoomCount / 2, roomIndex.Y - lateralRoomCount / 2, roomIndex.Z); RoomLayout room = new RoomLayout(roomKey); if (roomIndex.X > 0) { room.RoomFlagPortalOnSide(MathConstants.eSignedDirection.negative_x, true); } if (roomIndex.X < lateralRoomCount - 1) { room.RoomFlagPortalOnSide(MathConstants.eSignedDirection.positive_x, true); } if (roomIndex.Y > 0) { room.RoomFlagPortalOnSide(MathConstants.eSignedDirection.negative_y, true); } if (roomIndex.Y < lateralRoomCount - 1) { room.RoomFlagPortalOnSide(MathConstants.eSignedDirection.positive_y, true); } m_roomGrid[roomIndex.X, roomIndex.Y, roomIndex.Z] = room; } // Randomly add stairs connecting each floor for (int z_index = 0; z_index < floorCount - 1; z_index++) { Range <int> stairsRange = m_worldTemplate.StairsPerFloor; IList <RoomIndex> randomRoomIndices = GetRoomIndexListForFloor(z_index); int desiredStairsCount = RNGUtilities.RandomInt(rng, stairsRange.Min, stairsRange.Max); int currentStairsCount = 0; RNGUtilities.DeterministicKnuthShuffle(rng, randomRoomIndices); foreach (RoomIndex roomIndex in randomRoomIndices) { Room room = m_roomGrid[roomIndex.X, roomIndex.Y, roomIndex.Z]; Room roomAbove = m_roomGrid[roomIndex.X, roomIndex.Y, roomIndex.Z + 1]; // Only consider rooms of the configuration X+X-Y+Y- to add stairs to // because we only have rooms with stairs for the templates // X+X-Y+Y-Z+ and X+X-Y+Y-Z- // We do this so that we can get away with 18 room templates rather than 64 if (room.RoomHasAllPossibleDoors && !room.RoomHasStairs) { room.RoomFlagPortalOnSide(MathConstants.eSignedDirection.positive_z, true); roomAbove.RoomFlagPortalOnSide(MathConstants.eSignedDirection.negative_z, true); ++currentStairsCount; } if (currentStairsCount >= desiredStairsCount) { break; } } } return(totalRoomCount); }
public static Portal CreatePortal(Room room, MathConstants.eSignedDirection roomSide) { Portal newPortal = new Portal(); newPortal.portal_id = -1; // portal ID not set until this portal gets saved into the DB newPortal.target_portal_id = -1; newPortal.room_side = roomSide; newPortal.room_x = room.room_key.x; newPortal.room_y = room.room_key.y; newPortal.room_z = room.room_key.z; switch (roomSide) { case MathConstants.eSignedDirection.positive_x: { Point3d p1 = WorldConstants.ROOM_BOUNDS.Max; Point3d p0 = p1 - Vector3d.I * WorldConstants.PORTAL_WIDTH - Vector3d.J * WorldConstants.ROOM_Y_SIZE; newPortal.bounding_box = new AABB3d(p0, p1); } break; case MathConstants.eSignedDirection.negative_x: { Point3d p0 = WorldConstants.ROOM_BOUNDS.Min; Point3d p1 = p0 + Vector3d.I * WorldConstants.PORTAL_WIDTH + Vector3d.J * WorldConstants.ROOM_Y_SIZE; newPortal.bounding_box = new AABB3d(p0, p1); } break; case MathConstants.eSignedDirection.positive_y: { Point3d p1 = WorldConstants.ROOM_BOUNDS.Max; Point3d p0 = p1 - Vector3d.I * WorldConstants.ROOM_X_SIZE - Vector3d.J * WorldConstants.PORTAL_WIDTH; newPortal.bounding_box = new AABB3d(p0, p1); } break; case MathConstants.eSignedDirection.negative_y: { Point3d p0 = WorldConstants.ROOM_BOUNDS.Min; Point3d p1 = p0 + Vector3d.I * WorldConstants.ROOM_X_SIZE + Vector3d.J * WorldConstants.PORTAL_WIDTH; newPortal.bounding_box = new AABB3d(p0, p1); } break; case MathConstants.eSignedDirection.positive_z: case MathConstants.eSignedDirection.negative_z: { int column = RNGUtilities.RandomInt(WorldConstants.ROOM_X_TILES / 3, 2 * WorldConstants.ROOM_X_TILES / 3); int row = RNGUtilities.RandomInt(WorldConstants.ROOM_Y_TILES / 3, 2 * WorldConstants.ROOM_Y_TILES / 3); Point3d p0 = WorldConstants.GetTilePosition(column, row); Point3d p1 = p0 + Vector3d.I * WorldConstants.ROOM_TILE_SIZE + Vector3d.J * WorldConstants.ROOM_TILE_SIZE; newPortal.bounding_box = new AABB3d(p0, p1); } break; } return(newPortal); }