...and mor. Next big thing should be to document the overlay stuff, but that'll have to wait till after I slept :-)

svn-id: r13295
This commit is contained in:
Max Horn 2004-03-15 02:21:04 +00:00
parent b389dfa2a3
commit 782dabbcd3
13 changed files with 238 additions and 172 deletions

View file

@ -48,8 +48,7 @@ void ScummEngine::setStringVars(int slot) {
void ScummEngine::unkMessage1() {
byte buffer[100];
_msgPtrToAdd = buffer;
_messagePtr = addMessageToStack(_messagePtr);
_messagePtr = addMessageToStack(_messagePtr, buffer, sizeof(buffer));
// if ((_gameId == GID_CMI) && _debugMode) { // In CMI, unkMessage1 is used for printDebug output
if ((buffer[0] != 0xFF) && _debugMode) {
@ -78,8 +77,7 @@ void ScummEngine::unkMessage2() {
byte buf[100];
const byte *tmp;
_msgPtrToAdd = buf;
tmp = _messagePtr = addMessageToStack(_messagePtr);
tmp = _messagePtr = addMessageToStack(_messagePtr, buf, sizeof(buf));
if (_string[3].color == 0)
_string[3].color = 4;
@ -348,8 +346,7 @@ void ScummEngine::drawString(int a) {
byte fontHeight = 0;
uint color;
_msgPtrToAdd = buf;
_messagePtr = addMessageToStack(_messagePtr);
_messagePtr = addMessageToStack(_messagePtr, buf, sizeof(buf));
_charset->_top = _string[a].ypos + _screenTop;
_charset->_startLeft = _charset->_left = _string[a].xpos;
@ -366,18 +363,18 @@ void ScummEngine::drawString(int a) {
fontHeight = _charset->getFontHeight();
_msgPtrToAdd = buf;
// trim from the right
byte *tmp = buf;
space = NULL;
while (*_msgPtrToAdd) {
if (*_msgPtrToAdd == ' ') {
while (*tmp) {
if (*tmp == ' ') {
if (!space)
space = _msgPtrToAdd;
space = tmp;
} else {
space = NULL;
}
_msgPtrToAdd++;
tmp++;
}
if (space)
*space = '\0';
@ -472,12 +469,16 @@ void ScummEngine::drawString(int a) {
}
}
const byte *ScummEngine::addMessageToStack(const byte *msg) {
const byte *ScummEngine::addMessageToStack(const byte *msg, byte *dstBuffer, int dstBufferSize) {
uint num = 0;
uint32 val;
byte chr;
byte buf[512];
if (dstBuffer) {
_msgPtrToAdd = dstBuffer;
}
if (msg == NULL) {
warning("Bad message in addMessageToStack, ignoring");
return NULL;
@ -563,6 +564,12 @@ const byte *ScummEngine::addMessageToStack(const byte *msg) {
}
*_msgPtrToAdd = 0;
if (dstBuffer) {
// Check for a buffer overflow
if (_msgPtrToAdd >= dstBuffer + dstBufferSize)
error("addMessageToStack: buffer overflow!");
}
return msg;
}
@ -582,7 +589,7 @@ void ScummEngine::addVerbToStack(int var) {
if (num == _verbs[k].verbid && !_verbs[k].type && !_verbs[k].saveid) {
const byte *ptr = getResourceAddress(rtVerb, k);
ptr = translateTextAndPlaySpeech(ptr);
addMessageToStack(ptr);
addMessageToStack(ptr, 0, 0);
break;
}
}
@ -599,9 +606,9 @@ void ScummEngine::addNameToStack(int var) {
if (ptr) {
if ((_version == 8) && (ptr[0] == '/')) {
translateText(ptr, _transText);
addMessageToStack(_transText);
addMessageToStack(_transText, 0, 0);
} else {
addMessageToStack(ptr);
addMessageToStack(ptr, 0, 0);
}
}
}
@ -617,9 +624,9 @@ void ScummEngine::addStringToStack(int var) {
if (ptr) {
if ((_version == 8) && (ptr[0] == '/')) {
translateText(ptr, _transText);
addMessageToStack(_transText);
addMessageToStack(_transText, 0, 0);
} else {
addMessageToStack(ptr);
addMessageToStack(ptr, 0, 0);
}
}
}
@ -728,6 +735,7 @@ int indexCompare(const void *p1, const void *p2) {
return strcmp(i1->tag, i2->tag);
}
// Create an index of the language file.
void ScummEngine::loadLanguageBundle() {
File file;
int32 size;
@ -751,23 +759,16 @@ void ScummEngine::loadLanguageBundle() {
file.read(_languageBuffer, size);
file.close();
// Create an index of the language file.
// FIXME: Extend this mechanism to also cover The Dig?
int32 i;
char *ptr = _languageBuffer;
// Count the number of lines in the language file.
_languageIndexSize = 0;
for (;;) {
for (_languageIndexSize = 0; ; _languageIndexSize++) {
ptr = strpbrk(ptr, "\n\r");
if (ptr == NULL)
break;
while (*ptr == '\n' || *ptr == '\r')
ptr++;
_languageIndexSize++;
}
// Fill the language file index. This is just an array of