[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