Ideally, I'd like to somehow structure the URI like this: http://sc2build.com/#Z9d3Jd8GAxi8dAS8D,P9Dsk8DA9k9134Sdj This URI would contain 2 builds to be compared side by side. The comma separates the builds, and the first build is a Zerg player (indicated by the starting Z) and the second build is a Protoss player (indicated by the starting P). The difficulty is in finding how to condense the needed data into a simple string, using only alphanumeric characters (62 characters, in total). Well, that is the second difficulty. The first is finding the most streamlined way to store the data. The PHP function base_convert() can be used to go from base 36 (alphanumeric, but no capital letters) to base-16 (hexadecimal), but it only safely handles up to 31 bit numbers. This restricts the string length to 10 to maintain accuracy (which is essential for sharing build orders). When parsing each chunk, I would first convert to hexadecimal, and then each 2 byte chunk represents a distinct command such as build Probe, build Gateway, assign Probe to minerals, wait 17 seconds, etc. This string would then serve as the basic data storage for a build order. In an initial test of converting base 36 to base 16, the results are less than impressive. Base 36: asdlfh81y234hrlkbjadfo78ay097 Base 16: 3e47e4c4298da120a256112e6528362bcc0fcb That is a difference of 38 characters to 29 characters, a savings of 24%. I was hoping to be able to store significantly more than that, and I will have to either find or make a base 62 to base 16 converter to further compress the data and make full use of the alphanumeric range for storage. I quickly found a function to convert between base 62 and base 16, but even still the results are not too thrilling. Base 62: 9Dsk8DA9k9134Sdj Base 16: 1CF727C3E2F2C539513601 This reduction is more than base 36, but only by about 3%. Since these tests are fast and sloppy, I may need to double check the numbers to make sure I haven't erred in a way to scare me away from this method, because as of now, it seems like I need to explore another path to minimize data storage. I feel that, in order to properly store a build order, I need to store at least 64 distinct commands. This could be accomplished through alphanumeric strings, if each race's actions can be completely and entirely summed up in 62 distinct actions, which is definitely possible. Char | Protoss | Terran | Zerg | -------------------------------------------------------------------------------- 0 | Nexus | Command Center | Hatchery | 1 | Pylon | Orbtial Command | Lair | 2 | Assimilator | Planetary Fortress | Extractor | 3 | Gateway | Supply Depot | Spawning Pool | 4 | Warpgate | Refinery | Evolution Chamber | 5 | Forge | Barracks | Spine Crawler | 6 | Photon Cannon | Engineering Bay | Spore Crawler | 7 | Cybernetics Core | Bunker | Hydralisk Den | 8 | Twilight Council | Missile Turret | Baneling Nest | 9 | Robotics Facility | Sensor Tower | Lair | a | Stargate | Factory | Roach Warren | b | Templar Archives | Ghost Academy | Infestation Pit | c | Dark Shrine | Armory | Spire | d | Robotics Bay | Starport | Greater Spire | e | Fleet Beacon | Fusion Core | Nydus Network | f | | Barracks w/ Tech Lab | Hive | g | | Barracks w/ Reactor | Ultralisk Cavern | h | | Starport w/ Tech Lab | Greater Spire | i | | Starport w/ Reactor | Creep Tumor | j | | Factory w/ Tech Lab | | k | | Factory w/ Reactor | | l | | | | m | | | | n | | | | o | | | | p | | | | q | | | | r | | | | s | | | | t | | | | u | | | | v | | | | w | | | | x | | | | y | | | | z | | | | A | | | | B | | | | C | | | | D | | | | E | | | | F | | | | G | | | | H | | | Changeling | I | Mothership | Point Defense Drone | Broodling | J | Interceptors | Auto-Turret | Brood Lord | K | Carrier | Battlecruiser | Ultralisk | L | Archon | Banshee | Nydus Worm | M | Dark Templar | Raven | Corruptor | N | High Templar | Medivac | Mutalisk | O | Void Ray | Viking | Infested Terran | P | Phoenix | Thor | Infestor | Q | Colossus | Siege Tank | Roach | R | Warp Prism | Hellion | Overseer | S | Immortal | Ghost | Baneling | T | | Reaper | Hydralisk | U | Observer | Marauder | Queen | V | Sentry | Marine | Zergling | W | Stalker | MULE (Gas) | Overlord | X | Zealot | MULE (Minerals) | Larva | Y | Probe (Gas) | SCV (Gas) | SCV (Gas) | Z | Probe (Minerals) | SCV (Minerals) | Drone (Gas) | Using the 62 characters to represent all units and buildings is definitely feasible, but it does have some potential pitfalls. Each building can be considered to cost things and create things, and each non-harvester unit can be considered to simply cost things, but where do things like the MULE and Chrono Boost fall in? It is a good start point for a single iteration, however, so I think I will begin to explore this one and post a sample page using this as a template. An example URI for this build would be: http://sc2build.com/#PZZZZ0ZZZ3 That represents a Protoss 9 Pylon / 12 Gateway build order. A Zerg doing a 15 Pool / 16 Hatch would be represented as: http://sc2build.com/#ZZZZZZXZZZZZ3Z0 Here is a working copy of this parsing scheme: http://sc2build.com/id/parse/20100518-1a.php?build=PZZZZ0ZZZ3 To change the build order, use the table above and modify the string at the end. The first character represents the race (P, Z or T) and all characters after correspond to a unit or building as listed in the table. Please note that this is iterative development and is purely a test of resolving the URI into an ordered list of units. This test makes absolutely no attempt to discern if the build order is possible or figure out the timing of the units / buildings being created. The only thing it does, in addition to correlating a character to a unit / building is automatically created 5 harvesters and a base at the very start.