estandarditza la sortida de pack_resources
This commit is contained in:
@@ -1,138 +1,103 @@
|
||||
// pack_resources.cpp
|
||||
// Tool to pack game resources into a single encrypted file
|
||||
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// Include the ResourcePack class
|
||||
#include "../../source/core/resources/resource_pack.hpp"
|
||||
|
||||
void printUsage(const char* program_name) {
|
||||
std::cout << "Usage:\n";
|
||||
std::cout << " " << program_name << " [input_dir] [output_file]\n";
|
||||
std::cout << " " << program_name << " --list <pack_file>\n";
|
||||
std::cout << "\n";
|
||||
std::cout << "Examples:\n";
|
||||
std::cout << " " << program_name << " data resources.pack\n";
|
||||
std::cout << " " << program_name << " --list resources.pack\n";
|
||||
std::cout << "\n";
|
||||
std::cout << "Options:\n";
|
||||
std::cout << " --list List contents of a pack file\n";
|
||||
}
|
||||
namespace {
|
||||
|
||||
auto handleDefaultPack() -> int {
|
||||
std::string input_dir = "data";
|
||||
constexpr const char* APP_NAME = "JailDoctor's Dilemma";
|
||||
|
||||
void showHelp() {
|
||||
std::cout << APP_NAME << " - Resource Packer\n";
|
||||
std::cout << "======================================\n";
|
||||
std::cout << "Usage: pack_resources [options] [input_dir] [output_file]\n\n";
|
||||
std::cout << "Options:\n";
|
||||
std::cout << " --help Show this help message\n";
|
||||
std::cout << " --list List contents of an existing pack file\n\n";
|
||||
std::cout << "Arguments:\n";
|
||||
std::cout << " input_dir Directory to pack (default: data)\n";
|
||||
std::cout << " output_file Pack file name (default: resources.pack)\n";
|
||||
}
|
||||
|
||||
void listPackContents(const std::string& pack_file) {
|
||||
Resource::Pack pack;
|
||||
if (!pack.loadPack(pack_file)) {
|
||||
std::cerr << "Error: cannot open pack file: " << pack_file << '\n';
|
||||
return;
|
||||
}
|
||||
auto resources = pack.getResourceList();
|
||||
std::cout << "Pack file: " << pack_file << '\n';
|
||||
std::cout << "Resources: " << resources.size() << '\n';
|
||||
for (const auto& r : resources) { std::cout << " " << r << '\n'; }
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
std::string data_dir = "data";
|
||||
std::string output_file = "resources.pack";
|
||||
bool list_mode = false;
|
||||
bool data_dir_set = false;
|
||||
|
||||
std::cout << "Using defaults:\n";
|
||||
std::cout << " Input: " << input_dir << "/\n";
|
||||
std::cout << " Output: " << output_file << "\n\n";
|
||||
|
||||
Resource::Pack pack;
|
||||
if (!pack.addDirectory(input_dir)) {
|
||||
std::cerr << "Error: Failed to add directory: " << input_dir << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Add config/assets.yaml to pack (required for release builds)
|
||||
std::cout << "\nAdding config files...\n";
|
||||
if (!pack.addFile("config/assets.yaml", "config/assets.yaml")) {
|
||||
std::cerr << "Warning: Failed to add config/assets.yaml (optional)\n";
|
||||
}
|
||||
|
||||
if (!pack.savePack(output_file)) {
|
||||
std::cerr << "Error: Failed to save pack file: " << output_file << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << "\nSuccess! Pack created: " << output_file << '\n';
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto handleListContents(const std::string& pack_file) -> int {
|
||||
std::cout << "Loading pack: " << pack_file << "\n\n";
|
||||
|
||||
Resource::Pack pack;
|
||||
if (!pack.loadPack(pack_file)) {
|
||||
std::cerr << "Error: Failed to load pack file: " << pack_file << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << "\nPack Contents:\n";
|
||||
std::cout << "==============\n";
|
||||
|
||||
auto resources = pack.getResourceList();
|
||||
size_t total_size = 0;
|
||||
|
||||
for (const auto& resource : resources) {
|
||||
auto data = pack.getResource(resource);
|
||||
total_size += data.size();
|
||||
std::cout << " " << resource << " (" << data.size() << " bytes)\n";
|
||||
}
|
||||
|
||||
std::cout << "\nTotal Resources: " << resources.size() << '\n';
|
||||
std::cout << "Total Size: " << total_size << " bytes\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto handlePackDirectory(const std::string& input_dir, const std::string& output_file) -> int {
|
||||
std::cout << "Input: " << input_dir << "/\n";
|
||||
std::cout << "Output: " << output_file << "\n\n";
|
||||
|
||||
Resource::Pack pack;
|
||||
if (!pack.addDirectory(input_dir)) {
|
||||
std::cerr << "Error: Failed to add directory: " << input_dir << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Add config/assets.yaml to pack (required for release builds)
|
||||
std::cout << "\nAdding config files...\n";
|
||||
if (!pack.addFile("config/assets.yaml", "config/assets.yaml")) {
|
||||
std::cerr << "Warning: Failed to add config/assets.yaml (optional)\n";
|
||||
}
|
||||
|
||||
if (!pack.savePack(output_file)) {
|
||||
std::cerr << "Error: Failed to save pack file: " << output_file << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << "\nSuccess! Pack created: " << output_file << '\n';
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto main(int argc, char* argv[]) -> int {
|
||||
std::cout << "JailDoctor's Dilemma - Resource Packer\n";
|
||||
std::cout << "======================================\n\n";
|
||||
|
||||
// Default behavior: pack data/ into resources.pack
|
||||
if (argc == 1) {
|
||||
return handleDefaultPack();
|
||||
}
|
||||
|
||||
// Help command
|
||||
if (argc == 2) {
|
||||
std::string arg = argv[1];
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
std::string arg = argv[i];
|
||||
if (arg == "--help" || arg == "-h") {
|
||||
printUsage(argv[0]);
|
||||
showHelp();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// List contents or pack directory
|
||||
if (argc == 3) {
|
||||
std::string arg1 = argv[1];
|
||||
std::string arg2 = argv[2];
|
||||
|
||||
if (arg1 == "--list" || arg1 == "-l") {
|
||||
return handleListContents(arg2);
|
||||
if (arg == "--list") {
|
||||
list_mode = true;
|
||||
if (i + 1 < argc) { output_file = argv[++i]; }
|
||||
continue;
|
||||
}
|
||||
if (!arg.empty() && arg[0] != '-') {
|
||||
if (!data_dir_set) {
|
||||
data_dir = arg;
|
||||
data_dir_set = true;
|
||||
} else {
|
||||
output_file = arg;
|
||||
}
|
||||
}
|
||||
|
||||
return handlePackDirectory(arg1, arg2);
|
||||
}
|
||||
|
||||
// Invalid arguments
|
||||
std::cerr << "Error: Invalid arguments\n\n";
|
||||
printUsage(argv[0]);
|
||||
return 1;
|
||||
if (list_mode) {
|
||||
listPackContents(output_file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::cout << APP_NAME << " - Resource Packer\n";
|
||||
std::cout << "======================================\n";
|
||||
std::cout << "Input directory: " << data_dir << '\n';
|
||||
std::cout << "Output file: " << output_file << '\n';
|
||||
|
||||
if (!std::filesystem::exists(data_dir)) {
|
||||
std::cerr << "Error: input directory does not exist: " << data_dir << '\n';
|
||||
return 1;
|
||||
}
|
||||
|
||||
Resource::Pack pack;
|
||||
std::cout << "Scanning and packing resources...\n";
|
||||
if (!pack.addDirectory(data_dir)) {
|
||||
std::cerr << "Error: failed to add directory to pack\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// config/assets.yaml is required for release builds; tolerate absence.
|
||||
if (!pack.addFile("config/assets.yaml", "config/assets.yaml")) {
|
||||
std::cerr << "Warning: failed to add config/assets.yaml (optional)\n";
|
||||
}
|
||||
|
||||
std::cout << "Found " << pack.getResourceCount() << " resources\n";
|
||||
|
||||
std::cout << "Saving pack file...\n";
|
||||
if (!pack.savePack(output_file)) {
|
||||
std::cerr << "Error: failed to save pack file\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto file_size = std::filesystem::file_size(std::filesystem::path(output_file));
|
||||
std::cout << "Pack file created: " << output_file << " ("
|
||||
<< (static_cast<double>(file_size) / 1024.0 / 1024.0) << " MB)\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user