aboutsummaryrefslogtreecommitdiff
path: root/saga/interface.cpp
diff options
context:
space:
mode:
authorAndrew Kurushin2005-04-22 14:11:04 +0000
committerAndrew Kurushin2005-04-22 14:11:04 +0000
commitcdede6caa485c8ea6f1868b1723a52d77b544c1e (patch)
treebc31bb0d1be9f43c75a3fa9f5c4f97265625ae76 /saga/interface.cpp
parentff19273ae6d161f63d81561a9a73f925afa9b652 (diff)
downloadscummvm-rg350-cdede6caa485c8ea6f1868b1723a52d77b544c1e.tar.gz
scummvm-rg350-cdede6caa485c8ea6f1868b1723a52d77b544c1e.tar.bz2
scummvm-rg350-cdede6caa485c8ea6f1868b1723a52d77b544c1e.zip
implemented inventory
todo: timeout catchup & capital 'U' & 'D' handling svn-id: r17748
Diffstat (limited to 'saga/interface.cpp')
-rw-r--r--saga/interface.cpp401
1 files changed, 226 insertions, 175 deletions
diff --git a/saga/interface.cpp b/saga/interface.cpp
index 85eb0b1f16..7b28260adb 100644
--- a/saga/interface.cpp
+++ b/saga/interface.cpp
@@ -116,13 +116,18 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
}
- _mainPanel.x = 0; //TODO: move constant to DisplayInfo
- _mainPanel.y = 149;
+ _mainPanel.x = _vm->getDisplayInfo().mainPanelXOffset;
+ _mainPanel.y = _vm->getDisplayInfo().mainPanelYOffset;
_mainPanel.currentButton = NULL;
+ _inventoryUpButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryUpButtonIndex);
+ _inventoryDownButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryDownButtonIndex);
+
- _conversePanel.x = 0; //TODO: move constant to DisplayInfo
- _conversePanel.y = 149;
+ _conversePanel.x = _vm->getDisplayInfo().conversePanelXOffset;
+ _conversePanel.y = _vm->getDisplayInfo().conversePanelYOffset;
_conversePanel.currentButton = NULL;
+ _converseUpButton = _conversePanel.getButton(_vm->getDisplayInfo().converseUpButtonIndex);
+ _converseDownButton = _conversePanel.getButton(_vm->getDisplayInfo().converseDownButtonIndex);
_leftPortrait = 0;
_rightPortrait = 0;
@@ -135,6 +140,10 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
_statusOnceColor = -1;
_inventoryCount = 0;
+ _inventoryPos = 0;
+ _inventoryStart = 0;
+ _inventoryEnd = 0;
+ _inventoryBox = 0;
_inventorySize = ITE_INVENTORY_SIZE;
_inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16));
@@ -233,6 +242,7 @@ int Interface::setMode(int mode, bool force) {
bool Interface::processKeyCode(int keyCode) {
int i;
+ PanelButton *panelButton;
switch (_panelMode) {
case kPanelNull:
if (keyCode == 27) {// Esc
@@ -245,12 +255,16 @@ bool Interface::processKeyCode(int keyCode) {
}
break;
case kPanelMain:
- for (i = 0; i < kVerbTypesMax; i++) {
- if (_verbTypeToPanelButton[i] != NULL) {
- if (_verbTypeToPanelButton[i]->keyChar == keyCode) {
- _vm->_script->setVerb(_verbTypeToPanelButton[i]->id);
- return true;
- }
+ for (i = 0; i < _mainPanel.buttonsCount; i++) {
+ panelButton = &_mainPanel.buttons[i];
+ if (panelButton->keyChar == keyCode) {
+ if (panelButton->type == kPanelButtonVerb) {
+ _vm->_script->setVerb(panelButton->id);
+ }
+ if (panelButton->type == kPanelButtonArrow) {
+ inventoryChangePos(panelButton->id);
+ }
+ return true;
}
}
break;
@@ -310,6 +324,39 @@ int Interface::setRightPortrait(int portrait) {
return SUCCESS;
}
+void Interface::drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton) {
+ PanelButton * rightButtonVerbPanelButton;
+ PanelButton * currentVerbPanelButton;
+ int textColor;
+ int spriteNumber;
+ Point point;
+
+ rightButtonVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getRightButtonVerb());
+ currentVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getCurrentVerb());
+
+ if (panelButton->state) {
+ textColor = _vm->getDisplayInfo().verbTextActiveColor;
+ } else {
+ if (panelButton == rightButtonVerbPanelButton) {
+ textColor = _vm->getDisplayInfo().verbTextActiveColor;
+ } else {
+ textColor = _vm->getDisplayInfo().verbTextColor;
+ }
+ }
+
+ if (panelButton == currentVerbPanelButton) {
+ spriteNumber = panelButton->downSpriteNumber;
+ } else {
+ spriteNumber = panelButton->upSpriteNumber;
+ }
+ point.x = _mainPanel.x + panelButton->xOffset;
+ point.y = _mainPanel.y + panelButton->yOffset;
+
+ _vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
+
+ drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
+}
+
int Interface::draw() {
SURFACE *backBuffer;
int i;
@@ -332,10 +379,9 @@ int Interface::draw() {
origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
bufToSurface(backBuffer, _mainPanel.image, _mainPanel.imageWidth, _mainPanel.imageHeight, NULL, &origin);
- //here we will draw verbs
for (i = 0; i < kVerbTypesMax; i++) {
if (_verbTypeToPanelButton[i] != NULL) {
- drawPanelButtonText(backBuffer, &_mainPanel, _verbTypeToPanelButton[i], _vm->getDisplayInfo().verbTextColor, _vm->getDisplayInfo().verbTextShadowColor);
+ drawVerbPanel(backBuffer, _verbTypeToPanelButton[i]);
}
}
} else {
@@ -366,9 +412,7 @@ int Interface::draw() {
_vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
}
- if (_inMainMode) {
- drawInventory();
- }
+ drawInventory();
return SUCCESS;
}
@@ -379,11 +423,14 @@ int Interface::update(const Point& mousePoint, int updateFlag) {
if (_panelMode == kPanelMain) {
if (updateFlag & UPDATE_MOUSEMOVE) {
-
+ bool lastWasPlayfield = _lastMousePoint.y < _vm->getSceneHeight();
if (mousePoint.y < _vm->getSceneHeight()) {
+ if (!lastWasPlayfield) {
+ handleCommandUpdate(mousePoint);
+ }
_vm->_script->whichObject(mousePoint);
} else {
- if (_lastMousePoint.y < _vm->getSceneHeight()) {
+ if (lastWasPlayfield) {
_vm->_script->setNonPlayfieldVerb();
}
handleCommandUpdate(mousePoint);
@@ -435,10 +482,10 @@ void Interface::drawStatusBar() {
// Erase background of status bar
- rect.left = 0;
- rect.top = _vm->getDisplayInfo().statusY;
- rect.right = _vm->getDisplayWidth();
- rect.bottom = _vm->getDisplayInfo().statusY + _vm->getDisplayInfo().statusHeight;
+ rect.left = _vm->getDisplayInfo().statusXOffset;
+ rect.top = _vm->getDisplayInfo().statusYOffset;
+ rect.right = rect.left + _vm->getDisplayWidth();
+ rect.bottom = rect.top + _vm->getDisplayInfo().statusHeight;
drawRect(backBuffer, rect, _vm->getDisplayInfo().statusBGColor);
@@ -449,8 +496,8 @@ void Interface::drawStatusBar() {
else
color = _statusOnceColor;
- _vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2),
- _vm->getDisplayInfo().statusY + _vm->getDisplayInfo().statusTextY, color, 0, 0);
+ _vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, _vm->getDisplayInfo().statusXOffset + (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2),
+ _vm->getDisplayInfo().statusYOffset + _vm->getDisplayInfo().statusTextY, color, 0, 0);
}
@@ -463,6 +510,25 @@ void Interface::handleCommandClick(const Point& mousePoint) {
_vm->_script->setVerb(panelButton->id);
return;
}
+
+ panelButton = _mainPanel.hitTest(mousePoint, kPanelAllButtons);
+
+ if (panelButton != NULL) {
+ if (panelButton->type == kPanelButtonArrow) {
+ panelButton->state = 1;
+ converseChangePos(panelButton->id);
+ }
+
+ if (panelButton->type == kPanelButtonInventory) {
+ if (_vm->_script->_pointerObject != ID_NOTHING) {
+ _vm->_script->hitObject(_vm->leftMouseButtonPressed());
+ }
+ if (_vm->_script->_pendingVerb) {
+ _vm->_actor->_protagonist->currentAction = kActionWait;
+ _vm->_script->doVerb();
+ }
+ }
+ }
}
void Interface::handleCommandUpdate(const Point& mousePoint) {
@@ -471,22 +537,47 @@ void Interface::handleCommandUpdate(const Point& mousePoint) {
panelButton = verbHitTest(mousePoint);
if (_mainPanel.currentButton != panelButton) {
if (_mainPanel.currentButton) {
- drawVerb(_mainPanel.currentButton->id, 0);
+ if (_mainPanel.currentButton->type == kPanelButtonVerb) {
+ setVerbState(_mainPanel.currentButton->id, 0);
+ }
}
if (panelButton) {
- drawVerb(panelButton->id, 1);
+ setVerbState(panelButton->id, 1);
}
}
- _mainPanel.currentButton = panelButton;
+
if (panelButton) {
+ _mainPanel.currentButton = panelButton;
return;
}
-/* hit_button = inventoryTest(imousePointer, &ibutton_num);
- if (hit_button == SUCCESS) {
- // Hovering over an inventory object
- return SUCCESS;
- }*/
+
+ if (!_vm->mouseButtonPressed()) { // remove pressed flag
+ _inventoryUpButton->state = 0;
+ _inventoryDownButton->state = 0;
+ }
+
+ panelButton = _mainPanel.hitTest(mousePoint, kPanelAllButtons);
+
+ if (panelButton != NULL) {
+ if (panelButton->type == kPanelButtonArrow) {
+ if (panelButton->state == 1) {
+ //TODO: insert timeout catchup
+ inventoryChangePos(panelButton->id);
+ }
+ draw();
+ }
+
+ if (panelButton->type == kPanelButtonInventory) {
+ _vm->_script->whichObject(mousePoint);
+ }
+ }
+
+ bool changed = (panelButton != _mainPanel.currentButton);
+ _mainPanel.currentButton = panelButton;
+ if (changed) {
+ draw();
+ }
}
@@ -506,39 +597,81 @@ PanelButton *Interface::verbHitTest(const Point& mousePoint) {
return NULL;
}
+//inventory stuff
+void Interface::inventoryChangePos(int chg) {
+ if ((chg < 0 && _inventoryStart + chg >= 0) ||
+ (chg > 0 && _inventoryStart < _inventoryEnd)) {
+ _inventoryStart += chg;
+ draw();
+ }
+}
+
+void Interface::inventorySetPos(int key) {
+ _inventoryBox = key - '1';
+ _inventoryPos = _inventoryStart + _inventoryBox;
+ if (_inventoryPos >= _inventoryCount)
+ _inventoryPos = -1;
+}
+
+void Interface::updateInventory(int pos) {
+ BYTE cols = _vm->getDisplayInfo().inventoryColumns;
+ if (pos >= _inventoryCount) {
+ pos = _inventoryCount - 1;
+ }
+ if (pos < 0) {
+ pos = 0;
+ }
+ _inventoryStart = (pos - cols) / cols * cols;
+ if (_inventoryStart < 0) {
+ _inventoryStart = 0;
+ }
+
+ _inventoryEnd = (_inventoryCount - 1 - cols) / cols * cols;
+ if (_inventoryEnd < 0) {
+ _inventoryEnd = 0;
+ }
+}
+
void Interface::addToInventory(int sprite, int pos) {
- if (pos != -1) {
+ if (pos != -1) {
_inventory[pos] = sprite;
- _inventoryCount++;
+ _inventoryCount = MAX(_inventoryCount, pos + 1);
return;
}
- if (_inventoryCount < _inventorySize) {
- for (int i = _inventoryCount; i > 0; i--) {
- _inventory[i] = _inventory[i - 1];
- }
-
- _inventory[0] = sprite;
- _inventoryCount++;
- draw();
+ if (_inventoryCount >= _inventorySize) {
+ return;
}
+
+ for (int i = _inventoryCount; i > 0; i--) {
+ _inventory[i] = _inventory[i - 1];
+ }
+
+ _inventory[0] = sprite;
+ _inventoryCount++;
+
+ _inventoryPos = 0;
+ updateInventory(0);
+
+ draw();
}
void Interface::removeFromInventory(int sprite) {
- for (int i = 0; i < _inventoryCount; i++) {
- if (_inventory[i] == sprite) {
- int j;
+ int j = inventoryItemPosition(sprite);
+ if (j == -1) {
+ return;
+ }
- for (j = i; i < _inventoryCount; j++) {
- _inventory[j] = _inventory[j + 1];
- }
+ int i;
- _inventory[j] = 0;
- _inventoryCount--;
- draw();
- return;
- }
+ for (i = j; i < _inventoryCount; i++) {
+ _inventory[i] = _inventory[i + 1];
}
+
+ --_inventoryCount;
+ _inventory[_inventoryCount] = 0;
+ updateInventory(j);
+ draw();
}
void Interface::clearInventory() {
@@ -546,6 +679,7 @@ void Interface::clearInventory() {
_inventory[i] = 0;
_inventoryCount = 0;
+ updateInventory(0);
}
int Interface::inventoryItemPosition(int sprite) {
@@ -559,113 +693,46 @@ int Interface::inventoryItemPosition(int sprite) {
void Interface::drawInventory() {
if (_panelMode != kPanelMain)
return;
- SURFACE *back_buf = _vm->_gfx->getBackBuffer();
-
- // TODO: Inventory scrolling
-
- int row = 0;
- int col = 0;
-
- int x = _vm->getDisplayInfo().inventoryX + _vm->getDisplayInfo().inventoryIconXOffset;
- int y = _vm->getDisplayInfo().inventoryY + _vm->getDisplayInfo().inventoryIconYOffset;
- int width = _vm->getDisplayInfo().inventoryIconWidth + _vm->getDisplayInfo().inventoryXSpacing;
- int height = _vm->getDisplayInfo().inventoryIconHeight + _vm->getDisplayInfo().inventoryYSpacing;
- Point drawPoint;
-
- for (int i = 0; i < _inventoryCount; i++) {
- if (!_vm->_actor->validObjId(_vm->_actor->objIndexToId(_inventory[i]))) {
- continue;
- }
- drawPoint.x = x + col * width;
- drawPoint.y = y + row * height;
-
- _vm->_sprite->draw(back_buf, _vm->_sprite->_mainSprites,
- _vm->_actor->getObj(_vm->_actor->objIndexToId(_inventory[i]))->spriteListResourceId,
- drawPoint, 256);
-
- if (++col >= _vm->getDisplayInfo().inventoryColumns) {
- if (++row >= _vm->getDisplayInfo().inventoryRows) {
- break;
- }
- col = 0;
- }
+ SURFACE *backBuffer = _vm->_gfx->getBackBuffer();
+ int i;
+ Rect rect;
+ int ci;
+ ObjectData *obj;
+ Point point;
+ ci = _inventoryStart;
+ if (_inventoryStart != 0) {
+ drawPanelButtonArrow(backBuffer, &_mainPanel, _inventoryUpButton);
+ }
+ if (_inventoryStart != _inventoryEnd) {
+ drawPanelButtonArrow(backBuffer, &_mainPanel, _inventoryDownButton);
}
-}
-
-int Interface::inventoryTest(const Point& imousePt, int *ibutton) {
- int row = 0;
- int col = 0;
-
- int xbase = _vm->getDisplayInfo().inventoryX;
- int ybase = _vm->getDisplayInfo().inventoryY;
- int width = _vm->getDisplayInfo().inventoryIconWidth + _vm->getDisplayInfo().inventoryXSpacing;
- int height = _vm->getDisplayInfo().inventoryIconHeight + _vm->getDisplayInfo().inventoryYSpacing;
-
- for (int i = 0; i < _inventoryCount; i++) {
- int x = xbase + col * width;
- int y = ybase + row * height;
- if (imousePt.x >= x && imousePt.x < x + _vm->getDisplayInfo().inventoryIconWidth && imousePt.y >= y && imousePt.y < y + _vm->getDisplayInfo().inventoryIconHeight) {
- *ibutton = i;
- return SUCCESS;
+ for (i = 0; i < _mainPanel.buttonsCount; i++) {
+ if (ci >= _inventoryCount) {
+ break;
}
-
- if (++col >= _vm->getDisplayInfo().inventoryColumns) {
- if (++row >= _vm->getDisplayInfo().inventoryRows) {
- break;
- }
- col = 0;
+ if (_mainPanel.buttons[i].type != kPanelButtonInventory) {
+ continue;
}
+ _mainPanel.calcPanelButtonRect(&_mainPanel.buttons[i], rect);
+
+//4debug drawRect(backBuffer, rect, kITEColorWhite);
+ point.x = rect.left;
+ point.y = rect.top;
+ obj = _vm->_actor->getObj(_inventory[ci]);
+ _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites, obj->spriteListResourceId, rect, 256);
+
+ ci++;
}
-
- return FAILURE;
}
-
-void Interface::drawVerb(int verb, int state) {
- SURFACE *backBuffer;
- PanelButton * panelButton;
- PanelButton * rightButtonVerbPanelButton;
- PanelButton * currentVerbPanelButton;
- int textColor;
- int spriteNumber;
- Point point;
-
- backBuffer = _vm->_gfx->getBackBuffer();
-
- panelButton = getPanelButtonByVerbType(verb);
- rightButtonVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getRightButtonVerb());
- currentVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getCurrentVerb());
-
- if (panelButton == NULL) {
- warning("panelButton == NULL");
- return;
- }
+void Interface::setVerbState(int verb, int state) {
+ PanelButton * panelButton = getPanelButtonByVerbType(verb);
if (state == 2) {
state = (_mainPanel.currentButton == panelButton) ? 1 : 0;
- }
-
- if (state) {
- textColor = _vm->getDisplayInfo().verbTextActiveColor;
- } else {
- if (panelButton == rightButtonVerbPanelButton) {
- textColor = _vm->getDisplayInfo().verbTextActiveColor;
- } else {
- textColor = _vm->getDisplayInfo().verbTextColor;
- }
- }
-
- if (panelButton == currentVerbPanelButton) {
- spriteNumber = panelButton->downSpriteNumber;
- } else {
- spriteNumber = panelButton->upSpriteNumber;
- }
- point.x = _mainPanel.x + panelButton->xOffset;
- point.y = _mainPanel.y + panelButton->yOffset;
-
- _vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
-
- drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
+ }
+ panelButton->state = state;
+ draw();
}
void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) {
@@ -673,7 +740,7 @@ void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelBu
int spriteNumber;
if (panel->currentButton == panelButton) {
- if (panelButton->flag != 0) {
+ if (panelButton->state != 0) {
spriteNumber = panelButton->downSpriteNumber;
} else {
spriteNumber = panelButton->overSpriteNumber;
@@ -867,11 +934,11 @@ void Interface::converseDisplayTextLines(SURFACE *ds) {
}
if (_converseStartPos != 0) {
- drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[4]);
+ drawPanelButtonArrow(ds, &_conversePanel, _converseUpButton);
}
if (_converseStartPos != _converseEndPos) {
- drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[5]);
+ drawPanelButtonArrow(ds, &_conversePanel, _converseDownButton);
}
}
@@ -901,22 +968,6 @@ void Interface::converseSetPos(int key) {
_conversePos = -1;
}
-PanelButton *Interface::converseHitTest(const Point& mousePoint) {
- PanelButton *panelButton;
- Rect rect;
- int i;
- for (i = 0; i < _conversePanel.buttonsCount; i++) {
- panelButton = &_conversePanel.buttons[i];
- if (panelButton != NULL) {
- _conversePanel.calcPanelButtonRect(panelButton, rect);
- if (rect.contains(mousePoint)) {
- return panelButton;
- }
- }
- }
-
- return NULL;
-}
void Interface::handleConverseUpdate(const Point& mousePoint) {
bool changed;
@@ -924,8 +975,8 @@ void Interface::handleConverseUpdate(const Point& mousePoint) {
PanelButton *last = _conversePanel.currentButton;
if (!_vm->mouseButtonPressed()) { // remove pressed flag
- _conversePanel.buttons[4].flag = 0;
- _conversePanel.buttons[5].flag = 0;
+ _converseUpButton->state = 0;
+ _converseDownButton->state = 0;
}
_conversePanel.currentButton = converseHitTest(mousePoint);
@@ -945,9 +996,9 @@ void Interface::handleConverseUpdate(const Point& mousePoint) {
}
if (_conversePanel.currentButton->type == kPanelButtonArrow) {
- if (_conversePanel.currentButton->flag == 1) {
+ if (_conversePanel.currentButton->state == 1) {
//TODO: insert timeout catchup
- converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+ converseChangePos(_conversePanel.currentButton->id);
}
draw();
}
@@ -966,8 +1017,8 @@ void Interface::handleConverseClick(const Point& mousePoint) {
}
if (_conversePanel.currentButton->type == kPanelButtonArrow) {
- _conversePanel.currentButton->flag = 1;
- converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+ _conversePanel.currentButton->state = 1;
+ converseChangePos(_conversePanel.currentButton->id);
}
}