[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