[Scummvm-git-logs] scummvm master -> 7d6bdd9ab3e86526e081330febb17b885b16c9a7

sluicebox noreply at scummvm.org
Fri Nov 22 00:03:16 UTC 2024


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

Summary:
b7867fd565 AGI: PREAGI: Fix WINNIE Apple II tree house
8079ef4294 AGI: PREAGI: Fix WINNIE wind behavior
734257f348 AGI: PREAGI: Implement WINNIE timer and events
f4e0bab98d AGI: PREAGI: Fix WINNIE RNG calls
7d6bdd9ab3 AGI: PREAGI: Fix WINNIE Amiga object parsing


Commit: b7867fd565046f198e851a06713c67c9c3627e4f
    https://github.com/scummvm/scummvm/commit/b7867fd565046f198e851a06713c67c9c3627e4f
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-11-21T16:02:42-08:00

Commit Message:
AGI: PREAGI: Fix WINNIE Apple II tree house

Fixes messages and flags when exiting Christopher Robin's tree house

Changed paths:
    engines/agi/preagi/winnie.cpp


diff --git a/engines/agi/preagi/winnie.cpp b/engines/agi/preagi/winnie.cpp
index 9db9f1f45f3..edf761b9313 100644
--- a/engines/agi/preagi/winnie.cpp
+++ b/engines/agi/preagi/winnie.cpp
@@ -394,6 +394,16 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 			case IDO_WTP_GOTO_ROOM:
 				opcode = *(buffer + pc++);
 				iNewRoom = opcode;
+
+				// Apple II is missing a zero terminator in one script block of
+				// Christopher Robin's tree house. The room file was fixed in
+				// later versions, and the Apple II version behaves correctly,
+				// so the code must contain a workaround to prevent executing
+				// the next script block before exiting the room.
+				if (_room == 38 && getPlatform() == Common::kPlatformApple2) {
+					_room = iNewRoom; 
+					return IDI_WTP_PAR_GOTO; // change rooms immediately
+				}
 				break;
 			case IDO_WTP_PRINT_MSG:
 				opcode = *(buffer + pc++);


Commit: 8079ef4294ee329fc94605a5c2d8c4caf713fa5e
    https://github.com/scummvm/scummvm/commit/8079ef4294ee329fc94605a5c2d8c4caf713fa5e
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-11-21T16:02:42-08:00

Commit Message:
AGI: PREAGI: Fix WINNIE wind behavior

Wind is not supposed to drop the inventory object

Changed paths:
    engines/agi/preagi/winnie.cpp


