Jump to content
V3ct0r

The World Map (Ascaron, Magic Sea, Deep Blue continents on the same map)

Recommended Posts

The World Map (Ascaron, Magic Sea, Deep Blue continents on the same map)

 

screenshot.jpg

 

 

A single map file containing Ascaron, Magic Sea, Deep Blue continents as well as all associated islands.


How to install the map


Client:
1) Put the files world.map, world.obj, world.rbo from the "Client\map" folder from the attached .zip into corresponding folder of your game client;
2) Put the minimap file "Client\texture\minimap\world\world.pk" from the attached .zip into corresponding folder of your game client;
3) Add the following line into the mapinfo.txt file ("Client\scripts\table"):

XX    world    World    1    2202,2782        255,255,255

Where XX – the latest unused ID.

4) Compile mapinfo.bin.


Server:
1) Put the "GameServer\resource\world" folder from the attached .zip into "GameServer\resource" folder of your server files;
2) Add the following line into the file "GameServer\resource\script\MisScript\ScriptDefine.lua"

AddMap("world", "World")

3) Add the map into GameServer.cfg for startup:

map = world

 

 

Some useful coordinates


Main cities:

Argent City      2145, 3410 (&move 2145, 3410, world)
Shaitan City     3085, 3250 (&move 3085, 3250, world)
Icicle Castle    1015,  500 (&move 1015, 500, world)
Thundoria Castle  650, 2080 (&move 650, 2080, world)


Islands:

Summer Island   3455, 1755 (&move 3455, 1755, world)
Spring Island   3506,  797 (&move 3506, 797, world)
Autumn Island   2915, 1460 (&move 2915, 1460, world)
Isle of Fortune 1600, 1320 (&move 1600, 1320, world)
Zephyr Isle     1405, 2405 (&move 1405, 2405, world)
Cupid Isle      2055, 2490 (&move 2055, 2490, world)
Canary Isle     3900, 3450 (&move 3900, 3450, world)
Isle of Chill   3050, 2280 (&move 3050, 2280, world)
Glacier Isle    2240, 1940 (&move 2240, 1940, world)
Isle of Ruin    2720, 3670 (&move 2720, 3670, world)
Arena Isle      1225, 2765 (&move 1225, 2765, world)

 


Practical application peculiarities


1) The map was not thought over in terms of design and was projected "by eye" to fit the main continents and islands in an area of 4096 x 4096. So, for example, the geographical and climatic features were not taken into account: the "summer" islands are located next to the snow-covered continent, and the "winter" ones are next to the deserted. The purpose of creating this map was to demonstrate the possibility of such developments;

2) The map is completely blank. This means that you need to add to it: birth points for player characters, NPCs, respawn points for monsters, resources, portals, docks, weather regions, and the like;

3) Since there will be many objects on one map, including the player characters, it is not known how GameServer.exe will work in terms of performance and whether it will have enough memory. Probably, the three main continents were divided by the game developers into different maps precisely for reasons of performance and resource allocation. However, you can try adjusting the following parameters from GameServer.cfg:

[Entity]
max_ply = 3000
max_cha = 15000                
max_item = 30000        
max_tnpc = 300

4) The server side files world.atr and world.blk were obtained using the YAMMI program. When converting the .map file to .atr and .blk, a warning was received that this function is experimental and, when using these files on the server side, unexpected problems may occur. If such problems do arise, and if necessary, the development of our own converter .map -> .atr and .map -> .blk is considered;

5) Generating a minimap takes about 4 hours, and the resulting .pk file weighs 849 Megabytes (the size of a whole client!). This is due to the fact that each chunk of the minimap has a resolution of 256 x 256 and is saved in the .bmp format, as well as due to the larger number of chunks than on any other map ("empty" fragments with the sea are not saved to the .pk file).  At the same time, chunks, for example, from the garner minimap have dimensions of only 64 x 64. Therefore, in theory, you can significantly reduce the size of the world.pk file by patching Game.exe and making it generate 64 x 64 chunks. It is also worth noting that PK Viewer does not work with such large .pk files;

6) Map files are large: world.map (86,4 MB), world.obj (22,3 MB), world.atr (48,0 MB), world.blk (8,00 MB).

 

 

How this map was created

 

This map was made using the Map glue and cut tool with the following program:

#include <iostream>
#include "Map.h"

// Entry point
int main(int argc, char* argv[])
{
    // Path to directory with maps
    const std::string base{ "C:\\pkodev\\map" };

    // Print a welcome message
    std::cout << "Map cut & glue tool by V3ct0r from PKODev.NET" << std::endl;
    std::cout << std::endl;

    try
    {
        // Write a message
        std::cout << "Building world map, it can take a time . . ." << std::endl;

        // Main maps
        pkodev::MapWrapper garner, magicsea, darkblue;

        // Load main maps
        garner.load(base + "\\garner");
        magicsea.load(base + "\\magicsea");
        darkblue.load(base + "\\darkblue");

        // Main continents
        pkodev::MapWrapper argent, shaitan, icicle;

        // Cut main continents from main maps
        argent  =   garner.cut( { 168, 980  }, { 2364, 3272 } );
        shaitan = magicsea.cut( { 522, 2816 }, { 1880, 3900 } );
        icicle  = darkblue.cut( { 386, 178  }, { 3248, 1076 } );

        // Some islands
        pkodev::MapWrapper autsumspr, fortune, cupid,
            arena, bridge, chill, glacier, zephyr;

        // Cut islands from main maps
        autsumspr = darkblue.cut( { 2088, 2371 }, { 4000, 3660 } ); // Autumn island + Summer island + Spring island
        fortune   = darkblue.cut( { 1414, 1681 }, { 1771, 2024 } ); // Isle of Fortune
        cupid     = magicsea.cut( { 2368, 2330 }, { 2675, 2608 } ); // Cupid isle
        arena     = darkblue.cut( { 372, 3376  }, { 518, 3498  } ); // Arena isle
        bridge    = darkblue.cut( { 762, 3344  }, { 964, 3524  } ); // Unknown isle nearly arena isle
        chill     = magicsea.cut( { 2274, 370  }, { 2554, 782  } ); // Isle of Chill
        glacier   =   garner.cut( { 2134, 1069 }, { 2325, 1222 } ); // Glacier isle
        zephyr    =   garner.cut ({ 3200, 3045 }, { 3610, 3390 } ); // Zephyr isle

        // Use Ascaron map as base map
        garner.del( { 0, 112 }, { 4095, 4000 } );

        // Free main maps
        magicsea.clear();
        darkblue.clear();

        // Add main continents + Autumn/Summer/Spring islands to the base map
        garner.glue( { 80, 1600   }, argent);    argent.clear();
        garner.glue( { 2700, 2500 }, shaitan);   shaitan.clear();
        garner.glue( { 2200, 600  }, autsumspr); autsumspr.clear();
        garner.glue( { 80, 160    }, icicle);    icicle.clear();
           
        // Remove some garbage from the map
        garner.del( { 1119,1872  }, { 2372,2987  });
        garner.del( { 1265, 1660 }, { 1770, 1980 });
        garner.del( { 2621, 1765 }, { 2945, 1935 });
        garner.del( { 2016, 1810 }, { 2115, 1875 });
        garner.del( { 3912, 2623 }, { 4095, 3050 });
        garner.del( { 1082, 1980 }, { 1124, 2024 });
        garner.del( { 1125, 1819 }, { 1246, 1864 });
        garner.del( { 2239, 3000 }, { 2289, 3036 });
        garner.del( { 2948, 600  }, { 2970, 648  });
        garner.del( { 245, 588   }, { 282, 620   });
        garner.del( { 324, 680   }, { 390, 906   });
        garner.del( { 2768, 3442 }, { 2882, 3480 });
        garner.del( { 2935, 3428 }, { 2965, 3460 });
        garner.del( { 3096, 3404 }, { 3226, 3447 });
        garner.del( { 2240, 3572 }, { 2279, 3605 });
        garner.del( { 3383, 3327 }, { 3603, 3459 });
        garner.del( { 3743, 3204 }, { 3864, 3257 });
        garner.del( { 3880, 3076 }, { 3915, 3105 });
        garner.del( { 4010, 3168 }, { 4036, 3205 });
        garner.del( { 3359, 908  }, { 3607, 1090 });
        garner.del( { 1032, 1944 }, { 1055, 1968 });
        garner.del( { 3254, 1192 }, { 3367, 1299 });
        garner.del( { 3093, 1471 }, { 3153, 1610 });
        garner.del( { 3075, 1679 }, { 3117, 1714 });
        garner.del( { 3783, 671  }, { 3881, 793  });
        garner.del( { 3695, 805  }, { 3727, 836  });
        garner.del( { 2963, 615  }, { 2977, 631  });
        garner.del( { 2040, 1685 }, { 2224, 1850 });

        // Add islands to the map
        garner.glue( { 1388, 1036 }, fortune); fortune.clear();
        garner.glue( { 1900, 2420 }, cupid);   cupid.clear();
        garner.glue( { 1125, 2740 }, arena);   arena.clear();
        garner.glue( { 2944, 1932 }, chill);   chill.clear();
        garner.glue( { 2656, 3632 }, bridge);  bridge.clear();
        garner.glue( { 2096, 1885 }, glacier); glacier.clear();
        garner.glue( { 1348, 2160 }, zephyr);  zephyr.clear();

        // Save new map to file
        garner.save(base + "\\garner");

        // Write a message
        std::cout << "Done!" << std::endl;
    }
    catch (const pkodev::map_file_exception& e)
    {
        std::cout << ".map file error: " << e.what() << std::endl;
        return 1;
    }
    catch (const pkodev::obj_file_exception& e)
    {
        std::cout << ".obj file error: " << e.what() << std::endl;
        return 2;
    }
    catch (...)
    {
        std::cout << "Unknown error!" << std::endl;
        return 3;
    }

    return 0;
}

 

