Add a new map: Data capture
- 1 Requirements
- 2 Data Capture
- 3 How to Capture Roads and Railways
- 4 How to build Highways and Railway_Waypoints tables?
- 5 How to capture Bridges table
- 6 How to capture Industrial Installations table?
- 7 How to capture Tile Map Codes table?
- 8 How to capture Airbases table?
- 9 Army_Units table
- 10 Sector_Seasons table
- 11 Resupply Points table
- 12 Railway Stations table
- 13 Build the Highways and Railways Intersections tables
- 14 Airbases Layouts table
- A local php-enabled web server & a MySQL database server (such as installed jointly by Wamp Server).
- A good graphics program such as Photoshop or Paint Shop Pro. This is needed to create the final map images and trim them to size. Multi-layer capability is a must in my books.
- A text editor program that can edit PHP files and understands the format. (PSPad or ConTEXT or EditPlus).
- A spreadsheet application such as Microsoft Excel or Open Office Calc.
- SEOW_Routes_Tool_v1.2.xls Excel spreadsheet for transforming Roads, Railways and Bridges of *.mis file data to SEOW database format.
This is the "Toolkit" that lets you create maps but it also means you have your own functional SEOW system to run campaigns.
There are two main lines of effort involved in adding a map to SEOW. The first is the data capture effort for the database, and the second is the map-making effort for the MP.
The following data needs to be captured from the FMB:
- Roads and Railways (all of them!)
- Bridges (defined by Road and Railway data)
- Industrial Installations (factories and fuel dumps)
- Tile Map Codes (from the Destruction Viewer in FMB)
- Railway Stations
- Route Blockages (Railways and Roads)
Additionally, the following data defaults need to be added for the new Sector in the respective database tables:
- Army divisions in Army_Units
- Climatic settings in Sector_Climate
- Opposing forces in Sector_Dominance
- Movement cost parameters in Sector_Movement_Cost
- Recon effect parameters in Sector_Recon_Parameters
- FMB map strings and seasonal changes in Sector_Seasons
- Resupply locations in Resupply_Points
Finally, you ought to associate some of the available Airforce_Units with your new sector. Note that you cannot just make up Airforce Unit names (as you can for Army Units). This is because all Airforce Unit names are hard-coded in IL-2 so you are stuck with what is defined in the Airforce_Units table. IL-2 doesn’t even consider platoon/flotilla naming for ground/sea forces, so we are free to do that ourselves in SEOW. When you start a campaign in SEOW, you will have access to all flights for the air regiments used in your template file PLUS all flights for air regiments indicated as defaults for the sector by any entries in the Airforce_Units table.
How to Capture Roads and Railways
This is brute force work, especially for large European maps. Pacific/Asian maps have much smaller road networks.
- Open the map and set the SNAP value to 100 (meters) in the FMB
- Place a separate moving vehicle to drive along every stretch of road between each pair of intersections. In some maps this might give you several hundred moving vehicles as you cover all possible road routes between intersections.
- Do the same for trains. Sometimes it is very hard to get trains to stick on the map. Only 2 way points can be used for trains: Sometimes, 2 separate trains could be necessary between 2 intersections.
- Save the FMB file.
- Choose a different color vehicle for main and secondary roads. This will be useful for recognize wooden or metal bridges: secondary roads have always wooden bridges and main roads have metal bridges.
- Short roads and crossroads: Sometimes when roads are too short it is necessary to add some manual way points (every road route needs at least 3 waypoints):
How to build Highways and Railway_Waypoints tables?
- Edit the mis file with a text editor as NotePad, only keep the following data:
13100.00 39800.00 120.00 0 14 3.055555582046509 13100.00 39100.00 20.00 13100.00 37700.00 20.00 13300.00 37500.00 20.00 13300.00 36300.00 20.00 14100.00 35500.00 20.00 14100.00 33300.00 20.00 14900.00 32500.00 20.00 14900.00 31500.00 20.00 15900.00 30500.00 20.00 15900.00 30100.00 20.00 16300.00 29700.00 20.00 16300.00 29300.00 20.00 16300.00 28900.00 120.00
24500.00 12600.00 120.00 0 19 3.055555582046509 24500.00 12900.00 20.00 24300.00 13100.00 20.00 24300.00 15100.00 20.00 23700.00 15700.00 20.00 23700.00 15900.00 120.00 23700.00 16300.00 20.00 23700.00 16700.00 20.00 23700.00 16900.00 -4.00 23700.00 17300.00 -4.00 23700.00 17500.00 20.00 23700.00 17700.00 20.00 23100.00 18300.00 20.00 22900.00 18300.00 20.00 22500.00 18700.00 20.00 22300.00 18700.00 20.00 22100.00 18900.00 20.00 22100.00 19100.00 20.00 21900.00 19300.00 120.00
Each record has 3 values, the "highway node" (X,Y,Z) coordinates. By IL-2 convention, all road and rail nodes lie on a regular grid with coordinates of multiples of 100.0 m (usually odd multiples). In the examples above, the first and last records for each Chief are where you click the vehicle waypoint (Z=120.00), while the other records are generated by FMB to following the internal highway node locations (Z=20.00). When using SNAP = 100 (meters), data are quite ready to be used in the SEOW tables. If not, the manual WP would be e.g. 21925.88 instead of 21900.00.
We want to capture the complete list for each Chief with exact coordinates. Each of these Chief highway routes should be assigned a unique "Route" number and then entered into the Highways table of the database. Every route on every sector in SEOW has its OWN Route number.
- Open SEOW_Routes_Tool_v1.2.xls: Excel spreadsheet for transforming the *.mis file data to SEOW database format.
- Copy the [xx_Chief_Road] data in the SEOW_Routes_Tool_v1.2.xls as explained therein. Then, hit the "Roads & Railways" button and copy the result in a new Excel file. Add a sector name column (e.g Burma).
- Save this file as Highways.csv (e.g. DOS format). Do the same for Railways.csv.
- Keep the SEOW_Routes_Tool_v1.2.xls open, it will be use for Bridges (see below).
- As an example, after using SEOW_Routes_Tool_v1.2, if we say Chief2 above represents Route 123456 in the Sector "Burma", then we would add it to the Highways table as
Route X_Axis Y_Axis Orientation Waypoint_Number Map
123456 24500.00 12700.00 20.00 1 "Burma"
123456 24500.00 12900.00 20.00 2 "Burma"
123456 24300.00 13100.00 20.00 3 "Burma"
123456 24300.00 15100.00 20.00 4 "Burma"
123456 23700.00 15700.00 20.00 5 "Burma"
123456 23700.00 15900.00 20.00 6 "Burma"
123456 23700.00 16300.00 20.00 7 "Burma"
123456 23700.00 16700.00 20.00 8 "Burma"
123456 23700.00 16900.00 -4.00 9 "Burma"
123456 23700.00 17300.00 -4.00 10 "Burma"
123456 23700.00 17500.00 20.00 11 "Burma"
123456 23700.00 17700.00 20.00 12 "Burma"
123456 23100.00 18300.00 20.00 13 "Burma"
123456 22900.00 18300.00 20.00 14 "Burma"
123456 22500.00 18700.00 20.00 15 "Burma"
123456 22300.00 18700.00 20.00 16 "Burma"
123456 22100.00 18900.00 20.00 17 "Burma"
123456 22100.00 19100.00 20.00 18 "Burma"
123456 21900.00 19300.00 20.00 19 "Burma"
The idea is that every route overlaps at its start and end points with other routes. The same process goes for trains for the Railway_Waypoints table. Do not bother about updating the Highway_Intersections table - that is created by running a pre-defined query in the MySQL database.
- You may also find places on your map where the road route or the railway route is broken. For roads you can sometimes plot out your own path around this map problem, but for trains you usually cannot. The database table Route_Blockages allows you to define blockage markers for your sector, if required. These will show on your sector in the MP as black circles with a white X in them, indicating that there is no route through here.
How to capture Bridges table
Bridges are denoted in the roads and railways data by instances where Z < 0. In the example above we have the two lines Code:
23700.00 16900.00 -4.00 23700.00 17300.00 -4.00
The two lines give the start and end coordinates of the bridge. The Z value is converted into the Bridge ID number by BridgeID = -Z-1. So for our example, BridgeID = -(-4)-1 = 4-1 = 3, i.e. Bridge 3. The length of the bridge is given by Code:
length = SQRT((X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2))
In our example we see that Bridge 3 has length 400 m.
- Use the previous SEOW_Routes_Tool_v1.2.xls for bridges data.
- Copy data in the Bridges_Table_Builder_v2 Tool and run Bridges Calculation:
- Then, build the Bridge table. The Damage_Name is given by the BridgeID according to the corresponding entry in Bridge_Codes table and must be a text field:
How to capture Industrial Installations table?
As a rule of thumb, we usually consider any factory building with 3 or more chimneys as a valid major factory installation, and any fuel dump with 6 or more fuel tanks as a valid fuel facility, but as map builder you can make your own convention about what deserves to be an installation in your map. In FMB, locate all such facilities on the map and place a stationary object INSIDE the fuel tank or factory. Save the FMB file and find the X,Y,Z coordinates of the stationaries and use them to build new records for the Industrial_Installations table. In that table you can ignore the Sm_x,Sm_y,Sm_z,Sm_h,Destruction_Code,Event_Date and Production_Points fields, but the other fields are all necessary. Every factory and fuel dump should have its own unique name. Stick to the naming conventions already in the table.
An easy way to capture Industrial Installations is to use actors.static when we have it: Extract it (see Modify a map mod for SEOW online), open outBuildings.txt and you keep only House$IndustrialFactoryConstruction1 (factory with 3 chimneys) and House$IndustrialFactoryTank1 (fuel dump).
How to capture Tile Map Codes table?
This is really easy and fun. Open the map in FMB, select the Destruction tool, choose Destruction level Maximum, choose maximum Cursor width, click on the map, press "f" and move the mouse. You will paint all destroyable map tiles (green squares) over the whole map bright red. Save the FMB file. Open it up and you will see many lines of weird codes at the end of the file. You need to capture these with the new sector name into the Tile_Map_Codes table. No X,Y,Z coords needed as this information is already encoded into the tile codes.
How to capture Airbases table?
The idea here is to use FMB to capture landing and takeoff points for each airbase. By convention we land at the western end and takeoff at the eastern end where possible. The X,Z coords need to be entered into the Airbases table. Also identify what type of layout each airbase has (by reference to the SEOW Airbase Layouts PDF available from the download site). In some cases a new airbase is encountered, so a new Airbase Layout must be built. (see below).
Now for the data defaults. Most of these can be done simply by copying data from other sector records in the tables, but some care must be given to Army_Units, Sector_Seasons and Resupply_Points.
This is where you specify the names of the Allied and Axis army divisions that will be used to name platoons in the template. The Division Names are arbitrary, but the remainder of the fields must remain in standard format. Make sure you give at least 2 or 3 divisions of each type "V","T","A" and "E" to each side. You can have the same Division_Name in different sectors if you like.
This table contains information about whether the sector uses the same FMB map all year around, or swaps between summer and winter forms, e.g. Moscow has a green summer map and a white winter map. This swapping is specified in SEOW by putting the respective map loader strings in the "Summer_Map" and "Winter_Map" fields. For Moscow the two map loader strings are Code: Summer: Moscow/sload.ini Winter: Moscow/load.ini
These map loader strings are found in FMB files near the top. Sector_Seasons also contains the dates on which Summer switches to Winter, and Winter to Summer. These dates are written as numbers in MMDDhhmm format, so "04010000" means "1 April at 00:00 hours". Map summer/winter dawn and dusk times are given to regulate the use of airfield lighting throughout the year, and also to feed into the reconnaissance calculations. To help you identify which FMB maps SEOW uses for different sectors, take a look at the "Maps" link in the horizontal toolbar of the MP front page.
Resupply Points table
Again, some air, ground, rail and sea resupply points should be added to the Resupply_Points table, where appropriate. The Supply_Point field is just an arbitrary name, but all other fields must be entered strictly in format. The Point_Z field for air supply points indicates the spawn altitude of aircraft using the point. For railway supply points, the Z field indicates the direction of the railway line at the supply point location. To get this information you must place a stationary object at the location in FMB and align it with the railway line, pointing into the map rather than exiting the map. The Z field for this object inside the .mis file is the value you need to use in the corresponding railway supply point definition in Resupply_Points table. For road and ship supply points, the Z field in the Resupply_Points table is ignored.
Railway Stations table
For each Railway Station, you have to capture: 1st end of the station (Platform_Start_X, Platform_Start_Y), 2nd end (Platform_Finish_X, Platform_Finish_Y) and the target point (Target_X, Target_Y) Target is generally a building representing the station.
The Station_Type is a number: 5 (for large platform) or 1 (for simple station).
Build the Highways and Railways Intersections tables
When the Highways and Railway_Waypoints Table are done, run these SQL requests:
- 1. Highways:
- To rebuild Highway_Intersections:
drop table if exists Highway_Intersections; CREATE TABLE `Highway_Intersections` ( `Map` varchar(50) default NULL, `Intersection_X_Axis` int(11) default NULL, `Intersection_Y_Axis` int(11) default NULL, `Route` int(11) default NULL, `Waypoint_Number` int(11) default NULL ) TYPE=InnoDB; INSERT INTO Highway_Intersections SELECT DISTINCT * FROM (SELECT Map, X_Axis as Intersection_X_Axis, Y_Axis AS Intersection_Y_Axis, Route, Waypoint_Number FROM Highways, (SELECT Map AS Junction_Map, X_Axis AS Junction_X_Axis, Y_Axis AS Junction_Y_Axis, COUNT(Route) AS Exits FROM Highways GROUP BY CONCAT(Map,'^',X_Axis,'^',Y_Axis) HAVING COUNT(Route)>1) AS Junctions WHERE Map=Junctions.Junction_Map AND X_Axis=Junctions.Junction_X_Axis AND Y_Axis=Junction_Y_Axis ORDER BY X_Axis, Y_Axis, Route) AS Table_With_Dups;
Then check all bad intersections when WPMAX=n and 1< WP-intersection <n:
SELECT HMMap AS Map, HMRoute AS Route, HM.MaxWP AS RouteMaxWP, HI.Waypoint_Number AS IntersectionWP FROM (SELECT Map AS HIMap, Route as HIRoute, Waypoint_Number FROM Highway_Intersections WHERE Waypoint_Number>1 ORDER BY Map,Route) AS HI, (SELECT Map AS HMMap, Route AS HMRoute, Max(Waypoint_Number) AS MaxWP FROM Highways GROUP BY Map, Route ORDER BY Map,Route) AS HM WHERE HI.HIMap=HM.HMMap AND HI.HIRoute = HM.HMRoute AND HI.Waypoint_Number<>HM.MaxWP;
- 2. Railways:
- To rebuild Railway_Intersections:
drop table if exists Railway_Intersections; CREATE TABLE `Railway_Intersections` ( `Map` varchar(50) default NULL, `Intersection_X_Axis` int(11) default NULL, `Intersection_Y_Axis` int(11) default NULL, `Route` int(11) default NULL, `Waypoint_Number` int(11) default NULL ) TYPE=InnoDB; INSERT INTO Railway_Intersections SELECT DISTINCT * FROM (SELECT Map, X_Axis as Intersection_X_Axis, Y_Axis AS Intersection_Y_Axis, Route, Waypoint_Number FROM Railway_Waypoints, (SELECT Map AS Junction_Map, X_Axis AS Junction_X_Axis, Y_Axis AS Junction_Y_Axis, COUNT(Route) AS Exits FROM Railway_Waypoints GROUP BY CONCAT(Map,'^',X_Axis,'^',Y_Axis) HAVING COUNT(Route)>1) AS Junctions WHERE Map=Junctions.Junction_Map AND X_Axis=Junctions.Junction_X_Axis AND Y_Axis=Junction_Y_Axis ORDER BY X_Axis, Y_Axis, Route) AS Table_With_Dups;
Then check all bad intersections when WPMAX=n and 1< WP-intersection <n:
SELECT HMMap AS Map, HMRoute AS Route, HM.MaxWP AS RouteMaxWP, HI.Waypoint_Number AS IntersectionWP FROM (SELECT Map AS HIMap, Route as HIRoute, Waypoint_Number FROM Railway_Intersections WHERE Waypoint_Number>1 ORDER BY Map,Route) AS HI, (SELECT Map AS HMMap, Route AS HMRoute, Max(Waypoint_Number) AS MaxWP FROM Railway_Waypoints GROUP BY Map, Route ORDER BY Map,Route) AS HM WHERE HI.HIMap=HM.HMMap AND HI.HIRoute = HM.HMRoute AND HI.Waypoint_Number<>HM.MaxWP;
Airbases Layouts table
Airbases Layouts are built for the right location of the airbase objects: Free berths for static planes (ACHS), runway lights (CF or RL), balloons (BALLOON), searchlights (SL), flags (FLAG), airbase fuel reserves (e.g. AB_Fuel1_120), AAA emplacements (AAA).
Choose an available airbase layout type: See this page SE Airbase Layouts
Here is an example:
- Copy data in the Airbase_Layout Builder_v1.2 Tool and run Airbase_Layouts Calculation:
When the sector database and MP will be done, you will have to run a "night checking mission": This will check that all your airbase layouts are correct: Initialize a template (night time, e.g. 02:00) with airplanes available in all airbases. Then, order a mission for 1 plane from each airbase (Only 6 WP are needed). In SEDCS activate all environmental options: 100% idle aircraft parked, 100% of runway lights, balloons and searchlights at all airfields. (Some planes will stay on the free berths for checking your ACHS data). Download the mission and check each airbase in the FMB: lights, balloons, searchlights, static planes ....
OK, that is about it for data capture. Airbases and roads are usually the hardest parts. Next, we will talk about the MP mapping side of things: Add a new map: Maps and php
(from 4Shades , Hawk_5, Goanna, Dore) 2012/12/17