[Scummvm-git-logs] scummvm branch-2-9 -> c135d62b9cdb38f5ff9e964e45cb0d57555575c0

tag2015 noreply at scummvm.org
Thu Nov 28 21:55:34 UTC 2024


This automated email contains information about 9 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ce56d5d992 AGS: Engine: do character loop fixup after move update
eca8c656ad AGS: Engine: also move frame fixup to FixupCurrentLoop()
b19919457d AGS: Engine: fix SetCharacterViewEx alignment value
fd06fd29fe AGS: Engine: fixed default InvWindow not redrawn when player char changes
03fffe10ec AGS: Engine: fixed playing transition-out effect while skipping cutscene
7485fdde3a AGS: Engine: fixed FadeIn/Out() not marking screen faded if fast-forwarding
1265e2822c AGS: Engine: fixed Wait function's negative time case for pre-3.6.0 API
ca5ced4c82 AGS: Engine: fix Character.Animate in case called during idling
c135d62b9c DIRECTOR: Final fix to D4 games filesizes + minor additions


Commit: ce56d5d99228823d05044ef8ca3c0039760e1a26
    https://github.com/scummvm/scummvm/commit/ce56d5d99228823d05044ef8ca3c0039760e1a26
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: do character loop fixup after move update

Loop fixup was introduced earlier to avoid crashes in certain old games,
and also in case users forgot to unlock a custom animation View.
But apparently I missed a case when a loop may be adjusted later on during walking update.
>From upstream f04c4d7d9adff5134e48c1062b0214251797efdc

Changed paths:
    engines/ags/engine/ac/character_info_engine.cpp
    engines/ags/shared/ac/character_info.h
    engines/ags/shared/ac/view.h


diff --git a/engines/ags/engine/ac/character_info_engine.cpp b/engines/ags/engine/ac/character_info_engine.cpp
index 45ea2c433b8..6c44ee0f3bf 100644
--- a/engines/ags/engine/ac/character_info_engine.cpp
+++ b/engines/ags/engine/ac/character_info_engine.cpp
@@ -63,19 +63,12 @@ int CharacterInfo::get_blocking_bottom() const {
 	return y + 3;
 }
 
