mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-06 13:48:01 +03:00
Temp commit. Need to store all sh... Changes
This commit is contained in:
+181
-206
@@ -5,16 +5,16 @@
|
||||
|
||||
#include "object.hpp"
|
||||
#include "../f2/struct.hpp"
|
||||
#include "../io/path.h"
|
||||
#include "../io/stream.h"
|
||||
#include "../io/path.hpp"
|
||||
#include "../io/stream.hpp"
|
||||
#include "../hash.hpp"
|
||||
#include "../sort.hpp"
|
||||
#include "../str_utils.h"
|
||||
#include "../str_utils.hpp"
|
||||
|
||||
static void object_database_classic_read_inner(object_database* obj_db, stream* s);
|
||||
static void object_database_classic_write_inner(object_database* obj_db, stream* s);
|
||||
static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length);
|
||||
static void object_database_modern_write_inner(object_database* obj_db, stream* s);
|
||||
static void object_database_classic_read_inner(object_database* obj_db, stream& s);
|
||||
static void object_database_classic_write_inner(object_database* obj_db, stream& s);
|
||||
static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length);
|
||||
static void object_database_modern_write_inner(object_database* obj_db, stream& s);
|
||||
static int64_t object_database_strings_get_string_offset(std::vector<std::string>& vec,
|
||||
std::vector<int64_t>& vec_off, std::string& str);
|
||||
static void object_database_strings_push_back_check(std::vector<std::string>& vec, std::string& str);
|
||||
@@ -45,17 +45,15 @@ void object_database::read(const char* path, bool modern) {
|
||||
char* path_bin = str_utils_add(path, ".bin");
|
||||
if (path_check_file_exists(path_bin)) {
|
||||
stream s;
|
||||
io_open(&s, path_bin, "rb");
|
||||
s.open(path_bin, "rb");
|
||||
if (s.io.stream) {
|
||||
uint8_t* data = force_malloc_s(uint8_t, s.length);
|
||||
io_read(&s, data, s.length);
|
||||
s.read(data, s.length);
|
||||
stream s_bin;
|
||||
io_open(&s_bin, data, s.length);
|
||||
object_database_classic_read_inner(this, &s_bin);
|
||||
io_free(&s_bin);
|
||||
s_bin.open(data, s.length);
|
||||
object_database_classic_read_inner(this, s_bin);
|
||||
free(data);
|
||||
}
|
||||
io_free(&s);
|
||||
}
|
||||
free(path_bin);
|
||||
}
|
||||
@@ -66,10 +64,9 @@ void object_database::read(const char* path, bool modern) {
|
||||
st.read(path_osi);
|
||||
if (st.header.signature == reverse_endianness_uint32_t('MOSI')) {
|
||||
stream s_mosi;
|
||||
io_open(&s_mosi, &st.data);
|
||||
s_mosi.open(st.data);
|
||||
s_mosi.is_big_endian = st.header.use_big_endian;
|
||||
object_database_modern_read_inner(this, &s_mosi, st.header.length);
|
||||
io_free(&s_mosi);
|
||||
object_database_modern_read_inner(this, s_mosi, st.header.length);
|
||||
}
|
||||
}
|
||||
free(path_osi);
|
||||
@@ -84,17 +81,15 @@ void object_database::read(const wchar_t* path, bool modern) {
|
||||
wchar_t* path_bin = str_utils_add(path, L".bin");
|
||||
if (path_check_file_exists(path_bin)) {
|
||||
stream s;
|
||||
io_open(&s, path_bin, L"rb");
|
||||
s.open(path_bin, L"rb");
|
||||
if (s.io.stream) {
|
||||
uint8_t* data = force_malloc_s(uint8_t, s.length);
|
||||
io_read(&s, data, s.length);
|
||||
s.read(data, s.length);
|
||||
stream s_bin;
|
||||
io_open(&s_bin, data, s.length);
|
||||
object_database_classic_read_inner(this, &s_bin);
|
||||
io_free(&s_bin);
|
||||
s_bin.open(data, s.length);
|
||||
object_database_classic_read_inner(this, s_bin);
|
||||
free(data);
|
||||
}
|
||||
io_free(&s);
|
||||
}
|
||||
free(path_bin);
|
||||
}
|
||||
@@ -105,10 +100,9 @@ void object_database::read(const wchar_t* path, bool modern) {
|
||||
st.read(path_osi);
|
||||
if (st.header.signature == reverse_endianness_uint32_t('MOSI')) {
|
||||
stream s_mosi;
|
||||
io_open(&s_mosi, &st.data);
|
||||
s_mosi.open(st.data);
|
||||
s_mosi.is_big_endian = st.header.use_big_endian;
|
||||
object_database_modern_read_inner(this, &s_mosi, st.header.length);
|
||||
io_free(&s_mosi);
|
||||
object_database_modern_read_inner(this, s_mosi, st.header.length);
|
||||
}
|
||||
}
|
||||
free(path_osi);
|
||||
@@ -121,19 +115,17 @@ void object_database::read(const void* data, size_t size, bool modern) {
|
||||
|
||||
if (!modern) {
|
||||
stream s;
|
||||
io_open(&s, data, size);
|
||||
object_database_classic_read_inner(this, &s);
|
||||
io_free(&s);
|
||||
s.open(data, size);
|
||||
object_database_classic_read_inner(this, s);
|
||||
}
|
||||
else {
|
||||
f2_struct st;
|
||||
st.read(data, size);
|
||||
if (st.header.signature == reverse_endianness_uint32_t('MOSI')) {
|
||||
stream s_mosi;
|
||||
io_open(&s_mosi, &st.data);
|
||||
s_mosi.open(st.data);
|
||||
s_mosi.is_big_endian = st.header.use_big_endian;
|
||||
object_database_modern_read_inner(this, &s_mosi, st.header.length);
|
||||
io_free(&s_mosi);
|
||||
object_database_modern_read_inner(this, s_mosi, st.header.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,19 +137,17 @@ void object_database::write(const char* path) {
|
||||
if (!modern) {
|
||||
char* path_bin = str_utils_add(path, ".bin");
|
||||
stream s;
|
||||
io_open(&s, path_bin, "wb");
|
||||
s.open(path_bin, "wb");
|
||||
if (s.io.stream)
|
||||
object_database_classic_write_inner(this, &s);
|
||||
io_free(&s);
|
||||
object_database_classic_write_inner(this, s);
|
||||
free(path_bin);
|
||||
}
|
||||
else {
|
||||
char* path_osi = str_utils_add(path, ".osi");
|
||||
stream s;
|
||||
io_open(&s, path_osi, "wb");
|
||||
s.open(path_osi, "wb");
|
||||
if (s.io.stream)
|
||||
object_database_modern_write_inner(this, &s);
|
||||
io_free(&s);
|
||||
object_database_modern_write_inner(this, s);
|
||||
free(path_osi);
|
||||
}
|
||||
}
|
||||
@@ -169,19 +159,17 @@ void object_database::write(const wchar_t* path) {
|
||||
if (!modern) {
|
||||
wchar_t* path_bin = str_utils_add(path, L".bin");
|
||||
stream s;
|
||||
io_open(&s, path_bin, L"wb");
|
||||
s.open(path_bin, L"wb");
|
||||
if (s.io.stream)
|
||||
object_database_classic_write_inner(this, &s);
|
||||
io_free(&s);
|
||||
object_database_classic_write_inner(this, s);
|
||||
free(path_bin);
|
||||
}
|
||||
else {
|
||||
wchar_t* path_osi = str_utils_add(path, L".osi");
|
||||
stream s;
|
||||
io_open(&s, path_osi, L"wb");
|
||||
s.open(path_osi, L"wb");
|
||||
if (s.io.stream)
|
||||
object_database_modern_write_inner(this, &s);
|
||||
io_free(&s);
|
||||
object_database_modern_write_inner(this, s);
|
||||
free(path_osi);
|
||||
}
|
||||
}
|
||||
@@ -191,14 +179,13 @@ void object_database::write(void** data, size_t* size) {
|
||||
return;
|
||||
|
||||
stream s;
|
||||
io_open(&s);
|
||||
s.open();
|
||||
if (!modern)
|
||||
object_database_classic_write_inner(this, &s);
|
||||
object_database_classic_write_inner(this, s);
|
||||
else
|
||||
object_database_modern_write_inner(this, &s);
|
||||
io_align_write(&s, 0x10);
|
||||
io_copy(&s, data, size);
|
||||
io_free(&s);
|
||||
object_database_modern_write_inner(this, s);
|
||||
s.align_write(0x10);
|
||||
s.copy(data, size);
|
||||
}
|
||||
|
||||
void object_database::merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db) {
|
||||
@@ -423,38 +410,34 @@ object_info_data::~object_info_data() {
|
||||
|
||||
}
|
||||
|
||||
static void object_database_classic_read_inner(object_database* obj_db, stream* s) {
|
||||
uint32_t object_set_count = io_read_uint32_t(s);
|
||||
uint32_t max_object_set_id = io_read_uint32_t(s);
|
||||
uint32_t object_sets_offset = io_read_uint32_t(s);
|
||||
uint32_t object_count = io_read_uint32_t(s);
|
||||
uint32_t objects_offset = io_read_uint32_t(s);
|
||||
static void object_database_classic_read_inner(object_database* obj_db, stream& s) {
|
||||
uint32_t object_set_count = s.read_uint32_t();
|
||||
uint32_t max_object_set_id = s.read_uint32_t();
|
||||
uint32_t object_sets_offset = s.read_uint32_t();
|
||||
uint32_t object_count = s.read_uint32_t();
|
||||
uint32_t objects_offset = s.read_uint32_t();
|
||||
|
||||
obj_db->object_set.resize(object_set_count);
|
||||
|
||||
io_position_push(s, object_sets_offset, SEEK_SET);
|
||||
s.position_push(object_sets_offset, SEEK_SET);
|
||||
for (uint32_t i = 0; i < object_set_count; i++) {
|
||||
object_set_info* set_info = &obj_db->object_set[i];
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_uint32_t(s), &set_info->name);
|
||||
set_info->name = s.read_string_null_terminated_offset(s.read_uint32_t());
|
||||
set_info->name_hash = hash_string_murmurhash(&set_info->name);
|
||||
set_info->id = io_read_uint32_t(s);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_uint32_t(s), &set_info->object_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_uint32_t(s), &set_info->texture_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_uint32_t(s), &set_info->archive_file_name);
|
||||
io_read(s, 0x10);
|
||||
set_info->id = s.read_uint32_t();
|
||||
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
|
||||
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
|
||||
set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
|
||||
s.read(0x10);
|
||||
}
|
||||
io_position_pop(s);
|
||||
s.position_pop();
|
||||
|
||||
io_position_push(s, objects_offset, SEEK_SET);
|
||||
s.position_push(objects_offset, SEEK_SET);
|
||||
for (uint32_t i = 0; i < object_count; i++) {
|
||||
object_info_data info;
|
||||
info.id = io_read_uint16_t(s);
|
||||
uint32_t set_id = io_read_uint16_t(s);
|
||||
io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &info.name);
|
||||
info.id = s.read_uint16_t();
|
||||
uint32_t set_id = s.read_uint16_t();
|
||||
info.name = s.read_string_null_terminated_offset(s.read_uint32_t());
|
||||
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
|
||||
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
|
||||
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
|
||||
@@ -470,23 +453,23 @@ static void object_database_classic_read_inner(object_database* obj_db, stream*
|
||||
break;
|
||||
}
|
||||
}
|
||||
io_position_pop(s);
|
||||
s.position_pop();
|
||||
|
||||
obj_db->is_x = false;
|
||||
obj_db->modern = false;
|
||||
obj_db->ready = true;
|
||||
}
|
||||
|
||||
static void object_database_classic_write_inner(object_database* obj_db, stream* s) {
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_write_uint32_t(s, 0x90669066);
|
||||
io_align_write(s, 0x20);
|
||||
static void object_database_classic_write_inner(object_database* obj_db, stream& s) {
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.write_uint32_t(0x90669066);
|
||||
s.align_write(0x20);
|
||||
|
||||
uint32_t object_set_count = (uint32_t)obj_db->object_set.size();
|
||||
|
||||
@@ -500,25 +483,25 @@ static void object_database_classic_write_inner(object_database* obj_db, stream*
|
||||
int64_t objects_offset = 0;
|
||||
if (string_offsets.size()) {
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
string_offsets.push_back(io_get_position(s));
|
||||
io_write_string_null_terminated(s, &i.name);
|
||||
string_offsets.push_back(io_get_position(s));
|
||||
io_write_string_null_terminated(s, &i.object_file_name);
|
||||
string_offsets.push_back(io_get_position(s));
|
||||
io_write_string_null_terminated(s, &i.texture_file_name);
|
||||
string_offsets.push_back(io_get_position(s));
|
||||
io_write_string_null_terminated(s, &i.archive_file_name);
|
||||
string_offsets.push_back(s.get_position());
|
||||
s.write_string_null_terminated(i.name);
|
||||
string_offsets.push_back(s.get_position());
|
||||
s.write_string_null_terminated(i.object_file_name);
|
||||
string_offsets.push_back(s.get_position());
|
||||
s.write_string_null_terminated(i.texture_file_name);
|
||||
string_offsets.push_back(s.get_position());
|
||||
s.write_string_null_terminated(i.archive_file_name);
|
||||
}
|
||||
io_align_write(s, 0x20);
|
||||
s.align_write(0x20);
|
||||
|
||||
object_sets_offset = io_get_position(s);
|
||||
object_sets_offset = s.get_position();
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]);
|
||||
io_write_uint32_t(s, i.id);
|
||||
io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]);
|
||||
io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]);
|
||||
io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]);
|
||||
io_write(s, 0x10);
|
||||
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
|
||||
s.write_uint32_t(i.id);
|
||||
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
|
||||
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
|
||||
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
|
||||
s.write(0x10);
|
||||
if (max_object_set_id < i.id)
|
||||
max_object_set_id = i.id;
|
||||
object_count += (uint32_t)i.object.size();
|
||||
@@ -529,93 +512,85 @@ static void object_database_classic_write_inner(object_database* obj_db, stream*
|
||||
|
||||
for (object_set_info& i : obj_db->object_set)
|
||||
for (object_info_data& j : i.object) {
|
||||
string_offsets.push_back(io_get_position(s));
|
||||
io_write_string_null_terminated(s, &j.name);
|
||||
string_offsets.push_back(s.get_position());
|
||||
s.write_string_null_terminated(j.name);
|
||||
}
|
||||
io_align_write(s, 0x20);
|
||||
s.align_write(0x20);
|
||||
|
||||
objects_offset = io_get_position(s);
|
||||
objects_offset = s.get_position();
|
||||
off_idx = 0;
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
uint16_t set_id = (uint16_t)i.id;
|
||||
for (object_info_data& j : i.object) {
|
||||
io_write_uint16_t(s, (uint16_t)j.id);
|
||||
io_write_uint16_t(s, set_id);
|
||||
io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]);
|
||||
s.write_uint16_t((uint16_t)j.id);
|
||||
s.write_uint16_t(set_id);
|
||||
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
|
||||
}
|
||||
}
|
||||
io_align_write(s, 0x20);
|
||||
s.align_write(0x20);
|
||||
}
|
||||
|
||||
io_position_push(s, 0x00, SEEK_SET);
|
||||
io_write_uint32_t(s, object_set_count);
|
||||
io_write_uint32_t(s, max_object_set_id);
|
||||
io_write_uint32_t(s, (uint32_t)object_sets_offset);
|
||||
io_write_uint32_t(s, object_count);
|
||||
io_write_uint32_t(s, (uint32_t)objects_offset);
|
||||
io_write(s, 0x08);
|
||||
io_position_pop(s);
|
||||
s.position_push(0x00, SEEK_SET);
|
||||
s.write_uint32_t(object_set_count);
|
||||
s.write_uint32_t(max_object_set_id);
|
||||
s.write_uint32_t((uint32_t)object_sets_offset);
|
||||
s.write_uint32_t(object_count);
|
||||
s.write_uint32_t((uint32_t)objects_offset);
|
||||
s.write(0x08);
|
||||
s.position_pop();
|
||||
}
|
||||
|
||||
static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length) {
|
||||
static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length) {
|
||||
bool is_x = true;
|
||||
|
||||
io_set_position(s, 0x0C, SEEK_SET);
|
||||
is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0;
|
||||
io_set_position(s, 0x14, SEEK_SET);
|
||||
is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0;
|
||||
s.set_position(0x0C, SEEK_SET);
|
||||
is_x &= s.read_uint32_t_reverse_endianness() == 0;
|
||||
s.set_position(0x14, SEEK_SET);
|
||||
is_x &= s.read_uint32_t_reverse_endianness() == 0;
|
||||
|
||||
io_set_position(s, 0x00, SEEK_SET);
|
||||
s.set_position(0x00, SEEK_SET);
|
||||
|
||||
io_read_uint32_t_stream_reverse_endianness(s);
|
||||
uint32_t object_set_count = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
uint32_t max_object_set_id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
int64_t object_sets_offset = io_read_offset(s, header_length, is_x);
|
||||
uint32_t object_count = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
int64_t objects_offset = io_read_offset(s, header_length, is_x);
|
||||
s.read_uint32_t_reverse_endianness();
|
||||
uint32_t object_set_count = s.read_uint32_t_reverse_endianness();
|
||||
uint32_t max_object_set_id = s.read_uint32_t_reverse_endianness();
|
||||
int64_t object_sets_offset = s.read_offset(header_length, is_x);
|
||||
uint32_t object_count = s.read_uint32_t_reverse_endianness();
|
||||
int64_t objects_offset = s.read_offset(header_length, is_x);
|
||||
|
||||
obj_db->object_set.resize(object_set_count);
|
||||
|
||||
io_position_push(s, object_sets_offset, SEEK_SET);
|
||||
s.position_push(object_sets_offset, SEEK_SET);
|
||||
if (!is_x)
|
||||
for (uint32_t i = 0; i < object_set_count; i++) {
|
||||
object_set_info* set_info = &obj_db->object_set[i];
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_f2(s, header_length), &set_info->name);
|
||||
set_info->name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
|
||||
set_info->name_hash = hash_string_murmurhash(&set_info->name);
|
||||
set_info->id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_f2(s, header_length), &set_info->object_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_f2(s, header_length), &set_info->texture_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_f2(s, header_length), &set_info->archive_file_name);
|
||||
io_read(s, 0x10);
|
||||
set_info->id = s.read_uint32_t_reverse_endianness();
|
||||
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
|
||||
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
|
||||
set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
|
||||
s.read(0x10);
|
||||
}
|
||||
else
|
||||
for (uint32_t i = 0; i < object_set_count; i++) {
|
||||
object_set_info* set_info = &obj_db->object_set[i];
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_x(s), &set_info->name);
|
||||
set_info->name = s.read_string_null_terminated_offset(s.read_offset_x());
|
||||
set_info->name_hash = hash_string_murmurhash(&set_info->name);
|
||||
set_info->id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_x(s), &set_info->object_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_x(s), &set_info->texture_file_name);
|
||||
io_read_string_null_terminated_offset(s,
|
||||
io_read_offset_x(s), &set_info->archive_file_name);
|
||||
io_read(s, 0x10);
|
||||
set_info->id = s.read_uint32_t_reverse_endianness();
|
||||
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_x());
|
||||
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_x());
|
||||
set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_offset_x());
|
||||
s.read(0x10);
|
||||
}
|
||||
io_position_pop(s);
|
||||
s.position_pop();
|
||||
|
||||
io_position_push(s, objects_offset, SEEK_SET);
|
||||
s.position_push(objects_offset, SEEK_SET);
|
||||
if (!is_x)
|
||||
for (uint32_t i = 0; i < object_count; i++) {
|
||||
object_info_data info;
|
||||
info.id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &info.name);
|
||||
info.id = s.read_uint32_t_reverse_endianness();
|
||||
uint32_t set_id = s.read_uint32_t_reverse_endianness();
|
||||
info.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
|
||||
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
|
||||
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
|
||||
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
|
||||
@@ -629,9 +604,9 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s
|
||||
else
|
||||
for (uint32_t i = 0; i < object_count; i++) {
|
||||
object_info_data info;
|
||||
info.id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s);
|
||||
io_read_string_null_terminated_offset(s, io_read_offset_x(s), &info.name);
|
||||
info.id = s.read_uint32_t_reverse_endianness();
|
||||
uint32_t set_id = s.read_uint32_t_reverse_endianness();
|
||||
info.name = s.read_string_null_terminated_offset(s.read_offset_x());
|
||||
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
|
||||
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
|
||||
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
|
||||
@@ -642,16 +617,16 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s
|
||||
break;
|
||||
}
|
||||
}
|
||||
io_position_pop(s);
|
||||
s.position_pop();
|
||||
|
||||
obj_db->is_x = is_x;
|
||||
obj_db->modern = true;
|
||||
obj_db->ready = true;
|
||||
}
|
||||
|
||||
static void object_database_modern_write_inner(object_database* obj_db, stream* s) {
|
||||
static void object_database_modern_write_inner(object_database* obj_db, stream& s) {
|
||||
stream s_mosi;
|
||||
io_open(&s_mosi);
|
||||
s_mosi.open();
|
||||
uint32_t off;
|
||||
enrs e;
|
||||
enrs_entry ee;
|
||||
@@ -708,21 +683,21 @@ static void object_database_modern_write_inner(object_database* obj_db, stream*
|
||||
off = align_val(off, 0x10);
|
||||
}
|
||||
|
||||
io_write_int32_t(&s_mosi, 0);
|
||||
io_write_int32_t(&s_mosi, 0);
|
||||
io_write_offset(&s_mosi, 0, 0, is_x);
|
||||
io_write_int32_t(&s_mosi, 0);
|
||||
io_write_offset(&s_mosi, 0, 0, is_x);
|
||||
io_write(&s_mosi, 0x08);
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
s_mosi.write_int32_t(0);
|
||||
s_mosi.write_int32_t(0);
|
||||
s_mosi.write_offset(0, 0, is_x);
|
||||
s_mosi.write_int32_t(0);
|
||||
s_mosi.write_offset(0, 0, is_x);
|
||||
s_mosi.write(0x08);
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
int64_t object_sets_offset = io_get_position(&s_mosi);
|
||||
io_write(&s_mosi, object_set_count * (is_x ? 0x38ULL : 0x24ULL));
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
int64_t object_sets_offset = s_mosi.get_position();
|
||||
s_mosi.write(object_set_count * (is_x ? 0x38ULL : 0x24ULL));
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
int64_t objects_offset = io_get_position(&s_mosi);
|
||||
io_write(&s_mosi, object_count * (is_x ? 0x10ULL : 0x0CULL));
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
int64_t objects_offset = s_mosi.get_position();
|
||||
s_mosi.write(object_count * (is_x ? 0x10ULL : 0x0CULL));
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
std::vector<std::string> strings;
|
||||
std::vector<int64_t> string_offsets;
|
||||
@@ -741,56 +716,56 @@ static void object_database_modern_write_inner(object_database* obj_db, stream*
|
||||
quicksort_string(strings.data(), strings.size());
|
||||
string_offsets.reserve(strings.size());
|
||||
for (std::string& i : strings) {
|
||||
string_offsets.push_back(io_get_position(&s_mosi));
|
||||
io_write_string_null_terminated(&s_mosi, &i);
|
||||
string_offsets.push_back(s_mosi.get_position());
|
||||
s_mosi.write_string_null_terminated(i);
|
||||
}
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
io_position_push(&s_mosi, 0x00, SEEK_SET);
|
||||
io_write_uint32_t(&s_mosi, 0);
|
||||
io_write_uint32_t(&s_mosi, object_set_count);
|
||||
io_write_uint32_t(&s_mosi, 0);
|
||||
io_write_offset_pof_add(&s_mosi, object_sets_offset, 0x20, is_x, &pof);
|
||||
io_write_uint32_t(&s_mosi, object_count);
|
||||
io_write_offset_pof_add(&s_mosi, objects_offset, 0x20, is_x, &pof);
|
||||
io_write(&s_mosi, 0x08);
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
s_mosi.position_push(0x00, SEEK_SET);
|
||||
s_mosi.write_uint32_t(0);
|
||||
s_mosi.write_uint32_t(object_set_count);
|
||||
s_mosi.write_uint32_t(0);
|
||||
io_write_offset_pof_add(s_mosi, object_sets_offset, 0x20, is_x, &pof);
|
||||
s_mosi.write_uint32_t(object_count);
|
||||
io_write_offset_pof_add(s_mosi, objects_offset, 0x20, is_x, &pof);
|
||||
s_mosi.write(0x08);
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
if (!is_x)
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.name), 0x20, &pof);
|
||||
io_write_uint32_t(&s_mosi, i.id);
|
||||
io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
s_mosi.write_uint32_t(i.id);
|
||||
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.object_file_name), 0x20, &pof);
|
||||
io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.texture_file_name), 0x20, &pof);
|
||||
io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.archive_file_name), 0x20, &pof);
|
||||
io_write(&s_mosi, 0x10);
|
||||
s_mosi.write(0x10);
|
||||
}
|
||||
else
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.name), &pof);
|
||||
io_write_uint32_t(&s_mosi, i.id);
|
||||
io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
s_mosi.write_uint32_t(i.id);
|
||||
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.object_file_name), &pof);
|
||||
io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.texture_file_name), &pof);
|
||||
io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, i.archive_file_name), &pof);
|
||||
io_write(&s_mosi, 0x10);
|
||||
s_mosi.write(0x10);
|
||||
}
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
s_mosi.align_write(0x10);
|
||||
|
||||
if (!is_x)
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
uint32_t set_id = i.id;
|
||||
for (object_info_data& j : i.object) {
|
||||
io_write_uint32_t(&s_mosi, j.id);
|
||||
io_write_uint32_t(&s_mosi, set_id);
|
||||
io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
s_mosi.write_uint32_t(j.id);
|
||||
s_mosi.write_uint32_t(set_id);
|
||||
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, j.name), 0x20, &pof);
|
||||
}
|
||||
}
|
||||
@@ -798,18 +773,18 @@ static void object_database_modern_write_inner(object_database* obj_db, stream*
|
||||
for (object_set_info& i : obj_db->object_set) {
|
||||
uint32_t set_id = i.id;
|
||||
for (object_info_data& j : i.object) {
|
||||
io_write_uint32_t(&s_mosi, j.id);
|
||||
io_write_uint32_t(&s_mosi, set_id);
|
||||
io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings,
|
||||
s_mosi.write_uint32_t(j.id);
|
||||
s_mosi.write_uint32_t(set_id);
|
||||
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
|
||||
string_offsets, j.name), &pof);
|
||||
}
|
||||
}
|
||||
io_position_pop(&s_mosi);
|
||||
s_mosi.position_pop();
|
||||
|
||||
f2_struct st;
|
||||
io_align_write(&s_mosi, 0x10);
|
||||
io_copy(&s_mosi, &st.data);
|
||||
io_free(&s_mosi);
|
||||
s_mosi.align_write(0x10);
|
||||
s_mosi.copy(st.data);
|
||||
s_mosi.close();
|
||||
|
||||
st.enrs = e;
|
||||
st.pof = pof;
|
||||
|
||||
Reference in New Issue
Block a user