Skip to content

Commit

Permalink
Merge pull request #285 from chaoticgd/unpacker_bugs
Browse files Browse the repository at this point in the history
Fix some unpacker bugs
  • Loading branch information
chaoticgd authored Jan 7, 2025
2 parents 1dbb1ff + d4bc3f4 commit 1e488dd
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 18 deletions.
4 changes: 2 additions & 2 deletions src/engine/tfrag_high.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

#include <set>

#define MAX_TFACES_TOUCHING_VERTEX 12
#define MAX_TFACES_TOUCHING_VERTEX 16
#define INIT_TFACE_INDICES \
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}

struct TfragFace {
s32 ad_gif;
Expand Down
2 changes: 1 addition & 1 deletion src/iso/iso_unpacker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ static void add_missing_levels_from_filesystem(table_of_contents& toc, const Iso
info.level.emplace();
info.level->header_lba = record.lba;
info.level->file_lba = record.lba;
info.level->file_size = record.size;
info.level->file_size = Sector32::size_from_bytes(record.size);
s32 header_size = iso.read<s32>(record.lba.bytes());
info.level->header = iso.read_multiple<u8>(record.lba.bytes(), header_size);
info.level->prepend_header = false;
Expand Down
23 changes: 8 additions & 15 deletions src/iso/table_of_contents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ static Opt<LevelWadInfo> adapt_rac1_audio_wad_header(InputStream& src, Rac1Amalg
static Opt<LevelWadInfo> adapt_rac1_scene_wad_header(InputStream& src, Rac1AmalgamatedWadHeader& header);
static Sector32 get_lz_size(InputStream& src, Sector32 sector);

static s64 get_rac234_level_table_offset(Buffer src);
static s64 guess_rac234_level_table_offset(Buffer src);

static SectorRange add_sector_range(SectorRange range, Sector32 lsn);
static SectorByteRange add_sector_byte_range(SectorByteRange range, Sector32 lsn);
Expand Down Expand Up @@ -361,15 +361,15 @@ table_of_contents read_table_of_contents_rac234(InputStream& src) {

table_of_contents toc;

s64 level_table_offset = get_rac234_level_table_offset(buffer);
if(level_table_offset == 0x0) {
s64 approximate_level_table_offset = guess_rac234_level_table_offset(buffer);
if(approximate_level_table_offset == 0x0) {
// We've failed to find the level table, at least try to find some of the other tables.
level_table_offset = 0xffff;
approximate_level_table_offset = 0xffff;
}

s64 global_index = 0;
s64 ofs = 0;
while(ofs + 4 * 6 < level_table_offset) {
while(ofs + 4 * 6 < approximate_level_table_offset) {
GlobalWadInfo global;
global.index = global_index++;
global.offset_in_toc = ofs;
Expand All @@ -383,20 +383,13 @@ table_of_contents read_table_of_contents_rac234(InputStream& src) {
ofs += header_size;
}

// This fixes an off-by-one error with R&C3 where since the first entry of
// the level table is supposed to be zeroed out, this code would otherwise
// think that the level table starts 0x18 bytes later than it actually does.
if(ofs + 0x18 == level_table_offset) {
level_table_offset -= 0x18;
}

auto level_table = buffer.read_multiple<toc_level_table_entry>(level_table_offset, TOC_MAX_LEVELS, "level table");
auto level_table = buffer.read_multiple<toc_level_table_entry>(ofs, TOC_MAX_LEVELS, "level table");
for(s32 i = 0; i < TOC_MAX_LEVELS; i++) {
toc_level_table_entry entry = level_table[i];

LevelInfo level;
level.level_table_index = i;
level.level_table_entry_offset = (s32) level_table_offset + i * sizeof(toc_level_table_entry);
level.level_table_entry_offset = (s32) ofs + i * sizeof(toc_level_table_entry);

// The games have the fields in different orders, so we check the type
// of what each field points to so we can support them all.
Expand Down Expand Up @@ -433,7 +426,7 @@ table_of_contents read_table_of_contents_rac234(InputStream& src) {
return toc;
}

static s64 get_rac234_level_table_offset(Buffer src) {
static s64 guess_rac234_level_table_offset(Buffer src) {
// Check that the two next entries are valid. This is necessary to
// get past a false positive in Deadlocked.
for(s64 i = 0; i < src.size() / 4 - 12; i++) {
Expand Down

0 comments on commit 1e488dd

Please sign in to comment.