I concluded my research on this topic... sadly, it can't be done.
TL;DR for the curious, don't make maps bigger than 8192 px, a 100x100x81 setup is the biggest I could manage to do.
Point by point.
The biggest of the issues is that the client can't handle an image bigger than 8192px. Because of that, the biggest worldmap I managed to make was 8100x8100, thats 100x100x81.
The second problem, as I already said, is that even if the server could handle a 100x100x500 setup, I have no way to test it because I can't compile a 50000x50000 png image (not even a white flat one), because of that, the biggest map I could manage to make the server load was 10000x10000, but the client would CTD trying to load it. Unless you are ok with a black map on the client side, I wouldn't recommend this.
As a final note, I wasn't able to make the server load this grid worldmap image idea I was talking about, this is what I tried so far (ugly coding):
_defines.fos
#define IMAGE_RELIEF01 ( 0 ) // Global map relief
#define IMAGE_RELIEF02 ( 1 )
#define IMAGE_RELIEF03 ( 2 )
#define IMAGE_RELIEF04 ( 3 )
#define IMAGE_RELIEF05 ( 4 )
#define IMAGE_RELIEF06 ( 5 )
#define IMAGE_RELIEF07 ( 6 )
#define IMAGE_RELIEF08 ( 7 )
#define IMAGE_RELIEF09 ( 8 )
#define IMAGE_RELIEF10 ( 9 )
#define IMAGE_RELIEF11 ( 10 )
#define IMAGE_RELIEF12 ( 11 )
#define IMAGE_RELIEF13 ( 12 )
#define IMAGE_RELIEF14 ( 13 )
#define IMAGE_RELIEF15 ( 14 )
#define IMAGE_RELIEF16 ( 15 )
#define IMAGE_RELIEF17 ( 16 )
#define IMAGE_RELIEF18 ( 17 )
#define IMAGE_RELIEF19 ( 18 )
#define IMAGE_RELIEF20 ( 19 )
#define IMAGE_RELIEF21 ( 20 )
#define IMAGE_RELIEF22 ( 21 )
#define IMAGE_RELIEF23 ( 22 )
#define IMAGE_RELIEF24 ( 23 )
#define IMAGE_RELIEF25 ( 24 )
worldmap.fos
uint GetGlobalMapRelief( uint x, uint y )
{
// Used low four bits of image
// Zero is water
if(y<=10000) // Row 1
{
if(x<=10000)
{
return GetImageColor( IMAGE_RELIEF01, x, y ) & 0xF; // Column 1
}
else if(x<=20000)
{
return GetImageColor( IMAGE_RELIEF02, x, y ) & 0xF; // Column 2
}
else if(x<=30000)
{
return GetImageColor( IMAGE_RELIEF03, x, y ) & 0xF; // Column 3
}
else if(x<=40000)
{
return GetImageColor( IMAGE_RELIEF04, x, y ) & 0xF; // Column 4
}
else
{
return GetImageColor( IMAGE_RELIEF05, x, y ) & 0xF; // Column 5
}
}
else if(y<=20000) // Row 2
{
if(x<=10000)
{
return GetImageColor( IMAGE_RELIEF06, x, y ) & 0xF; // Column 1
}
else if(x<=20000)
{
return GetImageColor( IMAGE_RELIEF07, x, y ) & 0xF; // Column 2
}
else if(x<=30000)
{
return GetImageColor( IMAGE_RELIEF08, x, y ) & 0xF; // Column 3
}
else if(x<=40000)
{
return GetImageColor( IMAGE_RELIEF09, x, y ) & 0xF; // Column 4
}
else
{
return GetImageColor( IMAGE_RELIEF10, x, y ) & 0xF; // Column 5
}
}
else if(y<=30000) // Row 3
{
if(x<=10000)
{
return GetImageColor( IMAGE_RELIEF11, x, y ) & 0xF; // Column 1
}
else if(x<=20000)
{
return GetImageColor( IMAGE_RELIEF12, x, y ) & 0xF; // Column 2
}
else if(x<=30000)
{
return GetImageColor( IMAGE_RELIEF13, x, y ) & 0xF; // Column 3
}
else if(x<=40000)
{
return GetImageColor( IMAGE_RELIEF14, x, y ) & 0xF; // Column 4
}
else
{
return GetImageColor( IMAGE_RELIEF15, x, y ) & 0xF; // Column 5
}
}
else if(y<=40000) // Row 4
{
if(x<=10000)
{
return GetImageColor( IMAGE_RELIEF16, x, y ) & 0xF; // Column 1
}
else if(x<=20000)
{
return GetImageColor( IMAGE_RELIEF17, x, y ) & 0xF; // Column 2
}
else if(x<=30000)
{
return GetImageColor( IMAGE_RELIEF18, x, y ) & 0xF; // Column 3
}
else if(x<=40000)
{
return GetImageColor( IMAGE_RELIEF19, x, y ) & 0xF; // Column 4
}
else
{
return GetImageColor( IMAGE_RELIEF20, x, y ) & 0xF; // Column 5
}
}
else // Row 5
{
if(x<=10000)
{
return GetImageColor( IMAGE_RELIEF21, x, y ) & 0xF; // Column 1
}
else if(x<=20000)
{
return GetImageColor( IMAGE_RELIEF22, x, y ) & 0xF; // Column 2
}
else if(x<=30000)
{
return GetImageColor( IMAGE_RELIEF23, x, y ) & 0xF; // Column 3
}
else if(x<=40000)
{
return GetImageColor( IMAGE_RELIEF24, x, y ) & 0xF; // Column 4
}
else
{
return GetImageColor( IMAGE_RELIEF25, x, y ) & 0xF; // Column 5
}
}
}
.
.
.
.
.
.
.
void WorldmapInit()
{
LoadImage( IMAGE_RELIEF01, "BIGASM01.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF02, "BIGASM02.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF03, "BIGASM03.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF04, "BIGASM04.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF05, "BIGASM05.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF06, "BIGASM06.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF07, "BIGASM07.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF08, "BIGASM08.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF09, "BIGASM09.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF10, "BIGASM10.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF11, "BIGASM11.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF12, "BIGASM12.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF13, "BIGASM13.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF14, "BIGASM14.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF15, "BIGASM15.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF16, "BIGASM16.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF17, "BIGASM17.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF18, "BIGASM18.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF19, "BIGASM19.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF20, "BIGASM20.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF21, "BIGASM21.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF22, "BIGASM22.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF23, "BIGASM23.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF24, "BIGASM24.png", 1, PT_SERVER_MAPS );
LoadImage( IMAGE_RELIEF25, "BIGASM25.png", 1, PT_SERVER_MAPS );
for(uint i = 0, j = Worldmap.length(); i < j; i++)
@Worldmap[i] = CZone(i % ZONE_COUNT_X, i / ZONE_COUNT_X);
// Groups be here
LoadWorldmapGroups("maps/groups.fowm");
Log("Encounter groups loaded.");
RecolorLocations();
Log("Locations Colored.");
LoadWorldmapTables("maps/worldmap.focwm");
Log("Worldmap loaded.");
//LoadGroupsQuantities();
}
config.fos
__GlobalMapWidth = 100; // Maximum 100
__GlobalMapHeight = 100; // Maximum 100
__GlobalMapZoneLength = 500; // Maximum 500
worldmap_h.fos
#define ZONE_COUNT_X (100)
#define ZONE_COUNT_Y (100)
#define ZONE_LENGTH (500)
The result was the server loading only the first image, so the player only was able to move inside a 10000x10000 worldmap (black clientside of course).
I'm dropping any further effort on this, since the client can't handle large image setups (not even sliced little images), I don't think it's worth the trouble.