diff options
-rw-r--r-- | engines/simon/draw.cpp | 9 | ||||
-rw-r--r-- | engines/simon/items.cpp | 8 | ||||
-rw-r--r-- | engines/simon/oracle.cpp | 4 | ||||
-rw-r--r-- | engines/simon/saveload.cpp | 16 | ||||
-rw-r--r-- | engines/simon/simon.cpp | 64 | ||||
-rw-r--r-- | engines/simon/simon.h | 54 | ||||
-rw-r--r-- | engines/simon/verb.cpp | 60 | ||||
-rw-r--r-- | engines/simon/vga.cpp | 2 |
8 files changed, 108 insertions, 109 deletions
diff --git a/engines/simon/draw.cpp b/engines/simon/draw.cpp index da918a2695..b34b09b18f 100644 --- a/engines/simon/draw.cpp +++ b/engines/simon/draw.cpp @@ -344,6 +344,9 @@ void SimonEngine::scrollScreen() { _scrollY += _scrollFlag; vcWriteVar(250, _scrollY); + + memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); + memcpy(_backGroundBuf, _backBuf, _screenHeight * _scrollWidth); } else { if (_scrollFlag < 0) { memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8); @@ -367,10 +370,10 @@ void SimonEngine::scrollScreen() { _scrollX += _scrollFlag; vcWriteVar(251, _scrollX); - } - memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); - memcpy(_backGroundBuf, _backBuf, _scrollHeight * _screenWidth); + memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); + memcpy(_backGroundBuf, _backBuf, _scrollHeight * _screenWidth); + } _scrollFlag = 0; } diff --git a/engines/simon/items.cpp b/engines/simon/items.cpp index dc7f733491..0dccf649e0 100644 --- a/engines/simon/items.cpp +++ b/engines/simon/items.cpp @@ -1187,7 +1187,7 @@ void SimonEngine::o_setDollar() { void SimonEngine::o_isBox() { // 142: is hitarea 0x40 clear - setScriptCondition(is_hitarea_0x40_clear(getVarOrWord())); + setScriptCondition(isBoxDead(getVarOrWord())); } void SimonEngine::o_doTable() { @@ -1625,9 +1625,9 @@ void SimonEngine::o1_specialFade() { i = NUM_PALETTE_FADEOUT; do { - palette_fadeout((uint32 *)_videoBuf1, 32); - palette_fadeout((uint32 *)_videoBuf1 + 32 + 16, 144); - palette_fadeout((uint32 *)_videoBuf1 + 32 + 16 + 144 + 16, 48); + paletteFadeOut((uint32 *)_videoBuf1, 32); + paletteFadeOut((uint32 *)_videoBuf1 + 32 + 16, 144); + paletteFadeOut((uint32 *)_videoBuf1 + 32 + 16 + 144 + 16, 48); _system->setPalette(_videoBuf1, 0, 256); if (_fade) diff --git a/engines/simon/oracle.cpp b/engines/simon/oracle.cpp index 40857cc0bf..4d3302e5b8 100644 --- a/engines/simon/oracle.cpp +++ b/engines/simon/oracle.cpp @@ -344,7 +344,7 @@ void SimonEngine::listSaveGames(int n) { j--; } - if (!(in = _saveFileMan->openForLoading(gen_savename(j)))) + if (!(in = _saveFileMan->openForLoading(genSaveName(j)))) break; in->read(b, 100); delete in; @@ -376,7 +376,7 @@ void SimonEngine::saveUserGame(int slot) { window->textRow = (slot + 1 - window->scrollY) * 15; window->textColumn = 26; - if ((in = _saveFileMan->openForLoading(gen_savename(readVariable(55))))) { + if ((in = _saveFileMan->openForLoading(genSaveName(readVariable(55))))) { in->read(name, 100); delete in; } diff --git a/engines/simon/saveload.cpp b/engines/simon/saveload.cpp index bee6255938..a21c44c84e 100644 --- a/engines/simon/saveload.cpp +++ b/engines/simon/saveload.cpp @@ -38,13 +38,13 @@ int SimonEngine::countSaveGames() { uint i = 1; bool marks[256]; - char *prefix = gen_savename(999); + char *prefix = genSaveName(999); prefix[strlen(prefix)-3] = '\0'; _saveFileMan->listSavefiles(prefix, marks, 256); while (i < 256) { if (marks[i] && - (f = _saveFileMan->openForLoading(gen_savename(i)))) { + (f = _saveFileMan->openForLoading(genSaveName(i)))) { i++; delete f; } else @@ -64,7 +64,7 @@ int SimonEngine::displaySaveGameList(int curpos, bool load, char *dst) { slot = curpos; while (curpos + 6 > slot) { - if (!(in = _saveFileMan->openForLoading(gen_savename(slot)))) + if (!(in = _saveFileMan->openForLoading(genSaveName(slot)))) break; in->read(dst, 18); @@ -88,7 +88,7 @@ int SimonEngine::displaySaveGameList(int curpos, bool load, char *dst) { } } else { if (curpos + 6 == slot) { - if ((in = _saveFileMan->openForLoading(gen_savename(slot)))) { + if ((in = _saveFileMan->openForLoading(genSaveName(slot)))) { slot++; delete in; } @@ -107,7 +107,7 @@ void SimonEngine::quickLoadOrSave() { bool success; char buf[50]; - char *filename = gen_savename(_saveLoadSlot); + char *filename = genSaveName(_saveLoadSlot); if (_saveLoadType == 2) { Subroutine *sub; success = loadGame(_saveLoadSlot); @@ -486,7 +486,7 @@ bool SimonEngine::saveGame(uint slot, char *caption) { _lockWord |= 0x100; - f = _saveFileMan->openForSaving(gen_savename(slot)); + f = _saveFileMan->openForSaving(genSaveName(slot)); if (f == NULL) { _lockWord &= ~0x100; return false; @@ -583,7 +583,7 @@ bool SimonEngine::saveGame(uint slot, char *caption) { return result; } -char *SimonEngine::gen_savename(int slot) { +char *SimonEngine::genSaveName(int slot) { static char buf[15]; if (getGameType() == GType_FF) { @@ -606,7 +606,7 @@ bool SimonEngine::loadGame(uint slot) { _lockWord |= 0x100; - f = _saveFileMan->openForLoading(gen_savename(slot)); + f = _saveFileMan->openForLoading(genSaveName(slot)); if (f == NULL) { _lockWord &= ~0x100; return false; diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp index facb603a96..2c773bd8bc 100644 --- a/engines/simon/simon.cpp +++ b/engines/simon/simon.cpp @@ -616,7 +616,7 @@ void SimonEngine::errorString(const char *buf1, char *buf2) { } } -void SimonEngine::palette_fadeout(uint32 *pal_values, uint num) { +void SimonEngine::paletteFadeOut(uint32 *pal_values, uint num) { byte *p = (byte *)pal_values; do { @@ -1276,6 +1276,18 @@ void SimonEngine::loadZone(uint vga_res) { } } +void SimonEngine::setZoneBuffers() { + byte *alloced; + + alloced = (byte *)malloc(VGA_MEM_SIZE); + + _vgaBufFreeStart = alloced; + _vgaBufStart = alloced; + _vgaFileBufOrg = alloced; + _vgaFileBufOrg2 = alloced; + _vgaBufEnd = alloced + VGA_MEM_SIZE; +} + byte *SimonEngine::allocBlock(uint32 size) { byte *block, *blockEnd; @@ -1303,18 +1315,6 @@ byte *SimonEngine::allocBlock(uint32 size) { } } -void SimonEngine::setup_vga_file_buf_pointers() { - byte *alloced; - - alloced = (byte *)malloc(VGA_MEM_SIZE); - - _vgaBufFreeStart = alloced; - _vgaBufStart = alloced; - _vgaFileBufOrg = alloced; - _vgaFileBufOrg2 = alloced; - _vgaBufEnd = alloced + VGA_MEM_SIZE; -} - void SimonEngine::checkNoOverWrite(byte *end) { VgaPointersEntry *vpe; @@ -1726,42 +1726,6 @@ void SimonEngine::pause() { } -void SimonEngine::video_toggle_colors(HitArea * ha, byte a, byte b, byte c, byte d) { - byte *src, color; - int w, h, i; - - _lockWord |= 0x8000; - src = getFrontBuf() + ha->y * _dxSurfacePitch + ha->x; - - w = ha->width; - h = ha->height; - - // Works around bug in original Simon the Sorcerer 2 - // Animations continue in background when load/save dialog is open - // often causing the savegame name highlighter to be cut short - if (!(h > 0 && w > 0 && ha->x + w <= _screenWidth && ha->y + h <= _screenHeight)) { - debug(1,"Invalid coordinates in video_toggle_colors (%d,%d,%d,%d)", ha->x, ha->y, ha->width, ha->height); - _lockWord &= ~0x8000; - return; - } - - do { - for (i = 0; i != w; ++i) { - color = src[i]; - if (a >= color && b < color) { - if (c >= color) - color += d; - else - color -= d; - src[i] = color; - } - } - src += _dxSurfacePitch; - } while (--h); - - _lockWord &= ~0x8000; -} - void SimonEngine::loadSprite(uint windowNum, uint zoneNum, uint vgaSpriteId, uint x, uint y, uint palette) { VgaSprite *vsp; VgaPointersEntry *vpe; @@ -1911,7 +1875,7 @@ int SimonEngine::go() { allocItemHeap(); allocTablesHeap(); - setup_vga_file_buf_pointers(); + setZoneBuffers(); _debugger = new Debugger(this); _moviePlay = new MoviePlayer(this, _mixer); diff --git a/engines/simon/simon.h b/engines/simon/simon.h index 2062421abc..45016a848a 100644 --- a/engines/simon/simon.h +++ b/engines/simon/simon.h @@ -506,7 +506,7 @@ protected: void loadSound(uint sound, int pan, int vol, uint type); void loadVoice(uint speechId); - void palette_fadeout(uint32 *pal_values, uint num); + void paletteFadeOut(uint32 *pal_values, uint num); byte *allocateItem(uint size); byte *allocateTable(uint size); @@ -581,13 +581,10 @@ protected: void stopAnimateSimon1(uint a); void stopAnimateSimon2(uint a, uint b); - void changeWindow(uint a); - void closeWindow(uint a); - void enableBox(uint hitarea); void disableBox(uint hitarea); void moveBox(uint hitarea, int x, int y); - bool is_hitarea_0x40_clear(uint hitarea); + bool isBoxDead(uint hitarea); void undefineBox(uint hitarea); void defineBox(int id, int x, int y, int width, int height, int flags, int verb, Item *item_ptr); HitArea *findEmptyHitArea(); @@ -597,16 +594,14 @@ protected: void hitarea_leave(HitArea * ha, bool state = false); void leaveHitAreaById(uint hitarea_id); - void waitForSync(uint a); - void skipSpeech(); void sendSync(uint a); - void freezeBottom(); - void killAllTimers(); + void waitForSync(uint a); uint getOffsetOfChild2Param(SubObject *child, uint prop); void setTextColor(uint color); void scriptMouseOn(); void scriptMouseOff(); + void freezeBottom(); void unfreezeBottom(); TextLocation *getTextLocation(uint a); @@ -648,6 +643,7 @@ protected: void invokeTimeEvent(TimeEvent *te); bool kickoffTimeEvents(); + void killAllTimers(); void endCutscene(); void runSubroutine101(); @@ -657,23 +653,23 @@ protected: void inventoryUp(WindowBlock *window); void inventoryDown(WindowBlock *window); - void resetNameWindow(); - void printVerbOf(uint hitarea_id); - HitArea *findBox(uint hitarea_id); - - void showActionString(const byte *string); - void windowPutChar(WindowBlock *window, byte c, byte b = 0); - void clearWindow(WindowBlock *window); - void video_toggle_colors(HitArea * ha, byte a, byte b, byte c, byte d); - + WindowBlock *openWindow(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint text_color); uint getWindowNum(WindowBlock *window); + void clearWindow(WindowBlock *window); + void changeWindow(uint a); + void closeWindow(uint a); + void windowPutChar(WindowBlock *window, byte c, byte b = 0); + HitArea *findBox(uint hitarea_id); void boxController(uint x, uint y, uint mode); + void handleVerbClicked(uint verb); void clearName(); void displayName(HitArea * ha); + void resetNameWindow(); void displayBoxStars(); void hitarea_stuff(); - void invertBox(HitArea *ha, bool state); + void invertBox_FF(HitArea *ha, bool state); + void invertBox(HitArea * ha, byte a, byte b, byte c, byte d); void handleMouseMoved(); void pollMouseXY(); @@ -705,21 +701,22 @@ protected: void showmessage_helper_3(uint a, uint b); void showmessage_print_char(byte chr); - void handleVerbClicked(uint verb); - void set_video_mode_internal(uint16 mode, uint16 vga_res_id); void loadZone(uint vga_res); void loadSprite(uint windowNum, uint vga_res, uint vga_sprite_id, uint x, uint y, uint palette); void playSpeech(uint speech_id, uint vga_sprite_id); - WindowBlock *openWindow(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint text_color); + void skipSpeech(); - bool printTextOf(uint a, uint x, uint y); bool printNameOf(Item *item, uint x, uint y); - void printInteractText(uint16 num, const char *string); - void sendInteractText(uint16 num, const char *fmt, ...); + bool printTextOf(uint a, uint x, uint y); + void printVerbOf(uint hitarea_id); + void showActionString(const byte *string); + void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width); + void sendInteractText(uint16 num, const char *fmt, ...); + void printInteractText(uint16 num, const char *string); void renderStringAmiga(uint vga_sprite_id, uint color, uint width, uint height, const char *txt); void renderString(uint vga_sprite_id, uint color, uint width, uint height, const char *txt); @@ -729,8 +726,7 @@ protected: void checkRunningAnims(byte *end); void checkAnims(uint a, byte *end); void checkZonePtrs(byte *end); - - void setup_vga_file_buf_pointers(); + void setZoneBuffers(); void runVgaScript(); @@ -1152,9 +1148,7 @@ protected: int countSaveGames(); int displaySaveGameList(int curpos, bool load, char *dst); - void show_it(void *buf); - - char *gen_savename(int slot); + char *genSaveName(int slot); }; } // End of namespace Simon diff --git a/engines/simon/verb.cpp b/engines/simon/verb.cpp index f2b38f1dfa..bcddbc9207 100644 --- a/engines/simon/verb.cpp +++ b/engines/simon/verb.cpp @@ -443,7 +443,7 @@ void SimonEngine::undefineBox(uint hitarea) { } } -bool SimonEngine::is_hitarea_0x40_clear(uint hitarea) { +bool SimonEngine::isBoxDead(uint hitarea) { HitArea *ha = findBox(hitarea); if (ha == NULL) return false; @@ -560,13 +560,13 @@ void SimonEngine::setVerb(HitArea *ha) { if (getGameType() == GType_SIMON1) { if (tmp != NULL) { tmp->flags |= kBFInvertTouch; - video_toggle_colors(tmp, 0xd5, 0xd0, 0xd5, 0xA); + invertBox(tmp, 213, 208, 213, 10); } if (ha->flags & kBFBoxSelected) - video_toggle_colors(ha, 0xda, 0xd5, 0xd5, 5); + invertBox(ha, 218, 213, 213, 5); else - video_toggle_colors(ha, 0xdf, 0xda, 0xda, 0xA); + invertBox(ha, 223, 218, 218, 10); ha->flags &= ~(kBFBoxSelected + kBFInvertTouch); } else { @@ -581,11 +581,11 @@ void SimonEngine::setVerb(HitArea *ha) { void SimonEngine::hitarea_leave(HitArea *ha, bool state) { if (getGameType() == GType_FF) { - invertBox(ha, state); + invertBox_FF(ha, state); } else if (getGameType() == GType_SIMON2) { - video_toggle_colors(ha, 0xe7, 0xe5, 0xe6, 1); + invertBox(ha, 231, 229, 230, 1); } else { - video_toggle_colors(ha, 0xdf, 0xd5, 0xda, 5); + invertBox(ha, 223, 213, 218, 5); } } @@ -601,7 +601,7 @@ void SimonEngine::checkUp(WindowBlock *window) { if (((_variableArray[31] - _variableArray[30]) == 40) && (_variableArray[31] > 52)) { k = (((_variableArray[31] / 52) - 2) % 3); j = k * 6; - if (!is_hitarea_0x40_clear(j + 201)) { + if (!isBoxDead(j + 201)) { uint index = getWindowNum(window); drawIconArray(index, window->iconPtr->itemRef, 0, window->iconPtr->classMask); loadSprite(4, 9, k + 34, 0, 0, 0); @@ -610,7 +610,7 @@ void SimonEngine::checkUp(WindowBlock *window) { if ((_variableArray[31] - _variableArray[30]) == 76) { k = ((_variableArray[31] / 52) % 3); j = k * 6; - if (is_hitarea_0x40_clear(j + 201)) { + if (isBoxDead(j + 201)) { loadSprite(4, 9, k + 31, 0, 0, 0); undefineBox(j + 201); undefineBox(j + 202); @@ -637,7 +637,7 @@ void SimonEngine::checkDown(WindowBlock *window) { if (((_variableArray[31] - _variableArray[30]) == 40) && (_variableArray[30] > 52)) { k = (((_variableArray[31] / 52) + 1) % 3); j = k * 6; - if (is_hitarea_0x40_clear(j + 201)) { + if (isBoxDead(j + 201)) { loadSprite(4, 9, k + 28, 0, 0, 0); undefineBox(j + 201); undefineBox(j + 202); @@ -810,7 +810,7 @@ void SimonEngine::displayName(HitArea *ha) { _lastNameOn = ha; } -void SimonEngine::invertBox(HitArea *ha, bool state) { +void SimonEngine::invertBox_FF(HitArea *ha, bool state) { if (getBitFlag(205) || getBitFlag(206)) { if (state != 0) { _mouseAnimMax = _oldMouseAnimMax; @@ -853,4 +853,42 @@ void SimonEngine::invertBox(HitArea *ha, bool state) { } } +void SimonEngine::invertBox(HitArea * ha, byte a, byte b, byte c, byte d) { + byte *src, color; + int w, h, i; + + _lockWord |= 0x8000; + src = getFrontBuf() + ha->y * _dxSurfacePitch + ha->x; + + _hitarea_unk_3 = true; + + w = ha->width; + h = ha->height; + + // Works around bug in original Simon the Sorcerer 2 + // Animations continue in background when load/save dialog is open + // often causing the savegame name highlighter to be cut short + if (!(h > 0 && w > 0 && ha->x + w <= _screenWidth && ha->y + h <= _screenHeight)) { + debug(1,"Invalid coordinates in invertBox (%d,%d,%d,%d)", ha->x, ha->y, ha->width, ha->height); + _lockWord &= ~0x8000; + return; + } + + do { + for (i = 0; i != w; ++i) { + color = src[i]; + if (a >= color && b < color) { + if (c >= color) + color += d; + else + color -= d; + src[i] = color; + } + } + src += _dxSurfacePitch; + } while (--h); + + _lockWord &= ~0x8000; +} + } // End of namespace Simon diff --git a/engines/simon/vga.cpp b/engines/simon/vga.cpp index cf18263e35..e6731a076e 100644 --- a/engines/simon/vga.cpp +++ b/engines/simon/vga.cpp @@ -2217,7 +2217,7 @@ void SimonEngine::vc62_fastFadeOut() { memcpy(_videoBuf1, _paletteBackup, _videoNumPalColors * 4); for (i = NUM_PALETTE_FADEOUT; i != 0; --i) { - palette_fadeout((uint32 *)_videoBuf1, _videoNumPalColors); + paletteFadeOut((uint32 *)_videoBuf1, _videoNumPalColors); _system->setPalette(_videoBuf1, 0, _videoNumPalColors); if (_fade) _system->updateScreen(); |