diff options
-rw-r--r-- | sky/intro.cpp | 4 | ||||
-rw-r--r-- | sky/logic.cpp | 3 | ||||
-rw-r--r-- | sky/logic.h | 2 | ||||
-rw-r--r-- | sky/sky.cpp | 10 | ||||
-rw-r--r-- | sky/skydefs.h | 2 | ||||
-rw-r--r-- | sky/struc.h | 5 | ||||
-rw-r--r-- | sky/text.cpp | 47 | ||||
-rw-r--r-- | sky/text.h | 17 |
8 files changed, 72 insertions, 18 deletions
diff --git a/sky/intro.cpp b/sky/intro.cpp index 9003fbbb76..5e2ef9e24f 100644 --- a/sky/intro.cpp +++ b/sky/intro.cpp @@ -227,7 +227,7 @@ void SkyState::intro(void) { _introTextSpace = (uint8 *)calloc(10000, 1); _introTextSave = (uint8 *)calloc(10000, 1); - _skyText->getText(77, _language); + _skyText->getText(77); delay(8000); // keep revolution up for 8 seconds @@ -455,7 +455,7 @@ void SkyState::checkCommands(uint32 *&cmdPtr) { void SkyState::prepareText(uint32 *&cmdPtr) { uint32 textNum = *(cmdPtr + 2); - _skyText->getText(textNum, _language); + _skyText->getText(textNum); _skyText->displayText(_introTextSpace, true, INTRO_TEXT_WIDTH, 255); cmdPtr += 3; } diff --git a/sky/logic.cpp b/sky/logic.cpp index 22b95397a3..3b5498fe60 100644 --- a/sky/logic.cpp +++ b/sky/logic.cpp @@ -25,6 +25,7 @@ #include "sky/compact.h" #include "sky/skydefs.h" +uint16 SkyLogic::_screen; typedef void (SkyLogic::*LogicTable) (); static const LogicTable logicTable[] = { @@ -55,7 +56,7 @@ SkyLogic::SkyLogic(SkyDisk *skyDisk, SkyGrid *skyGrid) { for (uint i = 0; i < sizeof(_moduleList)/sizeof(uint16*); i++) _moduleList[i] = 0; _stackPtr = 0; - + initScriptVariables(); } diff --git a/sky/logic.h b/sky/logic.h index 9914159a60..414b4acd33 100644 --- a/sky/logic.h +++ b/sky/logic.h @@ -167,6 +167,8 @@ public: uint32 fnUnPauseFx(uint32 a, uint32 b, uint32 c); uint32 fnPrintf(uint32 a, uint32 b, uint32 c); + static uint16 SkyLogic::_screen; + protected: void push(uint32); uint32 pop(); diff --git a/sky/sky.cpp b/sky/sky.cpp index de63dbab26..bd944300d1 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -209,23 +209,23 @@ SkyText *SkyState::getSkyText() { switch (_gameVersion) { case 267: //floppy demo - return new SkyText_v00267(_skyDisk, _gameVersion); + return new SkyText_v00267(_skyDisk, _gameVersion, _language); case 288: //floppy version - return new SkyText_v00288(_skyDisk, _gameVersion); + return new SkyText_v00288(_skyDisk, _gameVersion, _language); case 303: //floppy version - return new SkyText_v00303(_skyDisk, _gameVersion); + return new SkyText_v00303(_skyDisk, _gameVersion, _language); case 331: //floppy version - return new SkyText_v00331(_skyDisk, _gameVersion); + return new SkyText_v00331(_skyDisk, _gameVersion, _language); case 365: //cd demo, uses a slightly modified version of v00372 case 368: //cd version, uses a slightly modified version of v00372 case 372: //cd version - return new SkyText_v00372(_skyDisk, _gameVersion); + return new SkyText_v00372(_skyDisk, _gameVersion, _language); default: error("Unknown game version"); } diff --git a/sky/skydefs.h b/sky/skydefs.h index 214dc90dd4..b4c0c4b3b4 100644 --- a/sky/skydefs.h +++ b/sky/skydefs.h @@ -26,6 +26,8 @@ #define KEY_BUFFER_SIZE 80 #define SEQUENCE_COUNT 3 +#define FIRST_TEXT_COMPACT 23 + //screen/grid defines #define GAME_SCREEN_WIDTH 320 #define GAME_SCREEN_HEIGHT 192 diff --git a/sky/struc.h b/sky/struc.h index 295fdf40e6..90f1cfc090 100644 --- a/sky/struc.h +++ b/sky/struc.h @@ -22,6 +22,11 @@ #ifndef SKYSTRUC_H #define SKYSTRUC_H +struct lowTextManager_t { + byte *textData; + uint16 compactNum; +}; + struct displayText_t { byte *textData; uint32 textWidth; diff --git a/sky/text.cpp b/sky/text.cpp index ddd7a19898..f36431a54b 100644 --- a/sky/text.cpp +++ b/sky/text.cpp @@ -24,16 +24,19 @@ #include "sky/skydefs.h" #include "sky/sky.h" #include "sky/text.h" +#include "sky/logic.h" #define FIRST_TEXT_SEC 77 +#define FIRST_TEXT_BUFFER 274 #define NO_OF_TEXT_SECTIONS 8 // 8 sections per language #define CHAR_SET_FILE 60150 #define MAX_SPEECH_SECTION 7 #define CHAR_SET_HEADER 128 #define MAX_NO_LINES 10 -SkyText::SkyText(SkyDisk *skyDisk, uint32 gameVersion) { +SkyText::SkyText(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) { _skyDisk = skyDisk; + _language = language; _gameVersion = gameVersion; _mainCharacterSet.addr = _skyDisk->loadFile(CHAR_SET_FILE, NULL); @@ -81,14 +84,14 @@ void SkyText::fnSetFont(uint32 fontNr) { _dtCharSpacing = newCharSet->charSpacing; } -void SkyText::getText(uint32 textNr, uint16 language) { //load text #"textNr" into textBuffer +void SkyText::getText(uint32 textNr) { //load text #"textNr" into textBuffer uint32 sectionNo = (textNr & 0x0F000) >> 10; if (SkyState::_itemList[FIRST_TEXT_SEC + sectionNo] == (void **)NULL) { //check if already loaded debug(5, "Loading Text item(s) for Section %d", (sectionNo>>2)); uint32 fileNo = (sectionNo >> 2); - fileNo += ((language * NO_OF_TEXT_SECTIONS) + 60600); + fileNo += ((_language * NO_OF_TEXT_SECTIONS) + 60600); SkyState::_itemList[FIRST_TEXT_SEC + sectionNo] = (void **)_skyDisk->loadFile((uint16)fileNo, NULL); } _textItemPtr = (uint8 *)SkyState::_itemList[FIRST_TEXT_SEC + sectionNo]; @@ -325,6 +328,44 @@ void SkyText::makeGameCharacter(char textChar, uint8 *charSetPtr, uint8 *&dest, } +lowTextManager_t SkyText::lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, bool centre) { + + getText(textNum); + + struct displayText_t textInfo = displayText(NULL, centre, width, color); + + _lowTextWidth = textInfo.textWidth; + byte *textData = textInfo.textData; + + uint32 compactNum = FIRST_TEXT_COMPACT; + + Compact *cpt = SkyState::fetchCompact(compactNum); + + while (cpt->status != 0xFFFF) { //-1 + compactNum++; + cpt = SkyState::fetchCompact(compactNum); + } + + cpt->flag = (compactNum - FIRST_TEXT_COMPACT) + FIRST_TEXT_BUFFER; + + byte *oldText = (byte *)SkyState::_itemList[compactNum]; + SkyState::_itemList[compactNum] = (void **)textData; + + if (oldText != NULL) + free (oldText); + + cpt->logic = logicNum; + cpt->status = ST_LOGIC | ST_FOREGROUND | ST_RECREATE; + cpt->screen = SkyLogic::_screen; + + struct lowTextManager_t ret; + ret.textData = _dtData; + ret.compactNum = compactNum; + + return ret; + +} + char SkyText_v00267::getTextChar() { //NOTE: The decoding code for the floppy versions (both demo and full version) is _completely_ different. diff --git a/sky/text.h b/sky/text.h index a6ecd1f1c4..ffebcc79dd 100644 --- a/sky/text.h +++ b/sky/text.h @@ -26,11 +26,12 @@ class SkyText { public: - SkyText(SkyDisk *skyDisk, uint32 gameVersion); - void getText(uint32 textNr, uint16 language); + SkyText(SkyDisk *skyDisk, uint32 gameVersion, uint16 _language); + void getText(uint32 textNr); struct displayText_t displayText(uint8 *dest, bool centre, uint16 pixelWidth, uint8 color); struct displayText_t displayText(char *textPtr, uint8 *dest, bool centre, uint16 pixelWidth, uint8 color); void makeGameCharacter(char textChar, uint8 *charSetPtr, uint8 *&data, uint8 color); + struct lowTextManager_t lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, bool centre); protected: bool getTBit(); @@ -38,6 +39,7 @@ protected: virtual char getTextChar() = 0; SkyDisk *_skyDisk; + uint16 _language; uint32 _gameVersion; uint8 _inputValue; uint8 _shiftBits; @@ -69,39 +71,40 @@ protected: uint32 _dtWidth; //width of chars in last line (for editing (?)) uint32 _dtLastWidth; bool _dtCentre; //set for centre text + uint32 _lowTextWidth; }; class SkyText_v00267 : public SkyText { public: - SkyText_v00267(SkyDisk *skyDisk, uint32 gameVersion) : SkyText(skyDisk, gameVersion) {}; + SkyText_v00267(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) : SkyText(skyDisk, gameVersion, language) {}; protected: char getTextChar(); }; class SkyText_v00288 : public SkyText { public: - SkyText_v00288(SkyDisk *skyDisk, uint32 gameVersion) : SkyText(skyDisk, gameVersion) {}; + SkyText_v00288(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) : SkyText(skyDisk, gameVersion, language) {}; protected: char getTextChar(); }; class SkyText_v00303 : public SkyText { public: - SkyText_v00303(SkyDisk *skyDisk, uint32 gameVersion) : SkyText(skyDisk, gameVersion) {}; + SkyText_v00303(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) : SkyText(skyDisk, gameVersion, language) {}; protected: char getTextChar(); }; class SkyText_v00331 : public SkyText { public: - SkyText_v00331(SkyDisk *skyDisk, uint32 gameVersion) : SkyText(skyDisk, gameVersion) {}; + SkyText_v00331(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) : SkyText(skyDisk, gameVersion, language) {}; protected: char getTextChar(); }; class SkyText_v00372 : public SkyText { public: - SkyText_v00372(SkyDisk *skyDisk, uint32 gameVersion) : SkyText(skyDisk, gameVersion) {}; + SkyText_v00372(SkyDisk *skyDisk, uint32 gameVersion, uint16 language) : SkyText(skyDisk, gameVersion, language) {}; protected: char getTextChar(); }; |