aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/simon/charset.cpp50
-rw-r--r--engines/simon/cursor.cpp2
-rw-r--r--engines/simon/debug.h10
-rw-r--r--engines/simon/items.cpp2
-rw-r--r--engines/simon/oracle.cpp4
-rw-r--r--engines/simon/simon.cpp54
-rw-r--r--engines/simon/simon.h19
-rw-r--r--engines/simon/verb.cpp8
8 files changed, 84 insertions, 65 deletions
diff --git a/engines/simon/charset.cpp b/engines/simon/charset.cpp
index 3bde9dbfc9..762aca5ae6 100644
--- a/engines/simon/charset.cpp
+++ b/engines/simon/charset.cpp
@@ -27,7 +27,7 @@
namespace Simon {
void SimonEngine::print_char_helper_1(const byte *src, uint len) {
- uint ind;
+ uint idx;
if (_textWindow == NULL)
return;
@@ -52,18 +52,17 @@ void SimonEngine::print_char_helper_1(const byte *src, uint len) {
src++;
}
} else {
- //if (getBitFlag(92))
- // while(!_nextCharacter);
+ if (getBitFlag(92))
+ delay(50);
windowPutChar(*src++);
- //_nextCharacter = false;
}
}
} else {
if (*src != 12 && _textWindow->iconPtr != NULL &&
- _fcsData1[ind = get_fcs_ptr_3_index(_textWindow)] != 2) {
+ _fcsData1[idx = getWindowNum(_textWindow)] != 2) {
- _fcsData1[ind] = 2;
- _fcsData2[ind] = 1;
+ _fcsData1[idx] = 2;
+ _fcsData2[idx] = 1;
}
windowPutChar(*src++);
@@ -72,12 +71,12 @@ void SimonEngine::print_char_helper_1(const byte *src, uint len) {
}
void SimonEngine::print_char_helper_5(WindowBlock *window) {
- uint index = get_fcs_ptr_3_index(window);
- print_char_helper_6(index);
+ uint index = getWindowNum(window);
+ tidyIconArray(index);
_fcsData1[index] = 0;
}
-void SimonEngine::print_char_helper_6(uint i) {
+void SimonEngine::tidyIconArray(uint i) {
WindowBlock *window;
if (_fcsData2[i]) {
@@ -287,7 +286,7 @@ void SimonEngine::showMessageFormat(const char *s, ...) {
va_end(va);
if (!_fcsData1[_curWindow]) {
- showmessage_helper_2();
+ openTextWindow();
if (!_showMessageFlag) {
_windowArray[0] = _textWindow;
if (getGameType() == GType_FF)
@@ -307,11 +306,14 @@ void SimonEngine::showmessage_print_char(byte chr) {
if (chr == 12) {
_numLettersToPrint = 0;
_printCharCurPos = 0;
+ _printCharPixelCount = 0;
print_char_helper_1(&chr, 1);
print_char_helper_5(_textWindow);
} else if (chr == 0 || chr == ' ' || chr == 10) {
- if (_printCharMaxPos - _printCharCurPos >= _numLettersToPrint) {
- _printCharCurPos += _numLettersToPrint;
+ uint count = (getGameType() == GType_FF) ? _printCharPixelCount : _numLettersToPrint;
+
+ if (_printCharMaxPos - _printCharCurPos >= count) {
+ _printCharCurPos += count;
print_char_helper_1(_lettersToPrintBuf, _numLettersToPrint);
if (_printCharCurPos == _printCharMaxPos) {
@@ -326,7 +328,7 @@ void SimonEngine::showmessage_print_char(byte chr) {
}
} else {
const byte newline_character = 10;
- _printCharCurPos = _numLettersToPrint;
+ _printCharCurPos = count;
print_char_helper_1(&newline_character, 1);
print_char_helper_1(_lettersToPrintBuf, _numLettersToPrint);
if (chr == ' ') {
@@ -338,14 +340,15 @@ void SimonEngine::showmessage_print_char(byte chr) {
}
}
_numLettersToPrint = 0;
+ _printCharPixelCount = 0;
} else {
- if (getGameType() == GType_FF)
- _printCharCurPos += feebleFontSize[chr - 32];
_lettersToPrintBuf[_numLettersToPrint++] = chr;
+ if (getGameType() == GType_FF)
+ _printCharPixelCount += feebleFontSize[chr - 32];
}
}
-void SimonEngine::showmessage_helper_2() {
+void SimonEngine::openTextWindow() {
if (_textWindow)
return;
@@ -358,6 +361,7 @@ void SimonEngine::showmessage_helper_2() {
void SimonEngine::showmessage_helper_3(uint a, uint b) {
_printCharCurPos = a;
_printCharMaxPos = b;
+ _printCharPixelCount = 0;
_numLettersToPrint = 0;
_newLines = 0;
}
@@ -437,10 +441,10 @@ void SimonEngine::videoPutchar(WindowBlock *window, byte c, byte b) {
void SimonEngine::video_putchar_newline(WindowBlock *window) {
if (getGameType() == GType_FF) {
if (_noOracleScroll == 0) {
- if (window->textRow + 30 > window->height) {
- if (getBitFlag(94) == false) {
+ if (window->height < window->textRow + 30) {
+ if (!getBitFlag(94)) {
_noOracleScroll = 1;
- if (getBitFlag(92) == true) {
+ if (getBitFlag(92)) {
_noOracleScroll = 0;
checkLinkBox();
scrollOracle();
@@ -465,9 +469,9 @@ void SimonEngine::video_putchar_newline(WindowBlock *window) {
window->textRow++;
}
+ window->textColumn = 0;
window->textColumnOffset = 0;
window->textLength = 0;
- window->textColumn = 0;
}
#ifdef PALMOS_68K
@@ -1294,6 +1298,10 @@ void SimonEngine::video_putchar_drawchar(WindowBlock *window, uint x, uint y, by
byte color, *dst;
uint h, i;
+ // FIXME
+ //if (_noOracleScroll)
+ // return;
+
_lockWord |= 0x8000;
dst = getFrontBuf();
diff --git a/engines/simon/cursor.cpp b/engines/simon/cursor.cpp
index 2d54f3080b..3b7725c7d7 100644
--- a/engines/simon/cursor.cpp
+++ b/engines/simon/cursor.cpp
@@ -224,7 +224,7 @@ static const byte _simon2_cursors[10][256] = {
};
void SimonEngine::drawMousePointer() {
- debug(0, "Mouse %d Anim %d Max %d", _mouseCursor, _mouseAnim, _mouseAnimMax);
+ //debug(0, "Mouse %d Anim %d Max %d", _mouseCursor, _mouseAnim, _mouseAnimMax);
if (getGameType() == GType_SIMON2)
_system->setMouseCursor(_simon2_cursors[_mouseCursor], 16, 16, 7, 7);
diff --git a/engines/simon/debug.h b/engines/simon/debug.h
index 1e2a799d3b..e510ffefd4 100644
--- a/engines/simon/debug.h
+++ b/engines/simon/debug.h
@@ -224,7 +224,7 @@ static const char *const simon1dos_opcode_name_table[256] = {
"IBW|SET_ITEM_PROP",
NULL,
/* 160 */
- "B|UNK_160",
+ "B|SET_INK",
"BWBW|SETUP_TEXT",
"BBT|PRINT_STR",
"W|SOUND_1",
@@ -462,7 +462,7 @@ static const char *const simon1talkie_opcode_name_table[256] = {
"IBW|SET_ITEM_PROP",
NULL,
/* 160 */
- "B|UNK_160",
+ "B|SET_INK",
"BWBW|SETUP_TEXT",
"BBTW|PRINT_STR",
"W|SOUND_1",
@@ -700,7 +700,7 @@ static const char *const simon2dos_opcode_name_table[256] = {
"IBW|SET_ITEM_PROP",
NULL,
/* 160 */
- "B|UNK_160",
+ "B|SET_INK",
"BWBW|SETUP_TEXT",
"BBT|PRINT_STR",
"W|SOUND_1",
@@ -942,7 +942,7 @@ static const char *const simon2talkie_opcode_name_table[256] = {
"IBW|SET_ITEM_PROP",
NULL,
/* 160 */
- "B|UNK_160",
+ "B|SET_INK",
"BWBW|SETUP_TEXT",
"BBTW|PRINT_STR",
"W|SOUND_1",
@@ -1184,7 +1184,7 @@ static const char *const feeblefiles_opcode_name_table[256] = {
"IBW|SET_ITEM_PROP",
NULL,
/* 160 */
- "B|UNK_160",
+ "B|SET_INK",
"BWWW|SETUP_TEXT",
"BBTW|PRINT_STR",
"W|SOUND_1",
diff --git a/engines/simon/items.cpp b/engines/simon/items.cpp
index ed1735a44a..bfa672c7a9 100644
--- a/engines/simon/items.cpp
+++ b/engines/simon/items.cpp
@@ -1936,6 +1936,8 @@ void SimonEngine::o_unk_103() {
showMessageFormat("\x0E");
else
showMessageFormat("\x0C");
+ _oracleMaxScrollY = 0;
+ _noOracleScroll = 0;
mouseOn();
}
diff --git a/engines/simon/oracle.cpp b/engines/simon/oracle.cpp
index 9aa1ab781e..0a54eceddc 100644
--- a/engines/simon/oracle.cpp
+++ b/engines/simon/oracle.cpp
@@ -47,8 +47,8 @@ void SimonEngine::hyperLinkOn(uint16 x) {
return;
_hyperLink = x;
- _variableArray[50] = _textWindow->textColumn+_textWindow->x;
- _variableArray[51] = _textWindow->textRow+_textWindow->y + (_oracleMaxScrollY - _textWindow->scrollY) * 15;
+ _variableArray[50] = _textWindow->textColumn + _textWindow->x;
+ _variableArray[51] = _textWindow->textRow + _textWindow->y + (_oracleMaxScrollY - _textWindow->scrollY) * 15;
}
diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp
index c186688bb0..a527e92f8b 100644
--- a/engines/simon/simon.cpp
+++ b/engines/simon/simon.cpp
@@ -268,7 +268,7 @@ SimonEngine::SimonEngine(OSystem *syst)
_scrollHeight = 0;
_scrollWidth = 0;
_scrollImage = 0;
- _vgaVar8 = 0;
+ _boxStarHeight = 0;
_scriptVerb = 0;
_scriptNoun1 = 0;
@@ -289,7 +289,6 @@ SimonEngine::SimonEngine(OSystem *syst)
_lastHitArea = 0;
_lastNameOn = 0;
_lastHitArea3 = 0;
- _leftButtonDown = 0;
_hitAreaSubjectItem = 0;
_currentVerbBox = 0;
_lastVerbOn = 0;
@@ -302,6 +301,7 @@ SimonEngine::SimonEngine(OSystem *syst)
_printCharCurPos = 0;
_printCharMaxPos = 0;
+ _printCharPixelCount = 0;
_numLettersToPrint = 0;
_lastTime = 0;
@@ -316,6 +316,8 @@ SimonEngine::SimonEngine(OSystem *syst)
_mouseXOld = 0;
_mouseYOld = 0;
+ _leftButtonDown = 0;
+ _rightButtonDown = 0;
_noRightClick = false;
_dummyItem1 = new Item();
@@ -1667,14 +1669,14 @@ void SimonEngine::endCutscene() {
_runScriptReturn1 = true;
}
-uint SimonEngine::get_fcs_ptr_3_index(WindowBlock *window) {
+uint SimonEngine::getWindowNum(WindowBlock *window) {
uint i;
for (i = 0; i != ARRAYSIZE(_windowArray); i++)
if (_windowArray[i] == window)
return i;
- error("get_fcs_ptr_3_index: not found");
+ error("getWindowNum: not found");
return 0;
}
@@ -1843,7 +1845,7 @@ void SimonEngine::displayBoxStars() {
continue;
}
- if (ha->y >= limit || ((getGameType() == GType_SIMON2) && ha->y >= _vgaVar8))
+ if (ha->y >= limit || ((getGameType() == GType_SIMON2) && ha->y >= _boxStarHeight))
continue;
y_ = (ha->height / 2) - 4 + ha->y;
@@ -2405,7 +2407,7 @@ void SimonEngine::set_video_mode_internal(uint mode, uint vga_res_id) {
else
num_lines = _windowNum == 4 ? 134 : 200;
- _vgaVar8 = num_lines;
+ _boxStarHeight = num_lines;
dx_copy_from_attached_to_2(0, 0, _screenWidth, num_lines);
dx_copy_from_attached_to_3(num_lines);
_syncFlag2 = 1;
@@ -3021,23 +3023,23 @@ void SimonEngine::clearWindow(WindowBlock *window) {
window->textRow = 0;
window->textColumnOffset = 0;
window->textLength = 0;
+ window->scrollY = 0;
}
void SimonEngine::restoreWindow(WindowBlock *window) {
_lockWord |= 0x8000;
- if (getGameType() == GType_SIMON1) {
- restoreBlock(window->y + window->height * 8 + ((window == _windowArray[2]) ? 1 : 0), (window->x + window->width) * 8, window->y, window->x * 8);
- } else {
+ if (getGameType() == GType_FF) {
+ restoreBlock(window->y + window->height, window->x + window->width, window->y, window->x);
+ } else if (getGameType() == GType_SIMON2) {
if (_restoreWindow6 && _windowArray[2] == window) {
window = _windowArray[6];
_restoreWindow6 = 0;
}
- if (getGameType() == GType_FF)
- restoreBlock(window->y + window->height, window->x + window->width, window->y, window->x);
- else
- restoreBlock(window->y + window->height * 8, (window->x + window->width) * 8, window->y, window->x * 8);
+ restoreBlock(window->y + window->height * 8, (window->x + window->width) * 8, window->y, window->x * 8);
+ } else {
+ restoreBlock(window->y + window->height * 8 + ((window == _windowArray[2]) ? 1 : 0), (window->x + window->width) * 8, window->y, window->x * 8);
}
_lockWord &= ~0x8000;
@@ -3053,18 +3055,24 @@ void SimonEngine::colorWindow(WindowBlock *window) {
if (getGameType() == GType_FF) {
dst += _dxSurfacePitch * window->y + window->x;
- h = window->height;
- w = window->width;
+
+ for (h = 0; h < window->height; h++) {
+ for (w = 0; w < window->width; w++) {
+ if (dst[w] == 113 || dst[w] == 116 || dst[w] == 252)
+ dst[w] = window->fill_color;
+ }
+ dst += _screenWidth;
+ }
} else {
dst += _dxSurfacePitch * window->y + window->x * 8;
h = window->height * 8;
w = window->width * 8;
- }
- do {
- memset(dst, window->fill_color, w);
- dst += _dxSurfacePitch;
- } while (--h);
+ do {
+ memset(dst, window->fill_color, w);
+ dst += _dxSurfacePitch;
+ } while (--h);
+ }
_lockWord &= ~0x8000;
}
@@ -3695,7 +3703,7 @@ void SimonEngine::runSubroutine101() {
permitInput();
}
-void SimonEngine::restoreBlock(uint b, uint r, uint y, uint x) {
+void SimonEngine::restoreBlock(uint h, uint w, uint y, uint x) {
byte *dst, *src;
uint i;
@@ -3705,8 +3713,8 @@ void SimonEngine::restoreBlock(uint b, uint r, uint y, uint x) {
dst += y * _dxSurfacePitch;
src += y * _dxSurfacePitch;
- while (y < b) {
- for (i = x; i < r; i++)
+ while (y < h) {
+ for (i = x; i < w; i++)
dst[i] = src[i];
y++;
dst += _dxSurfacePitch;
diff --git a/engines/simon/simon.h b/engines/simon/simon.h
index c494bc390a..f8ee3320ed 100644
--- a/engines/simon/simon.h
+++ b/engines/simon/simon.h
@@ -272,7 +272,7 @@ protected:
int _scrollY, _scrollYMax, _scrollHeight;
int _scrollCount, _scrollFlag;
const byte *_scrollImage;
- byte _vgaVar8;
+ byte _boxStarHeight;
uint16 _hyperLink, _newLines;
uint16 _oracleMaxScrollY, _noOracleScroll;
@@ -291,8 +291,6 @@ protected:
HitArea *_lastHitArea;
HitArea *_lastNameOn;
HitArea *_lastHitArea3;
- byte _leftButtonDown;
- byte _rightButtonDown;
Item *_hitAreaSubjectItem;
HitArea *_currentVerbBox, *_lastVerbOn;
uint _needHitAreaRecalc;
@@ -304,7 +302,7 @@ protected:
uint16 _windowNum;
- uint _printCharCurPos, _printCharMaxPos;
+ uint _printCharCurPos, _printCharMaxPos, _printCharPixelCount;
uint _numLettersToPrint;
uint _lastTime;
@@ -316,6 +314,10 @@ protected:
int _mouseX, _mouseY;
int _mouseXOld, _mouseYOld;
+ byte _leftButtonDown;
+ byte _rightButtonDown;
+ bool _noRightClick;
+
Item *_dummyItem1;
Item *_dummyItem2;
Item *_dummyItem3;
@@ -334,7 +336,6 @@ protected:
bool _fastFadeOutFlag;
bool _unkPalFlag;
bool _exitCutscene;
- bool _noRightClick;
byte _paletteFlag;
uint _soundFileId;
@@ -660,7 +661,7 @@ protected:
void read_vga_from_datfile_1(uint vga_id);
- uint get_fcs_ptr_3_index(WindowBlock *window);
+ uint getWindowNum(WindowBlock *window);
void setup_hitarea_from_pos(uint x, uint y, uint mode);
void displayName(HitArea * ha);
@@ -1037,7 +1038,7 @@ protected:
void restoreWindow(WindowBlock *window);
void colorWindow(WindowBlock *window);
- void restoreBlock(uint b, uint r, uint y, uint x);
+ void restoreBlock(uint h, uint w, uint y, uint x);
byte *getFrontBuf();
byte *getBackBuf();
@@ -1087,8 +1088,8 @@ protected:
bool saveGame(uint slot, char *caption);
bool loadGame(uint slot);
- void showmessage_helper_2();
- void print_char_helper_6(uint i);
+ void openTextWindow();
+ void tidyIconArray(uint i);
void video_putchar_newline(WindowBlock *window);
void video_putchar_drawchar(WindowBlock *window, uint x, uint y, byte chr);
diff --git a/engines/simon/verb.cpp b/engines/simon/verb.cpp
index 1fa3aa54fc..aa5f1a41de 100644
--- a/engines/simon/verb.cpp
+++ b/engines/simon/verb.cpp
@@ -526,7 +526,7 @@ void SimonEngine::checkUp(WindowBlock *window) {
k = (((_variableArray[31] / 52) - 2) % 3);
j = k * 6;
if (!is_hitarea_0x40_clear(j + 201)) {
- uint index = get_fcs_ptr_3_index(window);
+ uint index = getWindowNum(window);
drawIconArray(index, window->iconPtr->itemRef, 0, window->iconPtr->classMask);
loadSprite(4, 9, k + 34, 0, 0, 0);
}
@@ -552,7 +552,7 @@ void SimonEngine::checkDown(WindowBlock *window) {
uint16 j, k;
if (((_variableArray[31] - _variableArray[30]) == 24) && (_iOverflow == 1)) {
- uint index = get_fcs_ptr_3_index(window);
+ uint index = getWindowNum(window);
drawIconArray(index, window->iconPtr->itemRef, 0, window->iconPtr->classMask);
k = ((_variableArray[31] / 52) % 3);
loadSprite(4, 9, k + 25, 0, 0, 0);
@@ -593,7 +593,7 @@ void SimonEngine::inventoryUp(WindowBlock *window) {
return;
mouseOff();
- uint index = get_fcs_ptr_3_index(window);
+ uint index = getWindowNum(window);
drawIconArray(index, window->iconPtr->itemRef, window->iconPtr->line - 1, window->iconPtr->classMask);
mouseOn();
}
@@ -616,7 +616,7 @@ void SimonEngine::inventoryDown(WindowBlock *window) {
checkDown(window);
} else {
mouseOff();
- uint index = get_fcs_ptr_3_index(window);
+ uint index = getWindowNum(window);
drawIconArray(index, window->iconPtr->itemRef, window->iconPtr->line + 1, window->iconPtr->classMask);
mouseOn();
}