SHERLOCK: Implement settings window code
This commit is contained in:
parent
e8e095aa2a
commit
cf878316ea
5 changed files with 340 additions and 1 deletions
|
@ -53,6 +53,23 @@ const int INVENTORY_POINTS[8][3] = {
|
|||
{ 285, 315, 294 }
|
||||
};
|
||||
|
||||
const int SETUP_POINTS[12][4] = {
|
||||
{ 4, 154, 101, 53 }, // Exit
|
||||
{ 4, 165, 101, 53 }, // Music Toggle
|
||||
{ 219, 165, 316, 268 }, // Voice Toggle
|
||||
{ 103, 165, 217, 160 }, // Sound Effects Toggle
|
||||
{ 219, 154, 316, 268 }, // Help Button Left/Right
|
||||
{ 103, 154, 217, 160 }, // New Font Style
|
||||
{ 4, 187, 101, 53 }, // Joystick Toggle
|
||||
{ 103, 187, 217, 160 }, // Calibrate Joystick
|
||||
{ 219, 176, 316, 268 }, // Fade Style
|
||||
{ 103, 176, 217, 160 }, // Window Open Style
|
||||
{ 4, 176, 101, 53 }, // Portraits Toggle
|
||||
{ 219, 187, 316, 268 } // Key Pad Accel. Toggle
|
||||
};
|
||||
|
||||
|
||||
|
||||
const char COMMANDS[13] = "LMTPOCIUGJFS";
|
||||
const char INVENTORY_COMMANDS[9] = { "ELUG-+,." };
|
||||
const char *const PRESS_KEY_FOR_MORE = "Press any Key for More.";
|
||||
|
@ -77,6 +94,162 @@ const char *const MUSE[] = {
|
|||
"Doors don't smoke"
|
||||
};
|
||||
|
||||
const char *const SETUP_STRS0[2] = { "off", "on" };
|
||||
const char *const SETUP_STRS1[2] = { "Directly", "by Pixel" };
|
||||
const char *const SETUP_STRS2[2] = { "Left", "Right" };
|
||||
const char *const SETUP_STRS3[2] = { "Appear", "Slide" };
|
||||
const char *const SETUP_STRS4[2] = { "Slow", "Fast" };
|
||||
const char *const SETUP_STRS5[2] = { "Left", "Right" };
|
||||
const char *const SETUP_NAMES[12] = {
|
||||
"Exit", "M", "V", "S", "B", "New Font Style", "J", "Calibrate Joystick", "F", "W", "P", "K"
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Draws the interface for the settings window
|
||||
*/
|
||||
void Settings::drawInteface(bool flag) {
|
||||
People &people = *_vm->_people;
|
||||
Screen &screen = *_vm->_screen;
|
||||
Sound &sound = *_vm->_sound;
|
||||
UserInterface &ui = *_vm->_ui;
|
||||
Common::String tempStr;
|
||||
|
||||
if (!flag) {
|
||||
screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, CONTROLS_Y1 + 1), BORDER_COLOR);
|
||||
screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y1 + 1, 2, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR);
|
||||
screen._backBuffer1.fillRect(Common::Rect(SHERLOCK_SCREEN_WIDTH - 2, CONTROLS_Y1 + 1, SHERLOCK_SCREEN_WIDTH,
|
||||
SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR);
|
||||
screen._backBuffer1.hLine(0, SHERLOCK_SCREEN_HEIGHT - 1, SHERLOCK_SCREEN_WIDTH - 1, BORDER_COLOR);
|
||||
screen._backBuffer1.fillRect(Common::Rect(2, CONTROLS_Y1 + 1, SHERLOCK_SCREEN_WIDTH - 2,
|
||||
SHERLOCK_SCREEN_HEIGHT - 2), INV_BACKGROUND);
|
||||
}
|
||||
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[0][0], SETUP_POINTS[0][1], SETUP_POINTS[0][2], SETUP_POINTS[0][1] + 10),
|
||||
SETUP_POINTS[0][3] - screen.stringWidth("Exit") / 2, "Exit");
|
||||
|
||||
tempStr = Common::String::format("Music %s", SETUP_STRS0[sound._music]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[1][0], SETUP_POINTS[1][1], SETUP_POINTS[1][2], SETUP_POINTS[1][1] + 10),
|
||||
SETUP_POINTS[1][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
tempStr = Common::String::format("Voices %s", SETUP_STRS0[sound._voices]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[2][0], SETUP_POINTS[2][1], SETUP_POINTS[2][2], SETUP_POINTS[2][1] + 10),
|
||||
SETUP_POINTS[2][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
tempStr = Common::String::format("Sound Effects %s", SETUP_STRS0[sound._digitized]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[3][0], SETUP_POINTS[3][1], SETUP_POINTS[3][2], SETUP_POINTS[3][1] + 10),
|
||||
SETUP_POINTS[3][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
tempStr = Common::String::format("Auto Help %s", SETUP_STRS5[ui._helpStyle]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[4][0], SETUP_POINTS[4][1], SETUP_POINTS[4][2], SETUP_POINTS[4][1] + 10),
|
||||
SETUP_POINTS[4][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[5][0], SETUP_POINTS[5][1], SETUP_POINTS[5][2], SETUP_POINTS[5][1] + 10),
|
||||
SETUP_POINTS[5][3] - screen.stringWidth("New Font Style") / 2, "New Font Style");
|
||||
tempStr = Common::String::format("Joystick %s", SETUP_STRS0[_vm->_joystick ? 1 : 0]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[6][0], SETUP_POINTS[6][1], SETUP_POINTS[6][2], SETUP_POINTS[6][1] + 10),
|
||||
SETUP_POINTS[6][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[7][0], SETUP_POINTS[7][1], SETUP_POINTS[7][2], SETUP_POINTS[7][1] + 10),
|
||||
SETUP_POINTS[7][3] - screen.stringWidth("Calibrate Joystick") / 2, "Calibrate Joystick");
|
||||
|
||||
tempStr = Common::String::format("Fade %s", screen._fadeStyle ? "by Pixel" : "Directly");
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[8][0], SETUP_POINTS[8][1], SETUP_POINTS[8][2], SETUP_POINTS[8][1] + 10),
|
||||
SETUP_POINTS[8][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
tempStr = Common::String::format("Windows %s", ui._windowStyle ? "Slide" : "Appear");
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[9][0], SETUP_POINTS[9][1], SETUP_POINTS[9][2], SETUP_POINTS[9][1] + 10),
|
||||
SETUP_POINTS[9][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
tempStr = Common::String::format("Portraits %s", SETUP_STRS0[people._portraitsOn]);
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[10][0], SETUP_POINTS[10][1], SETUP_POINTS[10][2], SETUP_POINTS[10][1] + 10),
|
||||
SETUP_POINTS[10][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
tempStr = Common::String::format("Key Pad %s", _vm->_keyPadSpeed ? "Fast" : "Slow");
|
||||
|
||||
screen.makeButton(Common::Rect(SETUP_POINTS[11][0], SETUP_POINTS[11][1], SETUP_POINTS[11][2], SETUP_POINTS[11][1] + 10),
|
||||
SETUP_POINTS[11][3] - screen.stringWidth(tempStr) / 2, tempStr);
|
||||
|
||||
// Show the window immediately, or slide it on-screen
|
||||
if (!flag) {
|
||||
if (!ui._windowStyle) {
|
||||
screen.slamRect(Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
} else {
|
||||
ui.summonWindow(true, CONTROLS_Y1);
|
||||
}
|
||||
|
||||
ui._windowOpen = true;
|
||||
} else {
|
||||
screen.slamRect(Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
|
||||
}
|
||||
}
|
||||
|
||||
int Settings::drawButtons(const Common::Point &pt, int key) {
|
||||
Events &events = *_vm->_events;
|
||||
People &people = *_vm->_people;
|
||||
Screen &screen = *_vm->_screen;
|
||||
Sound &sound = *_vm->_sound;
|
||||
UserInterface &ui = *_vm->_ui;
|
||||
int found = -1;
|
||||
byte color;
|
||||
Common::String tempStr;
|
||||
|
||||
for (int idx = 0; idx < 12; ++idx) {
|
||||
if ((pt.x > SETUP_POINTS[idx][0] && pt.x < SETUP_POINTS[idx][2] && pt.y > SETUP_POINTS[idx][1]
|
||||
&& pt.y < (SETUP_POINTS[idx][1] + 10) && (events._released || events._released))
|
||||
|| (key == SETUP_NAMES[idx][0])) {
|
||||
found = idx;
|
||||
color = COMMAND_HIGHLIGHTED;
|
||||
} else {
|
||||
color = COMMAND_FOREGROUND;
|
||||
}
|
||||
|
||||
// Print the button text
|
||||
switch (idx) {
|
||||
case 1:
|
||||
tempStr = Common::String::format("Music %s", SETUP_STRS0[sound._music]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 2:
|
||||
tempStr = Common::String::format("Voices %s", SETUP_STRS0[sound._voices]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 3:
|
||||
tempStr = Common::String::format("Sound Effects %s", SETUP_STRS0[sound._digitized]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 4:
|
||||
tempStr = Common::String::format("Auto Help %s", SETUP_STRS2[ui._helpStyle]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 6:
|
||||
tempStr = Common::String::format("Joystick %s", SETUP_STRS0[_vm->_joystick]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 8:
|
||||
tempStr = Common::String::format("Fade %s", SETUP_STRS1[screen._fadeStyle]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 9:
|
||||
tempStr = Common::String::format("Windows %s", SETUP_STRS3[ui._windowStyle]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 10:
|
||||
tempStr = Common::String::format("Portraits %s", SETUP_STRS0[people._portraitsOn]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
case 11:
|
||||
tempStr = Common::String::format("Key Pad %s", SETUP_STRS4[_vm->_keyPadSpeed]);
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, tempStr);
|
||||
break;
|
||||
default:
|
||||
screen.buttonPrint(Common::Point(SETUP_POINTS[idx][3], SETUP_POINTS[idx][1]), color, true, SETUP_NAMES[idx]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
UserInterface::UserInterface(SherlockEngine *vm) : _vm(vm) {
|
||||
|
@ -1531,8 +1704,150 @@ void UserInterface::environment() {
|
|||
// TODO
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles input when the settings window is being shown
|
||||
*/
|
||||
void UserInterface::doControls() {
|
||||
// TODO
|
||||
Events &events = *_vm->_events;
|
||||
People &people = *_vm->_people;
|
||||
Scene &scene = *_vm->_scene;
|
||||
Screen &screen = *_vm->_screen;
|
||||
Sound &sound = *_vm->_sound;
|
||||
Talk &talk = *_vm->_talk;
|
||||
UserInterface &ui = *_vm->_ui;
|
||||
int found;
|
||||
byte color;
|
||||
bool updateConfig = false;
|
||||
|
||||
Settings settings(_vm);
|
||||
settings.drawInteface(false);
|
||||
|
||||
do {
|
||||
if (_menuCounter)
|
||||
whileMenuCounter();
|
||||
|
||||
found = -1;
|
||||
_key = -1;
|
||||
|
||||
scene.doBgAnim();
|
||||
if (talk._talkToAbort)
|
||||
return;
|
||||
|
||||
events.setButtonState();
|
||||
Common::Point pt = events.mousePos();
|
||||
|
||||
if (events._pressed || events._released || events.kbHit()) {
|
||||
clearInfo();
|
||||
_key = -1;
|
||||
|
||||
if (events.kbHit()) {
|
||||
Common::KeyState keyState = events.getKey();
|
||||
_key = toupper(keyState.keycode);
|
||||
|
||||
if (_key == Common::KEYCODE_RETURN || _key == Common::KEYCODE_SPACE) {
|
||||
events._pressed = false;
|
||||
events._oldButtons = 0;
|
||||
_keycode = Common::KEYCODE_INVALID;
|
||||
events._released = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle highlighting button under mouse
|
||||
found = settings.drawButtons(pt, _key);
|
||||
}
|
||||
|
||||
if ((found == 0 && events._released) || (_key == 'E' || _key == Common::KEYCODE_ESCAPE))
|
||||
// Exit
|
||||
break;
|
||||
|
||||
if ((found == 1 && events._released) || _key == 'M') {
|
||||
// Toggle music
|
||||
if (sound._music) {
|
||||
sound.stopSound();
|
||||
sound._music = false;
|
||||
} else {
|
||||
sound._music = true;
|
||||
sound.startSong();
|
||||
}
|
||||
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 2 && events._released) || _key == 'V') {
|
||||
sound._voices = !sound._voices;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 3 && events._released) || _key == 'S') {
|
||||
// Toggle sound effects
|
||||
sound._digitized = !sound._digitized;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 4 && events._released) || _key == 'A') {
|
||||
// Help button style
|
||||
ui._helpStyle ^= 1;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 5 && events._released) || _key == 'N') {
|
||||
// New font style
|
||||
screen.setFont((screen.fontNumber() + 1) & 3);
|
||||
}
|
||||
|
||||
if ((found == 6 && events._released) || _key == 'J') {
|
||||
// Toggle joystick
|
||||
_vm->_joystick = !_vm->_joystick;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 7 && events._released) || _key == 'C') {
|
||||
// Calibrate joystick - No implementation in ScummVM
|
||||
}
|
||||
|
||||
if ((found == 8 && events._released) || _key == 'F') {
|
||||
// Toggle fade style
|
||||
screen._fadeStyle = !screen._fadeStyle;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 9 && events._released) || _key == 'W') {
|
||||
// Window style
|
||||
ui._windowStyle ^= 1;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 10 && events._released) || _key == 'P') {
|
||||
// Toggle portraits being shown
|
||||
people._portraitsOn = !people._portraitsOn;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
|
||||
if ((found == 11 && events._released) || _key == 'K') {
|
||||
// Toggle keypad acceleration speed
|
||||
_vm->_keyPadSpeed ^= 1;
|
||||
updateConfig = true;
|
||||
settings.drawInteface(true);
|
||||
}
|
||||
} while (!_vm->shouldQuit());
|
||||
|
||||
banishWindow();
|
||||
|
||||
if (updateConfig)
|
||||
_vm->saveConfig();
|
||||
|
||||
_keycode = Common::KEYCODE_INVALID;
|
||||
_keyboardInput = false;
|
||||
_windowBounds.top = CONTROLS_Y1;
|
||||
_key = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue