move VMS structure into SaveFileFormats
This commit is contained in:
@@ -184,45 +184,6 @@ string find_seed_and_decrypt_download_quest_data_section(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PSOVMSFileHeader {
|
|
||||||
ptext<char, 0x10> short_desc; // "PSO/DOWNLOAD " or "PSOV2/DOWNLOAD "
|
|
||||||
ptext<char, 0x20> long_desc; // Usually quest name
|
|
||||||
ptext<char, 0x10> creator_id;
|
|
||||||
le_uint16_t num_icons;
|
|
||||||
le_uint16_t animation_speed;
|
|
||||||
le_uint16_t eyecatch_type;
|
|
||||||
le_uint16_t crc;
|
|
||||||
le_uint32_t data_size; // Not including header and icons
|
|
||||||
parray<uint8_t, 0x14> unused;
|
|
||||||
parray<le_uint16_t, 0x10> icon_palette;
|
|
||||||
|
|
||||||
// Variable-length field follows here:
|
|
||||||
// parray<parray<uint8_t, 0x200>, num_icons> icon;
|
|
||||||
|
|
||||||
bool checksum_correct() const {
|
|
||||||
auto add_data = +[](const void* data, size_t size, uint16_t crc) -> uint16_t {
|
|
||||||
const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data);
|
|
||||||
for (size_t z = 0; z < size; z++) {
|
|
||||||
crc ^= (static_cast<uint16_t>(bytes[z]) << 8);
|
|
||||||
for (uint8_t bit = 0; bit < 8; bit++) {
|
|
||||||
if (crc & 0x8000) {
|
|
||||||
crc = (crc << 1) ^ 0x1021;
|
|
||||||
} else {
|
|
||||||
crc = (crc << 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return crc;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint16_t crc = add_data(this, offsetof(PSOVMSFileHeader, crc), 0);
|
|
||||||
crc = add_data("\0\0", 2, crc);
|
|
||||||
crc = add_data(&this->data_size,
|
|
||||||
sizeof(PSOVMSFileHeader) - offsetof(PSOVMSFileHeader, data_size) + this->num_icons * 0x200 + this->data_size, crc);
|
|
||||||
return (crc == this->crc);
|
|
||||||
}
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct PSODownloadQuestHeader {
|
struct PSODownloadQuestHeader {
|
||||||
le_uint32_t size;
|
le_uint32_t size;
|
||||||
le_uint32_t encryption_seed;
|
le_uint32_t encryption_seed;
|
||||||
|
|||||||
@@ -46,6 +46,29 @@ void ShuffleTables::shuffle(void* vdest, const void* vsrc, size_t size, bool rev
|
|||||||
memcpy(&dest[size & 0xFFFFFF00], &src[size & 0xFFFFFF00], size & 0xFF);
|
memcpy(&dest[size & 0xFFFFFF00], &src[size & 0xFFFFFF00], size & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PSOVMSFileHeader::checksum_correct() const {
|
||||||
|
auto add_data = +[](const void* data, size_t size, uint16_t crc) -> uint16_t {
|
||||||
|
const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data);
|
||||||
|
for (size_t z = 0; z < size; z++) {
|
||||||
|
crc ^= (static_cast<uint16_t>(bytes[z]) << 8);
|
||||||
|
for (uint8_t bit = 0; bit < 8; bit++) {
|
||||||
|
if (crc & 0x8000) {
|
||||||
|
crc = (crc << 1) ^ 0x1021;
|
||||||
|
} else {
|
||||||
|
crc = (crc << 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t crc = add_data(this, offsetof(PSOVMSFileHeader, crc), 0);
|
||||||
|
crc = add_data("\0\0", 2, crc);
|
||||||
|
crc = add_data(&this->data_size,
|
||||||
|
sizeof(PSOVMSFileHeader) - offsetof(PSOVMSFileHeader, data_size) + this->num_icons * 0x200 + this->data_size, crc);
|
||||||
|
return (crc == this->crc);
|
||||||
|
}
|
||||||
|
|
||||||
bool PSOGCIFileHeader::checksum_correct() const {
|
bool PSOGCIFileHeader::checksum_correct() const {
|
||||||
uint32_t cs = crc32(&this->game_name, this->game_name.bytes());
|
uint32_t cs = crc32(&this->game_name, this->game_name.bytes());
|
||||||
cs = crc32(&this->embedded_seed, sizeof(this->embedded_seed), cs);
|
cs = crc32(&this->embedded_seed, sizeof(this->embedded_seed), cs);
|
||||||
|
|||||||
@@ -25,6 +25,23 @@ struct ShuffleTables {
|
|||||||
void shuffle(void* vdest, const void* vsrc, size_t size, bool reverse) const;
|
void shuffle(void* vdest, const void* vsrc, size_t size, bool reverse) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PSOVMSFileHeader {
|
||||||
|
/* 0000 */ ptext<char, 0x10> short_desc;
|
||||||
|
/* 0010 */ ptext<char, 0x20> long_desc;
|
||||||
|
/* 0030 */ ptext<char, 0x10> creator_id;
|
||||||
|
/* 0040 */ le_uint16_t num_icons;
|
||||||
|
/* 0042 */ le_uint16_t animation_speed;
|
||||||
|
/* 0044 */ le_uint16_t eyecatch_type;
|
||||||
|
/* 0046 */ le_uint16_t crc;
|
||||||
|
/* 0048 */ le_uint32_t data_size; // Not including header and icons
|
||||||
|
/* 004C */ parray<uint8_t, 0x14> unused;
|
||||||
|
/* 0060 */ parray<le_uint16_t, 0x10> icon_palette;
|
||||||
|
// Variable-length field:
|
||||||
|
/* 0080 */ // parray<uint8_t, num_icons> icon;
|
||||||
|
|
||||||
|
bool checksum_correct() const;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct PSOGCIFileHeader {
|
struct PSOGCIFileHeader {
|
||||||
// Every PSOGC save file begins with a PSOGCIFileHeader. The first 0x40 bytes
|
// Every PSOGC save file begins with a PSOGCIFileHeader. The first 0x40 bytes
|
||||||
// of this structure are the .gci file header; the remaining bytes after that
|
// of this structure are the .gci file header; the remaining bytes after that
|
||||||
|
|||||||
Reference in New Issue
Block a user