aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorlukaslw2014-07-25 01:57:44 +0200
committerlukaslw2014-07-25 01:57:44 +0200
commit09570f8dfa6f1ddbee324bc7a8ca30c4233972c5 (patch)
treef02d0f197eb8c31f8b33012c9cbc781c748c755c /engines
parente6e83d993d19c2ae77c37daeefd3f4a070673182 (diff)
downloadscummvm-rg350-09570f8dfa6f1ddbee324bc7a8ca30c4233972c5.tar.gz
scummvm-rg350-09570f8dfa6f1ddbee324bc7a8ca30c4233972c5.tar.bz2
scummvm-rg350-09570f8dfa6f1ddbee324bc7a8ca30c4233972c5.zip
PRINCE: Mob priority list implementation - loadMobPriority(), checkMob() fix and update
Diffstat (limited to 'engines')
-rw-r--r--engines/prince/prince.cpp86
-rw-r--r--engines/prince/prince.h4
2 files changed, 69 insertions, 21 deletions
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<Mob> &mobList) {
+int PrinceEngine::checkMob(Graphics::Surface *screen, Common::Array<Mob> &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<Mob> &mobLis
return -1;
}
- int mobNumber = 0;
- for (Common::Array<Mob>::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<Mob> &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<Mob> &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<Mob> &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<Mob> &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<BackgroundAnim> _backAnimList;
Common::Array<Anim> _normAnimList;
Common::Array<Mob> _mobList;
+ Common::Array<uint32> _mobPriorityList;
Common::Array<Mask> _maskList;
Common::Array<Object *> _objList;
int *_objSlot;
@@ -536,7 +538,7 @@ public:
private:
bool playNextFrame();
void keyHandler(Common::Event event);
- int checkMob(Graphics::Surface *screen, Common::Array<Mob> &mobList);
+ int checkMob(Graphics::Surface *screen, Common::Array<Mob> &mobList, bool usePriorityList);
void drawScreen();
void showTexts(Graphics::Surface *screen);
void init();