[Scummvm-git-logs] scummvm master -> 284226244ecb7a3ee3160821a7c4254e55470ccb
whiterandrek
whiterandrek at gmail.com
Mon Oct 12 21:34:48 UTC 2020
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2de754a2a6 PETKA: fix loading panel, map and save interfaces when main room width > 640
284226244e PETKA: refactor Resource manager
Commit: 2de754a2a6b5b68901e48748f446791a982ca4a4
https://github.com/scummvm/scummvm/commit/2de754a2a6b5b68901e48748f446791a982ca4a4
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-13T00:32:39+03:00
Commit Message:
PETKA: fix loading panel, map and save interfaces when main room width > 640
Changed paths:
engines/petka/interfaces/interface.cpp
diff --git a/engines/petka/interfaces/interface.cpp b/engines/petka/interfaces/interface.cpp
index f923201939..c9efd949e2 100644
--- a/engines/petka/interfaces/interface.cpp
+++ b/engines/petka/interfaces/interface.cpp
@@ -126,6 +126,9 @@ void SubInterface::start(int id) {
_savedXOffset = sys->_xOffset;
_savedSceneWidth = sys->_sceneWidth;
+ sys->_xOffset = 0;
+ sys->_sceneWidth = 640;
+
g_vm->getQSystem()->_currInterface = this;
g_vm->videoSystem()->updateTime();
g_vm->videoSystem()->makeAllDirty();
Commit: 284226244ecb7a3ee3160821a7c4254e55470ccb
https://github.com/scummvm/scummvm/commit/284226244ecb7a3ee3160821a7c4254e55470ccb
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-13T00:34:35+03:00
Commit Message:
PETKA: refactor Resource manager
Changed paths:
engines/petka/interfaces/dialog_interface.cpp
engines/petka/interfaces/main.cpp
engines/petka/interfaces/map.cpp
engines/petka/interfaces/panel.cpp
engines/petka/interfaces/save_load.cpp
engines/petka/interfaces/sequence.cpp
engines/petka/interfaces/startup.cpp
engines/petka/objects/heroes.cpp
engines/petka/objects/object.cpp
engines/petka/objects/object_bg.cpp
engines/petka/objects/object_case.cpp
engines/petka/objects/object_cursor.cpp
engines/petka/objects/object_star.cpp
engines/petka/objects/text.cpp
engines/petka/petka.cpp
engines/petka/q_manager.cpp
engines/petka/q_manager.h
engines/petka/q_system.cpp
diff --git a/engines/petka/interfaces/dialog_interface.cpp b/engines/petka/interfaces/dialog_interface.cpp
index a5ec7178d7..1ff49767da 100644
--- a/engines/petka/interfaces/dialog_interface.cpp
+++ b/engines/petka/interfaces/dialog_interface.cpp
@@ -195,7 +195,7 @@ void DialogInterface::playSound(const Common::String &name) {
_soundName = name;
Sound *s = g_vm->soundMgr()->addSound(name, Audio::Mixer::kSpeechSoundType);
if (s) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_talker->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_talker->_resourceId);
if (flc) {
Common::Rect bounds = flc->getBounds();
s->setBalance(bounds.left + _talker->_x + bounds.width(), _qsys->_sceneWidth);
diff --git a/engines/petka/interfaces/main.cpp b/engines/petka/interfaces/main.cpp
index 13810c77bf..e58b94525b 100644
--- a/engines/petka/interfaces/main.cpp
+++ b/engines/petka/interfaces/main.cpp
@@ -97,13 +97,17 @@ void InterfaceMain::loadRoom(int id, bool fromSave) {
sys->_room = room;
_objs.push_back(room);
- resMgr->loadBitmap(room->_resourceId);
+ auto surface = resMgr->getSurface(room->_resourceId);
+ if (surface) {
+ sys->_sceneWidth = surface->w;
+ sys->_xOffset = 0;
+ }
for (uint i = 0; i < info->attachedObjIds.size(); ++i) {
QMessageObject *obj = sys->findObject(info->attachedObjIds[i]);
obj->loadSound();
if (obj->_isShown || obj->_isActive)
- g_vm->resMgr()->loadFlic(obj->_resourceId);
+ g_vm->resMgr()->getFlic(obj->_resourceId);
_objs.push_back(obj);
}
diff --git a/engines/petka/interfaces/map.cpp b/engines/petka/interfaces/map.cpp
index ad8386def1..b00fa60039 100644
--- a/engines/petka/interfaces/map.cpp
+++ b/engines/petka/interfaces/map.cpp
@@ -48,7 +48,7 @@ void InterfaceMap::start(int id) {
const BGInfo *info = g_vm->getQSystem()->_mainInterface->findBGInfo(bg->_id);
for (uint i = 0; i < info->attachedObjIds.size(); ++i) {
QMessageObject *obj = sys->findObject(info->attachedObjIds[i]);
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(obj->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
flc->setFrame(1);
obj->_z = 1;
obj->_x = 0;
@@ -86,7 +86,7 @@ void InterfaceMap::onMouseMove(Common::Point p) {
for (int i = _objs.size() - 1; i > 0; --i) {
QMessageObject *obj = (QMessageObject *)_objs[i];
if (obj->_resourceId != 4901 && obj->_resourceId != _roomResID) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(obj->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
if (flc) {
bool show = false;
if (!found && obj->isInPoint(p)) {
diff --git a/engines/petka/interfaces/panel.cpp b/engines/petka/interfaces/panel.cpp
index bfc17cc2e9..c3a2fea60d 100644
--- a/engines/petka/interfaces/panel.cpp
+++ b/engines/petka/interfaces/panel.cpp
@@ -108,7 +108,7 @@ void InterfacePanel::start(int id) {
const BGInfo *info = sys->_mainInterface->findBGInfo(bg->_id);
for (uint i = 0; i < info->attachedObjIds.size(); ++i) {
QMessageObject *obj = sys->findObject(info->attachedObjIds[i]);
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(obj->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
flc->setFrame(1);
obj->_z = 1;
obj->_x = _objectPoints[i].x;
@@ -234,7 +234,7 @@ void InterfacePanel::onMouseMove(Common::Point p) {
pointIndex = i - 1;
break;
}
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(obj->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
flc->setFrame(frame);
g_vm->videoSystem()->addDirtyRect(_objectPoints[pointIndex], *flc);
}
@@ -246,30 +246,30 @@ void InterfacePanel::onMouseMove(Common::Point p) {
void InterfacePanel::updateSliders() {
applySettings();
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_objs[kSpeechVolumeSliderIndex]->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_objs[kSpeechVolumeSliderIndex]->_resourceId);
flc->setFrame(_speechFrame);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kSpeechVolumeSliderIndex - 1], *flc);
- flc = g_vm->resMgr()->loadFlic(_objs[kMusicVolumeSliderIndex]->_resourceId);
+ flc = g_vm->resMgr()->getFlic(_objs[kMusicVolumeSliderIndex]->_resourceId);
flc->setFrame(_musicFrame);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kMusicVolumeSliderIndex - 1], *flc);
- flc = g_vm->resMgr()->loadFlic(_objs[kSfxVolumeSliderIndex]->_resourceId);
+ flc = g_vm->resMgr()->getFlic(_objs[kSfxVolumeSliderIndex]->_resourceId);
flc->setFrame(_sfxFrame);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kSfxVolumeSliderIndex - 1], *flc);
- flc = g_vm->resMgr()->loadFlic(_objs[kSpeedSliderIndex]->_resourceId);
+ flc = g_vm->resMgr()->getFlic(_objs[kSpeedSliderIndex]->_resourceId);
flc->setFrame(_speedFrame);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kSpeedSliderIndex - 1], *flc);
}
void InterfacePanel::updateSubtitles() {
applySettings();
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_objs[kSubtitleButtonIndex]->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_objs[kSubtitleButtonIndex]->_resourceId);
flc->setFrame(_subtitles == 0 ? 1 : 7);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kSubtitleButtonIndex - 1], *flc);
- flc = g_vm->resMgr()->loadFlic(_objs[kSubtitleLabelIndex]->_resourceId);
+ flc = g_vm->resMgr()->getFlic(_objs[kSubtitleLabelIndex]->_resourceId);
flc->setFrame(_subtitles == 0 ? 1 : 2);
g_vm->videoSystem()->addDirtyRect(_objectPoints[kSubtitleLabelIndex - 1], *flc);
}
diff --git a/engines/petka/interfaces/save_load.cpp b/engines/petka/interfaces/save_load.cpp
index 42c128b4cb..238896aba9 100644
--- a/engines/petka/interfaces/save_load.cpp
+++ b/engines/petka/interfaces/save_load.cpp
@@ -65,7 +65,7 @@ void InterfaceSaveLoad::start(int id) {
bg->_resourceId = kFirstSaveLoadPageId + _page + (_loadMode ? 0 : 5);
resMgr->removeResource(bg->_resourceId);
- auto bmp = resMgr->loadBitmap(bg->_resourceId);
+ auto bmp = resMgr->getSurface(bg->_resourceId);
Graphics::ManagedSurface surf(bmp->w, bmp->h, bmp->format);
surf.blitFrom(*bmp);
diff --git a/engines/petka/interfaces/sequence.cpp b/engines/petka/interfaces/sequence.cpp
index 30dedb6fe8..9e6ee3746c 100644
--- a/engines/petka/interfaces/sequence.cpp
+++ b/engines/petka/interfaces/sequence.cpp
@@ -53,7 +53,7 @@ void InterfaceSequence::start(int id) {
if (info) {
for (uint i = 0; i < info->attachedObjIds.size(); ++i) {
QMessageObject *obj = g_vm->getQSystem()->findObject(info->attachedObjIds[i]);
- g_vm->resMgr()->loadFlic(obj->_resourceId);
+ g_vm->resMgr()->getFlic(obj->_resourceId);
obj->loadSound();
_objs.push_back(obj);
}
diff --git a/engines/petka/interfaces/startup.cpp b/engines/petka/interfaces/startup.cpp
index 31164f8100..b441021558 100644
--- a/engines/petka/interfaces/startup.cpp
+++ b/engines/petka/interfaces/startup.cpp
@@ -100,7 +100,7 @@ void InterfaceStartup::onMouseMove(Common::Point p) {
for (int i = _objs.size() - 1; i > 0; --i) {
QMessageObject *obj = (QMessageObject *)_objs[i];
if (obj->_resourceId != kStartupCursorId && obj->_resourceId != kBackgroundId) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(obj->_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
if (flc) {
bool show = false;
if (!found && obj->isInPoint(p)) {
diff --git a/engines/petka/objects/heroes.cpp b/engines/petka/objects/heroes.cpp
index 724bb4a2e7..f299c927fa 100644
--- a/engines/petka/objects/heroes.cpp
+++ b/engines/petka/objects/heroes.cpp
@@ -93,7 +93,7 @@ void QObjectPetka::processMessage(const QMessage &arg) {
void QObjectPetka::initSurface() {
QManager *resMgr = g_vm->resMgr();
- FlicDecoder *flc = resMgr->loadFlic(_resourceId);
+ FlicDecoder *flc = resMgr->getFlic(_resourceId);
_surfW = flc->getWidth() * _k;
_surfH = flc->getHeight() * _k;
}
@@ -124,7 +124,7 @@ void QObjectPetka::walk(int x, int y) {
_animate = true;
initSurface();
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
flc->setFrame(1);
sub_408940();
@@ -152,7 +152,7 @@ void QObjectPetka::draw() {
_startSound = false;
}
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (!flc) {
return;
}
@@ -175,7 +175,7 @@ void QObjectPetka::setPos(Common::Point p, bool) {
g_vm->videoSystem()->addDirtyRect(dirty);
p.y = MIN<int16>(p.y, 480);
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
_k = calcPerspective(p.y);
@@ -226,7 +226,7 @@ void QObjectPetka::updateWalk() {
if (_heroReaction->messages[i].opcode == kGoTo || _heroReaction->messages[i].opcode == kSetSeq) {
_resourceId = _imageId + _walk->getSpriteId() + 10;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
flc->setFrame(1);
initSurface();
@@ -253,7 +253,7 @@ void QObjectPetka::updateWalk() {
case 2: {
_resourceId = _walk->getSpriteId() + _imageId + 10;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
flc->setFrame(1);
_time = flc->getDelay();
@@ -320,7 +320,7 @@ void QObjectPetka::update(int time) {
_time += time * (g_vm->getQSystem()->_panelInterface->getHeroSpeed() + 50) / 50;
else
_time += time;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc && flc->getFrameCount() != 1) {
if (_sound) {
Common::Rect bounds = flc->getBounds();
@@ -343,7 +343,7 @@ void QObjectPetka::update(int time) {
_time = -10000;
updateWalk();
- flc = g_vm->resMgr()->loadFlic(_resourceId);
+ flc = g_vm->resMgr()->getFlic(_resourceId);
_surfH = flc->getHeight() * _k;
_surfW = flc->getWidth() * _k;
@@ -358,7 +358,7 @@ void QObjectPetka::update(int time) {
bool QObjectPetka::isInPoint(Common::Point p) {
if (!_isActive)
return false;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
const Graphics::Surface *flcSurface = flc->getCurrentFrame();
Common::Rect bounds(_surfW, _surfH);
Graphics::ManagedSurface s(_surfW, _surfH, flcSurface->format);
@@ -372,7 +372,7 @@ bool QObjectPetka::isInPoint(Common::Point p) {
void QObjectPetka::updateZ() {
if (_animate && _isShown && _updateZ) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (_isWalking) {
_z = _walk->currPos().y;
} else {
@@ -382,7 +382,7 @@ void QObjectPetka::updateZ() {
}
void QObjectPetka::sub_408940() {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
QSystem *sys = g_vm->getQSystem();
int xOff = sys->_xOffset;
diff --git a/engines/petka/objects/object.cpp b/engines/petka/objects/object.cpp
index 026c0790dd..2c7d1e7455 100644
--- a/engines/petka/objects/object.cpp
+++ b/engines/petka/objects/object.cpp
@@ -341,7 +341,7 @@ void QMessageObject::play(int id, int type) {
removeSound();
}
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc) {
g_vm->videoSystem()->addDirtyRect(Common::Point(_x, _y), *flc);
}
@@ -350,7 +350,7 @@ void QMessageObject::play(int id, int type) {
loadSound();
- flc = g_vm->resMgr()->loadFlic(id);
+ flc = g_vm->resMgr()->getFlic(id);
flc->setFrame(1);
_time = 0;
_loopedSound = (type == 5);
@@ -425,7 +425,7 @@ bool QObject::isInPoint(Common::Point p) {
if (!_isActive)
return false;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (!flc || !flc->getBounds().contains(p.x - _x, p.y - _y))
return false;
@@ -442,7 +442,7 @@ void QObject::draw() {
if (!_isShown || _resourceId == -1) {
return;
}
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (!flc) {
return;
}
@@ -494,7 +494,7 @@ void QObject::draw() {
void QObject::updateZ() {
if (!_animate || !_isShown || !_updateZ)
return;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc) {
_z = 1;
const Common::Array<Common::Rect> &rects = flc->getMskRects();
@@ -507,7 +507,7 @@ void QObject::updateZ() {
}
void QObject::show(bool v) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc) {
g_vm->videoSystem()->addDirtyRect(Common::Point(_x, _y), *flc);
}
@@ -518,7 +518,7 @@ void QObject::update(int time) {
if (!_animate || !_isShown)
return;
_time += time;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc && flc->getFrameCount() != 1) {
if (_sound) {
Common::Rect bounds = flc->getBounds();
@@ -544,7 +544,7 @@ void QObject::update(int time) {
}
void QObject::setPos(Common::Point p, bool) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc) {
g_vm->videoSystem()->addDirtyMskRects(Common::Point(_x, _y), *flc);
g_vm->videoSystem()->addDirtyMskRects(p, *flc);
diff --git a/engines/petka/objects/object_bg.cpp b/engines/petka/objects/object_bg.cpp
index 19ceff333a..f6b49de862 100644
--- a/engines/petka/objects/object_bg.cpp
+++ b/engines/petka/objects/object_bg.cpp
@@ -86,7 +86,7 @@ void QObjectBG::processMessage(const QMessage &msg) {
}
void QObjectBG::draw() {
- Graphics::Surface *s = g_vm->resMgr()->loadBitmap(_resourceId);
+ Graphics::Surface *s = g_vm->resMgr()->getSurface(_resourceId);
if (!s)
return;
int xOffset = g_vm->getQSystem()->_xOffset;
diff --git a/engines/petka/objects/object_case.cpp b/engines/petka/objects/object_case.cpp
index 51e45bf01d..354b664c62 100644
--- a/engines/petka/objects/object_case.cpp
+++ b/engines/petka/objects/object_case.cpp
@@ -84,7 +84,7 @@ void QObjectCase::update(int time) {
if (!_isShown || _clickedObjIndex == kInvalidButton)
return;
_time += time;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + _clickedObjIndex);
if (flc) {
while (_time >= (int32)flc->getDelay()) {
flc->setFrame(-1);
@@ -99,7 +99,7 @@ void QObjectCase::draw() {
return;
QObject::draw();
if (_clickedObjIndex != kInvalidButton) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + _clickedObjIndex);
Graphics::Surface *s = flc->getCurrentFrame()->convertTo(g_system->getScreenFormat(), flc->getPalette());
QSystem *sys = g_vm->getQSystem();
@@ -145,10 +145,10 @@ bool QObjectCase::isInPoint(Common::Point p) {
void QObjectCase::onMouseMove(Common::Point p) {
p.x -= _x;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(kExitCaseResourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(kExitCaseResourceId);
if (*(const byte *)flc->getCurrentFrame()->getBasePtr(p.x, p.y) != 0) {
if (_clickedObjIndex != kCloseButton && _clickedObjIndex != kInvalidButton) {
- flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
+ flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + _clickedObjIndex);
flc->setFrame(1);
g_vm->videoSystem()->addDirtyMskRects(*flc);
}
@@ -156,14 +156,14 @@ void QObjectCase::onMouseMove(Common::Point p) {
} else {
uint i;
for (i = 0; i < kButtonsCount; ++i) {
- flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + i);
+ flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + i);
if (flc->getMskRects()[0].contains(p)) {
break;
}
}
if (_clickedObjIndex != i && _clickedObjIndex != kInvalidButton) {
- flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
+ flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + _clickedObjIndex);
flc->setFrame(1);
g_vm->videoSystem()->addDirtyMskRects(*flc);
}
@@ -172,7 +172,7 @@ void QObjectCase::onMouseMove(Common::Point p) {
_clickedObjIndex = kInvalidButton;
} else if (i != _clickedObjIndex) {
if ((i != kChapayevButton || g_vm->getQSystem()->getChapay()->_isShown) && (i != kMapButton || g_vm->getQSystem()->_room->_showMap)) {
- flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + i);
+ flc = g_vm->resMgr()->getFlic(kFirstButtonResourceId + i);
g_vm->videoSystem()->addDirtyMskRects(*flc);
_clickedObjIndex = i;
} else {
@@ -224,7 +224,7 @@ void QObjectCase::addItemObjects() {
obj->_x = sys->_xOffset + _itemsLocation[i - _itemIndex].x;
obj->_y = _itemsLocation[i - _itemIndex].y;
obj->_z = kItemZ;
- g_vm->resMgr()->loadFlic(obj->_resourceId);
+ g_vm->resMgr()->getFlic(obj->_resourceId);
objs.push_back(obj);
}
}
diff --git a/engines/petka/objects/object_cursor.cpp b/engines/petka/objects/object_cursor.cpp
index 55d426f927..5f3f9f62c2 100644
--- a/engines/petka/objects/object_cursor.cpp
+++ b/engines/petka/objects/object_cursor.cpp
@@ -45,7 +45,7 @@ QObjectCursor::QObjectCursor() {
Common::Point pos = g_vm->getEventManager()->getMousePos();
_x = pos.x;
_y = pos.y;
- g_vm->resMgr()->loadFlic(kCursorLook);
+ g_vm->resMgr()->getFlic(kCursorLook);
_actionType = kActionLook;
_invObj = nullptr;
_name = "Cursor";
@@ -55,7 +55,7 @@ void QObjectCursor::draw() {
if (!_isShown) {
return;
}
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
const Graphics::Surface *frame = flc->getCurrentFrame();
if (frame) {
Graphics::Surface *s = frame->convertTo(g_system->getScreenFormat(), flc->getPalette());
@@ -75,7 +75,7 @@ void QObjectCursor::draw() {
void QObjectCursor::update(int time) {
if (!_isShown || !_animate)
return;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
_time += time;
while (flc && _time >= (int32)flc->getDelay()) {
flc->setFrame(-1);
@@ -85,7 +85,7 @@ void QObjectCursor::update(int time) {
}
void QObjectCursor::setPos(Common::Point p, bool center) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (!_animate) {
flc->setFrame(1);
}
@@ -107,7 +107,7 @@ void QObjectCursor::setPos(Common::Point p, bool center) {
}
void QObjectCursor::show(bool v) {
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
g_vm->videoSystem()->addDirtyRect(Common::Point(_x, _y), flc->getBounds());
QMessageObject::show(v);
}
diff --git a/engines/petka/objects/object_star.cpp b/engines/petka/objects/object_star.cpp
index c70cc75062..186ac122cc 100644
--- a/engines/petka/objects/object_star.cpp
+++ b/engines/petka/objects/object_star.cpp
@@ -58,7 +58,7 @@ bool QObjectStar::isInPoint(Common::Point p) {
void QObjectStar::onMouseMove(Common::Point p) {
uint frame = (findButtonIndex(p.x - _x, p.y - _y) + 1) % 7 + 1;
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
if (flc && flc->getCurFrame() + 1 != (int32)frame) {
g_vm->videoSystem()->addDirtyRect(Common::Point(_x, _y), *flc);
flc->setFrame(frame);
@@ -89,7 +89,7 @@ void QObjectStar::setPos(Common::Point p, bool) {
if (!_isShown) {
QSystem *sys = g_vm->getQSystem();
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(_resourceId);
p.x = MAX<int16>(p.x - sys->_xOffset - flc->getWidth() / 2, 0);
p.y = MAX<int16>(p.y - flc->getHeight() / 2, 0);
diff --git a/engines/petka/objects/text.cpp b/engines/petka/objects/text.cpp
index 0601111ff6..8689a19c8d 100644
--- a/engines/petka/objects/text.cpp
+++ b/engines/petka/objects/text.cpp
@@ -46,14 +46,14 @@ QText::QText(const Common::U32String &text, uint16 textColor, uint16 outlineColo
rect.bottom += 10;
_rect = Common::Rect((640 - rect.width()) / 2, 479 - rect.height(), 639 - (640 - rect.width()) / 2, 479);
- Graphics::Surface *s = g_vm->resMgr()->findOrCreateSurface(-2, _rect.width(), _rect.height());
+ Graphics::Surface *s = g_vm->resMgr()->getSurface(-2, _rect.width(), _rect.height());
drawText(*s, 0, 630, text, textColor, *font);
drawOutline(s, outlineColor);
}
void QText::draw() {
- const Graphics::Surface *s = g_vm->resMgr()->loadBitmap(-2);
+ const Graphics::Surface *s = g_vm->resMgr()->getSurface(-2);
if (s) {
g_vm->videoSystem()->transBlitFrom(*s, Common::Point((640 - s->w) / 2, 479 - s->h));
}
@@ -135,11 +135,11 @@ QTextDescription::QTextDescription(const Common::U32String &desc, uint32 frame)
_resourceId = -2;
_rect = Common::Rect(0, 0, 640, 480);
- FlicDecoder *flc = g_vm->resMgr()->loadFlic(6008);
+ FlicDecoder *flc = g_vm->resMgr()->getFlic(6008);
flc->setFrame(frame);
const Graphics::Surface *frameS = flc->getCurrentFrame();
- Graphics::Surface *s = g_vm->resMgr()->findOrCreateSurface(-2, 640, 480);
+ Graphics::Surface *s = g_vm->resMgr()->getSurface(-2, 640, 480);
Graphics::Surface *convS = frameS->convertTo(s->format, flc->getPalette());
s->copyRectToSurface(*convS, 0, 0, _rect);
@@ -163,8 +163,8 @@ void QTextDescription::onClick(Common::Point p) {
void QTextDescription::draw() {
QManager *resMgr = g_vm->resMgr();
VideoSystem *videoSys = g_vm->videoSystem();
- Graphics::Surface *s = resMgr->loadBitmap(-2);
- FlicDecoder *flc = resMgr->loadFlic(6008);
+ Graphics::Surface *s = resMgr->getSurface(-2);
+ FlicDecoder *flc = resMgr->getFlic(6008);
for (auto dirty : videoSys->rects()) {
videoSys->transBlitFrom(*s, dirty, dirty, flc->getTransColor(s->format));
@@ -193,7 +193,7 @@ QTextChoice::QTextChoice(const Common::Array<Common::U32String> &choices, uint16
_rect = Common::Rect((640 - w) / 2, 479 - h, 639 - (640 - w) / 2, 479);
- Graphics::Surface *s = g_vm->resMgr()->findOrCreateSurface(-2, w, h);
+ Graphics::Surface *s = g_vm->resMgr()->getSurface(-2, w, h);
int y = 0;
for (uint i = 0; i < _choices.size(); ++i) {
@@ -215,7 +215,7 @@ void QTextChoice::onMouseMove(Common::Point p) {
}
if (newChoice != _activeChoice) {
- Graphics::Surface *s = g_vm->resMgr()->loadBitmap(-2);
+ Graphics::Surface *s = g_vm->resMgr()->getSurface(-2);
Common::ScopedPtr<Graphics::Font> font(Graphics::loadTTFFontFromArchive("FreeSans.ttf", 20));
s->fillRect(Common::Rect(s->w, s->h), 0);
diff --git a/engines/petka/petka.cpp b/engines/petka/petka.cpp
index 7c25be93da..4ba7510887 100644
--- a/engines/petka/petka.cpp
+++ b/engines/petka/petka.cpp
@@ -92,6 +92,7 @@ Common::Error PetkaEngine::run() {
_fileMgr.reset(new FileMgr());
_soundMgr.reset(new SoundMgr(*this));
_vsys.reset(new VideoSystem(*this));
+ _resMgr.reset(new QManager(*this));
loadPart(0);
diff --git a/engines/petka/q_manager.cpp b/engines/petka/q_manager.cpp
index 7467510009..f06ea45cb0 100644
--- a/engines/petka/q_manager.cpp
+++ b/engines/petka/q_manager.cpp
@@ -31,25 +31,16 @@
#include "petka/flc.h"
#include "petka/q_manager.h"
-#include "petka/q_system.h"
#include "petka/petka.h"
namespace Petka {
-const uint32 kHeaderSize = 14 + 40;
-const uint32 kAdditionalDataSize = 8;
-
QManager::QManager(PetkaEngine &vm)
: _vm(vm) {}
-QManager::~QManager() {
- for (Common::HashMap<uint32, QResource>::iterator it = _resourceMap.begin(); it != _resourceMap.end(); ++it) {
- destructResourceContent(it->_value);
- }
-}
-
bool QManager::init() {
clear();
+
Common::ScopedPtr<Common::SeekableReadStream> stream(_vm.openFile("resource.qrc", true));
if (!stream) {
return false;
@@ -70,10 +61,7 @@ bool QManager::init() {
}
Common::String QManager::findResourceName(uint32 id) const {
- if (_nameMap.contains(id)) {
- return _nameMap.getVal(id);
- }
- return "";
+ return _nameMap.contains(id) ? _nameMap.getVal(id) : "";
}
Common::String QManager::findSoundName(uint32 id) const {
@@ -88,43 +76,30 @@ Common::String QManager::findSoundName(uint32 id) const {
void QManager::removeResource(uint32 id) {
if (_resourceMap.contains(id)) {
- destructResourceContent(_resourceMap.getVal(id));
_resourceMap.erase(id);
}
}
void QManager::clearUnneeded() {
- for (Common::HashMap<uint32, QResource>::iterator it = _resourceMap.begin(); it != _resourceMap.end(); ++it) {
+ for (auto it = _resourceMap.begin(); it != _resourceMap.end(); ++it) {
if (!_isAlwaysNeededMap.getVal(it->_key)) {
- destructResourceContent(it->_value);
_resourceMap.erase(it);
}
}
}
-Graphics::Surface *QManager::findOrCreateSurface(uint32 id, uint16 w, uint16 h) {
+Graphics::Surface *QManager::getSurface(uint32 id, uint16 w, uint16 h) {
if (_resourceMap.contains(id)) {
QResource &res = _resourceMap.getVal(id);
- if (res.type != QResource::kSurface) {
- return nullptr;
- }
- return res.surface;
+ return res.type == QResource::kSurface ? res.surface : nullptr;
}
QResource &res = _resourceMap.getVal(id);
res.type = QResource::kSurface;
res.surface = new Graphics::Surface;
res.surface->create(w, h, _vm._system->getScreenFormat());
- return res.surface;
-}
-void QManager::destructResourceContent(QResource &res) {
- if (res.type == QResource::kSurface) {
- res.surface->free();
- delete res.surface;
- } else {
- delete res.flcDecoder;
- }
+ return res.surface;
}
Common::SeekableReadStream *QManager::loadFileStream(uint32 id) const {
@@ -132,13 +107,10 @@ Common::SeekableReadStream *QManager::loadFileStream(uint32 id) const {
return name.empty() ? nullptr : _vm.openFile(name, false);
}
-Graphics::Surface *QManager::loadBitmap(uint32 id) {
+Graphics::Surface *QManager::getSurface(uint32 id) {
if (_resourceMap.contains(id)) {
QResource &res = _resourceMap.getVal(id);
- if (res.type != QResource::kSurface) {
- return nullptr;
- }
- return res.surface;
+ return res.type == QResource::kSurface ? res.surface : nullptr;
}
Common::ScopedPtr<Common::SeekableReadStream> stream(loadFileStream(id));
@@ -148,25 +120,19 @@ Graphics::Surface *QManager::loadBitmap(uint32 id) {
Graphics::Surface *s = loadBitmapSurface(*stream);
if (s) {
- s->convertToInPlace(g_system->getScreenFormat());
- _vm.getQSystem()->_sceneWidth = s->w;
- _vm.getQSystem()->_xOffset = 0;
-
QResource &res = _resourceMap.getVal(id);
res.type = QResource::kSurface;
res.surface = s;
return res.surface;
}
+
return nullptr;
}
-FlicDecoder *QManager::loadFlic(uint32 id) {
+FlicDecoder *QManager::getFlic(uint32 id) {
if (_resourceMap.contains(id)) {
QResource &res = _resourceMap.getVal(id);
- if (res.type != QResource::kFlic) {
- return nullptr;
- }
- return res.flcDecoder;
+ return res.type == QResource::kFlic ? res.flcDecoder : nullptr;
}
Common::String name = findResourceName(id);
@@ -174,28 +140,31 @@ FlicDecoder *QManager::loadFlic(uint32 id) {
if (!stream) {
return nullptr;
}
+
name.erase(name.size() - 3, 3);
name.toUppercase();
name += "MSK";
FlicDecoder *flc = new FlicDecoder;
flc->load(stream, _vm.openFile(name, false));
+
QResource &res = _resourceMap.getVal(id);
res.type = QResource::kFlic;
res.flcDecoder = flc;
+
return res.flcDecoder;
}
void QManager::clear() {
- for (Common::HashMap<uint32, QResource>::iterator it = _resourceMap.begin(); it != _resourceMap.end(); ++it) {
- destructResourceContent(it->_value);
- }
_resourceMap.clear();
_nameMap.clear();
_isAlwaysNeededMap.clear();
}
Graphics::Surface *QManager::loadBitmapSurface(Common::SeekableReadStream &stream) {
+ const uint32 kHeaderSize = 14 + 40;
+ const uint32 kAdditionalDataSize = 8;
+
if (stream.readByte() != 'B')
return nullptr;
@@ -248,7 +217,17 @@ Graphics::Surface *QManager::loadBitmapSurface(Common::SeekableReadStream &strea
Image::BitmapDecoder decoder;
if (!decoder.loadStream(convBmpStream))
return nullptr;
+
return decoder.getSurface()->convertTo(g_system->getScreenFormat(), decoder.getPalette());
}
+QManager::QResource::~QResource() {
+ if (type == QResource::kSurface && surface) {
+ surface->free();
+ delete surface;
+ } else {
+ delete flcDecoder;
+ }
+}
+
} // End of namespace Petka
diff --git a/engines/petka/q_manager.h b/engines/petka/q_manager.h
index aad3658d89..dbb67fe109 100644
--- a/engines/petka/q_manager.h
+++ b/engines/petka/q_manager.h
@@ -39,39 +39,39 @@ class PetkaEngine;
class FlicDecoder;
-struct QResource {
- union {
- Graphics::Surface *surface;
- FlicDecoder *flcDecoder;
- };
- enum ResType {
- kSurface,
- kFlic
- } type;
-};
-
class QManager {
public:
explicit QManager(PetkaEngine &vm);
- ~QManager();
bool init();
Common::String findResourceName(uint32 id) const;
Common::String findSoundName(uint32 id) const;
- Graphics::Surface *findOrCreateSurface(uint32 id, uint16 w, uint16 h);
- Graphics::Surface *loadBitmap(uint32 id);
- FlicDecoder *loadFlic(uint32 id);
+ Graphics::Surface *getSurface(uint32 id, uint16 w, uint16 h);
+ Graphics::Surface *getSurface(uint32 id);
+ FlicDecoder *getFlic(uint32 id);
void removeResource(uint32 id);
void clearUnneeded();
void clear();
private:
+ struct QResource {
+ union {
+ Graphics::Surface *surface;
+ FlicDecoder *flcDecoder;
+ };
+ enum ResType {
+ kSurface,
+ kFlic
+ } type;
+
+ ~QResource();
+ };
+
Common::SeekableReadStream *loadFileStream(uint32 id) const;
- static void destructResourceContent(QResource &resource);
static Graphics::Surface *loadBitmapSurface(Common::SeekableReadStream &stream);
private:
diff --git a/engines/petka/q_system.cpp b/engines/petka/q_system.cpp
index 8cd5283ebf..8990ddf45c 100644
--- a/engines/petka/q_system.cpp
+++ b/engines/petka/q_system.cpp
@@ -312,8 +312,8 @@ void QSystem::save(Common::WriteStream *s) {
QObjectPetka *petka = getPetka();
QObjectChapayev *chapayev = getChapay();
- FlicDecoder *petkaFlc = _vm.resMgr()->loadFlic(petka->_resourceId);
- FlicDecoder *chapayFlc = _vm.resMgr()->loadFlic(chapayev->_resourceId);
+ FlicDecoder *petkaFlc = _vm.resMgr()->getFlic(petka->_resourceId);
+ FlicDecoder *chapayFlc = _vm.resMgr()->getFlic(chapayev->_resourceId);
s->writeSint32LE(petka->_x - petkaFlc->getCurrentFrame()->w * petka->_k * -0.5);
s->writeSint32LE(petka->_y + petkaFlc->getCurrentFrame()->h * petka->_k);
More information about the Scummvm-git-logs
mailing list