From 3e2c9ba25febb60d53a563494d17de52cd698b9e Mon Sep 17 00:00:00 2001 From: lzwdgc Date: Tue, 10 Jan 2023 20:05:02 +0300 Subject: [PATCH] Update. --- src/unpaker2/unpaker2.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/unpaker2/unpaker2.cpp b/src/unpaker2/unpaker2.cpp index 9fbc9a0..91e6820 100644 --- a/src/unpaker2/unpaker2.cpp +++ b/src/unpaker2/unpaker2.cpp @@ -1,6 +1,6 @@ /* - * AIM mod_converter - * Copyright (C) 2015 lzwdgc + * AIM unpaker2 + * Copyright (C) 2023 lzwdgc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -69,14 +69,12 @@ struct stream { primitives::templates2::mmap_file &m; uint8_t *p{m.p}; - template - operator T&() { + template operator T&() { auto &r = *(T*)p; p += sizeof(T); return r; } - template - auto span(size_t len) { + template auto span(size_t len) { auto s = std::span((T*)p, len); p += sizeof(T) * len; return s; @@ -89,10 +87,15 @@ void unpack_file(path fn) { pak p = s; auto descs = s.span(p.n_files); auto segments = s.span(p.n_blocks); - std::vector bbb; - bbb.resize((segments.size() + 1) * p.block_size * 4); - auto pp = bbb.data(); - for (auto &&seg : segments) { + std::vector decoded; + decoded.resize((segments.size() + 1) * p.block_size * 4); + auto pp = decoded.data(); + int displaylen = 50; + int seglen = segments.size() / displaylen == 0 ? 1 : segments.size() / displaylen; + for (int i = 0; auto &&seg : segments) { + if (i++ % seglen == 0) { + std::cout << "#"; + } s.p = f.p + seg.offset; uint32_t len = s; switch (seg.algorithm) { @@ -160,8 +163,7 @@ void unpack_file(path fn) { throw std::runtime_error{"compression unsupported: "s + std::to_string(seg.algorithm)}; } } - pp = bbb.data(); - + std::cout << "\n"; auto dir = fn += ".dir2"; fs::create_directories(dir); for (auto &&d : descs) { @@ -170,7 +172,7 @@ void unpack_file(path fn) { std::cout << "unpacking " << fn << "\n"; primitives::templates2::mmap_file f{fn, primitives::templates2::mmap_file::rw{}}; f.alloc_raw(d.size); - memcpy(f.p, pp + d.offset, d.size); + memcpy(f.p, decoded.data() + d.offset, d.size); } }