forked from eguneys/cooler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_pack.js
116 lines (82 loc) · 2.48 KB
/
_pack.js
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
import fs from 'fs'
import { ImageSave, Rect, Packer, aseprite } from 'aset'
import jspngopt from 'jspngopt'
import imagemin from 'imagemin'
import imageminAdvpng from 'imagemin-advpng'
export default async function pack() {
let packer = new Packer(0)
let sprites = []
await Promise.all(['./content/sprites'].map(_ =>
ase_files(_)
.then(_ => _.map(({name, ase}) => {
let frames = ase.frames.map(frame => ({duration: frame.duration}))
let packs = ase.frames.map(frame => packer.add(frame.image))
let { tags } = ase
sprites.push({ name, packs, tags, frames })
}))))
packer.pack()
sprites = sprites.map(({ name, packs, tags, frames }) => ({
name,
tags,
packs: packs.map((_,i) => ({ frame: _.frame, packed: _.packed, meta: frames[i] }))
}))
let res = {
sprites
}
let opt = new jspngopt.Optimizer()
let opt_png = opt.bufferSync(packer.pages[0].png_buffer)
fs.writeFileSync('./content/out_0.png', opt_png)
fs.writeFileSync('./content/out_0.json', JSON.stringify(res))
fs.writeFileSync('./content/out_0.con', condensed(res))
await imagemin(['./content/out_0.png'], {
plugins: [ imageminAdvpng()]
})
console.log('content written.')
}
function condensed(json) {
let { sprites } = json
return sprites.map(({
name,
tags,
packs
}) => {
let tt = tags.map(({
from, to, name
}) => [from, to, name].join('*')).join('\n')
let pp = packs.map(({
frame: { x, y, w, h },
packed: { x: px, y: py, w: pw, h: ph },
meta: { duration }
}) => mega_shrink([x,y,w,h,px,py,pw,ph]).join('*')).join('\n')
return [name, tt, pp].join('\n\n')
}).join('\n\n\n')
}
// src/content.ts -> mega_extend
function mega_shrink(v) {
let [x,y,w,h,px,py,pw,ph] = v
// assume
// x,y = 0
// w,h = 16,16 | 32,16 | 32,32 | 80,80 | 80,30 | 160,160
// pw,ph = w,h
// px,py = px,py
let code_wh = (w === 16 ? 0 :
(w === 32 ? (h === 32 ? 5 : 1) :
(w === 80 ? (h === 30 ? 4 : 2) : 3)))
return [code_wh,px,py]
}
function ase_files(folder) {
return new Promise(resolve => {
fs.readdir(folder, (err, files) => {
Promise.all(files.filter(_ => _.match(/\.ase$/))
.map(file => new Promise(_resolve => {
fs.readFile([folder, file].join('/'), (err, data) => {
if (err) {
throw err
}
let name = file.split('.')[0]
_resolve({ name, ase: aseprite(data)})
})
}))).then(resolve)
})
})
}