mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-18 15:48:48 +00:00
776 lines
28 KiB
C++
776 lines
28 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "hopkins/dialogs.h"
|
|
|
|
#include "hopkins/events.h"
|
|
#include "hopkins/files.h"
|
|
#include "hopkins/globals.h"
|
|
#include "hopkins/graphics.h"
|
|
#include "hopkins/hopkins.h"
|
|
#include "hopkins/sound.h"
|
|
|
|
#include "common/scummsys.h"
|
|
#include "common/config-manager.h"
|
|
#include "common/events.h"
|
|
#include "common/file.h"
|
|
#include "common/util.h"
|
|
|
|
namespace Hopkins {
|
|
|
|
DialogsManager::DialogsManager(HopkinsEngine *vm) {
|
|
_vm = vm;
|
|
_inventFl = false;
|
|
_inventDisplayedFl = false;
|
|
_removeInventFl = false;
|
|
_inventX = _inventY = 0;
|
|
_inventWidth = _inventHeight = 0;
|
|
_inventWin1 = g_PTRNUL;
|
|
_inventBuf2 = g_PTRNUL;
|
|
_inventoryIcons = g_PTRNUL;
|
|
}
|
|
|
|
DialogsManager::~DialogsManager() {
|
|
_vm->_globals->freeMemory(_inventWin1);
|
|
_vm->_globals->freeMemory(_inventBuf2);
|
|
_vm->_globals->freeMemory(_inventoryIcons);
|
|
}
|
|
|
|
void DialogsManager::clearAll() {
|
|
_inventWin1 = g_PTRNUL;
|
|
_inventBuf2 = g_PTRNUL;
|
|
}
|
|
|
|
void DialogsManager::loadIcons() {
|
|
_inventoryIcons = _vm->_fileManager->loadFile("ICONE.SPR");
|
|
}
|
|
|
|
void DialogsManager::drawInvent(Common::Point oldBorder, int oldBorderSpriteIndex, Common::Point newBorder, int newBorderSpriteIndex) {
|
|
if (!_vm->_dialogsManager->_inventDisplayedFl)
|
|
return;
|
|
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, _inventWin1, _inventX, _inventY, _inventWidth, _inventHeight);
|
|
if (oldBorder.x && oldBorder.y)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_dialogsManager->_inventBuf2, oldBorder.x + 300, oldBorder.y + 300, oldBorderSpriteIndex + 1);
|
|
if (newBorder.x && newBorder.y)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_dialogsManager->_inventBuf2, newBorder.x + 300, newBorder.y + 300, newBorderSpriteIndex);
|
|
_vm->_graphicsManager->addDirtyRect(_vm->_dialogsManager->_inventX, _vm->_dialogsManager->_inventY, _vm->_dialogsManager->_inventX + _vm->_dialogsManager->_inventWidth, _vm->_dialogsManager->_inventY + _vm->_dialogsManager->_inventHeight);
|
|
}
|
|
|
|
void DialogsManager::showOptionsDialog() {
|
|
_vm->_eventsManager->changeMouseCursor(0);
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
Common::String filename;
|
|
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
|
|
filename = "OPTION.SPR";
|
|
else {
|
|
if (_vm->_globals->_language == LANG_FR)
|
|
filename = "OPTIFR.SPR";
|
|
else if (_vm->_globals->_language == LANG_EN)
|
|
filename = "OPTIAN.SPR";
|
|
else if (_vm->_globals->_language == LANG_SP)
|
|
filename = "OPTIES.SPR";
|
|
}
|
|
|
|
_vm->_globals->_optionDialogSpr = _vm->_fileManager->loadFile(filename);
|
|
_vm->_globals->_optionDialogFl = true;
|
|
|
|
int scrollOffset = _vm->_graphicsManager->_scrollOffset;
|
|
bool doneFlag = false;
|
|
do {
|
|
if (_vm->_eventsManager->getMouseButton()) {
|
|
Common::Point mousePos(_vm->_eventsManager->getMouseX(), _vm->_eventsManager->getMouseY());
|
|
mousePos.x = _vm->_eventsManager->getMouseX();
|
|
mousePos.y = _vm->_eventsManager->getMouseY();
|
|
|
|
if (!_vm->_soundManager->_musicOffFl) {
|
|
if (mousePos.x >= scrollOffset + 300 && mousePos.y > 113 && mousePos.x <= scrollOffset + 327 && mousePos.y <= 138) {
|
|
// Change the music volume
|
|
++_vm->_soundManager->_musicVolume;
|
|
|
|
if (_vm->_soundManager->_musicVolume <= 12)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_musicVolume = 12;
|
|
_vm->_soundManager->setMODMusicVolume(_vm->_soundManager->_musicVolume);
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
|
|
if (!_vm->_soundManager->_musicOffFl && mousePos.x >= scrollOffset + 331 && mousePos.y > 113 && mousePos.x <= scrollOffset + 358 && mousePos.y <= 138) {
|
|
--_vm->_soundManager->_musicVolume;
|
|
if (_vm->_soundManager->_musicVolume >= 0)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_musicVolume = 0;
|
|
|
|
_vm->_soundManager->setMODMusicVolume(_vm->_soundManager->_musicVolume);
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
}
|
|
if (!_vm->_soundManager->_soundOffFl) {
|
|
// increase volume
|
|
if (mousePos.x >= scrollOffset + 300 && mousePos.y > 140 && mousePos.x <= scrollOffset + 327 && mousePos.y <= 165) {
|
|
++_vm->_soundManager->_soundVolume;
|
|
if (_vm->_soundManager->_soundVolume <= 16)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_soundVolume = 16;
|
|
_vm->_soundManager->setMODSampleVolume();
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
|
|
// Decrease volume
|
|
if (!_vm->_soundManager->_soundOffFl && mousePos.x >= scrollOffset + 331 && mousePos.y > 140 && mousePos.x <= scrollOffset + 358 && mousePos.y <= 165) {
|
|
--_vm->_soundManager->_soundVolume;
|
|
if (_vm->_soundManager->_soundVolume >= 0)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_soundVolume = 0;
|
|
_vm->_soundManager->setMODSampleVolume();
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
}
|
|
|
|
if (!_vm->_soundManager->_voiceOffFl) {
|
|
if (mousePos.x >= scrollOffset + 300 && mousePos.y > 167 && mousePos.x <= scrollOffset + 327 && mousePos.y <= 192) {
|
|
++_vm->_soundManager->_voiceVolume;
|
|
|
|
if (_vm->_soundManager->_voiceVolume <= 16)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_voiceVolume = 16;
|
|
_vm->_soundManager->setMODVoiceVolume();
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
|
|
if (!_vm->_soundManager->_voiceOffFl && mousePos.x >= scrollOffset + 331 && mousePos.y > 167 && mousePos.x <= scrollOffset + 358 && mousePos.y <= 192) {
|
|
--_vm->_soundManager->_voiceVolume;
|
|
if (_vm->_soundManager->_voiceVolume >= 0)
|
|
_vm->_soundManager->playSoundFile("bruit2.wav");
|
|
else
|
|
_vm->_soundManager->_voiceVolume = 0;
|
|
_vm->_soundManager->setMODVoiceVolume();
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
}
|
|
|
|
if (mousePos.x >= scrollOffset + 431) {
|
|
if (mousePos.y > 194 && mousePos.x <= scrollOffset + 489 && mousePos.y <= 219)
|
|
_vm->_soundManager->_textOffFl = !_vm->_soundManager->_textOffFl;
|
|
|
|
if (mousePos.x >= scrollOffset + 431) {
|
|
if (mousePos.y > 167 && mousePos.x <= scrollOffset + 489 && mousePos.y <= 192) {
|
|
_vm->_soundManager->_voiceOffFl = !_vm->_soundManager->_voiceOffFl;
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
if (mousePos.x >= scrollOffset + 431) {
|
|
if (mousePos.y > 113 && mousePos.x <= scrollOffset + 489 && mousePos.y <= 138) {
|
|
if (_vm->_soundManager->_musicOffFl) {
|
|
_vm->_soundManager->_musicOffFl = false;
|
|
_vm->_soundManager->setMODMusicVolume(_vm->_soundManager->_musicVolume);
|
|
} else {
|
|
_vm->_soundManager->_musicOffFl = true;
|
|
_vm->_soundManager->setMODMusicVolume(0);
|
|
}
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
|
|
if (mousePos.x >= scrollOffset + 431 && mousePos.y > 140 && mousePos.x <= scrollOffset + 489 && mousePos.y <= 165) {
|
|
_vm->_soundManager->_soundOffFl = !_vm->_soundManager->_soundOffFl;
|
|
|
|
_vm->_soundManager->updateScummVMSoundSettings();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (mousePos.x >= scrollOffset + 175 && mousePos.y > 285 && mousePos.x <= scrollOffset + 281 && mousePos.y <= 310) {
|
|
_vm->_globals->_exitId = 300;
|
|
doneFlag = true;
|
|
}
|
|
if (mousePos.x >= scrollOffset + 355 && mousePos.y > 285 && mousePos.x <= scrollOffset + 490 && mousePos.y <= 310)
|
|
doneFlag = true;
|
|
if (mousePos.x >= scrollOffset + 300 && mousePos.y > 194 && mousePos.x <= scrollOffset + 358 && mousePos.y <= 219) {
|
|
switch (_vm->_graphicsManager->_scrollSpeed) {
|
|
case 1:
|
|
_vm->_graphicsManager->_scrollSpeed = 2;
|
|
break;
|
|
case 2:
|
|
_vm->_graphicsManager->_scrollSpeed = 4;
|
|
break;
|
|
case 4:
|
|
_vm->_graphicsManager->_scrollSpeed = 8;
|
|
break;
|
|
case 8:
|
|
_vm->_graphicsManager->_scrollSpeed = 16;
|
|
break;
|
|
case 16:
|
|
_vm->_graphicsManager->_scrollSpeed = 32;
|
|
break;
|
|
case 32:
|
|
_vm->_graphicsManager->_scrollSpeed = 48;
|
|
break;
|
|
case 48:
|
|
_vm->_graphicsManager->_scrollSpeed = 64;
|
|
break;
|
|
case 64:
|
|
_vm->_graphicsManager->_scrollSpeed = 128;
|
|
break;
|
|
case 128:
|
|
_vm->_graphicsManager->_scrollSpeed = 160;
|
|
break;
|
|
case 160:
|
|
_vm->_graphicsManager->_scrollSpeed = 320;
|
|
break;
|
|
case 320:
|
|
_vm->_graphicsManager->_scrollSpeed = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Values are blocked, thus handling the zone is useless
|
|
//if (mousePos.x >= _vm->_graphicsManager->ofscroll + 348 && mousePos.y > 248 && mousePos.x <= _vm->_graphicsManager->ofscroll + 394 && mousePos.y <= 273)
|
|
// _vm->_globals->_speed = 2;
|
|
|
|
if ( mousePos.x < scrollOffset + 165 || mousePos.x > scrollOffset + 496
|
|
|| mousePos.y < 107 || mousePos.y > 318)
|
|
doneFlag = true;
|
|
}
|
|
|
|
if (_vm->_globals->_speed == 1)
|
|
_vm->_globals->_menuSpeed = 6;
|
|
else if (_vm->_globals->_speed == 2)
|
|
_vm->_globals->_menuSpeed = 5;
|
|
else if (_vm->_globals->_speed == 3)
|
|
_vm->_globals->_menuSpeed = 4;
|
|
|
|
_vm->_globals->_menuTextOff = !_vm->_soundManager->_textOffFl ? 7 : 8;
|
|
_vm->_globals->_menuVoiceOff = !_vm->_soundManager->_voiceOffFl ? 7 : 8;
|
|
_vm->_globals->_menuSoundOff = !_vm->_soundManager->_soundOffFl ? 7 : 8;
|
|
_vm->_globals->_menuMusicOff = !_vm->_soundManager->_musicOffFl ? 7 : 8;
|
|
|
|
_vm->_globals->_menuDisplayType = 9;
|
|
|
|
switch (_vm->_graphicsManager->_scrollSpeed) {
|
|
case 1:
|
|
_vm->_globals->_menuScrollSpeed = 12;
|
|
break;
|
|
case 2:
|
|
_vm->_globals->_menuScrollSpeed = 13;
|
|
break;
|
|
case 4:
|
|
_vm->_globals->_menuScrollSpeed = 14;
|
|
break;
|
|
case 8:
|
|
_vm->_globals->_menuScrollSpeed = 15;
|
|
break;
|
|
case 16:
|
|
_vm->_globals->_menuScrollSpeed = 16;
|
|
break;
|
|
case 32:
|
|
_vm->_globals->_menuScrollSpeed = 17;
|
|
break;
|
|
case 48:
|
|
_vm->_globals->_menuScrollSpeed = 18;
|
|
break;
|
|
case 64:
|
|
_vm->_globals->_menuScrollSpeed = 19;
|
|
break;
|
|
case 128:
|
|
_vm->_globals->_menuScrollSpeed = 20;
|
|
break;
|
|
case 160:
|
|
_vm->_globals->_menuScrollSpeed = 21;
|
|
break;
|
|
case 320:
|
|
_vm->_globals->_menuScrollSpeed = 22;
|
|
break;
|
|
case 640:
|
|
_vm->_globals->_menuScrollSpeed = 23;
|
|
break;
|
|
}
|
|
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
} while (!doneFlag);
|
|
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, scrollOffset + 164,
|
|
107, 335, 215, _vm->_graphicsManager->_vesaBuffer, scrollOffset + 164, 107);
|
|
_vm->_graphicsManager->addDirtyRect(scrollOffset + 164, 107, scrollOffset + 498, 320);
|
|
|
|
_vm->_globals->_optionDialogSpr = _vm->_globals->freeMemory(_vm->_globals->_optionDialogSpr);
|
|
_vm->_globals->_optionDialogFl = false;
|
|
}
|
|
|
|
void DialogsManager::showInventory() {
|
|
if (_removeInventFl || _inventDisplayedFl || _vm->_globals->_disableInventFl)
|
|
return;
|
|
|
|
_vm->_graphicsManager->_scrollStatus = 1;
|
|
_vm->_objectsManager->_eraseVisibleCounter = 4;
|
|
_vm->_objectsManager->_visibleFl = false;
|
|
for (int i = 0; i <= 1; i++) {
|
|
inventAnim();
|
|
_vm->_eventsManager->getMouseX();
|
|
_vm->_eventsManager->getMouseY();
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
}
|
|
_inventWin1 = g_PTRNUL;
|
|
|
|
bool loopFl;
|
|
do {
|
|
loopFl = false;
|
|
_vm->_eventsManager->_curMouseButton = 0;
|
|
_vm->_eventsManager->_mouseButton = 0;
|
|
_vm->_globals->_disableInventFl = true;
|
|
_vm->_graphicsManager->SETCOLOR4(251, 100, 100, 100);
|
|
|
|
Common::String filename;
|
|
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
|
|
filename = "INVENT.SPR";
|
|
else {
|
|
switch (_vm->_globals->_language) {
|
|
case LANG_EN:
|
|
filename = "INVENTAN.SPR";
|
|
break;
|
|
case LANG_FR:
|
|
filename = "INVENTFR.SPR";
|
|
break;
|
|
case LANG_SP:
|
|
filename = "INVENTES.SPR";
|
|
break;
|
|
}
|
|
}
|
|
|
|
Common::File f;
|
|
if (!f.open(filename))
|
|
error("Error opening file - %s", filename.c_str());
|
|
|
|
size_t filesize = f.size();
|
|
_inventWin1 = _vm->_globals->allocMemory(filesize);
|
|
_vm->_fileManager->readStream(f, _inventWin1, filesize);
|
|
f.close();
|
|
|
|
_inventBuf2 = _vm->_fileManager->loadFile("INVENT2.SPR");
|
|
|
|
_inventX = _vm->_graphicsManager->_scrollOffset + 152;
|
|
_inventY = 114;
|
|
_inventWidth = _vm->_objectsManager->getWidth(_inventWin1, 0);
|
|
_inventHeight = _vm->_objectsManager->getHeight(_inventWin1, 0);
|
|
|
|
_vm->_graphicsManager->Affiche_Perfect(_vm->_graphicsManager->_vesaBuffer, _inventWin1, _inventX + 300, 414, 0, 0, 0, false);
|
|
int curPosY = 0;
|
|
int inventCount = 0;
|
|
for (int inventLine = 1; inventLine <= 5; inventLine++) {
|
|
int curPosX = 0;
|
|
for (int inventCol = 1; inventCol <= 6; inventCol++) {
|
|
++inventCount;
|
|
int inventIdx = _vm->_globals->_inventory[inventCount];
|
|
// The last two zones are not reserved for the inventory: Options and Save/Load
|
|
if (inventIdx && inventCount <= 29) {
|
|
byte *obj = _vm->_objectsManager->loadObjectFromFile(inventIdx, false);
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, obj, _inventX + curPosX + 6,
|
|
curPosY + 120, _vm->_objectsManager->getObjectWidth(), _vm->_objectsManager->getObjectHeight());
|
|
_vm->_globals->freeMemory(obj);
|
|
}
|
|
curPosX += 54;
|
|
};
|
|
curPosY += 38;
|
|
}
|
|
_vm->_graphicsManager->copySurfaceRect(_vm->_graphicsManager->_vesaBuffer, _inventWin1, _inventX, _inventY, _inventWidth, _inventHeight);
|
|
_vm->_eventsManager->_curMouseButton = 0;
|
|
int newInventoryItem = 0;
|
|
|
|
// Main loop to select an inventory item
|
|
while (!_vm->shouldQuit()) {
|
|
// Turn on drawing the inventory dialog in the event manager
|
|
_inventDisplayedFl = true;
|
|
|
|
int mousePosX = _vm->_eventsManager->getMouseX();
|
|
int mousePosY = _vm->_eventsManager->getMouseY();
|
|
int mouseButton = _vm->_eventsManager->getMouseButton();
|
|
int oldInventoryItem = newInventoryItem;
|
|
newInventoryItem = _vm->_linesManager->checkInventoryHotspots(mousePosX, mousePosY);
|
|
if (newInventoryItem != oldInventoryItem)
|
|
_vm->_objectsManager->initBorder(newInventoryItem);
|
|
if (_vm->_eventsManager->_mouseCursorId != 1 && _vm->_eventsManager->_mouseCursorId != 2 && _vm->_eventsManager->_mouseCursorId != 3 && _vm->_eventsManager->_mouseCursorId != 16) {
|
|
if (mouseButton == 2) {
|
|
_vm->_objectsManager->nextObjectIcon(newInventoryItem);
|
|
if (_vm->_eventsManager->_mouseCursorId != 23)
|
|
_vm->_eventsManager->changeMouseCursor(_vm->_eventsManager->_mouseCursorId);
|
|
}
|
|
}
|
|
if (mouseButton == 1) {
|
|
if (_vm->_eventsManager->_mouseCursorId == 1 || _vm->_eventsManager->_mouseCursorId == 2 || _vm->_eventsManager->_mouseCursorId == 3 || _vm->_eventsManager->_mouseCursorId == 16 || !_vm->_eventsManager->_mouseCursorId)
|
|
break;
|
|
_vm->_objectsManager->takeInventoryObject(_vm->_globals->_inventory[newInventoryItem]);
|
|
if (_vm->_eventsManager->_mouseCursorId == 8)
|
|
break;
|
|
|
|
_vm->_scriptManager->_tempObjectFl = true;
|
|
_vm->_globals->_saveData->_data[svLastObjectIndex] = _vm->_objectsManager->_curObjectIndex;
|
|
_vm->_globals->_saveData->_data[svLastInventoryItem] = _vm->_globals->_inventory[newInventoryItem];
|
|
_vm->_globals->_saveData->_data[svLastInvMouseCursor] = _vm->_eventsManager->_mouseCursorId;
|
|
_vm->_objectsManager->OPTI_OBJET();
|
|
_vm->_scriptManager->_tempObjectFl = false;
|
|
|
|
if (_vm->_soundManager->_voiceOffFl) {
|
|
do
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
while (!_vm->_globals->_exitId && _vm->_eventsManager->getMouseButton() != 1);
|
|
_vm->_fontManager->hideText(9);
|
|
}
|
|
if (_vm->_globals->_exitId) {
|
|
if (_vm->_globals->_exitId == 2) {
|
|
_vm->_globals->_exitId = 0;
|
|
break;
|
|
}
|
|
|
|
_vm->_globals->_exitId = 0;
|
|
_inventBuf2 = _vm->_globals->freeMemory(_inventBuf2);
|
|
_inventWin1 = _vm->_globals->freeMemory(_inventWin1);
|
|
loopFl = true;
|
|
break;
|
|
} else
|
|
_inventDisplayedFl = true;
|
|
}
|
|
if (_removeInventFl)
|
|
break;
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
if (_vm->_globals->_screenId >= 35 && _vm->_globals->_screenId <= 40)
|
|
_vm->_objectsManager->handleSpecialGames();
|
|
}
|
|
} while (loopFl);
|
|
|
|
_vm->_fontManager->hideText(9);
|
|
if (_inventDisplayedFl) {
|
|
_inventDisplayedFl = false;
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, _inventX, 114, _inventWidth, _inventHeight, _vm->_graphicsManager->_vesaBuffer, _inventX, 114);
|
|
_vm->_graphicsManager->addDirtyRect(_inventX, 114, _inventX + _inventWidth, _inventWidth + 114);
|
|
_vm->_objectsManager->BOBTOUS = true;
|
|
}
|
|
|
|
_inventWin1 = _vm->_globals->freeMemory(_inventWin1);
|
|
_inventBuf2 = _vm->_globals->freeMemory(_inventBuf2);
|
|
|
|
if (_vm->_eventsManager->_mouseCursorId == 1)
|
|
showOptionsDialog();
|
|
else if (_vm->_eventsManager->_mouseCursorId == 3)
|
|
showLoadGame();
|
|
else if (_vm->_eventsManager->_mouseCursorId == 2)
|
|
showSaveGame();
|
|
|
|
_vm->_eventsManager->_mouseCursorId = 4;
|
|
_vm->_eventsManager->changeMouseCursor(4);
|
|
_vm->_objectsManager->_oldBorderPos = Common::Point(0, 0);
|
|
_vm->_objectsManager->_borderPos = Common::Point(0, 0);
|
|
_vm->_globals->_disableInventFl = false;
|
|
_vm->_graphicsManager->_scrollStatus = 0;
|
|
}
|
|
|
|
/**
|
|
* Inventory Animations
|
|
*/
|
|
void DialogsManager::inventAnim() {
|
|
if (_vm->_globals->_disableInventFl)
|
|
return;
|
|
|
|
if (_vm->_objectsManager->_eraseVisibleCounter && !_vm->_objectsManager->_visibleFl) {
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, _vm->_objectsManager->_oldInventoryPosX, 27, 48, 38,
|
|
_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_oldInventoryPosX, 27);
|
|
_vm->_graphicsManager->addDirtyRect(_vm->_objectsManager->_oldInventoryPosX, 27, _vm->_objectsManager->_oldInventoryPosX + 48, 65);
|
|
--_vm->_objectsManager->_eraseVisibleCounter;
|
|
}
|
|
|
|
if (_vm->_objectsManager->_visibleFl) {
|
|
if (_vm->_objectsManager->_oldInventoryPosX <= 1)
|
|
_vm->_objectsManager->_oldInventoryPosX = 2;
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, _vm->_objectsManager->_oldInventoryPosX, 27, 48, 38,
|
|
_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_oldInventoryPosX, 27);
|
|
|
|
_vm->_graphicsManager->addDirtyRect(_vm->_objectsManager->_oldInventoryPosX, 27, _vm->_objectsManager->_oldInventoryPosX + 48, 65);
|
|
int newOffset = _vm->_graphicsManager->_scrollOffset + 2;
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _inventoryIcons, newOffset + 300, 327, 0);
|
|
_vm->_graphicsManager->addDirtyRect(newOffset, 27, newOffset + 45, 62);
|
|
_vm->_objectsManager->_oldInventoryPosX = newOffset;
|
|
}
|
|
|
|
if (_vm->_globals->_saveData->_data[svField357] == 1) {
|
|
if (_vm->_globals->_saveData->_data[svField353] == 1)
|
|
_vm->_graphicsManager->Affiche_Perfect(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_headSprites, 832, 325, 0, 0, 0, false);
|
|
if (_vm->_globals->_saveData->_data[svField355] == 1)
|
|
_vm->_graphicsManager->Affiche_Perfect(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_headSprites, 866, 325, 1, 0, 0, false);
|
|
_vm->_graphicsManager->addDirtyRect(532, 25, 560, 60);
|
|
_vm->_graphicsManager->addDirtyRect(566, 25, 594, 60);
|
|
}
|
|
if (_vm->_globals->_saveData->_data[svField356] == 1) {
|
|
_vm->_graphicsManager->Affiche_Perfect(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_headSprites, 832, 325, 0, 0, 0, false);
|
|
_vm->_graphicsManager->addDirtyRect(532, 25, 560, 60);
|
|
}
|
|
|
|
if (_vm->_globals->_saveData->_data[svField354] == 1) {
|
|
_vm->_graphicsManager->Affiche_Perfect(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_headSprites, 832, 325, 0, 0, 0, false);
|
|
_vm->_graphicsManager->addDirtyRect(532, 25, 560, 60);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test dialog opening
|
|
*/
|
|
void DialogsManager::testDialogOpening() {
|
|
if (_vm->_globals->_cityMapEnabledFl)
|
|
_vm->_eventsManager->_gameKey = KEY_NONE;
|
|
|
|
if ((_vm->_eventsManager->_gameKey == KEY_NONE) || _inventFl)
|
|
return;
|
|
|
|
DIALOG_KEY key = _vm->_eventsManager->_gameKey;
|
|
_vm->_eventsManager->_gameKey = KEY_NONE;
|
|
_inventFl = true;
|
|
|
|
switch (key) {
|
|
case KEY_INVENTORY:
|
|
showInventory();
|
|
break;
|
|
case KEY_OPTIONS:
|
|
_vm->_graphicsManager->_scrollStatus = 1;
|
|
showOptionsDialog();
|
|
_vm->_graphicsManager->_scrollStatus = 0;
|
|
break;
|
|
case KEY_LOAD:
|
|
_vm->_graphicsManager->_scrollStatus = 1;
|
|
showLoadGame();
|
|
_vm->_graphicsManager->_scrollStatus = 0;
|
|
break;
|
|
case KEY_SAVE:
|
|
_vm->_graphicsManager->_scrollStatus = 1;
|
|
showSaveGame();
|
|
_vm->_graphicsManager->_scrollStatus = 0;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_inventFl = false;
|
|
_vm->_eventsManager->_gameKey = KEY_NONE;
|
|
}
|
|
|
|
/**
|
|
* Load Game dialog
|
|
*/
|
|
void DialogsManager::showLoadGame() {
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
showSaveLoad(MODE_LOAD);
|
|
|
|
int slotNumber;
|
|
do {
|
|
slotNumber = searchSavegames();
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
} while (!_vm->shouldQuit() && (!slotNumber || _vm->_eventsManager->getMouseButton() != 1));
|
|
_vm->_objectsManager->_saveLoadFl = false;
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, _vm->_eventsManager->_startPos.x + 183, 60, 274, 353, _vm->_graphicsManager->_vesaBuffer, _vm->_eventsManager->_startPos.x + 183, 60);
|
|
_vm->_graphicsManager->addDirtyRect(_vm->_eventsManager->_startPos.x + 183, 60, 457, 413);
|
|
_vm->_objectsManager->BOBTOUS = true;
|
|
_vm->_objectsManager->_saveLoadSprite = _vm->_globals->freeMemory(_vm->_objectsManager->_saveLoadSprite);
|
|
_vm->_objectsManager->_saveLoadSprite2 = _vm->_globals->freeMemory(_vm->_objectsManager->_saveLoadSprite2);
|
|
_vm->_objectsManager->_saveLoadX = 0;
|
|
_vm->_objectsManager->_saveLoadY = 0;
|
|
|
|
if (slotNumber != 7) {
|
|
_vm->_saveLoadManager->loadGame(slotNumber);
|
|
}
|
|
|
|
_vm->_objectsManager->changeObject(14);
|
|
}
|
|
|
|
/**
|
|
* Save Game dialog
|
|
*/
|
|
void DialogsManager::showSaveGame() {
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
|
|
showSaveLoad(MODE_SAVE);
|
|
int slotNumber;
|
|
do {
|
|
slotNumber = searchSavegames();
|
|
_vm->_eventsManager->refreshScreenAndEvents();
|
|
} while (!_vm->shouldQuit() && (!slotNumber || _vm->_eventsManager->getMouseButton() != 1));
|
|
|
|
_vm->_objectsManager->_saveLoadFl = false;
|
|
_vm->_graphicsManager->copySurface(_vm->_graphicsManager->_vesaScreen, _vm->_eventsManager->_startPos.x + 183, 60, 274, 353, _vm->_graphicsManager->_vesaBuffer, _vm->_eventsManager->_startPos.x + 183, 60);
|
|
_vm->_graphicsManager->addDirtyRect(_vm->_eventsManager->_startPos.x + 183, 60, _vm->_eventsManager->_startPos.x + 457, 413);
|
|
_vm->_objectsManager->BOBTOUS = true;
|
|
_vm->_objectsManager->_saveLoadSprite = _vm->_globals->freeMemory(_vm->_objectsManager->_saveLoadSprite);
|
|
_vm->_objectsManager->_saveLoadSprite2 = _vm->_globals->freeMemory(_vm->_objectsManager->_saveLoadSprite2);
|
|
_vm->_objectsManager->_saveLoadX = 0;
|
|
_vm->_objectsManager->_saveLoadY = 0;
|
|
|
|
if (slotNumber != 7) {
|
|
// Since the original GUI doesn't support save names, use a default name
|
|
Common::String saveName = Common::String::format("Save #%d", slotNumber);
|
|
|
|
// Save the game
|
|
_vm->_saveLoadManager->saveGame(slotNumber, saveName);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load/Save dialog
|
|
*/
|
|
void DialogsManager::showSaveLoad(SaveLoadMode mode) {
|
|
Common::String filename;
|
|
|
|
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
|
|
filename = "SAVE.SPR";
|
|
else {
|
|
switch (_vm->_globals->_language) {
|
|
case LANG_EN:
|
|
filename = "SAVEAN.SPR";
|
|
break;
|
|
case LANG_FR:
|
|
filename = "SAVEFR.SPR";
|
|
break;
|
|
case LANG_SP:
|
|
filename = "SAVEES.SPR";
|
|
break;
|
|
}
|
|
}
|
|
|
|
_vm->_objectsManager->_saveLoadSprite = _vm->_objectsManager->loadSprite(filename);
|
|
_vm->_objectsManager->_saveLoadSprite2 = _vm->_objectsManager->loadSprite("SAVE2.SPR");
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 483, 360, 0);
|
|
|
|
if (_vm->_globals->_language == LANG_FR) {
|
|
if (mode == MODE_SAVE)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 525, 375, 1);
|
|
else if (mode == MODE_LOAD)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 515, 375, 2);
|
|
} else {
|
|
if (mode == MODE_SAVE)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 535, 372, 1);
|
|
else if (mode == MODE_LOAD)
|
|
_vm->_graphicsManager->Sprite_Vesa(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 539, 372, 2);
|
|
}
|
|
|
|
for (int slotNumber = 1; slotNumber <= 6; ++slotNumber) {
|
|
hopkinsSavegameHeader header;
|
|
if (_vm->_saveLoadManager->readSavegameHeader(slotNumber, header)) {
|
|
Graphics::Surface thumb8;
|
|
_vm->_saveLoadManager->convertThumb16To8(header._thumbnail, &thumb8);
|
|
|
|
byte *thumb = (byte *)thumb8.pixels;
|
|
|
|
switch (slotNumber) {
|
|
case 1:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 190, 112, 128, 87);
|
|
break;
|
|
case 2:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 323, 112, 128, 87);
|
|
break;
|
|
case 3:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 190, 203, 128, 87);
|
|
break;
|
|
case 4:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 323, 203, 128, 87);
|
|
break;
|
|
case 5:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 190, 294, 128, 87);
|
|
break;
|
|
case 6:
|
|
_vm->_graphicsManager->restoreSurfaceRect(_vm->_graphicsManager->_vesaBuffer, thumb, _vm->_eventsManager->_startPos.x + 323, 294, 128, 87);
|
|
break;
|
|
}
|
|
|
|
thumb8.free();
|
|
header._thumbnail->free();
|
|
delete header._thumbnail;
|
|
}
|
|
}
|
|
|
|
_vm->_graphicsManager->copySurfaceRect(_vm->_graphicsManager->_vesaBuffer, _vm->_objectsManager->_saveLoadSprite, _vm->_eventsManager->_startPos.x + 183, 60, 274, 353);
|
|
_vm->_objectsManager->_saveLoadFl = true;
|
|
_vm->_objectsManager->_saveLoadX = 0;
|
|
_vm->_objectsManager->_saveLoadY = 0;
|
|
}
|
|
|
|
/**
|
|
* Search savegames
|
|
*/
|
|
int DialogsManager::searchSavegames() {
|
|
int xp = _vm->_eventsManager->getMouseX();
|
|
int yp = _vm->_eventsManager->getMouseY();
|
|
|
|
_vm->_graphicsManager->_scrollOffset = _vm->_eventsManager->_startPos.x;
|
|
|
|
int slotNumber = 0;
|
|
if (yp >= 112 && yp <= 198) {
|
|
if (xp > _vm->_eventsManager->_startPos.x + 189 && xp < _vm->_eventsManager->_startPos.x + 318) {
|
|
slotNumber = 1;
|
|
_vm->_objectsManager->_saveLoadX = 189;
|
|
_vm->_objectsManager->_saveLoadY = 111;
|
|
} else if (xp > _vm->_graphicsManager->_scrollOffset + 322 && xp < _vm->_graphicsManager->_scrollOffset + 452) {
|
|
slotNumber = 2;
|
|
_vm->_objectsManager->_saveLoadX = 322;
|
|
_vm->_objectsManager->_saveLoadY = 111;
|
|
}
|
|
} else if (yp >= 203 && yp <= 289) {
|
|
if (xp > _vm->_graphicsManager->_scrollOffset + 189 && xp < _vm->_graphicsManager->_scrollOffset + 318) {
|
|
slotNumber = 3;
|
|
_vm->_objectsManager->_saveLoadX = 189;
|
|
_vm->_objectsManager->_saveLoadY = 202;
|
|
} else if (xp > _vm->_graphicsManager->_scrollOffset + 322 && xp < _vm->_graphicsManager->_scrollOffset + 452) {
|
|
slotNumber = 4;
|
|
_vm->_objectsManager->_saveLoadX = 322;
|
|
_vm->_objectsManager->_saveLoadY = 202;
|
|
}
|
|
} else if (yp >= 294 && yp <= 380) {
|
|
if (xp > _vm->_graphicsManager->_scrollOffset + 189 && xp < _vm->_graphicsManager->_scrollOffset + 318) {
|
|
slotNumber = 5;
|
|
_vm->_objectsManager->_saveLoadX = 189;
|
|
_vm->_objectsManager->_saveLoadY = 293;
|
|
} else if (xp > _vm->_graphicsManager->_scrollOffset + 322 && xp < _vm->_graphicsManager->_scrollOffset + 452) {
|
|
slotNumber = 6;
|
|
_vm->_objectsManager->_saveLoadX = 322;
|
|
_vm->_objectsManager->_saveLoadY = 293;
|
|
}
|
|
} else if (yp >= 388 && yp <= 404 && xp > _vm->_graphicsManager->_scrollOffset + 273 && xp < _vm->_graphicsManager->_scrollOffset + 355) {
|
|
slotNumber = 7;
|
|
_vm->_objectsManager->_saveLoadX = 0;
|
|
_vm->_objectsManager->_saveLoadY = 0;
|
|
} else {
|
|
slotNumber = 0;
|
|
_vm->_objectsManager->_saveLoadX = 0;
|
|
_vm->_objectsManager->_saveLoadY = 0;
|
|
}
|
|
|
|
return slotNumber;
|
|
}
|
|
|
|
} // End of namespace Hopkins
|