Download The World Map (596,3 MB)

 

If you have any questions or have problems, then feel free to write in this thread.
 

  • Like 2
  • Thanks 1

Share this post


Link to post
Share on other sites
On 12/12/2021 at 2:24 PM, V3ct0r said:

The World Map (Ascaron, Magic Sea, Deep Blue continents on the same map)

 

screenshot.jpg

 

 

A single map file containing Ascaron, Magic Sea, Deep Blue continents as well as all associated islands.


How to install the map


Client:
1) Put the files world.map, world.obj, world.rbo from the "Client\map" folder from the attached .zip into corresponding folder of your game client;
2) Put the minimap file "Client\texture\minimap\world\world.pk" from the attached .zip into corresponding folder of your game client;
3) Add the following line into the mapinfo.txt file ("Client\scripts\table"):


XX    world    World    1    2202,2782        255,255,255

Where XX – the latest unused ID.

4) Compile mapinfo.bin.


Server:
1) Put the "GameServer\resource\world" folder from the attached .zip into "GameServer\resource" folder of your server files;
2) Add the following line into the file "GameServer\resource\script\MisScript\ScriptDefine.lua"


AddMap("world", "World")

3) Add the map into GameServer.cfg for startup:


map = world

 

 

Some useful coordinates


Main cities:


Argent City      2145, 3410 (&move 2145, 3410, world)
Shaitan City     3085, 3250 (&move 3085, 3250, world)
Icicle Castle    1015,  500 (&move 1015, 500, world)
Thundoria Castle  650, 2080 (&move 650, 2080, world)


Islands:


Summer Island   3455, 1755 (&move 3455, 1755, world)
Spring Island   3506,  797 (&move 3506, 797, world)
Autumn Island   2915, 1460 (&move 2915, 1460, world)
Isle of Fortune 1600, 1320 (&move 1600, 1320, world)
Zephyr Isle     1405, 2405 (&move 1405, 2405, world)
Cupid Isle      2055, 2490 (&move 2055, 2490, world)
Canary Isle     3900, 3450 (&move 3900, 3450, world)
Isle of Chill   3050, 2280 (&move 3050, 2280, world)
Glacier Isle    2240, 1940 (&move 2240, 1940, world)
Isle of Ruin    2720, 3670 (&move 2720, 3670, world)
Arena Isle      1225, 2765 (&move 1225, 2765, world)

 


