mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-24 05:01:43 +00:00
314 lines
9.2 KiB
C++
314 lines
9.2 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 2
|
|
* 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "titanic/pet_control/pet_sound.h"
|
|
#include "titanic/pet_control/pet_control.h"
|
|
#include "titanic/pet_control/pet_real_life.h"
|
|
#include "titanic/game_manager.h"
|
|
#include "titanic/titanic.h"
|
|
#include "common/config-manager.h"
|
|
|
|
namespace Titanic {
|
|
|
|
CPetSound::CPetSound() : CPetGlyph(), _draggingSlider(nullptr), _draggingSliderNum(MASTER_SLIDER) {
|
|
}
|
|
|
|
bool CPetSound::setup(CPetControl *petControl, CPetGlyphs *owner) {
|
|
CPetGlyph::setup(petControl, owner);
|
|
|
|
_masterVolume.setOrientation(ORIENTATION_HORIZONTAL);
|
|
_masterVolume.setBounds(Rect(17, 0, 147, 15));
|
|
_masterVolume.setSlidingBounds(Rect(35, 5, 127, 11));
|
|
_masterVolume.setThumbSize(Point(25, 15));
|
|
_masterVolume.translate(Point(415, 376));
|
|
|
|
_musicVolume.setOrientation(ORIENTATION_HORIZONTAL);
|
|
_musicVolume.setBounds(Rect(17, 20, 147, 35));
|
|
_musicVolume.setSlidingBounds(Rect(35, 25, 127, 31));
|
|
_musicVolume.setThumbSize(Point(25, 15));
|
|
_musicVolume.translate(Point(415, 376));
|
|
|
|
_parrotVolume.setOrientation(ORIENTATION_HORIZONTAL);
|
|
_parrotVolume.setBounds(Rect(17, 40, 147, 55));
|
|
_parrotVolume.setSlidingBounds(Rect(35, 45, 127, 51));
|
|
_parrotVolume.setThumbSize(Point(25, 15));
|
|
_parrotVolume.translate(Point(415, 376));
|
|
|
|
_speechVolume.setOrientation(ORIENTATION_HORIZONTAL);
|
|
_speechVolume.setBounds(Rect(17, 60, 147, 75));
|
|
_speechVolume.setSlidingBounds(Rect(35, 65, 127, 71));
|
|
_speechVolume.setThumbSize(Point(25, 15));
|
|
_speechVolume.translate(Point(415, 376));
|
|
|
|
_element.setBounds(Rect(0, 0, 165, 77));
|
|
_element.translate(Point(415, 376));
|
|
|
|
Rect rect(0, 0, 88, 16);
|
|
rect.translate(320, 376);
|
|
_textMasterVolume.setBounds(rect);
|
|
_textMasterVolume.resize(3);
|
|
_textMasterVolume.setHasBorder(false);
|
|
_textMasterVolume.setText(MASTER_VOLUME);
|
|
|
|
rect.translate(0, 20);
|
|
_textMusicVolume.setBounds(rect);
|
|
_textMusicVolume.resize(3);
|
|
_textMusicVolume.setHasBorder(false);
|
|
_textMusicVolume.setText(MUSIC_VOLUME);
|
|
|
|
rect.translate(0, 20);
|
|
_textParrotVolume.setBounds(rect);
|
|
_textParrotVolume.resize(3);
|
|
_textParrotVolume.setHasBorder(false);
|
|
_textParrotVolume.setText(PARROT_VOLUME);
|
|
|
|
rect.translate(0, 20);
|
|
_textSpeechVolume.setBounds(rect);
|
|
_textSpeechVolume.resize(3);
|
|
_textSpeechVolume.setHasBorder(false);
|
|
_textSpeechVolume.setText(SPEECH_VOLUME);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CPetSound::reset() {
|
|
CPetControl *pet = getPetControl();
|
|
if (pet) {
|
|
setName("PetSound", pet);
|
|
_element.reset("PetVolChannels", pet, MODE_UNSELECTED);
|
|
_musicVolume.setupThumb2("PetVolSlug", pet);
|
|
_masterVolume.setupThumb2("PetVolSlug", pet);
|
|
_parrotVolume.setupThumb2("PetVolSlug", pet);
|
|
_speechVolume.setupThumb2("PetVolSlug", pet);
|
|
|
|
CPetSection *section = getPetSection();
|
|
uint col = section->getColor(0);
|
|
_textMusicVolume.setLineColor(0, col);
|
|
_textMasterVolume.setLineColor(0, col);
|
|
_textParrotVolume.setLineColor(0, col);
|
|
_textSpeechVolume.setLineColor(0, col);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CPetSound::setSliders() {
|
|
// Get the mute settings
|
|
bool muteAll = ConfMan.hasKey("mute") ? ConfMan.getBool("mute") : false;
|
|
bool musicMute = muteAll || (ConfMan.hasKey("music_mute") && ConfMan.getBool("music_mute"));
|
|
bool sfxMute = muteAll || (ConfMan.hasKey("sfx_mute") && ConfMan.getBool("sfx_mute"));
|
|
bool speechMute = muteAll || (ConfMan.hasKey("speech_mute") && ConfMan.getBool("speech_mute"));
|
|
|
|
// Get the volume levels
|
|
uint musicVol = musicMute ? 0 : MIN(255, ConfMan.getInt("music_volume"));
|
|
uint parrotVol = sfxMute ? 0 : MIN(255, ConfMan.getInt("sfx_volume"));
|
|
uint speechVol = speechMute ? 0 : MIN(255, ConfMan.getInt("speech_volume"));
|
|
uint masterVol = MAX(musicVol, MAX(parrotVol, speechVol));
|
|
|
|
const double FACTOR = 1.0 / 255.0;
|
|
_masterVolume.setSliderOffset(masterVol * FACTOR);
|
|
_musicVolume.setSliderOffset(musicVol * FACTOR);
|
|
_parrotVolume.setSliderOffset(parrotVol * FACTOR);
|
|
_speechVolume.setSliderOffset(speechVol * FACTOR);
|
|
}
|
|
|
|
void CPetSound::sliderChanged(double offset, SliderType sliderNum) {
|
|
uint newVol = (uint)(offset * 255.0);
|
|
|
|
switch (sliderNum) {
|
|
case MASTER_SLIDER:
|
|
ConfMan.setBool("music_mute", false);
|
|
ConfMan.setBool("sfx_mute", false);
|
|
ConfMan.setBool("sfx_mute", false);
|
|
ConfMan.setInt("music_volume", newVol);
|
|
ConfMan.setInt("sfx_volume", newVol);
|
|
ConfMan.setInt("speech_volume", newVol);
|
|
|
|
_musicVolume.setSliderOffset(newVol * 0.01);
|
|
_parrotVolume.setSliderOffset(newVol * 0.01);
|
|
_speechVolume.setSliderOffset(newVol * 0.01);
|
|
break;
|
|
case MUSIC_SLIDER:
|
|
ConfMan.setBool("music_mute", false);
|
|
ConfMan.setInt("music_volume", newVol);
|
|
break;
|
|
case PARROT_SLIDER:
|
|
ConfMan.setBool("sfx_mute", false);
|
|
ConfMan.setInt("sfx_volume", newVol);
|
|
break;
|
|
case SPEECH_SLIDER:
|
|
ConfMan.setBool("speech_mute", false);
|
|
ConfMan.setInt("speech_volume", newVol);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
ConfMan.setBool("mute", false);
|
|
g_vm->syncSoundSettings();
|
|
}
|
|
|
|
void CPetSound::draw2(CScreenManager *screenManager) {
|
|
_element.draw(screenManager);
|
|
|
|
_musicVolume.draw(screenManager);
|
|
_masterVolume.draw(screenManager);
|
|
_parrotVolume.draw(screenManager);
|
|
_speechVolume.draw(screenManager);
|
|
|
|
_textMusicVolume.draw(screenManager);
|
|
_textMasterVolume.draw(screenManager);
|
|
_textParrotVolume.draw(screenManager);
|
|
_textSpeechVolume.draw(screenManager);
|
|
}
|
|
|
|
bool CPetSound::MouseButtonDownMsg(const Point &pt) {
|
|
if (_musicVolume.checkThumb(pt) || _masterVolume.checkThumb(pt) ||
|
|
_speechVolume.checkThumb(pt))
|
|
return true;
|
|
|
|
if (_parrotVolume.checkThumb(pt)) {
|
|
CPetControl *pet = getPetControl();
|
|
if (pet)
|
|
pet->playSound(2);
|
|
|
|
return true;
|
|
}
|
|
|
|
Rect rectLeft(0, 0, 10, 11);
|
|
Rect rectRight(0, 0, 10, 11);
|
|
rectLeft.translate(415, 379);
|
|
rectRight.translate(567, 378);
|
|
|
|
CPetSlider *sliders[4] = { &_masterVolume, &_musicVolume, &_parrotVolume, &_speechVolume };
|
|
for (int idx = MASTER_SLIDER; idx <= SPEECH_SLIDER; ++idx) {
|
|
CPetSlider *slider = sliders[idx];
|
|
const bool isLeft = rectLeft.contains(pt);
|
|
const bool isRight = rectRight.contains(pt);
|
|
double offset = 0.0;
|
|
|
|
if (isLeft) {
|
|
slider->stepPosition(-1);
|
|
offset = slider->getOffsetPixels();
|
|
} else if (isRight) {
|
|
slider->stepPosition(1);
|
|
offset = slider->getOffsetPixels();
|
|
}
|
|
|
|
if (isLeft || isRight) {
|
|
sliderChanged(offset, (SliderType)idx);
|
|
return true;
|
|
}
|
|
|
|
// Move to next slider row
|
|
rectLeft.translate(0, 20);
|
|
rectRight.translate(0, 20);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CPetSound::MouseDragStartMsg(CMouseDragStartMsg *msg) {
|
|
if (_masterVolume.resetThumbFocus()) {
|
|
_draggingSlider = &_masterVolume;
|
|
getOwner()->startDragging(this, msg);
|
|
_draggingSliderNum = MASTER_SLIDER;
|
|
return true;
|
|
} else if (_musicVolume.resetThumbFocus()) {
|
|
_draggingSlider = &_musicVolume;
|
|
getOwner()->startDragging(this, msg);
|
|
_draggingSliderNum = MUSIC_SLIDER;
|
|
return true;
|
|
} else if (_parrotVolume.resetThumbFocus()) {
|
|
_draggingSlider = &_parrotVolume;
|
|
getOwner()->startDragging(this, msg);
|
|
_draggingSliderNum = PARROT_SLIDER;
|
|
return true;
|
|
} else if (_speechVolume.resetThumbFocus()) {
|
|
_draggingSlider = &_speechVolume;
|
|
getOwner()->startDragging(this, msg);
|
|
_draggingSliderNum = SPEECH_SLIDER;
|
|
return true;
|
|
}
|
|
|
|
_draggingSlider = nullptr;
|
|
return false;
|
|
}
|
|
|
|
bool CPetSound::MouseDragMoveMsg(CMouseDragMoveMsg *msg) {
|
|
if (!_draggingSlider)
|
|
return false;
|
|
|
|
if (_draggingSlider->MouseDragMoveMsg(msg->_mousePos)) {
|
|
double offset = _draggingSlider->getOffsetPixels();
|
|
sliderChanged(offset, _draggingSliderNum);
|
|
getPetControl()->makeDirty();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CPetSound::MouseDragEndMsg(CMouseDragEndMsg *msg) {
|
|
if (!_draggingSlider)
|
|
return false;
|
|
|
|
// Flush the changed settings
|
|
ConfMan.flushToDisk();
|
|
|
|
bool result = _draggingSlider->MouseDragEndMsg(msg->_mousePos);
|
|
getOwner()->endDragging();
|
|
|
|
return result;
|
|
}
|
|
|
|
bool CPetSound::MouseButtonUpMsg(const Point &pt) {
|
|
SliderType sliderNum = MASTER_SLIDER;
|
|
CPetSlider *slider = nullptr;
|
|
|
|
if (_masterVolume.MouseButtonUpMsg(pt)) {
|
|
sliderNum = MASTER_SLIDER;
|
|
slider = &_masterVolume;
|
|
} else if (_musicVolume.MouseButtonUpMsg(pt)) {
|
|
sliderNum = MUSIC_SLIDER;
|
|
slider = &_musicVolume;
|
|
} else if (_parrotVolume.MouseButtonUpMsg(pt)) {
|
|
sliderNum = PARROT_SLIDER;
|
|
slider = &_parrotVolume;
|
|
} else if (_speechVolume.MouseButtonUpMsg(pt)) {
|
|
sliderNum = SPEECH_SLIDER;
|
|
slider = &_speechVolume;
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
double offset = slider->getOffsetPixels();
|
|
sliderChanged(offset, sliderNum);
|
|
return true;
|
|
}
|
|
|
|
void CPetSound::getTooltip(CTextControl *text) {
|
|
text->setText(CHANGE_VOLUME_SETTINGS);
|
|
}
|
|
|
|
} // End of namespace Titanic
|