diff options
-rw-r--r-- | saga/actor.cpp | 4 | ||||
-rw-r--r-- | saga/actor.h | 4 | ||||
-rw-r--r-- | saga/game.cpp | 116 | ||||
-rw-r--r-- | saga/interface.cpp | 401 | ||||
-rw-r--r-- | saga/interface.h | 58 | ||||
-rw-r--r-- | saga/itedata.h | 2 | ||||
-rw-r--r-- | saga/saga.cpp | 4 | ||||
-rw-r--r-- | saga/saga.h | 32 | ||||
-rw-r--r-- | saga/script.cpp | 150 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 1 | ||||
-rw-r--r-- | saga/sprite.cpp | 27 | ||||
-rw-r--r-- | saga/sprite.h | 1 |
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); |