diff options
| -rw-r--r-- | sky/control.cpp | 126 | ||||
| -rw-r--r-- | sky/control.h | 10 | ||||
| -rw-r--r-- | sky/sky.cpp | 2 | 
3 files changed, 116 insertions, 22 deletions
| diff --git a/sky/control.cpp b/sky/control.cpp index ff9878a5eb..a2cbb54230 100644 --- a/sky/control.cpp +++ b/sky/control.cpp @@ -83,6 +83,16 @@ SkyTextResource::~SkyTextResource(void) {  	free(_oldScreen);  } +void SkyTextResource::flushForRedraw(void) { +     +	if (_oldX < GAME_SCREEN_WIDTH) { +		uint16 cpWidth = (PAN_LINE_WIDTH > (GAME_SCREEN_WIDTH - _oldX))?(GAME_SCREEN_WIDTH - _oldX):(PAN_LINE_WIDTH); +		for (uint8 cnty = 0; cnty < PAN_CHAR_HEIGHT; cnty++) +			memcpy(_screen + (cnty + _oldY) * GAME_SCREEN_WIDTH + _oldX, _oldScreen + cnty * PAN_LINE_WIDTH, cpWidth); +	} +	_oldX = GAME_SCREEN_WIDTH; +} +  void SkyTextResource::drawToScreen(bool doMask) {  	doMask = true; @@ -198,10 +208,7 @@ void SkyControl::initPanel(void) {  		_fxPanButton  = createResource(      _sprites.button, 3, 2, 58,  99, 87,       TOGGLE_FX, MAINPANEL);  	if (SkyState::isCDVersion()) { // CD Version: Toggle text/speech -		if (SkyState::_systemVars.systemFlags & SF_ALLOW_TEXT) -			_musicPanButton = createResource(      _sprites.button, 3, 2, 58, 119, 21,     TOGGLE_TEXT, MAINPANEL); -		else -			_musicPanButton = createResource(      _sprites.button, 3, 0, 58, 119, 35,     TOGGLE_TEXT, MAINPANEL); +	  _musicPanButton = createResource(      _sprites.button, 3, 0, 58, 119, 52,     TOGGLE_TEXT, MAINPANEL);  	} else {                       // disk version: toggle music on/off  	  _musicPanButton = createResource(      _sprites.button, 3, 0, 58, 119, 91,       TOGGLE_MS, MAINPANEL);  	} @@ -262,15 +269,46 @@ void SkyControl::buttonControl(SkyConResource *pButton) {  	_text->setXY(_mouseX + 12, _mouseY - 16);  } +void SkyControl::drawTextCross(uint32 flags) { +	 +	_bodge->drawToScreen(NO_MASK); +	if (!(flags & SF_ALLOW_SPEECH)) +		drawCross(151, 124); +	if (!(flags & SF_ALLOW_TEXT)) +		drawCross(173, 124); +} + +void SkyControl::drawCross(uint16 x, uint16 y) { + +	_text->flushForRedraw(); +	uint8 *bufPos, *crossPos; +	bufPos = _screenBuf + y * GAME_SCREEN_WIDTH + x; +	crossPos = _crossImg; +	for (uint16 cnty = 0; cnty < CROSS_SZ_Y; cnty++) { +		for (uint16 cntx = 0; cntx < CROSS_SZ_X; cntx++) +			if (crossPos[cntx] != 0xFF) +				bufPos[cntx] = crossPos[cntx]; +		bufPos += GAME_SCREEN_WIDTH; +		crossPos += CROSS_SZ_X; +	} +	bufPos = _screenBuf + y * GAME_SCREEN_WIDTH + x; +	_system->copy_rect(bufPos, GAME_SCREEN_WIDTH, x, y, CROSS_SZ_X, CROSS_SZ_Y); +	_text->drawToScreen(WITH_MASK); +} +  void SkyControl::animClick(SkyConResource *pButton) {  	if (pButton->_curSprite != pButton->_numSprites -1) {  		pButton->_curSprite++; +		_text->flushForRedraw();  		pButton->drawToScreen(NO_MASK); +		_text->drawToScreen(WITH_MASK);  		_system->update_screen();  		delay(150);  		pButton->_curSprite--; +		_text->flushForRedraw();  		pButton->drawToScreen(NO_MASK); +		_text->drawToScreen(WITH_MASK);  		_system->update_screen();  	}  } @@ -291,6 +329,8 @@ void SkyControl::drawMainPanel(void) {  	_slide->drawToScreen(WITH_MASK);  	_slide2->drawToScreen(WITH_MASK);  	_bodge->drawToScreen(WITH_MASK); +	if (SkyState::isCDVersion()) +		drawTextCross(SkyState::_systemVars.systemFlags & TEXT_FLAG_MASK);  }  void SkyControl::restartGame(void) { @@ -372,9 +412,9 @@ void SkyControl::doControlPanel(void) {  				buttonControl(_controlPanLookList[lookCnt]);  				if (_mouseClicked && _controlPanLookList[lookCnt]->_onClick) {  					clickRes = handleClick(_controlPanLookList[lookCnt]); -					buttonControl(NULL); -					_text->drawToScreen(WITH_MASK); // flush text restore buffer +					_text->flushForRedraw();  					drawMainPanel(); +					_text->drawToScreen(WITH_MASK);  					if ((clickRes == QUIT_PANEL) || (clickRes == GAME_SAVED) ||  						(clickRes == GAME_RESTORED))  						quitPanel = true; @@ -455,7 +495,8 @@ uint16 SkyControl::handleClick(SkyConResource *pButton) {  			return 0;  		case TOGGLE_TEXT: -			return toggleText(pButton); +			animClick(pButton); +			return toggleText();  		case EXIT:  			animClick(pButton); @@ -585,20 +626,23 @@ uint16 SkyControl::toggleFx(SkyConResource *pButton) {  	return TOGGLED;  } -uint16 SkyControl::toggleText(SkyConResource *pButton) { +uint16 SkyControl::toggleText(void) { + +	uint32 flags = SkyState::_systemVars.systemFlags & TEXT_FLAG_MASK; +	SkyState::_systemVars.systemFlags &= ~TEXT_FLAG_MASK; + + +	if (flags == SF_ALLOW_TEXT) +		flags = SF_ALLOW_SPEECH; +	else if (flags == SF_ALLOW_SPEECH) +		flags = SF_ALLOW_SPEECH | SF_ALLOW_TEXT; +	else +		flags = SF_ALLOW_TEXT; + +	SkyState::_systemVars.systemFlags |= flags; + +	drawTextCross(flags); -	SkyState::_systemVars.systemFlags ^= SF_ALLOW_SPEECH; -	if (SkyState::_systemVars.systemFlags & SF_ALLOW_SPEECH) { -		pButton->_curSprite = 0; -		pButton->_text = 0x7000 + 35; -		SkyState::_systemVars.systemFlags &= ~SF_ALLOW_TEXT; -	} else { -		pButton->_curSprite = 2; -		pButton->_text = 0x7000 + 21; -		SkyState::_systemVars.systemFlags |= SF_ALLOW_TEXT; -	} -	pButton->drawToScreen(WITH_MASK); -	buttonControl(pButton);  	_system->update_screen();  	return TOGGLED;  } @@ -1384,3 +1428,45 @@ char SkyControl::_quitTexts[12][30] = {  	"Fim de jogo para o jogador um",  	"BE VIGILANT"  }; + +uint8 SkyControl::_crossImg[594] = { +    0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x4D, 0x61,  +    0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0x08, 0x4E, 0x53, 0x50, 0x4F, 0x0C, 0x4D, 0x4E, 0x51, 0x58, 0x58, 0x54, 0x4E, 0x08, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x54, 0x58, 0x50, 0x4E, 0xFF,  +    0xFF, 0xFF, 0xFF, 0x50, 0x4E, 0x54, 0x58, 0x58, 0x54, 0x4E, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0x61, 0x53, 0x58, 0x54, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0x50, 0x4E, 0x55, 0x58, 0x58, 0x53, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x51, 0x58, 0x58,  +    0x51, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x51, 0x58,  +    0x59, 0x58, 0x51, 0x61, 0xFF, 0xFF, 0x61, 0x54, 0x58, 0x58, 0x4F, 0x52, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x55, 0x58, 0x58, 0x57, 0x4E,  +    0x4F, 0x56, 0x58, 0x57, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x51, 0x58, 0x58, 0x58, 0x58, 0x58, 0x54, 0x4E, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0x6A, 0x4F, 0x58, 0x58, 0x58, 0x58, 0x52, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x54, 0x58,  +    0x58, 0x58, 0x58, 0x57, 0x53, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x09, 0x58, 0x58, 0x58, 0x57, 0x56, 0x58, 0x58, 0x58,  +    0x57, 0x4F, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0x61, 0x55, 0x58, 0x58, 0x58, 0x58, 0x4E, 0x64, 0x57, 0x58, 0x58, 0x58, 0x58, 0x53, 0x61, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x57, 0x58, 0x58, 0x58, 0x58,  +    0x50, 0xFF, 0xFF, 0x4E, 0x57, 0x58, 0x58, 0x58, 0x58, 0x56, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x58, 0x58, 0x58, 0x58, 0x58, 0x53, 0x09, 0xFF, 0xFF, 0xFF, 0x4E,  +    0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x57,  +    0x58, 0x58, 0x58, 0x58, 0x56, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x58, 0x58, 0x58, 0x58,  +    0x58, 0x57, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x55, 0x58, 0x58, 0x58, 0x58, 0x58, 0x4E,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x58, 0x58, 0x58, 0x58, 0x4E, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0x06, 0x58, 0x58, 0x58, 0x58, 0x58, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0x0C, 0x52, 0x58, 0x58, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x56, 0x58,  +    0x58, 0x58, 0x58, 0x56, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x56,  +    0x58, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x4D, 0x4D, 0x51, 0x56, 0x58, 0x58, 0x50, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x54, 0x09, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x50, 0x54, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF, 0xFF, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  +    0xFF, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0xFF,  +    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0xFF, 0xFF, 0xFF,  +    0xFF, 0xFF +}; + diff --git a/sky/control.h b/sky/control.h index fe2da43111..9adf0b1829 100644 --- a/sky/control.h +++ b/sky/control.h @@ -47,6 +47,10 @@ class SkyMouse;  #define SP_HEIGHT 149  #define SP_TOP_GAP 12  #define SP_BOT_GAP 27 +#define CROSS_SZ_X 27 +#define CROSS_SZ_Y 22 + +#define TEXT_FLAG_MASK (SF_ALLOW_SPEECH | SF_ALLOW_TEXT)  #define GAME_NAME_X (SPNL_X + 18)				// x coordinate of game names  #define GAME_NAME_Y (SPNL_Y + SP_TOP_GAP)		// start y coord of game names @@ -138,6 +142,7 @@ public:  	SkyTextResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, uint16 pX, uint16 pY, uint32 pText, uint8 pOnClick, OSystem *system, uint8 *screen);  	virtual ~SkyTextResource(void);  	virtual void drawToScreen(bool doMask); +	void flushForRedraw(void);  private:  	uint16 _oldX, _oldY;  	uint8 *_oldScreen; @@ -166,9 +171,11 @@ private:  	uint16 doMusicSlide(void);  	uint16 doSpeedSlide(void);  	uint16 toggleFx(SkyConResource *pButton); -	uint16 toggleText(SkyConResource *pButton); +	uint16 toggleText(void);  	uint16 shiftDown(uint8 speed);  	uint16 shiftUp(uint8 speed); +	void drawTextCross(uint32 flags); +	void drawCross(uint16 x, uint16 y);  	uint16 saveRestorePanel(bool allowSave);  	void loadDescriptions(uint8 *destBuf); @@ -249,6 +256,7 @@ private:  	SkyConResource *_savePanLookList[6], *_restorePanLookList[6];  	static char _quitTexts[12][30]; +	static uint8 _crossImg[594];  };  #endif // CONTROL_H diff --git a/sky/sky.cpp b/sky/sky.cpp index b7a07ef335..ed94bd7471 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -183,7 +183,7 @@ void SkyState::initialise(void) {  			_skyMusic = new SkyGmMusic(_detector->createMidi(), _skyDisk, _system);  	}  	if (isCDVersion()) -		_systemVars.systemFlags |= SF_ALLOW_SPEECH; +		_systemVars.systemFlags |= SF_ALLOW_SPEECH | SF_ALLOW_TEXT;  	else  		_systemVars.systemFlags |= SF_ALLOW_TEXT; | 
