thx to jiaqiang (sheesh, translation by me + more details explaination by me (flaming me not allowed + i bet jiaqiang, torune and kcinick would kill me.. lol) Razz)
【share】my geodata knowledge as of now, ppl with ability have fun with it
thanks to ajia, hope that ppl will not be troubled by geodata problems again and concentrate on development new stuff
speaking of geodata, i said before that geodata are the same, i believe torune and ajia understands the meaning of that no matter if it's 384k or a few MB, they are all the same (dig: again... this is wrong = = sheesh stabs jiaqiang, 384k geodata plainly only stores the information of terrain and seriously lack of detailed information of other related layers)
i'll explain the rules of geodata below:
firstly hex code reading rules - from left to right, top to bottom, high to low priniciple (dig: actually this is wrong Mad what is read should appear as y axis followed by x axis, shrugs... continue with translation)
client side has a coordinate rule
client's smallest /loc geodata height difference is 8
also in grayscale bmp geodata, the height we place in it is actually a multiple of 8.
this fixes the 255 byte representation problem on our geodata.
torune doesnt discover this problem when creating geodata, u could fix it by yourself
(dig: O_o, seriously i dunno what he's trying to say... isnt this something everybody knows? (at least to those doing bmp->geodata, this is the basics), oh alright , i'll try not to sidetrack Mad)
everybody should know 00 00 header and 00 00 aa bb xx yy base geodata template, i've said before xx yy isnt read and aa bb is the real height
how to calculate these heights, i will not be going into, for those who doesnt understand read bfwd's post
when we use 00 00 header to write geodata, we'll face a problem
cause 00 00 header represents 1 area, and that 1 area can only have 1 height.
for example, if this area needs 2 heights or more, the 00 00 header will not be able to accomplish what is needed.
therefore we'll need to introduce new header coding format.
and that new header is 40 00 or 40+ headers (e.g. 41 00 / 42 00 / 4x 00)
*40 (hex) is 64 (decimal)
in 40 00 header, this area could have up to 64 heights
the whole 40 00 header area and 00 00 header area has the same size
inside 40 00 header, it follows the same rule of left to right, top to bottom rule, 8 byte together forms 8*8 = 64 and the format of writing must match the multiple of 8 rule.
concept of what is above:
example in a area, we can use the knowledge above and know that within a header area, the max height in it is only 64.
and what about the height above that area? this is where it is used.
for example 41 00 header
inside this header has 65 heights, it's format is 41 00 01 00 xx yy .... 02 00 xx yy aa bb
that 02 represents 2 heights, xx yy as the top height and aa bb as bottom height.
style of writing is the same as 40 00 header, later we'll talk about height detail calculations
level connection concept:
level to level height difference is max at 24
for example at 2 location, 1 location height is -3000 -5000
other location height is -3024 -5000
this means the level is connected
if another location height is -3036 -5000
that means, u could walk from -3000 to -3036
but walking from -3036 to -3000 is impossible
u'll drop to -5000, this is a problem that torune used to face
environment variable concept: (dig: or our so called geodata wall bit)
40 00 header including 40+ headers
(dig: this is from kcinick, hope he doesnt kill me for releasing this, but jiaqiang has already given it.. so i guess it's alright :X)
0000 = 0 = EAST -> WEST [WALL] WEST -> EAST [WALL] NORTH -> SOUTH [WALL] SOUTH -> NORTH [WALL]
0001 = 1 = EAST -> WEST [WALL] WEST -> EAST [OK] NORTH -> SOUTH [WALL] SOUTH -> NORTH [WALL]
0010 = 2 = EAST -> WEST [OK] WEST -> EAST [WALL] NORTH -> SOUTH [WALL] SOUTH -> NORTH [WALL]
0011 = 3 = EAST -> WEST [OK] WEST -> EAST [OK] NORTH -> SOUTH [WALL] SOUTH -> NORTH [WALL]
0100 = 4 = EAST -> WEST [WALL] WEST -> EAST [WALL] NORTH -> SOUTH [WALL] SOUTH -> NORTH [OK]
0101 = 5 = EAST -> WEST [WALL] WEST -> EAST [OK] NORTH -> SOUTH [WALL] SOUTH -> NORTH [OK]
0110 = 6 = EAST -> WEST [OK] WEST -> EAST [WALL] NORTH -> SOUTH [WALL] SOUTH -> NORTH [OK]
0111 = 7 = EAST -> WEST [OK] WEST -> EAST [OK] NORTH -> SOUTH [WALL] SOUTH -> NORTH [OK]
1000 = 8 = EAST -> WEST [WALL] WEST -> EAST [WALL] NORTH -> SOUTH [OK] SOUTH -> NORTH [WALL]
1001 = 9 = EAST -> WEST [WALL] WEST -> EAST [OK] NORTH -> SOUTH [OK] SOUTH -> NORTH [WALL]
1010 = 10 = EAST -> WEST [OK] WEST -> EAST [WALL] NORTH -> SOUTH [OK] SOUTH -> NORTH [WALL]
1011 = 11 = EAST -> WEST [OK] WEST -> EAST [OK] NORTH -> SOUTH [OK] SOUTH -> NORTH [WALL]
1100 = 12 = EAST -> WEST [WALL] WEST -> EAST [WALL] NORTH -> SOUTH [OK] SOUTH -> NORTH [OK]
1101 = 13 = EAST -> WEST [WALL] WEST -> EAST [OK] NORTH -> SOUTH [OK] SOUTH -> NORTH [OK]
1110 = 14 = EAST -> WEST [OK] WEST -> EAST [WALL] NORTH -> SOUTH [OK] SOUTH -> NORTH [OK]
1111 = 15 = EAST -> WEST [OK] WEST -> EAST [OK] NORTH -> SOUTH [OK] SOUTH -> NORTH [OK]
basic calculation
65536-2X-2(variable)
Note:X is a multiple of 8, so it could only be 0,8,24... etc
variable is between 0-7.5, getting 16 results in the end