Practical application peculiarities


1) The map was not thought over in terms of design and was projected "by eye" to fit the main continents and islands in an area of 4096 x 4096. So, for example, the geographical and climatic features were not taken into account: the "summer" islands are located next to the snow-covered continent, and the "winter" ones are next to the deserted. The purpose of creating this map was to demonstrate the possibility of such developments;

2) The map is completely blank. This means that you need to add to it: birth points for player characters, NPCs, respawn points for monsters, resources, portals, docks, weather regions, and the like;

3) Since there will be many objects on one map, including the player characters, it is not known how GameServer.exe will work in terms of performance and whether it will have enough memory. Probably, the three main continents were divided by the game developers into different maps precisely for reasons of performance and resource allocation. However, you can try adjusting the following parameters from GameServer.cfg:


[Entity]
max_ply = 3000
max_cha = 15000                
max_item = 30000        
max_tnpc = 300

4) The server side files world.atr and world.blk were obtained using the YAMMI program. When converting the .map file to .atr and .blk, a warning was received that this function is experimental and, when using these files on the server side, unexpected problems may occur. If such problems do arise, and if necessary, the development of our own converter .map -> .atr and .map -> .blk is considered;

5) Generating a minimap takes about 4 hours, and the resulting .pk file weighs 849 Megabytes (the size of a whole client!). This is due to the fact that each chunk of the minimap has a resolution of 256 x 256 and is saved in the .bmp format, as well as due to the larger number of chunks than on any other map ("empty" fragments with the sea are not saved to the .pk file).  At the same time, chunks, for example, from the garner minimap have dimensions of only 64 x 64. Therefore, in theory, you can significantly reduce the size of the world.pk file by patching Game.exe and making it generate 64 x 64 chunks. It is also worth noting that PK Viewer does not work with such large .pk files;

6) Map files are large: world.map (86,4 MB), world.obj (22,3 MB), world.atr (48,0 MB), world.blk (8,00 MB).

 

 

How this map was created

 

This map was made using the Map glue and cut tool with the following program:


#include <iostream>
#include "Map.h"

