diff options
-rw-r--r-- | sword1/logic.cpp | 12 | ||||
-rw-r--r-- | sword1/menu.cpp | 10 | ||||
-rw-r--r-- | sword1/mouse.cpp | 19 | ||||
-rw-r--r-- | sword1/screen.cpp | 43 | ||||
-rw-r--r-- | sword1/screen.h | 2 | ||||
-rw-r--r-- | sword1/sound.h | 2 | ||||
-rw-r--r-- | sword1/sword1.cpp | 4 |
7 files changed, 43 insertions, 49 deletions
diff --git a/sword1/logic.cpp b/sword1/logic.cpp index 360d9e0f21..17e123472e 100644 --- a/sword1/logic.cpp +++ b/sword1/logic.cpp @@ -91,6 +91,7 @@ void SwordLogic::newScreen(uint32 screen) { } void SwordLogic::engine(void) { + debug(5, "\n\nNext logic cycle"); _eventMan->serviceGlobalEventList(); for (uint16 sectCnt = 0; sectCnt < TOTAL_SECTIONS; sectCnt++) { @@ -862,7 +863,7 @@ int SwordLogic::fnFadeUp(BsObject *cpt, int32 id, int32 speed, int32 d, int32 e, int SwordLogic::fnCheckFade(BsObject *cpt, int32 id, int32 c, int32 d, int32 e, int32 f, int32 z, int32 x) { - _scriptVars[RETURN_VALUE] = (uint8)_screen->stillFading(); + _scriptVars[RETURN_VALUE] = (uint8)(!_screen->stillFading()); return SCRIPT_CONT; } @@ -1083,12 +1084,13 @@ int SwordLogic::fnISpeak(BsObject *cpt, int32 id, int32 cdt, int32 textNo, int32 _objMan->unlockText(textNo); BsObject * textCpt = _objMan->fetchObject(textCptId); + textCpt->o_screen = cpt->o_screen; + textCpt->o_target = textCptId; // the graphic is a property of SwordText, so we don't lock/unlock it. - uint16 textSpriteWidth = _textMan->giveSpriteData(cpt->o_target)->width; - uint16 textSpriteHeight = _textMan->giveSpriteData(cpt->o_target)->height; + uint16 textSpriteWidth = _textMan->giveSpriteData(textCpt->o_target)->width; + uint16 textSpriteHeight = _textMan->giveSpriteData(textCpt->o_target)->height; - textCpt->o_screen = cpt->o_screen; cpt->o_text_id = textCptId; // now set text coords, above the player, usually @@ -1096,7 +1098,7 @@ int SwordLogic::fnISpeak(BsObject *cpt, int32 id, int32 cdt, int32 textNo, int32 #define TEXT_MARGIN 3 // distance kept from edges of screen #define ABOVE_HEAD 20 // distance kept above talking sprite uint16 textX, textY; - if ((id == GEORGE) || ((id == NICO) && (_scriptVars[SCREEN] == 10)) && (!cpt->o_anim_resource)) { + if (((id == GEORGE) || ((id == NICO) && (_scriptVars[SCREEN] == 10))) && (!cpt->o_anim_resource)) { // if George is doing Voice-Over text (centered at the bottom of the screen) textX = _scriptVars[SCROLL_OFFSET_X] + 128 + (640 / 2) - textSpriteWidth / 2; textY = _scriptVars[SCROLL_OFFSET_Y] + 128 + 400; diff --git a/sword1/menu.cpp b/sword1/menu.cpp index bbe993201d..ba44bc4577 100644 --- a/sword1/menu.cpp +++ b/sword1/menu.cpp @@ -213,13 +213,15 @@ void SwordMenu::checkTopMenu(void) { } int SwordMenu::logicChooser(BsObject *compact) { + uint8 objSelected = 0; if (_objectBarShown) - uint8 objSelected = checkMenuClick(MENU_TOP); - if (checkMenuClick(MENU_BOT)) { + objSelected = checkMenuClick(MENU_TOP); + if (!objSelected) + objSelected = checkMenuClick(MENU_BOT); + if (objSelected) { compact->o_logic = LOGIC_script; return 1; - } else - return 0; + } return 0; } diff --git a/sword1/mouse.cpp b/sword1/mouse.cpp index 6b243bd5b8..895edc5e33 100644 --- a/sword1/mouse.cpp +++ b/sword1/mouse.cpp @@ -110,13 +110,18 @@ void SwordMouse::engine(uint16 x, uint16 y, uint16 eventFlags) { _numObjs = 0; return; // no human, so we don't want the mouse engine } - - if (y < 40) { // okay, we are in the top menu. - if (!_inTopMenu) // are we just entering it? - _menu->fnStartMenu(); - _menu->checkTopMenu(); - _inTopMenu = true; - } else if (_inTopMenu) { // we're not in the menu. did we just leave it? + + if (!SwordLogic::_scriptVars[TOP_MENU_DISABLED]) { + if (y < 40) { // okay, we are in the top menu. + if (!_inTopMenu) // are we just entering it? + _menu->fnStartMenu(); + _menu->checkTopMenu(); + _inTopMenu = true; + } else if (_inTopMenu) { // we're not in the menu. did we just leave it? + _menu->fnEndMenu(); + _inTopMenu = false; + } + } else if (_inTopMenu) { _menu->fnEndMenu(); _inTopMenu = false; } diff --git a/sword1/screen.cpp b/sword1/screen.cpp index bc0811258e..c4154dae17 100644 --- a/sword1/screen.cpp +++ b/sword1/screen.cpp @@ -57,36 +57,17 @@ void SwordScreen::setScrolling(int16 offsetX, int16 offsetY) { if (!SwordLogic::_scriptVars[SCROLL_FLAG]) return ; // screen is smaller than 640x400 => no need for scrolling - int32 dx, dy; - uint32 scrlDistX, scrlDistY; uint32 scrlToX, scrlToY; offsetX = inRange(0, offsetX, SwordLogic::_scriptVars[MAX_SCROLL_OFFSET_X]); offsetY = inRange(0, offsetY, SwordLogic::_scriptVars[MAX_SCROLL_OFFSET_Y]); _oldScrollX = SwordLogic::_scriptVars[SCROLL_OFFSET_X]; _oldScrollY = SwordLogic::_scriptVars[SCROLL_OFFSET_Y]; + scrlToX = (uint32)offsetX; + scrlToY = (uint32)offsetY; - if (SwordLogic::_scriptVars[SCROLL_FLAG] == 2) { // first time on this screen - need absolute scroll immediately! - scrlToX = (uint32)offsetX; - scrlToY = (uint32)offsetY; - } else { // catch up with required scroll offsets - speed depending on distance to catch up (dx and dy) & 'SCROLL_FRACTION' used - // but limit to certain number of pixels per cycle (MAX_SCROLL_DISTANCE) - dx = SwordLogic::_scriptVars[SCROLL_OFFSET_X] - offsetX; - dy = SwordLogic::_scriptVars[SCROLL_OFFSET_Y] - offsetY; - int8 sig = (dx < 0) ? (-1) : 1; - if (dx < 0) - dx = -dx; - scrlDistX = 1 + dx/SCROLL_FRACTION; - scrlDistX = inRange(0, scrlDistX, MAX_SCROLL_DISTANCE); - scrlToX = SwordLogic::_scriptVars[SCROLL_OFFSET_X] + sig * scrlDistX; - - sig = (dy < 0) ? (-1) : 1; - if (dy < 0) - dy = -dy; - scrlDistY = 1 + dy/SCROLL_FRACTION; - scrlDistY = inRange(0, scrlDistY, MAX_SCROLL_DISTANCE); - scrlToY = SwordLogic::_scriptVars[SCROLL_OFFSET_Y] + sig * scrlDistY; - } + if (SwordLogic::_scriptVars[SCROLL_FLAG] == 2) // first time on this screen - need absolute scroll immediately! + SwordLogic::_scriptVars[SCROLL_FLAG] = 1; scrlToX = inRange(0, scrlToX, SwordLogic::_scriptVars[MAX_SCROLL_OFFSET_X]); scrlToY = inRange(0, scrlToY, SwordLogic::_scriptVars[MAX_SCROLL_OFFSET_Y]); if ((scrlToX != SwordLogic::_scriptVars[SCROLL_OFFSET_X]) || (scrlToY != SwordLogic::_scriptVars[SCROLL_OFFSET_Y])) { @@ -103,8 +84,10 @@ void SwordScreen::setScrolling(int16 offsetX, int16 offsetY) { } void SwordScreen::fadeDownPalette(void) { - _fadingStep = 15; - _fadingDirection = FADE_DOWN; + if (!_isBlack) { // don't fade down twice + _fadingStep = 15; + _fadingDirection = FADE_DOWN; + } } void SwordScreen::fadeUpPalette(void) { @@ -122,15 +105,16 @@ void SwordScreen::fnSetPalette(uint8 start, uint16 length, uint32 id, bool fadeU _targetPalette[(start + cnt) * 4 + 2] = palData[cnt * 3 + 2] << 2; } _resMan->resClose(id); + _isBlack = false; if (fadeUp) { _fadingStep = 1; - _fadingDirection = 1; + _fadingDirection = FADE_UP; } else _system->set_palette(_targetPalette, start, length); } bool SwordScreen::stillFading(void) { - return (_fadingStep > 0); + return !_isBlack; } void SwordScreen::updateScreen(void) { @@ -662,8 +646,11 @@ void SwordScreen::fadePalette(void) { _currentPalette[cnt] = (_targetPalette[cnt] * _fadingStep) >> 4; _fadingStep += _fadingDirection; - if (_fadingStep == 17) + if (_fadingStep == 17) { _fadingStep = 0; + _isBlack = false; + } else if (_fadingStep == 0) + _isBlack = true; } void SwordScreen::fnSetParallax(uint32 screen, uint32 resId) { diff --git a/sword1/screen.h b/sword1/screen.h index 1b3cee8b75..64b506227f 100644 --- a/sword1/screen.h +++ b/sword1/screen.h @@ -142,6 +142,8 @@ private: uint8 _currentPalette[256 * 4]; // for fading uint8 _fadingStep; int8 _fadingDirection; // 1 for fade up, -1 for fade down + bool _isBlack; // if the logic already faded down the palette, this is set to show the + // mainloop that no further fading is necessary. }; #endif //BSSCREEN_H diff --git a/sword1/sound.h b/sword1/sound.h index a4a43ae6e8..3c6fba476e 100644 --- a/sword1/sound.h +++ b/sword1/sound.h @@ -68,8 +68,6 @@ public: void fnStopFx(int32 fxNo); void clearAllFx(void); int addToQueue(int32 fxNo); - //void removeFromQueue(int32 fxNo); - // ^= part of fnPlayFx void engine(void); diff --git a/sword1/sword1.cpp b/sword1/sword1.cpp index 4372b7cae4..2b95eb9b2d 100644 --- a/sword1/sword1.cpp +++ b/sword1/sword1.cpp @@ -180,7 +180,6 @@ void SwordEngine::mainLoop(void) { _music->stream(); frameTime = _system->get_msecs(); _systemVars.saveGameFlag = 0; - debug(5, "\n\nNext logic cycle"); _logic->engine(); _logic->updateScreenParams(); // sets scrolling @@ -222,8 +221,7 @@ void SwordEngine::mainLoop(void) { } while ((SwordLogic::_scriptVars[SCREEN] == SwordLogic::_scriptVars[NEW_SCREEN]) && (_systemVars.saveGameFlag < 2)); // change screen - // we don't fade down after syria pan (53). Also, scripts can call fnFadeDown, in that case, we already are fading - if ((SwordLogic::_scriptVars[SCREEN] != 53) && (!_screen->stillFading())) + if (SwordLogic::_scriptVars[SCREEN] != 53) // we don't fade down after syria pan (53). _screen->fadeDownPalette(); while (_screen->stillFading()) { _music->stream(); |