#include "gc/GcTargetEffect.hpp" #include #include #include #include int main(int argc, char** argv) { if (argc < 3) { std::cerr << "usage: opencoaster-effect-probe EFC_DATA UV_DATA [first [last]]\n"; return 2; } GcTargetEffectBank bank; std::string error; if (!bank.load(argv[1], argv[2], &error)) { std::cerr << error << '\n'; return 1; } const int first = argc > 3 ? std::atoi(argv[3]) : 0; const int last = argc > 4 ? std::atoi(argv[4]) : first; const int uvBase = argc > 5 ? std::atoi(argv[5]) : 0; for (int effect = first; effect <= last; ++effect) { std::cout << "effect " << effect << " lifetime=" << bank.lifetime(effect) << '\n'; const int lifetime = bank.lifetime(effect); const int sampleTicks[] = {0, 1, lifetime / 2, lifetime > 0 ? lifetime - 1 : 0}; std::set seenTicks; for (const int tick : sampleTicks) { if (!seenTicks.insert(tick).second) continue; const auto sprites = bank.evaluate(effect, static_cast(tick), uvBase); std::cout << " tick " << tick << " sprites=" << sprites.size() << '\n'; for (const auto& sprite : sprites) { const GcUvCell* cell = bank.uvCell(sprite.uvRecord, sprite.frame); std::cout << " uv=" << sprite.uvRecord << " tex=" << bank.uvTexture(sprite.uvRecord) << " frame=" << sprite.frame; if (cell) { std::cout << " cell=" << cell->x << ',' << cell->y << ' ' << cell->width << 'x' << cell->height; } std::cout << " pos=" << sprite.offsetPixels.x << ',' << sprite.offsetPixels.y << " scale=" << sprite.scale.x << ',' << sprite.scale.y << " rot=" << sprite.rotationDegrees << " rgba=" << sprite.color.r << ',' << sprite.color.g << ',' << sprite.color.b << ',' << sprite.color.a << '\n'; } } } }