diff options
| -rw-r--r-- | Makefile | 21 | ||||
| -rw-r--r-- | Makefile.common | 4 | ||||
| -rw-r--r-- | tools/.cvsignore | 3 | ||||
| -rw-r--r-- | tools/convbdf.c | 879 | ||||
| -rw-r--r-- | tools/md5table.c | 277 | ||||
| -rw-r--r-- | tools/scumm-md5.txt | 406 | ||||
| -rw-r--r-- | tools/simon-md5.txt | 29 | 
7 files changed, 1616 insertions, 3 deletions
| @@ -83,6 +83,25 @@ deb:  	debian/prepare  	fakeroot debian/rules binary +####################################################################### +# Tools directory +####################################################################### + +TOOLS := tools/convbdf$(EXEEXT) tools/md5table$(EXEEXT) + +tools: $(TOOLS) + +tools/convbdf$(EXEEXT): tools/convbdf.o +	$(CXX) -o $@ $< + +tools/md5table$(EXEEXT): tools/md5table.o +	$(CXX) -o $@ $< + +credits: +	./credits.pl --text > AUTHORS +	./credits.pl --html > ../web/credits.inc +	./credits.pl --cpp > gui/credits.h +	./credits.pl --xml > ../docs/docbook/credits.xml  #######################################################################  # Unit/regression tests                                               # @@ -153,4 +172,4 @@ win32dist: scummvm$(EXEEXT)  	u2d $(WIN32PATH)/*.txt -.PHONY: deb bundle test osxsnap win32dist dist install uninstall +.PHONY: deb bundle test osxsnap win32dist dist install uninstall credits diff --git a/Makefile.common b/Makefile.common index fbeffe54d2..65dc3953a1 100644 --- a/Makefile.common +++ b/Makefile.common @@ -5,7 +5,7 @@  ######################################################################  # The defaul build target: just build the scummvm executable  ###################################################################### -all: $(EXECUTABLE) plugins +all: tools $(EXECUTABLE) plugins  ###################################################################### @@ -122,7 +122,7 @@ distclean: clean  	$(RM) build.rules config.h config.mak config.log  clean: -	$(RM) $(OBJS) $(EXECUTABLE) +	$(RM) $(OBJS) $(EXECUTABLE) $(TOOLS)  .PHONY: all clean dist distclean plugins diff --git a/tools/.cvsignore b/tools/.cvsignore new file mode 100644 index 0000000000..39792d01ab --- /dev/null +++ b/tools/.cvsignore @@ -0,0 +1,3 @@ +.deps +convbdf +md5table
\ No newline at end of file diff --git a/tools/convbdf.c b/tools/convbdf.c new file mode 100644 index 0000000000..2fc60bb7ce --- /dev/null +++ b/tools/convbdf.c @@ -0,0 +1,879 @@ +/* + * Convert BDF files to C++ source. + * + * Copyright (c) 2002 by Greg Haerr <greg@censoft.com> + * + * Originally writen for the Microwindows Project <http://microwindows.org> + * + * Greg then modified it for Rockbox <http://rockbox.haxx.se/> + * + * Max Horn took that version and changed it to work for ScummVM. + * Changes include: warning fixes, removed .FNT output, output C++ source, + * tweak code generator so that the generated code fits into ScummVM code base. + * + * What fun it is converting font data... + * + * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header$ + * + */ +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +/* BEGIN font.h*/ +/* bitmap_t helper macros*/ +#define BITMAP_WORDS(x)			(((x)+15)/16)	/* image size in words*/ +#define BITMAP_BYTES(x)			(BITMAP_WORDS(x)*sizeof(bitmap_t)) +#define BITMAP_BITSPERIMAGE		(sizeof(bitmap_t) * 8) +#define BITMAP_BITVALUE(n)		((bitmap_t) (((bitmap_t) 1) << (n))) +#define BITMAP_FIRSTBIT			(BITMAP_BITVALUE(BITMAP_BITSPERIMAGE - 1)) +#define BITMAP_TESTBIT(m)	((m) & BITMAP_FIRSTBIT) +#define BITMAP_SHIFTBIT(m)	((bitmap_t) ((m) << 1)) + +typedef unsigned short bitmap_t; /* bitmap image unit size*/ + +/* builtin C-based proportional/fixed font structure */ +/* based on The Microwindows Project http://microwindows.org */ +struct font { +	char *	name;		/* font name*/ +	int		maxwidth;	/* max width in pixels*/ +	int		height;		/* height in pixels*/ +	int		ascent;		/* ascent (baseline) height*/ +	int		firstchar;	/* first character in bitmap*/ +	int		size;		/* font size in glyphs*/ +	bitmap_t*	bits;		/* 16-bit right-padded bitmap data*/ +	unsigned long* offset;	/* offsets into bitmap data*/ +	unsigned char* width;	/* character widths or NULL if fixed*/ +	int		defaultchar;	/* default char (not glyph index)*/ +	long	bits_size;	/* # words of bitmap_t bits*/ +	 +	/* unused by runtime system, read in by convbdf*/ +	char *	facename;	/* facename of font*/ +	char *	copyright;	/* copyright info for loadable fonts*/ +	int		pixel_size; +	int		descent; +	int		fbbw, fbbh, fbbx, fbby; +}; +/* END font.h*/ + +#define isprefix(buf,str)	(!strncmp(buf, str, strlen(str))) +#define strequal(s1,s2)		(!strcmp(s1, s2)) + +#define EXTRA	300		/* # bytes extra allocation for buggy .bdf files*/ + +int gen_map = 1; +int start_char = 0; +int limit_char = 65535; +int oflag = 0; +char outfile[256]; + +void usage(void); +void getopts(int *pac, char ***pav); +int convbdf(char *path); + +void free_font(struct font* pf); +struct font* bdf_read_font(char *path); +int bdf_read_header(FILE *fp, struct font* pf); +int bdf_read_bitmaps(FILE *fp, struct font* pf); +char * bdf_getline(FILE *fp, char *buf, int len); +bitmap_t bdf_hexval(unsigned char *buf, int ndx1, int ndx2); + +int gen_c_source(struct font* pf, char *path); + +void error(const char *s, ...) { +	char buf[1024]; +	va_list va; + +	va_start(va, s); +	vsprintf(buf, s, va); +	va_end(va); + +	fprintf(stderr, "ERROR: %s!\n", buf); + +	exit(1); +} + +void warning(const char *s, ...) { +	char buf[1024]; +	va_list va; + +	va_start(va, s); +	vsprintf(buf, s, va); +	va_end(va); + +	fprintf(stderr, "WARNING: %s!\n", buf); +} + +void +usage(void) +{ +	char help[] = { +	"Usage: convbdf [options] [input-files]\n" +	"		convbdf [options] [-o output-file] [single-input-file]\n" +	"Options:\n" +	"	 -s N	Start output at character encodings >= N\n" +	"	 -l N	Limit output to character encodings <= N\n" +	"	 -n		Don't generate bitmaps as comments in .c file\n" +	}; + +	fprintf(stderr, help); +} + +/* parse command line options*/ +void getopts(int *pac, char ***pav) +{ +	const char *p; +	char **av; +	int ac; +	 +	ac = *pac; +	av = *pav; +	while (ac > 0 && av[0][0] == '-') { +		p = &av[0][1];  +		while( *p) +			switch(*p++) { +			case ' ':			/* multiple -args on av[]*/ +				while( *p && *p == ' ') +					p++; +				if( *p++ != '-')	/* next option must have dash*/ +					p = ""; +				break;			/* proceed to next option*/ +			case 'n':			/* don't gen bitmap comments*/ +				gen_map = 0; +				break; +			case 'o':			/* set output file*/ +				oflag = 1; +				if (*p) { +					strcpy(outfile, p); +					while (*p && *p != ' ') +						p++; +				} +				else { +					av++; ac--; +					if (ac > 0) +						strcpy(outfile, av[0]); +				} +				break; +			case 'l':			/* set encoding limit*/ +				if (*p) { +					limit_char = atoi(p); +					while (*p && *p != ' ') +						p++; +				} +				else { +					av++; ac--; +					if (ac > 0) +						limit_char = atoi(av[0]); +				} +				break; +			case 's':			/* set encoding start*/ +				if (*p) { +					start_char = atoi(p); +					while (*p && *p != ' ') +						p++; +				} +				else { +					av++; ac--; +					if (ac > 0) +						start_char = atoi(av[0]); +				} +				break; +			default: +				fprintf(stderr, "Unknown option ignored: %c\r\n", *(p-1)); +			} +		++av; --ac; +	} +	*pac = ac; +	*pav = av; +} + +/* remove directory prefix and file suffix from full path*/ +char *basename(char *path) +{ +	char *p, *b; +	static char base[256]; + +	/* remove prepended path and extension*/ +	b = path; +	for (p=path; *p; ++p) { +		if (*p == '/') +			b = p + 1; +	} +	strcpy(base, b); +	for (p=base; *p; ++p) { +		if (*p == '.') { +			*p = 0; +			break; +		} +	} +	return base; +} + +int convbdf(char *path) +{ +	struct font* pf; +	int ret = 0; + +	pf = bdf_read_font(path); +	if (!pf) +		exit(1); +	 +	if (!oflag) { +		strcpy(outfile, basename(path)); +		strcat(outfile, ".cpp"); +	} +	ret |= gen_c_source(pf, outfile); + +	free_font(pf); +	return ret; +} + +int main(int ac, char *av[]) +{ +	int ret = 0; + +	++av; --ac;		/* skip av[0]*/ +	getopts(&ac, &av);	/* read command line options*/ + +	if (ac < 1) { +		usage(); +		exit(1); +	} +	if (oflag && ac > 1) { +		usage(); +		exit(1); +	} +	 +	while (ac > 0) { +		ret |= convbdf(av[0]); +		++av; --ac; +	} +	 +	exit(ret); +} + +/* free font structure*/ +void free_font(struct font* pf) +{ +	if (!pf) +		return; +	free(pf->name); +	free(pf->facename); +	free(pf->bits); +	free(pf->offset); +	free(pf->width); +	free(pf); +} + +/* build incore structure from .bdf file*/ +struct font* bdf_read_font(char *path) +{ +	FILE *fp; +	struct font* pf; + +	fp = fopen(path, "rb"); +	if (!fp) { +		fprintf(stderr, "Error opening file: %s\n", path); +		return NULL; +	} +	 +	pf = (struct font*)calloc(1, sizeof(struct font)); +	if (!pf) +		goto errout; +	 +	pf->name = strdup(basename(path)); + +	if (!bdf_read_header(fp, pf)) { +		fprintf(stderr, "Error reading font header\n"); +		goto errout; +	} + +	if (!bdf_read_bitmaps(fp, pf)) { +		fprintf(stderr, "Error reading font bitmaps\n"); +		goto errout; +	} + +	fclose(fp); +	return pf; + + errout: +	fclose(fp); +	free_font(pf); +	return NULL; +} + +/* read bdf font header information, return 0 on error*/ +int bdf_read_header(FILE *fp, struct font* pf) +{ +	int encoding; +	int nchars, maxwidth; +	int firstchar = 65535; +	int lastchar = -1; +	char buf[256]; +	char facename[256]; +	char copyright[256]; + +	/* set certain values to errors for later error checking*/ +	pf->defaultchar = -1; +	pf->ascent = -1; +	pf->descent = -1; + +	for (;;) { +		if (!bdf_getline(fp, buf, sizeof(buf))) { +			fprintf(stderr, "Error: EOF on file\n"); +			return 0; +		} +		if (isprefix(buf, "FONT ")) {		/* not required*/ +			if (sscanf(buf, "FONT %[^\n]", facename) != 1) { +				fprintf(stderr, "Error: bad 'FONT'\n"); +				return 0; +			} +			pf->facename = strdup(facename); +			continue; +		} +		if (isprefix(buf, "COPYRIGHT ")) {	/* not required*/ +			if (sscanf(buf, "COPYRIGHT \"%[^\"]", copyright) != 1) { +				fprintf(stderr, "Error: bad 'COPYRIGHT'\n"); +				return 0; +			} +			pf->copyright = strdup(copyright); +			continue; +		} +		if (isprefix(buf, "DEFAULT_CHAR ")) {	/* not required*/ +			if (sscanf(buf, "DEFAULT_CHAR %d", &pf->defaultchar) != 1) { +				fprintf(stderr, "Error: bad 'DEFAULT_CHAR'\n"); +				return 0; +			} +		} +		if (isprefix(buf, "FONT_DESCENT ")) { +			if (sscanf(buf, "FONT_DESCENT %d", &pf->descent) != 1) { +				fprintf(stderr, "Error: bad 'FONT_DESCENT'\n"); +				return 0; +			} +			continue; +		} +		if (isprefix(buf, "FONT_ASCENT ")) { +			if (sscanf(buf, "FONT_ASCENT %d", &pf->ascent) != 1) { +				fprintf(stderr, "Error: bad 'FONT_ASCENT'\n"); +				return 0; +			} +			continue; +		} +		if (isprefix(buf, "FONTBOUNDINGBOX ")) { +			if (sscanf(buf, "FONTBOUNDINGBOX %d %d %d %d", +					   &pf->fbbw, &pf->fbbh, &pf->fbbx, &pf->fbby) != 4) { +				fprintf(stderr, "Error: bad 'FONTBOUNDINGBOX'\n"); +				return 0; +			} +			continue; +		} +		if (isprefix(buf, "CHARS ")) { +			if (sscanf(buf, "CHARS %d", &nchars) != 1) { +				fprintf(stderr, "Error: bad 'CHARS'\n"); +				return 0; +			} +			continue; +		} + +		/* +		 * Reading ENCODING is necessary to get firstchar/lastchar +		 * which is needed to pre-calculate our offset and widths +		 * array sizes. +		 */ +		if (isprefix(buf, "ENCODING ")) { +			if (sscanf(buf, "ENCODING %d", &encoding) != 1) { +				fprintf(stderr, "Error: bad 'ENCODING'\n"); +				return 0; +			} +			if (encoding >= 0 &&  +				encoding <= limit_char &&  +				encoding >= start_char) { + +				if (firstchar > encoding) +					firstchar = encoding; +				if (lastchar < encoding) +					lastchar = encoding; +			} +			continue; +		} +		if (strequal(buf, "ENDFONT")) +			break; +	} + +	/* calc font height*/ +	if (pf->ascent < 0 || pf->descent < 0 || firstchar < 0) { +		fprintf(stderr, "Error: Invalid BDF file, requires FONT_ASCENT/FONT_DESCENT/ENCODING\n"); +		return 0; +	} +	pf->height = pf->ascent + pf->descent; + +	/* calc default char*/ +	if (pf->defaultchar < 0 ||  +		pf->defaultchar < firstchar ||  +		pf->defaultchar > limit_char ) +		pf->defaultchar = firstchar; + +	/* calc font size (offset/width entries)*/ +	pf->firstchar = firstchar; +	pf->size = lastchar - firstchar + 1; +	 +	/* use the font boundingbox to get initial maxwidth*/ +	/*maxwidth = pf->fbbw - pf->fbbx;*/ +	maxwidth = pf->fbbw; + +	/* initially use font maxwidth * height for bits allocation*/ +	pf->bits_size = nchars * BITMAP_WORDS(maxwidth) * pf->height; + +	/* allocate bits, offset, and width arrays*/ +	pf->bits = (bitmap_t *)malloc(pf->bits_size * sizeof(bitmap_t) + EXTRA); +	pf->offset = (unsigned long *)malloc(pf->size * sizeof(unsigned long)); +	pf->width = (unsigned char *)malloc(pf->size * sizeof(unsigned char)); +	 +	if (!pf->bits || !pf->offset || !pf->width) { +		fprintf(stderr, "Error: no memory for font load\n"); +		return 0; +	} + +	return 1; +} + +/* read bdf font bitmaps, return 0 on error*/ +int bdf_read_bitmaps(FILE *fp, struct font* pf) +{ +	long ofs = 0; +	int maxwidth = 0; +	int i, k, encoding, width; +	int bbw, bbh, bbx, bby; +	int proportional = 0; +	int encodetable = 0; +	long l; +	char buf[256]; + +	/* reset file pointer*/ +	fseek(fp, 0L, SEEK_SET); + +	/* initially mark offsets as not used*/ +	for (i=0; i<pf->size; ++i) +		pf->offset[i] = -1; + +	for (;;) { +		if (!bdf_getline(fp, buf, sizeof(buf))) { +			fprintf(stderr, "Error: EOF on file\n"); +			return 0; +		} +		if (isprefix(buf, "STARTCHAR")) { +			encoding = width = bbw = bbh = bbx = bby = -1; +			continue; +		} +		if (isprefix(buf, "ENCODING ")) { +			if (sscanf(buf, "ENCODING %d", &encoding) != 1) { +				fprintf(stderr, "Error: bad 'ENCODING'\n"); +				return 0; +			} +			if (encoding < start_char || encoding > limit_char) +				encoding = -1; +			continue; +		} +		if (isprefix(buf, "DWIDTH ")) { +			if (sscanf(buf, "DWIDTH %d", &width) != 1) { +				fprintf(stderr, "Error: bad 'DWIDTH'\n"); +				return 0; +			} +			/* use font boundingbox width if DWIDTH <= 0*/ +			if (width <= 0) +				width = pf->fbbw - pf->fbbx; +			continue; +		} +		if (isprefix(buf, "BBX ")) { +			if (sscanf(buf, "BBX %d %d %d %d", &bbw, &bbh, &bbx, &bby) != 4) { +				fprintf(stderr, "Error: bad 'BBX'\n"); +				return 0; +			} +			continue; +		} +		if (strequal(buf, "BITMAP")) { +			bitmap_t *ch_bitmap = pf->bits + ofs; +			int ch_words; + +			if (encoding < 0) +				continue; + +			/* set bits offset in encode map*/ +			if (pf->offset[encoding-pf->firstchar] != (unsigned long)-1) { +				fprintf(stderr, "Error: duplicate encoding for character %d (0x%02x), ignoring duplicate\n", +						encoding, encoding); +				continue; +			} +			pf->offset[encoding-pf->firstchar] = ofs; + +			/* calc char width*/ +			if (bbx < 0) { +				width -= bbx; +				/*if (width > maxwidth) +					width = maxwidth;*/ +				bbx = 0; +			} +			if (width > maxwidth) +				maxwidth = width; +			pf->width[encoding-pf->firstchar] = width; + +			/* clear bitmap*/ +			memset(ch_bitmap, 0, BITMAP_BYTES(width) * pf->height); + +			ch_words = BITMAP_WORDS(width); +#define BM(row,col) (*(ch_bitmap + ((row)*ch_words) + (col))) +#define BITMAP_NIBBLES	(BITMAP_BITSPERIMAGE/4) + +			/* read bitmaps*/ +			for (i=0; ; ++i) { +				int hexnibbles; + +				if (!bdf_getline(fp, buf, sizeof(buf))) { +					fprintf(stderr, "Error: EOF reading BITMAP data\n"); +					return 0; +				} +				if (isprefix(buf, "ENDCHAR")) +					break; + +				hexnibbles = strlen(buf); +				for (k=0; k<ch_words; ++k) { +					int ndx = k * BITMAP_NIBBLES; +					int padnibbles = hexnibbles - ndx; +					bitmap_t value; +					 +					if (padnibbles <= 0) +						break; +					if (padnibbles >= BITMAP_NIBBLES) +						padnibbles = 0; + +					value = bdf_hexval((unsigned char *)buf, +									   ndx, ndx+BITMAP_NIBBLES-1-padnibbles); +					value <<= padnibbles * BITMAP_NIBBLES; + +					BM(pf->height - pf->descent - bby - bbh + i, k) |= +						value >> bbx; +					/* handle overflow into next image word*/ +					if (bbx) { +						BM(pf->height - pf->descent - bby - bbh + i, k+1) = +							value << (BITMAP_BITSPERIMAGE - bbx); +					} +				} +			} + +			ofs += BITMAP_WORDS(width) * pf->height; + +			continue; +		} +		if (strequal(buf, "ENDFONT")) +			break; +	} + +	/* set max width*/ +	pf->maxwidth = maxwidth; + +	/* change unused offset/width values to default char values*/ +	for (i=0; i<pf->size; ++i) { +		int defchar = pf->defaultchar - pf->firstchar; + +		if (pf->offset[i] == (unsigned long)-1) { +			pf->offset[i] = pf->offset[defchar]; +			pf->width[i] = pf->width[defchar]; +		} +	} + +	/* determine whether font doesn't require encode table*/ +	l = 0; +	for (i=0; i<pf->size; ++i) { +		if (pf->offset[i] != l) { +			encodetable = 1; +			break; +		} +		l += BITMAP_WORDS(pf->width[i]) * pf->height; +	} +	if (!encodetable) { +		free(pf->offset); +		pf->offset = NULL; +	} + +	/* determine whether font is fixed-width*/ +	for (i=0; i<pf->size; ++i) { +		if (pf->width[i] != maxwidth) { +			proportional = 1; +			break; +		} +	} +	if (!proportional) { +		free(pf->width); +		pf->width = NULL; +	} + +	/* reallocate bits array to actual bits used*/ +	if (ofs < pf->bits_size) { +		pf->bits = realloc(pf->bits, ofs * sizeof(bitmap_t)); +		pf->bits_size = ofs; +	} +	else { +		if (ofs > pf->bits_size) { +			fprintf(stderr, "Warning: DWIDTH spec > max FONTBOUNDINGBOX\n"); +			if (ofs > pf->bits_size+EXTRA) { +				fprintf(stderr, "Error: Not enough bits initially allocated\n"); +				return 0; +			} +			pf->bits_size = ofs; +		} +	} + +	return 1; +} + +/* read the next non-comment line, returns buf or NULL if EOF*/ +char *bdf_getline(FILE *fp, char *buf, int len) +{ +	int c; +	char *b; + +	for (;;) { +		b = buf; +		while ((c = getc(fp)) != EOF) { +			if (c == '\r') +				continue; +			if (c == '\n') +				break; +			if (b - buf >= (len - 1)) +				break; +			*b++ = c; +		} +		*b = '\0'; +		if (c == EOF && b == buf) +			return NULL; +		if (b != buf && !isprefix(buf, "COMMENT")) +			break; +	} +	return buf; +} + +/* return hex value of portion of buffer*/ +bitmap_t bdf_hexval(unsigned char *buf, int ndx1, int ndx2) +{ +	bitmap_t val = 0; +	int i, c; + +	for (i=ndx1; i<=ndx2; ++i) { +		c = buf[i]; +		if (c >= '0' && c <= '9') +			c -= '0'; +		else  +			if (c >= 'A' && c <= 'F') +				c = c - 'A' + 10; +			else  +				if (c >= 'a' && c <= 'f') +					c = c - 'a' + 10; +				else  +					c = 0; +		val = (val << 4) | c; +	} +	return val; +} + +/* generate C source from in-core font*/ +int gen_c_source(struct font* pf, char *path) +{ +	FILE *ofp; +	int i; +	int did_defaultchar = 0; +	int did_syncmsg = 0; +	time_t t = time(0); +	bitmap_t *ofs = pf->bits; +	char buf[256]; +	char obuf[256]; +	char hdr1[] = { +		"/* Generated by convbdf on %s. */\n" +		"#include \"common/stdafx.h\"\n" +		"#include \"graphics/font.h\"\n" +		"\n" +		"/* Font information:\n" +		"   name: %s\n" +		"   facename: %s\n" +		"   w x h: %dx%d\n" +		"   size: %d\n" +		"   ascent: %d\n" +		"   descent: %d\n" +		"   first char: %d (0x%02x)\n" +		"   last char: %d (0x%02x)\n" +		"   default char: %d (0x%02x)\n" +		"   proportional: %s\n" +		"   %s\n" +		"*/\n" +		"\n" +		"namespace Graphics {\n" +		"\n" +		"/* Font character bitmap data. */\n" +		"static const bitmap_t _font_bits[] = {\n" +	}; + +	ofp = fopen(path, "w"); +	if (!ofp) { +		fprintf(stderr, "Can't create %s\n", path); +		return 1; +	} + +	strcpy(buf, ctime(&t)); +	buf[strlen(buf)-1] = 0; + +	fprintf(ofp, hdr1, buf,  +			pf->name, +			pf->facename? pf->facename: "", +			pf->maxwidth, pf->height, +			pf->size, +			pf->ascent, pf->descent, +			pf->firstchar, pf->firstchar, +			pf->firstchar+pf->size-1, pf->firstchar+pf->size-1, +			pf->defaultchar, pf->defaultchar, +			pf->width? "yes": "no", +			pf->copyright? pf->copyright: ""); + +	/* generate bitmaps*/ +	for (i=0; i<pf->size; ++i) { +		int x; +		int bitcount = 0; +		int width = pf->width ? pf->width[i] : pf->maxwidth; +		int height = pf->height; +		bitmap_t *bits = pf->bits + (pf->offset? pf->offset[i]: (height * i)); +		bitmap_t bitvalue = 0; + +		/* +		 * Generate bitmap bits only if not this index isn't +		 * the default character in encode map, or the default +		 * character hasn't been generated yet. +		 */ +		if (pf->offset &&  +			(pf->offset[i] == pf->offset[pf->defaultchar-pf->firstchar])) { +			if (did_defaultchar) +				continue; +			did_defaultchar = 1; +		} + +		fprintf(ofp, "\n/* Character %d (0x%02x):\n   width %d", +				i+pf->firstchar, i+pf->firstchar, width); + +		if (gen_map) { +			fprintf(ofp, "\n   +"); +			for (x=0; x<width; ++x) fprintf(ofp, "-"); +			fprintf(ofp, "+\n"); + +			x = 0; +			while (height > 0) { +				if (x == 0) fprintf(ofp, "   |"); + +				if (bitcount <= 0) { +					bitcount = BITMAP_BITSPERIMAGE; +					bitvalue = *bits++; +				} + +				fprintf(ofp, BITMAP_TESTBIT(bitvalue)? "*": " "); + +				bitvalue = BITMAP_SHIFTBIT(bitvalue); +				--bitcount; +				if (++x == width) { +					fprintf(ofp, "|\n"); +					--height; +					x = 0; +					bitcount = 0; +				} +			} +			fprintf(ofp, "   +"); +			for (x=0; x<width; ++x) +				fprintf(ofp, "-"); +			fprintf(ofp, "+\n*/\n"); +		} else +			fprintf(ofp, "\n*/\n"); + +		bits = pf->bits + (pf->offset? pf->offset[i]: (pf->height * i)); +		for (x=BITMAP_WORDS(width)*pf->height; x>0; --x) { +			fprintf(ofp, "0x%04x,\n", *bits); +			if (!did_syncmsg && *bits++ != *ofs++) { +				fprintf(stderr, "Warning: found encoding values in non-sorted order (not an error).\n"); +				did_syncmsg = 1; +			} +		}	 +	} +	fprintf(ofp, "};\n\n"); + +	if (pf->offset) { +		/* output offset table*/ +		fprintf(ofp, "/* Character->glyph mapping. */\n" +				"static const unsigned long _sysfont_offset[] = {\n"); + +		for (i=0; i<pf->size; ++i) +			fprintf(ofp, "	%ld,\t/* (0x%02x) */\n",  +					pf->offset[i], i+pf->firstchar); +		fprintf(ofp, "};\n\n"); +	} + +	/* output width table for proportional fonts*/ +	if (pf->width) { +		fprintf(ofp, "/* Character width data. */\n" +				"static const unsigned char _sysfont_width[] = {\n"); + +		for (i=0; i<pf->size; ++i) +			fprintf(ofp, "	%d,\t/* (0x%02x) */\n",  +					pf->width[i], i+pf->firstchar); +		fprintf(ofp, "};\n\n"); +	} + +	/* output struct font struct*/ +	if (pf->offset) +		sprintf(obuf, "_sysfont_offset,"); +	else +		sprintf(obuf, "0,  /* no encode table*/"); + +	if (pf->width) +		sprintf(buf, "_sysfont_width,"); +	else +		sprintf(buf, "0,  /* fixed width*/"); + +	fprintf(ofp, +			"/* Exported structure definition. */\n" +			"static const FontDesc desc = {\n" +			"\t" "\"%s\",\n" +			"\t" "%d,\n" +			"\t" "%d,\n" +			"\t" "%d,\n" +			"\t" "%d,\n" +			"\t" "%d,\n" +			"\t" "_font_bits,\n" +			"\t" "%s\n" +			"\t" "%s\n" +			"\t" "%d,\n" +			"\t" "sizeof(_font_bits)/sizeof(bitmap_t)\n" +			"};\n", +			pf->name, +			pf->maxwidth, pf->height, +			pf->ascent, +			pf->firstchar, +			pf->size, +			obuf, +			buf, +			pf->defaultchar); + +	fprintf(ofp, "\n" "extern const NewFont g_sysfont(desc);\n"); +	fprintf(ofp, "\n} // End of namespace Graphics\n"); +  +	return 0; +} diff --git a/tools/md5table.c b/tools/md5table.c new file mode 100644 index 0000000000..06f0f5a385 --- /dev/null +++ b/tools/md5table.c @@ -0,0 +1,277 @@ +/* md5table - Convert a MD5 table to either PHP or C++ code + * Copyright (C) 2002, 2003  The ScummVM Team + * + * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header$ + * + */ + +#include <assert.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +void error(const char *s, ...) { +	char buf[1024]; +	va_list va; + +	va_start(va, s); +	vsprintf(buf, s, va); +	va_end(va); + +	fprintf(stderr, "ERROR: %s!\n", buf); + +	exit(1); +} + +void warning(const char *s, ...) { +	char buf[1024]; +	va_list va; + +	va_start(va, s); +	vsprintf(buf, s, va); +	va_end(va); + +	fprintf(stderr, "WARNING: %s!\n", buf); +} + +typedef struct { +	const char *key; +	const char *value; +} StringMap; + +typedef struct { +	const char *desc; +	const char *platform; +	const char *language; +	const char *md5; +	const char *target; +	const char *infoSource; +} Entry; + +/* Map MD5 table platform names to ScummVM constant names. + * Note: Currently not many constants are defined within ScummVM. However, more + * will probably be added eventually (see also commented out constants in + * common/util.h). + */ +static const StringMap platformMap[] = { +	{ "3DO",		"kPlatformUnknown" }, +	{ "Amiga",		"kPlatformAmiga" }, +	{ "Atari",		"kPlatformAtariST" }, +	{ "DOS",		"kPlatformPC" }, +	{ "FM-TOWNS",	"kPlatformFMTowns" }, +	{ "Mac",		"kPlatformMacintosh" }, +	{ "SEGA",		"kPlatformUnknown" }, +	{ "Windows",	"kPlatformWindows" }, + +	{ "All?",		"kPlatformUnknown" }, +	{ "All",		"kPlatformUnknown" }, + +	{ 0,			"kPlatformUnknown" } +}; + +static const StringMap langMap[] = { +	{ "en",		"EN_USA" }, +	{ "de",		"DE_DEU" }, +	{ "fr",		"FR_FRA" }, +	{ "it",		"IT_ITA" }, +	{ "pt",		"PT_BRA" }, +	{ "es",		"ES_ESP" }, +	{ "jp",		"JA_JPN" }, +	{ "zh",		"ZH_TWN" }, +	{ "ko",		"KO_KOR" }, +	{ "se",		"SE_SWE" }, +	{ "en",		"EN_GRB" }, +	{ "hb",		"HB_ISR" }, +	{ "ru",		"RU_RUS" }, +	{ "cz",		"CZ_CZE" }, +	{ "nl",		"NL_NLD" }, + +	{ "All",	"UNK_LANG" }, +	{ "All?",	"UNK_LANG" }, + +	{ 0,		"UNK_LANG" } +}; + +static const char *php_header = +	"<!--\n" +	"  This file was generated by the md5table tool on %s" +	"  DO NOT EDIT MANUALLY!\n" +	" -->\n" +	"\n"; + +static const char *c_header = +	"/*\n" +	"  This file was generated by the md5table tool on %s" +	"  DO NOT EDIT MANUALLY!\n" +	" */\n" +	"\n" +	"struct MD5Table {\n" +	"	const char *md5;\n" +	"	const char *target;\n" +	"	Common::Language language;\n" +	"	Common::Platform platform;\n" +	"};\n" +	"\n" +	"static const MD5Table md5table[] = {\n"; + +static const char *c_footer = +	"	{ 0, 0, Common::UNK_LANG, Common::kPlatformUnknown }\n" +	"};\n"; + +static void parseEntry(Entry *entry, char *line) { +	assert(entry); +	assert(line); +	 +	/* Split at the tabs */ +	entry->desc = strtok(line, "\t\n\r"); +	entry->platform = strtok(NULL, "\t\n\r"); +	entry->language = strtok(NULL, "\t\n\r"); +	entry->md5 = strtok(NULL, "\t\n\r"); +	entry->target = strtok(NULL, "\t\n\r"); +	entry->infoSource = strtok(NULL, "\t\n\r"); +} + +static int isEmptyLine(const char *line) { +	const char *whitespace = " \t\n\r"; +	while (*line) { +		if (!strchr(whitespace, *line)) +			return 0; +		line++; +	} +	return 1; +} + +static const char *mapStr(const char *str, const StringMap *map) { +	assert(str); +	assert(map); +	while (map->key) { +		if (0 == strcmp(map->key, str)) +			return map->value; +		map++; +	} +	warning("mapStr: unknown string '%s', defaulting to '%s'", str, map->value); +	return map->value; +} + +void showhelp(const char *exename) +{ +	printf("\nUsage: %s <params>\n", exename); +	printf("\nParams:\n"); +	printf(" --c++   output C++ code for inclusion in ScummVM (default)\n"); +	printf(" --php   output PHP code for the web site\n"); +	exit(2); +} + +/* needed to call from qsort */ +int strcmp_wrapper(const void *s1, const void *s2) +{ +	return strcmp((const char *)s1, (const char *)s2); +} + +int main(int argc, char *argv[]) +{ +	FILE *inFile = stdin; +	FILE *outFile = stdout; +	char buffer[1024]; +	char section[1024]; +	char *line; +	int err; +	int i; +	time_t theTime; +	const char *generationDate; + +	const int entrySize = 256; +	int numEntries = 0, maxEntries = 1; +	char *entriesBuffer = malloc(maxEntries * entrySize); + +	int phpOutput = 0; + +	if (argc != 2) +		showhelp(argv[0]); +	if (strcmp(argv[1], "--c++") == 0) { +		phpOutput = 0; +	} else if (strcmp(argv[1], "--php") == 0) { +		phpOutput = 1; +	} else { +		showhelp(argv[0]); +	} +	 +	time(&theTime); +	generationDate = strdup(asctime(gmtime(&theTime))); + +	if (phpOutput) +		fprintf(outFile, php_header, generationDate); + +	while ((line = fgets(buffer, sizeof(buffer), inFile))) { +		/* Parse line */ +		if (line[0] == '#' || isEmptyLine(line)) +			continue;	/* Skip comments & empty lines */ +		if (line[0] == '\t') { +			Entry entry; +			assert(section[0]); +			parseEntry(&entry, line+1); +			if (phpOutput) { +				fprintf(outFile, "\t\t<?php addEntry("); +				fprintf(outFile, "\"%s\", ", entry.desc); +				fprintf(outFile, "\"%s\", ", entry.platform); +				fprintf(outFile, "\"%s\", ", entry.language); +				fprintf(outFile, "\"%s\", ", entry.md5); +				fprintf(outFile, "\"%s\"", entry.target); +				if (entry.infoSource) +					fprintf(outFile, ", \"%s\"", entry.infoSource); +				fprintf(outFile, "); ?>\n"); +			} else if (entry.md5) { +				if (numEntries >= maxEntries) { +					maxEntries *= 2; +					entriesBuffer = realloc(entriesBuffer, maxEntries * entrySize); +				} +				snprintf(entriesBuffer + numEntries * entrySize, entrySize, "\t{ \"%s\", \"%s\", Common::%s, Common::%s },\n", +					entry.md5, entry.target, mapStr(entry.language, langMap), mapStr(entry.platform, platformMap)); +				numEntries++; +			} +		} else { +			for (i = 0; buffer[i] && buffer[i] != '\n'; ++i) +				section[i] = buffer[i]; +			section[i] = 0; +			if (phpOutput) { +				fprintf(outFile, "\t<tr><td colspan='7'><strong>%s</strong></td></tr>\n", section); +			} +		} +	} + +	err = ferror(inFile); +	if (err) +		error("Failed reading from input file, error %d", err); + +	if (!phpOutput) { +		/* Printf header */ +		fprintf(outFile, c_header, generationDate); +		/* Now sort the MD5 table (this allows for binary searches) */ +		qsort(entriesBuffer, numEntries, entrySize, strcmp_wrapper); +		/* Output the table */ +		for (i = 0; i < numEntries; ++i) +			fprintf(outFile, entriesBuffer + i * entrySize); +		/* Finally, print the footer */ +		fprintf(outFile, c_footer); +	} +	 +	free(entriesBuffer); + +	return 0; +} diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt new file mode 100644 index 0000000000..2da2ecef81 --- /dev/null +++ b/tools/scumm-md5.txt @@ -0,0 +1,406 @@ +Maniac Mansion +	V1	DOS	en	7f45ddd6dbfbf8f80c0c0efea4c295bc	maniac +	V2	DOS	en	624cdb93654667c869d204a64af7e57f	maniac	Kirben, Andrea Petrucci +	V2 (alt?)	DOS	en	b250d0f9cc83f80ced56fe11a4fb057c	maniac	Andrea Petrucci +	V2	DOS	de	183d7464902d40d00800e8ee1f04117c	maniac +	V2	DOS	es	0d1b69471605201ef2fa9cec1f5f02d2	maniac	abnog, Andrea Petrucci +	V2 (DOTT)	DOS	it	87f6e8037b7cc996e13474b491a7a98e	maniac	Andrea Petrucci +	V2	DOS	fr	114acdc2659a273c220f86ee9edb24c1	maniac	Nicolas Sauzède +	V2 (DOTT)	DOS	fr	99a3699f80b8f776efae592b44b9b991	maniac	Nicolas Sauzède, Andrea Petrucci +	V2 (demo)	DOS	en	40564ec47da48a67787d1f9bd043902a	maniac +	V2	Amiga	en	e781230da44a44e2f0770edb2b3b3633	maniac	dhewg, Andrea Petrucci +	V2	Amiga	de	9bc548e179cdb0767009401c094d0895	maniac	Norbert Lange +	V2	Amiga	fr	ce7733f185b838e248927c7ba1a04204	maniac	Tobias Fleischer +	V2	Atari	en	a570381b028972d891052ee1e51dc011	maniac	Andreas Bylund +	V2	Atari	fr	dd30a53035393baa5a5e222e716559af	maniac	Andreas Bylund + +Zak McKracken and the Alien Mindbenders +	V1	DOS	en	7020931d5a2be0a49d68e7a1882363e4	zak +	V1 (alt?)	DOS	en	b23f7cd7c304d7dff08e92a96120d5b4	zak	Andrea Petrucci +	V2 Demo	Atari	en	8299d9b8a1b0e7b881bae7a9971dc5e2	zak +	V2	DOS	en	675d71151e9b5a968c8ce46d9fbf4cbf	zak	Kirben +	V2 (alt?)	DOS	en	debe337f73d660e951ece7c1f1c81add	zak	Andrea Petrucci +	V2 (w/o copy protection)	DOS	de	cdd760228cf1010c2903f37e788ea31c	zak	Max Horn +	V2 (from 5\"25 floppies)	DOS	de	d06fbe28818fef7bfc45c2cdf0c0849d	zak	Nicolas Sauzède, Andrea Petrucci +	V2	DOS	fr	52a4bae0746a11d7b1e8554e91a6645c	zak	Andrea Petrucci +	V2	DOS	it	75ba23fff4fd63fa446c02864f2a5a4b	zak	Antti Leimi, Andrea Petrucci +	V2 (alt?)	DOS	it	1900e501a52fbf55bde6e4196f6d2aa6	zak	Andrea Petrucci +	V2	Amiga	en	e94c7cc3686fce406d3c91b5eae5a72d	zak	dhweg +	V2	Amiga	de	6027e9ca9c35746d95dee2068cec17e5	zak	Norbert Lange +	V2	Amiga	fr	91469353f7be1b122fa88d23480a1320	zak	Tobias Fleischer +	V2	Amiga	it	27b3a4224ad63d5b04627595c1c1a025	zak	Andrea Petrucci +	V2	Atari	fr	613f64f78ea26c7353b2a5940eb61d6a	zak	Andreas Bylund +	FM-TOWNS	FM-TOWNS	en	2d4536a56e01da4b02eb021e7770afa2	zakTowns +	FM-TOWNS	FM-TOWNS	jp	ce3edc99cd4f478c5b37104d70c68ca5	zakTowns	khalek +	FM-TOWNS (alt?)	FM-TOWNS	jp	1ca86e2cf9aaa2068738a1e5ba477e60	zakTowns	Andrea Petrucci + +Indiana Jones and the Last Crusade +	EGA (1.0 7/09/89)	DOS	en	5fbe557049892eb4b709d90916ec97ca	indy3EGA +	EGA (1.3 8/14/89)	DOS	en	6b3ec67da214f558dc5ceaa2acd47453	indy3EGA	tsuteiuQ, Andrea Petrucci +	EGA	DOS	de	6f6ef668c608c7f534fea6e6d3878dde	indy3EGA	dhewg +	EGA	DOS	fr	66236cd1aec24e1d4aff4c4cc93b7e18	indy3EGA	Andrea Petrucci +	EGA	DOS	it	d62d248c3df6ec177405e2cb23d923b2	indy3EGA	Andrea Petrucci +	EGA	DOS	es	ce7fd0c382389a6791fc3e199c117ef4	indy3EGA	abnog +	EGA (alt?)	DOS	es	86be8ada36371d4fdc35659d0e912a26	indy3EGA	Andrea Petrucci + +	EGA	Mac	en	1dd7aa088e09f96d06818aa9a9deabe0	indy3EGA +	EGA	Amiga	en	9c0fee288ad564a7d25ec3e841810d79	indy3EGA	dhewg +	EGA	Amiga	de	330f631502e381a4e199a3f7cb483c20	indy3EGA	dhewg +	EGA	Amiga	fr	e689bdf67f98b1d760ce4487ec0e8d06	indy3EGA	Gerald Vincent +	EGA	Amiga	it	df03ee021aa9b81d90cab9c26da07614	indy3EGA	Andrea Petrucci +	EGA	Atari	en	157367c3c21e0d03a0cba44361b4cf65	indy3EGA	Andreas Bylund +	EGA	Atari	fr	0f9c7a76657f0840b8f7ccb5bffeb9f4	indy3EGA	Andreas Bylund +	EGA Demo	DOS	en	b597e0403cc0002f69170e6caba7edd9	indy3EGA + +	VGA	DOS	All	1875b90fade138c9253a8e967007031a	indy3 +	VGA	DOS	de	399b217b0c8d65d0398076da486363a9	indy3 +	VGA	DOS	it	17b5d5e6af4ae89d62631641d66d5a05	indy3	Andrea Petrucci +	 +	FM-TOWNS	FM-TOWNS	en	04687cdf7f975a89d2474929f7b80946	indy3towns +	FM-TOWNS	FM-TOWNS	jp	3a0c35f3c147b98a2bdf8d400cfc4ab5	indy3towns	Paul Priest, Andrea Petrucci + +Loom +	Demo	DOS	en	5a35e36fd777e9c37a49c5b2faca52f9	loom +	Floppy	Mac	en	6f0be328c64d689bb606d22a389e1b0f	loom +	Floppy v1.0	DOS	en	28ef68ee3ed76d7e2ee8ee13c15fbd5b	loom +	Floppy v1.0 alternative	DOS	en	73e5ab7dbb9a8061cc6d25df02dbd1e7	loom	Andrea Petrucci +	Floppy (v1.1 16 Mar 90)	DOS	en	37f56ceb13e401a7ac7d9e6b37fecaf7	loom	Kirben, Andrea Petrucci +	Floppy (v1.1 29 Mar 90)	DOS	en	22f4ea88a09da12df9308ba30bcb7d0f	loom	James Grosbeck +	Floppy	DOS	de	fa127d7c4bb47d05bb1c33ddcaa9f767	loom +	Floppy	DOS	fr	b886b0a5d909c7158a914e1d7c1c6c65	loom	Andrea Petrucci +	Floppy	DOS	it	c3df37df9d3b481b45f75283a9907c47	loom	Andrea Petrucci +	Floppy	DOS	es	2a208ffbcd0e83e86f4356e6f64aa6e1	loom	abnog, Andrea Petrucci +	Floppy	DOS	hb	187d315f6b5168f68680dfe8c3d76a3e	loom +	Floppy	Amiga	en	4dc780f1bc587a193ce8a97652791438	loom	Antti Leimi, Andrea Petrucci +	Floppy	Amiga	de	2fe369ad70f52a8cf7ad6077ee64f81a	loom	Norbert Lange +	Floppy (same as IT?!?)	Amiga	fr	39cb9dec16fa16f38d79acd80effb059	loom	Gerald Vincent +	Floppy (same as FR?!?)	Amiga	it	39cb9dec16fa16f38d79acd80effb059	loom	Andrea Petrucci +	Floppy	Atari	de	c24c490373aeb48fbd54caa8e7ae376d	loom	Andreas Bylund +	Talkie/CD	DOS	en	5d88b9d6a88e6f8e90cded9d01b7f082	loomcd +	FM-TOWNS	FM-TOWNS	en	c5d10e190d4b4d59114b824f2fdbd00e	loomTowns	dhewg, Andrea Petrucci +	FM-TOWNS	FM-TOWNS	jp	31b8fda4c8c7413fa6b39997e776eba4	loomTowns	khalek, Andrea Petrucci + +The Secret of Monkey Island +	EGA (4 disk)	DOS	en	1d05cd189e4908f79b57e78a4402f292	monkeyega	Andrea Petrucci +	EGA (8 disk)	DOS	en	49210e124e4c2b30f1290a9ef6306301	monkeyega +	EGA (8 disk)	DOS	de	fc6b6148e80d67939d9a18697c0f626a	monkeyega	ghoostkilla +	EGA (8 disk)	DOS	fr	1dd3c11ea4439adfe681e4e405b624e1	monkeyega	Andrea Petrucci +	EGA (4 disk)	DOS	it	477dbafbd66a53c98416dc01aef019ad	monkeyega	Andrea Petrucci +	EGA (8 disk)	DOS	es	910e31cffb28226bd68c569668a0d6b4	monkeyega	Andrea Petrucci +	EGA	Atari	fr	9e5e0fb43bd22f4628719b7501adb717	monkeyega	Andreas Bylund +	EGA Demo	DOS	en	71523b539491527d9860f4407faf0411	monkeyega +	EGA Demo	DOS	de	771bc18ec6f93837b839c992b211904b	monkeyega	khalek + +	VGA (4 disk)	DOS	en	15e03ffbfeddb9c2aebc13dcb2a4a8f4	monkeyvga +	VGA (8 disk)	DOS	en	c7890e038806df2bb5c0c8c6f1986ea2	monkeyvga	Andrea Petrucci +	VGA (4 disk)	DOS	de	d0b531227a27c6662018d2bd05aac52a	monkeyvga +	VGA (4 disk)	DOS	es	45152f7cf2ba8f43cf8a8ea2e740ae09	monkeyvga +	VGA (4 disk)	DOS	it	66fd5ff9a810dfeb6d6bdada18221140	monkeyvga	Andrea Petrucci +	VGA	Amiga	en	6c2bff0e327f2962e809c2e1a82d7309	monkeyvga	dhweg +	VGA	Amiga	de	319a4dde52c7960b5aae8a1ec348d918	monkeyvga	ghoostkilla +	VGA (alt?)	Amiga	de	0a212fa35fa8421f31c1f3961272caf0	monkeyvga	Andreas Bylund +	VGA	Amiga	es	870d1e3c86bc50846d808d14a36b4e08	monkeyvga	Andreas Bylund +	VGA	Amiga	fr	3433be9866ca4261b2d5d25374e3f243	monkeyvga	Gerald Vincent +	VGA	Amiga	it	fb66aa42de21675116346213f176a366	monkeyvga	Andrea Petrucci +	VGA Demo	Amiga	en	54a936ad06161ff7bfefcb96200f7bff	monkeyvga	khalek + +	CD	DOS	en	2d1e891fe52df707c30185e52c50cd92	monkey +	CD	DOS	de	305d3dd57c96c65b017bc70c8c7cfb5e	monkey +	CD	DOS	es	f049e38c1f8302b5db6170f1872af89a	monkey	Andrej Sinicyn, Andrea Petrucci +	CD	DOS	it	da6269b18fcb08189c0aa9c95533cce2	monkey	Andrej Sinicyn, Andrea Petrucci +	CD	DOS	fr	aa8a0cb65f3afbbe2c14c3f9f92775a3	monkey	Andrej Sinicyn, Andrea Petrucci + +	-	DOS	fr	aa8a0cb65f3afbbe2c14c3f9f92775a3	monkey1	Nicolas Sauzède +	-	Mac	en	2ccd8891ce4d3f1a334d21bff6a88ca2	monkey1	Lars Næsbye Christensen +	-	SEGA	en	c13225cb1bbd3bc9fe578301696d8021	game + +	FM-TOWNS	FM-TOWNS	en	8eb84cee9b429314c7f0bdcf560723eb	monkey	Paul Priest, Andrea Petrucci +	FM-TOWNS	FM-TOWNS	jp	e17db1ddf91b39ca6bbc8ad3ed19e883	monkey	Paul Priest, Andrea Petrucci + +Misc demos +	Passport to Adventure	DOS	en	e6cd81b25ab1453a8a6d3482118c391e	pass + +	indy/loom non-interactive	FM-TOWNS	en	2d388339d6050d8ccaa757b64633954e	zakTowns	khalek +	zak/loom non-interactive	FM-TOWNS	en	77f5c9cc0986eb729c1a6b4c8823bbae	zakTowns	khalek +	indy/zak non-interactive	FM-TOWNS	en	3938ee1aa4433fca9d9308c9891172b1	zakTowns	khalek + +Monkey Island 2: LeChuck's revenge +	-	Amiga	en	132bff65e6367c09cc69318ce1b59333	monkey2 +	-	Amiga	de	da669b20271b85182e9c17a2a37ea02e	monkey2	Andreas Bylund, Norbert Lange +	-	Amiga	es	6ea966b4d660c870b9ee790d1fbfc535	monkey2	Andreas Bylund +	-	Amiga	fr	c30ef068add4277104243c31ce46c12b	monkey2	Andreas Bylund +	-	Amiga	it	11ddf1fde76e3156eb3a38da213f484e	monkey2	Andrea Petrucci +	-	Mac	en	4cb9c3618f71668f8e4346c8f323fa82	monkey2 +	- (alt?)	Mac	en	e246e02db9630533a40d99c9f54a8e01	monkey2	Lars Næsbye Christensen +	-	DOS	en	3686cf8f89e102ececf4366e1d2c8126	monkey2 +	-	DOS	de	6886e5d08cee329b1f2e743ae2e3ceed	monkey2 +	-	DOS	fr	8e4ee4db46954bfe2912e259a16fad82	monkey2	Nicolas Sauzède, Andrea Petrucci +	CD	DOS	it	69ea626f1f87eecb78ea0d6c6b983a1d	monkey2	Andrea Petrucci +	Floppy	DOS	it	bd126753de619a495f9f22adc951c8d5	monkey2	Andrea Petrucci +	-	DOS	es	7974365d3dc0f43a2748c975f91ff042	monkey2	Andrea Petrucci +	FM-TOWNS	FM-TOWNS	en	da09e666fc8f5b78d7b0ac65d1a3b56e	monkey2	dhewg, Andrea Petrucci +	FM-TOWNS	FM-TOWNS	jp	430bc518017b6fac046f58bab6baad5d	monkey2	Antti Leimi, Andrea Petrucci +	Demo (non-interactive)	DOS	en	387a544b8b10b26912d8413bab63a853	mi2demo	khalek + +Indiana Jones and the Fate of Atlantis +	Talkie	DOS	en	182344899c2e2998fca0bebcd82aa81a	atlantis +	Talkie	Mac	en	1a6e5ae2777a6a33f06ffc0226210934	atlantis	Scott Summers + +	Non-Talkie	DOS	en	c63ee46143ba65f9ce14cf539ca51bd7	atlantis	Andrea Petrucci +	Non-Talkie	DOS	de	1fbebd7b2b692df5297870447a80cfed	atlantis +	Non-Talkie	DOS	fr	edfdb24a499d92c59f824c52987c0eec	atlantis	Nicolas Sauzède, Andrea Petrucci +	Non-Talkie	DOS	es	9bd2a8f72613e715c199246dd511e10f	atlantis	abnog, Andrea Petrucci +	Non-Talkie	DOS	it	8f3758ff98c9c5d78e5d635222cad026	atlantis	Andrea Petrucci + +	Non-Talkie	Amiga	en	3a03dab514e4038df192d8a8de469788	atlantis	dhewg +	Non-Talkie	Amiga	de	4f267a901719623de7dde83e47d5b474	atlantis	ghoostkilla +	Non-Talkie	Amiga	de	e534d29afb3c6e0ee9dc3d53c5956714	atlantis	Tobias Fleischer +	Non-Talkie	Amiga	it	5798972220cd458be2626d54c80f71d7	atlantis	Andrea Petrucci + +	Non-Talkie	Mac	en	d6dd0646404768a63e963891a96daadd	atlantis	Fingolfin +	Non-Talkie	Mac	en	06b187468113f9ae5a400b148a847fac	atlantis	Lars N¾sbye Christensen + +	FM-TOWNS	FM-TOWNS	en	c7be10f775404fd9785a8b92a06d240c	indy4	dhewg, Andrea Petrucci +	FM-TOWNS	FM-TOWNS	jp	4d34042713958b971cb139fba4658586	indy4	Andrea Petrucci +	FM-TOWNS Demo	FM-TOWNS	jp	28d24a33448fab6795850bc9f159a4a2	indydemo	khalek +	Demo	DOS	en	035deab53b47bc43abc763560d0f8d4b	playfate +	Demo (non-interactive)	DOS	en	99b6f822b0b2612415407865438697d6	fate + +Day Of The Tentacle +	Floppy Version A ?	All?	en	acad97ab1c6fc2a5b2d98abf6db4a190	tentacle +	Floppy Version B ?	DOS	en	2723fea3dae0cb47768c424b145ae0e7	tentacle	Andrej Sinicyn, Andrea Petrucci +	Floppy	DOS	de	57b0d89af79befe1cabce3bece869e7f	tentacle	Andrej Sinicyn, Andrea Petrucci +	Floppy	DOS	fr	92b078d9d6d9d751da9c26b8b3075779	tentacle	Nicolas Sauzède, Andrea Petrucci +	Floppy	DOS	it	50fcdc982a25063b78ad46bf389b8e8d	tentacle	Andrea Petrucci +	Floppy	DOS	es	ae94f110a14ce71fc515d5b648827a8f	tentacle	abnog, Andrea Petrucci +	Talkie	All?	en	4167a92a1d46baa4f4127d918d561f88	tentacle +	Talkie	All?	de	6e959d65358eedf9b68b81e304b97fa4	tentacle +	Talkie ?	All?	fr	8aa05d3cdb0e795436043f0546af2da2	tentacle	Andrea Petrucci +	Talkie	All?	it	4fbbe9f64b8bc547503a379a301183ce	tentacle	Andrea Petrucci +	Talkie	All?	es	883af4b0af4f77a92f1dcf1d0a283140	tentacle	Andrea Petrucci +	Demo	DOS	en	c83079157ec765a28de445aec9768d60	dottdemo + +Sam & Max +	Non-Talkie	DOS	en	a3036878840720fbefa41e6965fa4a0a	samnmax	Andrea Petrucci +	Non-Talkie (alt?)	DOS	en	3b301b7892f883ce42ab4be6a274fea6	samnmax	Andrea Petrucci +	Non-Talkie	DOS	de	f27b1ba0eadaf2a6617b2b58192d1dbf	samnmax	dhewg, Andrea Petrucci +	Non-Talkie	DOS	fr	ef347474f3c7be3b29584eaa133cca05	samnmax	Nicolas Sauzède, Andrea Petrucci +	Non-Talkie	DOS	it	b289a2a8cbedbf45786e0b4ad2f510f1	samnmax	Andrea Petrucci +	Non-Talkie	DOS	es	fc53ce0e5f6562b1c1e1b4b8203acafb	samnmax	Andrea Petrucci +	Talkie	All?	en	d917f311a448e3cc7239c31bddb00dd2	samnmax +	Talkie	All?	de	0fb73eddfcf584c02ba097984df131ba	samnmax +	Talkie	All?	fr	7edd665bbede7ea8b7233f8e650be6f8	samnmax	Andrea Petrucci +	Talkie	All?	it	0f6f2e716ba896a44e5059bba1de7ca9	samnmax	Andrea Petrucci +	Talkie	All?	es	4ba7fb331296c283e73d8f5b2096e551	samnmax	Andrea Petrucci +	Demo	DOS	en	d9d0dd93d16ab4dec55cabc2b86bbd17	samdemo +	Demo	Mac	en	0425954a9db5c340861672892c3e678d	samdemo + +	interactive Demo	DOS	en	c3196c5349e53e387aaff1533d95e53a	snmdemo +	Interactive WIP Demo	DOS	en	0e4c5d54a0ad4b26132e78b5ea76642a	snmidemo + +Full Throttle +	Version A	All?	en	09820417db26687bb7fe0c83cc4c553b	ft +	Version B	All?	en	60ba818dc3bede86d40357e3913f8505	ft	sev + +	-	All?	de	8bdb0bf87b5e303dd35693afb9351215	ft	dhewg +	-	All?	es	e72bb4c2b613db2cf50f89ff6350e70a	ft +	-	All?	ru	55e4cc866ff9046824e1c638ba2b8c7f	ft	sev +	-	All?	it	55518cd73cf9c6d23ea29c51ee06bdfe	ft	delfino +	-	All?	fr	4bedb49943df95a9c900a5a82ccbe9de	ft	cyx + +	Demo	DOS	en	32a433dea56b86a55b59e4ff7d755711	ftpcdemo +	Demo	Mac	en	9d7b67be003fea60be4dcbd193611936	ftdemo + +The Dig +	-	All	All	d8323015ecb8b10bf53474f6e6b0ae33	dig +	-	All	ru	d62047a6729349ab36f7ee065bf26509	dig	sev +	Demo	All	en	362c1d281fb9899254cda66ad246c66a	digdemo + +Curse of Monkey Island +	-	All	All	fe60d6b5ff51b0553ac59963123b5777	comi +	Demo	All	All	8fec68383202d38c0d25e9e3b757c5df	comidemo + +Backyard Baseball 2001 +	Demo	Windows	en	a194f15f51ee62badab74b9e7da97693	bb2demo	khalek, sev + +Backyard Football 2002 +	Demo	Windows	en	5bd335265a61caa3d78956ad9f88ba23	FOOTDEMO	sev + +Big Thinkers: Kindergarten +	-	Windows	en	92fc0073a4cf259ff36070ecb8628ba8	thinkerk	Kirben +	Demo	All	en	695fe0b3963333b7e15b37514db3c745	kinddemo	khalek, sev + +Big Thinkers First Grade +	Demo	Windows	en	0f5935bd5e88ba6f09e558d64459746d	1grademo	khalek + +Blue's ABC Time +	Demo	Windows	en	7ddeaf52c8b9a50551ce0aa2ac811d07	BluesABCTimeDemo	khalek, sev +	Demo	Windows	en	810a9da887aefa597b0cf3c77d262897	BluesABCTimeDemo	sev + +Fatty Bears Birthday Surprise +	Demo	DOS	en	47e75b1bdcb44c78cb94883d1731ccf8	fbdemo	khalek +	Demo	Windows	en	22c9eb04455440131ffc157aeb8d40a8	fbdemo	khalek +	Demo	Mac	en	6df20c50c1ab19799de9be7ae7716881	TODO	khalek +	-	DOS	en	3824e60cdf639d22f6df92a03dc4b131	fbear	khalek +	-	Windows	en	179879b6e35c1ead0d93aab26db0951b	fbear	khalek +	-	Mac	en	3df6ead57930488bc61e6e41901d0e97	Fatty Bear	khalek + +Fatty Bears Fun Pack +	-	DOS	hb	f06e66fd45b2f8b0f4a2833ff4476050	fbpack + +Freddi Fish 1: The Case of the Missing Kelp Seeds +	-	All	en	df047cc4792150f601290357566d36a6	freddi	khalek +	-	Windows	ru	d4cccb5af88f3e77f370896e9ba8c5f9	freddi	sev +	Demo	Windows	en	084ed0fa98a6d1e9368d67fe9cfbd417	freddemo	khalek +	Demo	Windows	en	0855496dde35356b1a9691e22ba84cdc	freddemo	khalek +	Demo	Windows	en	566165a7338fa11029e7c14d94fa70d0	freddemo	khalek +	Demo	Mac	en	c8aac5e3e701874e2fa4117896f9e1b1	Freddi Demo	khalek, sev + +Freddi Fish 2: The Case of the Haunted Schoolhouse +	-	Windows	en	51305e929e330e24a75a0351c8f9975e	freddi2	Kirben +	-	Windows	All	5057fb0e99e5aa29df1836329232f101	freddi2	sev +	-	Windows	nl	ac62d50e39492ee3738b4e83a5ac780f	freddi2	joostp +	Demo	All	en	fc8d197a22146e74766e9cb0cfcaf1da	ff2-demo	khalek, sev +	Demo	Windows	en	d37c55388294b66e53e7ced3af88fa68	ffhsdemo	khalek + +Freddi Fish 3: The Case of the Stolen Conch Shell +	-	Windows	All	8368f552b1e3eba559f8d559bcc4cadb	freddi3	Kirben, sev +	Demo	All	en	cb1559e8405d17a5a278a6b5ad9338d1	f3-mdemo	khalek, sev + +Freddie Fish 4: The Case of the Hogfish Rustlers of Briny Gulch +	-	Windows	All	4f580a021eee026f3b4589e17d130d78	freddi4	Kirben, sev +	Demo	Windows	en	7c2e76087027eeee9c8f8985f93a1cc5	f4-demo	khalek +	Demo	Windows	en	c25755b08a8d0d47695e05f1e2111bfc	f4-demo	sev +	Demo	Windows	en	ebd324dcf06a4c49e1ba5c231eee1060	f4-demo	sev +	Demo	Windows	nl	16effd200aa6b8abe9c569c3e578814d	ff4demo	joostp + +Freddi Fish 5: The Case of the Creature of Coral Cave +	-	Windows	en	590e6546aacd0d374b7f3a4f53013ab1	freddicove	cyx +	-	Windows	ru	21abe302e1b1e2b66d6f5c12e241ebfd	freddicove	sev +	Demo	Windows	nl	6b257bb2827dd894b8109a50a1a18b5a	FF5Demo	Kirben + +Freddi Fish and Luther's Water Worries +	-	Windows	ru	2012f854d83d9cc6f73b2b544cd8bbf8	water	sev +	-	Windows	en	4ba37f835be11a59d969f90f272f575b	water	Kirben + +Freddi Fish and Luther's Maze Madness +	-	Windows	en	4f04b321a95d4315ce6d65f8e1dd0368	maze	Kirben + +Humongous Interactive Catalog +	-	Windows	en	11e6e244078ff09b0f3832e35420e0a7	catalog	khalek, sev +	-	Windows	en	037385a953789190298494d92b89b3d0	catalog2	khalek, sev + +Let's Explore the Farm with Buzzy +	-	Windows	en	a85856675429fe88051744f755b72f93	farm	Kirben +	-	Mac	en	fbbbb38a81fc9d6a61d509278390a290	The Farm	khalek +	Demo	Windows	en	8d479e36f35e80257dfc102cf4b8a912	farmdemo	khalek, sev +	Demo	Windows	en	bf8b52fdd9a69c67f34e8e9fec72661c	farmdemo	khalek, sev + +Let's Explore the Airport with Buzzy +	-	Windows	en	07433205acdca3bc553d0e731588b35f	airport	Kirben +	Demo	Windows	en	86c9902b7bec1a17926d4dae85beaa45	airdemo	khalek +	Demo	Windows	en	e144f5f49d9241d2a9dee2576b3d09cb	airdemo	khalek +	Demo	Windows	en	8ffd618a776a4c0d8922bb28b09f8ce8	airdemo	khalek +	Demo	Mac	en	7ea2da67ebabea4ac20cee9f4f9d2934	Airport Demo	khalek + +Let's Explore the Jungle with Buzzy +	-	Windows	en	8801fb4a1200b347f7a38523339526dd	jungle	Kirben + +Pajama Sam 1: No Need to Hide When It's Dark Outside +	-	All	en	672dec94b82f7f0877ebb5b5cf7f4bc1	pajama	khalek +	-	Windows	nl	4fa6870d9bc8c313b65d54b1da5a1891	pajama	joostp +	Demo	All	en	f237bf8a5ef9af78b2a6a4f3901da341	pjs-demo	khalek, sev +	Demo	Windows	en	d7ab7cd6105546016e6a0d46fb36b964	pjsamdemo	khalek + +Pajama Sam 2: Thunder and Lightning Aren't so Frightening +	-	Windows	en	d4e79c3d8645b8266cd78c325bc35154	pajama2	Kirben +	Demo	All	en	36a6750e03fb505fc19fc2bf3e4dbe91	pj2demo	sev + +Pajama Sam 3: You Are What You Eat From Your Head to Your Feet +	-	Windows	en	f7711f9264d4d43c2a1518ec7c10a607	pajama3	Kirben +	Demo	Windows	en	a654fb60c3b67d6317a7894ffd9f25c5	pj3-demo	sev +	Demo	Windows	en	a9f2f04b1ecaab9495b59befffe9bf88	pj3-demo	sev +	Demo	Windows	en	cf90b4db5486ef798db78fe6fbf897e5	pj3-demo	khalek +	Demo	Windows	en	d7ab7cd6105546016e6a0d46fb36b964	PjSamDemo	khalek, sev +	Demo	All	nl	f08145577e4f13584cc90b3d6e9caa55	pj3demo	joostp + +Pajama Sam's Lost & Found +	-	Windows	en	ed361270102e355afe5236954216aba2	lost	Kirben +	Demo	Windows	en	a2bb6aa0537402c1b3c2ea899ccef64b	smaller	Kirben + +Pajama Sam's Sock Works +	-	Windows	en	5e8fb66971a60e523e5afbc4c129c0e8	socks	Kirben + +Putt-Putt Enters the Race +	-	Windows	en	981e1e1891f2be7e25a01f50ae55a5af	puttrace +	Demo	All	en	0ac41e2e3d2174e5a042a6b565328dba	racedemo	sev +	Demo	All	nl	aaa587701cde7e74692c68c1024b85eb	racedemo	joostp + +Putt-Putt Goes To The Moon +	Demo	DOS	en	aa6a91b7f6f119d1b7b1f2a4c9e24d59	moondemo +	Demo	Windows	en	9c143c5905055d5df7a0f014ab379aee	moondemo	khalek +	Demo	Mac	en	4af4a6b248103c1fe9edef619677f540	moondemo	khalek +	-	DOS	en	780e4a0ae2ff17dc296f4a79543b44f8	puttmoon	khalek +	-	Windows	en	9c92eeaf517a31b7221ec2546ab669fd	puttmoon	khalek +	-	Mac	en	9dc02577bf50d4cfaf3de3fbac06fbe2	Putt-Putt Moon	khalek + +Putt-Putt Joins the Circus +	-	All	en	ab0693e9324cfcf498fdcbb12acf8bb4	puttcircus	sev +	Demo	All	en	a7cacad9c40c4dc9e1812abf6c8af9d5	circdemo	Kirben, sev + +Putt-Putt Joins The Parade +	Demo	DOS	en	31aa57f460a3d12429f0552a46a90b39	puttdemo +	Demo	Windows	en	37ff1b308999c4cca7319edfcc1280a0	puttdemo	khalek +	Demo	Mac	en	f40a7f495f59188ca57a9d1d50301bb6	puttdemo	khalek +	-	DOS	en	9708cf716ed8bcc9ff3fcfc69413b746	puttputt	khalek +	-	Windows	en	6a30a07f353a75cdc602db27d73e1b42	puttputt	khalek +	-	Mac	en	684732efb5799c0f78804c99d8de9aba	Putt-Putt Parade	khalek +	-	3DO	en	7e151c17adf624f1966c8fc5827c95e9	puttputt	khalek + +Putt-Putt Saves the Zoo +	-	Windows	en	1005456bfe351c1b679e1ff2dc2849e9	puttzoo	khalek +	-	Windows	en	92e7727e67f5cd979d8a1070e4eb8cb3	puttzoo	cyx +	-	Windows	nl	c3b22fa4654bb580b20325ebf4174841	puttzoo	joostp +	-	Mac	en	58fdf4c7ad13540a734e18f8584cad89	Putt-Putt Saves the Zoo	khalek +	Demo	Windows	en	1005456bfe351c1b679e1ff2dc2849e9	puttzoo	khalek +	Demo	Windows	en	f3d55aea441e260e9e9c7d2a187097e0	zoodemo	khalek +	Demo	Windows	en	de4efb910210736813c9a1185384bace	zoodemo	khalek +	Demo	Mac	en	3486ede0f904789267d4bcc5537a46d4	Puttzoo Demo	khalek + +Putt-Putt Travels Through Time +	-	All?	en	2108d83dcf09f8adb4bc524669c8cf51	PuttTime +	Demo	All	en	4e5867848ee61bc30d157e2c94eee9b4	timedemo	khalek, sev +	Demo	Windows	en	0ab19be9e2a3f6938226638b2a3744fe	putttime-demo	khalek + +Putt-Putt and Pep's Balloon-O-Rama +	-	Windows	en	08cc5c3eedaf72ebe12734eee94f7fa2	balloon	Kirben + +Putt-Putt and Pep's Dog on a Stick +	-	Windows	en	d4b8ee426b1afd3e53bc0cf020418cf6	dog	sev +	-	Windows	en	eae95b2b3546d8ba86ae1d397c383253	dog	Kirben + +Putt-Putts Fun Pack +	-	DOS	en	46b53fd430adcfbed791b48a0d4b079f	funpack	khalek + +Spy Fox 1: Dry Cereal +	-	Windows	en	3de99ef0523f8ca7958faa3afccd035a	spyfox	Kirben +	-	Windows	en	6bf70eee5de3d24d2403e0dd3d267e8a	spyfox	khalek +	-	Windows	nl	9bda5fee51d2fda5253d02c642016bf4	spyfox	joostp +	Demo	All	en	53e94115b55dd51d4b8ff0871aa1df1e	foxdemo	khalek, sev +	Demo	All	en	fbdd947d21e8f5bac6d6f7a316af1c5a	spydemo	sev +	Demo	Windows	en	9d4ab3e0e1d1ebc6ba8a6a4c470ed184	spydemo	khalek + +Spy Fox 2: Some Assembly Required +	-	Windows	en	f79e60c17cca601e411f1f75e8ee9b5a	spyfox2	Kirben +	Demo	Windows	en	7222f260253f325c21fcfa68b5bfab67	sf2-demo	Kirben +	Demo	All	nl	1c792d28376d45e145cb916bca0400a2	sf2demo	joostp + +Spy Fox 3: Operation Ozone +	-	Windows	en	600abd3e9f47e63e670188b7e4e86ac7	spyozon	Kirben +	Demo	Windows	en	ebd0b2c8a387f18887282afe6cad894a	sf3-demo	Kirben + +Spy Fox in Cheese Chase Game +	-	Windows	en	589601b676c98b1c0c987bc031ab68b3	chase	Kirben + +Spy Fox in Hold the Mustard +	-	Windows	en	225e18566e810c634bf7de63e7568e3e	mustard	Kirben diff --git a/tools/simon-md5.txt b/tools/simon-md5.txt new file mode 100644 index 0000000000..bbe1c45c57 --- /dev/null +++ b/tools/simon-md5.txt @@ -0,0 +1,29 @@ +Simon the Sorcerer 1 +	-	DOS	en	465eed710cc242b2de7dc77edd467c4c	simon1dos +	-	DOS	en	48ce4ffda968cc7a38870c354571f92c	simon1dos	Kirben +	-	DOS	fr	bed9134804d96f72afa152b8ec5628c3	simon1dos +	-	DOS	it	c8f5b860a20dcc63915d94cf2bdcfa49	simon1dos +	-	DOS	ru	3b22f3cc4ce9faa3f7830ab18235b04d	simon1dos	Kirben +	-	Windows	en	d22302abf44219f95d50f2faa807dd1a	simon1talkie	Kirben +	-	DOS	de	ecc01a02c9b97b49d0b4191a346b0940	simon1talkie	SimSaw +	-	DOS	en	d545db8a0efae95a90b23da81aadb201	simon1talkie	Kirben +	-	DOS	fr	08bd7abefe9c44e43df396748640e531	simon1talkie	jellby +	-	DOS	hb	9d58f84988634d217c944cd4153a2a3b	simon1talkie	jellby +	-	DOS	it	057eac98fc4d14dc7fd04341781b26b3	simon1talkie	jellby +	-	DOS	es	e3712b3ed4429e736123a40276f533d7	simon1talkie	jellby +	-	Amiga	en	ec5358680c117f29b128cbbb322111a4	simon1cd32	Kirben +	AGA	Amiga	en	39e8f13ec29de1fcef98c81ca0a2ae57	simon1amiga +	ECS	Amiga	en	fa5651a5e5da0f3c89473dd62af095d8	simon1amiga +	Demo	DOS	en	486f026593f894f5b6b346ef3984a7a0	simon1demo	Kirben + +Simon the Sorcerer 2 +	-	DOS	en	27c8e7feada80c75b70b9c2f6088d519	simon2dos +	-	Windows	de	9e858b3bb189c134c3a5f34c3385a8d3	simon2talkie	DhWz +	-	Windows	en	bd85a8b5135592ada9cbeae49160f1d3	simon2talkie	Kirben +	-	DOS	de	3bdf85dc57c1abff8f05416b4571198f	simon2talkie	SimSaw +	-	DOS	en	078b04da0974a40645b92baffdf2781e	simon2talkie	Kirben +	-	DOS	fr	c8ddd48919aa75423dd2d3e5864909df	simon2talkie	SimSaw +	-	DOS	hb	a3cbdd3450f9fccb0a9d8d6dc28f66fe	simon2talkie +	-	DOS	es	79a9d9357c15153c8c502dba73c3eac6	simon2talkie	Samuel Suárez +	Demo	DOS	en	1e11ddbad80c408031ae44a0cbce46bb	simon2talkie	Kirben +	Demo	DOS	de	028c6240c9c8e190d86188238505c5e5	simon2talkie	Kirben | 
