aboutsummaryrefslogtreecommitdiff
path: root/saga
diff options
context:
space:
mode:
authorAndrew Kurushin2005-05-22 11:59:22 +0000
committerAndrew Kurushin2005-05-22 11:59:22 +0000
commit3b01bef51bdd1b763b67e3b2620726c6855a34a3 (patch)
treed8e89b6cc0904ebc7114471692d96f6b97b97444 /saga
parent7dc115be6f9182c7f82396cab576647bf9d63f5c (diff)
downloadscummvm-rg350-3b01bef51bdd1b763b67e3b2620726c6855a34a3.tar.gz
scummvm-rg350-3b01bef51bdd1b763b67e3b2620726c6855a34a3.tar.bz2
scummvm-rg350-3b01bef51bdd1b763b67e3b2620726c6855a34a3.zip
fixes some todo (hardcoded resource ids -> customized per game)
preparation for option dialog (wip) svn-id: r18217
Diffstat (limited to 'saga')
-rw-r--r--saga/actor.cpp2
-rw-r--r--saga/game.cpp48
-rw-r--r--saga/interface.cpp233
-rw-r--r--saga/interface.h50
-rw-r--r--saga/render.cpp14
-rw-r--r--saga/resnames.h16
-rw-r--r--saga/saga.h24
-rw-r--r--saga/scene.cpp17
-rw-r--r--saga/scene.h2
-rw-r--r--saga/script.cpp2
-rw-r--r--saga/sfuncs.cpp2
-rw-r--r--saga/sprite.cpp2
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;
}