User:Daveh/Editable Map Notes
The UESPWiki – Your source for The Elder Scrolls since 1995
Contents
Existing Editable Maps[edit]
-
-
- Very complex and feature complete for world map data.
- Basic Elements: Node, open-path, closed-path, relations
- Elements have tags with additional information
- Changes grouped into changesets
- Database Schema
-
- Edit/add places and roads
- Review edits from other users
- Likely editable maps supported through the maps API
-
Other Existing Resources[edit]
-
- MediaWiki
Existing Game Maps[edit]
-
-
- Flash based but lets you create custom maps. Appears to be down.
-
Concerns[edit]
-
- Performance -- Number of dynamic objects visible at one time. How many can a typical desktop or mobile browser handle? What server capacity is needed?
Prototype Design[edit]
-
- Basic Elements
-
- Location (point)
- Path (open array of lines)
- Area (closed array of lines)
- Map tile (image)
- Basic Actions
-
- View (read)
- Add
- Edit
- Delete
- Permission
-
- User level (anonymous, user, editor, admin, etc...)
- Per-Element
- Per-Action
Element Properties[edit]
-
- Common Attributes
-
- Title (short text)
- Title style (CSS text)
- Description (long text)
- Wiki page (text)
- Display level (integer)
- Visible (boolean)
- Edit user (ID)
- Edit time (time/date)
- Edit summary comment (short text)
-
- Location
-
- Position (coordinate)
- Icon image (text)
- Icon image size (integer x2)
-
- Path
-
- Points (coordinate array)
- Line style (CSS text)
-
- Area
-
- Points (coordinate array)
- Line style (CSS text)
- Fill style (CSS text)
-
- Map tile
-
- Cell position (coordinate)
- Zoom level (integer)
- File name (short text)
Database Design[edit]
-
- map
-
- Holds information on one map world. A map can be en entire exterior world or just a small interior cell.
CREATE TABLE IF NOT EXISTS world ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key name TINYTEXT NOT NULL, displayName TINYTEXT NOT NULL, description TEXT NOT NULL, wikiPage TEXT NOT NULL, cellSize INTEGER NOT NULL, minZoom INTEGER NOT NULL, maxZoom INTEGER NOT NULL, posLeft INTEGER NOT NULL, posTop INTEGER NOT NULL, posRight INTEGER NOT NULL, posBottom INTEGER NOT NULL, enabled TINYINT NOT NULL, type TINYINT NOT NULL, -- 0=exterior, 1=interior, etc...? PRIMARY KEY ( id ) );
-
- world_history
-
- Almost the same structure as world but holds all world revision data (including the current revision data).
CREATE TABLE IF NOT EXISTS world_history ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key worldId BIGINT NOT NULL, -- Foreign key to world table revisionId BIGINT NOT NULL, -- Foreign key to the revision table -- Same as world fields except for id PRIMARY KEY ( id ) );
-
- location
-
- Contains the current data for all location types:
CREATE TABLE IF NOT EXISTS location ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key worldId BIGINT NOT NULL, -- foreign key to the world table revisionId BIGINT NOT NULL, -- foreign key to the revision table destinationId BIGINT, -- foreign key to the location table for teleporting locType TINYINT NOT NULL, -- 1=point, 2=path, 3=area displayData TEXT NOT NULL, -- JSON object for extra display data iconName INTEGER NOT NULL, -- Display name for icon locX INTEGER NOT NULL, locY INTEGER NOT NULL, locWidth INTEGER NOT NULL, locHeight INTEGER NOT NULL, name TINYTEXT NOT NULL, description TEXT NOT NULL, wikiPage TEXT NOT NULL, displayLevel INTEGER NOT NULL, visible TINYINT NOT NULL, PRIMARY KEY ( id ) );
-
- location_history
-
- Almost the same structure as location but holds all location revision data (including the current revision data).
CREATE TABLE IF NOT EXISTS location_history ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key locationId BIGINT NOT NULL, -- Foreign key to location table revisionId BIGINT NOT NULL, -- Foreign key to the revision table -- Same as location fields except for id PRIMARY KEY ( id ) );
-
- revision
-
- Holds revision information in the similar manner to the MediaWiki revision table. It holds a reference to one edit to a location or world record:
CREATE TABLE IF NOT EXISTS revision ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key parentId BIGINT, -- key to the parent revision in this table worldId BIGINT, locationId BIGINT, worldHistoryId BIGINT, -- foreign key to the world_history table locationHistoryId BIGINT, -- foreign key to the location_history table editUserId BIGINT NOT NULL, -- foreign key to the MediaWiki's user table editUserText TEXT NOT NULL, -- plain text of the MediaWiki's user name editTimestamp TIMESTAMP NOT NULL, editComment TEXT NOT NULL, patrolled TINYINT NOT NULL, PRIMARY KEY (id) );
-
- location_cache
-
- Holds visible location data by cell coordinate for quicker and easier access:
CREATE TABLE IF NOT EXISTS location_cache ( id BIGINT NOT NULL, -- primary key worldId BIGINT NOT NULL, -- foreign key to the world table locationId BIGINT NOT NULL, -- foreign key to the location table posX INTEGER NOT NULL, posY INTEGER NOT NULL, PRIMARY KEY (id) );
-
- Users
-
- Use the MediaWiki users table.
-
- Permissions
-
- Use the existing MediaWiki permission system as much as possible. MediaWiki permissions are based on a simple 2-dimensional array configured like:
$wgGroupPermissions[GROUPNAME][PERMISSION] = { true | false };
-
-
- Based on this format the following custom permissions would be needed:
- map_read_maps
- map_read_points
- map_read_paths
- map_read_areas
- map_read_tiles
- map_edit_maps
- map_edit_points
- map_edit_paths
- map_edit_areas
- map_edit_tiles
- map_add_maps
- map_add_points
- map_add_paths
- map_add_areas
- map_add_tiles
- map_delete_maps
- map_delete_points
- map_delete_paths
- map_delete_areas
- map_delete_tiles
- map_patrol_maps
- map_patrol_points
- map_patrol_paths
- map_patrol_areas
- map_patrol_tiles
- Based on this format the following custom permissions would be needed:
-
-
-
- We can also make a few custom groups for easier administration of map rights:
- map_editor
- map_patroller
- map_admin
- We can also make a few custom groups for easier administration of map rights:
-
Simple Load Test[edit]
-
- Setup
-
- 1 map
- 1 million random locations
- content3 database
- Selecting directly from the location table over a set position range:
-
- No Index, 9092 rows = 525 ms
- No Index, 450 rows = 520 ms
- Index on XY, 450 rows = 52 ms (4 ms cached)
- Index on XY, 114299 rows = 634 ms
- Index on XY, 4863 rows = 521 ms (1.7 ms cached)
- Selecting from the location_cache table over a set cell range:
-
- Cell size of 4096
-
- No Index, 62637 rows = 178 ms
- No Index, 10496 rows = 134 ms (1.7 ms cached)
- Index XY, 10496 rows = 128 ms (1.6 ms cached)
- Join, No Index, 10496 rows = 220 ms
- Join, Index XY, 10496 rows = 209 ms
- Cell size of 1024
-
- No Index, 650 rows = 126 ms (0.4 ms cached)
- Index XY, 650 rows = 31 ms (0.3 ms cached)
- Join, No Index, 650 rows = 131 ms (0.5 ms cached)
- Join, Index XY, 650 rows = 36 ms (0.5 ms cached)
- Rebuild cache with proper location sizing (1.25 million cache entries)
-
- No Index, 833 rows = 155 ms (0.38 ms cached)
- Index XY, 833 rows = 39 ms (0.35 ms cached)
- Join, Index XY, 833 rows = 199 ms (0.77 ms cached)
Implementation Notes[edit]
-
- World table
CREATE TABLE IF NOT EXISTS world ( id BIGINT NOT NULL AUTO_INCREMENT, -- primary key parentId BIGINT NOT NULL, -- Key to parent map in world table or 0 name TINYTEXT NOT NULL, displayName TINYTEXT NOT NULL, nullImageTile TINYTEXT NOT NULL, description TEXT NOT NULL, wikiPage TEXT NOT NULL, cellSize INTEGER NOT NULL, minZoom INTEGER NOT NULL, maxZoom INTEGER NOT NULL, zoomOffset INTEGER NOT NULL, posLeft INTEGER NOT NULL, posTop INTEGER NOT NULL, posRight INTEGER NOT NULL, posBottom INTEGER NOT NULL, enabled TINYINT NOT NULL, PRIMARY KEY ( id ) -- index on name? -- index on displayname? -- initial x/y/zoom? );
-
- Search Index
-
- For location
FULLTEXT KEY `ft_search` (`name`,`description`)
-
-
- For world
-
FULLTEXT KEY `ft_search` (`displayName`,`description`)
ESOMap Change Notes[edit]
-
- ToDo
-
Add new maps from March Beta
-
-
-
stormhaven/emericsdreamauridon/abandonedmineauridon/hazikslairauridon/reliquaryvaultbottomauridon/reliquaryvaulttopbangkorai/bisnenselbangkorai/nchuduabtharthresholdcoldharbor/caveoftrophiescoldharbor/caveoftrophiesuppercoldharbor/greatshackle1coldharbor/themooringgreenshade/shroudedhollowcenterguildmaps/chateaumasterbedroommalabaltor/tempestislandncavemalabaltor/tempestislandncavemalabaltor/tempestislandsecavemalabaltor/tempestislandswcavereapersmarch/jodeplanereapersmarch/urcelmosbetrayalshadowfen/tsanjistonefalls/tormentedspireinstancetherift/arcwindpoint
-
-
-
-
Fixed missing zoom11 images for multiple mapsFixed missing zoom11 images for the Castle of the Worm mapsSet focus to location name when opening a popupTweaked the location labels to make them more displayUpdated the group map listMade the top buttons fit/wrap better in thin windowsFill in defaults for common names for a new locationPrevent title linking on locations with no wikiPage setPrevent locations with no icon from showing image in search listChange map list to a hideable dropdown and move search list over- Improve paths
-
- How to edit lines
- Definition of "mouse over" on a path
- Prevent a path from "hiding" objects below it, including dragging the map
Prevent text selection when dragging path nodes- Proper images for the pan and zoom controls
Permit -'ve numbers to represent worlds in a location's destinationId- Add more missing maps from Category:Online_Pages_Needing_Maps
Update map tiles from March betaAdded one more zoom level (zoom11) to all ESO mapsCreated FULLTEXT indexes on world and locationLabel the location destinationId and world parentId edit fields- Permit changing the location type
- Have a "default style" list to make selecting display styles consistent and fast
- Make mobile usable
-
Added basic zoom and pan controls- Add touch events (currently added but not working)
- Minor: Make arrow for custom icon type list match default list
- Minor: Vertically center icons in the icon type list (not as easy as it should be)
- Doubled Maps (looks like there are two identical maps used in the game)?
-
- Cave of Broken Souls
- Blackforge
- Switch to a non-paging type pan
- Search
-
Added basic search ability- Allow searching for parts of words?
Add icon for worlds (made bold)
- Key Shortcuts
-
- ESC key to cancel edit dialogs
- Arrow keys to pan
- +/- to zoom
Add a map key/legend- Filters to display only certain location types
-
- Skyshards (including inside child maps?)
- Wayshrines
- Crafting Stations
- Crafting Stores
- Quests (limit to certain quest?)
- Crafting Nodes
- Containers
Display icon in drop-down list- Change hover cursor to hint at editing a location
- Cursor type over path?
Implement a showhidden query parameter
-
- Make it work for disabled worlds?
Implement a centeron query parameter- Add a display level for the label?
Add line styles (dashed, solid, etc...)? No cross-browser support for it yet.- Zone coordinates range from (0,0)-(1,1) over the map image tile
- Add a circle/rectangle location types?
Check left padding in input boxes (W is clipped on left edge, something to do with font or text box and not CSS/padding)Add tooltips when hovering over a location (for locations with labelPos == 0)Fixed missing zoom11 tiles for some locationsChange position of point locationRemove icon preview for iconType == 0Swap "Bottom Left" and "Bottom Right" label position namesCheck alignment of "Bottom Left"- Proper label position alignment for size of icon
- Permit line wrapping/splitting of label text?
- Highlight location (for jumps without having to display popup)
- Color selection dialog
- Update map index on name change?
Prevent double saving (disable edit form buttons during save)- List revisions/edits
- Revert edits, revert to specific revision
- Proper deletions, revert deletion
- Patrol edits
- Proper permissions
- In-wiki version
Fix tabbing and keystrokes with the icon type listRemove location if display level changed on editProperly use the location's displayLevel when redrawing locations- Zone Notes
-
- Harbourage has multiple entrances (one in each of the 3 alliances)
- Cheesemonger has 3 different entrances
- There are two different Carzog's Demise zones (same map)
Clear search results on a blank searchChange popup to match in-game colors (gold border, black background, white bold text)Fix wiki links with single quotes in themRemove Online: from existing wiki links- Icons
-
Fishing HoleTreasure Map (79)Armor Smith (currently the same as Clothier?)Removed Armory (same as Armor Smith)Rename Portal to Oblivion PortalNamed Mob = 83Rename Medium Armor to Leatherworker31 is same as 3638 is same as 2462 is same as 59- Tweak size of some of the smaller icons (the following don't have any higher resolution ones available)
-
- Mystic (20)?
- Heavy Armor (32)?
- Light Armor (33)?
- Leatherworker (37)?
- Blacksmith (44)?
Lore book (smaller)Treasure map (smaller)
Invert the quest iconInvert the quest door iconHome/House icon (80)Icon for Grocer (use Provisioner = 39)Icon for "tree" = Grove (66)Icon for Quest StartBrewer icon (smaller version of Inn/11)Chef icon (Provisioner = 39)Renamed 44 (Weapon Smith) to BlacksmithWeaponsmith (crossed swords = 42)Rename Bag Vendor to Pack MerchantIcons for crafting stations (enchanting, alchemy, woodworking, clothier, blacksmith, provisioning)
-
Alchemy Station = 84Enchanting Table = 85Blacksmith Station = 86Woodworking Station = 87Clothing Station = 88Cooking Fire = 28
Merchant (General Vendor = 34)NPC icon (81)Icons for containers (chest, barrel, bag, sack, produce, heavy sack, crate) = 91
-
Chest = 83Heavy Sack = 89
Icons for crafting nodes (ore, plant, jute, water skin, cup) = 90Lore book icon (76)Mystic = arcanist</strikeChef = provisonerGrocer = provisonerBrewer = provisonerMagus = mages guildArmorer = heavy armorRename respec... to Rededication ShrineInnkeeper = merchantBoatswainArmsman = fighters guildTailor = hood icon (light armor?)Carpenter = woodworkerAdd alliance color coded icons for: Keep, Temple, Border Gate, Artifact Gate, Outpost, Mine, Farm, and Lumber Mill
-