diff options
Diffstat (limited to 'engines/saga/interface.cpp')
-rw-r--r-- | engines/saga/interface.cpp | 152 |
1 files changed, 53 insertions, 99 deletions
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp index a77ec1c140..5b15fc9803 100644 --- a/engines/saga/interface.cpp +++ b/engines/saga/interface.cpp @@ -124,8 +124,7 @@ static const int IHNMTextStringIdsLUT[56] = { #define buttonRes1 0x42544E01 Interface::Interface(SagaEngine *vm) : _vm(vm) { - byte *resource; - size_t resourceLength; + ByteArray resourceData; int i; #if 0 @@ -170,34 +169,27 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { } } - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->mainPanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_mainPanel.image, - &_mainPanel.imageLength, &_mainPanel.imageWidth, &_mainPanel.imageHeight); - - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->mainPanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _mainPanel.image, &_mainPanel.imageWidth, &_mainPanel.imageHeight); // Converse panel _conversePanel.buttons = _vm->getDisplayInfo().conversePanelButtons; _conversePanel.buttonsCount = _vm->getDisplayInfo().conversePanelButtonsCount; - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_conversePanel.image, - &_conversePanel.imageLength, &_conversePanel.imageWidth, &_conversePanel.imageHeight); - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _conversePanel.image, &_conversePanel.imageWidth, &_conversePanel.imageHeight); // Option panel if (!_vm->_script->isNonInteractiveDemo()) { _optionPanel.buttons = _vm->getDisplayInfo().optionPanelButtons; _optionPanel.buttonsCount = _vm->getDisplayInfo().optionPanelButtonsCount; - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->optionPanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_optionPanel.image, - &_optionPanel.imageLength, &_optionPanel.imageWidth, &_optionPanel.imageHeight); - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->optionPanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _optionPanel.image, &_optionPanel.imageWidth, &_optionPanel.imageHeight); } else { _optionPanel.buttons = NULL; _optionPanel.buttonsCount = 0; - _optionPanel.sprites.spriteCount = 0; + _optionPanel.sprites.clear(); } #ifdef ENABLE_IHNM @@ -206,10 +198,8 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { _quitPanel.buttons = _vm->getDisplayInfo().quitPanelButtons; _quitPanel.buttonsCount = _vm->getDisplayInfo().quitPanelButtonsCount; - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_quitPanel.image, - &_quitPanel.imageLength, &_quitPanel.imageWidth, &_quitPanel.imageHeight); - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _quitPanel.image, &_quitPanel.imageWidth, &_quitPanel.imageHeight); } // Save panel @@ -217,10 +207,8 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { _savePanel.buttons = _vm->getDisplayInfo().savePanelButtons; _savePanel.buttonsCount = _vm->getDisplayInfo().savePanelButtonsCount; - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_savePanel.image, - &_savePanel.imageLength, &_savePanel.imageWidth, &_savePanel.imageHeight); - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _savePanel.image, &_savePanel.imageWidth, &_savePanel.imageHeight); } // Load panel @@ -228,10 +216,8 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { _loadPanel.buttons = _vm->getDisplayInfo().loadPanelButtons; _loadPanel.buttonsCount = _vm->getDisplayInfo().loadPanelButtonsCount; - _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength); - _vm->decodeBGImage(resource, resourceLength, &_loadPanel.image, - &_loadPanel.imageLength, &_loadPanel.imageWidth, &_loadPanel.imageHeight); - free(resource); + _vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData); + _vm->decodeBGImage(resourceData, _loadPanel.image, &_loadPanel.imageWidth, &_loadPanel.imageHeight); } #endif @@ -323,16 +309,12 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { _inventoryStart = 0; _inventoryEnd = 0; _inventoryBox = 0; - _inventorySize = ITE_INVENTORY_SIZE; _saveReminderState = 0; _optionSaveFileTop = 0; _optionSaveFileTitleNumber = 0; - _inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16)); - if (_inventory == NULL) { - error("Interface::Interface(): not enough memory"); - } + _inventory.resize(ITE_INVENTORY_SIZE); _textInput = false; _statusTextInput = false; @@ -345,25 +327,6 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { } Interface::~Interface() { - free(_inventory); - - free(_mainPanel.image); - free(_conversePanel.image); - free(_optionPanel.image); - free(_quitPanel.image); - free(_loadPanel.image); - free(_savePanel.image); - - _mainPanel.sprites.freeMem(); - _conversePanel.sprites.freeMem(); - _optionPanel.sprites.freeMem(); - _quitPanel.sprites.freeMem(); - _loadPanel.sprites.freeMem(); - _savePanel.sprites.freeMem(); - _protectPanel.sprites.freeMem(); - - _defPortraits.freeMem(); - _scenePortraits.freeMem(); } void Interface::saveReminderCallback(void *refCon) { @@ -768,7 +731,7 @@ void Interface::setStatusText(const char *text, int statusColor) { } void Interface::loadScenePortraits(int resourceId) { - _scenePortraits.freeMem(); + _scenePortraits.clear(); _vm->_sprite->loadList(resourceId, _scenePortraits); } @@ -817,7 +780,7 @@ void Interface::draw() { if (_panelMode == kPanelMain || _panelMode == kPanelMap || (_panelMode == kPanelNull && _vm->isIHNMDemo())) { _mainPanel.getRect(rect); - _vm->_gfx->drawRegion(rect, _mainPanel.image); + _vm->_gfx->drawRegion(rect, _mainPanel.image.getBuffer()); for (int i = 0; i < kVerbTypeIdsMax; i++) { if (_verbTypeToPanelButton[i] != NULL) { @@ -826,7 +789,7 @@ void Interface::draw() { } } else if (_panelMode == kPanelConverse) { _conversePanel.getRect(rect); - _vm->_gfx->drawRegion(rect, _conversePanel.image); + _vm->_gfx->drawRegion(rect, _conversePanel.image.getBuffer()); converseDisplayTextLines(); } @@ -847,7 +810,7 @@ void Interface::draw() { // can tell this is what the original engine does. And it keeps // ITE from crashing when entering the Elk King's court. - if (_rightPortrait >= _scenePortraits.spriteCount) + if (_rightPortrait >= (int)_scenePortraits.size()) _rightPortrait = 0; _vm->_sprite->draw(_scenePortraits, _rightPortrait, rightPortraitPoint, 256); @@ -960,7 +923,7 @@ void Interface::drawOption() { int spritenum = 0; _optionPanel.getRect(rect); - _vm->_gfx->drawRegion(rect, _optionPanel.image); + _vm->_gfx->drawRegion(rect, _optionPanel.image.getBuffer()); for (int i = 0; i < _optionPanel.buttonsCount; i++) { panelButton = &_optionPanel.buttons[i]; @@ -1037,7 +1000,7 @@ void Interface::drawQuit() { if (_vm->getGameId() == GID_ITE) drawButtonBox(rect, kButton, false); else - _vm->_gfx->drawRegion(rect, _quitPanel.image); + _vm->_gfx->drawRegion(rect, _quitPanel.image.getBuffer()); for (i = 0; i < _quitPanel.buttonsCount; i++) { panelButton = &_quitPanel.buttons[i]; @@ -1103,7 +1066,7 @@ void Interface::drawLoad() { if (_vm->getGameId() == GID_ITE) drawButtonBox(rect, kButton, false); else - _vm->_gfx->drawRegion(rect, _loadPanel.image); + _vm->_gfx->drawRegion(rect, _loadPanel.image.getBuffer()); for (i = 0; i < _loadPanel.buttonsCount; i++) { panelButton = &_loadPanel.buttons[i]; @@ -1323,7 +1286,7 @@ void Interface::drawSave() { if (_vm->getGameId() == GID_ITE) drawButtonBox(rect, kButton, false); else - _vm->_gfx->drawRegion(rect, _savePanel.image); + _vm->_gfx->drawRegion(rect, _savePanel.image.getBuffer()); for (i = 0; i < _savePanel.buttonsCount; i++) { panelButton = &_savePanel.buttons[i]; @@ -1587,7 +1550,7 @@ void Interface::handleChapterSelectionClick(const Point& mousePoint) { event.param4 = obj; // Object event.param5 = 0; // With Object event.param6 = obj; // Actor - _vm->_events->queue(&event); + _vm->_events->queue(event); } } } @@ -2064,7 +2027,7 @@ void Interface::updateInventory(int pos) { } void Interface::addToInventory(int objectId) { - if (_inventoryCount >= _inventorySize) { + if (uint(_inventoryCount) >= _inventory.size()) { return; } @@ -2281,14 +2244,22 @@ void Interface::drawPanelButtonText(InterfacePanel *panel, PanelButton *panelBut } break; case kTextMusic: - if (_vm->_musicVolume) + if (_vm->_musicVolume) { textId = kText10Percent + _vm->_musicVolume / 25 - 1; + if (textId > kTextMax) { + textId = kTextMax; + } + } else textId = kTextOff; break; case kTextSound: - if (_vm->_soundVolume) + if (_vm->_soundVolume) { textId = kText10Percent + _vm->_soundVolume / 25 - 1; + if (textId > kTextMax) { + textId = kTextMax; + } + } else textId = kTextOff; break; @@ -2423,18 +2394,9 @@ void Interface::drawVerbPanelText(PanelButton *panelButton, KnownColor textKnown // Converse stuff -void Interface::converseInit() { - for (int i = 0; i < CONVERSE_MAX_TEXTS; i++) - _converseText[i].text = NULL; - converseClear(); -} - void Interface::converseClear() { for (int i = 0; i < CONVERSE_MAX_TEXTS; i++) { - if (_converseText[i].text != NULL) { - free(_converseText[i].text); - _converseText[i].text = NULL; - } + _converseText[i].text.clear(); _converseText[i].stringNum = -1; _converseText[i].replyId = 0; _converseText[i].replyFlags = 0; @@ -2480,8 +2442,8 @@ bool Interface::converseAddText(const char *text, int strId, int replyId, byte r return true; } - _converseText[_converseTextCount].text = (char *)malloc(i + 1); - strncpy(_converseText[_converseTextCount].text, _converseWorkString, i); + _converseText[_converseTextCount].text.resize(i + 1); + strncpy(&_converseText[_converseTextCount].text.front(), _converseWorkString, i); _converseText[_converseTextCount].strId = strId; _converseText[_converseTextCount].text[i] = 0; @@ -2591,7 +2553,7 @@ void Interface::converseDisplayTextLines() { rect.left += 8; _vm->_gfx->drawRect(rect, backgnd); - str = _converseText[relPos].text; + str = &_converseText[relPos].text.front(); if (_converseText[relPos].textNum == 0) { // first entry textPoint.x = rect.left - 6; @@ -2725,10 +2687,9 @@ void Interface::loadState(Common::InSaveFile *in) { void Interface::mapPanelShow() { int i; - byte *resource; - size_t resourceLength, imageLength; + ByteArray resourceData; Rect rect; - byte *image; + ByteArray image; int imageWidth, imageHeight; const byte *pal; PalEntry cPal[PAL_ENTRIES]; @@ -2737,9 +2698,8 @@ void Interface::mapPanelShow() { rect.left = rect.top = 0; - _vm->_resource->loadResource(_interfaceContext, - _vm->_resource->convertResourceId(RID_ITE_TYCHO_MAP), resource, resourceLength); - if (resourceLength == 0) { + _vm->_resource->loadResource(_interfaceContext, _vm->_resource->convertResourceId(RID_ITE_TYCHO_MAP), resourceData); + if (resourceData.empty()) { error("Interface::mapPanelShow() unable to load Tycho map resource"); } @@ -2753,8 +2713,8 @@ void Interface::mapPanelShow() { _vm->_render->setFlag(RF_MAP); - _vm->decodeBGImage(resource, resourceLength, &image, &imageLength, &imageWidth, &imageHeight); - pal = _vm->getImagePal(resource, resourceLength); + _vm->decodeBGImage(resourceData, image, &imageWidth, &imageHeight); + pal = _vm->getImagePal(resourceData); for (i = 0; i < PAL_ENTRIES; i++) { cPal[i].red = *pal++; @@ -2765,7 +2725,7 @@ void Interface::mapPanelShow() { rect.setWidth(imageWidth); rect.setHeight(imageHeight); - _vm->_gfx->drawRegion(rect, image); + _vm->_gfx->drawRegion(rect, image.getBuffer()); // Evil Evil for (i = 0; i < 6 ; i++) { @@ -2774,8 +2734,6 @@ void Interface::mapPanelShow() { _vm->_system->delayMillis(5); } - free(resource); - free(image); setSaveReminderState(false); @@ -2832,10 +2790,9 @@ void Interface::keyBoss() { _vm->_music->pause(); int i; - byte *resource; - size_t resourceLength, imageLength; + ByteArray resourceData; Rect rect; - byte *image; + ByteArray image; int imageWidth, imageHeight; const byte *pal; PalEntry cPal[PAL_ENTRIES]; @@ -2844,20 +2801,20 @@ void Interface::keyBoss() { rect.left = rect.top = 0; - _vm->_resource->loadResource(_interfaceContext, RID_IHNM_BOSS_SCREEN, resource, resourceLength); - if (resourceLength == 0) { + _vm->_resource->loadResource(_interfaceContext, RID_IHNM_BOSS_SCREEN, resourceData); + if (resourceData.empty()) { error("Interface::bossKey() unable to load Boss image resource"); } _bossMode = _panelMode; setMode(kPanelBoss); - _vm->decodeBGImage(resource, resourceLength, &image, &imageLength, &imageWidth, &imageHeight); + _vm->decodeBGImage(resourceData, image, &imageWidth, &imageHeight); rect.setWidth(imageWidth); rect.setHeight(imageHeight); _vm->_gfx->getCurrentPal(_mapSavedPal); - pal = _vm->getImagePal(resource, resourceLength); + pal = _vm->getImagePal(resourceData); cPal[0].red = 0; cPal[0].green = 0; @@ -2869,12 +2826,9 @@ void Interface::keyBoss() { cPal[i].blue = 128; } - _vm->_gfx->drawRegion(rect, image); + _vm->_gfx->drawRegion(rect, image.getBuffer()); _vm->_gfx->setPalette(cPal); - - free(resource); - free(image); } |