From f648c6776e0a1c5e1e3f6fcf9c81fefcb67a0c3e Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 31 Jan 2021 11:43:53 -0500 Subject: Sprite dumper combines arbitrary sheets now --- tools/sprite_dumper/main.cpp | 109 +++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 41 deletions(-) (limited to 'tools') diff --git a/tools/sprite_dumper/main.cpp b/tools/sprite_dumper/main.cpp index c8dd956..2ba37c8 100644 --- a/tools/sprite_dumper/main.cpp +++ b/tools/sprite_dumper/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include class Rom { public: @@ -270,46 +271,12 @@ struct SpriteSheet { int gfxPtr; std::vector sprites; - Magick::Image render(Rom& m3, PaletteSet& palettes) const { - int maxWidth = 0; - int maxHeight = 0; - std::vector frames; - + void render(Rom& m3, PaletteSet& palettes, std::vector& frames) const { const Palette& palette = palettes.GetPalette(spriteindex); for (int i=0; i maxWidth) maxWidth = f.width; - if (f.height > maxHeight) maxHeight = f.height; frames.push_back(std::move(f)); } - - const int FRAMES_PER_ROW = 10; - int sheetWidth; - int sheetHeight; - - std::ofstream datafile("out.txt"); - datafile << maxWidth << "," << maxHeight << " cell size" << std::endl; - datafile << FRAMES_PER_ROW << " frames per row" << std::endl; - datafile << frames.size() << " frames" << std::endl; - datafile << std::endl; - - if (frames.size() < FRAMES_PER_ROW) { - sheetWidth = frames.size() * maxWidth; - sheetHeight = maxHeight; - } else { - sheetWidth = FRAMES_PER_ROW * maxWidth; - sheetHeight = (frames.size() / FRAMES_PER_ROW + 1) * maxHeight; - } - - Magick::Image sheet(Magick::Geometry(sheetWidth, sheetHeight), "transparent"); - for (int i=0; i frames; + + for (int i=2; i> bankNum; + argfmt >> ch; //. + argfmt >> sheetNum; + + const Bank& bankToRead = [&](){ + switch (bankNum) { + case 0: return b1; + case 1: return b2; + case 2: return b3; + case 3: return b4; + default: throw std::invalid_argument("Invalid bank num: " + std::to_string(bankNum)); + } + }(); + + bankToRead.SpriteSheets().at(sheetNum).render(m3, palettes, frames); + } + + int maxWidth = 0; + int maxHeight = 0; + for (const FrameOutput& f : frames) { + if (f.width > maxWidth) maxWidth = f.width; + if (f.height > maxHeight) maxHeight = f.height; + } + + const int FRAMES_PER_ROW = 10; + int sheetWidth; + int sheetHeight; + + std::ofstream datafile("out.txt"); + datafile << maxWidth << "," << maxHeight << " cell size" << std::endl; + datafile << FRAMES_PER_ROW << " frames per row" << std::endl; + datafile << frames.size() << " frames" << std::endl; + datafile << std::endl; + + if (frames.size() < FRAMES_PER_ROW) { + sheetWidth = frames.size() * maxWidth; + sheetHeight = maxHeight; + } else { + sheetWidth = FRAMES_PER_ROW * maxWidth; + sheetHeight = (frames.size() / FRAMES_PER_ROW + 1) * maxHeight; + } + + Magick::Image sheet(Magick::Geometry(sheetWidth, sheetHeight), "transparent"); + for (int i=0; i