aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorRobert Göffringmann2003-07-01 13:04:00 +0000
committerRobert Göffringmann2003-07-01 13:04:00 +0000
commit6e3cfa8a4edc77e0d642d54ec3a52910fcac051e (patch)
tree9dafb356b339768449d1a4be546cc19f6d590d90 /sky
parente1483a6eac96c0ae93e7302eb9baa42b6f94a2ef (diff)
downloadscummvm-rg350-6e3cfa8a4edc77e0d642d54ec3a52910fcac051e.tar.gz
scummvm-rg350-6e3cfa8a4edc77e0d642d54ec3a52910fcac051e.tar.bz2
scummvm-rg350-6e3cfa8a4edc77e0d642d54ec3a52910fcac051e.zip
bypassed copy protection, fixed crash when disconnecting from link space, fixed logix swing seqs
svn-id: r8686
Diffstat (limited to 'sky')
-rw-r--r--sky/control.cpp2
-rw-r--r--sky/control.h4
-rw-r--r--sky/logic.cpp22
-rw-r--r--sky/logic.h8
-rw-r--r--sky/screen.cpp2
-rw-r--r--sky/sky.cpp19
6 files changed, 44 insertions, 13 deletions
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: