mirror of
https://github.com/smogon/sprites.git
synced 2026-08-20 08:45:06 -05:00
Build refactor
There's still more implementation cleanup to do, but I at least wanted to publish the new build DSL, which is stable-ish at this point
This commit is contained in:
177
Tupfile.lua
177
Tupfile.lua
@@ -1,28 +1,26 @@
|
||||
|
||||
-- Generate uniform size minisprites
|
||||
|
||||
for canon in iter{"canonical", "cap"} do
|
||||
for dir in iter{"asymmetrical", "custom", "misc", "pokemon"} do
|
||||
tup.foreach_rule(
|
||||
rep{"src/{canon}/minisprites/gen6/{dir}/*.png", canon=canon, dir=dir},
|
||||
makecmd{
|
||||
display="pad g6 minisprite %f",
|
||||
pad{w=40, h=30}
|
||||
},
|
||||
rep{"build/gen6-minisprites-padded/{canon}/{dir}/%b",canon=canon,dir=dir}
|
||||
)
|
||||
|
||||
::continue::
|
||||
end
|
||||
end
|
||||
foreach_rule{
|
||||
display="pad g6 minisprite %f",
|
||||
input="src/%{canon}/minisprites/gen6/%{dir}/*.png",
|
||||
command=pad{w=40, h=30},
|
||||
output="build/gen6-minisprites-padded/%{canon}/%{dir}/%b",
|
||||
dimensions={
|
||||
canon={"canonical", "cap"},
|
||||
dir={"asymmetrical", "custom", "misc", "pokemon"}
|
||||
}
|
||||
}
|
||||
|
||||
-- PS spritesheet
|
||||
|
||||
tup.rule(
|
||||
{"build/gen6-minisprites-padded/canonical/pokemon/*", "build/gen6-minisprites-padded/cap/pokemon/*"},
|
||||
"node tools/sprites/ps.js build/gen6-minisprites-padded/canonical/pokemon/ build/gen6-minisprites-padded/cap/pokemon/ --output-image build/ps/pokemonicons-sheet.png --output-metadata build/ps/pokemonicons.json",
|
||||
{"build/ps/pokemonicons-sheet.png", "build/ps/pokemonicons.json"}
|
||||
)
|
||||
rule{
|
||||
input={"build/gen6-minisprites-padded/canonical/pokemon/*",
|
||||
"build/gen6-minisprites-padded/cap/pokemon/*"},
|
||||
command="node tools/sprites/ps.js build/gen6-minisprites-padded/canonical/pokemon/ build/gen6-minisprites-padded/cap/pokemon/ --output-image build/ps/pokemonicons-sheet.png --output-metadata build/ps/pokemonicons.json",
|
||||
output={"build/ps/pokemonicons-sheet.png",
|
||||
"build/ps/pokemonicons.json"}
|
||||
}
|
||||
|
||||
-- PS pokeball icons
|
||||
|
||||
@@ -32,99 +30,86 @@ local balls = {
|
||||
"src/noncanonical/ui/battle/Ball-Null.png",
|
||||
}
|
||||
|
||||
tup.rule(
|
||||
balls,
|
||||
makecmd{
|
||||
display="pokemonicons-pokeball-sheet",
|
||||
[[
|
||||
convert -background transparent -gravity center -extent 40x30 %f +append %o
|
||||
]],
|
||||
rule{
|
||||
display="pokemonicons-pokeball-sheet",
|
||||
input=balls,
|
||||
command={
|
||||
"convert -background transparent -gravity center -extent 40x30 %f +append %o",
|
||||
compresspng{config="SPRITESHEET"}
|
||||
},
|
||||
{"build/ps/pokemonicons-pokeball-sheet.png"}
|
||||
)
|
||||
output={"build/ps/pokemonicons-pokeball-sheet.png"}
|
||||
}
|
||||
|
||||
-- Smogdex social images
|
||||
|
||||
function fbsprite(input, output)
|
||||
tup.foreach_rule(
|
||||
input,
|
||||
makecmd{
|
||||
display="fbsprite %f",
|
||||
"tools/fbsprite.sh %f %o",
|
||||
compresspng{config="MODELS"}
|
||||
},
|
||||
output
|
||||
)
|
||||
end
|
||||
foreach_rule{
|
||||
display="fbsprite %f",
|
||||
input={"src/cap/models/front/*", "src/cap/sprites/gen5/front/*", "src/canonical/models/front/*"},
|
||||
key="%B",
|
||||
command={
|
||||
"tools/fbsprite.sh %f %o",
|
||||
compresspng{config="MODELS"}
|
||||
},
|
||||
output="build/smogon/fbsprites/xy/%B.png"
|
||||
}
|
||||
|
||||
function twittersprite(input, output)
|
||||
tup.foreach_rule(
|
||||
input,
|
||||
makecmd{
|
||||
display="twittersprite %f",
|
||||
"tools/twittersprite.sh %f %o",
|
||||
compresspng{config="MODELS"}
|
||||
},
|
||||
output
|
||||
)
|
||||
end
|
||||
foreach_rule{
|
||||
display="twittersprite %f",
|
||||
input={"src/cap/models/front/*", "src/cap/sprites/gen5/front/*", "src/canonical/models/front/*"},
|
||||
key="%B",
|
||||
command={
|
||||
"tools/twittersprite.sh %f %o",
|
||||
compresspng{config="MODELS"}
|
||||
},
|
||||
output="build/smogon/twittersprites/xy/%B.png"
|
||||
}
|
||||
|
||||
-- TODO: nicer API
|
||||
local files = mergededup(
|
||||
glob("src/cap/sprites/gen5/front/*"),
|
||||
glob{"src/canonical/models/front/*", "src/cap/models/front/*"},
|
||||
tup.base
|
||||
)
|
||||
|
||||
fbsprite(files, "build/smogon/fbsprites/xy/%B.png")
|
||||
twittersprite(files, "build/smogon/twittersprites/xy/%B.png")
|
||||
|
||||
-- Trainers
|
||||
|
||||
tup.foreach_rule(
|
||||
{"src/canonical/trainers/*"},
|
||||
makecmd{
|
||||
display="pad trainer %f",
|
||||
foreach_rule{
|
||||
display="pad trainer %f",
|
||||
input={"src/canonical/trainers/*"},
|
||||
command={
|
||||
pad{w=80, h=80},
|
||||
compresspng{config="TRAINERS"}
|
||||
},
|
||||
{"build/padded-trainers/canonical/%b"}
|
||||
)
|
||||
output={"build/padded-trainers/canonical/%b"}
|
||||
}
|
||||
|
||||
-- Padded Dex
|
||||
|
||||
for canon in iter{"canonical", "cap"} do
|
||||
for dir in iter{"front", "front-cosmetic", "front-shiny", "front-shiny-cosmetic"} do
|
||||
tup.foreach_rule(
|
||||
rep{"src/{canon}/dex/{dir}/*", canon=canon, dir=dir},
|
||||
makecmd{
|
||||
display="pad dex %f",
|
||||
pad{w=120, h=120},
|
||||
compresspng{config="DEX"}
|
||||
},
|
||||
rep{"build/padded-dex/{canon}/{dir}/%b", canon=canon, dir=dir}
|
||||
)
|
||||
end
|
||||
end
|
||||
foreach_rule{
|
||||
display="pad dex %f",
|
||||
input="src/%{canon}/dex/%{dir}/*",
|
||||
command={
|
||||
pad{w=120, h=120},
|
||||
compresspng{config="DEX"}
|
||||
},
|
||||
output="build/padded-dex/%{canon}/%{dir}/%b",
|
||||
dimensions={
|
||||
canon={"canonical", "cap"},
|
||||
dir={"front", "front-cosmetic", "front-shiny", "front-shiny-cosmetic"}
|
||||
}
|
||||
}
|
||||
|
||||
-- Build missing CAP dex
|
||||
|
||||
for folder in iter({"front", "front-shiny", "front-cosmetic", "front-shiny-cosmetic"}) do
|
||||
for file in iter(mergededup(glob(rep{"src/cap/models/{folder}/*.gif", folder=folder}),
|
||||
glob(rep{"src/cap/sprites/gen5/{folder}/*.gif", folder=folder}),
|
||||
tup.base)) do
|
||||
if not fileexists(rep{"src/cap/dex/{folder}/{base}.png", folder=folder, base=tup.base(file)}) then
|
||||
tup.rule(
|
||||
file,
|
||||
makecmd{
|
||||
display=rep{"missing dex cap {base} -> {folder}/{file}", folder=folder, base=tup.base(file), file=file},
|
||||
"convert %f'[0]' -trim %o",
|
||||
"mogrify -background transparent -gravity center -extent 120x120 %o",
|
||||
compresspng{config="DEX"}
|
||||
},
|
||||
rep{"build/padded-dex/cap/{folder}/{base}.png", folder=folder,base=tup.base(file)}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
foreach_rule{
|
||||
input={"src/cap/sprites/gen5/%{folder}/*.gif", "src/cap/models/%{folder}/*.gif"},
|
||||
display="missing dex cap %B -> %{folder}/%f",
|
||||
command={
|
||||
"convert %f'[0]' -trim %o",
|
||||
"mogrify -background transparent -gravity center -extent 120x120 %o",
|
||||
compresspng{config="DEX"}
|
||||
},
|
||||
key="%B",
|
||||
filter=function()
|
||||
return not glob_matches("src/cap/dex/%{folder}/%B.png")
|
||||
end,
|
||||
output="build/padded-dex/cap/%{folder}/%B.png",
|
||||
dimensions={
|
||||
folder={"front", "front-shiny", "front-cosmetic", "front-shiny-cosmetic"}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user