diff options
author | Matthew Hoops | 2007-09-23 00:12:07 +0000 |
---|---|---|
committer | Matthew Hoops | 2007-09-23 00:12:07 +0000 |
commit | 110da1b1cf5fbfdb71685135cf57f43a6a21ed72 (patch) | |
tree | aca63dbb62d7af52065152652965fecc84955c70 /engines/agi/preagi_winnie.cpp | |
parent | cee2a605698a14845de182aa7e3442015d4ae4e6 (diff) | |
download | scummvm-rg350-110da1b1cf5fbfdb71685135cf57f43a6a21ed72.tar.gz scummvm-rg350-110da1b1cf5fbfdb71685135cf57f43a6a21ed72.tar.bz2 scummvm-rg350-110da1b1cf5fbfdb71685135cf57f43a6a21ed72.zip |
readRoom is now Endian-safe
svn-id: r29035
Diffstat (limited to 'engines/agi/preagi_winnie.cpp')
-rw-r--r-- | engines/agi/preagi_winnie.cpp | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp index 7b4ded93c3..0614512129 100644 --- a/engines/agi/preagi_winnie.cpp +++ b/engines/agi/preagi_winnie.cpp @@ -57,7 +57,7 @@ void Winnie::initVars() { winnie_event = false; } -uint32 Winnie::readRoom(int iRoom, uint8 *buffer) { +uint32 Winnie::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) { char szFile[256] = {0}; if (_vm->getPlatform() == Common::kPlatformPC) sprintf(szFile, IDS_WTP_ROOM_DOS, iRoom); @@ -72,6 +72,38 @@ uint32 Winnie::readRoom(int iRoom, uint8 *buffer) { memset(buffer, 0, sizeof(buffer)); file.read(buffer, filelen); file.close(); + + memcpy(&roomHdr, buffer, sizeof(WTP_ROOM_HDR)); + if (_vm->getPlatform() == Common::kPlatformPC) { + roomHdr.ofsPic = TO_LE_16(roomHdr.ofsPic); + roomHdr.fileLen = TO_LE_16(roomHdr.fileLen); + roomHdr.reserved0 = TO_LE_16(roomHdr.reserved0); + roomHdr.reserved1 = TO_LE_16(roomHdr.reserved1); + for (byte i = 0; i < IDI_WTP_MAX_BLOCK; i++) { + roomHdr.ofsDesc[i] = TO_LE_16(roomHdr.ofsDesc[i]); + roomHdr.ofsBlock[i] = TO_LE_16(roomHdr.ofsBlock[i]); + for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++) + roomHdr.opt[i].ofsOpt[j] = TO_LE_16(roomHdr.opt[i].ofsOpt[j]); + } + for (byte i = 0; i < IDI_WTP_MAX_STR; i++) + roomHdr.ofsStr[i] = TO_LE_16(roomHdr.ofsStr[i]); + roomHdr.reserved2 = TO_LE_32(roomHdr.reserved2); + } else if (_vm->getPlatform() == Common::kPlatformAmiga) { + roomHdr.ofsPic = TO_BE_16(roomHdr.ofsPic); + roomHdr.fileLen = TO_BE_16(roomHdr.fileLen); + roomHdr.reserved0 = TO_BE_16(roomHdr.reserved0); + roomHdr.reserved1 = TO_BE_16(roomHdr.reserved1); + for (byte i = 0; i < IDI_WTP_MAX_BLOCK; i++) { + roomHdr.ofsDesc[i] = TO_BE_16(roomHdr.ofsDesc[i]); + roomHdr.ofsBlock[i] = TO_BE_16(roomHdr.ofsBlock[i]); + for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++) + roomHdr.opt[i].ofsOpt[j] = TO_BE_16(roomHdr.opt[i].ofsOpt[j]); + } + for (byte i = 0; i < IDI_WTP_MAX_STR; i++) + roomHdr.ofsStr[i] = TO_BE_16(roomHdr.ofsStr[i]); + roomHdr.reserved2 = TO_BE_32(roomHdr.reserved2); + } + return filelen; } @@ -437,8 +469,7 @@ bool Winnie::isRightObj(int iRoom, int iObj, int *iCode) { uint8 *roomdata = (uint8 *)malloc(4096); uint8 *objdata = (uint8 *)malloc(2048); - readRoom(iRoom, roomdata); - memcpy(&roomhdr, roomdata, sizeof(WTP_ROOM_HDR)); + readRoom(iRoom, roomdata, roomhdr); readObj(iObj, objdata); memcpy(&objhdr, objdata, sizeof(WTP_OBJ_HDR)); @@ -942,8 +973,7 @@ void Winnie::gameLoop() { phase0: if (!game.nObjMiss && (room == IDI_WTP_ROOM_PICNIC)) room = IDI_WTP_ROOM_PARTY; - readRoom(room, roomdata); - memcpy(&hdr, roomdata, sizeof(WTP_ROOM_HDR)); + readRoom(room, roomdata, hdr); drawRoomPic(); _vm->_gfx->doUpdate(); _vm->_system->updateScreen(); @@ -1025,12 +1055,9 @@ void Winnie::drawRoomPic() { _vm->_gfx->clearScreen(0); // read room picture - readRoom(room, buffer); - memcpy(&roomhdr, buffer, sizeof(WTP_ROOM_HDR)); + readRoom(room, buffer, roomhdr); - if (_vm->getPlatform() == Common::kPlatformAmiga) - roomhdr.ofsPic = TO_BE_16(roomhdr.ofsPic); - else if (_vm->getPlatform() == Common::kPlatformPC) + if (_vm->getPlatform() == Common::kPlatformPC) roomhdr.ofsPic = roomhdr.ofsPic - IDI_WTP_OFS_ROOM; // draw room picture @@ -1061,8 +1088,7 @@ void Winnie::printRoomStr(int iRoom, int iStr) { WTP_ROOM_HDR hdr; uint8 *buffer = (uint8 *)malloc(4096); - readRoom(iRoom, buffer); - memcpy(&hdr, buffer, sizeof(hdr)); + readRoom(iRoom, buffer, hdr); _vm->printStrXOR((char *)(buffer + hdr.ofsStr[iStr - 1] - IDI_WTP_OFS_ROOM)); free(buffer); |