--teste
--soh gerar 128x128 tiles de grass
require "bit32"
--SPECIAL CHARACTERS
NODE_START = 0xfe
NODE_END = 0xff
ESCAPE_CHAR = 0xfd
--OTBM NODE TYPES
OTBM_ROOTV1 = 1
OTBM_MAP_DATA = 2
OTBM_ITEM_DEF = 3
OTBM_TILE_AREA = 4
OTBM_TILE = 5
OTBM_ITEM = 6
OTBM_TILE_SQUARE = 7
OTBM_TILE_REF = 8
OTBM_SPAWNS = 9
OTBM_SPAWN_AREA = 10
OTBM_MONSTER = 11
OTBM_TOWNS = 12
OTBM_TOWN = 13
OTBM_HOUSETILE = 14
--OTBM ATTR TYPES
OTBM_ATTR_DESCRIPTION = 1
OTBM_ATTR_EXT_FILE = 2
OTBM_ATTR_TILE_FLAGS = 3
OTBM_ATTR_ACTION_ID = 4
OTBM_ATTR_UNIQUE_ID = 5
OTBM_ATTR_TEXT = 6
OTBM_ATTR_DESC = 7
OTBM_ATTR_TELE_DEST = 8
OTBM_ATTR_ITEM = 9
OTBM_ATTR_DEPOT_ID = 10
OTBM_ATTR_EXT_SPAWN_FILE = 11
OTBM_ATTR_RUNE_CHARGES = 12
OTBM_ATTR_EXT_HOUSE_FILE = 13
OTBM_ATTR_HOUSEDOORID = 14
OTBM_ATTR_COUNT = 15
OTBM_ATTR_DURATION = 16
OTBM_ATTR_DECAYING_STATE = 17
OTBM_ATTR_WRITTENDATE = 18
OTBM_ATTR_WRITTENBY = 19
OTBM_ATTR_SLEEPERGUID = 20
OTBM_ATTR_SLEEPSTART = 21
OTBM_ATTR_CHARGES = 22
function lchar(i) s="" while i>0 do s=s..string.char(i%256) i=math.floor(i/256) end return s end
function format(s,size)
local len = #s
for x=1,size/8-len do
s=s.."\0"
end
return s
end
function writeData(f,data,size,unescape)
local thestr
if type(data) == "string" then
thestr = format(data,size)
elseif type(data) == "number" then
thestr = format(lchar(data),size)
else
print(data)
end
for x=1,size/8 do
local c = thestr:sub(x,x)
--print(#thestr,size,string.byte(c))
--if c == string.char(0x0D) then error("daonde") end
if unescape and (c==string.char(NODE_START) or c==string.char(NODE_END) or c==string.char(ESCAPE_CHAR)) then
f:write(string.char(ESCAPE_CHAR))
end
f:write(c)
end
end
function addU8(f,data)
writeData(f,data,8,true)
end
function addByte(f,data)
writeData(f,data,8,false)
end
function addU16(f,data)
writeData(f,data,16,true)
end
function addU32(f,data)
writeData(f,data,32,false)
end
function addString(f,data)
if #data > 0xffff then
return false
end
addU16(f,#data)
writeData(f,data,#data*8,false)
end
function startNode(f,c) --c is a char
writeData(f,NODE_START,8,false)
writeData(f,c,8,true)
end
function endNode(f)
writeData(f,NODE_END,8,false)
end
WIDTH = 128
HEIGHT = 128
ITEMDWMAJORVERSION = 2
ITEMDWMINORVERSION = 8
--
function makeRandomMap(name)
f = io.open(name,"wb")
addU32(f,0); --version
startNode(f,0)
addU32(f,0); --version again :O
addU16(f,WIDTH)
addU16(f,HEIGHT)
addU32(f,ITEMDWMAJORVERSION)
addU32(f,ITEMDWMINORVERSION)
startNode(f,OTBM_MAP_DATA)
--addByte(f,OTBM_ATTR_DESCRIPTION)
--addString(f,"Created with RandomGen")
first = true
local_x,local_y,local_Z=-1,-1,-1
z=7
for xi=0,WIDTH-1,256 do
for yi=0,HEIGHT-1,256 do
for x=xi,math.min(xi+256-1,WIDTH-1) do
for y=yi,math.min(yi+256-1,HEIGHT-1) do
if x<local_x or x>=local_x+256 or y<local_y or y>=local_y+256 or z~=local_z then
if not first then
endNode(f)
end
first = false
--start new node
startNode(f,OTBM_TILE_AREA)
local_x=bit32.band(x,0xff00)
local_y=bit32.band(y,0xff00)
local_z=z
addU16(f,local_x)
addU16(f,local_y)
addU8(f,local_z)
end
startNode(f,OTBM_TILE)
addU8(f,bit32.band(x,0xff)) --print("x:",bit32.band(x,0xff))
addU8(f,bit32.band(y,0xff)) --print("y:",bit32.band(y,0xff))
--item
addByte(f,OTBM_ATTR_ITEM)
addU16(f,4526)
--[[startNode(f,OTBM_ITEM)
addU16(f,4526)
endNode(f)]]
--more items here
--
endNode(f)
end
end
end
end
if not first then
endNode(f)
end
endNode(f)
endNode(f)
f:close()
end