-void CharacterInfo::UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, std::vector<int> &followingAsSheep) {
-	int res;
-
-	if (on != 1) return;
-
-	// walking
-	res = update_character_walking(chex);
-	// [IKM] Yes, it should return! upon getting RETURN_CONTINUE here
-	if (res == RETURN_CONTINUE) { // [IKM] now, this is one of those places...
-		return;                   //  must be careful not to screw things up
-	}
+void CharacterInfo::FixupCurrentLoop() {
+	// If current loop property exceeds number of loops,
+	// or if selected loop has no frames, then try select any first loop that has frames.
+	// NOTE: although this may seem like a weird solution to a problem,
+	// we do so for backwards compatibility; this approximately emulates older games behavior.
 
-	// Fixup character's view when possible
 	if (view >= 0 &&
 		(loop >= _GP(views)[view].numLoops || _GP(views)[view].loops[loop].numFrames == 0)) {
 		for (loop = 0;
@@ -89,9 +82,26 @@ void CharacterInfo::UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, st
 			loop = 0;
 		}
 	}
+}
 
-	int doing_nothing = 1;
+void CharacterInfo::UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, std::vector<int> &followingAsSheep) {
+	int res;
 
+	if (on != 1)
+		return;
+
+	// Turn around during walk
+	res = update_character_walkturning(chex);
+	// Fixup character's loop prior to any further logic updates
+	FixupCurrentLoop();
+
+	// FIXME: refactor this nonsense!
+	// [IKM] Yes, it should return! upon getting RETURN_CONTINUE here
+	if (res == RETURN_CONTINUE) { // [IKM] now, this is one of those places...
+		return;                   //  must be careful not to screw things up
+	}
+
+	int doing_nothing = 1;
 	update_character_moving(char_index, chex, doing_nothing);
 
 	// [IKM] 2012-06-28:
@@ -124,7 +134,7 @@ void CharacterInfo::UpdateFollowingExactlyCharacter() {
 		baseline = usebase + 1;
 }
 
-int CharacterInfo::update_character_walking(CharacterExtras *chex) {
+int CharacterInfo::update_character_walkturning(CharacterExtras *chex) {
 	if (walking >= TURNING_AROUND) {
 		// Currently rotating to correct direction
 		if (walkwait > 0) walkwait--;
@@ -207,19 +217,14 @@ void CharacterInfo::update_character_moving(int &char_index, CharacterExtras *ch
 				walkwaitcounter++;
 		}
 
-		if (loop >= _GP(views)[view].numLoops)
-			quitprintf("Unable to render character %d (%s) because loop %d does not exist in view %d", index_id, scrname, loop, view + 1);
-
-		// check don't overflow loop
-		int framesInLoop = _GP(views)[view].loops[loop].numFrames;
-		if (frame > framesInLoop) {
-			frame = 1;
-
-			if (framesInLoop < 2)
-				frame = 0;
+		// Fixup character's loop, it may be changed when making a walk-move
+		FixupCurrentLoop();
 
-			if (framesInLoop < 1)
-				quitprintf("Unable to render character %d (%s) because there are no frames in loop %d", index_id, scrname, loop);
+		// If last saved frame exceeds new loop, then switch to frame 1
+		// (first walking frame) or frame 0 if there's less than 2 frames.
+		int frames_in_loop = _GP(views)[view].loops[loop].numFrames;
+		if (frame >= frames_in_loop) {
+			frame = (frames_in_loop >= 2) ? 1 : 0;
 		}
 
 		doing_nothing = 0; // still walking?
diff --git a/engines/ags/shared/ac/character_info.h b/engines/ags/shared/ac/character_info.h
index 8b396fd4599..5ab73e201c9 100644
--- a/engines/ags/shared/ac/character_info.h
+++ b/engines/ags/shared/ac/character_info.h
@@ -199,7 +199,7 @@ struct CharacterInfo {
 	void UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, std::vector<int> &followingAsSheep);
 	void UpdateFollowingExactlyCharacter();
 
-	int  update_character_walking(CharacterExtras *chex);
+	int  update_character_walkturning(CharacterExtras *chex);
 	void update_character_moving(int &char_index, CharacterExtras *chex, int &doing_nothing);
 	int  update_character_animating(int &char_index, int &doing_nothing);
 	void update_character_idle(CharacterExtras *chex, int &doing_nothing);
@@ -212,6 +212,9 @@ struct CharacterInfo {
 	void WriteToSavegame(Shared::Stream *out, const CharacterInfo2 &chinfo2) const;
 
 private:
+	// Fixups loop value, in case it's set to an invalid loop which cannot be used with the current view
+	void FixupCurrentLoop();
+
 	// Helper functions that read and write first data fields,
 	// common for both game file and save.
 	void ReadBaseFields(Shared::Stream *in);
diff --git a/engines/ags/shared/ac/view.h b/engines/ags/shared/ac/view.h
index 2ec12605c2e..bb8ae99c2fe 100644
--- a/engines/ags/shared/ac/view.h
+++ b/engines/ags/shared/ac/view.h
@@ -59,8 +59,8 @@ struct ViewLoopNew {
 	int numFrames;
 	int   flags;
 	std::vector<ViewFrame> frames;
-	// NOTE: we still need numFrames for backward compatibility:
-	// some older versions could allocate extra frame(s) for safety,
+	// NOTE: we still need numFrames:
+	// as we always allocate at least 1 frame for safety, to avoid crashes,
 	// but have to report "logical" number of frames for the engine API.
 
 	ViewLoopNew();


Commit: eca8c656ad7a5e7d9877d28ab660902ba42ab436
    https://github.com/scummvm/scummvm/commit/eca8c656ad7a5e7d9877d28ab660902ba42ab436
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: also move frame fixup to FixupCurrentLoop()

>From upstream ecf6fe02d73686651f4123fb59f8a0c1b821bea8

Changed paths:
    engines/ags/engine/ac/character_info_engine.cpp
    engines/ags/shared/ac/character_info.h


diff --git a/engines/ags/engine/ac/character_info_engine.cpp b/engines/ags/engine/ac/character_info_engine.cpp
index 6c44ee0f3bf..d6d99c75ae6 100644
--- a/engines/ags/engine/ac/character_info_engine.cpp
+++ b/engines/ags/engine/ac/character_info_engine.cpp
@@ -63,7 +63,7 @@ int CharacterInfo::get_blocking_bottom() const {
 	return y + 3;
 }
 
-void CharacterInfo::FixupCurrentLoop() {
+void CharacterInfo::FixupCurrentLoopAndFrame() {
 	// If current loop property exceeds number of loops,
 	// or if selected loop has no frames, then try select any first loop that has frames.
 	// NOTE: although this may seem like a weird solution to a problem,
@@ -82,6 +82,13 @@ void CharacterInfo::FixupCurrentLoop() {
 			loop = 0;
 		}
 	}
+
+	// If the last saved frame exceeds a new loop, then switch to frame 1
+	// (first walking frame) if walking, or frame 0 otherwise or if there's less than 2 frames.
+	int frames_in_loop = _GP(views)[view].loops[loop].numFrames;
+	if (frame >= frames_in_loop) {
+		frame = (walking > 0 && frames_in_loop > 1) ? 1 : 0;
+	}
 }
 
 void CharacterInfo::UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, std::vector<int> &followingAsSheep) {
@@ -93,7 +100,7 @@ void CharacterInfo::UpdateMoveAndAnim(int &char_index, CharacterExtras *chex, st
 	// Turn around during walk
 	res = update_character_walkturning(chex);
 	// Fixup character's loop prior to any further logic updates
-	FixupCurrentLoop();
+	FixupCurrentLoopAndFrame();
 
 	// FIXME: refactor this nonsense!
 	// [IKM] Yes, it should return! upon getting RETURN_CONTINUE here
@@ -159,9 +166,6 @@ int CharacterInfo::update_character_walkturning(CharacterExtras *chex) {
 				} else break;
 			}
 			loop = turnlooporder[wantloop];
-			if (frame >= _GP(views)[view].loops[loop].numFrames)
-				frame = 0; // AVD: make sure the loop always has a valid frame
-			if (frame >= _GP(views)[view].loops[loop].numFrames) frame = 0; // AVD: make sure the loop always has a valid frame
 			walking -= TURNING_AROUND;
 			// if still turning, wait for next frame
 			if (walking % TURNING_BACKWARDS >= TURNING_AROUND)
@@ -218,14 +222,7 @@ void CharacterInfo::update_character_moving(int &char_index, CharacterExtras *ch
 		}
 
 		// Fixup character's loop, it may be changed when making a walk-move
-		FixupCurrentLoop();
-
-		// If last saved frame exceeds new loop, then switch to frame 1
-		// (first walking frame) or frame 0 if there's less than 2 frames.
-		int frames_in_loop = _GP(views)[view].loops[loop].numFrames;
-		if (frame >= frames_in_loop) {
-			frame = (frames_in_loop >= 2) ? 1 : 0;
-		}
+		FixupCurrentLoopAndFrame();
 
 		doing_nothing = 0; // still walking?
 
diff --git a/engines/ags/shared/ac/character_info.h b/engines/ags/shared/ac/character_info.h
index 5ab73e201c9..e94cfa61373 100644
--- a/engines/ags/shared/ac/character_info.h
+++ b/engines/ags/shared/ac/character_info.h
@@ -212,8 +212,8 @@ struct CharacterInfo {
 	void WriteToSavegame(Shared::Stream *out, const CharacterInfo2 &chinfo2) const;
 
 private:
-	// Fixups loop value, in case it's set to an invalid loop which cannot be used with the current view
-	void FixupCurrentLoop();
+	// Fixups loop and frame values, in case any of them are set to a value out of the valid range
+	void FixupCurrentLoopAndFrame();
 
 	// Helper functions that read and write first data fields,
 	// common for both game file and save.


Commit: b19919457dea1176de5dd0d116a28de86d7bf3b6
    https://github.com/scummvm/scummvm/commit/b19919457dea1176de5dd0d116a28de86d7bf3b6
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: fix SetCharacterViewEx alignment value

>From upstream e9c1c7e0477c8fe156d7e3b86e70b925535c9e2b

Changed paths:
    engines/ags/engine/ac/global_character.cpp


diff --git a/engines/ags/engine/ac/global_character.cpp b/engines/ags/engine/ac/global_character.cpp
index eb4bc181119..a6db3a0a8c3 100644
--- a/engines/ags/engine/ac/global_character.cpp
+++ b/engines/ags/engine/ac/global_character.cpp
@@ -281,7 +281,7 @@ void SetCharacterFrame(int chaa, int view, int loop, int frame) {
 // similar to SetCharView, but aligns the frame to make it line up
 void SetCharacterViewEx(int chaa, int vii, int loop, int align) {
 
-	Character_LockViewAligned(&_GP(game).chars[chaa], vii, loop, align);
+	Character_LockViewAligned(&_GP(game).chars[chaa], vii, loop, ConvertLegacyScriptAlignment((LegacyScriptAlignment)align));
 }
 
 void SetCharacterViewOffset(int chaa, int vii, int xoffs, int yoffs) {


Commit: fd06fd29fe03bb25032b9fb065a39fd1bd28f2fd
    https://github.com/scummvm/scummvm/commit/fd06fd29fe03bb25032b9fb065a39fd1bd28f2fd
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: fixed default InvWindow not redrawn when player char changes

This is a regression since around 3.6.0, but apparently Inventory Window had always some problem
updating after SetAsPlayer is called.
In much older versions of AGS, even prior to GUI optimizations, it also did not update until player
moved mouse cursor around some interactive elements. Which probably made an impression
that it's not working without explicitly assigning InvWindow.CharacterToUse.
>From upstream 0b758225a7801700a03e48fa72b733fd122ca1c9

Changed paths:
    engines/ags/engine/ac/character.cpp


diff --git a/engines/ags/engine/ac/character.cpp b/engines/ags/engine/ac/character.cpp
index e388604e734..6e17be05ba1 100644
--- a/engines/ags/engine/ac/character.cpp
+++ b/engines/ags/engine/ac/character.cpp
@@ -735,9 +735,7 @@ void Character_SetAsPlayer(CharacterInfo *chaa) {
 		return;
 
 	setup_player_character(chaa->index_id);
-
-	//update_invorder();
-
+	GUI::MarkInventoryForUpdate(_GP(game).playercharacter, true);
 	debug_script_log("%s is new player character", _G(playerchar)->scrname);
 
 	// Within game_start, return now


Commit: 03fffe10ec500968d37c94a17f89ed4e521e8a49
    https://github.com/scummvm/scummvm/commit/03fffe10ec500968d37c94a17f89ed4e521e8a49
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: fixed playing transition-out effect while skipping cutscene

This is a regression since 3.6.0.
>From upstream a18d94a61d698aeb4fba39330d4194ca5410d696

Changed paths:
    engines/ags/engine/ac/screen.cpp


diff --git a/engines/ags/engine/ac/screen.cpp b/engines/ags/engine/ac/screen.cpp
index 666aa57c101..68aa4892cac 100644
--- a/engines/ags/engine/ac/screen.cpp
+++ b/engines/ags/engine/ac/screen.cpp
@@ -68,6 +68,10 @@ void current_fade_out_effect() {
 		theTransition = _GP(play).next_screen_transition;
 	const bool instant_transition = (theTransition == FADE_INSTANT) ||
 									_GP(play).screen_tint > 0; // for some reason we do not play fade if screen is tinted
+	if (_GP(play).fast_forward) {
+		_GP(play).screen_is_faded_out |= (!instant_transition);
+		return;
+	}
 	if (instant_transition) {
 		if (!_GP(play).keep_screen_during_instant_transition)
 			set_palette_range(_G(black_palette), 0, 255, 0);


Commit: 7485fdde3a1cc780d8a54b82a0d0809e742b24e9
    https://github.com/scummvm/scummvm/commit/7485fdde3a1cc780d8a54b82a0d0809e742b24e9
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:26+01:00

Commit Message:
AGS: Engine: fixed FadeIn/Out() not marking screen faded if fast-forwarding

This results in post-cutscene state being different if it's skipped compared to
a normal run if a pairing FadeOut or FadeIn was not inside StartCutscene/EndCutscene too.
>From upstream 14bc225fb64bef8aae56c2f791194d515d7a664b

Changed paths:
    engines/ags/engine/ac/global_screen.cpp


diff --git a/engines/ags/engine/ac/global_screen.cpp b/engines/ags/engine/ac/global_screen.cpp
index 09ac8d4e33c..f38af739cce 100644
--- a/engines/ags/engine/ac/global_screen.cpp
+++ b/engines/ags/engine/ac/global_screen.cpp
@@ -133,8 +133,10 @@ void TintScreen(int red, int grn, int blu) {
 void FadeOut(int sppd) {
 	EndSkippingUntilCharStops();
 
-	if (_GP(play).fast_forward)
+	if (_GP(play).fast_forward) {
+		_GP(play).screen_is_faded_out = 1;
 		return;
+	}
 
 	// FIXME: we have to sync audio here explicitly, because FadeOut
 	// does not call any game update function while it works
@@ -181,8 +183,10 @@ void SetFadeColor(int red, int green, int blue) {
 void FadeIn(int sppd) {
 	EndSkippingUntilCharStops();
 
-	if (_GP(play).fast_forward)
+	if (_GP(play).fast_forward) {
+		_GP(play).screen_is_faded_out = 0;
 		return;
+	}
 
 	// Update drawables, prepare them for the transition-in
 	// in case this is called after the game state change but before any update was run


Commit: 1265e2822c4c1557c36dbe9627a1f9dc38fc7638
    https://github.com/scummvm/scummvm/commit/1265e2822c4c1557c36dbe9627a1f9dc38fc7638
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:27+01:00

Commit Message:
AGS: Engine: fixed Wait function's negative time case for pre-3.6.0 API

Prior to 3.6.0 script API Wait function was treating negative values as "no time",
but since 3.6.0 it treats it as "infinite time".
Also, old engines let overflow happen when assigning > INT16_MAX values to the wait counter
(which is int16).
In the old engine this resulted in immediate timer stop, by pure accident.
>From upstream 6777dad163b3f8c2678e5fc001feb15b78c36849

Changed paths:
    engines/ags/engine/ac/global_game.cpp


diff --git a/engines/ags/engine/ac/global_game.cpp b/engines/ags/engine/ac/global_game.cpp
index 6b254467b75..bc45a58335f 100644
--- a/engines/ags/engine/ac/global_game.cpp
+++ b/engines/ags/engine/ac/global_game.cpp
@@ -812,7 +812,14 @@ int WaitImpl(int skip_type, int nloops) {
 	if (_GP(play).fast_forward && ((skip_type & ~SKIP_AUTOTIMER) != 0))
 		return 0;
 
-	_GP(play).wait_counter = nloops;
+	// < 3.6.0 treated negative nloops as "no time";
+	// also old engine let nloops to overflow into neg when assigned to wait_counter...
+	if (_GP(game).options[OPT_BASESCRIPTAPI] < kScriptAPI_v360) {
+		if (nloops < 0 || nloops > INT16_MAX)
+			nloops = 0;
+	}
+	// clamp to int16
+	_GP(play).wait_counter = static_cast<int16_t>(Math::Clamp<int>(nloops, -1, INT16_MAX));
 	_GP(play).wait_skipped_by = SKIP_NONE;
 	_GP(play).wait_skipped_by = SKIP_AUTOTIMER; // we set timer flag by default to simplify that case
 	_GP(play).wait_skipped_by_data = 0;
@@ -821,7 +828,7 @@ int WaitImpl(int skip_type, int nloops) {
     GameLoopUntilValueIsZero(&_GP(play).wait_counter);
 
 	if (_GP(game).options[OPT_BASESCRIPTAPI] < kScriptAPI_v360) {
-		// < 3.6.0 return 1 is skipped by user input, otherwise 0
+		// < 3.6.0 return 1 if skipped by user input, otherwise 0
 		return ((_GP(play).wait_skipped_by & (SKIP_KEYPRESS | SKIP_MOUSECLICK)) != 0) ? 1 : 0;
 	}
 	// >= 3.6.0 return skip (input) type flags with keycode


Commit: ca5ced4c8230173341f8ed09e79cc35df79320dc
    https://github.com/scummvm/scummvm/commit/ca5ced4c8230173341f8ed09e79cc35df79320dc
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:52:27+01:00

Commit Message:
AGS: Engine: fix Character.Animate in case called during idling

This fixes a regression after db71d92
in case Character.Animate() called during idling, and Loop number assertion is done
prior to view changing back to normal view, could cause game to error.

Pick out "stop_character_idling" function that checks idle state and releases the locked idle view.
>From upstream 946fa71c9332cae98f31d8b7672a1fe7b76d46c5

Fix #15523

Changed paths:
    engines/ags/engine/ac/character.cpp
    engines/ags/engine/ac/character.h
    engines/ags/engine/ac/character_info_engine.cpp


diff --git a/engines/ags/engine/ac/character.cpp b/engines/ags/engine/ac/character.cpp
index 6e17be05ba1..bec23ee0274 100644
--- a/engines/ags/engine/ac/character.cpp
+++ b/engines/ags/engine/ac/character.cpp
@@ -83,6 +83,14 @@ bool is_valid_character(int char_id) {
 	return ((char_id >= 0) && (char_id < _GP(game).numcharacters));
 }
 
+// Checks if character is currently playing idle anim, and reset it
+static void stop_character_idling(CharacterInfo *chi) {
+	if (chi->idleleft < 0) {
+		Character_UnlockView(chi);
+		chi->idleleft = chi->idletime;
+	}
+}
+
 bool AssertCharacter(const char *apiname, int char_id) {
 	if ((char_id >= 0) && (char_id < _GP(game).numcharacters))
 		return true;
@@ -181,10 +189,14 @@ void Character_AddWaypoint(CharacterInfo *chaa, int x, int y) {
 void Character_Animate(CharacterInfo *chaa, int loop, int delay, int repeat,
 	int blocking, int direction, int sframe, int volume) {
 
+	// If idle view in progress for the character, stop the idle anim;
+	// do this prior to the loop check, as the view may switch back to defview here
+	stop_character_idling(chaa);
+
 	ValidateViewAnimVLF("Character.Animate", chaa->view, loop, sframe);
 	ValidateViewAnimParams("Character.Animate", repeat, blocking, direction);
 
-	animate_character(chaa, loop, delay, repeat, 0, direction, sframe, volume);
+	animate_character(chaa, loop, delay, repeat, direction, sframe, volume);
 
 	if (blocking != 0)
 		GameLoopUntilValueIsZero(&chaa->animating);
@@ -275,10 +287,7 @@ void Character_ChangeView(CharacterInfo *chap, int vii) {
 		debug_script_warn("Warning: ChangeCharacterView was used while the view was fixed - call ReleaseCharView first");
 
 	// if the idle animation is playing we should release the view
-	if (chap->idleleft < 0) {
-		Character_UnlockView(chap);
-		chap->idleleft = chap->idletime;
-	}
+	stop_character_idling(chap);
 
 	debug_script_log("%s: Change view to %d", chap->scrname, vii + 1);
 	chap->defview = vii;
@@ -562,11 +571,8 @@ void Character_LockViewEx(CharacterInfo *chap, int vii, int stopMoving) {
 	vii--; // convert to 0-based
 	AssertView("SetCharacterView", vii);
 
-	debug_script_log("%s: View locked to %d", chap->scrname, vii + 1);
-	if (chap->idleleft < 0) {
-		Character_UnlockView(chap);
-		chap->idleleft = chap->idletime;
-	}
+	stop_character_idling(chap);
+
 	if (stopMoving != KEEP_MOVING) {
 		Character_StopMoving(chap);
 	}
@@ -578,6 +584,7 @@ void Character_LockViewEx(CharacterInfo *chap, int vii, int stopMoving) {
 	chap->flags |= CHF_FIXVIEW;
 	chap->pic_xoffs = 0;
 	chap->pic_yoffs = 0;
+	debug_script_log("%s: View locked to %d", chap->scrname, vii + 1);
 }
 
 void Character_LockViewAligned_Old(CharacterInfo *chap, int vii, int loop, int align) {
@@ -773,8 +780,7 @@ void Character_SetIdleView(CharacterInfo *chaa, int iview, int itime) {
 		quit("!SetCharacterIdle: view 1 cannot be used as an idle view, sorry.");
 
 	// if an idle anim is currently playing, release it
-	if (chaa->idleleft < 0)
-		Character_UnlockView(chaa);
+	stop_character_idling(chaa);
 
 	chaa->idleview = iview - 1;
 	// make sure they don't appear idle while idle anim is disabled
@@ -1615,11 +1621,8 @@ void walk_character(int chac, int tox, int toy, int ignwal, bool autoWalkAnims)
 
 	if ((chin->animating) && (autoWalkAnims))
 		stop_character_anim(chin);
-
-	if (chin->idleleft < 0) {
-		ReleaseCharacterView(chac);
-		chin->idleleft = chin->idletime;
-	}
+	// Stop idling anim
+	stop_character_idling(chin);
 	// stop them to make sure they're on a walkable area
 	// but save their frame first so that if they're already
 	// moving it looks smoother
@@ -2051,14 +2054,7 @@ void setup_player_character(int charid) {
 // Animate character internal implementation;
 // this function may be called by the game logic too, so we assume
 // the arguments must be correct, and do not fix them up as we do for API functions.
-void animate_character(CharacterInfo *chap, int loopn, int sppd, int rept, int noidleoverride, int direction, int sframe, int volume) {
-	// If idle view in progress for the character (and this is not the
-	// "start idle animation" animate_character call), stop the idle anim
-	if ((chap->idleleft < 0) && (noidleoverride == 0)) {
-		Character_UnlockView(chap);
-		chap->idleleft = chap->idletime;
-	}
-
+void animate_character(CharacterInfo *chap, int loopn, int sppd, int rept, int direction, int sframe, int volume) {
 	if ((chap->view < 0) || (chap->view > _GP(game).numviews) ||
 		(loopn < 0) || (loopn >= _GP(views)[chap->view].numLoops)) {
 		quitprintf("!AnimateCharacter: invalid view and/or loop\n"
@@ -2432,8 +2428,8 @@ void _displayspeech(const char *texx, int aschar, int xx, int yy, int widd, int
 		allowShrink = 1;
 
 	// If has a valid speech view, and idle anim in progress for the character, then stop it
-	if (useview >= 0 && speakingChar->idleleft < 0) {
-		ReleaseCharacterView(aschar);
+	if (useview >= 0) {
+		stop_character_idling(speakingChar);
 	}
 
 	int tdxp = xx, tdyp = yy;
diff --git a/engines/ags/engine/ac/character.h b/engines/ags/engine/ac/character.h
index 83fd4957934..1fc4f0ec665 100644
--- a/engines/ags/engine/ac/character.h
+++ b/engines/ags/engine/ac/character.h
@@ -185,8 +185,7 @@ class Bitmap;
 using namespace AGS; // FIXME later
 
 // Configures and starts character animation.
-void animate_character(CharacterInfo *chap, int loopn, int sppd, int rept,
-	int noidleoverride = 0, int direction = 0, int sframe = 0, int volume = 100);
+void animate_character(CharacterInfo *chap, int loopn, int sppd, int rept, int direction = 0, int sframe = 0, int volume = 100);
 // Clears up animation parameters
 void stop_character_anim(CharacterInfo *chap);
 void walk_character(int chac, int tox, int toy, int ignwal, bool autoWalkAnims);
diff --git a/engines/ags/engine/ac/character_info_engine.cpp b/engines/ags/engine/ac/character_info_engine.cpp
index d6d99c75ae6..aea123a4184 100644
--- a/engines/ags/engine/ac/character_info_engine.cpp
+++ b/engines/ags/engine/ac/character_info_engine.cpp
@@ -457,7 +457,7 @@ void CharacterInfo::update_character_idle(CharacterExtras *chex, int &doing_noth
 			else if (useloop >= maxLoops)
 				useloop = 0;
 
-			animate_character(this, useloop, idle_anim_speed, (idletime == 0) ? 1 : 0, 1);
+			animate_character(this, useloop, idle_anim_speed, (idletime == 0) ? 1 : 0 /* repeat */);
 
 			// don't set Animating while the idle anim plays (TODO: investigate why?)
 			animating = 0;


Commit: c135d62b9cdb38f5ff9e964e45cb0d57555575c0
    https://github.com/scummvm/scummvm/commit/c135d62b9cdb38f5ff9e964e45cb0d57555575c0
Author: Walter Agazzi (walter.agazzi at protonmail.com)
Date: 2024-11-28T22:55:01+01:00

Commit Message:
DIRECTOR: Final fix to D4 games filesizes + minor additions

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index 51226f2dc9a..062fd9daf27 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -1599,6 +1599,7 @@ static const PlainGameDescriptor directorGames[] = {
 	{ "sfk",				"Science for Kids Product Demos" },
 	{ "sonywalkman",		"Sony Walkman PRD-155SB / PRD-150" },
 	{ "techiescom",			"techies.com Business Card" },
+	{ "terapreviews",		"TeraMedia Previews" },
 	{ "tivolaspring1997",	"Tivola Demo - Frühjahr '97" },
 	{ "tivolafall1998",		"Tivola Demo - Herbst 1998" },   // Contains D4, D5 and D6 executables
 	{ "tivolaspring1999",	"Tivola Demo - Frühling 1999" }, // Contains D4, D5 and D6 executables
@@ -5780,6 +5781,11 @@ static const DirectorGameDescription gameDescriptions[] = {
 	MACGAME1("teamxtreme2", "", "Copy to HD/TX2", "r:f47c738636947451579473d9fe36041c", 507980, 404),
 	WINGAME1("teamxtreme2", "", "COPY2HD/TX2.EXE", "50c80bd2add25e574494838772973beb", 2585471, 404),
 
+	// Found on World of Whales
+	MACGAME1("terapreviews", "", "TeraMedia Previews", 	 "rt:9e4c0af102f40d2ae8ec4a131b5d9c3a",  483490, 404),
+	WINGAME2("terapreviews", "", "PREVIEWS.EXE",	  	 "t:9289cacef6dcea38e69554ac27ff59f1",   866108,
+								 "PREVIEWS/ACUPPRV.DIR", "f:110eb12d196fd1d51ed0093cb0310d88",  5379742, 404),
+
 	// From MacFormat #42
 	MACDEMO1("texturescape", "", "TextureScape Show", "77f4098988d5386794d1530065f514cd", 303961, 400),
 
@@ -5886,9 +5892,9 @@ static const DirectorGameDescription gameDescriptions[] = {
 	WINGAME1t("ugtmk", "", "TUG2MK.EXE", "3612d22c5c2f6bda8449828eaf338173", 692411, 404),
 
 	// Original filenames are 合わせ月の夜 (disc 1), フェンネル (disc 2), いにしえびと (disc 3)
-	MACGAME1_l("twistynight1", "", "Moonlit Night", "8ea9e9a699c61edddffd79ddd0c994d7", 290682, Common::JA_JPN, 402),
-	MACGAME1_l("twistynight2", "", "Fennel", "8ea9e9a699c61edddffd79ddd0c994d7", 290682, Common::JA_JPN, 402),
-	MACGAME1_l("twistynight3", "", "Young Man", "8ea9e9a699c61edddffd79ddd0c994d7", 290682, Common::JA_JPN, 402),
+	MACGAME1_l("twistynight1", "", "to HD/xn--b9jvbwfx46n2kf6mx", "r:8ea9e9a699c61edddffd79ddd0c994d7", 290426, Common::JA_JPN, 402),
+	MACGAME1_l("twistynight2", "", "to HD#2/xn--hckzdwa4grb",	  "r:8ea9e9a699c61edddffd79ddd0c994d7", 290426, Common::JA_JPN, 402),
+	MACGAME1_l("twistynight3", "", "to HD#3/xn--n8ji8bydm4c",	  "r:8ea9e9a699c61edddffd79ddd0c994d7", 290426, Common::JA_JPN, 402),
 
 	// Demos from Big Top Productions: Felix the Cat, Hello Kitty, Keroppi & The Groove Thing
 	WINGAME1("ubt", "", "BTDEMO.EXE", "dbe72b7dc91c72db5b4597857aecf5c6", 696813, 404),
@@ -5916,7 +5922,7 @@ static const DirectorGameDescription gameDescriptions[] = {
 	// Original Mac full game filename is 波止の五目釣り
 	// Windows demos on Uki Uki 3 sample disc are hidden in MOVIE/BMP
 	// All of the Windows demo projectors use the S.EXE filename
-	MACGAME1_l("ukiuki2", "",	  "Hashi no gomoku-dzuri", "bcd3c718db258701496b3c5bcb827ef2", 488946, Common::JA_JPN, 404),
+	MACGAME1_l("ukiuki2", "",	  "xn--u9jwc349jyrz3tb9y0ahq8b", "r:bcd3c718db258701496b3c5bcb827ef2", 488690, Common::JA_JPN, 404),
 	MACDEMO2_l("ukiuki2", "Demo", "Demo",				   "5ef06a50a335ec0a9a0f9017057ccfe9", 1097469,
 								  "START",				   "c1eaf606b97d1fb5a55214485d330aa9", 9228, Common::JA_JPN, 404),
 	WINDEMO2_l("ukiuki2", "Demo", "S.EXE",				   "5ef06a50a335ec0a9a0f9017057ccfe9", 1097469,
@@ -5924,14 +5930,14 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	// Demo is D5
 	// Original filename is 人魚島のボート釣り
-	MACGAME1_l("ukiuki3", "", "Ningyo shima no boto-dzuri", "bcd3c718db258701496b3c5bcb827ef2", 488038, Common::JA_JPN, 404),
+	MACGAME1_l("ukiuki3", "", "xn--u9jwcxjzcuh504p22ubz0h51ra", "r:bcd3c718db258701496b3c5bcb827ef2", 487782, Common::JA_JPN, 404),
 
 	// Bilingual Japanese/English
-	MACGAME1("undergroundaz", "", "SO_OUT", "47e49b52d4c99ea6ea72c3dcbb57b34b", 290422, 400),
-	WINGAME1t("undergroundaz", "", "SO_OUT.EXE", "cbffbb52e532daf671a6398c25d6db1d", 4637941, 404),
+	MACGAME1("undergroundaz", "", "SO_OUT/SO_OUT",	   "r:47e49b52d4c99ea6ea72c3dcbb57b34b",  290422, 400),
+	WINGAME1("undergroundaz", "", "SO_OUT/SO_OUT.EXE", "t:cbffbb52e532daf671a6398c25d6db1d", 4637941, 404),
 	// Standalone app in a subdirectory
-	MACGAME1("undergroundaz", "Left Hand Drawings", "DRAWING", "8ea9e9a699c61edddffd79ddd0c994d7", 290398, 402),
-	WINGAME1t("undergroundaz", "Left Hand Drawings", "DRAWING.EXE", "e1afecdd3458db84a7a4a0c26b8ebad3", 716183, 404),
+	MACGAME1("undergroundaz", "Left Hand Drawings", "DRAWING/DRAWING",	   "r:8ea9e9a699c61edddffd79ddd0c994d7", 290398, 402),
+	WINGAME1("undergroundaz", "Left Hand Drawings", "DRAWING/DRAWING.EXE", "t:e1afecdd3458db84a7a4a0c26b8ebad3", 716183, 404),
 
 	MACGAME1("universe", "", "xn--Invisible Universe -ere/Invisible Universe", "78138a77207907642744d0960c14d9e5", 596510, 404),
 	WINGAME2t("universe", "", "UNIVERSE/UNIVERSE.EXE", "2ae0654d19de7b366e9d6e9ac4588c50", 700157,
@@ -5942,7 +5948,10 @@ static const DirectorGameDescription gameDescriptions[] = {
 	// Decomposed variant of the above
 	MACGAME1t_l("uruuruexcellent", "", "xn--68j4bvcxb0d", "bd4b12aa33ec2deae4e26b2f6f744ba7", 294107, Common::JA_JPN, 404),
 
-	WINGAME1t("ushistory", "", "HISTORY.EXE", "5660e6a7b772b5bf8867627ab0d7a58b", 703629, 404),
+	// Byron Preiss Multimedia
+	// American Heritage - The History of the United States for Young People
+	WINGAME2("ushistory", "", "HISTORY.EXE",  "t:5660e6a7b772b5bf8867627ab0d7a58b",  703629,
+							  "PRES_NEW.DIR", "f:17b18398a3bbae084c7b03789f08b9b1", 2640566, 404),
 
 	MACGAME1("vangoghstarry", "", "Starry Night",	   "rt:23a4fa8e525840af775c32da27cd9822", 491920, 404),
 	WINGAME1("vangoghstarry", "", "STARRY/STARRY.EXE", "t:771df3cf7c07a514c3f40e6a173ea387",  697909, 404),
@@ -5961,16 +5970,21 @@ static const DirectorGameDescription gameDescriptions[] = {
 	WINGAME1("vc_willie", "", "WNM.EXE", "t:8fd7da3295a87b864df8f2eca0aa7adc", 2702147, 404),
 
 	// Original Mac fllenames begin with Virtual Copâ„¢
-	MACDEMO1("vcop", "Demo", "Virtual Cop IPK", "ea646eccc9a53f44ce082459d4809a06", 482838, 404),
-	MACGAME1("vcop1", "", "Virtual Cop (8MB)", "0c7bbb4b24823e5ab871cb4c1d6f3710", 483774, 404),
-	WINGAME1("vcop1", "", "VCOP.EXE", "dfa4c8709ed83f2ac79aeecf9b2d1f95", 697427, 404),
-	MACGAME1("vcop2", "", "Cop II, The Angel Returns", "0c7bbb4b24823e5ab871cb4c1d6f3710", 482838, 404),
-	WINGAME1("vcop2", "", "VCOP2.EXE", "9683bc8aeb2d47f2e38908bac65fd9bd", 723653, 404),
+	MACDEMO1("vcop", "Demo", "xn--Virtual Cop IPK-ke3i", "r:ea646eccc9a53f44ce082459d4809a06", 482582, 404),
+	MACGAME2("vcop1", "", "xn--Virtual Cop (8MB)-x06j", "r:0c7bbb4b24823e5ab871cb4c1d6f3710",  483518,
+						  "APP/COPFILES.DIR",			"d:90c259f31cf3152d46ebfa935163e74e", 8445846, 404),
+	WINGAME2("vcop1", "", "VCOP.EXE",					"t:298b9bbd67ae7b4bc6f542bcc55f512b",  697427,
+						  "APP/COPFILES.DIR",			"f:90c259f31cf3152d46ebfa935163e74e", 8445846, 404),
+	MACGAME2("vcop2", "", "Cop II, The Angel Returns",  "r:0c7bbb4b24823e5ab871cb4c1d6f3710",  482582,
+						  "COPFILES.DXR",				"d:a0b5b3055750b51392ee2968c087fa6d", 9137834, 404),
+	WINGAME2("vcop2", "", "VCOP2.EXE",					"t:c7f9d6f5d40cfd5a6ad06197205af786",  723653,
+						  "COPFILES.DXR",				"f:a0b5b3055750b51392ee2968c087fa6d", 9137834, 404),
 
 	// Original filename is DreamLight® Verttice™ 2.0
-	MACGAME1("verttice", "v2.0", "DreamLight Verttice 2.0", "b7e69c37b7355022d400c14aa97c5d54", 512047, 404),
+	MACGAME1("verttice", "v2.0", "xn--DreamLight Verttice 2.0-35a3288r", "r:b7e69c37b7355022d400c14aa97c5d54", 511791, 404),
 
-	MACDEMO1_l("victorianpark", "Demo", "Victorian Park DEMO", "0d5f13d9321d36c23b63f229460928b4", 483443, Common::JA_JPN, 404),
+	// Original filename is ビクトリアンパークDEMO
+	MACDEMO1_l("victorianpark", "Demo", "xn--DEMO-kk4czcb2r4cq9wzd8e", "r:0d5f13d9321d36c23b63f229460928b4", 483187, Common::JA_JPN, 404),
 
 	// System 6 version is D3
 	MACGAME1("videocasino", "", "xn--Video Casino PowerMac-pb4m", "ccf864a8dc6e9d0d26eb73b4683e634b", 60068, 404),
@@ -6019,15 +6033,17 @@ static const DirectorGameDescription gameDescriptions[] = {
 	// drive letter of the CD-ROM drive into a global called CDPath. This projector calls the movie CDPath&"PREVIEW.DIR"."
 	// WINGAME1t("vygrpresents", "Installed", "GOPREV.EXE", "d6cbe5df16170418dee965c5bc1d5e87", 712453, 400),
 	// Japanese version is Mac-only
-	MACGAME1("vygrpresents", "", "Voyager Preview", "4efba92cbb95eff273c40e57d0f0f535", 296494, 403),
-	WINGAME1t("vygrpresents", "", "PREVIEW.EXE", "d1e277b509be1fe48f5ca6c48324382c", 4278225, 404),
+	MACGAME2("vygrpresents", "", "Voyager Preview",	   "r:4efba92cbb95eff273c40e57d0f0f535",  296494,
+								 "PRODUCTS/AHDN1.PIC", "d:bcdb0ff85d23175da189cb9ef592a2e6",  152122, 403),
+	WINGAME2("vygrpresents", "", "PREVIEW.EXE",		   "t:d1e277b509be1fe48f5ca6c48324382c", 4278225,
+								 "PRODUCTS/AHDN1.PIC", "d:bcdb0ff85d23175da189cb9ef592a2e6",  152122, 404),
 	MACGAME1_l("vygrpresents", "", "Voyager Preview", "4577dd3eadc467a986ab172d90871b22", 310336, Common::JA_JPN, 402),
 
 	WINDEMO1t("vtarot", "Demo", "VTAROT.EXE", "4c6c3949bda323f92f09a5769bbb250c", 693261, 404),
 
 	// Original Mac filename is VUSICâ„¢ The Screen Raverâ„¢
-	MACDEMO1("vusic", "Demo", "VUSIC The Screen Raver", "5bbb193a8785c70abe2a4d86b99e1536", 283291, 403),
-	WINDEMO1("vusic", "Demo", "VUSIC.EXE", "ff2c0a776d5f0c9aa5bc115d3b36676b", 693375, 400),
+	MACDEMO1("vusic", "Demo", "xn--VUSIC The Screen Raver-630nra", "r:5bbb193a8785c70abe2a4d86b99e1536", 283035, 404),
+	WINDEMO1("vusic", "Demo", "VUSIC.EXE",						   "t:022449ef5af577bff91ac49864dc91f2", 693375, 404),
 
 	MACGAME2_l("wallobee", "", "xn--u9j9exa4dyd1jh4lp602begzc", "0666ae690e459d3d0d91800ebd94de46", 290780,
 								   "001a", "85c99656df8d4f04eee2379c5c1e1020", 2469832, Common::JA_JPN, 402),
@@ -6057,18 +6073,23 @@ static const DirectorGameDescription gameDescriptions[] = {
 							   "NAV/SHARED.DIR", "18e32edc1081957290c03aafa89354e4", 624390, Common::JA_JPN, 400),
 
 	// Original Mac filename is わりわりワールド_デモ
-	MACDEMO1_l("wariwari", "Demo", "Wari Wari World Demo", "f808a9f231b77617fa559cf9d2da66c1", 502975, Common::JA_JPN, 400),
+	MACDEMO1_l("wariwari", "Demo", "xn--_-0cuasb25ama6rzcvb9j", "r:f808a9f231b77617fa559cf9d2da66c1", 502719, Common::JA_JPN, 400),
 	WINDEMO2_l("wariwari", "Demo", "S.EXE",				   "56faebd9531821fe9be95515c43f7fcc", 744019,
 								   "WADEMO.DXR",		   "cf6453b97f7e1cb1fb19ecb59bbb9caf", 6213026, Common::JA_JPN, 404),
 
-	MACDEMO1("warplanes", "Demo", "Warplanes Demo", "4f7ff33ce95ed9f42befdae4f9b6b690", 292244, 403),
+	MACDEMO1("warplanes", "Demo", "Warplanes Demo", "r:4f7ff33ce95ed9f42befdae4f9b6b690", 291988, 404),
 
-	MACGAME1("whales", "", "World Of Whales", "da0da5d543b237051975ad70bec129f4", 483774, 404),
+	MACGAME1("whales", "", "World Of Whales", "r:da0da5d543b237051975ad70bec129f4",  483518, 404),
+	WINGAME2("whales", "", "WHALES.EXE",	  "t:c48dc5b8af57ef656b0fc906143a8053",  741454,
+						   "LEADER.DIR",	  "f:74b913adc0fbb9e618f7b78897f3cf89", 3088618, 404),
 
-	MACGAME1("wildblueyonder1", "", "Wild Blue Yonder 1", "dc5a87dda7a0daf46604515f7d2cca66", 292244, 403),
+	// Needs installation
+	MACGAME1("wildblueyonder1", "", "Wild Blue Yonder 1", "r:dc5a87dda7a0daf46604515f7d2cca66", 291988, 403),
 
-	WINGAME1t("williamsbts", "", "BEHIND.EXE", "0a432cb988c9865c478bdc195429d3fd", 693077, 404),
-	MACGAME1("williamsbts", "", "Behind the Scenes", "5442b05b2d320eb2e2ec3c74fa41f953", 483490, 404),
+	MACGAME2("williamsbts", "", "Behind the Scenes", "r:5442b05b2d320eb2e2ec3c74fa41f953",  483490,
+								"BEHIND/BEHIND.DIR", "d:6f14d73e07077edcd07fc77fab0a4e88", 1894394, 404),
+	WINGAME2("williamsbts", "", "BEHIND.EXE",		 "t:0a432cb988c9865c478bdc195429d3fd",  693077,
+								"BEHIND/BEHIND.DIR", "f:6f14d73e07077edcd07fc77fab0a4e88", 1894394, 404),
 
 	// Windows version is D3
 	MACGAME1t("willywabbit", "North American release", "Willy Wabbit(Click me)", "04e5a9a6c98f48aaef7fe7115b3606ca", 304029, 400),
@@ -6089,7 +6110,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 	// Published in the UK by Oxford University Press
 	WINGAME1_l("winniewitch", "", "HENNIE.EXE", "25b6c57704b8a2913cfa5d7f30adbc9a", 967339, Common::NL_NLD, 400),
 	WINGAME1t_l("winniewitch", "", "HEKLA.EXE", "4ccad55d613b194bc69684ebe3e03777", 698139, Common::SE_SWE, 404),
-	WINDEMO1("winniewitch", "Demo", "WINNIE.EXE", "6efbdb88014d09c9d189a019cffa89ff", 977277, 404),
+	WINDEMO2("winniewitch", "Demo", "WINNIE.EXE",	"t:1f6282585e73580385172356ba47ced3", 977277,
+									"BATHROOM.DIR", "f:c69da5b6ea5c713a8e7d435af76d5c48", 351807, 404),
 
 	// Japanese title 'よく見てごらん!'
 	// Original filename is 'よく見てごらん!DEMO'
@@ -6101,9 +6123,10 @@ static const DirectorGameDescription gameDescriptions[] = {
 	WINGAME1t_l("wolfgang", "v1.0", "TOSYS/WOLFGANG.EXE", "35faee21d2aadf32cf2e68535ed3a77e", 1256449, Common::IT_ITA, 404),
 	WINGAME1t_l("wolfgang", "v2.0", "WOLF95.EXE", "f6b43329b6ad968eb4fb15436549ef85", 1305318, Common::IT_ITA, 404),
 
-	MACDEMO1_l("wonderomcw", "Demo", "WONDEROM_CW", "549afa25835bcd35daff0f399e54149e", 290726, Common::JA_JPN, 402),
+	MACDEMO1_l("wonderomcw", "Demo", "WONDEROM_CW", "r:549afa25835bcd35daff0f399e54149e", 290470, Common::JA_JPN, 402),
 
-	WINDEMO1("worldatlas", "Sampler", "ATLAS.EXE", "dc58e6e06807f4a4a4cc278f8748659f", 696807, 404),
+	WINDEMO2("worldatlas", "Sampler", "ATLAS.EXE",		   "t:73fd017684b6fd92d0b8a743994705ab", 696807,
+									  "DATA/CONTENTM.DIR", "f:f4c9435dac6653651bf7c86480c3333b", 681228, 404),
 
 	// Full game is not Director
 	MACDEMO1("wttf", "Demo", "WTTF", "01be45e7241194dad07938e7059b88e3", 483518, 404),
@@ -6130,7 +6153,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	// Pippin version is D5
 	// Published by Oxford Multimedia (1995)
-	WINDEMO1("xmasstory", "Demo", "ACS.EXE", "864edd47c1870fafa463340f9e2ac878", 692713, 404),
+	WINDEMO2("xmasstory", "Demo", "ACS.EXE",	   "t:7dfac3144dbd9f9792f0e41f4dee5b70",  692713,
+								  "DATA/HOME.DIR", "f:1aab64ec35fa73f58efadcae7ce835cb", 1125818, 404),
 
 	// Windows version requires install, INSTALL.Z, InstallShield V3
 	// Mac version requires install, Install Me, uses Smaller Installer by Cyclos
@@ -6141,18 +6165,18 @@ static const DirectorGameDescription gameDescriptions[] = {
 	MACGAME1("y2lgeography", "", "MSWorldGeography", "c5ca29779414b218e7cb8007e6a2c5ed", 550644, 404),
 	WINGAME1("y2lgeography", "", "MS_GEO.EXE", "97bed0dfebc8d7e1fd4547578fe07c3f", 710977, 404),
 
-	MACGAME1_l("ybr2", "", "YBR2", "b797956eb3a4dabcc15bfadf6fc66591", 504153, Common::JA_JPN, 400),
-	WINGAME1_l("ybr2", "", "YBR2.EXE", "dbe273c1df60305be98a1a582ddd2c3b", 860579, Common::JA_JPN, 400),
-	WINDEMO1_l("ybr2", "Demo", "YBR2DEMO.EXE", "25ecc053e02a0ef537d34d615119c814", 900973, Common::JA_JPN, 400),
+	MACGAME1_l("ybr2", "",	   "xn-- YBR2 -",   "r:b797956eb3a4dabcc15bfadf6fc66591", 503897, Common::JA_JPN, 404),
+	WINGAME1_l("ybr2", "",	   "YBR2/YBR2.EXE", "t:6a2cea5a937c41a1076d88759e266926", 860579, Common::JA_JPN, 404),
+	WINDEMO1_l("ybr2", "Demo", "YBR2DEMO.EXE",  "t:18d27efd0bb8b9a0e2611ab10bd8f4ea", 900973, Common::JA_JPN, 404),
 
 	// From Yeti Girls "Squeeeze"
 	// https://www.discogs.com/release/6771241
 	WINGAME1_l("yetigirlsquiz", "", "YETIQUIZ.EXE", "t:8802f85d2b2062caf840d1239edea74c", 2218809, Common::DE_DEU, 404),
 
 	// Original Mac filename is よーいドンDEMO
-	MACDEMO1_l("yoidon", "Demo", "Yo-i Don DEMO", "3a0c62a46f36157434c4204e50f22886", 305032, Common::JA_JPN, 403),
-	WINDEMO2_l("yoidon", "Demo", "S.EXE",		  "9448daa2ccbc2c3707df48323327feb0", 747007,
-								 "START.DXR",	  "651764cd9add9cc56022dc499b2aca92", 9803044, Common::JA_JPN, 404),
+	MACDEMO1_l("yoidon", "Demo", "xn--DEMO-453crpwo0kuc", "r:3a0c62a46f36157434c4204e50f22886",  304776, Common::JA_JPN, 403),
+	WINDEMO2_l("yoidon", "Demo", "S.EXE",				  "t:6008d4ee4f4bf1dc1b152f0c127f7c79",  747007,
+								 "DARUMA.DXR",			  "f:e0666195ee017989274df3ed7a532045", 2671226, Common::JA_JPN, 404),
 
 	// Original Mac filename is 真・百物語
 	MACGAME1_l("yokai", "", "xn--vek138qttcmsa439e", "17efee018a660458fae80de4364021ac", 556245, Common::JA_JPN, 404),




More information about the Scummvm-git-logs mailing list