UESPWiki:Skyrim Map Design
This article covers various aspects of the design of Skyrim maps for use on UESP.
Índice
Interior Maps
Local maps for cells can be created with the Creation Kit via World->Create Local Maps
in .dds format. The resolution required to generate each map will vary, as the zoom levels change from one map to the next. A completely consistent image size will therefore be virtually impossible to achieve, though an estimate of the resolution required can be figured out by first exporting at a target resolution of 512, then re-exporting after seeing how much the image needs to be scaled to produce a suitable resolution. A good target resolution is about 800 to 1000 pixels in the map's largest dimension, factoring in any necessary rotation.
Before proceeding, check the map for missing sections. For unknown reasons, perhaps related to low-memory issues or bulk exporting, sections of the map will occasionally be missing from the file. Re-exporting or changing resolutions seems to correct the issue in most cases.
Once the initial export is complete and correct, the DDS file will need rotating, cropping, and conversion to JPG format. The proper in-game rotation necessary can be found by looking for the NorthMarker object in the cell. In the Creation Kit, this will be listed in degrees as the Z-rotation for the marker. In the game data, it is the REFR with a NAME field of 0x00000003; the DATA field consists of 6 floats, the last being the needed rotation in radians (counterclockwise).
Finally, after uploading the map to UESP, add it to the relevant page(s) and use the {{Image Mark}} template to add door markers and points of interest to the map.
If you are a beginner at working with maps and the Creation Kit consider following our map tutorial.
World Maps
It would appear that these are done the same way as they were for Oblivion [1]
See Also
Interior Maps Status Report
So which interior map should you work on? Click [show] on the list below and pick any map that does not already have an Uploaded File Name. Caution: This is a temporary section which will be replaced by the appropriate category page(s).
The status codes are:
- <blank> = no map has been uploaded onto the wiki
- skip = the cell is too small or too simple to need a map
- uploaded = the map has been saved but not placed on its wiki page
- on page = a map has been added to the page usually in its own == Map == section
- intermixed = a map has been added and mixed in with the text explanation
- pogged = a map has been added with pogs positioned on points of interest, may or may not be intermixed.
Please remember to upload your map following this format, watching for spaces, caps and hyphens:
- SR-map-<whatever is the in-game Name>.jpg
If the file is named "My really cool map of where those Glen Moril Witches hide.png", somebody else may also do the same map! If their name follows the correct format, their map will be used and yours will be lost among the thousands of uploaded files. We have already had 10 duplicated maps.
Last updated: July 3, 2013 There are about 509 possible interior maps remaining. We hope that all test cells, holding cells, and non-existent pages have been excluded. If items on the list are removed, the list will not be renumbered to reflect their removal. So, for example, 395 will always be the Riften's Mistveil Keep which should make editing easier.
Interior Map Cells List | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Cell Resource Map Notes
This section provides details on implementing an overlay showing the counts of various cell resources (plants, ore, etc...).
Database Design
A new table will be created within the sr_map_data database with the following structure:
CREATE table cellresource ( formid INT PRIMARY KEY NOT NULL, -- primary key name TEXT NOT NULL, editorid TEXT NOT NULL, data TEXT NOT NULL ); CREATE INDEX cellresource_editorid_index ON cellresource(editorid(24));
Most of the fields should be self-explanatory. The data field is a JSON string holding a 2-dimensional array of integers of the counts of the resource in each cell. The size of the array should be identical for each resource as defined by the map code.
Coloured Map Notes
The following are some development on various options of creating a coloured Skyrim map.
CK Create Local Maps
The current grey scale map was created using this feature. There is no known explanation why the map images have no color and there doesn't appear to be any options to enable it. There is also the issue of many map cells being exported partially or fully black for no known reason.
CK Map Capture
The option uses the render window of the Creation Kit to capture coloured map images. The basic process is:
-
- Open skyrim.esm in the CK
- Use the Cell View dialog to open a Tamriel cell of a specific X/Y coordinate
- Enable/disable cell borders as needed using 'B'
- Disable perspective using '0'
- Choose a top camera view using 'T'
- Disable markers using 'M'
- Choose the time of day as noon (although 3 pm appears to give better shadows and contrast)
- Enable/disable sky lighting using '6'
- Enable/disable bright lights using 'A' (the bright light color can be adjusted in preferences as needed)
- Capture the image using Prt-Scrn or an image capture software
- Split the capture map image into individual cells and resize each to 256x256 pixels
- On a large screen (1920x1080) up to 15 cells (5x3) can be captured at a time
-
- Note: On a multiple monitor setup the render view can be resized across the entire virtual screen. For example on dual 1920x1080 monitors I can view/capture 11x3 cells displayed at a time which increases the manual efficiency a good amount. The editor preferences can be adjusted to set how many cells to load at a time (in the Misc tab under Grids to Load).
While this method has the capability of capturing high quality map images there are a number of issues:
-
- When changing cell location there are often strange clipping issues. This can be fixed by selecting an object in the new cell and pressing 'T' but this resets the map zoom scale.
-
- This appears to be due to the perspective camera's position being reset after each cell load and the orthographic camera linked to its view frustum. It can be fixed by the following:
-
- Adjust the orthographic camera to the desired zoom level.
- Change the cell position in the cell view window.
- Switch to the perspective camera using '0'
- Zoom out a far distance (the camera preferences can be edited to zoom out faster)
- Switch back to the orthographic camera using '0'
- If you zoomed out far enough the world display should be normal
- Markers have to be re-enabled and then disabled after moving to a new cell.
-
- This appears to be simply due to new cells ignoring the current state of the marker enable status. Toggling the marker display twice resets things.
- Cell load is not instant: Objects are loaded asynchronously and pop into view gradually. Depending on the number of objects in the cells loading 5x3 cells takes anywhere from 1 to 60 seconds.
- Some objects (like acoustic spaces, actors, and cameras) remain visible and cannot be hidden. Acoustic spaces in particular mess up the map display considerably and would have to be deleted.
-
- This appears to be the same issue as the marker issue noted above. Toggling the marker display status twice via 'M' hides most things.
- The only objects which cause an issue are actors and wave? types.
- The actor markers are small and relatively minor and might be "hidden" by manually changing the NIF file for the actor marker.
- The wave? markers are seen mostly along the northern shoreline and are infrequent and large enough to be manually deleted.
- It is difficult/impossible to keep a constant view when changing cells which makes a subsequent automatic splitting of the image into individual cell images difficult/impossible.
-
- This has been solved. The perspective camera does reset when you change cells but the orthographic camera remains constant.
- This method is not easily automated. It may be possible by using a custom program that sends keyboard and mouse events directly to the CK windows.
-
- It is possible although it is very much a "hack" and extremely fragile. A mostly automatic process with minor manual intervention is readily possible.
- Assuming 15 cells can be captured at a time at a resolution of 256x256 that still leaves some 600 screen captures to perform. If done entirely manually at 1 minute per screen capture this would take 10 hours of continuous capture (not counting having to split the screen captures).
- Splitting of the work between multiple people would help since the process is made easily parallel by assigning cell ranges.
- Water display is somewhat different depending on its position on the screen (due to sky reflection I assume). You can use SHIFT-W to enable/disable the water plane which makes it possible to capture two identical screenshots, one with water and one without, and do post-processing to add any style water effect that is desired.
-
- This is mostly resolved and due to the perspective camera being reset after a cell change. Once you zoom the perspective camera out a far distance the water is a mostly constant light-blue colour in the orthographic camera.
- The CK tends to consume memory and never release it (memory leak?) until it crashes shortly after passing 2GB private working set.
-
- This is not as big of a problem as when outputting the local maps. You can load and capture several sets of all cells without any noticeable issues (CK memory usage goes up just above 3GB but doesn't crash).
- The render view does not display perfectly square or regular cells in the orthographic camera. The cells are almost square (e.g., 305x297) and there may be a 1 pixel size variation in each direction depending on the exact zoom level and the position of the cell in the render view.
-
- You can manually tweak the zoom level to be the same from session to session.
- The CK spits out a lot of warnings during cell loads which display a modal dialog box not particularly friendly to automatic processing.
-
- You can disable CK warnings by editing SkyrimEditor.ini and setting bBlockMessageBoxes=1.
In order for this option to be made viable a more automated capture and cell splitting process has to be come up with.
Map Creation Process
Most of the significant initial difficulties with this technique have been solved which permit map tiles to be created with a mostly automatic and partial manual process detailed as follows:
-
- Create a custom program capable of the following:
-
- Find the CK render window handle.
- Find the CK cell view window and child window handles (the X/Y edit boxes and the Go button).
- Simulate mouse, keyboard and Windows messages using a various combination of SendInput() and SendMessage().
- Capture the contents of a window and save to an image file. There are a few ways to do this in Windows but the easiest turned out to be activating the desired window (CK render view), simulating an Alt+PrtScrn keypress, copying the clipboard image to a GDI+ bitmap, and then manipulating and saving this to a PNG or JPG file.
- Various macros to jump to a specific cell, set the render view to a desired setting, capture the render view and split it into individual cell images.
- Start the Skyrim CK and load skyrim.esm and update.esm. Load any external cell in the main worldspace (Tamriel).
- Set the time to 15:50 (or any desired time but it should remain constant for one complete map tile export).
- Similarly, play with the various render display options to get the desired effect. Best combination I've found is sky on, bright light off.
- Tweak the orthographic camera zoom level and the render window size to get the split cell images to come out perfectly aligned along the cell boundaries. Turning on cell borders using 'B' is very helpful during this stage. Record the settings as the CK may need to be restarted several times during the map tile creation process.
- Define the cell range to export. While there are a lot of blank/empty cells around the content they export quickly. I use (-57,-43)-(61, 45).
- Start the export process.
-
- Jump to the appropriate cell in the custom macro program.
- Ensure the cell is actually loaded/updated in the CK (sometimes it doesn't properly update and you manually have to hit Go in the cell view window).
- Wait for the cells to load and display (may take up to one minute).
- Refresh the render view display using the custom macro program.
- Assuming everything looks fine hit the capture in the custom macro program. The time to capture and save two sets of map tiles (with water and without) takes less than 2 seconds.
- Repeat for the next set of cells.
- Once all cell tiles are exported check for missing images and re-export as needed.
- Assuming no issues you should have a complete set of 256x256 coloured map tiles for zoom level 16. Create the smaller zoom levels as one normally would for the maps and upload.
In-Game Map Capture
By using console commands the game itself can be used to capture map images of good quality. The basic process is:
-
- Start a vanilla Skyrim game (perhaps with a seamless cities mod)
- Initialize the game using the following console commands:
-
- tgm
- tcl
- setfog 10000000 100000000
- set timescale to 0
- set gamehour to 12
- tb
- fw 0010E1F2
- To capture a specific cell use the following console commands
-
- cow Tamriel [CellX] [CellY]
- (wait for location to load)
- player.setpos x [CellX]*4096+2048
- player.setpos y [CellY]*4096+2048
- player.setpos z 50000
- player.setangle x 90
- player.setangle y 0
- player.setangle z 0
- fov 10
- Use the tm console command to hide the game menus and then capture the screen
- One or more console batch files can be used to streamline this process but the screen capture must remain manual.
- A custom program can be used to send keystrokes to Skyrim to achieve the same effect in addition to permitting automatic screenshot capture by sending the Prt-Scrn key.
This method can create good quality and full colour map images but has a number of issues:
-
- The map images have perspective so are not constant in size (tall mountains appear larger) and do not have straight edges. This effect can be minimized by using a larger z-position and a smaller FOV but there is an upper z-limit of 300000 after which everything is clipped and if you go over 50000 the water shorelines do not look very good.
- The custom program that sends keystrokes to the game to automate this process works but is fragile due to the asynchronous nature of the game. Cell loads take an arbitrary time to complete and any random game/OS pauses can result in the "corruption" of the console command being sent.
- To further complicate matters when playing Skyrim you cannot use any global Windows hot key which would be useful in starting/updating/stopping the automated map capture process.
- The variable size of the cells in the map images means an automated map image celling procedure is not possible.
While this method looks promising there are still multiple issues to work through, the main one being due to the perspective view of the map within the game.
Water Post-Processing
By capturing two sets of map tiles from the CK, one with water and one without, we can do a variety of post-processing to choose how water appears. There are a variety of methods but we'll be using the command line ImageMagick for the following procedure:
-
- Note that PNGs work better than JPGs as the source images.
- Assume regular map tile image is maptile.jpg and no-water version is nowater.jpg.
- Create a base image to use as the water
convert -size 256x256 canvas:'#00336699' watercanvas.png
-
- This is a one time operation and the color/opacity of the water can be adjusted as needed.
- Create difference from the two images:
composite maptile.jpg nowater.jpg-compose difference diff.jpg
-
- Turn the difference image into a black&white mask with some blurring:
convert diff.jpg -threshold 10% -blur 0x2 mask.jpg
-
- The threshold and blur level can be adjusted a bit as needed.
- Combine the nowater, mask and water canvas into the final image:
composite watercanvas.png nowater.jpg mask.jpg finalmap.jpg
-
- See example inputs and output using the previous commands below:
- Other examples of commands for different water effects:
convert finalmap.jpg -blur 0x1 blurredwater.jpg composite blurredwater.png finalmap.jpg mask.jpg finalmap1.jpg
-
- An alternative method doing the processing in one command is:
convert nowater.png watercanvas.png \ \( maptile.png -clone 0 -compose difference -composite -colorspace HSL -channel B -threshold 6% -colorspace RGB -channel ALL,sync -blur 1x1 \) \ -compose over -composite output.jpg
-
- This has a better mask creation method that has less chance of the underwater ground "bleeding" through and water appearing incorrectly on the regular ground (see old and new final images below). It is also about twice as fast due to not having to save and reload intermediate images in multiple steps.
Simple Map Rendering
Convert the detailed colored maps to a simpler type output:
convert input.jpg -morphology Smooth Octagon:2 output.jpg
Custom Renderer Map Capture
The most flexible option for creating any style/color of map images we can imagine but also the most complex and time consuming. The required time to develop a custom renderer is likely several months unless multiple developers can be enlisted, even reusing existing components as much as possible.