Skip to content

Commit

Permalink
PRINCE: Proper memory reading for lightX, lightY, shadowScale
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaslw committed Jun 22, 2014
1 parent 05ef38f commit acf9ac2
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 17 deletions.
40 changes: 27 additions & 13 deletions engines/prince/script.cpp
Expand Up @@ -134,30 +134,44 @@ bool Script::loadFromStream(Common::SeekableReadStream &stream) {
stream.read(_data, _dataSize);

Common::MemoryReadStream scriptDataStream(_data, _dataSize);
scriptDataStream.seek(getRoomTableOffset()+64);
debug("room table offset %d", scriptDataStream.pos());
Room room;
room.loadFromStream(scriptDataStream);
_scriptInfo.rooms = scriptDataStream.readSint32LE();
_scriptInfo.startGame = scriptDataStream.readSint32LE();
_scriptInfo.restoreGame = scriptDataStream.readSint32LE();
_scriptInfo.stdExamine = scriptDataStream.readSint32LE();
_scriptInfo.stdPickup = scriptDataStream.readSint32LE();
_scriptInfo.stdUse = scriptDataStream.readSint32LE();
_scriptInfo.stdOpen = scriptDataStream.readSint32LE();
_scriptInfo.stdClose = scriptDataStream.readSint32LE();
_scriptInfo.stdTalk = scriptDataStream.readSint32LE();
_scriptInfo.stdGive = scriptDataStream.readSint32LE();
_scriptInfo.usdCode = scriptDataStream.readSint32LE();
_scriptInfo.invObjExam = scriptDataStream.readSint32LE();
_scriptInfo.invObjUse = scriptDataStream.readSint32LE();
_scriptInfo.invObjUU = scriptDataStream.readSint32LE();
_scriptInfo.stdUseItem = scriptDataStream.readSint32LE();
_scriptInfo.lightSources = scriptDataStream.readSint32LE();
_scriptInfo.specRout = scriptDataStream.readSint32LE();
_scriptInfo.invObjGive = scriptDataStream.readSint32LE();
_scriptInfo.stdGiveItem = scriptDataStream.readSint32LE();
_scriptInfo.goTester = scriptDataStream.readSint32LE();

return true;
}

int16 Script::getLightX(int locationNr) {
Common::MemoryReadStream readS(_data, _dataSize);
readS.seek(4*15 + locationNr*8);
return readS.readSint16LE();
return (int)READ_UINT16(&_data[_scriptInfo.lightSources + locationNr * 8]);
}

int16 Script::getLightY(int locationNr) {
Common::MemoryReadStream readS(_data, _dataSize);
readS.seek(4*15 + locationNr*8 + 2);
return readS.readSint16LE();
return (int)READ_UINT16(&_data[_scriptInfo.lightSources + locationNr * 8 + 2]);
}

int32 Script::getShadowScale(int locationNr) {
Common::MemoryReadStream readS(_data, _dataSize);
readS.seek(4*15 + locationNr*8 + 4);
return readS.readSint32LE();
return (int)READ_UINT16(&_data[_scriptInfo.lightSources + locationNr * 8 + 4]);
}

uint32 Script::getStartGameOffset() {
return _scriptInfo.startGame;
}

InterpreterFlags::InterpreterFlags() {
Expand Down
30 changes: 26 additions & 4 deletions engines/prince/script.h
Expand Up @@ -42,7 +42,6 @@ namespace Detail {
template <> inline uint8 LittleEndianReader<uint8>(void *data) { return *(uint8*)(data); }
template <> inline uint16 LittleEndianReader<uint16>(void *data) { return READ_LE_UINT16(data); }
template <> inline uint32 LittleEndianReader<uint32>(void *data) { return READ_LE_UINT32(data); }
template <> inline int8 LittleEndianReader<int8>(void *data) { return *(int8*)(data); }
}

class Room {
Expand Down Expand Up @@ -79,6 +78,29 @@ class Script {
Script();
~Script();

struct ScriptInfo {
int rooms;
int startGame;
int restoreGame;
int stdExamine;
int stdPickup;
int stdUse;
int stdOpen;
int stdClose;
int stdTalk;
int stdGive;
int usdCode;
int invObjExam;
int invObjUse;
int invObjUU;
int stdUseItem;
int lightSources;
int specRout;
int invObjGive;
int stdGiveItem;
int goTester;
};

bool loadFromStream(Common::SeekableReadStream &stream);

template <typename T>
Expand All @@ -87,9 +109,8 @@ class Script {
return Detail::LittleEndianReader<T>(&_data[address]);
}

// Some magic numbers for now, data stored in header
uint32 getRoomTableOffset() { return read<uint32>(0); }
uint32 getStartGameOffset() { return read<uint32>(4); }
//uint32 getRoomTableOffset();
uint32 getStartGameOffset();
int16 getLightX(int locationNr);
int16 getLightY(int locationNr);
int32 getShadowScale(int locationNr);
Expand All @@ -102,6 +123,7 @@ class Script {
uint8 *_data;
uint32 _dataSize;
Common::Array<Room> _roomList;
ScriptInfo _scriptInfo;
};

class InterpreterFlags {
Expand Down

0 comments on commit acf9ac2

Please sign in to comment.