aboutsummaryrefslogtreecommitdiff
path: root/saga
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
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')
-rw-r--r--saga/actor.cpp4
-rw-r--r--saga/actor.h4
-rw-r--r--saga/game.cpp116
-rw-r--r--saga/interface.cpp401
-rw-r--r--saga/interface.h58
-rw-r--r--saga/itedata.h2
-rw-r--r--saga/saga.cpp4
-rw-r--r--saga/saga.h32
-rw-r--r--saga/script.cpp150
-rw-r--r--saga/sfuncs.cpp1
-rw-r--r--saga/sprite.cpp27
-rw-r--r--saga/sprite.h1
12 files changed, 488 insertions, 312 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 77cb38fe59..cfcbab58c2 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -252,7 +252,7 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
debug(9, "init obj id=%d index=%d", obj->id, obj->index);
obj->nameIndex = ITE_ObjectTable[i].nameIndex;
obj->scriptEntrypointNumber = ITE_ObjectTable[i].scriptEntrypointNumber;
- obj->frameNumber = ITE_ObjectTable[i].frameNumber;
+ obj->spriteListResourceId = ITE_ObjectTable[i].spriteListResourceId;
obj->sceneNumber = ITE_ObjectTable[i].sceneIndex;
obj->interactBits = ITE_ObjectTable[i].interactBits;
obj->flags = 0;
@@ -550,7 +550,7 @@ bool Actor::validFollowerLocation(const Location &location) {
}
void Actor::setProtagState(int state) {
- debug(0, "STUB: setProtagState(%d)", state);
+ debug(0, "STUB: setProtagState(%d)", state); //TODO: do it
_protagState = state;
}
diff --git a/saga/actor.h b/saga/actor.h
index c734f4c1ad..542687d4a5 100644
--- a/saga/actor.h
+++ b/saga/actor.h
@@ -314,6 +314,8 @@ struct SpeechData {
class Actor {
+ friend class IsoMap;
+ friend class SagaEngine;
public:
ActorData *_centerActor;
ActorData *_protagonist;
@@ -430,8 +432,6 @@ private:
CommonObjectOrderList _drawOrderList;
protected:
- friend class IsoMap;
- friend class SagaEngine;
int _actorsCount;
ActorData **_actors;
diff --git a/saga/game.cpp b/saga/game.cpp
index a28e9119b6..4d1672a532 100644
--- a/saga/game.cpp
+++ b/saga/game.cpp
@@ -42,25 +42,35 @@ static int detectGame(const FSList &fslist, bool mode = false);
// ITE section
static PanelButton ITE_MainPanelButtons[] = {
- {kPanelButtonVerb, 52, 4, 57, 10, kVerbWalkTo, 'w', 0, 1, 0, 0},
- {kPanelButtonVerb, 52, 15, 57, 10, kVerbLookAt, 'l', 2, 3, 0, 0},
- {kPanelButtonVerb, 52, 26, 57, 10, kVerbPickUp, 'p', 4, 5, 0, 0},
- {kPanelButtonVerb, 52, 37, 57, 10, kVerbTalkTo, 't', 0, 1, 0, 0},
- {kPanelButtonVerb, 110, 4, 56, 10, kVerbOpen, 'o', 6, 7, 0, 0},
- {kPanelButtonVerb, 110, 15, 56, 10, kVerbClose, 'c', 8, 9, 0, 0},
- {kPanelButtonVerb, 110, 26, 56, 10, kVerbUse, 'u', 10, 11, 0, 0},
- {kPanelButtonVerb, 110, 37, 56, 10, kVerbGive, 'g', 12, 13, 0, 0},
- {kPanelButtonArrow, 306, 6, 8, 5, 0, 'u', 0, 0, 0, 0},
- {kPanelButtonArrow, 306, 41, 8, 5, 1, 'd', 0, 0, 0, 0}
+ {kPanelButtonVerb, 52,4, 57,10, kVerbWalkTo,'w',0, 0,1,0},
+ {kPanelButtonVerb, 52,15, 57,10, kVerbLookAt,'l',0, 2,3,0},
+ {kPanelButtonVerb, 52,26, 57,10, kVerbPickUp,'p',0, 4,5,0},
+ {kPanelButtonVerb, 52,37, 57,10, kVerbTalkTo,'t',0, 0,1,0},
+ {kPanelButtonVerb, 110,4, 56,10, kVerbOpen,'o',0, 6,7,0},
+ {kPanelButtonVerb, 110,15, 56,10, kVerbClose,'c',0, 8,9,0},
+ {kPanelButtonVerb, 110,26, 56,10, kVerbUse,'u',0, 10,11,0},
+ {kPanelButtonVerb, 110,37, 56,10, kVerbGive,'g',0, 12,13,0},
+ {kPanelButtonArrow, 306,6, 8,5, -1,'U',0, 0,4,2},
+ {kPanelButtonArrow, 306,41, 8,5, 1,'D',0, 1,5,3},
+
+ {kPanelButtonInventory, 181 + 32*0,6, 27,18, 0,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*1,6, 27,18, 1,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*2,6, 27,18, 2,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*3,6, 27,18, 3,'-',0, 0,0,0},
+
+ {kPanelButtonInventory, 181 + 32*0,27, 27,18, 4,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*1,27, 27,18, 5,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*2,27, 27,18, 6,'-',0, 0,0,0},
+ {kPanelButtonInventory, 181 + 32*3,27, 27,18, 7,'-',0, 0,0,0}
};
static PanelButton ITE_ConversePanelButtons[] = {
- {kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 0, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 0, '1', 0, 0, 0, 0},
- {kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 1, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 1, '2', 0, 0, 0, 0},
- {kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 2, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 2, '3', 0, 0, 0, 0},
- {kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 3, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 3, '4', 0, 0, 0, 0},
- {kPanelButtonArrow, 257, 6, 9, 6, 0, 'u', 0, 4, 2, 0},
- {kPanelButtonArrow, 257, 41, 9, 6, 1, 'd', 1, 5, 3, 0},
+ {kPanelButtonConverseText, 52,6 + CONVERSE_TEXT_HEIGHT * 0, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT, 0,'1',0, 0,0,0},
+ {kPanelButtonConverseText, 52,6 + CONVERSE_TEXT_HEIGHT * 1, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT, 1,'2',0, 0,0,0},
+ {kPanelButtonConverseText, 52,6 + CONVERSE_TEXT_HEIGHT * 2, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT, 2,'3',0, 0,0,0},
+ {kPanelButtonConverseText, 52,6 + CONVERSE_TEXT_HEIGHT * 3, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT, 3,'4',0, 0,0,0},
+ {kPanelButtonArrow, 257,6, 9,6, -1,'u',0, 0,4,2},
+ {kPanelButtonArrow, 257,41, 9,6, 1,'d',0, 1,5,3},
};
static GameDisplayInfo ITE_DisplayInfo = {
@@ -68,8 +78,9 @@ static GameDisplayInfo ITE_DisplayInfo = {
35, // scene path y offset
137, // scene height
-
- 137, // status y
+
+ 0, // status x offset
+ 137, // status y offset
320, // status width
12, // status height
2, // status text y offset
@@ -83,13 +94,16 @@ static GameDisplayInfo ITE_DisplayInfo = {
5, 4, // left portrait x, y offset
274, 4, // right portrait x, y offset
- 181, 155, // inventory x, y
- 2, 4, // inventory rows, columns
- 29, 20, // inventory icon width, height
- 1, 0, // inventory icon x, y offset
- 3, 1, // inventory x, y icon spacing
+ 8, 9, // inventory Up & Down button indexies
+ 2, 4, // inventory rows, columns
+
+ 0, 149, // main panel offsets
ARRAYSIZE(ITE_MainPanelButtons),
ITE_MainPanelButtons,
+
+ 4, 5, // converse Up & Down button indexies
+
+ 0, 149, // converse panel offsets
ARRAYSIZE(ITE_ConversePanelButtons),
ITE_ConversePanelButtons
};
@@ -204,40 +218,44 @@ static GameSoundInfo ITECD_GameSound = {
// IHNM section
static PanelButton IHNM_MainPanelButtons[] = {
- {kPanelButtonVerb, 0, 0, 0, 0, kVerbWalkTo, ' ', 0, 0, 0, 0}, //TODO
+ {kPanelButtonVerb, 0,0, 0,0, kVerbWalkTo,' ',0, 0,0,0}, //TODO
};
static PanelButton IHNM_ConversePanelButtons[] = {
- {kPanelButtonConverseText, 0, 0, 0, 0, 0, '1', 0, 0, 0, 0}, //TODO
+ {kPanelButtonConverseText, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO
};
-static GameDisplayInfo IHNM_DisplayInfo = {
- 640, 480,
+static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all
+ 640, 480, // logical width&height
- 0, //TODO: correct pathStartY
- 304, //TODO: correct sceneHeight
-
- 304,
- 640,
- 24,
- 8,
- 186,
- 11,
-
- 147,
- 15,
- 96,
-
- 5, 4,
- -1, -1,
-
- 0, 0, //TODO: fill it all
- 0, 0,
- 0, 0,
- 0, 0,
- 0, 0,
+ 0, // scene path y offset
+ 304, // scene height
+
+ 0, // status x offset
+ 304, // status y offset
+ 640, // status width
+ 24, // status height
+ 8, // status text y offset
+ 186, // status text color
+ 11, // status BG color
+
+ 147, // verb text color
+ 15, // verb text shadow color
+ 96, // verb text active color
+
+ 5, 4, // left portrait x, y offset
+ -1, -1, // right portrait x, y offset
+
+ -1, -1, // inventory Up & Down button indexies
+ 0, 0, // inventory rows, columns
+
+ 0, 149, // main panel offsets
ARRAYSIZE(IHNM_MainPanelButtons),
IHNM_MainPanelButtons,
+
+ -1, -1, // converse Up & Down button indexies
+
+ 0, 0, // converse panel offsets
ARRAYSIZE(IHNM_ConversePanelButtons),
IHNM_ConversePanelButtons
};
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);
}
}
diff --git a/saga/interface.h b/saga/interface.h
index 654e7dea7d..a63740dee9 100644
--- a/saga/interface.h
+++ b/saga/interface.h
@@ -80,12 +80,38 @@ struct InterfacePanel {
PanelButton *buttons;
SpriteList sprites;
+ PanelButton *getButton(int index) {
+ if ((index >= 0) && (index < buttonsCount)) {
+ return &buttons[index];
+ }
+ return NULL;
+ }
+
void calcPanelButtonRect(const PanelButton* panelButton, Rect &rect) {
rect.left = x + panelButton->xOffset;
rect.right = rect.left + panelButton->width;
rect.top = y + panelButton->yOffset;
rect.bottom = rect.top + panelButton->height;
}
+
+ PanelButton *hitTest(const Point& mousePoint, int buttonType) {
+ PanelButton *panelButton;
+ Rect rect;
+ int i;
+ for (i = 0; i < buttonsCount; i++) {
+ panelButton = &buttons[i];
+ if (panelButton != NULL) {
+ if ((panelButton->type & buttonType) > 0) {
+ calcPanelButtonRect(panelButton, rect);
+ if (rect.contains(mousePoint)) {
+ return panelButton;
+ }
+ }
+ }
+ }
+ return NULL;
+ }
+
};
@@ -133,22 +159,36 @@ public:
int draw();
int update(const Point& mousePoint, int updateFlag);
void drawStatusBar();
- void drawVerb(int verb, int state);
+ void setVerbState(int verb, int state);
bool processKeyCode(int keyCode);
+ void inventoryChangePos(int chg);
+ void inventorySetPos(int key);
void addToInventory(int sprite, int pos = -1);
void removeFromInventory(int sprite);
void clearInventory();
int inventoryItemPosition(int sprite);
void drawInventory();
+ void updateInventory(int pos);
+ int getInventoryContentByPanelButton(PanelButton * panelButton) {
+ int cell = _inventoryStart + panelButton->id;
+ if (cell >= _inventoryCount) {
+ return 0;
+ }
+ return _inventory[cell];
+ }
+ PanelButton *inventoryHitTest(const Point& mousePoint) {
+ return _mainPanel.hitTest(mousePoint, kPanelButtonInventory);
+ }
private:
- int inventoryTest(const Point& imousePt, int *ibutton);
PanelButton *verbHitTest(const Point& mousePoint);
void handleCommandUpdate(const Point& mousePoint);
void handleCommandClick(const Point& mousePoint);
- PanelButton *converseHitTest(const Point& mousePoint);
+ PanelButton *converseHitTest(const Point& mousePoint) {
+ return _conversePanel.hitTest(mousePoint, kPanelAllButtons);
+ }
void handleConverseUpdate(const Point& mousePoint);
void handleConverseClick(const Point& mousePoint);
@@ -157,6 +197,7 @@ private:
void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor);
void drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton);
+ void drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton);
public:
void converseInit(void);
@@ -181,7 +222,11 @@ private:
bool _initialized;
RSCFILE_CONTEXT *_interfaceContext;
InterfacePanel _mainPanel;
+ PanelButton *_inventoryUpButton;
+ PanelButton *_inventoryDownButton;
InterfacePanel _conversePanel;
+ PanelButton *_converseUpButton;
+ PanelButton *_converseDownButton;
SpriteList _defPortraits;
SpriteList _scenePortraits;
PanelButton *_verbTypeToPanelButton[kVerbTypesMax];
@@ -200,7 +245,11 @@ private:
uint16 *_inventory;
int _inventorySize;
- byte _inventoryCount;
+ int _inventoryStart;
+ int _inventoryEnd;
+ int _inventoryPos;
+ int _inventoryBox;
+ int _inventoryCount;
char _converseWorkString[CONVERSE_MAX_WORK_STRING];
Converse _converseText[CONVERSE_MAX_TEXTS];
@@ -214,4 +263,3 @@ private:
} // End of namespace Saga
#endif /* INTERFACE_H__ */
-/* end "r_interface.h" */
diff --git a/saga/itedata.h b/saga/itedata.h
index d604dfc4fd..299cc365db 100644
--- a/saga/itedata.h
+++ b/saga/itedata.h
@@ -71,7 +71,7 @@ struct ObjectTableData {
int16 x;
int16 y;
int16 z;
- int32 frameNumber;
+ int32 spriteListResourceId;
byte scriptEntrypointNumber;
uint16 interactBits;
};
diff --git a/saga/saga.cpp b/saga/saga.cpp
index 711542418f..5aa29c6f66 100644
--- a/saga/saga.cpp
+++ b/saga/saga.cpp
@@ -392,7 +392,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin
error("SagaEngine::loadStrings wrong strings table");
}
stringsTable.strings[i] = (const char *)stringsTable.stringsPointer + offset;
- //debug(9, "string[%i]=%s", i, stringsTable.strings[i]);
+ debug(9, "string[%i]=%s", i, stringsTable.strings[i]);
i++;
}
stringsTable.stringsCount = stringsCount;
@@ -405,7 +405,7 @@ const char *SagaEngine::getObjectName(uint16 objectId) {
switch (objectTypeId(objectId)) {
case kGameObjectObject:
obj = _actor->getObj(objectId);
- _script->_mainStrings.getString(obj->nameIndex);
+ return _script->_mainStrings.getString(obj->nameIndex);
break;
case kGameObjectActor:
actor = _actor->getActor(objectId);
diff --git a/saga/saga.h b/saga/saga.h
index 2c6dd0e614..f77ede24a7 100644
--- a/saga/saga.h
+++ b/saga/saga.h
@@ -138,9 +138,11 @@ enum HitZoneFlags {
enum PanelButtonType {
- kPanelButtonVerb = 0,
- kPanelButtonArrow = 1,
- kPanelButtonConverseText = 2
+ kPanelButtonVerb = 1,
+ kPanelButtonArrow = 2,
+ kPanelButtonConverseText = 4,
+ kPanelButtonInventory = 8,
+ kPanelAllButtons = 15
};
enum TextStringIds {
@@ -310,10 +312,10 @@ struct PanelButton {
int height;
int id;
int keyChar;
+ int state;
int upSpriteNumber;
int downSpriteNumber;
int overSpriteNumber;
- int flag;
};
struct GameDisplayInfo {
@@ -323,7 +325,8 @@ struct GameDisplayInfo {
int pathStartY;
int sceneHeight;
- int statusY;
+ int statusXOffset;
+ int statusYOffset;
int statusWidth;
int statusHeight;
int statusTextY;
@@ -339,18 +342,21 @@ struct GameDisplayInfo {
int rightPortraitXOffset;
int rightPortraitYOffset;
- int inventoryX;
- int inventoryY;
+ int inventoryUpButtonIndex;
+ int inventoryDownButtonIndex;
int inventoryRows;
int inventoryColumns;
- int inventoryIconWidth;
- int inventoryIconHeight;
- int inventoryIconXOffset;
- int inventoryIconYOffset;
- int inventoryXSpacing;
- int inventoryYSpacing;
+
+ int mainPanelXOffset;
+ int mainPanelYOffset;
int mainPanelButtonsCount;
PanelButton *mainPanelButtons;
+
+ int converseUpButtonIndex;
+ int converseDownButtonIndex;
+
+ int conversePanelXOffset;
+ int conversePanelYOffset;
int conversePanelButtonsCount;
PanelButton *conversePanelButtons;
};
diff --git a/saga/script.cpp b/saga/script.cpp
index 33390c6e1e..47823abf45 100644
--- a/saga/script.cpp
+++ b/saga/script.cpp
@@ -417,10 +417,10 @@ void Script::setLeftButtonVerb(int verb) {
if ((_currentVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
if (oldVerb > kVerbNone)
- _vm->_interface->drawVerb(oldVerb, 2);
+ _vm->_interface->setVerbState(oldVerb, 2);
if (_currentVerb > kVerbNone)
- _vm->_interface->drawVerb(_currentVerb, 2);
+ _vm->_interface->setVerbState(_currentVerb, 2);
}
}
@@ -431,10 +431,10 @@ void Script::setRightButtonVerb(int verb) {
if ((_rightButtonVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
if (oldVerb > kVerbNone)
- _vm->_interface->drawVerb(oldVerb, 2);
+ _vm->_interface->setVerbState(oldVerb, 2);
if (_rightButtonVerb > kVerbNone)
- _vm->_interface->drawVerb(_rightButtonVerb, 2);
+ _vm->_interface->setVerbState(_rightButtonVerb, 2);
}
}
@@ -673,10 +673,12 @@ void Script::whichObject(const Point& mousePoint) {
int newRightButtonVerb;
uint16 newObjectId;
ActorData *actor;
+ ObjectData *obj;
Point pickPoint;
Location pickLocation;
int hitZoneIndex;
const HitZone * hitZone;
+ PanelButton * panelButton;
objectId = ID_NOTHING;
objectFlags = 0;
@@ -685,81 +687,103 @@ void Script::whichObject(const Point& mousePoint) {
if (_vm->_actor->_protagonist->currentAction == kActionWalkDir) {
} else {
- newObjectId = _vm->_actor->hitTest(mousePoint, true);
+ if (_vm->getSceneHeight() >= mousePoint.y) {
+ newObjectId = _vm->_actor->hitTest(mousePoint, true);
- if (newObjectId != ID_NOTHING) {
- if (objectTypeId(newObjectId) == kGameObjectObject) {
- objectId = newObjectId;
- objectFlags = 0;
- newRightButtonVerb = kVerbLookAt;
+ if (newObjectId != ID_NOTHING) {
+ if (objectTypeId(newObjectId) == kGameObjectObject) {
+ objectId = newObjectId;
+ objectFlags = 0;
+ newRightButtonVerb = kVerbLookAt;
- if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) {
- objectId = ID_NOTHING;
- newObjectId = ID_NOTHING;
- }
- } else {
- actor = _vm->_actor->getActor(newObjectId);
- objectId = newObjectId;
- objectFlags = kObjUseWith;
- newRightButtonVerb = kVerbTalkTo;
-
- if ((_currentVerb == kVerbPickUp) ||
- (_currentVerb == kVerbOpen) ||
- (_currentVerb == kVerbClose) ||
- ((_currentVerb == kVerbGive) && !_firstObjectSet) ||
- ((_currentVerb == kVerbUse) && !(actor->flags & kFollower))) {
- objectId = ID_NOTHING;
- newObjectId = ID_NOTHING;
+ if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) {
+ objectId = ID_NOTHING;
+ newObjectId = ID_NOTHING;
+ }
+ } else {
+ actor = _vm->_actor->getActor(newObjectId);
+ objectId = newObjectId;
+ objectFlags = kObjUseWith;
+ newRightButtonVerb = kVerbTalkTo;
+
+ if ((_currentVerb == kVerbPickUp) ||
+ (_currentVerb == kVerbOpen) ||
+ (_currentVerb == kVerbClose) ||
+ ((_currentVerb == kVerbGive) && !_firstObjectSet) ||
+ ((_currentVerb == kVerbUse) && !(actor->flags & kFollower))) {
+ objectId = ID_NOTHING;
+ newObjectId = ID_NOTHING;
+ }
}
}
- }
- if (newObjectId == ID_NOTHING) {
+ if (newObjectId == ID_NOTHING) {
- pickPoint = mousePoint;
+ pickPoint = mousePoint;
- if (_vm->_scene->getFlags() & kSceneFlagISO) {
- pickPoint.y -= _vm->_actor->_protagonist->location.z;
- _vm->_isoMap->screenPointToTileCoords(pickPoint, pickLocation);
- pickLocation.toScreenPointUV(pickPoint);
- }
-
- hitZoneIndex = _vm->_scene->_objectMap->hitTest(pickPoint);
-
- if ((hitZoneIndex != -1)) {
- hitZone = _vm->_scene->_objectMap->getHitZone(hitZoneIndex);
- objectId = hitZone->getHitZoneId();
- objectFlags = 0;
- newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
-
- if (newRightButtonVerb == kVerbWalkOnly) {
- if (_firstObjectSet) {
- objectId = ID_NOTHING;
- } else {
- newRightButtonVerb = _leftButtonVerb = kVerbWalkTo;
- }
- } else {
- if (newRightButtonVerb == kVerbLookOnly) {
+ if (_vm->_scene->getFlags() & kSceneFlagISO) {
+ pickPoint.y -= _vm->_actor->_protagonist->location.z;
+ _vm->_isoMap->screenPointToTileCoords(pickPoint, pickLocation);
+ pickLocation.toScreenPointUV(pickPoint);
+ }
+
+ hitZoneIndex = _vm->_scene->_objectMap->hitTest(pickPoint);
+
+ if ((hitZoneIndex != -1)) {
+ hitZone = _vm->_scene->_objectMap->getHitZone(hitZoneIndex);
+ objectId = hitZone->getHitZoneId();
+ objectFlags = 0;
+ newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
+
+ if (newRightButtonVerb == kVerbWalkOnly) {
if (_firstObjectSet) {
objectId = ID_NOTHING;
} else {
- newRightButtonVerb = _leftButtonVerb = kVerbLookAt;
+ newRightButtonVerb = _leftButtonVerb = kVerbWalkTo;
+ }
+ } else {
+ if (newRightButtonVerb == kVerbLookOnly) {
+ if (_firstObjectSet) {
+ objectId = ID_NOTHING;
+ } else {
+ newRightButtonVerb = _leftButtonVerb = kVerbLookAt;
+ }
}
}
- }
- if (newRightButtonVerb >= kVerbOptions) {
- newRightButtonVerb = kVerbNone;
- }
+ if (newRightButtonVerb >= kVerbOptions) {
+ newRightButtonVerb = kVerbNone;
+ }
- if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
- objectId = ID_NOTHING;
- newObjectId = ID_NOTHING;
+ if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
+ objectId = ID_NOTHING;
+ newObjectId = ID_NOTHING;
+ }
+
+ if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) {
+ objectFlags = kObjUseWith;
+ }
}
+ }
+ } else {
+ if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
+ // no way
+ } else {
+ panelButton = _vm->_interface->inventoryHitTest(mousePoint);
+ if (panelButton) {
+ objectId = _vm->_interface->getInventoryContentByPanelButton(panelButton);
+ if (objectId != 0) {
+ obj = _vm->_actor->getObj(objectId);
+ newRightButtonVerb = kVerbLookAt;
+ if (obj->interactBits & kObjUseWith) {
+ objectFlags = kObjUseWith;
+ }
+ }
+ }
+ }
- if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) {
- objectFlags = kObjUseWith;
- }
+ if ((_currentVerb == kVerbPickUp) || (_currentVerb == kVerbTalkTo) || (_currentVerb == kVerbWalkTo)) {
+ _leftButtonVerb = kVerbLookAt;
}
}
}
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index 07c5dd947c..c3e3d0bff7 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -186,6 +186,7 @@ void Script::sfTakeObject(SCRIPTFUNC_PARAMS) {
obj = _vm->_actor->getObj(objectId);
if (obj->sceneNumber != ITE_SCENE_INV) {
obj->sceneNumber = ITE_SCENE_INV;
+ //4debug for(int j=0;j<17;j++)
_vm->_interface->addToInventory(objectId);
}
}
diff --git a/saga/sprite.cpp b/saga/sprite.cpp
index d272ed791a..36ed2cefc3 100644
--- a/saga/sprite.cpp
+++ b/saga/sprite.cpp
@@ -237,6 +237,33 @@ int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const
return SUCCESS;
}
+int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale) {
+ const byte *spriteBuffer;
+ int width;
+ int height;
+ int xAlign, spw;
+ int yAlign, sph;
+ Point spritePointer;
+ Rect clip(_vm->getDisplayWidth(),_vm->getDisplayHeight());
+
+ assert(_initialized);
+
+ getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
+ spw = (screenRect.width() - width) / 2;
+ sph = (screenRect.height() - height) / 2;
+ if (spw < 0) {
+ spw = 0;
+ }
+ if (sph < 0) {
+ sph = 0;
+ }
+ spritePointer.x = screenRect.left + xAlign + spw;
+ spritePointer.y = screenRect.top + yAlign + sph;
+ drawClip(ds, clip, spritePointer, width, height, spriteBuffer);
+
+ return SUCCESS;
+}
+
bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
const byte *spriteBuffer;
int i, j;
diff --git a/saga/sprite.h b/saga/sprite.h
index 69f93331fd..80254c6807 100644
--- a/saga/sprite.h
+++ b/saga/sprite.h
@@ -71,6 +71,7 @@ public:
~Sprite(void);
int loadList(int resourceId, SpriteList &spriteList); // load or append spriteList
int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale);
+ int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale);
int drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
void getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer);