[Scummvm-git-logs] scummvm master -> 84d864da725e36a8ac0a659ede13d00630916ea9
mduggan
mgithub at guarana.org
Mon Apr 27 03:56:38 UTC 2020
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3dbfbfc1ab ULTIMA8: Store track state in the music process
fd318702d8 ULTIMA8: Add new navigation keys to shapeviewer
725ae9fe2a ULTIMA8: don't break into debugger when ignoring input in stasis
84d864da72 ULTIMA8: Shape viewer tweaks
Commit: 3dbfbfc1ab02c7b9f0a53b218b22d31770f14c9a
https://github.com/scummvm/scummvm/commit/3dbfbfc1ab02c7b9f0a53b218b22d31770f14c9a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-27T12:42:56+09:00
Commit Message:
ULTIMA8: Store track state in the music process
I previously stored the track state in the menu and stopped the music. Storing
in the menu has the side-effect that when the game is saved, it saves with no
music playing. This fixes that issue so savegames will start with the right
music. Any savegames made with the buggy version will still have no music on
load, but it will start with a map transition or after combat so it's not worth
adding a workaround.
Changed paths:
engines/ultima/ultima8/audio/music_process.cpp
engines/ultima/ultima8/audio/music_process.h
engines/ultima/ultima8/gumps/menu_gump.cpp
engines/ultima/ultima8/gumps/menu_gump.h
diff --git a/engines/ultima/ultima8/audio/music_process.cpp b/engines/ultima/ultima8/audio/music_process.cpp
index d4d6cbb3a1..b5a4163dd8 100644
--- a/engines/ultima/ultima8/audio/music_process.cpp
+++ b/engines/ultima/ultima8/audio/music_process.cpp
@@ -36,12 +36,14 @@ DEFINE_RUNTIME_CLASSTYPE_CODE(MusicProcess, Process)
MusicProcess *MusicProcess::_theMusicProcess = nullptr;
MusicProcess::MusicProcess() : _midiPlayer(nullptr), _state(PLAYBACK_NORMAL),
- _currentTrack(0), _combatMusicActive(false) {
+ _currentTrack(0), _combatMusicActive(false),
+ _savedTrackState(nullptr) {
Std::memset(_songBranches, (byte)-1, 128 * sizeof(int));
}
MusicProcess::MusicProcess(MidiPlayer *player) : _midiPlayer(player),
- _state(PLAYBACK_NORMAL), _currentTrack(0), _combatMusicActive(false) {
+ _state(PLAYBACK_NORMAL), _currentTrack(0), _combatMusicActive(false),
+ _savedTrackState(nullptr) {
Std::memset(_songBranches, (byte)-1, 128 * sizeof(int));
_theMusicProcess = this;
@@ -50,6 +52,8 @@ MusicProcess::MusicProcess(MidiPlayer *player) : _midiPlayer(player),
}
MusicProcess::~MusicProcess() {
+ if (_savedTrackState)
+ delete _savedTrackState;
if (_midiPlayer)
_midiPlayer->stop();
_theMusicProcess = nullptr;
@@ -99,6 +103,21 @@ void MusicProcess::setTrackState(const TrackState &trackState) {
_state = PLAYBACK_PLAY_WANTED;
}
+void MusicProcess::saveTrackState() {
+ assert(!_savedTrackState);
+ _savedTrackState = new TrackState(_trackState);
+}
+
+void MusicProcess::restoreTrackState() {
+ if (_savedTrackState == nullptr)
+ return;
+
+ _trackState = *_savedTrackState;
+ _state = PLAYBACK_PLAY_WANTED;
+ delete _savedTrackState;
+ _savedTrackState = nullptr;
+}
+
void MusicProcess::playMusic_internal(int track) {
if (track < 0 || track > 128) {
playMusic_internal(0);
@@ -153,7 +172,7 @@ void MusicProcess::playMusic_internal(int track) {
int xmidi_index = _midiPlayer->isFMSynth() ? 260 : 258;
MusicFlex::XMidiData *xmidi = musicflex->getXMidi(xmidi_index);
- //warning("Doing a MIDI transition! trans: %d xmidi: %d speedhack: %d", trans, xmidi_index, speed_hack);
+ warning("Doing a MIDI transition! trans: %d xmidi: %d speedhack: %d", trans, xmidi_index, speed_hack);
if (xmidi && xmidi->_data) {
_midiPlayer->play(xmidi->_data, xmidi->_size, 1, trans, speed_hack);
@@ -232,9 +251,15 @@ void MusicProcess::run() {
void MusicProcess::saveData(Common::WriteStream *ws) {
Process::saveData(ws);
- ws->writeUint32LE(static_cast<uint32>(_trackState._wanted));
- ws->writeUint32LE(static_cast<uint32>(_trackState._lastRequest));
- ws->writeUint32LE(static_cast<uint32>(_trackState._queued));
+ // When saving the game we want to remember the track state
+ // from before the menu was opened
+ const TrackState *stateToSave = _savedTrackState;
+ if (stateToSave == nullptr)
+ stateToSave = &_trackState;
+
+ ws->writeUint32LE(static_cast<uint32>(stateToSave->_wanted));
+ ws->writeUint32LE(static_cast<uint32>(stateToSave->_lastRequest));
+ ws->writeUint32LE(static_cast<uint32>(stateToSave->_queued));
}
bool MusicProcess::loadData(Common::ReadStream *rs, uint32 version) {
diff --git a/engines/ultima/ultima8/audio/music_process.h b/engines/ultima/ultima8/audio/music_process.h
index 50bb41e043..f79db53569 100644
--- a/engines/ultima/ultima8/audio/music_process.h
+++ b/engines/ultima/ultima8/audio/music_process.h
@@ -75,6 +75,9 @@ private:
TrackState _trackState;
+ //! The track state temporarily saved when using the menu etc
+ TrackState *_savedTrackState;
+
//! Is the current music "combat" music
bool _combatMusicActive;
@@ -102,6 +105,11 @@ public:
//! Restore the last requested non-combat track (eg, at the end of combat)
void restoreMusic();
+ //! Save the current track state - used when the menu is opened
+ void saveTrackState();
+ //! Bring back the track state from before it was put on hold
+ void restoreTrackState();
+
INTRINSIC(I_playMusic);
INTRINSIC(I_musicStop);
diff --git a/engines/ultima/ultima8/gumps/menu_gump.cpp b/engines/ultima/ultima8/gumps/menu_gump.cpp
index e4acd1da85..61ae282940 100644
--- a/engines/ultima/ultima8/gumps/menu_gump.cpp
+++ b/engines/ultima/ultima8/gumps/menu_gump.cpp
@@ -65,12 +65,11 @@ MenuGump::MenuGump(bool nameEntryMode_)
// Save old music state
MusicProcess *musicprocess = MusicProcess::get_instance();
if (musicprocess) {
- musicprocess->getTrackState(_oldMusicTrackState);
+ musicprocess->saveTrackState();
// Stop any playing music.
musicprocess->playCombatMusic(0);
- } else {
- _oldMusicTrackState = MusicProcess::TrackState();
}
+
// Save old palette transform
PaletteManager *palman = PaletteManager::get_instance();
palman->getTransformMatrix(_oldPalTransform, PaletteManager::Pal_Game);
@@ -88,7 +87,8 @@ void MenuGump::Close(bool no_del) {
// Restore old music state and palette.
// Music state can be changed by the Intro and Credits
MusicProcess *musicprocess = MusicProcess::get_instance();
- if (musicprocess) musicprocess->setTrackState(_oldMusicTrackState);
+ if (musicprocess)
+ musicprocess->restoreTrackState();
PaletteManager *palman = PaletteManager::get_instance();
palman->transformPalette(PaletteManager::Pal_Game, _oldPalTransform);
diff --git a/engines/ultima/ultima8/gumps/menu_gump.h b/engines/ultima/ultima8/gumps/menu_gump.h
index e46fb0333c..fdea2cfbe7 100644
--- a/engines/ultima/ultima8/gumps/menu_gump.h
+++ b/engines/ultima/ultima8/gumps/menu_gump.h
@@ -56,7 +56,6 @@ public:
protected:
bool _nameEntryMode;
- MusicProcess::TrackState _oldMusicTrackState;
int16 _oldPalTransform[12];
virtual void selectEntry(int entry);
Commit: fd318702d8ff9a3786e46648249ed0aa02536b09
https://github.com/scummvm/scummvm/commit/fd318702d8ff9a3786e46648249ed0aa02536b09
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-27T12:45:22+09:00
Commit Message:
ULTIMA8: Add new navigation keys to shapeviewer
My keyboard doesn't have pgup/pgdown keys :)
Changed paths:
engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
diff --git a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
index 4c9f57ae27..64dff4f4ce 100644
--- a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
+++ b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
@@ -178,6 +178,7 @@ bool ShapeViewerGump::OnKeyDown(int key, int mod) {
}
}
break;
+ case Common::KEYCODE_COMMA:
case Common::KEYCODE_PAGEUP: {
if (_curFlex == 0)
_curFlex = _flexes.size() - 1;
@@ -190,6 +191,7 @@ bool ShapeViewerGump::OnKeyDown(int key, int mod) {
_curFrame = 0;
}
break;
+ case Common::KEYCODE_PERIOD:
case Common::KEYCODE_PAGEDOWN: {
if (_curFlex + 1 == _flexes.size())
_curFlex = 0;
@@ -239,13 +241,13 @@ void ShapeViewerGump::U8ShapeViewer() {
Std::vector<Std::pair<Std::string, ShapeArchive *> > _flexes;
Std::pair<Std::string, ShapeArchive *> _flex;
- _flex.first = "u8shapes";
+ _flex.first = "shapes";
_flex.second = gamedata->getMainShapes();
_flexes.push_back(_flex);
- _flex.first = "u8gumps";
+ _flex.first = "gumps";
_flex.second = gamedata->getGumps();
_flexes.push_back(_flex);
- _flex.first = "u8fonts";
+ _flex.first = "fonts";
_flex.second = gamedata->getFonts();
_flexes.push_back(_flex);
FileSystem *filesys = FileSystem::get_instance();
Commit: 725ae9fe2a5aac824473ad9a60ba58700fc0f307
https://github.com/scummvm/scummvm/commit/725ae9fe2a5aac824473ad9a60ba58700fc0f307
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-27T12:50:24+09:00
Commit Message:
ULTIMA8: don't break into debugger when ignoring input in stasis
Changed paths:
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/world/actors/main_actor.cpp
engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index a891d164b3..3a4594b568 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -1062,8 +1062,8 @@ bool Debugger::cmdName(int argc, const char **argv) {
bool Debugger::cmdUseBackpack(int argc, const char **argv) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
- debugPrintf("Can't: avatarInStasis\n");
- return true;
+ debugPrintf("Can't use backpack: avatarInStasis\n");
+ return false;
}
MainActor *av = getMainActor();
Item *backpack = getItem(av->getEquip(7));
@@ -1074,8 +1074,8 @@ bool Debugger::cmdUseBackpack(int argc, const char **argv) {
bool Debugger::cmdUseInventory(int argc, const char **argv) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
- debugPrintf("Can't: avatarInStasis\n");
- return true;
+ debugPrintf("Can't use inventory: avatarInStasis\n");
+ return false;
}
MainActor *av = getMainActor();
av->callUsecodeEvent_use();
@@ -1102,8 +1102,8 @@ bool Debugger::cmdUseKeyring(int argc, const char **argv) {
bool Debugger::cmdBothButtonClick(int argc, const char **argv) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
- debugPrintf("Can't: avatarInStasis\n");
- return true;
+ debugPrintf("Can't jump: avatarInStasis\n");
+ return false;
}
AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
@@ -1115,8 +1115,8 @@ bool Debugger::cmdBothButtonClick(int argc, const char **argv) {
bool Debugger::cmdToggleCombat(int argc, const char **argv) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
- debugPrintf("Can't: avatarInStasis\n");
- return true;
+ debugPrintf("Can't toggle combat: avatarInStasis\n");
+ return false;
}
MainActor *av = getMainActor();
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 0639b35496..8ee3c9169f 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -484,7 +484,7 @@ uint32 MainActor::I_isAvatarInCombat(const uint8 * /*args*/,
void MainActor::useInventoryItem(uint32 shapenum) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
- pout << "Can't: avatarInStasis" << Std::endl;
+ pout << "Can't use item: avatarInStasis" << Std::endl;
return;
}
LOOPSCRIPT(script, LS_SHAPE_EQUAL(shapenum));
diff --git a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
index 63589b743e..1aef557ef7 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
@@ -152,7 +152,7 @@ void QuickAvatarMoverProcess::startMover(int x, int y, int z, int dir) {
Process *p = new QuickAvatarMoverProcess(x, y, z, dir);
Kernel::get_instance()->addProcess(p);
} else {
- pout << "Can't: avatarInStasis" << Std::endl;
+ pout << "Can't quickmove: avatarInStasis" << Std::endl;
}
}
Commit: 84d864da725e36a8ac0a659ede13d00630916ea9
https://github.com/scummvm/scummvm/commit/84d864da725e36a8ac0a659ede13d00630916ea9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-27T12:56:06+09:00
Commit Message:
ULTIMA8: Shape viewer tweaks
Changed paths:
engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
diff --git a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
index 64dff4f4ce..97712a68c1 100644
--- a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
+++ b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
@@ -101,9 +101,9 @@ void ShapeViewerGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool /*s
if (!shape_) {
sprintf(buf1, "NULL");
} else {
- sprintf(buf1, "Frame %d of %d", _curFrame, shape_->frameCount());
+ sprintf(buf1, "Frame %d of %d", _curFrame+1, shape_->frameCount());
}
- sprintf(buf2, "%s : Shape %d, %s", _flexes[_curFlex].first.c_str(),
+ sprintf(buf2, "%s: Shape %d, %s", _flexes[_curFlex].first.c_str(),
_curShape, buf1);
rendtext = font->renderText(buf2, remaining);
rendtext->draw(surf, 20, 10);
More information about the Scummvm-git-logs
mailing list