-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimport_tileset.lua
137 lines (120 loc) · 4.62 KB
/
import_tileset.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
if TilesetMode == nil then return app.alert "Use Aseprite v1.3" end
-- Import Tilesets for every tilemap layer.
-- Tileset name should be tiles/Tileset_*layername*.png
-- Assumes "tiles" folder accessible at ../ from aseprite file
-- For Every Tilemap Layer:
-- 1. Create empty Tilemap *layername*_2
-- 2. Import .png tileset.
-- 3. Copy tileset pixels pixels.
-- 4. Delete all tile indices/pixels on the canvas
-- 5. Copy pixels from *layername*
-- 6. Repeat steps 2-5 for all frames
-- 7. Delete *layername*
-- 8. Rename *layername*_2 to *layername*
-- Preliminaries, going to first frame, measuring canvas...
app.command.GotoFirstFrame()
local frame = app.activeFrame
local spr = app.activeSprite
local lay = app.activeLayer
local tile_pxwidth = spr.tilesets[1].grid.tileSize.width
local tile_pxheight = spr.tilesets[1].grid.tileSize.height
local canvas_pxwidth = spr.width
local canvas_pxheight = spr.height
local canvas_tilewidth = canvas_pxwidth // tile_pxwidth
local canvas_tileheight = canvas_pxheight // tile_pxwidth
local fs = app.fs
local output_folder = fs.filePath(spr.filename)
local tileset_folder = "../tiles"
if not lay.isTilemap then return app.alert "No active tilemap layer" end
local function getLayer(spr, layername)
local outlayer
for i,layer in ipairs(spr.layers) do
if layer.name == layername then
outlayer = layer
break
end
end
return(outlayer)
end
local function layer_tilemap_create(newname)
app.command.NewLayer{name=newname,ask=false,tilemap=true}
return(app.activeLayer)
end
tilemap_oldlayer_names = {}
for i,layer in ipairs(spr.layers) do
if layer.isTilemap then
tilemap_oldlayer_names[#tilemap_oldlayer_names + 1] = layer.name
end
end
local postname = "_2"
-- Make new tilemap layers
for i = 1, (#tilemap_oldlayer_names) do
-- print(tilemap_oldlayer_names[i])
local tileset_filename = app.fs.joinPath(tileset_folder, "Tileset_"..tilemap_oldlayer_names[i]..".png")
layer_tilemap_create(tilemap_oldlayer_names[i]..postname)
end
-- Copy new tiles from tilesets, and pixels from old layers
while (frame ~= nil) do
spr = frame.sprite
lay = app.activeLayer
-- For every tileset layer
for i = 1, (#tilemap_oldlayer_names) do
-- get old and new tilemap layers
local tileset_filename = app.fs.joinPath(tileset_folder, "Tileset_"..tilemap_oldlayer_names[i]..".png")
local newlayer = getLayer(spr, tilemap_oldlayer_names[i]..postname)
local oldlayer = getLayer(spr, tilemap_oldlayer_names[i])
assert(newlayer ~= nil)
assert(oldlayer ~= nil)
oldlayer.isVisible = true
newlayer.isVisible = true
-- Creates new tileset by copying all pixels from tileset_filename to newlayer
if (frame.frameNumber == 1) then
local tileset_sprite = app.open(tileset_filename)
local tileset_pxheight = tileset_sprite.height
local tileset_pxwidth = tileset_sprite.width
local tileset_tileheight = tileset_pxheight//tile_pxheight
local tileset_splitnum = math.ceil(tileset_pxheight/canvas_pxheight)
-- Copies tileset over in batches of height equal to the canvas'
for i = 0, (tileset_splitnum-1) do
-- Copy pixels from opened tileset file
app.activeSprite = tileset_sprite
selection_y = i*tile_pxheight*canvas_tileheight
tileset_sprite.selection:deselect()
tileset_sprite.selection:select(Rectangle(0, selection_y, tileset_pxwidth, canvas_pxheight))
app.command.CopyMerged()
app.activeSprite = spr
app.activeLayer = newlayer
app.command.TilesetMode{["mode"]="auto"}
app.command.Paste()
app.command.ToggleTilesMode()
spr.selection:selectAll()
app.command.TilesetMode{["mode"]="stack"}
app.command.Clear()
spr.selection:deselect()
end
tileset_sprite:close()
end
-- Copy pixels from oldlayer
spr = app.activeSprite
app.activeLayer = oldlayer
spr.selection:selectAll()
app.command.Copy()
app.activeLayer = newlayer
spr.selection:selectAll()
app.command.Paste()
end
-- Go to next frame
app.command.GotoNextFrame()
frame = app.activeFrame
if (frame.frameNumber == 1) then
break
end
end
-- Delete old layers
for i = 1, (#tilemap_oldlayer_names) do
local tileset_filename = app.fs.joinPath(tileset_folder, "Tileset_"..tilemap_oldlayer_names[i]..".png")
local newlayer = getLayer(spr, tilemap_oldlayer_names[i]..postname)
local oldlayer = getLayer(spr, tilemap_oldlayer_names[i])
newlayer.name = oldlayer.name
spr:deleteLayer(oldlayer)
end