From 09570f8dfa6f1ddbee324bc7a8ca30c4233972c5 Mon Sep 17 00:00:00 2001 From: lukaslw Date: Fri, 25 Jul 2014 01:57:44 +0200 Subject: PRINCE: Mob priority list implementation - loadMobPriority(), checkMob() fix and update --- engines/prince/prince.cpp | 86 ++++++++++++++++++++++++++++++++++++----------- engines/prince/prince.h | 4 ++- 2 files changed, 69 insertions(+), 21 deletions(-) (limited to 'engines') diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index a998181e4c..5141b453be 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -181,6 +181,8 @@ PrinceEngine::~PrinceEngine() { free(_roomPathBitmap); free(_roomPathBitmapTemp); free(_coordsBuf); + + _mobPriorityList.clear(); } GUI::Debugger *PrinceEngine::getDebugger() { @@ -422,6 +424,8 @@ bool PrinceEngine::loadLocation(uint16 locationNr) { _pscrList.clear(); Resource::loadResource(_pscrList, "pscr.lst", false); + loadMobPriority("mobpri"); + _mobList.clear(); if (getLanguage() == Common::DE_DEU) { const Common::String mobLstName = Common::String::format("mob%02d.lst", _locationNr); @@ -800,6 +804,26 @@ bool PrinceEngine::loadAllInv() { return true; } +bool PrinceEngine::loadMobPriority(const char *resourceName) { + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(resourceName); + if (!stream) { + delete stream; + return false; + } + + _mobPriorityList.clear(); + int mobId; + while (1) { + mobId = stream->readUint32LE(); + if (mobId == 0xFFFFFFFF) { + break; + } + _mobPriorityList.push_back(mobId); + } + delete stream; + return true; +} + void PrinceEngine::keyHandler(Common::Event event) { uint16 nChar = event.kbd.keycode; switch (nChar) { @@ -886,7 +910,7 @@ void PrinceEngine::keyHandler(Common::Event event) { } } -int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobList) { +int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobList, bool usePriorityList) { Common::Point mousepos = _system->getEventManager()->getMousePos(); Common::Point mousePosCamera(mousepos.x + _picWindowX, mousepos.y); @@ -894,28 +918,38 @@ int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobLis return -1; } - int mobNumber = 0; - for (Common::Array::const_iterator it = mobList.begin(); it != mobList.end() ; it++) { - const Mob& mob = *it; - mobNumber++; + int mobListSize; + if (usePriorityList) { + mobListSize = _mobPriorityList.size(); + } else { + mobListSize = mobList.size(); + } + + for (int mobNumber = 0; mobNumber < mobListSize; mobNumber++) { + Mob *mob = nullptr; + if (usePriorityList) { + mob = &mobList[_mobPriorityList[mobNumber]]; + } else { + mob = &mobList[mobNumber]; + } - if (mob._visible) { + if (mob->_visible) { continue; } - int type = mob._type & 7; + int type = mob->_type & 7; switch (type) { case 0: case 1: //normal_mob - if (!mob._rect.contains(mousePosCamera)) { + if (!mob->_rect.contains(mousePosCamera)) { continue; } break; case 3: //mob_obj - if (mob._mask < kMaxObjects) { - int nr = _objSlot[mob._mask]; + if (mob->_mask < kMaxObjects) { + int nr = _objSlot[mob->_mask]; if (nr != -1) { Object &obj = *_objList[nr]; Common::Rect objectRect(obj._x, obj._y, obj._x + obj._width, obj._y + obj._height); @@ -933,9 +967,9 @@ int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobLis case 2: case 5: //check_ba_mob - if (!_backAnimList[mob._mask].backAnims.empty()) { - int currentAnim = _backAnimList[mob._mask]._seq._currRelative; - Anim &backAnim = _backAnimList[mob._mask].backAnims[currentAnim]; + if (!_backAnimList[mob->_mask].backAnims.empty()) { + int currentAnim = _backAnimList[mob->_mask]._seq._currRelative; + Anim &backAnim = _backAnimList[mob->_mask].backAnims[currentAnim]; if (backAnim._animData != nullptr) { if (!backAnim._state) { Common::Rect backAnimRect(backAnim._currX, backAnim._currY, backAnim._currX + backAnim._currW, backAnim._currY + backAnim._currH); @@ -947,7 +981,13 @@ int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobLis backAnimSurface->free(); delete backAnimSurface; if (pixel != 255) { - break; + if (type == 5) { + if (mob->_rect.contains(mousePosCamera)) { + break; + } + } else { + break; + } } } } @@ -961,7 +1001,7 @@ int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobLis break; } - Common::String mobName = mob._name; + Common::String mobName = mob->_name; if (getLanguage() == Common::DE_DEU) { for (uint i = 0; i < mobName.size(); i++) { @@ -1009,7 +1049,11 @@ int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array &mobLis _font->drawString(screen, mobName, x, y, screen->w, 216); - return mobNumber - 1; + if (usePriorityList) { + return _mobPriorityList[mobNumber]; + } else { + return mobNumber; + } } return -1; } @@ -1752,7 +1796,7 @@ void PrinceEngine::drawScreen() { if (!_inventoryBackgroundRemember && !_dialogFlag) { if (!_optionsFlag) { - _selectedMob = checkMob(_graph->_frontScreen, _mobList); + _selectedMob = checkMob(_graph->_frontScreen, _mobList, true); } showTexts(_graph->_frontScreen); checkOptions(); @@ -1797,7 +1841,7 @@ void PrinceEngine::blackPalette() { } void PrinceEngine::setPalette() { - byte *paletteBackup; + byte *paletteBackup = nullptr; byte *blackPalette = (byte *)malloc(256 * 3); int fadeStep = 0; @@ -1821,7 +1865,9 @@ void PrinceEngine::setPalette() { } pause(); } - _graph->setPalette(paletteBackup); + if (paletteBackup != nullptr) { + _graph->setPalette(paletteBackup); + } free(blackPalette); } @@ -2656,7 +2702,7 @@ void PrinceEngine::displayInventory() { showTexts(_graph->_screenForInventory); if (!_optionsFlag && _textSlots[0]._str == nullptr) { - _selectedMob = checkMob(_graph->_screenForInventory, _invMobList); + _selectedMob = checkMob(_graph->_screenForInventory, _invMobList, false); } checkInvOptions(); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 311935ffed..3e5e1a9f78 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -271,6 +271,7 @@ public: bool loadSample(uint32 sampleSlot, const Common::String &name); bool loadZoom(byte *zoomBitmap, uint32 dataSize, const char *resourceName); bool loadShadow(byte *shadowBitmap, uint32 dataSize, const char *resourceName1, const char *resourceName2); + bool loadMobPriority(const char *resourceName); void playSample(uint16 sampleId, uint16 loopType); void stopSample(uint16 sampleId); @@ -310,6 +311,7 @@ public: Common::Array _backAnimList; Common::Array _normAnimList; Common::Array _mobList; + Common::Array _mobPriorityList; Common::Array _maskList; Common::Array _objList; int *_objSlot; @@ -536,7 +538,7 @@ public: private: bool playNextFrame(); void keyHandler(Common::Event event); - int checkMob(Graphics::Surface *screen, Common::Array &mobList); + int checkMob(Graphics::Surface *screen, Common::Array &mobList, bool usePriorityList); void drawScreen(); void showTexts(Graphics::Surface *screen); void init(); -- cgit v1.2.3