diff options
-rw-r--r-- | saga/actor.cpp | 2 | ||||
-rw-r--r-- | saga/game.cpp | 48 | ||||
-rw-r--r-- | saga/interface.cpp | 233 | ||||
-rw-r--r-- | saga/interface.h | 50 | ||||
-rw-r--r-- | saga/render.cpp | 14 | ||||
-rw-r--r-- | saga/resnames.h | 16 | ||||
-rw-r--r-- | saga/saga.h | 24 | ||||
-rw-r--r-- | saga/scene.cpp | 17 | ||||
-rw-r--r-- | saga/scene.h | 2 | ||||
-rw-r--r-- | saga/script.cpp | 2 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 2 | ||||
-rw-r--r-- | saga/sprite.cpp | 2 |
12 files changed, 294 insertions, 118 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index fc89d06934..25d4156aa3 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -201,7 +201,7 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) { error("Actor::Actor(): Couldn't load actor module resource context."); } - result = RSC_LoadResource(_actorContext, RID_ITE_ACTOR_NAMES, &stringsPointer, &stringsLength); // fixme: IHNM + result = RSC_LoadResource(_actorContext, _vm->getResourceDescription()->actorsStringsResourceId, &stringsPointer, &stringsLength); if ((result != SUCCESS) || (stringsLength == 0)) { error("Error loading strings list resource"); } diff --git a/saga/game.cpp b/saga/game.cpp index d53e9bb863..af0560f60a 100644 --- a/saga/game.cpp +++ b/saga/game.cpp @@ -73,6 +73,12 @@ static PanelButton ITE_ConversePanelButtons[] = { {kPanelButtonArrow, 257,41, 9,6, 1,'d',0, 1,5,3}, }; +static PanelButton ITE_OptionPanelButtons[] = { + {kPanelButtonOption, 113,18, 45,17, 13,'r',0, 0,0,0}, //read speed + + {kPanelButtonOption, 13,98, 135,17, 17,'c',0, 0,0,0}, //continue +}; + static GameDisplayInfo ITE_DisplayInfo = { 320, 200, // logical width&height @@ -86,6 +92,9 @@ static GameDisplayInfo ITE_DisplayInfo = { 2, // status text y offset 186, // status text color 15, // status BG color + 308,138, // save reminder pos + 12,12, // save reminder w & h + 6,7, // save reminder sprite numbers 147, // verb text color 15, // verb text shadow color @@ -105,14 +114,24 @@ static GameDisplayInfo ITE_DisplayInfo = { 0, 149, // converse panel offsets ARRAYSIZE(ITE_ConversePanelButtons), - ITE_ConversePanelButtons + ITE_ConversePanelButtons, + + 8, 8, // option panel offsets + ARRAYSIZE(ITE_OptionPanelButtons), + ITE_OptionPanelButtons }; static GameResourceDescription ITE_Resources = { RID_ITE_SCENE_LUT, // Scene lookup table RN RID_ITE_SCRIPT_LUT, // Script lookup table RN - RID_ITE_COMMAND_PANEL, - RID_ITE_DIALOGUE_PANEL + RID_ITE_MAIN_PANEL, + RID_ITE_CONVERSE_PANEL, + RID_ITE_OPTION_PANEL, + RID_ITE_MAIN_SPRITES, + RID_ITE_MAIN_PANEL_SPRITES, + RID_ITE_DEFAULT_PORTRAITS, + RID_ITE_MAIN_STRINGS, + RID_ITE_ACTOR_NAMES }; // Inherit the Earth - DOS Demo version @@ -225,6 +244,10 @@ static PanelButton IHNM_ConversePanelButtons[] = { {kPanelButtonConverseText, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO }; +static PanelButton IHNM_OptionPanelButtons[] = { + {kPanelButtonArrow, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO +}; + static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all 640, 480, // logical width&height @@ -238,6 +261,9 @@ static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all 8, // status text y offset 186, // status text color 11, // status BG color + 0,0, // save reminder pos + 0,0, // save reminder w&h + 0,0, // save reminder sprite numbers 147, // verb text color 15, // verb text shadow color @@ -257,14 +283,24 @@ static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all 0, 0, // converse panel offsets ARRAYSIZE(IHNM_ConversePanelButtons), - IHNM_ConversePanelButtons + IHNM_ConversePanelButtons, + + 0, 0, // option panel offsets + ARRAYSIZE(IHNM_OptionPanelButtons), + IHNM_OptionPanelButtons }; static GameResourceDescription IHNM_Resources = { RID_IHNM_SCENE_LUT, // Scene lookup table RN RID_IHNM_SCRIPT_LUT, // Script lookup table RN - RID_IHNM_COMMAND_PANEL, - RID_IHNM_DIALOGUE_PANEL + RID_IHNM_MAIN_PANEL, + RID_IHNM_CONVERSE_PANEL, + 0, + 0, + 0, + 0, + 0, + 0 }; // I Have No Mouth and I Must Scream - Demo version diff --git a/saga/interface.cpp b/saga/interface.cpp index 4a6b786382..00437e782c 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -107,11 +107,23 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { &_conversePanel.imageLength, &_conversePanel.imageWidth, &_conversePanel.imageHeight); RSC_FreeResource(resource); - if (_vm->_sprite->loadList(RID_ITE_COMMAND_BUTTONSPRITES, _mainPanel.sprites) != SUCCESS) { //TODO: move constant to ResourceDescription + _optionPanel.buttons = _vm->getDisplayInfo().optionPanelButtons; + _optionPanel.buttonsCount = _vm->getDisplayInfo().optionPanelButtonsCount; + + result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->optionPanelResourceId, &resource, &resourceLength); + if ((result != SUCCESS) || (resourceLength == 0)) { + error("Interface::Interface unable to load optionPanel resource"); + } + _vm->decodeBGImage(resource, resourceLength, &_optionPanel.image, + &_optionPanel.imageLength, &_optionPanel.imageWidth, &_optionPanel.imageHeight); + RSC_FreeResource(resource); + + + if (_vm->_sprite->loadList(_vm->getResourceDescription()->mainPanelSpritesResourceId, _mainPanel.sprites) != SUCCESS) { error("Interface::Interface(): Unable to load sprite list"); } - if (_vm->_sprite->loadList(RID_ITE_DEFAULT_PORTRAITS, _defPortraits) != SUCCESS) { //TODO: move constant to ResourceDescription + if (_vm->_sprite->loadList(_vm->getResourceDescription()->defaultPortraitsResourceId, _defPortraits) != SUCCESS) { error("Interface::Interface(): Unable to load sprite list"); } @@ -132,6 +144,10 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { _leftPortrait = 0; _rightPortrait = 0; + _optionPanel.x = _vm->getDisplayInfo().optionPanelXOffset; + _optionPanel.y = _vm->getDisplayInfo().optionPanelYOffset; + _optionPanel.currentButton = NULL; + _active = false; _panelMode = _lockedMode = kPanelNull; _savedMode = -1; @@ -145,6 +161,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { _inventoryEnd = 0; _inventoryBox = 0; _inventorySize = ITE_INVENTORY_SIZE; + _saveReminderState = 0; _inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16)); if (_inventory == NULL) { @@ -170,8 +187,9 @@ int Interface::activate() { _vm->_actor->_protagonist->targetObject = ID_NOTHING; _vm->_gfx->showCursor(true); unlockMode(); - if (_panelMode == kPanelMain) - ;// show save reminder + if (_panelMode == kPanelMain){ + _saveReminderState = 1; + } draw(); } @@ -204,27 +222,27 @@ void Interface::restoreMode() { draw(); } -int Interface::setMode(int mode, bool force) { +void Interface::setMode(int mode, bool force) { // TODO: Is this where we should hide/show the mouse cursor? - int newMode = mode; - if (mode == kPanelConverse) { - _inMainMode = false; + if (mode == kPanelMain) { + _inMainMode = true; + _saveReminderState = 1; //TODO: blinking timeout } else { - if (mode == kPanelInventory) { - _inMainMode = true; - newMode = kPanelMain; - } + if (mode == kPanelConverse) { + _inMainMode = false; + } + _saveReminderState = 0; } // This lets us to prevents actors to pop up during initial // scene fade in. if (_savedMode != -1 && !force) { - _savedMode = newMode; - debug(0, "Saved mode: %d. my mode is %d", newMode, _panelMode); + _savedMode = mode; + debug(0, "Saved mode: %d. my mode is %d", mode, _panelMode); } else - _panelMode = newMode; + _panelMode = mode; if (_panelMode == kPanelMain) { _mainPanel.currentButton = NULL; @@ -232,12 +250,14 @@ int Interface::setMode(int mode, bool force) { if (_panelMode == kPanelConverse) { _conversePanel.currentButton = NULL; converseDisplayText(); - } + } else { + if (_panelMode == kPanelOption) { + _optionPanel.currentButton = NULL; + } + } } draw(); - - return SUCCESS; } bool Interface::processKeyCode(int keyCode) { @@ -254,6 +274,16 @@ bool Interface::processKeyCode(int keyCode) { return true; } break; + case kPanelOption: + //TODO: check input dialog keys + for (i = 0; i < _optionPanel.buttonsCount; i++) { + panelButton = &_optionPanel.buttons[i]; + if (panelButton->keyChar == keyCode) { + setOption(panelButton); + return true; + } + } + break; case kPanelMain: for (i = 0; i < _mainPanel.buttonsCount; i++) { panelButton = &_mainPanel.buttons[i]; @@ -271,7 +301,7 @@ bool Interface::processKeyCode(int keyCode) { case kPanelConverse: switch (keyCode) { case 'x': - setMode(kPanelInventory); + setMode(kPanelMain); // FIXME: puzzle break; @@ -310,20 +340,6 @@ int Interface::loadScenePortraits(int resourceId) { return _vm->_sprite->loadList(resourceId, _scenePortraits); } -int Interface::setLeftPortrait(int portrait) { - _leftPortrait = portrait; - draw(); - - return SUCCESS; -} - -int Interface::setRightPortrait(int portrait) { - _rightPortrait = portrait; - draw(); - - return SUCCESS; -} - void Interface::drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton) { PanelButton * rightButtonVerbPanelButton; PanelButton * currentVerbPanelButton; @@ -354,10 +370,10 @@ void Interface::drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton) { _vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256); - drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor); + drawVerbPanelText(backBuffer, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor); } -int Interface::draw() { +void Interface::draw() { SURFACE *backBuffer; int i; @@ -368,7 +384,7 @@ int Interface::draw() { backBuffer = _vm->_gfx->getBackBuffer(); if (_vm->_scene->isInDemo() || _panelMode == kPanelFade) - return SUCCESS; + return; drawStatusBar(); @@ -405,7 +421,7 @@ int Interface::draw() { } - if (!_inMainMode && _vm->getDisplayInfo().rightPortraitXOffset >= 0) { + if (!_inMainMode && _vm->getDisplayInfo().rightPortraitXOffset >= 0) { //FIXME: should we change !_inMainMode to _panelMode == kPanelConverse ? rightPortraitPoint.x = _mainPanel.x + _vm->getDisplayInfo().rightPortraitXOffset; rightPortraitPoint.y = _mainPanel.y + _vm->getDisplayInfo().rightPortraitYOffset; @@ -421,27 +437,67 @@ int Interface::draw() { } drawInventory(backBuffer); - return SUCCESS; } -int Interface::update(const Point& mousePoint, int updateFlag) { +void Interface::drawOption() { + SURFACE *backBuffer; + int i; + Point origin; + + backBuffer = _vm->_gfx->getBackBuffer(); + origin.x = _vm->getDisplayInfo().optionPanelXOffset; + origin.y = _vm->getDisplayInfo().optionPanelYOffset; + + bufToSurface(backBuffer, _optionPanel.image, _optionPanel.imageWidth, _optionPanel.imageHeight, NULL, &origin); + + for (i = 0; i < _optionPanel.buttonsCount; i++) { + drawOptionPanelButtonText(backBuffer, &_optionPanel.buttons[i]); + } +} + +void Interface::handleOptionUpdate(const Point& mousePoint) { + _optionPanel.currentButton = optionHitTest(mousePoint); +} + + +void Interface::handleOptionClick(const Point& mousePoint) { + _optionPanel.currentButton = optionHitTest(mousePoint); + + if (_optionPanel.currentButton == NULL) { + return; + } + + setOption(_optionPanel.currentButton); //TODO: do it on mouse up +} + + +void Interface::setOption(PanelButton *panelButton) { + switch (panelButton->keyChar) { + case 'c': + setMode(kPanelMain); + break; + } +} + +void Interface::update(const Point& mousePoint, int updateFlag) { - if (_vm->_scene->isInDemo() || _panelMode == kPanelFade) - return SUCCESS; + if (_vm->_scene->isInDemo() || _panelMode == kPanelFade) { + return; + } if (_panelMode == kPanelMain) { if (updateFlag & UPDATE_MOUSEMOVE) { bool lastWasPlayfield = _lastMousePoint.y < _vm->getSceneHeight(); if (mousePoint.y < _vm->getSceneHeight()) { if (!lastWasPlayfield) { - handleCommandUpdate(mousePoint); + handleMainUpdate(mousePoint); } _vm->_script->whichObject(mousePoint); } else { if (lastWasPlayfield) { _vm->_script->setNonPlayfieldVerb(); } - handleCommandUpdate(mousePoint); + handleMainUpdate(mousePoint); } } else { @@ -450,7 +506,7 @@ int Interface::update(const Point& mousePoint, int updateFlag) { if (mousePoint.y < _vm->getSceneHeight()) { _vm->_script->playfieldClick(mousePoint, (updateFlag & UPDATE_LEFTBUTTONCLICK) != 0); } else { - handleCommandClick(mousePoint); + handleMainClick(mousePoint); } } } @@ -468,8 +524,20 @@ int Interface::update(const Point& mousePoint, int updateFlag) { } } + if (_panelMode == kPanelOption) { + if (updateFlag & UPDATE_MOUSEMOVE) { + + handleOptionUpdate(mousePoint); + + } else { + if (updateFlag & UPDATE_MOUSECLICK) { + handleOptionClick(mousePoint); + } + } + } + + _lastMousePoint = mousePoint; - return SUCCESS; } void Interface::drawStatusBar() { @@ -507,9 +575,20 @@ void Interface::drawStatusBar() { _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); + if (_saveReminderState > 0) { + rect.left = _vm->getDisplayInfo().saveReminderXOffset; + rect.top = _vm->getDisplayInfo().saveReminderYOffset; + + rect.right = rect.left + _vm->getDisplayInfo().saveReminderWidth; + rect.bottom = rect.top + _vm->getDisplayInfo().saveReminderHeight; + _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites, + _saveReminderState == 1 ? _vm->getDisplayInfo().saveReminderFirstSpriteNumber : _vm->getDisplayInfo().saveReminderSecondSpriteNumber, + rect, 256); + + } } -void Interface::handleCommandClick(const Point& mousePoint) { +void Interface::handleMainClick(const Point& mousePoint) { PanelButton *panelButton; @@ -536,10 +615,22 @@ void Interface::handleCommandClick(const Point& mousePoint) { _vm->_script->doVerb(); } } + } else { + if (_saveReminderState > 0) { + Rect rect; + rect.left = _vm->getDisplayInfo().saveReminderXOffset; + rect.top = _vm->getDisplayInfo().saveReminderYOffset; + + rect.right = rect.left + _vm->getDisplayInfo().saveReminderWidth; + rect.bottom = rect.top + _vm->getDisplayInfo().saveReminderHeight; + if (rect.contains(mousePoint)) { + setMode(kPanelOption); + } + } } } -void Interface::handleCommandUpdate(const Point& mousePoint) { +void Interface::handleMainUpdate(const Point& mousePoint) { PanelButton *panelButton; panelButton = verbHitTest(mousePoint); @@ -589,22 +680,6 @@ void Interface::handleCommandUpdate(const Point& mousePoint) { } -PanelButton *Interface::verbHitTest(const Point& mousePoint) { - PanelButton *panelButton; - Rect rect; - int i; - for (i = 0; i < kVerbTypesMax; i++) { - panelButton = _verbTypeToPanelButton[i]; - if (panelButton != NULL) { - _mainPanel.calcPanelButtonRect(panelButton, rect); - if (rect.contains(mousePoint)) - return panelButton; - } - } - - return NULL; -} - //inventory stuff void Interface::inventoryChangePos(int chg) { if ((chg < 0 && _inventoryStart + chg >= 0) || @@ -737,6 +812,31 @@ void Interface::setVerbState(int verb, int state) { draw(); } +void Interface::drawOptionPanelButtonText(SURFACE *ds, PanelButton *panelButton) { + const char *text; + int textWidth; + int textHeight; + Point point; + int textColor; +//TODO: draw box! + + text = _vm->getTextString(panelButton->id); + + textWidth = _vm->_font->getStringWidth(MEDIUM_FONT_ID, text, 0, 0); + textHeight = _vm->_font->getHeight(MEDIUM_FONT_ID); + + point.x = _optionPanel.x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); + point.y = _optionPanel.y + panelButton->yOffset + (panelButton->height / 2) - (textHeight / 2); + + if (panelButton == _optionPanel.currentButton) { + textColor = _vm->getDisplayInfo().verbTextActiveColor; //TODO: create Option button colors constant + } else { + textColor = _vm->getDisplayInfo().verbTextColor; //TODO: create Option button colors constant + } + + _vm->_font->draw(MEDIUM_FONT_ID, ds, text, 0, point.x , point.y, textColor, _vm->getDisplayInfo().verbTextShadowColor, FONT_SHADOW); //TODO: create Option button colors constant +} + void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) { Point point; int spriteNumber; @@ -757,7 +857,7 @@ void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelBu _vm->_sprite->draw(ds, _vm->_sprite->_mainSprites, spriteNumber, point, 256); } -void Interface::drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor) { +void Interface::drawVerbPanelText(SURFACE *ds, PanelButton *panelButton, int textColor, int textShadowColor) { const char *text; int textWidth; Point point; @@ -769,12 +869,11 @@ void Interface::drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelBut error("textId == -1"); text = _vm->getTextString(textId); - textWidth = _vm->_font->getStringWidth(SMALL_FONT_ID, text, 0, 0); - point.x = panel->x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); - point.y = panel->y + panelButton->yOffset + 1; + point.x = _mainPanel.x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); + point.y = _mainPanel.y + panelButton->yOffset + 1; _vm->_font->draw(SMALL_FONT_ID, ds, text, 0, point.x , point.y, textColor, textShadowColor, (textShadowColor != 0) ? FONT_SHADOW : 0); } diff --git a/saga/interface.h b/saga/interface.h index f66380d1f1..9183e9a690 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -65,7 +65,7 @@ enum PanelModes { kPanelProtect, kPanelPlacard, kPanelMap, - kPanelInventory, +// kPanelInventory, kPanelFade }; @@ -148,18 +148,29 @@ public: int activate(); int deactivate(); + void setSaveReminderState(int state) { + _saveReminderState = state; + draw(); + } bool isActive() { return _active; } - int setMode(int mode, bool force = false); + void setMode(int mode, bool force = false); int getMode(void) const { return _panelMode; } void rememberMode(); void restoreMode(); bool isInMainMode() { return _inMainMode; } void setStatusText(const char *text, int statusColor = -1); int loadScenePortraits(int resourceId); - int setLeftPortrait(int portrait); - int setRightPortrait(int portrait); - int draw(); - int update(const Point& mousePoint, int updateFlag); + void setLeftPortrait(int portrait) { + _leftPortrait = portrait; + draw(); + } + void setRightPortrait(int portrait) { + _rightPortrait = portrait; + draw(); + } + void draw(); + void drawOption(); + void update(const Point& mousePoint, int updateFlag); void drawStatusBar(); void setVerbState(int verb, int state); @@ -191,23 +202,34 @@ public: PanelButton *inventoryHitTest(const Point& mousePoint) { return _mainPanel.hitTest(mousePoint, kPanelButtonInventory); } + PanelButton *verbHitTest(const Point& mousePoint){ + return _mainPanel.hitTest(mousePoint, kPanelButtonVerb); + } void saveState(Common::File& out); void loadState(Common::File& in); private: - PanelButton *verbHitTest(const Point& mousePoint); - void handleCommandUpdate(const Point& mousePoint); - void handleCommandClick(const Point& mousePoint); + void handleMainUpdate(const Point& mousePoint); // main panel update + void handleMainClick(const Point& mousePoint); // main panel click + PanelButton *converseHitTest(const Point& mousePoint) { return _conversePanel.hitTest(mousePoint, kPanelAllButtons); } - void handleConverseUpdate(const Point& mousePoint); - void handleConverseClick(const Point& mousePoint); - + void handleConverseUpdate(const Point& mousePoint); // converse panel update + void handleConverseClick(const Point& mousePoint); // converse panel click + + PanelButton *optionHitTest(const Point& mousePoint) { + return _optionPanel.hitTest(mousePoint, kPanelAllButtons); + } + void handleOptionUpdate(const Point& mousePoint); // option panel update + void handleOptionClick(const Point& mousePoint); // option panel click + void lockMode() { _lockedMode = _panelMode; } void unlockMode() { _panelMode = _lockedMode; } - void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor); + void setOption(PanelButton *panelButton); + void drawOptionPanelButtonText(SURFACE *ds, PanelButton *panelButton); void drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton); + void drawVerbPanelText(SURFACE *ds, PanelButton *panelButton, int textColor, int textShadowColor); void drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton); public: @@ -241,7 +263,9 @@ private: SpriteList _defPortraits; SpriteList _scenePortraits; PanelButton *_verbTypeToPanelButton[kVerbTypesMax]; + InterfacePanel _optionPanel; + int _saveReminderState; bool _active; int _panelMode; int _savedMode; diff --git a/saga/render.cpp b/saga/render.cpp index ec4d4cd3f7..7410e7f3a4 100644 --- a/saga/render.cpp +++ b/saga/render.cpp @@ -97,8 +97,6 @@ bool Render::initialized() { int Render::drawScene() { SURFACE *backbuf_surface; - SCENE_BGINFO bg_info; - Point bg_pt; char txt_buf[20]; int fps_width; Point mouse_pt; @@ -114,17 +112,11 @@ int Render::drawScene() { // Get mouse coordinates mouse_pt = _vm->mousePos(); - _vm->_scene->getBGInfo(&bg_info); - bg_pt.x = 0; - bg_pt.y = 0; - if (!(_flags & RF_PLACARD)) { // Display scene background - _vm->_scene->draw(backbuf_surface); + _vm->_scene->draw(); if (_vm->_interface->getMode() != kPanelFade) { - // Display scene maps, if applicable - // Draw queued actors _vm->_actor->drawActors(); if (getFlags() & RF_OBJECTMAP_TEST) { @@ -139,6 +131,10 @@ int Render::drawScene() { } } + if (_vm->_interface->getMode() == kPanelOption) { + _vm->_interface->drawOption(); + } + // Draw queued text strings _vm->textDrawList(_vm->_scene->_textList, backbuf_surface); diff --git a/saga/resnames.h b/saga/resnames.h index 0ee6e4e852..10a236b8a8 100644 --- a/saga/resnames.h +++ b/saga/resnames.h @@ -55,19 +55,19 @@ namespace Saga { #define RID_SMALL_FONT 2 // INTERFACE IMAGES -#define RID_ITE_COMMAND_PANEL 3 -#define RID_ITE_DIALOGUE_PANEL 4 - -#define RID_IHNM_COMMAND_PANEL 9 -#define RID_IHNM_DIALOGUE_PANEL 10 - -#define RID_ITE_SETUP_PANEL 5 +#define RID_ITE_MAIN_PANEL 3 +#define RID_ITE_CONVERSE_PANEL 4 +#define RID_ITE_OPTION_PANEL 5 #define RID_ITE_MAIN_SPRITES 6 +#define RID_ITE_MAIN_PANEL_SPRITES 7 #define RID_ITE_MAIN_STRINGS 35 //main strings #define RID_ITE_ACTOR_NAMES 36 //actors names -#define RID_ITE_COMMAND_BUTTONSPRITES 7 #define RID_ITE_DEFAULT_PORTRAITS 125 +#define RID_IHNM_MAIN_PANEL 9 +#define RID_IHNM_CONVERSE_PANEL 10 + + // ITE Scene resource numbers #define RID_ITE_OVERMAP_SCENE 226 #define RID_ITE_INTRO_ANIM_SCENE 1538 diff --git a/saga/saga.h b/saga/saga.h index 0234d2ddc2..fa417eb404 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -144,7 +144,9 @@ enum PanelButtonType { kPanelButtonArrow = 2, kPanelButtonConverseText = 4, kPanelButtonInventory = 8, - kPanelAllButtons = 15 + kPanelButtonOption = 0x10, + kPanelButtonReserved2 = 0x20, + kPanelAllButtons = 0xFFFFF }; enum TextStringIds { @@ -295,10 +297,16 @@ struct GameFontDescription { }; struct GameResourceDescription { - uint32 scene_lut_rn; + uint32 sceneLUTResourceId; uint32 moduleLUTResourceId; uint32 mainPanelResourceId; uint32 conversePanelResourceId; + uint32 optionPanelResourceId; + uint32 mainSpritesResourceId; + uint32 mainPanelSpritesResourceId; + uint32 defaultPortraitsResourceId; + uint32 mainStringsResourceId; + uint32 actorsStringsResourceId; }; struct GameFileDescription { @@ -334,6 +342,13 @@ struct GameDisplayInfo { int statusTextY; int statusTextColor; int statusBGColor; + + int saveReminderXOffset; + int saveReminderYOffset; + int saveReminderWidth; + int saveReminderHeight; + int saveReminderFirstSpriteNumber; + int saveReminderSecondSpriteNumber; int verbTextColor; int verbTextShadowColor; @@ -361,6 +376,11 @@ struct GameDisplayInfo { int conversePanelYOffset; int conversePanelButtonsCount; PanelButton *conversePanelButtons; + + int optionPanelXOffset; + int optionPanelYOffset; + int optionPanelButtonsCount; + PanelButton *optionPanelButtons; }; diff --git a/saga/scene.cpp b/saga/scene.cpp index 8e94499184..33eec23349 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -65,8 +65,8 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { // Load scene lookup table - debug(0, "Loading scene LUT from resource %u.", RSC_ConvertID(_vm->getResourceDescription()->scene_lut_rn)); - result = RSC_LoadResource(_sceneContext, RSC_ConvertID(_vm->getResourceDescription()->scene_lut_rn), &scene_lut_p, &scene_lut_len); + debug(0, "Loading scene LUT from resource %u.", RSC_ConvertID(_vm->getResourceDescription()->sceneLUTResourceId)); + result = RSC_LoadResource(_sceneContext, RSC_ConvertID(_vm->getResourceDescription()->sceneLUTResourceId), &scene_lut_p, &scene_lut_len); if (result != SUCCESS) { warning("Scene::Scene(): Error: couldn't load scene LUT"); return; @@ -539,7 +539,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) { if (loadSceneParams->sceneProc == NULL) { if (!_inGame) { _inGame = true; - _vm->_interface->setMode(kPanelInventory); + _vm->_interface->setMode(kPanelMain); } _vm->_sound->stopVoice(); @@ -843,23 +843,24 @@ int Scene::processSceneResources() { return SUCCESS; } -int Scene::draw(SURFACE *dst_s) { +void Scene::draw() { + SURFACE *backBuffer; BUFFER_INFO buf_info; Point bgPoint(0, 0); assert(_initialized); + backBuffer = _vm->_gfx->getBackBuffer(); + _vm->_render->getBufferInfo(&buf_info); if (_sceneDescription.flags & kSceneFlagISO) { _vm->_isoMap->adjustScroll(false); - _vm->_isoMap->draw(dst_s); + _vm->_isoMap->draw(backBuffer); } else { - bufToSurface(dst_s, buf_info.bg_buf, _vm->getDisplayWidth(), + bufToSurface(backBuffer, buf_info.bg_buf, _vm->getDisplayWidth(), MAX(_vm->getSceneHeight(), _bg.h), NULL, &bgPoint); } - - return SUCCESS; } void Scene::endScene() { diff --git a/saga/scene.h b/saga/scene.h index a71aecbce8..d16fc4573b 100644 --- a/saga/scene.h +++ b/saga/scene.h @@ -232,7 +232,7 @@ class Scene { _sceneQueue.push_back(*sceneQueue); } - int draw(SURFACE *); + void draw(); int getFlags() const { return _sceneDescription.flags; } int getScriptModuleNumber() const { return _sceneDescription.scriptModuleNumber; } bool isInDemo() { return !_inGame; } diff --git a/saga/script.cpp b/saga/script.cpp index 77bac9b850..92216eb8ae 100644 --- a/saga/script.cpp +++ b/saga/script.cpp @@ -139,7 +139,7 @@ Script::Script(SagaEngine *vm) : _vm(vm){ RSC_FreeResource(resourcePointer); - result = RSC_LoadResource(resourceContext, RID_ITE_MAIN_STRINGS, &stringsPointer, &stringsLength); // fixme: IHNM + result = RSC_LoadResource(resourceContext, _vm->getResourceDescription()->mainStringsResourceId, &stringsPointer, &stringsLength); // fixme: IHNM if ((result != SUCCESS) || (stringsLength == 0)) { error("Error loading strings list resource"); } diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 9ef537e1c3..751861018d 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -220,7 +220,7 @@ void Script::sfMainMode(SCRIPTFUNC_PARAMS) { _vm->_actor->_centerActor = _vm->_actor->_protagonist; showVerb(); _vm->_interface->activate(); - _vm->_interface->setMode(kPanelInventory); + _vm->_interface->setMode(kPanelMain); setPointerVerb(); } diff --git a/saga/sprite.cpp b/saga/sprite.cpp index a7b0d09e90..96f0d1c455 100644 --- a/saga/sprite.cpp +++ b/saga/sprite.cpp @@ -52,7 +52,7 @@ Sprite::Sprite(SagaEngine *vm) : _vm(vm), _initialized(false) { return; } - loadList(RID_ITE_MAIN_SPRITES, _mainSprites); //fixme: IHNM may have no such list + loadList(_vm->getResourceDescription()->mainSpritesResourceId, _mainSprites); _initialized = true; } |