mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 01:46:42 +00:00
SHERLOCK: Beginnings of inventory display
This commit is contained in:
parent
c28416f38e
commit
7fec58a57d
@ -31,6 +31,7 @@ Inventory::Inventory(SherlockEngine *vm) : Common::Array<InventoryItem>(), _vm(v
|
||||
_invIndex = 0;
|
||||
_holdings = 0;
|
||||
_oldFlag = 0;
|
||||
_invFlag = 0;
|
||||
}
|
||||
|
||||
Inventory::~Inventory() {
|
||||
@ -129,8 +130,11 @@ void Inventory::putInv(int slamit) {
|
||||
* 3 = give inventory mode
|
||||
* 128 = Draw window in the back buffer, but don't display it
|
||||
*/
|
||||
void Inventory::invent(int flag) {
|
||||
void Inventory::drawInventory(int flag) {
|
||||
Screen &screen = *_vm->_screen;
|
||||
UserInterface &ui = *_vm->_ui;
|
||||
int tempFlag = flag;
|
||||
|
||||
_oldFlag = 7;
|
||||
loadInv();
|
||||
|
||||
@ -138,7 +142,64 @@ void Inventory::invent(int flag) {
|
||||
screen._backBuffer = &screen._backBuffer2;
|
||||
}
|
||||
|
||||
|
||||
// Draw the window background
|
||||
Surface &bb = *screen._backBuffer;
|
||||
bb.fillRect(Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, CONTROLS_Y1 + 10), BORDER_COLOR);
|
||||
bb.fillRect(Common::Rect(0, CONTROLS_Y1 + 10, 2, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR);
|
||||
bb.fillRect(Common::Rect(SHERLOCK_SCREEN_WIDTH - 2, CONTROLS_Y1 + 10,
|
||||
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR);
|
||||
bb.fillRect(Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - 2, SHERLOCK_SCREEN_WIDTH,
|
||||
SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR);
|
||||
bb.fillRect(Common::Rect(2, CONTROLS_Y1 + 10, SHERLOCK_SCREEN_WIDTH - 2, SHERLOCK_SCREEN_HEIGHT - 2),
|
||||
INV_BACKGROUND);
|
||||
|
||||
// Draw the buttons
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[0][0], CONTROLS_Y1, INVENTORY_POINTS[0][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[0][2] - screen.stringWidth("Exit") / 2, "Exit");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[1][0], CONTROLS_Y1, INVENTORY_POINTS[1][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[1][2] - screen.stringWidth("Look") / 2, "Look");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[2][0], CONTROLS_Y1, INVENTORY_POINTS[2][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[2][2] - screen.stringWidth("Use") / 2, "Use");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[3][0], CONTROLS_Y1, INVENTORY_POINTS[3][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[3][2] - screen.stringWidth("Give") / 2, "Give");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[4][0], CONTROLS_Y1, INVENTORY_POINTS[4][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[4][2], "^^");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[5][0], CONTROLS_Y1, INVENTORY_POINTS[5][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[5][2], "^");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[6][0], CONTROLS_Y1, INVENTORY_POINTS[6][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[6][2], "_");
|
||||
screen.makeButton(Common::Rect(INVENTORY_POINTS[7][0], CONTROLS_Y1, INVENTORY_POINTS[7][1],
|
||||
CONTROLS_Y1 + 9), INVENTORY_POINTS[7][2], "__");
|
||||
|
||||
if (tempFlag == 128)
|
||||
flag = 1;
|
||||
ui._invMode = flag;
|
||||
|
||||
if (flag) {
|
||||
ui._oldKey = INVENTORY_COMMANDS[flag];
|
||||
_oldFlag = flag;
|
||||
} else {
|
||||
ui._oldKey = -1;
|
||||
_invFlag = 6;
|
||||
}
|
||||
|
||||
invCommands(0);
|
||||
putInv(0);
|
||||
|
||||
if (tempFlag != 128) {
|
||||
if (!ui._windowStyle) {
|
||||
screen.slamRect(Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
} else {
|
||||
ui.summonWindow(false, CONTROLS_Y1);
|
||||
}
|
||||
|
||||
ui._windowOpen = true;
|
||||
} else {
|
||||
// Reset the screen back buffer to the first buffer now that drawing is done
|
||||
screen._backBuffer = &screen._backBuffer1;
|
||||
}
|
||||
|
||||
ui._oldUse = -1;
|
||||
}
|
||||
|
||||
void Inventory::invCommands(bool slamIt) {
|
||||
|
@ -51,6 +51,7 @@ public:
|
||||
int _holdings;
|
||||
void freeGraphics();
|
||||
int _oldFlag;
|
||||
int _invFlag;
|
||||
public:
|
||||
Inventory(SherlockEngine *vm);
|
||||
~Inventory();
|
||||
@ -65,7 +66,7 @@ public:
|
||||
|
||||
void putInv(int slamit);
|
||||
|
||||
void invent(int flag);
|
||||
void drawInventory(int flag);
|
||||
|
||||
void invCommands(bool slamIt);
|
||||
|
||||
|
@ -34,8 +34,6 @@ namespace Sherlock {
|
||||
#define SCENES_COUNT 63
|
||||
#define MAX_ZONES 40
|
||||
#define INFO_LINE 140
|
||||
#define CONTROLS_Y 138
|
||||
#define CONTROLS_Y1 151
|
||||
|
||||
enum InvMode {
|
||||
INVMODE_0 = 0,
|
||||
|
@ -409,4 +409,22 @@ void Screen::vgaBar(const Common::Rect &r, int color) {
|
||||
slamRect(r);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a button for use in the inventory, talk, and examine dialogs.
|
||||
*/
|
||||
void Screen::makeButton(const Common::Rect &bounds, int textX,
|
||||
const Common::String &str) {
|
||||
|
||||
Surface &bb = *_backBuffer;
|
||||
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.right, bounds.top + 1), BUTTON_TOP);
|
||||
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.left + 1, bounds.bottom), BUTTON_TOP);
|
||||
bb.fillRect(Common::Rect(bounds.right - 1, bounds.top, bounds.right, bounds.bottom), BUTTON_BOTTOM);
|
||||
bb.fillRect(Common::Rect(bounds.left + 1, bounds.bottom - 1, bounds.right, bounds.bottom), BUTTON_BOTTOM);
|
||||
bb.fillRect(Common::Rect(bounds.left + 1, bounds.top + 1, bounds.right - 1, bounds.bottom - 1), BUTTON_MIDDLE);
|
||||
|
||||
gPrint(Common::Point(textX, bounds.top), COMMAND_HIGHLIGHTED, "%c", str[0]);
|
||||
gPrint(Common::Point(textX + charWidth(str[0]), bounds.top),
|
||||
COMMAND_FOREGROUND, "%s", str.c_str() + 1);
|
||||
}
|
||||
|
||||
} // End of namespace Sherlock
|
||||
|
@ -112,6 +112,8 @@ public:
|
||||
int charWidth(char c);
|
||||
|
||||
void vgaBar(const Common::Rect &r, int color);
|
||||
|
||||
void makeButton(const Common::Rect &bounds, int textX, const Common::String &str);
|
||||
};
|
||||
|
||||
} // End of namespace Sherlock
|
||||
|
@ -54,6 +54,7 @@ const int INVENTORY_POINTS[8][3] = {
|
||||
};
|
||||
|
||||
const char COMMANDS[13] = "LMTPOCIUGJFS";
|
||||
const char INVENTORY_COMMANDS[9] = { "ELUG-+,." };
|
||||
const char *const PRESS_KEY_FOR_MORE = "Press any Key for More.";
|
||||
const char *const PRESS_KEY_TO_CONTINUE = "Press any Key to Continue.";
|
||||
|
||||
@ -85,6 +86,7 @@ UserInterface::UserInterface(SherlockEngine *vm) : _vm(vm) {
|
||||
SHERLOCK_SCREEN_HEIGHT - 1);
|
||||
_windowStyle = 1; // Sliding windows
|
||||
_find = 0;
|
||||
_oldUse = 0;
|
||||
}
|
||||
|
||||
UserInterface::~UserInterface() {
|
||||
@ -686,7 +688,6 @@ void UserInterface::doInvControl() {
|
||||
Scene &scene = *_vm->_scene;
|
||||
Screen &screen = *_vm->_screen;
|
||||
Talk &talk = *_vm->_talk;
|
||||
const char INVENTORY_COMMANDS[9] = { "ELUG-+,." };
|
||||
int colors[8];
|
||||
Common::Point mousePos = events.mousePos();
|
||||
|
||||
@ -956,7 +957,7 @@ void UserInterface::doLookControl() {
|
||||
tempSurface.blitFrom(screen._backBuffer2, Common::Point(0, 0),
|
||||
Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
|
||||
inv.invent(128);
|
||||
inv.drawInventory(128);
|
||||
banishWindow(true);
|
||||
|
||||
// Restore the ui
|
||||
@ -1060,19 +1061,19 @@ void UserInterface::doMainControl() {
|
||||
pushButton(6);
|
||||
_selector = _oldSelector = -1;
|
||||
_menuMode = INV_MODE;
|
||||
inv.invent(1);
|
||||
inv.drawInventory(1);
|
||||
break;
|
||||
case 'U':
|
||||
pushButton(7);
|
||||
_selector = _oldSelector = -1;
|
||||
_menuMode = USE_MODE;
|
||||
inv.invent(2);
|
||||
inv.drawInventory(2);
|
||||
break;
|
||||
case 'G':
|
||||
pushButton(8);
|
||||
_selector = _oldSelector = -1;
|
||||
_menuMode = GIVE_MODE;
|
||||
inv.invent(3);
|
||||
inv.drawInventory(3);
|
||||
break;
|
||||
case 'J':
|
||||
pushButton(9);
|
||||
@ -1259,7 +1260,7 @@ void UserInterface::printObjectDesc(const Common::String &str, bool firstTime) {
|
||||
|
||||
// Handle display depending on whether all the message was shown
|
||||
if (!endOfStr) {
|
||||
makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10),
|
||||
screen.makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10),
|
||||
(SHERLOCK_SCREEN_WIDTH - screen.stringWidth(PRESS_KEY_FOR_MORE)) / 2,
|
||||
PRESS_KEY_FOR_MORE);
|
||||
screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH -
|
||||
@ -1267,7 +1268,7 @@ void UserInterface::printObjectDesc(const Common::String &str, bool firstTime) {
|
||||
COMMAND_FOREGROUND, "P");
|
||||
_descStr = msgP;
|
||||
} else {
|
||||
makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10),
|
||||
screen.makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10),
|
||||
(SHERLOCK_SCREEN_WIDTH - screen.stringWidth(PRESS_KEY_TO_CONTINUE)) / 2,
|
||||
PRESS_KEY_TO_CONTINUE);
|
||||
screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH -
|
||||
@ -1280,20 +1281,9 @@ void UserInterface::printObjectDesc(const Common::String &str, bool firstTime) {
|
||||
if (!_windowStyle) {
|
||||
screen.slamRect(Common::Rect(0, CONTROLS_Y,
|
||||
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
}
|
||||
else {
|
||||
// Extract the window that's been drawn on the back buffer
|
||||
Surface tempSurface(SHERLOCK_SCREEN_WIDTH,
|
||||
(SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y));
|
||||
Common::Rect r(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT);
|
||||
tempSurface.blitFrom(screen._backBuffer1, Common::Point(0, 0), r);
|
||||
|
||||
// Remove drawn window with original user interface
|
||||
screen._backBuffer1.blitFrom(screen._backBuffer2,
|
||||
Common::Point(0, CONTROLS_Y), r);
|
||||
|
||||
// Display the window gradually on-screen
|
||||
summonWindow(tempSurface);
|
||||
} else {
|
||||
// Display the window
|
||||
summonWindow();
|
||||
}
|
||||
|
||||
_selector = _oldSelector = -1;
|
||||
@ -1311,29 +1301,10 @@ void UserInterface::printObjectDesc() {
|
||||
printObjectDesc(_cAnimStr, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a button for use in the inventory, talk, and examine dialogs.
|
||||
*/
|
||||
void UserInterface::makeButton(const Common::Rect &bounds, int textX,
|
||||
const Common::String &str) {
|
||||
Screen &screen = *_vm->_screen;
|
||||
|
||||
Surface &bb = *screen._backBuffer;
|
||||
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.right, bounds.top + 1), BUTTON_TOP);
|
||||
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.left + 1, bounds.bottom), BUTTON_TOP);
|
||||
bb.fillRect(Common::Rect(bounds.right - 1, bounds.top, bounds.right, bounds.bottom), BUTTON_BOTTOM);
|
||||
bb.fillRect(Common::Rect(bounds.left + 1, bounds.bottom - 1, bounds.right, bounds.bottom), BUTTON_BOTTOM);
|
||||
bb.fillRect(Common::Rect(bounds.left + 1, bounds.top + 1, bounds.right - 1, bounds.bottom - 1), BUTTON_MIDDLE);
|
||||
|
||||
screen.gPrint(Common::Point(textX, bounds.top), COMMAND_HIGHLIGHTED, "%c", str[0]);
|
||||
screen.gPrint(Common::Point(textX + screen.charWidth(str[0]), bounds.top),
|
||||
COMMAND_FOREGROUND, "%s", str.c_str() + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a passed window by gradually scrolling it vertically on-screen
|
||||
*/
|
||||
void UserInterface::summonWindow(const Surface &bgSurface) {
|
||||
void UserInterface::summonWindow(const Surface &bgSurface, bool slideUp) {
|
||||
Events &events = *_vm->_events;
|
||||
Screen &screen = *_vm->_screen;
|
||||
|
||||
@ -1341,34 +1312,68 @@ void UserInterface::summonWindow(const Surface &bgSurface) {
|
||||
// A window is already open, so can't open another one
|
||||
return;
|
||||
|
||||
// Gradually slide up the display of the window
|
||||
for (int idx = 1; idx <= bgSurface.h; idx += 2) {
|
||||
screen._backBuffer->blitFrom(bgSurface, Common::Point(0, SHERLOCK_SCREEN_HEIGHT - idx),
|
||||
Common::Rect(0, 0, bgSurface.w, idx));
|
||||
screen.slamRect(Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - idx,
|
||||
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
if (slideUp) {
|
||||
// Gradually slide up the display of the window
|
||||
for (int idx = 1; idx <= bgSurface.h; idx += 2) {
|
||||
screen._backBuffer->blitFrom(bgSurface, Common::Point(0, SHERLOCK_SCREEN_HEIGHT - idx),
|
||||
Common::Rect(0, 0, bgSurface.w, idx));
|
||||
screen.slamRect(Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - idx,
|
||||
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
|
||||
events.delay(10);
|
||||
events.delay(10);
|
||||
}
|
||||
} else {
|
||||
// Gradually slide down the display of the window
|
||||
for (int idx = 1; idx <= bgSurface.h; idx += 2) {
|
||||
screen._backBuffer->blitFrom(bgSurface,
|
||||
Common::Point(0, SHERLOCK_SCREEN_HEIGHT - bgSurface.h),
|
||||
Common::Rect(0, bgSurface.h - idx, bgSurface.w, bgSurface.h));
|
||||
screen.slamRect(Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - bgSurface.h,
|
||||
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT - bgSurface.h + idx));
|
||||
|
||||
events.delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
// Final display of the entire window
|
||||
screen._backBuffer->blitFrom(bgSurface, Common::Point(0, CONTROLS_Y),
|
||||
screen._backBuffer->blitFrom(bgSurface, Common::Point(0,
|
||||
SHERLOCK_SCREEN_HEIGHT - bgSurface.h),
|
||||
Common::Rect(0, 0, bgSurface.w, bgSurface.h));
|
||||
screen.slamArea(0, CONTROLS_Y, bgSurface.w, bgSurface.h);
|
||||
screen.slamArea(0, SHERLOCK_SCREEN_HEIGHT - bgSurface.h, bgSurface.w, bgSurface.h);
|
||||
|
||||
_windowOpen = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Slide the window stored in the back buffer onto the screen
|
||||
*/
|
||||
void UserInterface::summonWindow(bool slideUp, int height) {
|
||||
Screen &screen = *_vm->_screen;
|
||||
|
||||
// Extract the window that's been drawn on the back buffer
|
||||
Surface tempSurface(SHERLOCK_SCREEN_WIDTH,
|
||||
(SHERLOCK_SCREEN_HEIGHT - height));
|
||||
Common::Rect r(0, height, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT);
|
||||
tempSurface.blitFrom(screen._backBuffer1, Common::Point(0, 0), r);
|
||||
|
||||
// Remove drawn window with original user interface
|
||||
screen._backBuffer1.blitFrom(screen._backBuffer2,
|
||||
Common::Point(0, height), r);
|
||||
|
||||
// Display the window gradually on-screen
|
||||
summonWindow(tempSurface, slideUp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a currently open window
|
||||
* @param flag 0 = slide old window down, 1 = slide prior UI back up
|
||||
*/
|
||||
void UserInterface::banishWindow(bool flag) {
|
||||
void UserInterface::banishWindow(bool slideUp) {
|
||||
Events &events = *_vm->_events;
|
||||
Screen &screen = *_vm->_screen;
|
||||
|
||||
if (_windowOpen) {
|
||||
if (flag || !_windowStyle) {
|
||||
if (slideUp || !_windowStyle) {
|
||||
// Slide window down
|
||||
// Only slide the window if the window style allows it
|
||||
if (_windowStyle) {
|
||||
|
@ -31,6 +31,9 @@
|
||||
|
||||
namespace Sherlock {
|
||||
|
||||
#define CONTROLS_Y 138
|
||||
#define CONTROLS_Y1 151
|
||||
|
||||
enum MenuMode {
|
||||
STD_MODE = 0,
|
||||
LOOK_MODE = 1,
|
||||
@ -47,9 +50,16 @@ enum MenuMode {
|
||||
SETUP_MODE = 12
|
||||
};
|
||||
|
||||
extern const int MENU_POINTS[12][4];
|
||||
|
||||
extern const int INVENTORY_POINTS[8][3];
|
||||
extern const char INVENTORY_COMMANDS[9];
|
||||
|
||||
class SherlockEngine;
|
||||
class Inventory;
|
||||
|
||||
class UserInterface {
|
||||
friend class Inventory;
|
||||
private:
|
||||
SherlockEngine *_vm;
|
||||
ImageFile *_controlPanel;
|
||||
@ -77,6 +87,7 @@ private:
|
||||
int _windowStyle;
|
||||
int _find;
|
||||
Common::String _muse;
|
||||
int _oldUse;
|
||||
private:
|
||||
void depressButton(int num);
|
||||
|
||||
@ -106,8 +117,6 @@ private:
|
||||
void environment();
|
||||
void doControls();
|
||||
|
||||
void makeButton(const Common::Rect &bounds, int textX, const Common::String &str);
|
||||
|
||||
void checkUseAction(UseType &use, const Common::String &invName, const Common::String &msg,
|
||||
int objNum, int giveMode);
|
||||
public:
|
||||
@ -132,8 +141,9 @@ public:
|
||||
void printObjectDesc(const Common::String &str, bool firstTime);
|
||||
void printObjectDesc();
|
||||
|
||||
void summonWindow(const Surface &bgSurface);
|
||||
void banishWindow(bool flag);
|
||||
void summonWindow(const Surface &bgSurface, bool slideUp = true);
|
||||
void summonWindow(bool slideUp = true, int height = CONTROLS_Y);
|
||||
void banishWindow(bool slideUp = true);
|
||||
};
|
||||
|
||||
} // End of namespace Sherlock
|
||||
|
Loading…
x
Reference in New Issue
Block a user