scummvm/engines/petka/interfaces/panel.cpp
2022-02-10 14:48:34 +02:00

346 lines
8.7 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/config-manager.h"
#include "common/system.h"
#include "petka/objects/object_cursor.h"
#include "petka/objects/object_case.h"
#include "petka/petka.h"
#include "petka/q_system.h"
#include "petka/flc.h"
#include "petka/video.h"
#include "petka/q_manager.h"
#include "petka/interfaces/main.h"
#include "petka/interfaces/save_load.h"
#include "petka/interfaces/panel.h"
namespace {
// ПАНЕЛЬ УПРАВЛЕНИЯ
const char *const kPanelObjName = "\xCF\xC0\xCD\xC5\xCB\xDC\x20\xD3\xCF\xD0\xC0\xC2\xCB\xC5\xCD\xC8\xDF";
const uint kNewGameButtonIndex = 1;
const uint kLoadButtonIndex = 2;
const uint kContinueButtonIndex = 3;
const uint kExitButtonIndex = 4;
const uint kSaveButtonIndex = 5;
const uint kSafeObjectIndex = 6;
const uint kSfxLabelIndex = 7;
const uint kSubtitleButtonIndex = 8;
const uint kSfxVolumeSliderIndex = 9;
const uint kSpeedSliderIndex = 10;
const uint kMusicLabelIndex = 11;
const uint kSubtitleLabelIndex = 12;
const uint kSpeechLabelIndex = 13;
const uint kSpeedLabelIndex = 14;
const uint kSpeechVolumeSliderIndex = 15;
const uint kMusicVolumeSliderIndex = 16;
const uint kDecSpeechButtonIndex = 17;
const uint kIncSpeechButtonIndex = 18;
const uint kDecMusicButtonIndex = 19;
const uint kIncMusicButtonIndex = 20;
const uint kDecSfxButtonIndex = 21;
const uint kIncSfxButtonIndex = 22;
const uint kDecSpeedButtonIndex = 23;
const uint kIncSpeedButtonIndex = 24;
Common::Point getObjectPos(uint index)
{
switch (index) {
case kNewGameButtonIndex:
return {0, 2};
case kLoadButtonIndex:
return {5, 70};
case kContinueButtonIndex:
return {5, 136};
case kExitButtonIndex:
return {22, 328};
case kSaveButtonIndex:
return {87, 224};
case kSafeObjectIndex:
return {118, 395};
case kSfxLabelIndex:
return {467, 71};
case kSubtitleButtonIndex:
return {432, 144};
case kSfxVolumeSliderIndex:
return {428, 29};
case kSpeedSliderIndex:
return {434, 170};
case kMusicLabelIndex:
return {297, 214};
case kSubtitleLabelIndex:
return {470, 139};
case kSpeechLabelIndex:
return {318, 87};
case kSpeedLabelIndex:
return {468, 172};
case kSpeechVolumeSliderIndex:
return {262, 31};
case kMusicVolumeSliderIndex:
return {231, 137};
// case kDecSpeechButtonIndex:
// case kIncSpeechButtonIndex:
// case kDecMusicButtonIndex:
// case kIncMusicButtonIndex:
// case kDecSfxButtonIndex:
// case kIncSfxButtonIndex:
// case kDecSpeedButtonIndex:
// case kIncSpeedButtonIndex:
default:
return {0, 0};
}
}
}
namespace Petka {
InterfacePanel::InterfacePanel() {
readSettings();
}
void InterfacePanel::start(int id) {
QSystem *sys = g_vm->getQSystem();
sys->getCase()->show(false);
g_vm->videoSystem()->makeAllDirty();
g_vm->videoSystem()->update();
InterfaceSaveLoad::saveScreen();
QObjectBG *bg = (QObjectBG *)sys->findObject(kPanelObjName);
const BGInfo *info = sys->_mainInterface->findBGInfo(bg->_id);
_objs.reserve(info->attachedObjIds.size() + 1);
_objs.push_back(bg);
for (uint i = 0; i < info->attachedObjIds.size(); ++i) {
QMessageObject *obj = sys->findObject(info->attachedObjIds[i]);
FlicDecoder *flc = g_vm->resMgr()->getFlic(obj->_resourceId);
flc->setFrame(1);
const auto pos = getObjectPos(i + 1);
obj->_x = pos.x;
obj->_y = pos.y;
obj->_z = 1;
obj->_frame = 1;
obj->_animate = false;
_objs.push_back(obj);
}
SubInterface::start(id);
onSettingsChanged();
sys->getCursor()->_animate = true;
}
void InterfacePanel::onLeftButtonDown(Common::Point p) {
int i = 0;
for (i = _objs.size() - 1; i > 0; --i) {
if (_objs[i]->isInPoint(p)) {
break;
}
}
switch (i) {
case kNewGameButtonIndex:
g_vm->loadPart(1);
break;
case kLoadButtonIndex:
stop();
g_vm->getQSystem()->_saveLoadInterface->start(kLoadMode);
break;
case kContinueButtonIndex:
stop();
break;
case kExitButtonIndex:
g_system->quit();
break;
case kSaveButtonIndex:
stop();
g_vm->getQSystem()->_saveLoadInterface->start(kSaveMode);
break;
case kSubtitleButtonIndex:
_subtitles = !_subtitles;
updateSubtitles();
break;
case kDecSpeechButtonIndex:
_speechFrame -= 5;
updateSliders();
break;
case kIncSpeechButtonIndex:
_speechFrame += 5;
updateSliders();
break;
case kDecMusicButtonIndex:
_musicFrame -= 5;
updateSliders();
break;
case kIncMusicButtonIndex:
_musicFrame += 5;
updateSliders();
break;
case kDecSfxButtonIndex:
_sfxFrame -= 5;
updateSliders();
break;
case kIncSfxButtonIndex:
_sfxFrame += 5;
updateSliders();
break;
case kDecSpeedButtonIndex:
_speedFrame -= 5;
updateSliders();
break;
case kIncSpeedButtonIndex:
_speedFrame += 5;
updateSliders();
break;
default:
break;
}
}
void InterfacePanel::onMouseMove(Common::Point p) {
bool found = false;
for (uint i = _objs.size() - 1; i > 0; --i) {
QMessageObject *obj = (QMessageObject *)_objs[i];
byte frame = 1;
if (!found && obj->isInPoint(p)) {
found = true;
if ((i >= kNewGameButtonIndex && i <= kSaveButtonIndex) || (i >= kDecSpeechButtonIndex && i <= kIncSpeedButtonIndex)) {
frame = 2;
}
}
if (obj->_frame == frame)
continue;
obj->_frame = frame;
switch (i) {
case kDecSpeechButtonIndex:
case kIncSpeechButtonIndex:
updateSprite(kSpeechLabelIndex, frame);
break;
case kDecMusicButtonIndex:
case kIncMusicButtonIndex:
updateSprite(kMusicLabelIndex, frame);
break;
case kDecSfxButtonIndex:
case kIncSfxButtonIndex:
updateSprite(kSfxLabelIndex, frame);
break;
case kIncSpeedButtonIndex:
case kDecSpeedButtonIndex:
updateSprite(kSpeedLabelIndex, frame);
break;
default:
updateSprite(i, frame);
break;
}
}
QObjectCursor *cursor = g_vm->getQSystem()->getCursor();
cursor->_isShown = true;
cursor->setPos(p, false);
}
void InterfacePanel::updateSliders() {
applySettings();
updateSprite(kSpeechVolumeSliderIndex, _speechFrame);
updateSprite(kMusicVolumeSliderIndex, _musicFrame);
updateSprite(kSfxVolumeSliderIndex, _sfxFrame);
updateSprite(kSpeedSliderIndex, _speedFrame);
}
void InterfacePanel::updateSubtitles() {
applySettings();
updateSprite(kSubtitleButtonIndex, _subtitles == 0 ? 1 : 7);
updateSprite(kSubtitleLabelIndex, _subtitles == 0 ? 1 : 2);
}
void InterfacePanel::readSettings() {
_speechFrame = 1 + 30 * ConfMan.getInt("speech_volume") / 255;
_musicFrame = 1 + 40 * ConfMan.getInt("music_volume") / 255;
_sfxFrame = 1 + 30 * ConfMan.getInt("sfx_volume") / 255;
_subtitles = ConfMan.getBool("subtitles");
_speedFrame = 1 + ConfMan.getInt("petka_speed") / 4;
}
void InterfacePanel::applySettings() {
_speechFrame = CLIP<int>(_speechFrame, 1, 31);
_musicFrame = CLIP<int>(_musicFrame, 1, 41);
_sfxFrame = CLIP<int>(_sfxFrame, 1, 31);
_speedFrame = CLIP<int>(_speedFrame, 1, 26);
const auto speechFrame = _speechFrame;
const auto musicFrame = _musicFrame;
const auto sfxFrame = _sfxFrame;
const auto speedFrame = _speedFrame;
const auto subtitles = _subtitles;
readSettings();
if (speechFrame != _speechFrame) {
ConfMan.setInt("speech_volume", 255 * (speechFrame - 1) / (31 - 1));
}
if (musicFrame != _musicFrame) {
ConfMan.setInt("music_volume", 255 * (musicFrame - 1) / (41 - 1));
}
if (sfxFrame != _sfxFrame) {
ConfMan.setInt("sfx_volume", 255 * (sfxFrame - 1) / (31 - 1));
}
ConfMan.setBool("subtitles", subtitles);
if (speedFrame != _speedFrame) {
ConfMan.setInt("petka_speed", 4 * (speedFrame - 1));
}
readSettings();
ConfMan.flushToDisk();
g_vm->syncSoundSettings();
}
void InterfacePanel::onRightButtonDown(Common::Point p) {
stop();
}
void InterfacePanel::updateSprite(uint index, uint frame) const {
const auto *object = (QMessageObject *)(_objs[index]);
FlicDecoder *flc = g_vm->resMgr()->getFlic(object->_resourceId);
flc->setFrame(frame);
g_vm->videoSystem()->addDirtyRect(Common::Point(object->_x, object->_y), *flc);
}
int InterfacePanel::getHeroSpeed() {
return (_speedFrame * 100 - 100) / 25;
}
void InterfacePanel::onSettingsChanged() {
readSettings();
updateSliders();
updateSubtitles();
}
} // End of namespace Petka