// Entry point
int main(int argc, char* argv[])
{
    // Path to directory with maps
    const std::string base{ "C:\\pkodev\\map" };

    // Print a welcome message
    std::cout << "Map cut & glue tool by V3ct0r from PKODev.NET" << std::endl;
    std::cout << std::endl;

    try
    {
        // Write a message
        std::cout << "Building world map, it can take a time . . ." << std::endl;

        // Main maps
        pkodev::MapWrapper garner, magicsea, darkblue;

        // Load main maps
        garner.load(base + "\\garner");
        magicsea.load(base + "\\magicsea");
        darkblue.load(base + "\\darkblue");

        // Main continents
        pkodev::MapWrapper argent, shaitan, icicle;

        // Cut main continents from main maps
        argent  =   garner.cut( { 168, 980  }, { 2364, 3272 } );
        shaitan = magicsea.cut( { 522, 2816 }, { 1880, 3900 } );
        icicle  = darkblue.cut( { 386, 178  }, { 3248, 1076 } );

        // Some islands
        pkodev::MapWrapper autsumspr, fortune, cupid,
            arena, bridge, chill, glacier, zephyr;

        // Cut islands from main maps
        autsumspr = darkblue.cut( { 2088, 2371 }, { 4000, 3660 } ); // Autumn island + Summer island + Spring island
        fortune   = darkblue.cut( { 1414, 1681 }, { 1771, 2024 } ); // Isle of Fortune
        cupid     = magicsea.cut( { 2368, 2330 }, { 2675, 2608 } ); // Cupid isle
        arena     = darkblue.cut( { 372, 3376  }, { 518, 3498  } ); // Arena isle
        bridge    = darkblue.cut( { 762, 3344  }, { 964, 3524  } ); // Unknown isle nearly arena isle
        chill     = magicsea.cut( { 2274, 370  }, { 2554, 782  } ); // Isle of Chill
        glacier   =   garner.cut( { 2134, 1069 }, { 2325, 1222 } ); // Glacier isle
        zephyr    =   garner.cut ({ 3200, 3045 }, { 3610, 3390 } ); // Zephyr isle

        // Use Ascaron map as base map
        garner.del( { 0, 112 }, { 4095, 4000 } );

        // Free main maps
        magicsea.clear();
        darkblue.clear();

        // Add main continents + Autumn/Summer/Spring islands to the base map
        garner.glue( { 80, 1600   }, argent);    argent.clear();
        garner.glue( { 2700, 2500 }, shaitan);   shaitan.clear();
        garner.glue( { 2200, 600  }, autsumspr); autsumspr.clear();
        garner.glue( { 80, 160    }, icicle);    icicle.clear();
           
        // Remove some garbage from the map
        garner.del( { 1119,1872  }, { 2372,2987  });
        garner.del( { 1265, 1660 }, { 1770, 1980 });
        garner.del( { 2621, 1765 }, { 2945, 1935 });
        garner.del( { 2016, 1810 }, { 2115, 1875 });
        garner.del( { 3912, 2623 }, { 4095, 3050 });
        garner.del( { 1082, 1980 }, { 1124, 2024 });
        garner.del( { 1125, 1819 }, { 1246, 1864 });
        garner.del( { 2239, 3000 }, { 2289, 3036 });
        garner.del( { 2948, 600  }, { 2970, 648  });
        garner.del( { 245, 588   }, { 282, 620   });
        garner.del( { 324, 680   }, { 390, 906   });
        garner.del( { 2768, 3442 }, { 2882, 3480 });
        garner.del( { 2935, 3428 }, { 2965, 3460 });
        garner.del( { 3096, 3404 }, { 3226, 3447 });
        garner.del( { 2240, 3572 }, { 2279, 3605 });
        garner.del( { 3383, 3327 }, { 3603, 3459 });
        garner.del( { 3743, 3204 }, { 3864, 3257 });
        garner.del( { 3880, 3076 }, { 3915, 3105 });
        garner.del( { 4010, 3168 }, { 4036, 3205 });
        garner.del( { 3359, 908  }, { 3607, 1090 });
        garner.del( { 1032, 1944 }, { 1055, 1968 });
        garner.del( { 3254, 1192 }, { 3367, 1299 });
        garner.del( { 3093, 1471 }, { 3153, 1610 });
        garner.del( { 3075, 1679 }, { 3117, 1714 });
        garner.del( { 3783, 671  }, { 3881, 793  });
        garner.del( { 3695, 805  }, { 3727, 836  });
        garner.del( { 2963, 615  }, { 2977, 631  });
        garner.del( { 2040, 1685 }, { 2224, 1850 });

        // Add islands to the map
        garner.glue( { 1388, 1036 }, fortune); fortune.clear();
        garner.glue( { 1900, 2420 }, cupid);   cupid.clear();
        garner.glue( { 1125, 2740 }, arena);   arena.clear();
        garner.glue( { 2944, 1932 }, chill);   chill.clear();
        garner.glue( { 2656, 3632 }, bridge);  bridge.clear();
        garner.glue( { 2096, 1885 }, glacier); glacier.clear();
        garner.glue( { 1348, 2160 }, zephyr);  zephyr.clear();

        // Save new map to file
        garner.save(base + "\\garner");

        // Write a message
        std::cout << "Done!" << std::endl;
    }
    catch (const pkodev::map_file_exception& e)
    {
        std::cout << ".map file error: " << e.what() << std::endl;
        return 1;
    }
    catch (const pkodev::obj_file_exception& e)
    {
        std::cout << ".obj file error: " << e.what() << std::endl;
        return 2;
    }
    catch (...)
    {
        std::cout << "Unknown error!" << std::endl;
        return 3;
    }

    return 0;
}

 

Download The World Map (596,3 MB)

 

If you have any questions or have problems, then feel free to write in this thread.
 

hey @V3ct0r wouldn't you have a performance problem due to the limitation of the gamerserver being 32 bit by having all the players in a single map?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...