[Scummvm-cvs-logs] scummvm master -> f6f8b456e70fe7bcf24f4322f43644d4a4e34ba2

wjp wjp at usecode.org
Sun Sep 11 22:33:09 CEST 2011


This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3715d6d444 CGE: Add EncryptedStream class, remove seed parameter from XCrypt()
08d87130aa CGE: Use EncryptedStream in Text: rewrite caching, remove some methods.
cdba3ac108 CGE: Remove noisy debug message
3b9b89a78b CGE: Talk now uses EncryptedStream. Clean up of EncryptedStream
f6f8b456e7 Merge branch 'cge'


Commit: 3715d6d444792fc93fe98df4f0274f0be846eed1
    https://github.com/scummvm/scummvm/commit/3715d6d444792fc93fe98df4f0274f0be846eed1
Author: Strangerke (strangerke at scummvm.org)
Date: 2011-09-11T05:15:32-07:00

Commit Message:
CGE: Add EncryptedStream class, remove seed parameter from XCrypt()

Changed paths:
    engines/cge/fileio.cpp
    engines/cge/fileio.h
    engines/cge/general.cpp
    engines/cge/general.h



diff --git a/engines/cge/fileio.cpp b/engines/cge/fileio.cpp
index 7624eac..87a1ffe 100644
--- a/engines/cge/fileio.cpp
+++ b/engines/cge/fileio.cpp
@@ -61,7 +61,7 @@ uint16 IoHand::read(void *buf, uint16 len) {
 	if (!bytesRead)
 		error("Read %s - %d bytes", _file->getName(), len);
 	if (_crypt)
-		_seed = _crypt(buf, len, kCryptSeed);
+		_seed = _crypt(buf, len);
 	return bytesRead;
 }
 
@@ -378,4 +378,27 @@ long VFile::seek(long pos) {
 	return (_bufMark = _begMark + pos);
 }
 
+/*-----------------------------------------------------------------------
+ * EncryptedStream
+ *-----------------------------------------------------------------------*/
+EncryptedStream::EncryptedStream(const char *name) {
+	debugC(3, kCGEDebugFile, "EncryptedStream::EncryptedStream(%s)", name);
+
+	_error = false;
+	if (_dat->_error || _cat->_error)
+		error("Bad volume data");
+	BtKeypack *kp = _cat->find(name);
+	if (scumm_stricmp(kp->_key, name) != 0)
+		_error = true;
+
+	_dat->_file->seek(kp->_mark);
+	byte *dataBuffer = (byte *)malloc(kp->_size);
+	_dat->_file->read(dataBuffer, kp->_size);
+	XCrypt(dataBuffer, kp->_size);
+	_readStream = new Common::MemoryReadStream(dataBuffer, kp->_size, DisposeAfterUse::YES);
+}
+
+EncryptedStream::~EncryptedStream() {
+}
+
 } // End of namespace CGE
diff --git a/engines/cge/fileio.h b/engines/cge/fileio.h
index 65f0b95..68b9a26 100644
--- a/engines/cge/fileio.h
+++ b/engines/cge/fileio.h
@@ -147,6 +147,14 @@ public:
 	long seek(long pos);
 };
 
+class EncryptedStream {
+public:
+	bool _error;
+	EncryptedStream(const char *name);
+	~EncryptedStream();
+	Common::SeekableReadStream *_readStream;
+};
+
 extern CFile *_dat;
 extern BtFile *_cat;
 
