[Scummvm-cvs-logs] SF.net SVN: scummvm: [29048] scummvm/trunk/engines/agi
sev at users.sourceforge.net
sev at users.sourceforge.net
Sun Sep 23 14:25:44 CEST 2007
Revision: 29048
http://scummvm.svn.sourceforge.net/scummvm/?rev=29048&view=rev
Author: sev
Date: 2007-09-23 05:25:44 -0700 (Sun, 23 Sep 2007)
Log Message:
-----------
More endianness and alignment fixes
Modified Paths:
--------------
scummvm/trunk/engines/agi/preagi_winnie.cpp
scummvm/trunk/engines/agi/preagi_winnie.h
Modified: scummvm/trunk/engines/agi/preagi_winnie.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.cpp 2007-09-23 12:11:05 UTC (rev 29047)
+++ scummvm/trunk/engines/agi/preagi_winnie.cpp 2007-09-23 12:25:44 UTC (rev 29048)
@@ -60,9 +60,62 @@
_vm->_picture->setPictureVersion(AGIPIC_C64);
}
+void Winnie::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
+ byte isBigEndian = !(_vm->getPlatform() == Common::kPlatformPC || _vm->getPlatform() == Common::kPlatformC64);
+ int i;
+
+ Common::MemoryReadStreamEndian readS(buffer, len, isBigEndian);
+
+ roomHdr->roomNumber = readS.readByte();
+ roomHdr->objId = readS.readByte();
+ roomHdr->ofsPic = readS.readUint16();
+ roomHdr->fileLen = readS.readUint16();
+ roomHdr->reserved0 = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_DIR; i++)
+ roomHdr->roomNew[i] = readS.readUint16();
+
+ roomHdr->objX = readS.readUint16();
+ roomHdr->objY = readS.readUint16();
+
+ roomHdr->reserved1 = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ roomHdr->ofsDesc[i] = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ roomHdr->ofsBlock[i] = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_STR; i++)
+ roomHdr->ofsStr[i] = readS.readUint16();
+
+ roomHdr->reserved2 = readS.readUint32();
+
+ for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
+ for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
+ roomHdr->opt[i].ofsOpt[j] = readS.readUint16();
+}
+
+void Winnie::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
+ byte isBigEndian = !(_vm->getPlatform() == Common::kPlatformPC || _vm->getPlatform() == Common::kPlatformC64);
+ int i;
+
+ Common::MemoryReadStreamEndian readS(buffer, len, isBigEndian);
+
+ objHdr->fileLen = readS.readUint16();
+ objHdr->objId = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_OBJ_STR_END; i++)
+ objHdr->ofsEndStr[i] = readS.readUint16();
+
+ for (i = 0; i < IDI_WTP_MAX_OBJ_STR; i++)
+ objHdr->ofsStr[i] = readS.readUint16();
+
+ objHdr->ofsPic = readS.readUint16();
+}
+
uint32 Winnie::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
char szFile[256] = {0};
- int i;
if (_vm->getPlatform() == Common::kPlatformPC)
sprintf(szFile, IDS_WTP_ROOM_DOS, iRoom);
@@ -84,39 +137,8 @@
file.read(buffer, filelen);
file.close();
- byte isBigEndian = !(_vm->getPlatform() == Common::kPlatformPC || _vm->getPlatform() == Common::kPlatformC64);
+ parseRoomHeader(&roomHdr, buffer, filelen);
- Common::MemoryReadStreamEndian readS(buffer, filelen, isBigEndian);
-
- roomHdr.roomNumber = readS.readByte();
- roomHdr.objId = readS.readByte();
- roomHdr.ofsPic = readS.readUint16();
- roomHdr.fileLen = readS.readUint16();
- roomHdr.reserved0 = readS.readUint16();
-
- for (i = 0; i < IDI_WTP_MAX_DIR; i++)
- roomHdr.roomNew[i] = readS.readUint16();
-
- roomHdr.objX = readS.readUint16();
- roomHdr.objY = readS.readUint16();
-
- roomHdr.reserved1 = readS.readUint16();
-
- for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
- roomHdr.ofsDesc[i] = readS.readUint16();
-
- for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
- roomHdr.ofsBlock[i] = readS.readUint16();
-
- for (i = 0; i < IDI_WTP_MAX_STR; i++)
- roomHdr.ofsStr[i] = readS.readUint16();
-
- roomHdr.reserved2 = readS.readUint32();
-
- for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
- for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
- roomHdr.opt[i].ofsOpt[j] = readS.readUint16();
-
return filelen;
}
@@ -236,7 +258,7 @@
int fBlock;
// extract header from buffer
- memcpy(&hdr, buffer, sizeof(WTP_ROOM_HDR));
+ parseRoomHeader(&hdr, buffer, sizeof(WTP_ROOM_HDR));
for (;;) {
pc = startpc;
@@ -472,7 +494,8 @@
uint8 *buffer = (uint8 *)malloc(2048);
readObj(iObj, buffer);
- memcpy(&hdr, buffer, sizeof(hdr));
+ parseObjHeader(&hdr, buffer, sizeof(hdr));
+
_vm->printStrXOR((char *)(buffer + hdr.ofsStr[iStr] - IDI_WTP_OFS_OBJ));
free(buffer);
@@ -486,7 +509,7 @@
readRoom(iRoom, roomdata, roomhdr);
readObj(iObj, objdata);
- memcpy(&objhdr, objdata, sizeof(WTP_OBJ_HDR));
+ parseObjHeader(&objhdr, objdata, sizeof(WTP_OBJ_HDR));
free(roomdata);
free(objdata);
@@ -1051,7 +1074,7 @@
return;
uint32 objSize = readObj(iObj, buffer);
- memcpy(&objhdr, buffer, sizeof(WTP_OBJ_HDR));
+ parseObjHeader(&objhdr, buffer, sizeof(WTP_OBJ_HDR));
_vm->_picture->setOffset(x0, y0);
_vm->_picture->decodePicture(buffer + objhdr.ofsPic - IDI_WTP_OFS_OBJ, objSize, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
Modified: scummvm/trunk/engines/agi/preagi_winnie.h
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.h 2007-09-23 12:11:05 UTC (rev 29047)
+++ scummvm/trunk/engines/agi/preagi_winnie.h 2007-09-23 12:25:44 UTC (rev 29048)
@@ -316,7 +316,11 @@
void intro();
void drawPic(const char*);
void gameLoop();
+
+ void parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len);
+ void parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len);
uint32 readRoom(int, uint8*, WTP_ROOM_HDR&);
+
void drawRoomPic();
int parser(int, int, uint8*);
int getObjInRoom(int);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list