Files
jailsadventure2/data/editor.lua

294 lines
9.4 KiB
Lua

require "menu"
require "mapa"
require "textbox"
require "fileselect"
editor={
paused=true,
cam={x=0,y=0},
--selected_tile=3,
brush={w=1,h=1,tiles={3}},
selection=nil,
init=function()
set_update(editor.update)
--editor.show_menu()
editor.new()
end,
show_menu=function()
menu.show({ {"NEW MAP", editor.new},
{"LOAD MAP", function() fileselect.show("FILE TO LOAD:",editor.load, ".map") end},
{"SAVE MAP", function() if mapa.name~=nil then editor.save(mapa.name) else textbox.show("FILENAME TO SAVE:",editor.save, mapa.name) end end},
{editor.editing_front_layer and "DISABLE FRONT LAYER" or "ENABLE FRONT LAYER", editor.toggle_front_layer},
{"RESIZE MAP", editor.resize},
{"RELOAD TEXTURES", editor.reload_textures},
{"EXIT", main_init},
}, function()editor.paused=false end)
end,
reload_textures=function()
surf.free(sprites)
surf.free(objectes)
surf.free(tiles)
sprites=surf.load("sprites.gif")
objectes=surf.load("objects.gif")
tiles=surf.load("tiles.gif")
surf.source(tiles)
local p=pal.load("tiles.gif")
pal.set(p)
editor.paused=false
end,
toggle_front_layer=function()
if editor.editing_front_layer then
map.set(mapa.surface)
editor.editing_front_layer=false;
else
if not mapa.front_layer then
mapa.front_layer=surf.new(mapa.w,mapa.h)
editor.editing_front_layer=true
map.set(mapa.front_layer)
for y=0,mapa.h-1 do
for x=0,mapa.w-1 do
map.tile(x,y,0)
end
end
else
editor.editing_front_layer=true
map.set(mapa.front_layer)
end
end
editor.paused=false
end,
resize=function()
textbox.show("NEW MAP WIDTH:",function(value)
editor.new_w=value
textbox.show("NEW MAP HEIGHT:", function(value)
editor.new_h=value
editor.do_resize()
end, tostring(mapa.h))
end, tostring(mapa.w))
end,
do_resize=function()
local old_surface= mapa.surface
mapa.w=tonumber(editor.new_w)
mapa.h=tonumber(editor.new_h)
mapa.surface=surf.new(mapa.w,mapa.h)
for y=0,mapa.h-1 do
for x=0,mapa.w-1 do
map.set(old_surface)
local value=map.tile(x,y)
map.set(mapa.surface)
map.tile(x,y,value)
end
end
surf.free(old_surface)
map.set(mapa.surface)
editor.paused=false
end,
floodfill=function(x,y,tile)
local t=map.tile(x,y)
map.tile(x,y,tile)
if x<mapa.w-1 and map.tile(x+1,y)==t then editor.floodfill(x+1,y,tile) end
if x>0 and map.tile(x-1,y)==t then editor.floodfill(x-1,y,tile) end
if y<mapa.h-1 and map.tile(x,y+1)==t then editor.floodfill(x,y+1,tile) end
if y>0 and map.tile(x,y-1)==t then editor.floodfill(x,y-1,tile) end
end,
create_stamp=function()
local tx1,ty1,tx2,ty2=editor.selection.x1,editor.selection.y1,editor.selection.x2,editor.selection.y2
if tx1>tx2 then tx1,tx2=tx2,tx1 end
if ty1>ty2 then ty1,ty2=ty2,ty1 end
editor.brush.w=tx2-tx1+1
editor.brush.h=ty2-ty1+1
local w,h=editor.brush.w,editor.brush.h
local p=1
for y=1,h do
for x=1,w do
editor.brush.tiles[p]=map.tile(tx1+x-1,ty1+y-1)
--map.tile(tx+x-1,ty+y-1,editor.brush.tiles[p])
p=p+1
end
end
end,
stamp=function(tx,ty)
local w,h=editor.brush.w,editor.brush.h
local p=1
for y=1,h do
for x=1,w do
map.tile(tx+x-1,ty+y-1,editor.brush.tiles[p])
p=p+1
end
end
end,
displace=function(dx,dy)
local w,h=mapa.w,mapa.h
if dx>0 then
for y=0,h-1 do
for x=w-1,1,-1 do
map.tile(x,y,map.tile(x-1,y))
end
end
elseif dx<0 then
for y=0,h-1 do
for x=0,w-2 do
map.tile(x,y,map.tile(x+1,y))
end
end
elseif dy>0 then
for y=h-1,1,-1 do
for x=0,w-1 do
map.tile(x,y,map.tile(x,y-1))
end
end
elseif dy<0 then
for y=0,h-2 do
for x=0,w-1 do
map.tile(x,y,map.tile(x,y+1))
end
end
end
end,
update=function()
surf.cls()
view.origin(editor.cam.x, editor.cam.y)
surf.source(tiles)
map.set(mapa.surface)
map.draw() --map(0,0,0,0,mapa.w, mapa.h)
if mapa.front_layer then
map.set(mapa.front_layer)
map.draw() --map(0,0,0,0,mapa.w, mapa.h)
end
if editor.editing_front_layer then
map.set(mapa.front_layer)
text("EDITING FRONT LAYER",12,2,10)
else
map.set(mapa.surface)
end
local mx,my=mouse.pos()
local tx,ty=(mx+editor.cam.x)>>3,(my+editor.cam.y)>>3
local rx,ry=tx<<3,ty<<3
draw.rect(rx-1, ry-1, 10, 10, 10)
if editor.selection then
local rx1,ry1,rx2,ry2=editor.selection.x1<<3,editor.selection.y1<<3,editor.selection.x2<<3,editor.selection.y2<<3
if rx1>rx2 then rx1,rx2=rx2,rx1 end
if ry1>ry2 then ry1,ry2=ry2,ry1 end
draw.rect(rx1-1, ry1-1, rx2-rx1+10, ry2-ry1+10, 8)
end
view.origin(0,0)
if tx>=0 and
ty>=0 and
tx<mapa.w and
ty<mapa.h then
text(tx..","..ty,2,2,8)
end
if not editor.paused then
if mouse.down(mouse.LEFT) then
editor.stamp(tx,ty)
--map.tile(tx,ty,editor.brush.tiles[1])
end
if mouse.down(mouse.RIGHT) then
if editor.selection then
editor.selection.x2=tx
editor.selection.y2=ty
else
editor.selection={}
editor.selection.x1=tx
editor.selection.y1=ty
editor.selection.x2=tx
editor.selection.y2=ty
end
else
if editor.selection then
editor.create_stamp()
editor.selection=nil
end
end
if key.down(key.LSHIFT) then
if key.press(key.RIGHT) then editor.displace(1,0) end
if key.press(key.LEFT) then editor.displace(-1,0) end
if key.press(key.UP) then editor.displace(0,-1) end
if key.press(key.DOWN) then editor.displace(0,1) end
else
if key.press(key.RIGHT) then editor.cam.x=editor.cam.x+8 end
if key.press(key.LEFT) then editor.cam.x=editor.cam.x-8 end
if key.press(key.UP) then editor.cam.y=editor.cam.y-8 end
if key.press(key.DOWN) then editor.cam.y=editor.cam.y+8 end
end
if key.press(key.F) then
editor.floodfill(tx,ty,editor.brush.tiles[1])
end
if key.press(key.N1) then
if editor.editing_front_layer then
editor.editing_front_layer=nil
else
editor.editing_front_layer=true
end
end
if key.press(key.RETURN) then
editor.brush.tiles[1]=map.tile(tx,ty)
end
if key.press(key.ESCAPE) then
editor.paused=true
editor.show_menu()
end
if key.press(key.TAB) then
update=editor.update_tileset
end
end
end,
update_tileset=function()
surf.cls()
draw.surf(0,0,128,128,0,0)
local mx,my=mouse.pos()
local tx,ty=mx>>3,my>>3
local rx,ry=tx<<3,ty<<3
draw.rect(rx-1, ry-1, 10, 10, 10)
if key.press(key.TAB) or key.press(key.ESCAPE) then
update=editor.update
end
if mouse.press(mouse.LEFT) then
if tx<16 and ty<16 then
editor.brush.w=1
editor.brush.h=1
editor.brush.tiles={}
editor.brush.tiles[1]=ty*16+tx
end
update=editor.update
end
end,
new=function()
mapa.new(128,128)
editor.editing_front_layer=nil
editor.paused=false
end,
save=function(filename)
mapa.save(filename)
editor.paused=false
end,
load=function(filename)
mapa.load(filename)
editor.editing_front_layer=nil
editor.paused=false
editor.cam.x=0
editor.cam.y=0
end
}