diff --git a/engines/cge/general.cpp b/engines/cge/general.cpp
index c93cc12..7db6181 100644
--- a/engines/cge/general.cpp
+++ b/engines/cge/general.cpp
@@ -31,13 +31,13 @@
 
 namespace CGE {
 
-uint16 XCrypt(void *buf, uint16 siz, uint16 seed) {
+uint16 XCrypt(void *buf, uint16 siz) {
 	byte *b = static_cast<byte *>(buf);
 
 	for (uint16 i = 0; i < siz; i++)
-		*b++ ^= seed;
+		*b++ ^= kCryptSeed;
 	
-	return seed;
+	return kCryptSeed;
 }
 
 char *mergeExt(char *buf, const char *name, const char *ext) {
diff --git a/engines/cge/general.h b/engines/cge/general.h
index 8f997c9..1793594 100644
--- a/engines/cge/general.h
+++ b/engines/cge/general.h
@@ -45,9 +45,9 @@ struct Dac {
 	uint8 _b;
 };
 
-typedef uint16 Crypt(void *buf, uint16 siz, uint16 seed);
+typedef uint16 Crypt(void *buf, uint16 siz);
 
-uint16  XCrypt(void *buf, uint16 siz, uint16 seed);
+uint16  XCrypt(void *buf, uint16 siz);
 int     takeEnum(const char **tab, const char *text);
 uint16  chkSum(void *m, uint16 n);
 char   *mergeExt(char *buf, const char *name, const char *ext);


Commit: 08d87130aa31606bfb62ef8a574e161a30866225
    https://github.com/scummvm/scummvm/commit/08d87130aa31606bfb62ef8a574e161a30866225
Author: Strangerke (strangerke at scummvm.org)
Date: 2011-09-11T05:19:46-07:00

Commit Message:
CGE: Use EncryptedStream in Text: rewrite caching, remove some methods.

Changed paths:
    engines/cge/cge.cpp
    engines/cge/cge_main.cpp
    engines/cge/text.cpp
    engines/cge/text.h



diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp
index 1b9fcf6..ade3071 100644
--- a/engines/cge/cge.cpp
+++ b/engines/cge/cge.cpp
@@ -91,7 +91,7 @@ void CGEEngine::init() {
 	Cluster::init(this);
 
 	// Initialise engine objects
-	_text = new Text(this, "CGE", 128);
+	_text = new Text(this, "CGE");
 	_vga = new Vga();
 	_sys = new System(this);
 	_pocLight = new PocLight(this);
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
index b9033a8..d3c8884 100644
--- a/engines/cge/cge_main.cpp
+++ b/engines/cge/cge_main.cpp
@@ -623,7 +623,6 @@ void CGEEngine::caveUp() {
 
 	showBak(BakRef);
 	loadMapping();
-	_text->preload(BakRef, BakRef + 1000);
 	Sprite *spr = _vga->_spareQ->first();
 	while (spr) {
 		Sprite *n = spr->_next;
@@ -689,8 +688,6 @@ void CGEEngine::caveDown() {
 		}
 		spr = n;
 	}
-
-	_text->clear(1000);
 }
 
 void CGEEngine::xCave() {
@@ -1305,8 +1302,6 @@ void CGEEngine::runGame() {
 	if (_eventManager->_quitFlag)
 		return;
 
-	_text->clear();
-	_text->preload(100, 1000);
 	loadHeroXY();
 
 	_cavLight->_flags._tran = true;
diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp
index 25af8ec..7e574a0 100644
--- a/engines/cge/text.cpp
+++ b/engines/cge/text.cpp
@@ -31,22 +31,26 @@
 #include "cge/game.h"
 #include "cge/snail.h"
 #include "cge/cge_main.h"
+#include "common/str.h"
 
 namespace CGE {
 
 Text *_text;
 Talk *_talk = NULL;
 
-Text::Text(CGEEngine *vm, const char *fname, int size) : _vm(vm) {
-	_cache = new Handler[size];
+Text::Text(CGEEngine *vm, const char *fname) : _vm(vm) {
 	mergeExt(_fileName, fname, kSayExt);
 	if (!_cat->exist(_fileName))
 		error("No talk (%s)\n", _fileName);
+	int16 txtCount = count() + 1;
+	warning("Number of texts: %d", txtCount);
 
-	for (_size = 0; _size < size; _size++) {
+	_cache = new Handler[txtCount];
+	for (_size = 0; _size < txtCount; _size++) {
 		_cache[_size]._ref = 0;
 		_cache[_size]._text = NULL;
 	}
+	load();
 }
 
 Text::~Text() {
@@ -54,125 +58,81 @@ Text::~Text() {
 	delete[] _cache;
 }
 
-void Text::clear(int from, int upto) {
-	for (Handler *p = _cache, *q = p + _size; p < q; p++) {
-		if (p->_ref && p->_ref >= from && p->_ref < upto) {
-			p->_ref = 0;
-			delete[] p->_text;
-			p->_text = NULL;
-		}
-	}
-}
-
-int Text::find(int ref) {
-	int i = 0;
-	for (Handler *p = _cache, *q = p + _size; p < q; p++) {
-		if (p->_ref == ref)
-			break;
-		else
-			i++;
-	}
-	return i;
-}
-
-
-void Text::preload(int from, int upto) {
-	VFile tf = _fileName;
+int16 Text::count() {
+	EncryptedStream tf = _fileName;
 	if (tf._error)
-		return;
-
-	Handler *CacheLim = _cache + _size;
-	char line[kLineMax + 1];
-	int n;
+		return NULL;
 
-	while ((n = tf.read((uint8 *)line)) != 0) {
-		if (line[n - 1] == '\n')
-			line[--n] = '\0';
+	Common::String line;
+	char tmpStr[kLineMax + 1];
+	int n, count = 0;
 
+	for (line = tf._readStream->readLine(); !tf._readStream->eos(); line = tf._readStream->readLine()) {
+		n = line.size();
 		char *s;
-		if ((s = strtok(line, " =,;/\t\n")) == NULL)
+
+		strcpy(tmpStr, line.c_str());
+		if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
 			continue;
 		if (!isdigit(*s))
 			continue;
 
-		int ref = atoi(s);
-		if (ref && ref >= from && ref < upto) {
-			Handler *p = &_cache[find(ref)];
-
-			if (p < CacheLim) {
-				delete[] p->_text;
-				p->_text = NULL;
-			} else
-				p = &_cache[find(0)];
-
-			if (p >= CacheLim)
-				break;
-
-			s += strlen(s);
-			if (s < line + n)
-				++s;
-			if ((p->_text = new char[strlen(s) + 1]) == NULL)
-				break;
+		count++;
+	}
+	return count;
+}
 
-			p->_ref = ref;
-			strcpy(p->_text, s);
+void Text::clear() {
+	for (Handler *p = _cache, *q = p + _size; p < q; p++) {
+		if (p->_ref) {
+			p->_ref = 0;
+			delete[] p->_text;
+			p->_text = NULL;
 		}
 	}
 }
 
+void Text::load() {
+	EncryptedStream tf = _fileName;
+	assert(!tf._error);
 
-char *Text::load(int idx, int ref) {
-	VFile tf = _fileName;
-	if (tf._error)
-		return NULL;
-
-	char line[kLineMax + 1];
-	int n;
+	Common::String line;
+	char tmpStr[kLineMax + 1];
+	int idx;
 
-	while ((n = tf.read((uint8 *)line)) != 0) {
+	for (idx = 0, line = tf._readStream->readLine(); !tf._readStream->eos(); line = tf._readStream->readLine()) {
+		int n = line.size();
 		char *s;
 
-		if (line[n - 1] == '\n')
-			line[-- n] = '\0';
-		if ((s = strtok(line, " =,;/\t\n")) == NULL)
+		strcpy(tmpStr, line.c_str());
+		if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
 			continue;
 		if (!isdigit(*s))
 			continue;
 
 		int r = atoi(s);
-		if (r < ref)
-			continue;
-		if (r > ref)
-			break;
 
-		// (r == ref)
 		s += strlen(s);
-		if (s < line + n)
+		if (s < tmpStr + n)
 			++s;
 
-		Handler *p = &_cache[idx];
-		p->_ref = ref;
-
-		if ((p->_text = new char[strlen(s) + 1]) == NULL)
-			return NULL;
-		return strcpy(p->_text, s);
+		_cache[idx]._ref = r;
+		_cache[idx]._text = new char[strlen(s) + 1];
+		strcpy(_cache[idx]._text, s);
+		idx++;
 	}
-	return NULL;
 }
 
 char *Text::getText(int ref) {
 	int i;
-	if ((i = find(ref)) < _size)
+	for (i = 0; (i < _size) && (_cache[i]._ref != ref); i++)
+		;
+
+	if (i < _size)
 		return _cache[i]._text;
 
-	if ((i = find(0)) >= _size) {
-		clear(kSysTextMax);            // clear non-system
-		if ((i = find(0)) >= _size) {
-			clear();              // clear all
-			i = 0;
-		}
-	}
-	return load(i, ref);
+	warning("getText: Unable to find ref %d", ref);
+	return NULL;
 }
 
 void Text::say(const char *text, Sprite *spr) {
diff --git a/engines/cge/text.h b/engines/cge/text.h
index 30bb77f..668f307 100644
--- a/engines/cge/text.h
+++ b/engines/cge/text.h
@@ -48,13 +48,12 @@ class Text {
 	} *_cache;
 	int _size;
 	char _fileName[kPathMax];
-	char *load(int idx, int ref);
-	int find(int ref);
+	void load();
+	int16 count();
 public:
-	Text(CGEEngine *vm, const char *fname, int size);
+	Text(CGEEngine *vm, const char *fname);
 	~Text();
-	void clear(int from = 1, int upto = 0x7FFF);
-	void preload(int from = 1, int upto = 0x7FFF);
+	void clear();
 	char *getText(int ref);
 	void say(const char *text, Sprite *spr);
 	void sayTime(Sprite *spr);


Commit: cdba3ac108940e141901f021da890e2ddbda70f0
    https://github.com/scummvm/scummvm/commit/cdba3ac108940e141901f021da890e2ddbda70f0
Author: Strangerke (strangerke at scummvm.org)
Date: 2011-09-11T05:21:03-07:00

Commit Message:
CGE: Remove noisy debug message

Changed paths:
    engines/cge/talk.cpp



diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp
index 2d9c17c..609a472 100644
--- a/engines/cge/talk.cpp
+++ b/engines/cge/talk.cpp
@@ -61,7 +61,6 @@ void Font::load() {
 	uint16 p = 0;
 	for (uint16 i = 0; i < kPosSize; i++) {
 		_pos[i] = p;
-		warning("Fonts 0x%X 0x%X", i, p);
 		p += _wid[i];
 	}
 	f.read(_map, p);


Commit: 3b9b89a78bf65db18bdc6d0c3a1268c892d3db2c
    https://github.com/scummvm/scummvm/commit/3b9b89a78bf65db18bdc6d0c3a1268c892d3db2c
Author: Strangerke (strangerke at scummvm.org)
Date: 2011-09-11T06:07:56-07:00

Commit Message:
CGE: Talk now uses EncryptedStream. Clean up of EncryptedStream

Changed paths:
    engines/cge/fileio.cpp
    engines/cge/fileio.h
    engines/cge/talk.cpp
    engines/cge/talk.h
    engines/cge/text.cpp



diff --git a/engines/cge/fileio.cpp b/engines/cge/fileio.cpp
index 87a1ffe..34c7c65 100644
--- a/engines/cge/fileio.cpp
+++ b/engines/cge/fileio.cpp
@@ -398,6 +398,22 @@ EncryptedStream::EncryptedStream(const char *name) {
 	_readStream = new Common::MemoryReadStream(dataBuffer, kp->_size, DisposeAfterUse::YES);
 }
 
+uint32 EncryptedStream::read(void *dataPtr, uint32 dataSize) {
+	return _readStream->read(dataPtr, dataSize);
+}
+
+bool EncryptedStream::err() {
+	return (_error & _readStream->err());
+}
+
+bool EncryptedStream::eos() {
+	return _readStream->eos();
+}
+
+Common::String EncryptedStream::readLine() {
+	return _readStream->readLine();
+}
+
 EncryptedStream::~EncryptedStream() {
 }
 
diff --git a/engines/cge/fileio.h b/engines/cge/fileio.h
index 68b9a26..1f0756a 100644
--- a/engines/cge/fileio.h
+++ b/engines/cge/fileio.h
@@ -148,11 +148,16 @@ public:
 };
 
 class EncryptedStream {
-public:
+private:
+	Common::SeekableReadStream *_readStream;
 	bool _error;
+public:
 	EncryptedStream(const char *name);
 	~EncryptedStream();
-	Common::SeekableReadStream *_readStream;
+	bool err();
+	bool eos();
+	uint32 read(void *dataPtr, uint32 dataSize);
+	Common::String readLine();
 };
 
 extern CFile *_dat;
diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp
index 609a472..8fd425d 100644
--- a/engines/cge/talk.cpp
+++ b/engines/cge/talk.cpp
@@ -36,9 +36,9 @@ namespace CGE {
 Font::Font(const char *name) {
 	_map = (uint8 *)malloc(kMapSize);
 	_pos = (uint16 *)malloc(kPosSize * sizeof(uint16));
-	_wid = (uint8 *)malloc(kWidSize);
+	_widthArr = (uint8 *)malloc(kWidSize);
 
-	assert((_map != NULL) && (_pos != NULL) && (_wid != NULL));
+	assert((_map != NULL) && (_pos != NULL) && (_widthArr != NULL));
 	mergeExt(_path, name, kFontExt);
 	load();
 }
@@ -46,22 +46,20 @@ Font::Font(const char *name) {
 Font::~Font() {
 	free(_map);
 	free(_pos);
-	free(_wid);
+	free(_widthArr);
 }
 
 void Font::load() {
-	VFile f(_path);
-	if (f._error)
-		return;
+	EncryptedStream f = _path;
+	assert(!f.err());
 
-	f.read(_wid, kWidSize);
-	if (f._error)
-		return;
+	f.read(_widthArr, kWidSize);
+	assert(!f.err());
 
 	uint16 p = 0;
 	for (uint16 i = 0; i < kPosSize; i++) {
 		_pos[i] = p;
-		p += _wid[i];
+		p += _widthArr[i];
 	}
 	f.read(_map, p);
 }
@@ -71,7 +69,7 @@ uint16 Font::width(const char *text) {
 	if (!text)
 		return 0;
 	while (*text)
-		w += _wid[(unsigned char)*(text++)];
+		w += _widthArr[(unsigned char)*(text++)];
 	return w;
 }
 
@@ -116,7 +114,7 @@ void Talk::update(const char *text) {
 					mw = k;
 				k = 2 * hmarg;
 			} else
-				k += _font->_wid[(unsigned char)*p];
+				k += _font->_widthArr[(unsigned char)*p];
 		}
 		if (k > mw)
 			mw = k;
@@ -132,7 +130,7 @@ void Talk::update(const char *text) {
 		if (*text == '|' || *text == '\n') {
 			m = _ts[0]->_m + (ln += kFontHigh + kTextLineSpace) * mw + hmarg;
 		} else {
-			int cw = _font->_wid[(unsigned char)*text];
+			int cw = _font->_widthArr[(unsigned char)*text];
 			uint8 *f = _font->_map + _font->_pos[(unsigned char)*text];
 			for (int i = 0; i < cw; i++) {
 				uint8 *pp = m;
@@ -223,7 +221,7 @@ void Talk::putLine(int line, const char *text) {
 	uint8 *q = v + size;
 
 	while (*text) {
-		uint16 cw = _font->_wid[(unsigned char)*text], i;
+		uint16 cw = _font->_widthArr[(unsigned char)*text], i;
 		uint8 *fp = _font->_map + _font->_pos[(unsigned char)*text];
 
 		for (i = 0; i < cw; i++) {
@@ -280,7 +278,7 @@ void InfoLine::update(const char *text) {
 		uint8 *p = v + 2, * q = p + size;
 
 		while (*text) {
-			uint16 cw = _font->_wid[(unsigned char)*text];
+			uint16 cw = _font->_widthArr[(unsigned char)*text];
 			uint8 *fp = _font->_map + _font->_pos[(unsigned char)*text];
 
 			for (uint16 i = 0; i < cw; i++) {
diff --git a/engines/cge/talk.h b/engines/cge/talk.h
index 6b06e80..23ef9c9 100644
--- a/engines/cge/talk.h
+++ b/engines/cge/talk.h
@@ -52,7 +52,7 @@ class Font {
 	char _path[kPathMax];
 	void load();
 public:
-	uint8  *_wid;
+	uint8  *_widthArr;
 	uint16 *_pos;
 	uint8  *_map;
 	Font(const char *name);
diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp
index 7e574a0..71bb411 100644
--- a/engines/cge/text.cpp
+++ b/engines/cge/text.cpp
@@ -60,14 +60,14 @@ Text::~Text() {
 
 int16 Text::count() {
 	EncryptedStream tf = _fileName;
-	if (tf._error)
+	if (tf.err())
 		return NULL;
 
 	Common::String line;
 	char tmpStr[kLineMax + 1];
 	int n, count = 0;
 
-	for (line = tf._readStream->readLine(); !tf._readStream->eos(); line = tf._readStream->readLine()) {
+	for (line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
 		n = line.size();
 		char *s;
 
@@ -94,13 +94,13 @@ void Text::clear() {
 
 void Text::load() {
 	EncryptedStream tf = _fileName;
-	assert(!tf._error);
+	assert(!tf.err());
 
 	Common::String line;
 	char tmpStr[kLineMax + 1];
 	int idx;
 
-	for (idx = 0, line = tf._readStream->readLine(); !tf._readStream->eos(); line = tf._readStream->readLine()) {
+	for (idx = 0, line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
 		int n = line.size();
 		char *s;
 


Commit: f6f8b456e70fe7bcf24f4322f43644d4a4e34ba2
    https://github.com/scummvm/scummvm/commit/f6f8b456e70fe7bcf24f4322f43644d4a4e34ba2
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-09-11T12:31:55-07:00

Commit Message:
Merge branch 'cge'

This adds the CGE engine for the game Soltys.

It is based on pull request https://github.com/scummvm/scummvm/pull/81 .

Changed paths:
  A engines/cge/bitmap.cpp
  A engines/cge/bitmap.h
  A engines/cge/cge.cpp
  A engines/cge/cge.h
  A engines/cge/cge_main.cpp
  A engines/cge/cge_main.h
  A engines/cge/console.cpp
  A engines/cge/console.h
  A engines/cge/detection.cpp
  A engines/cge/events.cpp
  A engines/cge/events.h
  A engines/cge/fileio.cpp
  A engines/cge/fileio.h
  A engines/cge/game.cpp
  A engines/cge/game.h
  A engines/cge/general.cpp
  A engines/cge/general.h
  A engines/cge/module.mk
  A engines/cge/snail.cpp
  A engines/cge/snail.h
  A engines/cge/snddrv.h
  A engines/cge/sound.cpp
  A engines/cge/sound.h
  A engines/cge/talk.cpp
  A engines/cge/talk.h
  A engines/cge/text.cpp
  A engines/cge/text.h
  A engines/cge/vga13h.cpp
  A engines/cge/vga13h.h
  A engines/cge/vmenu.cpp
  A engines/cge/vmenu.h
  A engines/cge/walk.cpp
  A engines/cge/walk.h
    base/plugins.cpp
    configure
    engines/engines.mk









More information about the Scummvm-git-logs mailing list