aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mads/game.cpp2
-rw-r--r--engines/mads/screen.cpp92
-rw-r--r--engines/mads/screen.h11
-rw-r--r--engines/mads/user_interface.cpp110
-rw-r--r--engines/mads/user_interface.h26
5 files changed, 132 insertions, 109 deletions
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index e2e956e8cb..9296b95d47 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -175,7 +175,7 @@ void Game::sectionLoop() {
// Reset the user interface
_screenObjects._forceRescan = true;
_screenObjects._inputMode = kInputBuildingSentences;
- _scene._userInterface._scrollerY = 0;
+ _scene._userInterface._scrollbarActive = SCROLLBAR_NONE;
_player._loadsFirst = true;
diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp
index 519dcabccd..9824a3e7cc 100644
--- a/engines/mads/screen.cpp
+++ b/engines/mads/screen.cpp
@@ -261,13 +261,10 @@ ScreenObjects::ScreenObjects(MADSEngine *vm) : _vm(vm) {
_v7FED6 = 0;
_v8332A = 0;
_category = CAT_NONE;
- _newDescId = 0;
- _newDescId = 0;
+ _spotId = 0;
_released = false;
_uiCount = 0;
_selectedObject = -1;
- _scrollerY = -1;
- _milliTime = 0;
_eventFlag = false;
_baseTime = 0;
}
@@ -292,14 +289,14 @@ void ScreenObjects::check(bool scanFlag) {
if (!_vm->_events->_mouseButtons || _inputMode != kInputBuildingSentences)
_vm->_events->_rightMousePressed = false;
- if ((_vm->_events->_mouseMoved || _vm->_game->_scene._userInterface._scrollerY
+ if ((_vm->_events->_mouseMoved || userInterface._scrollbarActive
|| _v8332A || _forceRescan) && scanFlag) {
_category = CAT_NONE;
_selectedObject = scanBackwards(_vm->_events->currentPos(), LAYER_GUI);
if (_selectedObject > 0) {
ScreenObject &scrObject = (*this)[_selectedObject];
_category = (ScrCategory)(scrObject._category & 7);
- _newDescId = scrObject._descId;
+ _spotId = scrObject._descId;
}
// Handling for easy mouse
@@ -335,13 +332,13 @@ void ScreenObjects::check(bool scanFlag) {
scene._userInterface._category = CAT_NONE;
}
- if (_vm->_events->_mouseButtons || _vm->_easyMouse || scene._userInterface._scrollerY)
- checkScroller();
+ if (_vm->_events->_mouseButtons || _vm->_easyMouse || userInterface._scrollbarActive)
+ scene._userInterface.updateInventoryScroller();
if (_vm->_events->_mouseButtons || _vm->_easyMouse)
scene._action.set();
- _forceRescan = 0;
+ _forceRescan = false;
}
scene._action.refresh();
@@ -380,83 +377,6 @@ int ScreenObjects::scanBackwards(const Common::Point &pt, int layer) {
return 0;
}
-void ScreenObjects::checkScroller() {
- UserInterface &userInterface = _vm->_game->_scene._userInterface;
- Common::Array<int> &inventoryList = _vm->_game->_objects._inventoryList;
-
- if (_inputMode != kInputBuildingSentences)
- return;
-
- userInterface._scrollerY = 0;
-
- if ((_category == CAT_INV_SCROLLER || (_scrollerY == 3 && _vm->_events->_mouseStatusCopy))
- && (_vm->_events->_mouseStatusCopy || _vm->_easyMouse)) {
- if ((_vm->_events->_vD2 || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy))
- && _category == CAT_INV_SCROLLER) {
- _currentDescId = _newDescId;
- }
- }
-
- if (_newDescId == _currentDescId || _scrollerY == 3) {
- _vm->_game->_scene._userInterface._scrollerY = _currentDescId;
- uint32 currentMilli = g_system->getMillis();
- uint32 timeInc = _eventFlag ? 100 : 380;
-
- if (_vm->_events->_vD2 || (_milliTime + timeInc) <= currentMilli) {
- _eventFlag = _vm->_events->_vD2 < 1;
- _milliTime = currentMilli;
-
- switch (_currentDescId) {
- case 1:
- // Scroll up
- if (userInterface._inventoryTopIndex > 0 && inventoryList.size() > 0) {
- --userInterface._inventoryTopIndex;
- userInterface._inventoryChanged = true;
- }
- break;
-
- case 2:
- // Scroll down
- if (userInterface._inventoryTopIndex < (int)inventoryList.size() &&
- inventoryList.size() > 0) {
- ++userInterface._inventoryTopIndex;
- userInterface._inventoryChanged = true;
- }
- break;
-
- case 3: {
- // Inventory slider
- int newIndex = CLIP((int)_vm->_events->currentPos().y - 170, 0, 17)
- * inventoryList.size() / 10;
- if (newIndex >= (int)inventoryList.size())
- newIndex = inventoryList.size() - 1;
-
- if (inventoryList.size() > 0) {
- userInterface._inventoryChanged = newIndex != userInterface._inventoryTopIndex;
- userInterface._inventoryTopIndex = newIndex;
- }
- break;
- }
-
- default:
- break;
- }
-
- if (userInterface._inventoryChanged) {
- int dummy;
- userInterface.updateSelection(CAT_INV_LIST, 0, &dummy);
- }
- }
- }
-
- if (userInterface._scrollerY != _scrollerY ||
- userInterface._objectY != _objectY)
- userInterface.scrollerChanged();
-
- _scrollerY = userInterface._scrollerY;
- _objectY = userInterface._objectY;
-}
-
void ScreenObjects::elementHighlighted() {
Scene &scene = _vm->_game->_scene;
UserInterface &userInterface = scene._userInterface;
diff --git a/engines/mads/screen.h b/engines/mads/screen.h
index 11b81346f1..5be627a428 100644
--- a/engines/mads/screen.h
+++ b/engines/mads/screen.h
@@ -140,15 +140,8 @@ class ScreenObjects : public Common::Array<ScreenObject> {
private:
MADSEngine *_vm;
int _objectY;
- int _scrollerY;
int scanBackwards(const Common::Point &pt, int layer);
-
- /**
- * Checks for the mouse being on the user interface inventory scroller,
- * and update the scroller and selected inventory object as necessary
- */
- void checkScroller();
public:
InputMode _inputMode;
int _v7FED6;
@@ -156,13 +149,11 @@ public:
int _forceRescan;
int _selectedObject;
ScrCategory _category;
- int _newDescId;
- int _currentDescId;
bool _released;
int _uiCount;
- uint32 _milliTime;
bool _eventFlag;
uint32 _baseTime;
+ int _spotId;
/*
* Constructor
diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp
index 3ae571c41c..a850c9a68f 100644
--- a/engines/mads/user_interface.cpp
+++ b/engines/mads/user_interface.cpp
@@ -208,11 +208,15 @@ UserInterface::UserInterface(MADSEngine *vm) : _vm(vm), _dirtyAreas(vm),
_scrollFlag = false;
_category = CAT_NONE;
_inventoryTopIndex = 0;
- _objectY = 0;
_selectedInvIndex = -1;
_selectedActionIndex = 0;
_selectedItemVocabIdx = -1;
- _scrollerY = 0;
+ _scrollbarActive = SCROLLBAR_NONE;
+ _scrollbarOldActive = SCROLLBAR_NONE;
+ _scrollbarStrokeType = SCROLLBAR_NONE;
+ _scrollbarQuickly = false;
+ _scrollbarMilliTime = 0;
+ _scrollbarElevator = _scrollbarOldElevator = 0;
_highlightedCommandIndex = -1;
_highlightedInvIndex = -1;
_highlightedItemVocabIndex = -1;
@@ -327,11 +331,95 @@ void UserInterface::drawItemVocabList() {
}
void UserInterface::drawScrolller() {
- if (_scrollerY > 0)
- writeVocab(CAT_INV_SCROLLER, _scrollerY);
+ if (_scrollbarActive)
+ writeVocab(CAT_INV_SCROLLER, _scrollbarActive);
writeVocab(CAT_INV_SCROLLER, 4);
}
+void UserInterface::updateInventoryScroller() {
+ ScreenObjects &screenObjects = _vm->_game->_screenObjects;
+ Common::Array<int> &inventoryList = _vm->_game->_objects._inventoryList;
+
+ if (screenObjects._inputMode != kInputBuildingSentences)
+ return;
+
+ _scrollbarActive = SCROLLBAR_NONE;
+
+ if ((
+ (screenObjects._category == CAT_INV_SCROLLER) ||
+ (screenObjects._category != CAT_INV_SCROLLER && _scrollbarOldActive == SCROLLBAR_ELEVATOR)
+ ) && (_vm->_events->_mouseStatusCopy || _vm->_easyMouse)) {
+ if ((_vm->_events->_mouseClicked || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy))
+ && (screenObjects._category == CAT_INV_SCROLLER))
+ _scrollbarStrokeType = (ScrollbarActive)screenObjects._spotId;
+
+ if (screenObjects._spotId == _scrollbarStrokeType || _scrollbarOldActive == SCROLLBAR_ELEVATOR) {
+ _scrollbarActive = _scrollbarStrokeType;
+ uint32 currentMilli = g_system->getMillis();
+ uint32 timeInc = _scrollbarQuickly ? 100 : 380;
+
+ if (_vm->_events->_mouseClicked || (_vm->_events->_mouseStatusCopy && (_scrollbarMilliTime + timeInc) <= currentMilli)) {
+ _scrollbarQuickly = _vm->_events->_vD2 < 1;
+ _scrollbarMilliTime = currentMilli;
+
+ switch (_scrollbarStrokeType) {
+ case 1:
+ // Scroll up
+ if (_inventoryTopIndex > 0 && inventoryList.size() > 0) {
+ --_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ break;
+
+ case 2:
+ // Scroll down
+ if (_inventoryTopIndex < ((int)inventoryList.size() - 1) && inventoryList.size() > 1) {
+ ++_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ break;
+
+ case 3: {
+ // Inventory slider
+ int newIndex = CLIP((int)_vm->_events->currentPos().y - 170, 0, 17)
+ * inventoryList.size() / 10;
+ if (newIndex >= (int)inventoryList.size())
+ newIndex = inventoryList.size() - 1;
+
+ if (inventoryList.size() > 0) {
+ _inventoryChanged = newIndex != _inventoryTopIndex;
+ _inventoryTopIndex = newIndex;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ if (_inventoryChanged) {
+ int dummy;
+ updateSelection(CAT_INV_LIST, 0, &dummy);
+ }
+ }
+ }
+ }
+
+ if (_scrollbarActive != _scrollbarOldActive || _scrollbarElevator != _scrollbarOldElevator)
+ scrollbarChanged();
+
+ _scrollbarOldActive = _scrollbarActive;
+ _scrollbarOldElevator = _scrollbarElevator;
+}
+
+void UserInterface::scrollbarChanged() {
+ Common::Rect r(73, 4, 73 + 9, 4 + 38);
+ _uiSlots.add(r);
+ _uiSlots.draw(false, false);
+ drawScrolller();
+ updateRect(r);
+}
+
void UserInterface::writeVocab(ScrCategory category, int id) {
Common::Rect bounds;
if (!getBounds(category, id, bounds))
@@ -393,7 +481,8 @@ void UserInterface::writeVocab(ScrCategory category, int id) {
break;
}
- font->setColorMode((id == 4) || (_scrollerY == 3) ? SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED);
+ font->setColorMode((id == 4) || (_scrollbarActive == SCROLLBAR_ELEVATOR) ?
+ SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED);
font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top));
break;
default:
@@ -561,7 +650,7 @@ bool UserInterface::getBounds(ScrCategory category, int v, Common::Rect &bounds)
break;
case 4:
// Thumb
- bounds.top = _objectY + 14;
+ bounds.top = _scrollbarElevator + 14;
bounds.setHeight(1);
break;
default:
@@ -753,6 +842,7 @@ void UserInterface::selectObject(int invIndex) {
void UserInterface::updateSelection(ScrCategory category, int newIndex, int *idx) {
Game &game = *_vm->_game;
+ Common::Array<int> &invList = game._objects._inventoryList;
Common::Rect bounds;
if (category == CAT_INV_LIST && _inventoryChanged) {
@@ -764,11 +854,11 @@ void UserInterface::updateSelection(ScrCategory category, int newIndex, int *idx
updateRect(bounds);
_inventoryChanged = false;
- if (game._objects._inventoryList.size() > 1) {
- _objectY = 0;
+ if (invList.size() < 2) {
+ _scrollbarElevator = 0;
} else {
- int v = _inventoryTopIndex * 18 / (game._objects._inventoryList.size() - 1);
- _objectY = MIN(v, 17);
+ int v = _inventoryTopIndex * 18 / (invList.size() - 1);
+ _scrollbarElevator = MIN(v, 17);
}
} else {
int oldIndex = *idx;
diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h
index 46ba478f5b..f06917310e 100644
--- a/engines/mads/user_interface.h
+++ b/engines/mads/user_interface.h
@@ -33,6 +33,14 @@ namespace MADS {
enum { IMG_SPINNING_OBJECT = 200, IMG_TEXT_UPDATE = 201 };
+enum ScrollbarActive {
+ SCROLLBAR_NONE = 0, // No state
+ SCROLLBAR_UP = 1, // Up butotn
+ SCROLLBAR_DOWN = 2, // Down button
+ SCROLLBAR_ELEVATOR = 3, // Elevator bar
+ SCROLLBAR_THUMB = 4 // Scrollbar thumb
+};
+
class AnimFrameEntry;
class UISlot {
@@ -96,6 +104,7 @@ private:
bool _scrollFlag;
int _noSegmentsActive;
int _someSegmentsActive;
+ ScrollbarActive _scrollbarStrokeType;
/**
* Loads the elements of the user interface
@@ -138,6 +147,11 @@ private:
void drawScrolller();
/**
+ * Called when the inventory scrollbar has changed
+ */
+ void scrollbarChanged();
+
+ /**
* Draw a UI textual element
*/
void writeVocab(ScrCategory category, int id);
@@ -153,11 +167,10 @@ public:
Common::Rect _drawBounds;
Common::Rect *_rectP;
int _inventoryTopIndex;
- int _objectY;
int _selectedInvIndex;
int _selectedActionIndex;
int _selectedItemVocabIdx;
- int _scrollerY;
+ ScrollbarActive _scrollbarActive, _scrollbarOldActive;
int _highlightedCommandIndex;
int _highlightedInvIndex;
int _highlightedItemVocabIndex;
@@ -165,6 +178,9 @@ public:
int _categoryIndexes[8];
Common::StringArray _talkStrings;
Common::Array<int> _talkIds;
+ bool _scrollbarQuickly;
+ uint32 _scrollbarMilliTime;
+ int _scrollbarElevator, _scrollbarOldElevator;
public:
/**
* Constructor
@@ -219,6 +235,12 @@ public:
void scrollInventory();
+ /**
+ * Checks for the mouse being on the user interface inventory scroller,
+ * and update the scroller highlight and selected inventory object as necessary
+ */
+ void updateInventoryScroller();
+
void emptyTalkList();
};