diff --git a/engines/agi/preagi/winnie.cpp b/engines/agi/preagi/winnie.cpp
index edf761b9313..c517c1ec027 100644
--- a/engines/agi/preagi/winnie.cpp
+++ b/engines/agi/preagi/winnie.cpp
@@ -693,11 +693,13 @@ void WinnieEngine::wind() {
 	playSound(IDI_WTP_SND_WIND_0);
 	getSelection(kSelAnyKey);
 
-	dropObjRnd();
-
 	// randomize positions of objects at large
 	for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
 		if (!(_gameStateWinnie.iUsedObj[i] & IDI_XOR_KEY)) {
+			if (_gameStateWinnie.iUsedObj[i] == _gameStateWinnie.iObjHave) {
+				continue; // skip inventory object
+			}
+
 			done = false;
 			while (!done) {
 				iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);


Commit: 734257f348f16dd539ebc02712056f0875afa187
    https://github.com/scummvm/scummvm/commit/734257f348f16dd539ebc02712056f0875afa187
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-11-21T16:02:42-08:00

Commit Message:
AGI: PREAGI: Implement WINNIE timer and events

Tigger and mist now appear

Also fixes menu screens consuming 100% CPU

Changed paths:
    engines/agi/preagi/winnie.cpp
    engines/agi/preagi/winnie.h


diff --git a/engines/agi/preagi/winnie.cpp b/engines/agi/preagi/winnie.cpp
index c517c1ec027..ac68cc92f6c 100644
--- a/engines/agi/preagi/winnie.cpp
+++ b/engines/agi/preagi/winnie.cpp
@@ -314,21 +314,20 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 			// get menu selection
 			getMenuSel(szMenu, &iSel, fCanSel);
 
-			if (++_gameStateWinnie.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
-				_doWind = true;
-
-			if (_winnieEvent && (_room <= IDI_WTP_MAX_ROOM_TELEPORT)) {
-				if (!_tiggerMist) {
-					_tiggerMist = 1;
+			if (iSel == IDI_WTP_SEL_TIMER_EVENT) {
+				stopTimer();
+				if (!_tiggerOrMist) {
 					tigger();
 				} else {
-					_tiggerMist = 0;
 					mist();
 				}
-				_winnieEvent = false;
+				_tiggerOrMist = !_tiggerOrMist;
 				return IDI_WTP_PAR_GOTO;
 			}
 
+			if (++_gameStateWinnie.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
+				_doWind = true;
+
 			// process selection
 			switch (iSel) {
 			case IDI_WTP_SEL_HOME:
@@ -433,6 +432,7 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 			case IDO_WTP_WALK_MIST:
 				_mist--;
 				if (!_mist) {
+					startTimer();
 					_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
 					return IDI_WTP_PAR_GOTO;
 				}
@@ -461,6 +461,7 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 					showAmigaHelp();
 					break;
 				}
+				startTimer();
 				_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
 				return IDI_WTP_PAR_GOTO;
 			default:
@@ -474,6 +475,13 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 			return IDI_WTP_PAR_GOTO;
 		}
 
+		if (_room == IDI_WTP_ROOM_TIGGER && getPlatform() == Common::kPlatformAmiga) {
+			// Amiga removed Tigger's opcode that goes to a random room
+			startTimer();
+			_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+			return IDI_WTP_PAR_GOTO;
+		}
+
 		if (iBlock == 1)
 			return IDI_WTP_PAR_OK;
 		_system->updateScreen();
@@ -720,21 +728,32 @@ void WinnieEngine::mist() {
 	// mist length in turns is (2-5)
 	_mist = rnd(4) + 2;
 
+	printStr(IDS_WTP_MIST);
+	getSelection(kSelAnyKey);
+
 	_room = IDI_WTP_ROOM_MIST;
 	drawRoomPic();
-
-	printStr(IDS_WTP_MIST);
 }
 
 void WinnieEngine::tigger() {
-	_room = IDI_WTP_ROOM_TIGGER;
+	printStr(IDS_WTP_TIGGER);
+	getSelection(kSelAnyKey);
 
+	_room = IDI_WTP_ROOM_TIGGER;
 	drawRoomPic();
-	printStr(IDS_WTP_TIGGER);
 
 	dropObjRnd();
 }
 
+void WinnieEngine::startTimer() {
+	_timerEnabled = true;
+	_timerStart = _system->getMillis();
+}
+
+void WinnieEngine::stopTimer() {
+	_timerEnabled = false;
+}
+
 void WinnieEngine::showOwlHelp() {
 	if (_gameStateWinnie.iObjHave) {
 		printStr(IDS_WTP_OWL_0);
@@ -1079,6 +1098,15 @@ void WinnieEngine::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
 
 			drawMenu(szMenu, *iSel, fCanSel);
 		}
+
+		_system->delayMillis(10);
+		
+		if (_timerEnabled &&
+			_system->getMillis() - _timerStart >= IDI_WTP_TIMER_INTERVAL &&
+			_room <= IDI_WTP_MAX_ROOM_TELEPORT) {
+			*iSel = IDI_WTP_SEL_TIMER_EVENT;
+			return;
+		}
 	}
 }
 
@@ -1088,10 +1116,14 @@ void WinnieEngine::gameLoop() {
 	int iBlock;
 	uint8 decodePhase = 0;
 
+	startTimer();
+
 	while (!shouldQuit()) {
 		if (decodePhase == 0) {
-			if (!_gameStateWinnie.nObjMiss && (_room == IDI_WTP_ROOM_PICNIC))
+			if (!_gameStateWinnie.nObjMiss && (_room == IDI_WTP_ROOM_PICNIC)) {
 				_room = IDI_WTP_ROOM_PARTY;
+				stopTimer();
+			}
 
 			readRoom(_room, roomdata, hdr);
 			drawRoomPic();
@@ -1448,7 +1480,8 @@ void WinnieEngine::init() {
 
 	_mist = -1;
 	_doWind = false;
-	_winnieEvent = false;
+	_tiggerOrMist = false; // tigger appears first
+	stopTimer(); // timer starts after intro
 
 	if (getPlatform() != Common::kPlatformAmiga) {
 		_isBigEndian = false;
diff --git a/engines/agi/preagi/winnie.h b/engines/agi/preagi/winnie.h
index fd45107a37f..41170ddd3c4 100644
--- a/engines/agi/preagi/winnie.h
+++ b/engines/agi/preagi/winnie.h
@@ -118,6 +118,8 @@ namespace Agi {
 #define IDI_WTP_MAX_DIR                 4
 #define IDI_WTP_MAX_MOVES_UNTIL_WIND    150
 
+#define IDI_WTP_TIMER_INTERVAL          (10 * 60 * 1000) // 10 minutes on DOS
+
 // positions
 
 #define IDI_WTP_ROW_MENU        21
@@ -166,7 +168,8 @@ enum {
 	IDI_WTP_SEL_DROP,
 	IDI_WTP_SEL_REAL_OPT_1,
 	IDI_WTP_SEL_REAL_OPT_2,
-	IDI_WTP_SEL_REAL_OPT_3
+	IDI_WTP_SEL_REAL_OPT_3,
+	IDI_WTP_SEL_TIMER_EVENT
 };
 
 #define IDI_WTP_SEL_LAST    IDI_WTP_SEL_REAL_OPT_3
@@ -304,8 +307,9 @@ private:
 	int _room;
 	int _mist;
 	bool _doWind;
-	bool _winnieEvent;
-	int _tiggerMist;
+	bool _tiggerOrMist;
+	bool _timerEnabled;
+	uint32 _timerStart;
 
 	int _roomOffset;
 	int _objOffset;
@@ -352,6 +356,8 @@ private:
 	void wind();
 	void mist();
 	void tigger();
+	void startTimer();
+	void stopTimer();
 
 	void showOwlHelp();
 	void showAmigaHelp();


Commit: f4e0bab98dfd50399da7b8d4a7605089b3d98863
    https://github.com/scummvm/scummvm/commit/f4e0bab98dfd50399da7b8d4a7605089b3d98863
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-11-21T16:02:42-08:00

Commit Message:
AGI: PREAGI: Fix WINNIE RNG calls

- Fixes Rabbit's turnip sign never appearing
- Fixes number of walks through mist
- Fixes teleporting up a tree after Tigger or mist

Changed paths:
    engines/agi/preagi/preagi.cpp
    engines/agi/preagi/preagi.h
    engines/agi/preagi/winnie.cpp


diff --git a/engines/agi/preagi/preagi.cpp b/engines/agi/preagi/preagi.cpp
index a6d24be6510..e2260fe86f1 100644
--- a/engines/agi/preagi/preagi.cpp
+++ b/engines/agi/preagi/preagi.cpp
@@ -83,8 +83,8 @@ PreAgiEngine::~PreAgiEngine() {
 	delete _font;
 }
 
-int PreAgiEngine::rnd(int hi) {
-	return (_rnd->getRandomNumber(hi - 1) + 1);
+int PreAgiEngine::rnd(int max) {
+	return (_rnd->getRandomNumber(max - 1) + 1);
 }
 
 // Screen functions
diff --git a/engines/agi/preagi/preagi.h b/engines/agi/preagi/preagi.h
index 2175e4b7af1..56f510e71f2 100644
--- a/engines/agi/preagi/preagi.h
+++ b/engines/agi/preagi/preagi.h
@@ -89,7 +89,8 @@ protected:
 	// Keyboard
 	int getSelection(SelectionTypes type);
 
-	int rnd(int hi);
+	// Random number between 1 and max. Example: rnd(2) returns 1 or 2.
+	int rnd(int max);
 
 	// Text
 	void drawStr(int row, int col, int attr, const char *buffer);
diff --git a/engines/agi/preagi/winnie.cpp b/engines/agi/preagi/winnie.cpp
index ac68cc92f6c..972d1fe1923 100644
--- a/engines/agi/preagi/winnie.cpp
+++ b/engines/agi/preagi/winnie.cpp
@@ -158,7 +158,7 @@ void WinnieEngine::randomize() {
 		done = false;
 
 		while (!done) {
-			iObj = rnd(IDI_WTP_MAX_OBJ - 1);
+			iObj = rnd(IDI_WTP_MAX_OBJ); // 1-40
 			done = true;
 
 			for (int j = 0; j < IDI_WTP_MAX_OBJ_MISSING; j++) {
@@ -173,7 +173,7 @@ void WinnieEngine::randomize() {
 
 		done = false;
 		while (!done) {
-			iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
+			iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL); // 1-57
 			done = true;
 
 			for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
@@ -433,7 +433,7 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 				_mist--;
 				if (!_mist) {
 					startTimer();
-					_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+					_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT); // 1-30
 					return IDI_WTP_PAR_GOTO;
 				}
 				break;
@@ -462,7 +462,7 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 					break;
 				}
 				startTimer();
-				_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+				_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT); // 1-30
 				return IDI_WTP_PAR_GOTO;
 			default:
 				opcode = 0;
@@ -478,7 +478,7 @@ int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
 		if (_room == IDI_WTP_ROOM_TIGGER && getPlatform() == Common::kPlatformAmiga) {
 			// Amiga removed Tigger's opcode that goes to a random room
 			startTimer();
-			_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
+			_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT); // 1-30
 			return IDI_WTP_PAR_GOTO;
 		}
 
@@ -669,7 +669,7 @@ void WinnieEngine::dropObjRnd() {
 	bool done = false;
 
 	while (!done) {
-		iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
+		iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL); // 1-57
 		done = true;
 		if (iRoom == _room)
 			done = false;
@@ -710,7 +710,7 @@ void WinnieEngine::wind() {
 
 			done = false;
 			while (!done) {
-				iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
+				iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL); // 1-57
 				done = true;
 
 				for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
@@ -725,8 +725,7 @@ void WinnieEngine::wind() {
 }
 
 void WinnieEngine::mist() {
-	// mist length in turns is (2-5)
-	_mist = rnd(4) + 2;
+	_mist = 1 + rnd(4); // 2-5 walks through the mist
 
 	printStr(IDS_WTP_MIST);
 	getSelection(kSelAnyKey);


Commit: 7d6bdd9ab3e86526e081330febb17b885b16c9a7
    https://github.com/scummvm/scummvm/commit/7d6bdd9ab3e86526e081330febb17b885b16c9a7
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-11-21T16:02:42-08:00

Commit Message:
AGI: PREAGI: Fix WINNIE Amiga object parsing

Fixes objects never being accepted
Fixes talking to Owl

Changed paths:
    engines/agi/preagi/winnie.cpp


diff --git a/engines/agi/preagi/winnie.cpp b/engines/agi/preagi/winnie.cpp
index 972d1fe1923..1f42ddb7d4c 100644
--- a/engines/agi/preagi/winnie.cpp
+++ b/engines/agi/preagi/winnie.cpp
@@ -74,8 +74,9 @@ void WinnieEngine::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
 
 	Common::MemoryReadStreamEndian readS(buffer, len, _isBigEndian);
 
-	objHdr->fileLen = readS.readUint16();
-	objHdr->objId = readS.readUint16();
+	// these two values are always little endian, even on Amiga
+	objHdr->fileLen = readS.readUint16LE();
+	objHdr->objId = readS.readUint16LE();
 
 	for (i = 0; i < IDI_WTP_MAX_OBJ_STR_END; i++)
 		objHdr->ofsEndStr[i] = readS.readUint16();




More information about the Scummvm-git-logs mailing list