Skip to content

Commit

Permalink
Fix: report & progress bar status respect ROM filters (#532)
Browse files Browse the repository at this point in the history
  • Loading branch information
emmercm authored Jul 29, 2023
1 parent 903acd0 commit 6ed395a
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 120 deletions.
69 changes: 33 additions & 36 deletions src/types/datStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,46 +37,43 @@ export default class DATStatus {
this.dat = dat;

// Un-patched ROMs
// Index ReleaseCandidates by their ROM's hash code
const unpatchedHashCodesToRomsWithInputFiles = [...parentsToReleaseCandidates.values()]
.flatMap((releaseCandidates) => releaseCandidates)
.filter((releaseCandidate) => !releaseCandidate.isPatched())
.reduce((map, releaseCandidate) => {
const romsWithFiles = releaseCandidate.getRomsWithFiles();
for (let i = 0; i < romsWithFiles.length; i += 1) {
map.set(romsWithFiles[i].getRom().hashCode(), releaseCandidate);
}
return map;
}, new Map<string, ReleaseCandidate>());
// For every game in every parent in the DAT:
// Remember the game as "found" if all the Game's ROMs have matching ReleaseCandidates
dat.getParents().forEach((parent) => {
parent.getGames().forEach((game) => {
DATStatus.pushValueIntoMap(this.allRomTypesToGames, game, game);
[...parentsToReleaseCandidates.entries()]
.filter(([, releaseCandidates]) => releaseCandidates.every((rc) => !rc.isPatched()))
.forEach(([parent, releaseCandidates]) => {
parent.getGames().forEach((game) => {
DATStatus.pushValueIntoMap(this.allRomTypesToGames, game, game);

const releaseCandidates = game.getRoms()
.map((rom) => unpatchedHashCodesToRomsWithInputFiles.get(rom.hashCode()))
.filter((releaseCandidate) => releaseCandidate);
if (releaseCandidates.length === game.getRoms().length) {
DATStatus.pushValueIntoMap(
this.foundRomTypesToReleaseCandidates,
game,
// Assume all ROMs had the same ReleaseCandidate
releaseCandidates[0],
);
}
const gameReleaseCandidates = releaseCandidates
.filter((rc) => !rc.isPatched())
.filter((rc) => rc.getGame().hashCode() === game.hashCode());
if (gameReleaseCandidates.length || game.getRoms().length === 0) {
DATStatus.pushValueIntoMap(
this.foundRomTypesToReleaseCandidates,
game,
// The only reason there may be multiple ReleaseCandidates is for multiple regions,
// but DATStatus doesn't care about regions.
gameReleaseCandidates[0],
);
}
});
});
});

// Patched ROMs
[...parentsToReleaseCandidates.values()]
.flatMap((releaseCandidates) => releaseCandidates)
.filter((releaseCandidate) => releaseCandidate.isPatched())
.forEach((releaseCandidate) => {
const game = releaseCandidate.getGame();

DATStatus.append(this.allRomTypesToGames, ROMType.PATCHED, game);
DATStatus.append(this.foundRomTypesToReleaseCandidates, ROMType.PATCHED, releaseCandidate);
[...parentsToReleaseCandidates.entries()]
.filter(([, releaseCandidates]) => releaseCandidates.some((rc) => rc.isPatched()))
.forEach(([, releaseCandidates]) => {
// Patched ROMs
releaseCandidates
.filter((rc) => rc.isPatched())
.forEach((releaseCandidate) => {
const game = releaseCandidate.getGame();
DATStatus.append(this.allRomTypesToGames, ROMType.PATCHED, game);
DATStatus.append(
this.foundRomTypesToReleaseCandidates,
ROMType.PATCHED,
releaseCandidate,
);
});
});
}

Expand Down
8 changes: 8 additions & 0 deletions src/types/logiqx/game.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,14 @@ export default class Game implements GameProps {
.filter((language) => language) as string[];
}

// Pseudo Built-Ins

hashCode(): string {
let hashCode = this.getName();
hashCode += `|${this.getRoms().map((rom) => rom.hashCode()).join(',')}`;
return hashCode;
}

equals(other: Game): boolean {
if (this === other) {
return true;
Expand Down
Loading

0 comments on commit 6ed395a

Please sign in to comment.