Open main menu

Difference between revisions of "Auto detection"

3,751 bytes added ,  21:05, 8 April 2006
 
(2 intermediate revisions by the same user not shown)
Line 94: Line 94:


TODO: Finish this
TODO: Finish this
=== Incomplete code snippets ===
The following snippets are sketches. We may end up doing things totally different. It's just a way for me to make visible what goes on in my head right now, and is neither complete nor necessarily the best way to handle things. You have been warned :-)
Random thought: The detector could automatically populate the 'basename' field, too.
In particular, the first use of generateSubstResFileName in Sound::openSfxFile
is used to translate the "basename" of the game; this would be unnecessary if
the basename was already set to the right value.
For regular use (e.g. in ScummEngine::openRoom, and most places where
generateSubstResFileName is currently being used), we could use a new function like this one:
<pre>
Common::String generateFilename(int room, int diskNumber) {
char buf[128];
if (_game.version == 4) {
if (room == 0 || room >= 900) {
sprintf(buf, "%.3d.lfl", room);
} else {
sprintf(buf, "disk%.2d.lec", diskNumber);
}
} else if (_game.heversion >= 98) {
char c;
int disk = 0;
if (_heV7DiskOffsets)
disk = _heV7DiskOffsets[room];
switch(disk) {
case 2:
c = 'b';
break;
case 1:
c = 'a';
break;
default:
c = '0';
}
sprintf(buf, _substEntry.formatStr, c);
} else if (_substEntry.method == kGenDiskNum) {
sprintf(buf, _substEntry.formatStr, diskNumber);
} else if (_substEntry.method == kGenRoomNum) {
sprintf(buf, _substEntry.formatStr, room);
} else {
error("FOO");
}
return buf;
}
</pre>
For detection: We should touch every file at most once (in particular, it would be very bad to compute the MD5 of a file multiple times, since many of our targets aren't exactly fast when it comes to disk I/O speed). So instead of looping over all games, let's loop over the files and then split down into cases. At the same time, squeeze any information we can from the filenames and files.
<pre>
fullCandidateList = ()
FOR filename in files DO
bool filenameKnown = false;
IF length of filename < 4 THEN
NEXT
ENDIF
tempList = ()
IF (filename contains '.' and is at most 8+1+3=12 chars long) THEN
filenameKnown = true;
SWITCH filename {
case 00.MAN
add to tempList:
gameid = Maniac Mansion, platform = ?, language = en, extra = demo
subst pattern = "%02d.MAN", kGenWithRoomNum
case *.sm0
add to tempList:
gameid = Sam & Max, ...
case 00.LFL
look at the file to distinguish between V1, V2/V3OldBundle and V3SH
Then add all possible game variants to tempList
...
case 000.LFL
...
case *.000
...
case *.la0
...
case *.he0
...
case *.d64 // Non-extracted C64
add to tempList:
gameid = Maniac Mansion, platform = C64
OR
gameid = Zak, platform = C64
OR
error
...
default:
filenameKnown = false;
ENDSWITCH
ELSE
// Must be a mac name / long name
IF filename = "Maniac Mansion (*).prg" THEN
add to tempList:
gameid = Maniac Mansion, platform = NES, language = *
ELIF name is in mac container list THEN
...
ELSE
search the generic subst list
...
TODO
...
ENDIF
ENDIF
if filenameKnown then
compute MD5 of the file (we only do this for known filenames to avoid
computing the MD5 of every single file in the directory!)
IF MD5 is found in the table THEN
optionally: perform a sanity check, show if the exact match
  agrees with at least one of our guesses
add this exact match to fullCandidateList
ELSE
add tempList to fullCandidateList
ENDIF
ENDIF
ENDFOR
</pre>


== Standardized descriptions ==
== Standardized descriptions ==
Line 99: Line 229:
   (NAME, PLATFORM, LANGUAGE, EXTRA)
   (NAME, PLATFORM, LANGUAGE, EXTRA)


The game desc then is:
The game desc then is one of the following (which one to use in the end isn't the point of this text!):
   NAME (PLATFORM EXTRA LANGUAGE)
   NAME (PLATFORM EXTRA LANGUAGE)
  NAME (LANGUAGE PLATFORM EXTRA)
  NAME (EXTRA PLATFORM LANGUAGE)
  ...
I'll stick with the first version for now, but it's not set in stone (yet).


Missing/unknown information is left our. So, if none of the extra values are known, the description simply becomes:
Missing/unknown information is left our. So, if none of the extra values are known, the description simply becomes:
1,079

edits