diff options
author | Filippos Karapetis | 2009-02-18 09:09:37 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-02-18 09:09:37 +0000 |
commit | 056a13f7102f636687eb6ac2a8f4463fa8cec11d (patch) | |
tree | 8c1b20b6948ffe9a4cf7322f8048acd35e7ef249 /engines/sci/scicore | |
parent | f51990a3de8fb88173898c4bc5b1ed2ac582c751 (diff) | |
download | scummvm-rg350-056a13f7102f636687eb6ac2a8f4463fa8cec11d.tar.gz scummvm-rg350-056a13f7102f636687eb6ac2a8f4463fa8cec11d.tar.bz2 scummvm-rg350-056a13f7102f636687eb6ac2a8f4463fa8cec11d.zip |
Moved game version checking to ScummVM's detector and removed the FreeSCI version checking routines
svn-id: r38458
Diffstat (limited to 'engines/sci/scicore')
-rw-r--r-- | engines/sci/scicore/games.h | 125 | ||||
-rw-r--r-- | engines/sci/scicore/versions.cpp | 272 |
2 files changed, 0 insertions, 397 deletions
diff --git a/engines/sci/scicore/games.h b/engines/sci/scicore/games.h deleted file mode 100644 index c2c9f5fa05..0000000000 --- a/engines/sci/scicore/games.h +++ /dev/null @@ -1,125 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Game identification */ - -#ifndef _SCI_GAMES_H_ -#define _SCI_GAMES_H_ - -#ifndef NEED_SCI_VERSIONS -# error "You shouldn't be including this header file." -#endif - -#include "sci/include/versions.h" - -typedef struct _sci_game { - int id; /* currently CRC of resource.001 */ - int res_version; - sci_version_t version; - const char *name; -} sci_game_t; - -/* Interpreter versions for Amiga and Atari ST ports are tentative */ -sci_game_t sci_games[] = { - { 0x5D451535, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "Leisure Suit Larry 1 v1.0-mac"}, /* x.yyy.zzz */ /* Launcher says v2.0, game crashes on DoAvoider */ - { 0x6C176EE0, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 577), "Leisure Suit Larry 1 v2.1"}, - { 0x1C36E076, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "Leisure Suit Larry 1 v1.000-es"}, /* 1.SQ4.057 */ /* Crashes on function 0x7b */ - - { 0xFEAB629D, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 343), "Leisure Suit Larry 2 v1.000.011-3.5"}, - { 0x13DD3CD2, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 343), "Leisure Suit Larry 2 v1.000.011-5.25" }, - { 0x1D0F3B31, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 2 v1.001.006-st"}, /* 1.000.159 */ - { 0x40BEC726, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 409), "Leisure Suit Larry 2 v1.002.000-3.5"}, - { 0x0C848403, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 409), "Leisure Suit Larry 2 v1.002.000-5.25" }, - { 0x7E9CF339, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 2 v1.003-ami"}, /* x.yyy.zzz */ - - { 0x06D737B5, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 3 v1.003-3.5" }, - { 0xE0A1C352, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 3 v1.003-5.25" }, - { 0xC48FE83A, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 3 v1.021-3.5" }, - { 0x484587DD, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 3 v1.021-5.25"}, - /* { 0x????????, SCI_VERSION_AUTODETECT, SCI_VERSION(0,000,572), "Leisure Suit Larry 3 v1.021-st"},*/ /* 1.002.026 */ - { 0x6348030A, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Leisure Suit Larry 3 v1.039-ami"}, /* 1.002.032 */ - - { 0x94EA377B, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "CB1" }, - { 0xFD9EE7BD, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "Camelot" }, - { 0x2829987F, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "Camelot" }, - { 0x980CEAD3, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 629), "Demo Quest" }, - { 0x3DB972CA, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Hoyle 2" }, - { 0xC0B37651, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "Iceman" }, - { 0xDABA6B8A, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 999), "KQ1 v1.000.051-3.5" }, /* S.old.010 */ - { 0x270E37F3, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 274), "KQ4" }, - { 0x685F1205, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 502), "KQ4" }, - { 0xC14E3A2A, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 395), "PQ2" }, - { 0x4BD66036, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 490), "PQ2" }, - { 0x7132D6D8, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 629), "QfG1" }, - { 0xF8F4913F, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "SQ3" }, - { 0x34FBC324, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 999), "SQ3/DE" }, /* S.old.114 */ - { 0xE4A3234D, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 506), "Fun Seekers Guide v1.02"}, - { 0x85AFE241, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 519), "Hoyle 1 v1.000.104"}, - { 0xE0E070C3, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 572), "Hoyle 2 v1.000.011"}, - { 0xD0B8794E, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 668), "Iceman v1.023"}, - { 0x94EA377B, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 631), "The Colonel's Bequest v1.000.046"}, - { 0x28543FDF, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 453), "Astro Chicken"}, - { 0x31F46F7D, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 453), "Space Quest III v1.0V int"}, - { 0xAA2C94B9, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 685), "Mixed-Up Mother Goose v1.011 Int.#8.2.90"}, - { 0x3B15678B, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 631), "The Colonel's Bequest v1.000.046-3.5"}, - { 0x0E042F46, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 530), "Hoyle 1 v1.000.113-3.5"}, - { 0x1EACB959, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 566), "HQ v1.000-5.25"}, - { 0x2BEAF5E7, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 566), "HQ v1.001-5.25"}, - { 0x63626D3E, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 668), "Iceman v1.023-5.25"}, - { 0xDA5E7B7D, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 409), "KQ4 v1.003.006-3.5"}, - { 0x376A5472, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 502), "KQ4 v1.006.003-5.25"}, - { 0x364B40B2, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 395), "PQ2 v1.001.000-5.25"}, - { 0x664B4123, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 409), "PQ2 v1.001.006-3.5"}, - { 0x379F4582, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 453), "SQ3 v1.0V-5.25"}, - { 0x04B0B081, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 294), "xmascard v1.04"}, - - { 0x4447B28D, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 72), "Trial v1.105"}, - - { 0xB1C2CCAE, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 200), "SQ4 v1.052"}, /* 1.000.753 */ - { 0xAA6AF6A9, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 60), "KQ5 v0.000.062"}, - { 0x092C2C0D, 3, SCI_VERSION(1, 000, 172), "jones v1.000.060"}, /* x.yyy.zzz */ - - { 0xC415A485, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 172), "jones v1.000.060-cd"}, /* x.yyy.zzz */ - - { 0x89C595E3, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "SQ1 v2.000"}, /* T.A00.081 */ - { 0x09D4FC54, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "LSL5 v1.000"}, /* T.A00.169 */ - { 0xF3ED1D81, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "PQ3 v1.00"}, /* T.A00.178 */ - { 0x501B5E6B, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "Brain v1.000"}, /* 1.000.044 */ - { 0xB1B7279B, SCI_VERSION_AUTODETECT, SCI_VERSION(1, 000, 510), "Longbow v1.000"}, /* 1.000.168 */ - - { 0x82595EBE, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 453), "SQ3 v1.0V-ami"}, /* x.yyy.zzz */ - { 0xF6080B61, SCI_VERSION_AUTODETECT, SCI_VERSION(0, 000, 530), "Hoyle 1 v1.000.139-ami"}, /* x.yyy.zzz */ - - { 0x8AFEA2D0, 2, SCI_VERSION(1, 000, 000), "KQ1 v1.000.054-ami"}, /* 1.003.007 */ - - /* Undetermined Amiga versions: */ - /* { 0x8AE5F854, ?, SCI_VERSION(), "ARTHUR" }, */ - /* { 0x9FB7015B, ?, SCI_VERSION(), "CB1" }, */ - /* { 0x560CEDD5, ?, SCI_VERSION(), "iceMan" }, */ - - { 0, 0, 0, NULL } /* terminator */ -}; - -#endif /* _SCI_GAMES_H_ */ diff --git a/engines/sci/scicore/versions.cpp b/engines/sci/scicore/versions.cpp index 06a1c1b431..84fc35efe3 100644 --- a/engines/sci/scicore/versions.cpp +++ b/engines/sci/scicore/versions.cpp @@ -27,182 +27,8 @@ #include "sci/include/versions.h" #include "sci/include/engine.h" #include "sci/include/resource.h" -#include "sci/scicore/games.h" #include "sci/scicore/exe.h" -/* Maxmimum number of bytes to hash from start of file */ -#define VERSION_DETECT_HASH_SIZE 1000000 - -#define VERSION_DETECT_BUF_SIZE 4096 - -static int -scan_file(char *filename, sci_version_t *version) { - char buf[VERSION_DETECT_BUF_SIZE]; - char result_string[10]; /* string-encoded result, copied from buf */ - int characters_left; - int state = 0; - /* 'state' encodes how far we have matched the version pattern - ** "n.nnn.nnn" - ** - ** n.nnn.nnn - ** 0123456789 - ** - ** Since we cannot be certain that the pattern does not begin with an - ** alphanumeric character, some states are ambiguous. - ** The pattern is expected to be terminated with a non-alphanumeric - ** character. - */ - - exe_file_t *f = exe_open(filename); - - if (!f) - return 1; - - do { - int i; - int accept; - - characters_left = exe_read(f, buf, VERSION_DETECT_BUF_SIZE); - - for (i = 0; i < characters_left; i++) { - const char ch = buf[i]; - accept = 0; /* By default, we don't like this character */ - - if (isalnum((unsigned char) ch)) { - accept = (state != 1 - && state != 5 - && state != 9); - } else if (ch == '.') { - accept = (state == 1 - || state == 5); - } else if (state == 9) { - result_string[9] = 0; /* terminate string */ - - if (!version_parse(result_string, version)) { - exe_close(f); - return 0; /* success! */ - } - - /* Continue searching. */ - } - - if (accept) - result_string[state++] = ch; - else - state = 0; - - } - - } while (characters_left == VERSION_DETECT_BUF_SIZE); - - exe_close(f); - return 1; /* failure */ -} - -static guint32 -read_uint32(byte *data) { - return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; -} - -static guint16 -read_uint16(byte *data) { - return (data[0] << 8) | data[1]; -} - -static int -is_mac_exe(char *filename) { - FILE *file; - byte buf[4]; - guint32 val; - unsigned int i; - - /* Mac executables have no extension */ - if (strchr(filename, '.')) - return 0; - - file = fopen(filename, "rb"); - if (!file) - return 0; - - if (fseek(file, 4, SEEK_SET) == -1) { - fclose(file); - return 0; - } - - /* Read resource map offset */ - if (fread(buf, 1, 4, file) < 4) { - fclose(file); - return 0; - } - - val = read_uint32(buf); - - if (fseek(file, val + 28, SEEK_SET) == -1) { - fclose(file); - return 0; - } - - /* Read number of types in map */ - if (fread(buf, 1, 2, file) < 2) { - fclose(file); - return 0; - } - - val = read_uint16(buf) + 1; - - for (i = 0; i < val; i++) { - if (fread(buf, 1, 4, file) < 4) { - fclose(file); - return 0; - } - - /* Look for executable code */ - if (!memcmp(buf, "CODE", 4)) { - fclose(file); - return 1; - } - - /* Skip to next list entry */ - if (fseek(file, 4, SEEK_CUR) == -1) { - fclose(file); - return 0; - } - } - - fclose(file); - return 0; -} - -static int -is_exe(char *filename) { - FILE *file; - char buf[4]; - unsigned char header[] = {0x00, 0x00, 0x03, 0xf3}; - - /* PC and Atari ST executable extensions */ - if (strstr(filename, ".exe") || strstr(filename, ".EXE") - || strstr(filename, ".prg") || strstr(filename, ".PRG")) - return 1; - - /* Check for Amiga executable */ - if (strchr(filename, '.')) - return 0; - - file = fopen(filename, "rb"); - if (!file) - return 0; - - if (fread(buf, 1, 4, file) < 4) { - fclose(file); - return 0; - } - - fclose(file); - - /* Check header bytes */ - return memcmp(buf, header, 4) == 0; -} - void version_require_earlier_than(state_t *s, sci_version_t version) { if (s->version_lock_flag) @@ -258,102 +84,4 @@ version_parse(const char *vn, sci_version_t *result) { return 0; } -int -version_detect_from_executable(sci_version_t *result) { - sci_dir_t dir; - char *filename; - int mac = 0; - - /* For Mac versions we need to search the resource fork */ - mac = !chdir(".rsrc"); - - sci_init_dir(&dir); - - filename = sci_find_first(&dir, "*"); - - while (filename) { - if (mac ? is_mac_exe(filename) : is_exe(filename)) - if (!scan_file(filename, result)) { - sci_finish_find(&dir); - - if (mac) - chdir(".."); - - return 0; - } - - filename = sci_find_next(&dir); - } - - if (mac) - chdir(".."); - - return 1; -} - -#define HASHCODE_MAGIC_RESOURCE_000 0x55555555 -#define HASHCODE_MAGIC_RESOURCE_001 0x00000001 - -const char * /* Original version by Solomon Peachy */ -version_guess_from_hashcode(sci_version_t *result, int *res_version, guint32 *code) { - int i; - int fd = -1; - int left = VERSION_DETECT_HASH_SIZE; - guint32 hash_code; - guint8 buf[VERSION_DETECT_BUF_SIZE]; - - if (IS_VALID_FD(fd = sci_open("resource.001", O_RDONLY | O_BINARY))) { - hash_code = HASHCODE_MAGIC_RESOURCE_001; - } else if (IS_VALID_FD(fd = sci_open("resource.000", O_RDONLY | O_BINARY))) { - hash_code = HASHCODE_MAGIC_RESOURCE_000; - } else { - sciprintf("Warning: Could not find RESOURCE.000 or RESOURCE.001, cannot determine hash code\n"); - *code = 0; - /* complete and utter failure */ - return NULL; - } - - while (left > 0) { - int len = read(fd, buf, left < VERSION_DETECT_BUF_SIZE ? left : VERSION_DETECT_BUF_SIZE); - - if (len == -1) { - sciprintf("Warning: read error while computing hash code for resource file\n"); - *code = 0; - return NULL; - } - - if (len == 0) - /* EOF */ - break; - - for (i = 0; i < len; i++) - hash_code = (hash_code * 19) + *(buf + i); - - /* This is the string hashing algorithm used by Objective Caml 3.08; the general idea - ** of multiplying the previous hash code with a prime number between 5 and 23 appears - ** to be generally considered to be a "good" approach to exhausting the entire 32 bit - ** number space in a somewhat equal distribution. For large chunks of data, such as - ** SCI resource files, this should both perform well and yield a good distribution, - ** or at least that's what standard library designers have been assuming for quite a - ** while. */ - - left -= len; - } - - close(fd); - - *code = hash_code; - - for (i = 0 ; sci_games[i].name ; i++) { - if ((unsigned int)sci_games[i].id == hash_code) { - *result = sci_games[i].version; - *res_version = sci_games[i].res_version; - return sci_games[i].name; - } - } - - return NULL; /* Failed to find matching game */ -} - - #undef VERSION_DETECT_BUF_SIZE |