scummvm/engines/cge2/toolbar.cpp
Tomasz Długosz eaab877d66 JANITORIAL: fix the name of original author of cge and cge2
The first name is Janusz, not Janus.
The correct name was used in AUTHORS and credits.
In case of doubts, see his personal webpage: https://www.jbw.pl/ - name is in the page footer
2020-04-18 20:59:57 +02:00

225 lines
6.0 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.
*
*/
/*
* This code is based on original Sfinx source code
* Copyright (c) 1994-1997 Janusz B. Wisniewski and L.K. Avalon
*/
#include "sound.h"
#include "common/config-manager.h"
#include "cge2/cge2.h"
#include "cge2/events.h"
#include "cge2/vmenu.h"
#include "cge2/text.h"
#include "cge2/cge2_main.h"
namespace CGE2 {
#define kSoundNumToStateRate 25.7
// == 257 / 10; where 10 equals to the volume switches' number of states [0..9]
// and ScummVM has a scale of 257 different values for setting sounds.
#define kSoundStateToNumRate 28.45
// == 256 / 9 + 0.1; where 256 is the positive range of numbers we can set the volume to
// and the 10 states of a switch cut this range up to 9 equally big parts.
// We don't take into account 0 regarding the 256 different values (it would be the 257th),
// since 0 * x == 0.
// 0.1 is only for correct rounding at the 10th state.
void CGE2Engine::optionTouch(int opt, uint16 mask) {
bool notMuted = !ConfMan.getBool("mute");
switch (opt) {
case 1:
if (mask & kMouseLeftUp)
switchColorMode();
break;
case 2:
if ((mask & kMouseLeftUp) && notMuted)
switchMusic();
break;
case 3:
if (mask & kMouseLeftUp)
quit();
break;
case 4:
if ((mask & (kMouseLeftUp | kMouseRightUp)) && notMuted)
setVolume(opt - 4, (mask & kMouseLeftUp) ? 1 : -1);
break;
case 5:
if ((mask & (kMouseLeftUp | kMouseRightUp)) && notMuted)
setVolume(opt - 4, (mask & kMouseLeftUp) ? 1 : -1);
break;
case 8:
if ((mask & kMouseLeftUp) && notMuted)
switchCap();
break;
case 9:
if ((mask & kMouseLeftUp) && notMuted)
switchVox();
break;
default:
break;
}
}
void CGE2Engine::switchColorMode() {
_commandHandlerTurbo->addCommand(kCmdSeq, 121, _vga->_mono = !_vga->_mono, nullptr);
ConfMan.setBool("enable_color_blind", _vga->_mono);
ConfMan.flushToDisk();
keyClick();
_vga->setColors(_vga->_sysPal, 64);
}
void CGE2Engine::switchMusic() {
_music = !_music;
_mixer->muteSoundType(Audio::Mixer::kMusicSoundType, !_music);
_commandHandlerTurbo->addCommand(kCmdSeq, kMusicRef, _music, nullptr);
keyClick();
_commandHandlerTurbo->addCommand(kCmdMidi, -1, _music ? (_now << 8) : -1, nullptr);
}
void CGE2Engine::quit() {
if (_commandHandler->idle()) {
if (VMenu::_addr) {
_commandHandlerTurbo->addCommand(kCmdKill, -1, 0, VMenu::_addr);
ReturnToGameChoice rqsChoice(this);
rqsChoice.proc();
} else {
Common::Array<Choice *> quitMenu; // Deleted in VMenu's destructor.
quitMenu.push_back(new ExitGameChoice(this));
quitMenu.push_back(new ReturnToGameChoice(this));
(new VMenu(this, quitMenu, V2D(this, -1, -1), kCBMnu))->setName(_text->getText(kQuitTitle));
_commandHandlerTurbo->addCommand(kCmdSeq, kPowerRef, 0, nullptr);
keyClick();
}
}
}
void CGE2Engine::setVolume(int idx, int cnt) {
if (cnt && _vol[idx]) {
int p = _vol[idx]->_seqPtr + cnt;
if ((p >= 0) && (p < _vol[idx]->_seqCnt)) {
_vol[idx]->step(p);
int newVolume = (int)(p * kSoundStateToNumRate);
switch (idx) {
case 0:
_oldSfxVolume = ConfMan.getInt("sfx_volume");
ConfMan.setInt("sfx_volume", newVolume);
break;
case 1:
_oldMusicVolume = ConfMan.getInt("music_volume");
ConfMan.setInt("music_volume", newVolume);
break;
default:
break;
}
}
}
}
void CGE2Engine::checkVolumeSwitches() {
int musicVolume = ConfMan.getInt("music_volume");
if (musicVolume != _oldMusicVolume)
_vol[1]->step((int)(musicVolume / kSoundNumToStateRate));
int sfxVolume = ConfMan.getInt("sfx_volume");
if (sfxVolume != _oldSfxVolume)
_vol[0]->step((int)(sfxVolume / kSoundNumToStateRate));
}
void CGE2Engine::switchCap() {
_sayCap = !_sayCap;
if (!_sayCap)
_sayVox = true;
keyClick();
switchSay();
}
void CGE2Engine::switchVox() {
_sayVox = !_sayVox;
_mixer->muteSoundType(Audio::Mixer::kSpeechSoundType, _sayVox);
if (!_sayVox)
_sayCap = true;
keyClick();
switchSay();
}
void CGE2Engine::switchSay() {
_commandHandlerTurbo->addCommand(kCmdSeq, 129, _sayVox, nullptr);
_commandHandlerTurbo->addCommand(kCmdSeq, 128, _sayCap, nullptr);
}
void CGE2Engine::initToolbar() {
selectPocket(-1);
_commandHandlerTurbo->addCommand(kCmdSeq, kMusicRef, _music, nullptr);
if (!_music)
_midiPlayer->killMidi();
switchSay();
_infoLine->gotoxyz(V3D(kInfoX, kInfoY, 0));
_infoLine->setText(nullptr);
_vga->_showQ->insert(_infoLine);
_gamePhase = kPhaseInGame;
_mouse->center();
_mouse->off();
_mouse->on();
_keyboard->setClient(_sys);
_commandHandler->addCommand(kCmdSeq, kPowerRef, 1, nullptr);
_busyPtr = _vga->_showQ->locate(kBusyRef);
_vol[0] = _vga->_showQ->locate(kDvolRef);
_vol[1] = _vga->_showQ->locate(kMvolRef);
if (_vol[0]) {
int val = ConfMan.getInt("sfx_volume");
initVolumeSwitch(_vol[0], val);
}
if (_vol[1]) {
int val = ConfMan.getInt("music_volume");
initVolumeSwitch(_vol[1], val);
}
}
void CGE2Engine::initVolumeSwitch(Sprite *volSwitch, int val) {
int state = 0;
state = (int)(val / kSoundNumToStateRate);
volSwitch->step(state);
}
void CGE2Engine::checkMute() {
bool mute = ConfMan.getBool("mute");
if (mute != _muteAll) {
switchMusic();
switchVox();
_muteAll = mute;
}
}
} // End of namespace CGE2