From 6e3cfa8a4edc77e0d642d54ec3a52910fcac051e Mon Sep 17 00:00:00 2001 From: Robert Göffringmann Date: Tue, 1 Jul 2003 13:04:00 +0000 Subject: bypassed copy protection, fixed crash when disconnecting from link space, fixed logix swing seqs svn-id: r8686 --- sky/control.cpp | 2 ++ sky/control.h | 4 ++++ sky/logic.cpp | 22 +++++++++++++++++++--- sky/logic.h | 8 ++++++++ sky/screen.cpp | 2 +- sky/sky.cpp | 19 ++++++++++--------- 6 files changed, 44 insertions(+), 13 deletions(-) (limited to 'sky') diff --git a/sky/control.cpp b/sky/control.cpp index 0126255f94..20e857867c 100644 --- a/sky/control.cpp +++ b/sky/control.cpp @@ -1298,4 +1298,6 @@ void SkyControl::showGameQuitMsg(bool useScreen) { _skyScreen->halvePalette(); _skyScreen->showScreen(screenData); free(textBuf1); free(textBuf2); + delay(1500); + _system->quit(); } diff --git a/sky/control.h b/sky/control.h index ab025fbb0f..81ed63293e 100644 --- a/sky/control.h +++ b/sky/control.h @@ -31,6 +31,10 @@ #include "sky/mouse.h" #include "sky/logic.h" +class SkyScreen; +class SkyLogic; +class SkyMouse; + #define MAX_SAVE_GAMES 999 #define MAX_TEXT_LEN 80 #define PAN_LINE_WIDTH 184 diff --git a/sky/logic.cpp b/sky/logic.cpp index e8a0684c0f..2c75f6de9a 100644 --- a/sky/logic.cpp +++ b/sky/logic.cpp @@ -69,6 +69,20 @@ SkyLogic::SkyLogic(SkyScreen *skyScreen, SkyDisk *skyDisk, SkyText *skyText, Sky initScriptVariables(); } +bool SkyLogic::checkProtection(void) { + + if (!_scriptVariables[ENTER_DIGITS]) return false; + if (_scriptVariables[CONSOLE_TYPE] == 5) { // reactor code + _scriptVariables[FS_COMMAND] = 240; + _scriptVariables[ENTER_DIGITS] = 0; + return true; + } else { // copy protection + _scriptVariables[FS_COMMAND] = 337; + _scriptVariables[ENTER_DIGITS] = 0; + return true; + } +} + void SkyLogic::engine() { uint16 *logicList = (uint16 *)SkyState::fetchCompact(_scriptVariables[LOGIC_LIST_NO]); @@ -1026,7 +1040,8 @@ static const uint32 forwardList5b[] = { UP_MOUSE, DOWN_MOUSE, LEFT_MOUSE, - RIGHT_MOUSE + RIGHT_MOUSE, + DISCONNECT_FOSTER }; void SkyLogic::initScriptVariables() { @@ -2311,7 +2326,8 @@ bool SkyLogic::fnFadeUp(uint32 a, uint32 b, uint32 c) { } bool SkyLogic::fnQuitToDos(uint32 a, uint32 b, uint32 c) { - error("Stub: fnQuitToDos"); + _skyControl->showGameQuitMsg(); // calls _system->quit() + return true; } bool SkyLogic::fnPauseFx(uint32 a, uint32 b, uint32 c) { @@ -2359,7 +2375,7 @@ void SkyLogic::stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32 target->extCompact->spTime = 10; target->logic = L_TALK; return ; - } + } //now form the text sprite struct lowTextManager_t textInfo; diff --git a/sky/logic.h b/sky/logic.h index 96349e3f2b..bc7cdd5db1 100644 --- a/sky/logic.h +++ b/sky/logic.h @@ -29,6 +29,7 @@ #include "sky/music/musicbase.h" #include "sky/mouse.h" #include "sky/screen.h" +#include "sky/control.h" enum scriptVariableOffsets { RESULT = 0, @@ -64,7 +65,10 @@ enum scriptVariableOffsets { MENU = 102, RND = 115, CUR_SECTION = 143, + CONSOLE_TYPE = 345, REICH_DOOR_FLAG = 470, + FS_COMMAND = 643, + ENTER_DIGITS = 644, LINC_DIGIT_0 = 646, LINC_DIGIT_1 = 647, LINC_DIGIT_2 = 648, @@ -80,11 +84,14 @@ enum scriptVariableOffsets { class SkyAutoRoute; class SkyScreen; class SkyMouse; +class SkyControl; class SkyLogic { public: SkyLogic(SkyScreen *skyScreen, SkyDisk *skyDisk, SkyText *skyText, SkyMusicBase *skyMusic, SkyMouse *skyMouse, SkySound *skySound); void engine(); + bool checkProtection(void); + void useControlInstance(SkyControl *control) { _skyControl = control; }; void nop(); void logicScript(); @@ -257,6 +264,7 @@ protected: SkySound *_skySound; SkyAutoRoute *_skyAutoRoute; SkyMouse *_skyMouse; + SkyControl *_skyControl; }; #endif diff --git a/sky/screen.cpp b/sky/screen.cpp index f10a9e3757..6d96c20d61 100644 --- a/sky/screen.cpp +++ b/sky/screen.cpp @@ -383,7 +383,7 @@ void SkyScreen::startSequence(uint16 fileNum) { void SkyScreen::startSequenceItem(uint16 itemNum) { _seqInfo.seqData = (uint8*)SkyState::fetchItem(itemNum); - _seqInfo.framesLeft = _seqInfo.seqData[0]; + _seqInfo.framesLeft = _seqInfo.seqData[0] - 1; _seqInfo.seqDataPos = _seqInfo.seqData + 1; _seqInfo.delay = SEQ_DELAY; _seqInfo.running = true; diff --git a/sky/sky.cpp b/sky/sky.cpp index c62064ed18..9228b66616 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -116,12 +116,14 @@ void SkyState::go() { } _skyMouse->mouseEngine((uint16)_sdl_mouse_x, (uint16)_sdl_mouse_y); _skyLogic->engine(); - //_skyScreen->forceRefresh(); - _skyScreen->recreate(); - _skyScreen->spriteEngine(); - _skyScreen->flip(); - //_skyScreen->showGrid(_skyLogic->_skyGrid->giveGrid(SkyLogic::_scriptVariables[SCREEN])); - _system->update_screen(); + if (!_skyLogic->checkProtection()) { // don't let copy prot. screen flash up + //_skyScreen->forceRefresh(); + _skyScreen->recreate(); + _skyScreen->spriteEngine(); + _skyScreen->flip(); + //_skyScreen->showGrid(_skyLogic->_skyGrid->giveGrid(SkyLogic::_scriptVariables[SCREEN])); + _system->update_screen(); + } } } @@ -164,6 +166,7 @@ void SkyState::initialise(void) { _timer->installProcedure(&timerHandler, 1000000 / 50); //call 50 times per second _skyControl = new SkyControl(_skyScreen, _skyDisk, _skyMouse, _skyText, _skyMusic, _skyLogic, _system, getSavePath()); + _skyLogic->useControlInstance(_skyControl); } void SkyState::initItemList() { @@ -279,9 +282,7 @@ void SkyState::delay(uint amount) { //copied and mutilated from Simon.cpp break; case OSystem::EVENT_QUIT: - _skyControl->showGameQuitMsg(); - delay(1500); - _system->quit(); + _skyControl->showGameQuitMsg(); // will call _system->quit() break; default: -- cgit v1.2.3