[Scummvm-git-logs] scummvm master -> 0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c
bluegr
bluegr at gmail.com
Sun May 30 14:37:44 UTC 2021
This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
de70a494cb TRECISION: Const correctness
bd64803269 TRECISION: Fix regression with closeup exits
24f3f4ff75 TRECISION: Use Common::Point for text placement
4efb1d7f44 TRECISION: Add some sanity checks to GraphicsManager. Some cleanup
ffcdb3f58d TRECISION: Simplify dissolve()
b117194994 TRECISION: Disable dissolve() for now, as it writes OOB
ef803f8768 TRECISION: Split doMouseLeftRight() into smaller functions
0ca3d76f9c TRECISION: Replace _flagCharacterExists with _flagShowCharacter
Commit: de70a494cb96224732a09e2e8bef5d5b8edec20b
https://github.com/scummvm/scummvm/commit/de70a494cb96224732a09e2e8bef5d5b8edec20b
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00
Commit Message:
TRECISION: Const correctness
Changed paths:
engines/trecision/script.cpp
diff --git a/engines/trecision/script.cpp b/engines/trecision/script.cpp
index 6e53d95202..e07ff5cce9 100644
--- a/engines/trecision/script.cpp
+++ b/engines/trecision/script.cpp
@@ -595,16 +595,16 @@ void TrecisionEngine::doInvOperate() {
if (!_curInventory)
warning("doInvOperate - _curInventory not set properly");
- bool printSentence = _logicMgr->operateInventory();
+ const bool printSentence = _logicMgr->operateInventory();
if (_inventoryObj[_curInventory]._action && printSentence)
_textMgr->characterSay(_inventoryObj[_curInventory]._action);
}
void TrecisionEngine::doScript() {
Message *message = _curMessage;
- uint16 index = message->_u16Param1;
- uint16 index2 = message->_u16Param2;
- uint32 value = message->_u32Param;
+ const uint16 index = message->_u16Param1;
+ const uint16 index2 = message->_u16Param2;
+ const uint32 value = message->_u32Param;
switch (message->_event) {
case ME_CHANGER:
Commit: bd648032697782b26d2638633392698f416bc606
https://github.com/scummvm/scummvm/commit/bd648032697782b26d2638633392698f416bc606
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00
Commit Message:
TRECISION: Fix regression with closeup exits
Changed paths:
engines/trecision/defines.h
engines/trecision/logic.cpp
diff --git a/engines/trecision/defines.h b/engines/trecision/defines.h
index d2c8a401ab..047ef68e74 100644
--- a/engines/trecision/defines.h
+++ b/engines/trecision/defines.h
@@ -669,7 +669,7 @@ enum RoomId {
#define oSCRIVANIA2B 419
#define oPORTALAMPADE2B 420
#define omLAMPADINA2B 421
-#define oEXIT2BL 422
+#define oEXIT2BL 422 // Exit from Egyptology book
#define oUEPOIS 423
#define oHATOR 424
#define oNUT 425
@@ -973,7 +973,7 @@ enum RoomId {
#define oSCATOLONE36 723
#define omCARTACCE36 724
#define omSCATOLONEA36 725
-#define oEXIT36F 726
+#define oEXIT36F 726 // Exit from security system sequence
#define oSIMON37 727
#define oSPORTELLOA37 728
#define oSPORTELLOI37 729
@@ -1436,7 +1436,7 @@ enum RoomId {
#define omWINDOW5A 1200
#define oPIANTE5A 1201
#define oEXIT58T 1202
-#define oEXIT41D 1203
+#define oEXIT41D 1203 // Exit from positioner
#define oPULSANTECD 1205
#define oPULSANTE1AD 1247
#define oPULSANTE33AD 1279
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 2f496d1f36..92475b2470 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -3505,16 +3505,16 @@ bool LogicManager::operateInventory() {
break;
case kItemEgyptologyBook:
- _vm->changeRoom(kRoom2BL);
_vm->_obj[oEXIT2BL]._goRoom = _vm->_curRoom;
+ _vm->changeRoom(kRoom2BL);
_vm->_actor->actorStop();
_vm->_pathFind->nextStep();
printSentence = false;
break;
case kItemSecuritySystemSequence:
- _vm->changeRoom(kRoom36F);
_vm->_obj[oEXIT36F]._goRoom = _vm->_curRoom;
+ _vm->changeRoom(kRoom36F);
_vm->_actor->actorStop();
_vm->_pathFind->nextStep();
printSentence = false;
@@ -3523,8 +3523,8 @@ bool LogicManager::operateInventory() {
case kItemPositioner:
for (int a = oROOM41; a <= oROOM45B; ++a)
_vm->setObjectVisible(a, false);
- _vm->changeRoom(kRoom41D);
_vm->_obj[oEXIT41D]._goRoom = _vm->_curRoom;
+ _vm->changeRoom(kRoom41D);
_vm->_inventoryObj[kItemPositioner].setFlagExtra(false);
_vm->_actor->actorStop();
_vm->_pathFind->nextStep();
@@ -3845,8 +3845,8 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
_vm->_curRoom = room;
_vm->_scheduler->resetQueues();
- _vm->closeInventoryImmediately();
_vm->clearUseWith();
+ _vm->closeInventoryImmediately();
_vm->_flagCharacterExists = true;
_vm->_flagShowCharacter = true;
Commit: 24f3f4ff75d3239dd713d86f2b4e3ca5cb1dcdc4
https://github.com/scummvm/scummvm/commit/24f3f4ff75d3239dd713d86f2b4e3ca5cb1dcdc4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00
Commit Message:
TRECISION: Use Common::Point for text placement
Changed paths:
engines/trecision/inventory.cpp
engines/trecision/text.cpp
engines/trecision/text.h
diff --git a/engines/trecision/inventory.cpp b/engines/trecision/inventory.cpp
index 6842304c7a..a3888845af 100644
--- a/engines/trecision/inventory.cpp
+++ b/engines/trecision/inventory.cpp
@@ -241,13 +241,12 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
}
const uint16 lenText = textLength(desc);
- const uint16 posX = CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText);
- const uint16 posY = MAXY - CARHEI;
+ Common::Point pos(CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText), MAXY - CARHEI);
_lastInv = (obj | 0x8000);
if (_lastInv)
_textMgr->clearLastText();
- _textMgr->addText(posX, posY, desc.c_str(), COLOR_INVENTORY, MASKCOL);
+ _textMgr->addText(pos, desc.c_str(), COLOR_INVENTORY, MASKCOL);
} else {
if (obj == _lastInv)
return;
@@ -261,7 +260,7 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
const uint16 lenText = textLength(_objName[_inventoryObj[obj]._name]);
uint16 posX = ICONMARGSX + ((iconPos(_curInventory) - _iconBase) * (ICONDX)) + ICONDX / 2;
posX = CLIP(posX - (lenText / 2), 2, MAXX - 2 - lenText);
- const uint16 posY = MAXY - CARHEI;
+ Common::Point pos(posX, MAXY - CARHEI);
_lastInv = obj;
@@ -269,7 +268,7 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
_textMgr->clearLastText();
if (_inventoryObj[obj]._name)
- _textMgr->addText(posX, posY, _objName[_inventoryObj[obj]._name], COLOR_INVENTORY, MASKCOL);
+ _textMgr->addText(pos, _objName[_inventoryObj[obj]._name], COLOR_INVENTORY, MASKCOL);
}
}
diff --git a/engines/trecision/text.cpp b/engines/trecision/text.cpp
index aa23a692ab..1aaff5d768 100644
--- a/engines/trecision/text.cpp
+++ b/engines/trecision/text.cpp
@@ -52,8 +52,10 @@ TextManager::TextManager(TrecisionEngine *vm) : _vm(vm) {
TextManager::~TextManager() {
}
-void TextManager::positionString(uint16 x, uint16 y, const char *string, uint16 *posx, uint16 *posy, bool characterFl) {
+Common::Point TextManager::positionString(uint16 x, uint16 y, const char *string, bool characterFl) {
uint16 lenText = _vm->textLength(string);
+ Common::Point pos;
+
if (lenText > 960)
lenText = (lenText * 2 / 5);
else if (lenText > 320)
@@ -64,12 +66,14 @@ void TextManager::positionString(uint16 x, uint16 y, const char *string, uint16
else
x = 0;
- *posx = CLIP<uint16>(x, 5, MAXX - lenText - 5);
+ pos.x = CLIP<uint16>(x, 5, MAXX - lenText - 5);
+
+ pos.y = characterFl ? 0 : VIDEOTOP;
+ pos.y += y - 1; //15
+ if (pos.y <= VIDEOTOP)
+ pos.y = VIDEOTOP + 1;
- *posy = characterFl ? 0 : VIDEOTOP;
- *posy += y - 1; //15
- if (*posy <= VIDEOTOP)
- *posy = VIDEOTOP + 1;
+ return pos;
}
void TextManager::formattingSuperString() {
@@ -124,21 +128,21 @@ void TextManager::characterTalk(const char *s) {
}
void TextManager::characterContinueTalk() {
- uint16 posx, posy;
+ Common::Point pos;
_vm->_flagSkipTalk = false;
_vm->_characterSpeakTime = _vm->_curTime;
_subStringAgain = (_curSubString < (_subStringUsed - 1));
- if (_vm->_flagCharacterExists)
- positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], &posx, &posy, true);
+ if (_vm->_flagShowCharacter || _vm->_animMgr->_playingAnims[kSmackerAction])
+ pos = positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], true);
else
- positionString(MAXX / 2, 30, _subString[_curSubString], &posx, &posy, false);
+ pos = positionString(MAXX / 2, 30, _subString[_curSubString], false);
clearLastText();
if (ConfMan.getBool("subtitles"))
- addText(posx, posy, _subString[_curSubString], COLOR_OBJECT, MASKCOL);
+ addText(pos, _subString[_curSubString], COLOR_OBJECT, MASKCOL);
if (!_vm->_flagDialogActive) {
if (_curSubString)
@@ -179,15 +183,15 @@ void TextManager::someoneContinueTalk() {
_subStringAgain = (_curSubString < (_subStringUsed - 1));
- uint16 posx, posy;
+ Common::Point pos;
if (_talkingPersonId)
- positionString(_vm->_obj[_talkingPersonId]._lim.left, _vm->_obj[_talkingPersonId]._lim.top, _subString[_curSubString], &posx, &posy, false);
+ pos = positionString(_vm->_obj[_talkingPersonId]._lim.left, _vm->_obj[_talkingPersonId]._lim.top, _subString[_curSubString], false);
else
- positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], &posx, &posy, true);
+ pos = positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], true);
clearLastText();
if (ConfMan.getBool("subtitles"))
- addText(posx, posy, _subString[_curSubString], HYELLOW, MASKCOL);
+ addText(pos, _subString[_curSubString], HYELLOW, MASKCOL);
if (_curSubString)
_lastFilename = Common::String::format("s%04d%c.wav", _curSentenceId, _curSubString + 'a');
@@ -291,12 +295,11 @@ void TextManager::showObjName(uint16 obj, bool show) {
_vm->_lastObj = (obj | 0x8000);
const uint16 lenText = _vm->textLength(desc);
- const uint16 posx = CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText);
- const uint16 posy = MAXY - CARHEI;
+ const Common::Point pos(CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText), MAXY - CARHEI);
if (_vm->_lastObj)
clearLastText();
- addText(posx, posy, desc.c_str(), COLOR_INVENTORY, MASKCOL);
+ addText(pos, desc.c_str(), COLOR_INVENTORY, MASKCOL);
} else {
if (!obj || !show) {
clearLastText();
@@ -320,14 +323,14 @@ void TextManager::showObjName(uint16 obj, bool show) {
else
desc = _vm->_objName[_vm->_obj[obj]._name];
- uint16 posx = (_vm->_obj[obj]._lim.left + _vm->_obj[obj]._lim.right) / 2;
- uint16 posy = (obj == oWHEELS2C) ? 187 : _vm->_obj[obj]._lim.top;
+ const uint16 x = (_vm->_obj[obj]._lim.left + _vm->_obj[obj]._lim.right) / 2;
+ const uint16 y = (obj == oWHEELS2C) ? 187 : _vm->_obj[obj]._lim.top;
+ Common::Point pos = positionString(x, y, desc.c_str(), false);
- positionString(posx, posy, desc.c_str(), &posx, &posy, false);
if (_vm->_lastObj)
clearLastText();
_vm->_lastObj = obj;
- addText(posx, posy, desc.c_str(), COLOR_OBJECT, MASKCOL);
+ addText(pos, desc.c_str(), COLOR_OBJECT, MASKCOL);
}
}
@@ -374,10 +377,10 @@ void TextManager::characterSayInAction(uint16 ss) {
characterContinueTalk();
}
-void TextManager::addText(uint16 x, uint16 y, const char *text, uint16 textCol, uint16 shadowCol) {
+void TextManager::addText(Common::Point pos, const char *text, uint16 textCol, uint16 shadowCol) {
StackText t;
- t._x = x;
- t._y = y;
+ t._x = pos.x;
+ t._y = pos.y;
t._textCol = textCol;
t._shadowCol = shadowCol;
t._clear = false;
diff --git a/engines/trecision/text.h b/engines/trecision/text.h
index ed6ae574b4..f81a76a7aa 100644
--- a/engines/trecision/text.h
+++ b/engines/trecision/text.h
@@ -60,7 +60,7 @@ class TextManager {
Common::List<StackText> _textStack;
- void positionString(uint16 x, uint16 y, const char *string, uint16 *posx, uint16 *posy, bool characterFl);
+ Common::Point positionString(uint16 x, uint16 y, const char *string, bool characterFl);
void formattingSuperString();
void formattingOneString();
void characterTalk(const char *s);
@@ -79,7 +79,7 @@ public:
void characterSay(uint16 i);
void characterSayInAction(uint16 ss);
- void addText(uint16 x, uint16 y, const char *text, uint16 textCol, uint16 shadowCol);
+ void addText(Common::Point pos, const char *text, uint16 textCol, uint16 shadowCol);
void clearLastText();
void drawText(StackText text);
void clearText();
Commit: 4efb1d7f44577068400db93255b1a374c0dcc9c4
https://github.com/scummvm/scummvm/commit/4efb1d7f44577068400db93255b1a374c0dcc9c4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00
Commit Message:
TRECISION: Add some sanity checks to GraphicsManager. Some cleanup
Changed paths:
engines/trecision/graphics.cpp
diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 38fb0b2ffa..6adbda9465 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -118,7 +118,7 @@ void GraphicsManager::drawObj() {
if (_drawMask && _drawObjIndex >= 0) {
uint8 *mask = _vm->_maskPointers[_drawObjIndex];
- for (uint16 b = _drawRect.top; b < _drawRect.bottom; ++b) {
+ for (uint16 y = _drawRect.top; y < _drawRect.bottom; ++y) {
uint16 sco = 0;
uint16 c = 0;
while (sco < _drawRect.width()) {
@@ -130,18 +130,18 @@ void GraphicsManager::drawObj() {
} else { // copy
const uint16 maskOffset = *mask;
- if (maskOffset != 0 && b >= _drawRect.top + _drawObjRect.top && b < _drawRect.top + _drawObjRect.bottom) {
+ if (maskOffset != 0 && y >= _drawRect.top + _drawObjRect.top && y < _drawRect.top + _drawObjRect.bottom) {
if (sco >= _drawObjRect.left && sco + maskOffset < _drawObjRect.right)
- memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, b), buf, maskOffset * 2);
+ memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, y), buf, maskOffset * 2);
else if (sco < _drawObjRect.left && sco + maskOffset < _drawObjRect.right && sco + maskOffset >= _drawObjRect.left)
- memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, b), buf + _drawObjRect.left - sco, (maskOffset + sco - _drawObjRect.left) * 2);
+ memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, y), buf + _drawObjRect.left - sco, (maskOffset + sco - _drawObjRect.left) * 2);
else if (sco >= _drawObjRect.left && sco + maskOffset >= _drawObjRect.right && sco < _drawObjRect.right)
- memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, b), buf, (_drawObjRect.right - sco) * 2);
+ memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, y), buf, (_drawObjRect.right - sco) * 2);
else if (sco < _drawObjRect.left && sco + maskOffset >= _drawObjRect.right)
- memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, b), buf + _drawObjRect.left - sco, (_drawObjRect.right - _drawObjRect.left) * 2);
+ memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, y), buf + _drawObjRect.left - sco, (_drawObjRect.right - _drawObjRect.left) * 2);
}
sco += *mask;
buf += *mask++;
@@ -150,15 +150,25 @@ void GraphicsManager::drawObj() {
}
}
} else {
- for (uint16 b = _drawObjRect.top; b < _drawObjRect.bottom; ++b) {
- memcpy(_screenBuffer.getBasePtr(_drawRect.left + _drawObjRect.left, _drawRect.top + b),
- buf + (b * _drawRect.width()) + _drawObjRect.left, _drawObjRect.width() * 2);
+ const uint16 x = _drawRect.left + _drawObjRect.left;
+
+ if (x + _drawObjRect.width() >= MAXX || _drawObjRect.top + _drawObjRect.height() >= MAXY) {
+ warning("drawObj: Invalid surface, skipping");
+ return;
+ }
+
+ for (uint16 y = _drawObjRect.top; y < _drawObjRect.bottom; ++y) {
+ memcpy(_screenBuffer.getBasePtr(x, _drawRect.top + y),
+ buf + (y * _drawRect.width()) + _drawObjRect.left, _drawObjRect.width() * 2);
}
}
}
void GraphicsManager::eraseObj() {
- _screenBuffer.fillRect(Common::Rect(_drawObjRect.left, _drawObjRect.top + TOP, _drawObjRect.right, _drawObjRect.bottom + TOP), 0);
+ Common::Rect eraseRect = _drawObjRect;
+ eraseRect.translate(0, TOP);
+ if (eraseRect.isValidRect())
+ _screenBuffer.fillRect(eraseRect, 0);
}
void GraphicsManager::clearScreen() {
@@ -175,6 +185,11 @@ void GraphicsManager::copyToScreenBuffer(const Graphics::Surface *surface, int x
}
void GraphicsManager::copyToScreenBufferInner(const Graphics::Surface *surface, int x, int y) {
+ if (x + surface->w >= MAXX || y + surface->h >= MAXY) {
+ warning("copyToScreenBufferInner: Invalid surface, skipping");
+ return;
+ }
+
for (int curY = 0; curY < surface->h; ++curY) {
// NOTE: We use surface width for the pitch so that memcpy works
// correcly with surfaces from getSubArea()
@@ -183,6 +198,11 @@ void GraphicsManager::copyToScreenBufferInner(const Graphics::Surface *surface,
}
void GraphicsManager::blitToScreenBuffer(const Graphics::Surface *surface, int x, int y, const byte *palette, bool useSmkBg) {
+ if (x + surface->w >= MAXX || y + surface->h >= MAXY) {
+ warning("blitToScreenBuffer: Invalid surface, skipping");
+ return;
+ }
+
const uint16 mask = (uint16)_screenFormat.RGBToColor(palette[0], palette[1], palette[2]);
Graphics::Surface *surface16 = surface->convertTo(_screenFormat, palette);
@@ -338,7 +358,12 @@ void GraphicsManager::updatePixelFormat(uint16 *p, uint32 len) const {
* (dark) 0..8 (light)
*/
void GraphicsManager::shadow(uint16 x, uint16 y, uint8 num) {
- const uint16 val = _screenBuffer.getPixel(x, y);
+ if (x >= MAXX || y >= MAXY) {
+ warning("shadow: Invalid pixel, skipping");
+ return;
+ }
+
+ const uint16 val = (uint16)_screenBuffer.getPixel(x, y);
const uint16 shadow =
((((val & _bitMask[2]) * num >> 7) & _bitMask[2]) |
(((val & _bitMask[1]) * num >> 7) & _bitMask[1]) |
@@ -347,6 +372,11 @@ void GraphicsManager::shadow(uint16 x, uint16 y, uint8 num) {
}
void GraphicsManager::pixelAliasing(uint16 x, uint16 y) {
+ if (x >= MAXX || y >= MAXY) {
+ warning("pixelAliasing: Invalid pixel, skipping");
+ return;
+ }
+
int px1 = _screenBuffer.getPixel(x - 1, y);
int px2 = _screenBuffer.getPixel(x, y);
@@ -397,7 +427,7 @@ void GraphicsManager::dissolve(uint8 val) {
if (centerY - (int)y > TOP)
memset(_screenBuffer.getBasePtr(0, TOP), 0, (centerY - (int)y - TOP) * MAXX * 2);
- if ((AREA + TOP) > centerY + (int)y)
+ if (AREA + TOP > centerY + (int)y)
memset(_screenBuffer.getBasePtr(0, centerY + (int)y), 0, (AREA + TOP - (centerY + (int)y)) * MAXX * 2);
float d1 = b * b - a * a * b + a * a / 4.0f;
Commit: ffcdb3f58d51a3ad903742c69bf37bd4851e4c56
https://github.com/scummvm/scummvm/commit/ffcdb3f58d51a3ad903742c69bf37bd4851e4c56
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00
Commit Message:
TRECISION: Simplify dissolve()
Changed paths:
engines/trecision/graphics.cpp
engines/trecision/graphics.h
engines/trecision/logic.cpp
diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 6adbda9465..e998644cff 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -403,7 +403,8 @@ uint16 GraphicsManager::aliasing(uint32 val1, uint32 val2, uint8 num) {
((((val1 & _bitMask[0]) * num + (val2 & _bitMask[0]) * (8 - num)) >> 3) & _bitMask[0]));
}
-void GraphicsManager::dissolve(uint8 val) {
+void GraphicsManager::dissolve() {
+ const uint16 val = 30;
uint16 centerX = MAXX / 2;
uint16 centerY = MAXY / 2;
diff --git a/engines/trecision/graphics.h b/engines/trecision/graphics.h
index 7a89ee231a..a4c5e8b873 100644
--- a/engines/trecision/graphics.h
+++ b/engines/trecision/graphics.h
@@ -94,7 +94,7 @@ public:
void shadow(uint16 x, uint16 y, uint8 num);
void pixelAliasing(uint16 x, uint16 y);
- void dissolve(uint8 val);
+ void dissolve();
void addDirtyRect(Common::Rect rect, bool translateRect, bool updateActorRect = false);
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 92475b2470..d610dfb428 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -3839,7 +3839,7 @@ void LogicManager::initControlPanel() {
void LogicManager::doSystemChangeRoom(uint16 room) {
if (_vm->_curRoom == kRoom41D && _vm->_oldRoom != room)
- _vm->_graphicsMgr->dissolve(30);
+ _vm->_graphicsMgr->dissolve();
_vm->_oldRoom = _vm->_curRoom;
_vm->_curRoom = room;
Commit: b117194994f5cb51c566b4dcbbe6cd4dc58936ff
https://github.com/scummvm/scummvm/commit/b117194994f5cb51c566b4dcbbe6cd4dc58936ff
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00
Commit Message:
TRECISION: Disable dissolve() for now, as it writes OOB
Changed paths:
engines/trecision/graphics.cpp
diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index e998644cff..94e6d63b6e 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -404,6 +404,8 @@ uint16 GraphicsManager::aliasing(uint32 val1, uint32 val2, uint8 num) {
}
void GraphicsManager::dissolve() {
+ // FIXME: This is writing OOB. Disabled for now
+#if 0
const uint16 val = 30;
uint16 centerX = MAXX / 2;
uint16 centerY = MAXY / 2;
@@ -478,6 +480,8 @@ void GraphicsManager::dissolve() {
cv = _vm->readTime();
}
+#endif
+
clearScreen();
}
Commit: ef803f87682c8f5e5b08cc996299f668e4bfeb3d
https://github.com/scummvm/scummvm/commit/ef803f87682c8f5e5b08cc996299f668e4bfeb3d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00
Commit Message:
TRECISION: Split doMouseLeftRight() into smaller functions
Changed paths:
engines/trecision/logic.cpp
engines/trecision/logic.h
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index d610dfb428..0fa81acd59 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -492,7 +492,7 @@ void LogicManager::endChangeRoom() {
else if (_vm->_curRoom == kRoom5A && !_vm->_room[kRoom5A].isDone())
_vm->_textMgr->characterSay(1408);
else if (_vm->_curRoom == kRoomControlPanel && (_vm->_oldRoom == kRoomControlPanel))
- _vm->_logicMgr->doSys(o00LOAD);
+ _vm->_logicMgr->handleClickControlPanel(o00LOAD);
_vm->_inventoryObj[kItemPositioner].setFlagExtra(false);
}
@@ -3600,199 +3600,89 @@ bool LogicManager::doMouseInventory() {
return !_vm->_flagCharacterExists && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
}
-void LogicManager::doMouseLeftRight() {
- // for the displacer
- if ((_vm->_curObj >= oPULSANTE1AD) && (_vm->_curObj <= oPULSANTE33AD)) {
- if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
- (_vm->_obj[oEXIT41D]._goRoom == kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT))
- _vm->_scheduler->mouseOperate(_vm->_curObj);
- else if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
- (_vm->_obj[oEXIT41D]._goRoom != kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT)) {
- _vm->_obj[oEXIT41D]._goRoom = kRoom45S;
- _vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
- _vm->changeRoom(kRoom45S);
- } else if (_vm->_obj[oEXIT41D]._goRoom != _vm->_obj[_vm->_curObj]._goRoom && (_vm->_curMessage->_event == ME_MRIGHT)) {
- _vm->_obj[oEXIT41D]._goRoom = _vm->_obj[_vm->_curObj]._goRoom;
- _vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
- _vm->changeRoom(_vm->_obj[oEXIT41D]._goRoom);
- } else if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
- _vm->_scheduler->mouseExamine(_vm->_curObj);
- else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
- _vm->_scheduler->mouseOperate(_vm->_curObj);
- return;
- }
- // end of displacer
-
- if (_vm->_curRoom == kRoom52) {
- // snake escape 52
- if (_vm->isObjectVisible(oSNAKEU52)) {
- if (_vm->isGameArea(_vm->_mousePos) && !_vm->_flagUseWithStarted && (_vm->_curObj != oSNAKEU52)) {
- _vm->startCharacterAction(a526, 0, 1, 0);
- _vm->setObjectAnim(oSCAVO51, a516);
- _vm->_snake52.set(_vm->_curMessage);
+void LogicManager::handleClickSphinxPuzzle() {
+ if (_vm->checkMask(_vm->_mousePos)) {
+ if ((_vm->_curObj >= oWHEEL1A2C) && (_vm->_curObj <= oWHEEL12C2C))
+ _wheel = (_vm->_curObj - oWHEEL1A2C) % 3;
+ else if (_vm->_curObj == oPULSANTE2C) {
+ if (_vm->_curMessage->_event == ME_MLEFT) {
+ _vm->_scheduler->mouseExamine(_vm->_curObj);
return;
}
- }
- } else if (_vm->_curRoom == kRoomControlPanel) {
- // Sys
- _vm->checkMask(_vm->_mousePos);
- doSys(_vm->_curObj);
- return;
- }
+ _vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
+ _vm->setObjectVisible(oBASEWHEELS2C, false);
+ _vm->setObjectVisible(omWHEELS2C, false);
+ _vm->setObjectVisible(oPULSANTE2C, false);
+ _vm->setObjectVisible(_wheelPos[0] * 3 + 0 + oWHEEL1A2C, false);
+ _vm->setObjectVisible(_wheelPos[1] * 3 + 1 + oWHEEL1A2C, false);
+ _vm->setObjectVisible(_wheelPos[2] * 3 + 2 + oWHEEL1A2C, false);
+ _vm->setObjectVisible(oCAMPO2C, true);
+ _vm->setObjectVisible(oTEMPIO2C, true);
+ _vm->setObjectVisible(oLEONE2C, true);
+ _vm->setObjectVisible(oSFINGE2C, true);
+ _vm->setObjectVisible(oSTATUA2C, true);
+ _vm->setObjectVisible(od2CTO2E, true);
+ _vm->setObjectVisible(oCARTELLOA2C, true);
+ _vm->setObjectVisible(od2CTO26, true);
+ _vm->setObjectVisible(oWHEELS2C, true);
+ _vm->_flagShowCharacter = true;
+ _vm->_animMgr->startSmkAnim(_vm->_room[_vm->_curRoom]._bkgAnim);
+
+ // right combination
+ if ((_wheelPos[0] == 7) && (_wheelPos[1] == 5) && (_wheelPos[2] == 11)) {
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTEAPERTURA, 0, 0, _vm->_curObj);
+ _vm->_obj[oSFINGE2C].setFlagPerson(false);
+ } else
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTE, 0, 0, _vm->_curObj);
- // If it's in a room without a character, like a map or a book
- if (!_vm->_flagCharacterExists) {
- if (_vm->isInventoryArea(_vm->_mousePos) && (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P)) {
- if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
- _vm->_useWith[WITH] = 0;
- _vm->_curObj = 0;
- _vm->_lightIcon = 0xFF;
- _vm->setInventoryStart(_vm->_iconBase, INVENTORY_SHOW);
- if (_vm->_curMessage->_event == ME_MRIGHT || _vm->_flagUseWithStarted)
- _vm->useItem();
- else
- _vm->examineItem();
- }
return;
- }
+ } else
+ return;
- if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
- _vm->_scheduler->mouseExamine(_vm->_curObj);
- else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
- _vm->_scheduler->mouseOperate(_vm->_curObj);
+ if (_vm->_curMessage->_event == ME_MLEFT)
+ _wheelPos[_wheel] = (_wheelPos[_wheel] > 10) ? 0 : _wheelPos[_wheel] + 1;
+ if (_vm->_curMessage->_event == ME_MRIGHT)
+ _wheelPos[_wheel] = (_wheelPos[_wheel] < 1) ? 11 : _wheelPos[_wheel] - 1;
- return;
+ _vm->_soundMgr->play(wWHEELS2C);
+ _vm->setObjectVisible(_vm->_curObj, false);
+ _vm->setObjectVisible(_wheelPos[_wheel] * 3 + _wheel + oWHEEL1A2C, true);
}
+}
- // Special management for 2C wheels
- if (_vm->isObjectVisible(oBASEWHEELS2C) && _vm->_curRoom == kRoom2C) {
- if (_vm->checkMask(_vm->_mousePos)) {
- if ((_vm->_curObj >= oWHEEL1A2C) && (_vm->_curObj <= oWHEEL12C2C))
- _wheel = (_vm->_curObj - oWHEEL1A2C) % 3;
- else if (_vm->_curObj == oPULSANTE2C) {
- if (_vm->_curMessage->_event == ME_MLEFT) {
- _vm->_scheduler->mouseExamine(_vm->_curObj);
- return;
- }
- _vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
- _vm->setObjectVisible(oBASEWHEELS2C, false);
- _vm->setObjectVisible(omWHEELS2C, false);
- _vm->setObjectVisible(oPULSANTE2C, false);
- _vm->setObjectVisible(_wheelPos[0] * 3 + 0 + oWHEEL1A2C, false);
- _vm->setObjectVisible(_wheelPos[1] * 3 + 1 + oWHEEL1A2C, false);
- _vm->setObjectVisible(_wheelPos[2] * 3 + 2 + oWHEEL1A2C, false);
- _vm->setObjectVisible(oCAMPO2C, true);
- _vm->setObjectVisible(oTEMPIO2C, true);
- _vm->setObjectVisible(oLEONE2C, true);
- _vm->setObjectVisible(oSFINGE2C, true);
- _vm->setObjectVisible(oSTATUA2C, true);
- _vm->setObjectVisible(od2CTO2E, true);
- _vm->setObjectVisible(oCARTELLOA2C, true);
- _vm->setObjectVisible(od2CTO26, true);
- _vm->setObjectVisible(oWHEELS2C, true);
- _vm->_flagShowCharacter = true;
- _vm->_animMgr->startSmkAnim(_vm->_room[_vm->_curRoom]._bkgAnim);
-
- // right combination
- if ((_wheelPos[0] == 7) && (_wheelPos[1] == 5) && (_wheelPos[2] == 11)) {
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTEAPERTURA, 0, 0, _vm->_curObj);
- _vm->_obj[oSFINGE2C].setFlagPerson(false);
- } else
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTE, 0, 0, _vm->_curObj);
-
- return;
- } else
- return;
-
- if (_vm->_curMessage->_event == ME_MLEFT)
- _wheelPos[_wheel] = (_wheelPos[_wheel] > 10) ? 0 : _wheelPos[_wheel] + 1;
- if (_vm->_curMessage->_event == ME_MRIGHT)
- _wheelPos[_wheel] = (_wheelPos[_wheel] < 1) ? 11 : _wheelPos[_wheel] - 1;
+void LogicManager::handleClickPositioner() {
+ if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
+ (_vm->_obj[oEXIT41D]._goRoom == kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT))
+ _vm->_scheduler->mouseOperate(_vm->_curObj);
+ else if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
+ (_vm->_obj[oEXIT41D]._goRoom != kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT)) {
+ _vm->_obj[oEXIT41D]._goRoom = kRoom45S;
+ _vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
+ _vm->changeRoom(kRoom45S);
+ } else if (_vm->_obj[oEXIT41D]._goRoom != _vm->_obj[_vm->_curObj]._goRoom && (_vm->_curMessage->_event == ME_MRIGHT)) {
+ _vm->_obj[oEXIT41D]._goRoom = _vm->_obj[_vm->_curObj]._goRoom;
+ _vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
+ _vm->changeRoom(_vm->_obj[oEXIT41D]._goRoom);
+ } else if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
+ _vm->_scheduler->mouseExamine(_vm->_curObj);
+ else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
+ _vm->_scheduler->mouseOperate(_vm->_curObj);
+}
- _vm->_soundMgr->play(wWHEELS2C);
- _vm->setObjectVisible(_vm->_curObj, false);
- _vm->setObjectVisible(_wheelPos[_wheel] * 3 + _wheel + oWHEEL1A2C, true);
+void LogicManager::handleClickSnakeEscape() {
+ if (_vm->isObjectVisible(oSNAKEU52)) {
+ if (_vm->isGameArea(_vm->_mousePos) && !_vm->_flagUseWithStarted && _vm->_curObj != oSNAKEU52) {
+ _vm->startCharacterAction(a526, 0, 1, 0);
+ _vm->setObjectAnim(oSCAVO51, a516);
+ _vm->_snake52.set(_vm->_curMessage);
}
- return;
}
+}
- // Game area
- if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
- if (_vm->_flagScriptActive)
- _vm->_curObj = _vm->_curMessage->_u32Param;
-
- int pmousex = _vm->_curMessage->_u16Param1;
- int pmousey = _vm->_curMessage->_u16Param2;
- if (!_vm->_logicMgr->mouseClick(_vm->_curObj)) {
- if (_vm->checkMask(_vm->_mousePos)) {
- if ((_vm->_obj[_vm->_curObj]._lim.right - _vm->_obj[_vm->_curObj]._lim.left) < MAXX / 7) {
- pmousex = (_vm->_obj[_vm->_curObj]._lim.left + _vm->_obj[_vm->_curObj]._lim.right) / 2;
- pmousey = ((_vm->_obj[_vm->_curObj]._lim.top + _vm->_obj[_vm->_curObj]._lim.bottom) / 2) + TOP;
- }
- }
- _vm->_pathFind->whereIs(pmousex, pmousey);
- _vm->_pathFind->findPath();
- }
- _vm->_scheduler->initCharacterQueue();
-
- if (_vm->checkMask(_vm->_mousePos) && !_vm->_flagDialogActive) {
- if (_vm->_curRoom == kRoom1D && !_vm->_room[kRoom1D].hasExtra() && (_vm->_curObj != oSCALA1D))
- _vm->_curObj = oDONNA1D;
- else if (_vm->_curRoom == kRoom2B && _vm->_room[kRoom2B].hasExtra() && (_vm->_curObj != oCARTELLO2B) && (_vm->_curObj != od2BTO28)) {
- _vm->_textMgr->clearLastText();
- _vm->_curObj = oDOOR2B;
- _vm->startCharacterAction(a2B1PROVAAPRIREPORTA, 0, 0, 0);
- _vm->clearUseWith();
- return;
- } else if (_vm->_curRoom == kRoom35 && !_vm->_room[kRoom35].hasExtra()
- && ((_vm->_curObj == oFRONTOFFICEC35)
- || (_vm->_curObj == oFRONTOFFICEA35) || (_vm->_curObj == oASCENSORE35) || (_vm->_curObj == oMONITOR35)
- || (_vm->_curObj == oSEDIA35) || (_vm->_curObj == oRIBELLEA35) || (_vm->_curObj == oCOMPUTER35) || (_vm->_curObj == oGIORNALE35))) {
- _vm->_curObj = oLASTLEV5;
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
- _vm->clearUseWith();
- return;
- } else if ((_vm->_curMessage->_event == ME_MLEFT) &&
- ((!_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == oENTRANCE2E) || (_vm->_curObj == od24TO26) || (_vm->_curObj == od21TO23 && !_vm->_obj[_vm->_curObj].isFlagExamine()))) ||
- (_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == od2ETO2C) || (_vm->_curObj == od24TO23) || (_vm->_curObj == od21TO22 && !_vm->_obj[_vm->_curObj].isFlagExamine()) || (_vm->_curObj == od2GVTO26))))) {
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
- return;
- }
-
- if (_vm->_curMessage->_event == ME_MRIGHT) {
- if (!_vm->_obj[_vm->_curObj].isFlagExamine() && (_vm->_curObj != 0)) {
- if (_vm->_flagUseWithStarted) {
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
- return;
- }
- if (_vm->_obj[_vm->_curObj].isFlagRoomIn())
- _vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, _vm->_obj[_vm->_curObj]._anim, _vm->_obj[_vm->_curObj]._ninv);
- else if (_vm->_obj[_vm->_curObj].isFlagRoomOut())
- _vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, 0, _vm->_obj[_vm->_curObj]._ninv);
- _vm->_actor->actorStop();
- _vm->_pathFind->nextStep();
- _vm->_obj[_vm->_curObj].setFlagDone(true);
- } else if (_vm->_obj[_vm->_curObj].isFlagUseWith()) {
- _vm->_pathFind->_characterGoToPosition = -1;
- _vm->_actor->actorStop();
- _vm->_pathFind->nextStep();
- _vm->_scheduler->mouseOperate(_vm->_curObj);
- } else
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
- } else
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
- } else
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
- } else if (_vm->isInventoryArea(_vm->_mousePos)) {
- // Inventory area
- if (_vm->_animMgr->_playingAnims[kSmackerAction] || _vm->_flagDialogActive || _vm->_curRoom == kRoomControlPanel)
- return;
-
+// Handles rooms without a character, like maps or books
+void LogicManager::handleClickCloseup() {
+ if (_vm->isInventoryArea(_vm->_mousePos) && (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P)) {
if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
- _vm->_scheduler->initCharacterQueue();
- _vm->_actor->actorStop();
- _vm->_pathFind->nextStep();
- _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
_vm->_useWith[WITH] = 0;
_vm->_curObj = 0;
_vm->_lightIcon = 0xFF;
@@ -3802,6 +3692,116 @@ void LogicManager::doMouseLeftRight() {
else
_vm->examineItem();
}
+ return;
+ }
+
+ if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
+ _vm->_scheduler->mouseExamine(_vm->_curObj);
+ else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
+ _vm->_scheduler->mouseOperate(_vm->_curObj);
+}
+
+void LogicManager::handleClickGameArea() {
+ if (_vm->_flagScriptActive)
+ _vm->_curObj = _vm->_curMessage->_u32Param;
+
+ int pmousex = _vm->_curMessage->_u16Param1;
+ int pmousey = _vm->_curMessage->_u16Param2;
+ if (!_vm->_logicMgr->mouseClick(_vm->_curObj)) {
+ if (_vm->checkMask(_vm->_mousePos)) {
+ if ((_vm->_obj[_vm->_curObj]._lim.right - _vm->_obj[_vm->_curObj]._lim.left) < MAXX / 7) {
+ pmousex = (_vm->_obj[_vm->_curObj]._lim.left + _vm->_obj[_vm->_curObj]._lim.right) / 2;
+ pmousey = ((_vm->_obj[_vm->_curObj]._lim.top + _vm->_obj[_vm->_curObj]._lim.bottom) / 2) + TOP;
+ }
+ }
+ _vm->_pathFind->whereIs(pmousex, pmousey);
+ _vm->_pathFind->findPath();
+ }
+ _vm->_scheduler->initCharacterQueue();
+
+ if (_vm->checkMask(_vm->_mousePos) && !_vm->_flagDialogActive) {
+ if (_vm->_curRoom == kRoom1D && !_vm->_room[kRoom1D].hasExtra() && (_vm->_curObj != oSCALA1D))
+ _vm->_curObj = oDONNA1D;
+ else if (_vm->_curRoom == kRoom2B && _vm->_room[kRoom2B].hasExtra() && (_vm->_curObj != oCARTELLO2B) && (_vm->_curObj != od2BTO28)) {
+ _vm->_textMgr->clearLastText();
+ _vm->_curObj = oDOOR2B;
+ _vm->startCharacterAction(a2B1PROVAAPRIREPORTA, 0, 0, 0);
+ _vm->clearUseWith();
+ return;
+ } else if (_vm->_curRoom == kRoom35 && !_vm->_room[kRoom35].hasExtra() && ((_vm->_curObj == oFRONTOFFICEC35) || (_vm->_curObj == oFRONTOFFICEA35) || (_vm->_curObj == oASCENSORE35) || (_vm->_curObj == oMONITOR35) || (_vm->_curObj == oSEDIA35) || (_vm->_curObj == oRIBELLEA35) || (_vm->_curObj == oCOMPUTER35) || (_vm->_curObj == oGIORNALE35))) {
+ _vm->_curObj = oLASTLEV5;
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+ _vm->clearUseWith();
+ return;
+ } else if ((_vm->_curMessage->_event == ME_MLEFT) &&
+ ((!_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == oENTRANCE2E) || (_vm->_curObj == od24TO26) || (_vm->_curObj == od21TO23 && !_vm->_obj[_vm->_curObj].isFlagExamine()))) ||
+ (_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == od2ETO2C) || (_vm->_curObj == od24TO23) || (_vm->_curObj == od21TO22 && !_vm->_obj[_vm->_curObj].isFlagExamine()) || (_vm->_curObj == od2GVTO26))))) {
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+ return;
+ }
+
+ if (_vm->_curMessage->_event == ME_MRIGHT) {
+ if (!_vm->_obj[_vm->_curObj].isFlagExamine() && (_vm->_curObj != 0)) {
+ if (_vm->_flagUseWithStarted) {
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+ return;
+ }
+ if (_vm->_obj[_vm->_curObj].isFlagRoomIn())
+ _vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, _vm->_obj[_vm->_curObj]._anim, _vm->_obj[_vm->_curObj]._ninv);
+ else if (_vm->_obj[_vm->_curObj].isFlagRoomOut())
+ _vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, 0, _vm->_obj[_vm->_curObj]._ninv);
+ _vm->_actor->actorStop();
+ _vm->_pathFind->nextStep();
+ _vm->_obj[_vm->_curObj].setFlagDone(true);
+ } else if (_vm->_obj[_vm->_curObj].isFlagUseWith()) {
+ _vm->_pathFind->_characterGoToPosition = -1;
+ _vm->_actor->actorStop();
+ _vm->_pathFind->nextStep();
+ _vm->_scheduler->mouseOperate(_vm->_curObj);
+ } else
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+ } else
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+ } else
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+}
+
+void LogicManager::handleClickInventoryArea() {
+ if (_vm->_animMgr->_playingAnims[kSmackerAction] || _vm->_flagDialogActive || _vm->_curRoom == kRoomControlPanel)
+ return;
+
+ if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
+ _vm->_scheduler->initCharacterQueue();
+ _vm->_actor->actorStop();
+ _vm->_pathFind->nextStep();
+ _vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+ _vm->_useWith[WITH] = 0;
+ _vm->_curObj = 0;
+ _vm->_lightIcon = 0xFF;
+ _vm->setInventoryStart(_vm->_iconBase, INVENTORY_SHOW);
+ if (_vm->_curMessage->_event == ME_MRIGHT || _vm->_flagUseWithStarted)
+ _vm->useItem();
+ else
+ _vm->examineItem();
+ }
+}
+
+void LogicManager::doMouseLeftRight() {
+ if (_vm->_curObj >= oPULSANTE1AD && _vm->_curObj <= oPULSANTE33AD) {
+ handleClickPositioner();
+ } else if (_vm->isObjectVisible(oBASEWHEELS2C) && _vm->_curRoom == kRoom2C) {
+ handleClickSphinxPuzzle();
+ } else if (_vm->_curRoom == kRoomControlPanel) {
+ handleClickControlPanel(_vm->_curObj);
+ } else if (!_vm->_flagCharacterExists) {
+ handleClickCloseup();
+ } else if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
+ if (_vm->_curRoom == kRoom52)
+ handleClickSnakeEscape();
+
+ handleClickGameArea();
+ } else if (_vm->isInventoryArea(_vm->_mousePos)) {
+ handleClickInventoryArea();
}
}
@@ -3929,7 +3929,9 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
}
}
-void LogicManager::doSys(uint16 curObj) {
+void LogicManager::handleClickControlPanel(uint16 curObj) {
+ _vm->checkMask(_vm->_mousePos);
+
switch (curObj) {
case o00QUIT:
if (_vm->quitPrompt())
diff --git a/engines/trecision/logic.h b/engines/trecision/logic.h
index 2e5334e9ff..7e2b324b00 100644
--- a/engines/trecision/logic.h
+++ b/engines/trecision/logic.h
@@ -90,7 +90,14 @@ private:
void startCharacterAnimations();
bool startPlayDialog();
void initControlPanel();
- void doSys(uint16 curObj);
+
+ void handleClickControlPanel(uint16 curObj);
+ void handleClickSphinxPuzzle();
+ void handleClickPositioner();
+ void handleClickSnakeEscape();
+ void handleClickCloseup();
+ void handleClickGameArea();
+ void handleClickInventoryArea();
};
// end of class
Commit: 0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c
https://github.com/scummvm/scummvm/commit/0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:18+03:00
Commit Message:
TRECISION: Replace _flagCharacterExists with _flagShowCharacter
These two ended up having practically the same semantics, so they have
been merged. The only place where the difference actually mattered
is in characterContinueTalk(), to show the subtitles in the correct
place, but it suffices to check for active character animations at that
point instead.
Changed paths:
engines/trecision/anim.cpp
engines/trecision/dialog.cpp
engines/trecision/graphics.cpp
engines/trecision/logic.cpp
engines/trecision/saveload.cpp
engines/trecision/script.cpp
engines/trecision/trecision.cpp
engines/trecision/trecision.h
diff --git a/engines/trecision/anim.cpp b/engines/trecision/anim.cpp
index 7884adc5b4..c0a0821bc9 100644
--- a/engines/trecision/anim.cpp
+++ b/engines/trecision/anim.cpp
@@ -101,10 +101,10 @@ void AnimTypeManager::executeAtFrameDoit(ATFHandle *h, int doit, uint16 objectId
break;
case fCHARACTEROFF:
- _vm->_flagCharacterExists = false;
+ _vm->_flagShowCharacter = false;
break;
case fCHARACTERON:
- _vm->_flagCharacterExists = true;
+ _vm->_flagShowCharacter = true;
break;
case fCHARACTERFOREGROUND:
_vm->_forcedActorPos = BOX_FOREGROUND;
diff --git a/engines/trecision/dialog.cpp b/engines/trecision/dialog.cpp
index 8fd98acbb5..2b65376f3e 100644
--- a/engines/trecision/dialog.cpp
+++ b/engines/trecision/dialog.cpp
@@ -429,7 +429,6 @@ void DialogManager::afterChoice() {
break;
case dC4A1:
- _vm->_flagCharacterExists = true;
_vm->_flagShowCharacter = true;
_vm->_actor->actorStop();
_vm->_pathFind->nextStep();
diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 94e6d63b6e..97b609c4c5 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -649,7 +649,7 @@ void GraphicsManager::paintObjAnm(uint16 curBox) {
}
}
- if (_vm->_actorPos == curBox && _vm->_flagShowCharacter && _vm->_flagCharacterExists) {
+ if (_vm->_actorPos == curBox && _vm->_flagShowCharacter) {
_vm->_renderer->drawCharacter(CALCPOINTS);
int x1 = _vm->_actor->_lim[0];
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 0fa81acd59..908f68824b 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -436,11 +436,9 @@ void LogicManager::endChangeRoom() {
if (isCloseupOrControlRoom()) { // Screens without inventory
_vm->_flagShowCharacter = false;
- _vm->_flagCharacterExists = false;
_vm->_flagInventoryLocked = true;
} else if (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P) { // Screens with inventory
_vm->_flagShowCharacter = false;
- _vm->_flagCharacterExists = false;
} else if (_vm->_curRoom == kRoom23A && (_vm->_oldRoom == kRoom21) && !_vm->_room[kRoom23A].isDone())
_vm->_flagShowCharacter = false;
else if (_vm->_curRoom == kRoom31 && !_vm->_room[kRoom31].isDone())
@@ -2858,7 +2856,7 @@ bool LogicManager::mouseOperate(uint16 curObj) {
_vm->setObjectVisible(oSUNDIAL49, false);
_vm->_obj[oAGENDA49]._examine = 1099;
_vm->_obj[oAGENDA49]._action = 1100;
- _vm->_flagCharacterExists = true;
+ _vm->_flagShowCharacter = true;
_vm->_curObj = oAGENDA49;
_vm->playScript(s49SUNDIAL);
}
@@ -2915,14 +2913,14 @@ bool LogicManager::mouseOperate(uint16 curObj) {
_vm->setObjectVisible(oAST14C + a, false);
}
_vm->changeRoom(kRoom51, 0, 1);
- _vm->_flagCharacterExists = true;
+ _vm->_flagShowCharacter = true;
} else {
for (a = 0; a < 6; ++a) {
_comb4CT[a] = 0;
_vm->setObjectVisible(oAST14C + a, false);
}
_vm->changeRoom(kRoom4C, 0, 4);
- _vm->_flagCharacterExists = true;
+ _vm->_flagShowCharacter = true;
}
retVal = false;
break;
@@ -3597,7 +3595,7 @@ void LogicManager::doMouseGame() {
// Returns true when it's in a room without a character, such as the map
bool LogicManager::doMouseInventory() {
- return !_vm->_flagCharacterExists && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
+ return !_vm->_flagShowCharacter && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
}
void LogicManager::handleClickSphinxPuzzle() {
@@ -3793,7 +3791,7 @@ void LogicManager::doMouseLeftRight() {
handleClickSphinxPuzzle();
} else if (_vm->_curRoom == kRoomControlPanel) {
handleClickControlPanel(_vm->_curObj);
- } else if (!_vm->_flagCharacterExists) {
+ } else if (!_vm->_flagShowCharacter) {
handleClickCloseup();
} else if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
if (_vm->_curRoom == kRoom52)
@@ -3848,7 +3846,6 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
_vm->clearUseWith();
_vm->closeInventoryImmediately();
- _vm->_flagCharacterExists = true;
_vm->_flagShowCharacter = true;
_vm->_flagCharacterSpeak = false;
_vm->_flagSomeoneSpeaks = false;
diff --git a/engines/trecision/saveload.cpp b/engines/trecision/saveload.cpp
index 06a1850002..f09d2f430f 100644
--- a/engines/trecision/saveload.cpp
+++ b/engines/trecision/saveload.cpp
@@ -453,7 +453,7 @@ bool TrecisionEngine::syncGameStream(Common::Serializer &ser) {
ser.syncAsSint16LE(_flagUseWithStarted);
ser.syncAsSint16LE(unused, SAVE_VERSION_ORIGINAL_MIN, SAVE_VERSION_ORIGINAL_MAX); // _flagMousePolling
ser.syncAsSint16LE(unused, SAVE_VERSION_ORIGINAL_MIN, SAVE_VERSION_ORIGINAL_MAX); // _flagDialogSolitaire
- ser.syncAsSint16LE(_flagCharacterExists);
+ ser.syncAsSint16LE(unused); // _flagCharacterExists
syncInventory(ser);
_actor->syncGameStream(ser);
diff --git a/engines/trecision/script.cpp b/engines/trecision/script.cpp
index e07ff5cce9..84931984cd 100644
--- a/engines/trecision/script.cpp
+++ b/engines/trecision/script.cpp
@@ -408,7 +408,6 @@ void TrecisionEngine::doIdle() {
_obj[o00EXIT]._goRoom = _curRoom;
changeRoom(kRoomControlPanel);
_flagShowCharacter = false;
- _flagCharacterExists = false;
}
break;
@@ -422,7 +421,6 @@ void TrecisionEngine::doIdle() {
_obj[o00EXIT]._goRoom = _curRoom;
changeRoom(kRoomControlPanel);
_flagShowCharacter = false;
- _flagCharacterExists = false;
}
break;
diff --git a/engines/trecision/trecision.cpp b/engines/trecision/trecision.cpp
index 9f5bb1c502..995aa3a376 100644
--- a/engines/trecision/trecision.cpp
+++ b/engines/trecision/trecision.cpp
@@ -137,7 +137,6 @@ TrecisionEngine::TrecisionEngine(OSystem *syst, const ADGameDescription *desc) :
_flagSomeoneSpeaks = false;
_flagCharacterSpeak = false;
_flagUseWithStarted = false;
- _flagCharacterExists = true;
_flagNoPaintScreen = false;
_flagWaitRegen = false;
diff --git a/engines/trecision/trecision.h b/engines/trecision/trecision.h
index 008990a965..089df8b2cb 100644
--- a/engines/trecision/trecision.h
+++ b/engines/trecision/trecision.h
@@ -311,7 +311,6 @@ public:
bool _flagSomeoneSpeaks;
bool _flagCharacterSpeak;
bool _flagUseWithStarted;
- bool _flagCharacterExists;
bool _flagNoPaintScreen;
bool _flagWaitRegen;
More information about the Scummvm-git-logs
mailing list