diff options
| -rw-r--r-- | queen/command.cpp | 10 | ||||
| -rw-r--r-- | queen/debug.cpp | 13 | ||||
| -rw-r--r-- | queen/debug.h | 3 | ||||
| -rw-r--r-- | queen/logic.cpp | 45 | ||||
| -rw-r--r-- | queen/music.cpp | 4 | ||||
| -rw-r--r-- | queen/sound.cpp | 13 | ||||
| -rw-r--r-- | queen/sound.h | 2 | ||||
| -rw-r--r-- | queen/structs.h | 95 | 
8 files changed, 130 insertions, 55 deletions
| diff --git a/queen/command.cpp b/queen/command.cpp index ac205923a5..a0b444bf2c 100644 --- a/queen/command.cpp +++ b/queen/command.cpp @@ -277,35 +277,35 @@ void Command::readCommandsFrom(byte *&ptr) {  	_cmdList = new CmdListData[_numCmdList + 1];  	memset(&_cmdList[0], 0, sizeof(CmdListData));  	for (i = 1; i <= _numCmdList; i++) { -		_cmdList[i].readFrom(ptr); +		_cmdList[i].readFromBE(ptr);  	}  	_numCmdArea = READ_BE_UINT16(ptr); ptr += 2;  	_cmdArea = new CmdArea[_numCmdArea + 1];  	memset(&_cmdArea[0], 0, sizeof(CmdArea));  	for (i = 1; i <= _numCmdArea; i++) { -		_cmdArea[i].readFrom(ptr); +		_cmdArea[i].readFromBE(ptr);  	}  	_numCmdObject = READ_BE_UINT16(ptr); ptr += 2;  	_cmdObject = new CmdObject[_numCmdObject + 1];  	memset(&_cmdObject[0], 0, sizeof(CmdObject));  	for (i = 1; i <= _numCmdObject; i++) { -		_cmdObject[i].readFrom(ptr); +		_cmdObject[i].readFromBE(ptr);  	}  	_numCmdInventory = READ_BE_UINT16(ptr);	ptr += 2;  	_cmdInventory = new CmdInventory[_numCmdInventory + 1];  	memset(&_cmdInventory[0], 0, sizeof(CmdInventory));  	for (i = 1; i <= _numCmdInventory; i++) { -		_cmdInventory[i].readFrom(ptr); +		_cmdInventory[i].readFromBE(ptr);  	}  	_numCmdGameState = READ_BE_UINT16(ptr);	ptr += 2;  	_cmdGameState = new CmdGameState[_numCmdGameState + 1];  	memset(&_cmdGameState[0], 0, sizeof(CmdGameState));  	for (i = 1; i <= _numCmdGameState; i++) { -		_cmdGameState[i].readFrom(ptr); +		_cmdGameState[i].readFromBE(ptr);  	}  } diff --git a/queen/debug.cpp b/queen/debug.cpp index 233c51aecb..89ed421fd2 100644 --- a/queen/debug.cpp +++ b/queen/debug.cpp @@ -28,6 +28,7 @@  #include "queen/logic.h"  #include "queen/queen.h"  #include "queen/resource.h" +#include "queen/sound.h"  #include "queen/structs.h"  #include "common/debugger.cpp" @@ -46,6 +47,7 @@ Debugger::Debugger(QueenEngine *vm)  	DCmd_Register("info", &Debugger::Cmd_Info);  	DCmd_Register("items", &Debugger::Cmd_Items);  	DCmd_Register("room", &Debugger::Cmd_Room); +	DCmd_Register("song", &Debugger::Cmd_Song);  } @@ -173,5 +175,16 @@ bool Debugger::Cmd_Room(int argc, const char **argv) {  	return true;  } +bool Debugger::Cmd_Song(int argc, const char **argv) { +	 +	if (argc == 2) { +		int16 songNum = atoi(argv[1]); +		_vm->sound()->playSong(songNum); +		DebugPrintf("Playing song %d\n", songNum); +	} else { +		DebugPrintf("Usage: %s songnum\n", argv[0]); +	} +	return true; +}  } // End of namespace Queen diff --git a/queen/debug.h b/queen/debug.h index 6dd0f71cbb..b30e898598 100644 --- a/queen/debug.h +++ b/queen/debug.h @@ -48,7 +48,8 @@ protected:  	bool Cmd_Info(int argc, const char **argv);  	bool Cmd_Items(int argc, const char **argv);  	bool Cmd_Room(int argc, const char **argv); - +	bool Cmd_Song(int argc, const char **argv); +	  private:  	QueenEngine *_vm; diff --git a/queen/logic.cpp b/queen/logic.cpp index 38192c7ae4..732424174a 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -70,7 +70,7 @@ void Logic::initialise() {  	_objectData = new ObjectData[_numObjects + 1];  	memset(&_objectData[0], 0, sizeof(ObjectData));  	for (i = 1; i <= _numObjects; i++) { -		_objectData[i].readFrom(ptr); +		_objectData[i].readFromBE(ptr);  	}  	// Room data @@ -100,7 +100,7 @@ void Logic::initialise() {  	_itemData = new ItemData[_numItems + 1];  	memset(&_itemData[0], 0, sizeof(ItemData));  	for (i = 1; i <= _numItems; i++) { -		_itemData[i].readFrom(ptr); +		_itemData[i].readFromBE(ptr);  	}  	// Graphic Image Data @@ -109,7 +109,7 @@ void Logic::initialise() {  	_graphicData = new GraphicData[_numGraphics + 1];  	memset(&_graphicData[0], 0, sizeof(GraphicData));  	for (i = 1; i <= _numGraphics; i++) { -		_graphicData[i].readFrom(ptr); +		_graphicData[i].readFromBE(ptr);  	}  	_objMax   = new int16[_numRooms + 1]; @@ -125,14 +125,14 @@ void Logic::initialise() {  		memset(&_area[i][0], 0, sizeof(Area));  		for (j = 1; j <= _areaMax[i]; j++) {  			assert(j < MAX_AREAS_NUMBER); -			_area[i][j].readFrom(ptr); +			_area[i][j].readFromBE(ptr);  		}  	}  	_objectBox = new Box[_numObjects + 1];  	memset(&_objectBox[0], 0, sizeof(Box));  	for (i = 1; i <= _numObjects; i++) { -		_objectBox[i].readFrom(ptr); +		_objectBox[i].readFromBE(ptr);  	}  	// Walk OFF Data @@ -141,7 +141,7 @@ void Logic::initialise() {  	_walkOffData = new WalkOffData[_numWalkOffs + 1];  	memset(&_walkOffData[0], 0, sizeof(WalkOffData));  	for (i = 1; i <= _numWalkOffs; i++) { -		_walkOffData[i].readFrom(ptr); +		_walkOffData[i].readFromBE(ptr);  	}  	// Special Object Descriptions @@ -150,7 +150,7 @@ void Logic::initialise() {  	_objectDescription = new ObjectDescription[_numObjDesc + 1];  	memset(&_objectDescription[0], 0, sizeof(ObjectDescription));  	for (i = 1; i <= _numObjDesc; i++) { -		_objectDescription[i].readFrom(ptr); +		_objectDescription[i].readFromBE(ptr);  	}  	_vm->command()->readCommandsFrom(ptr); @@ -163,7 +163,7 @@ void Logic::initialise() {  	_furnitureData = new FurnitureData[_numFurniture + 1];  	memset(&_furnitureData[0], 0, sizeof(_furnitureData));  	for (i = 1; i <= _numFurniture; i++) { -		_furnitureData[i].readFrom(ptr); +		_furnitureData[i].readFromBE(ptr);  	}  	// Actors @@ -175,7 +175,7 @@ void Logic::initialise() {  	_actorData = new ActorData[_numActors + 1];  	memset(&_actorData[0], 0, sizeof(ActorData));  	for (i = 1; i <= _numActors; i++) { -		_actorData[i].readFrom(ptr); +		_actorData[i].readFromBE(ptr);  	}  	_numGraphicAnim = READ_BE_UINT16(ptr); ptr += 2; @@ -183,7 +183,7 @@ void Logic::initialise() {  	_graphicAnim = new GraphicAnim[_numGraphicAnim + 1];  	memset(&_graphicAnim[0], 0, sizeof(GraphicAnim));  	for (i = 1; i <= _numGraphicAnim; i++) { -		_graphicAnim[i].readFrom(ptr); +		_graphicAnim[i].readFromBE(ptr);  	}  	_currentRoom = _objectData[_entryObj].room; @@ -2296,10 +2296,10 @@ bool Logic::gameSave(uint16 slot, const char *desc) {  	WRITE_BE_UINT16(ptr, _currentRoom); ptr += 2;  	for (i = 1; i <= _numObjects; i++) -		_objectData[i].writeTo(ptr); +		_objectData[i].writeToBE(ptr);  	for (i = 1; i <= _numItems; i++) -		_itemData[i].writeTo(ptr); +		_itemData[i].writeToBE(ptr);  	for (i = 0; i < GAME_STATE_COUNT; i++) {  		WRITE_BE_UINT16(ptr, gameState(i)); ptr += 2; @@ -2307,17 +2307,17 @@ bool Logic::gameSave(uint16 slot, const char *desc) {  	for (i = 1; i <= _numRooms; i++)  		for (j = 1; j <= _areaMax[i]; j++) -			_area[i][j].writeTo(ptr); +			_area[i][j].writeToBE(ptr);  	for (i = 0; i < TALK_SELECTED_COUNT; i++) -			_talkSelected[i].writeTo(ptr); +			_talkSelected[i].writeToBE(ptr);  	for (i = 1; i <= _numWalkOffs; i++) -		_walkOffData[i].writeTo(ptr); +		_walkOffData[i].writeToBE(ptr);  	WRITE_BE_UINT16(ptr, _joe.facing); ptr += 2;  	WRITE_BE_UINT16(ptr, _vm->bam()->_flag); ptr += 2; -	WRITE_BE_UINT16(ptr, 0); ptr += 2; //TODO: lastoverride +	WRITE_BE_UINT16(ptr, _vm->sound()->lastOverride()); ptr += 2;  	//TODO: lastmerge, lastalter, altmrgpri  	for (i = 0; i < 3; i++) { @@ -2364,10 +2364,10 @@ bool Logic::gameLoad(uint16 slot) {  	currentRoom(READ_BE_UINT16(ptr)); ptr += 2;  	for (i = 1; i <= _numObjects; i++) -		_objectData[i].readFrom(ptr); +		_objectData[i].readFromBE(ptr);  	for (i = 1; i <= _numItems; i++) -		_itemData[i].readFrom(ptr); +		_itemData[i].readFromBE(ptr);  	for (i = 0; i < GAME_STATE_COUNT; i++) {  		gameState(i, (int16)READ_BE_UINT16(ptr)); ptr += 2; @@ -2375,18 +2375,17 @@ bool Logic::gameLoad(uint16 slot) {  	for (i = 1; i <= _numRooms; i++)  		for (j = 1; j <= _areaMax[i]; j++) -			_area[i][j].readFrom(ptr); +			_area[i][j].readFromBE(ptr);  	for (i = 0; i < TALK_SELECTED_COUNT; i++) -		_talkSelected[i].readFrom(ptr); +		_talkSelected[i].readFromBE(ptr);  	for (i = 1; i <= _numWalkOffs; i++) -		_walkOffData[i].readFrom(ptr); +		_walkOffData[i].readFromBE(ptr);  	joeFacing(READ_BE_UINT16(ptr));  ptr += 2;  	_vm->bam()->_flag = READ_BE_UINT16(ptr); ptr += 2; -	READ_BE_UINT16(ptr); ptr += 2; //TODO: lastoverride -	//_vm->sound()->playSound(_vm->sound()->lastOverride()) +	_vm->sound()->playSong((int16)READ_BE_UINT16(ptr)); ptr += 2;  	//TODO: lastmerge, lastalter, altmrgpri  	for (i = 0; i < 3; i++) { diff --git a/queen/music.cpp b/queen/music.cpp index 592b196c0b..6c383d15d6 100644 --- a/queen/music.cpp +++ b/queen/music.cpp @@ -46,6 +46,10 @@ namespace Queen {  	Music::~Music() {  		stopSong();  		_midi->unloadMusic(); +		// Send All Notes Off +		for (int i = 0; i < 16; ++i) +			_driver->send((123 << 8) | 0xB0 | i); +		_driver->close();  		delete _midi;  		delete[] _musicData;	  	} diff --git a/queen/sound.cpp b/queen/sound.cpp index d1b7e56986..1a606603f4 100644 --- a/queen/sound.cpp +++ b/queen/sound.cpp @@ -110,7 +110,7 @@ void Sound::playSong(int16 songNum) {  	if (!musicOn())  		return; -	//TODO: Record onto song stack for saving/loading +	_lastOverride = songNum;  	switch (_tune[newTune - 1].mode) {  		//Random loop @@ -127,7 +127,16 @@ void Sound::playSong(int16 songNum) {  			break;  	} -	_vm->music()->playSong(_tune[newTune - 1].tuneNum[0] - 1); +	int16 song = _tune[newTune - 1].tuneNum[0] - 1; + +	// Work around bug in Roland music, note that these numbers are 'one-off' from +	// the original code. +	if (/*isRoland && */ song == 88 || song == 89) { +		warning("Working around Roland music bug"); +		song = 62; +	} +	 +	_vm->music()->playSong(song);  } diff --git a/queen/sound.h b/queen/sound.h index cf0fbe140a..6a77612359 100644 --- a/queen/sound.h +++ b/queen/sound.h @@ -72,6 +72,8 @@ public:  	void musicToggle(bool val)	{ _musicToggle = val; }  	void toggleMusic()		{ _musicToggle ^= true; } +	int16 lastOverride()		{ return _lastOverride; } +	  protected:  	SoundMixer *_mixer;  	QueenEngine *_vm; diff --git a/queen/structs.h b/queen/structs.h index 68f9bf1573..8e52641bd7 100644 --- a/queen/structs.h +++ b/queen/structs.h @@ -29,14 +29,21 @@ namespace Queen {  struct Box {  	int16 x1, y1, x2, y2; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		x1 = (int16)READ_BE_UINT16(ptr); ptr += 2;  		y1 = (int16)READ_BE_UINT16(ptr); ptr += 2;  		x2 = (int16)READ_BE_UINT16(ptr); ptr += 2;  		y2 = (int16)READ_BE_UINT16(ptr); ptr += 2;  	} -	void writeTo(byte *&ptr) { +	void readFromLE(byte *&ptr) { +		x1 = (int16)READ_LE_UINT16(ptr); ptr += 2; +		y1 = (int16)READ_LE_UINT16(ptr); ptr += 2; +		x2 = (int16)READ_LE_UINT16(ptr); ptr += 2; +		y2 = (int16)READ_LE_UINT16(ptr); ptr += 2; +	} + +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, x1); ptr += 2;  		WRITE_BE_UINT16(ptr, y1); ptr += 2;  		WRITE_BE_UINT16(ptr, x2); ptr += 2; @@ -71,17 +78,25 @@ struct Area {  	//! entry in ObjectData, object lying in this area  	uint16 object; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		mapNeighbours = (int16)READ_BE_UINT16(ptr); ptr += 2; -		box.readFrom(ptr); +		box.readFromBE(ptr);  		bottomScaleFactor = READ_BE_UINT16(ptr); ptr += 2;  		topScaleFactor = READ_BE_UINT16(ptr); ptr += 2;  		object = READ_BE_UINT16(ptr); ptr += 2;  	} -	void writeTo(byte *&ptr) { +	void readFromLE(byte *&ptr) { +		mapNeighbours = (int16)READ_LE_UINT16(ptr); ptr += 2; +		box.readFromLE(ptr); +		bottomScaleFactor = READ_LE_UINT16(ptr); ptr += 2; +		topScaleFactor = READ_LE_UINT16(ptr); ptr += 2; +		object = READ_LE_UINT16(ptr); ptr += 2; +	} + +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, mapNeighbours); ptr += 2; -		box.writeTo(ptr); +		box.writeToBE(ptr);  		WRITE_BE_UINT16(ptr, bottomScaleFactor); ptr += 2;  		WRITE_BE_UINT16(ptr, topScaleFactor); ptr += 2;  		WRITE_BE_UINT16(ptr, object); ptr += 2; @@ -113,13 +128,19 @@ struct WalkOffData {  	//! coordinates to reach  	uint16 x, y; -	void readFrom(byte *& ptr) { +	void readFromBE(byte *&ptr) {  		entryObj = (int16)READ_BE_UINT16(ptr); ptr += 2;  		x = READ_BE_UINT16(ptr); ptr += 2;  		y = READ_BE_UINT16(ptr); ptr += 2;  	} -	void writeTo(byte *&ptr) { +	void readFromLE(byte *&ptr) { +		entryObj = (int16)READ_LE_UINT16(ptr); ptr += 2; +		x = READ_LE_UINT16(ptr); ptr += 2; +		y = READ_LE_UINT16(ptr); ptr += 2; +	} + +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, entryObj); ptr += 2;  		WRITE_BE_UINT16(ptr, x); ptr += 2;  		WRITE_BE_UINT16(ptr, y); ptr += 2; @@ -155,7 +176,7 @@ struct GraphicData {  	//! moving speed of object  	uint16 speed; -	void readFrom(byte *& ptr) { +	void readFromBE(byte *&ptr) {  		x = READ_BE_UINT16(ptr); ptr += 2;  		y = READ_BE_UINT16(ptr); ptr += 2;  		firstFrame = (int16)READ_BE_UINT16(ptr); ptr += 2; @@ -221,7 +242,7 @@ struct ObjectData {  	*/  	int16 image; -	void readFrom(byte *& ptr) { +	void readFromBE(byte *&ptr) {  		name = (int16)READ_BE_UINT16(ptr); ptr += 2;  		x = READ_BE_UINT16(ptr); ptr += 2;  		y = READ_BE_UINT16(ptr); ptr += 2; @@ -231,8 +252,19 @@ struct ObjectData {  		state = READ_BE_UINT16(ptr); ptr += 2;  		image = (int16)READ_BE_UINT16(ptr); ptr += 2;  	} +	 +	void readFromLE(byte *&ptr) { +		name = (int16)READ_LE_UINT16(ptr); ptr += 2; +		x = READ_LE_UINT16(ptr); ptr += 2; +		y = READ_LE_UINT16(ptr); ptr += 2; +		description = READ_LE_UINT16(ptr); ptr += 2; +		entryObj = (int16)READ_LE_UINT16(ptr); ptr += 2; +		room = READ_LE_UINT16(ptr); ptr += 2; +		state = READ_LE_UINT16(ptr); ptr += 2; +		image = (int16)READ_LE_UINT16(ptr); ptr += 2; +	} -	void writeTo(byte *&ptr) { +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, name); ptr += 2;  		WRITE_BE_UINT16(ptr, x); ptr += 2;  		WRITE_BE_UINT16(ptr, y); ptr += 2; @@ -279,7 +311,7 @@ struct ObjectDescription {  	//! last description number used (in order to avoid re-using it)  	uint16 lastSeenNumber; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		object = READ_BE_UINT16(ptr); ptr += 2;  		type = READ_BE_UINT16(ptr); ptr += 2;  		lastDescription = READ_BE_UINT16(ptr); ptr += 2; @@ -300,7 +332,7 @@ struct ItemData {  	//! entry in OBJECT_DESCR (>0 if available)  	int16 sfxDescription; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		name = (int16)READ_BE_UINT16(ptr); ptr += 2;  		description = READ_BE_UINT16(ptr); ptr += 2;  		state = READ_BE_UINT16(ptr); ptr += 2; @@ -308,7 +340,15 @@ struct ItemData {  		sfxDescription = (int16)READ_BE_UINT16(ptr); ptr += 2;  	} -	void writeTo(byte *&ptr) { +	void readFromLE(byte *&ptr) { +		name = (int16)READ_LE_UINT16(ptr); ptr += 2; +		description = READ_LE_UINT16(ptr); ptr += 2; +		state = READ_LE_UINT16(ptr); ptr += 2; +		frame = READ_LE_UINT16(ptr); ptr += 2; +		sfxDescription = (int16)READ_LE_UINT16(ptr); ptr += 2; +	} + +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, name); ptr += 2;  		WRITE_BE_UINT16(ptr, description); ptr += 2;  		WRITE_BE_UINT16(ptr, state); ptr += 2; @@ -340,7 +380,7 @@ struct ActorData {  	//! entry in ACTOR_FILE  	uint16 actorFile; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		room = (int16)READ_BE_UINT16(ptr); ptr += 2;  		bobNum = (int16)READ_BE_UINT16(ptr); ptr += 2;  		name = READ_BE_UINT16(ptr); ptr += 2; @@ -385,7 +425,7 @@ struct CmdListData {  	//! special section to execute (refer to execute.c l.423-451)  	int16 specialSection; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		verb = (Verb)READ_BE_UINT16(ptr); ptr += 2;  		nounObj1 = (int16)READ_BE_UINT16(ptr); ptr += 2;  		nounObj2 = (int16)READ_BE_UINT16(ptr); ptr += 2; @@ -412,7 +452,7 @@ struct CmdArea {  	//! room in which the area must be changed  	uint16 room; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		id = (int16)READ_BE_UINT16(ptr); ptr += 2;  		area = (int16)READ_BE_UINT16(ptr); ptr += 2;  		room = READ_BE_UINT16(ptr); ptr += 2; @@ -428,7 +468,7 @@ struct CmdObject {  	//! >0: copy from srcObj, 0: nothing, -1: delete dstObj  	int16 srcObj; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		id = (int16)READ_BE_UINT16(ptr); ptr += 2;  		dstObj = (int16)READ_BE_UINT16(ptr); ptr += 2;  		srcObj = (int16)READ_BE_UINT16(ptr); ptr += 2; @@ -444,7 +484,7 @@ struct CmdInventory {  	//! >0: valid  	int16 srcItem; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		id = (int16)READ_BE_UINT16(ptr); ptr += 2;  		dstItem = (int16)READ_BE_UINT16(ptr); ptr += 2;  		srcItem = (int16)READ_BE_UINT16(ptr); ptr += 2; @@ -459,7 +499,7 @@ struct CmdGameState {  	int16 gameStateValue;  	uint16 speakValue; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		id = (int16)READ_BE_UINT16(ptr); ptr += 2;  		gameStateSlot = (int16)READ_BE_UINT16(ptr); ptr += 2;  		gameStateValue = (int16)READ_BE_UINT16(ptr); ptr += 2; @@ -490,7 +530,7 @@ struct FurnitureData {  	*/  	int16 gameStateValue; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		room = (int16)READ_BE_UINT16(ptr); ptr += 2;  		gameStateValue = (int16)READ_BE_UINT16(ptr); ptr += 2;  	} @@ -502,7 +542,7 @@ struct GraphicAnim {  	int16 frame;  	uint16 speed; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		keyFrame = (int16)READ_BE_UINT16(ptr); ptr += 2;  		frame = (int16)READ_BE_UINT16(ptr); ptr += 2;  		speed = READ_BE_UINT16(ptr); ptr += 2; @@ -532,14 +572,21 @@ struct TalkSelected {  	bool hasTalkedTo;  	int16 values[4]; -	void readFrom(byte *&ptr) { +	void readFromBE(byte *&ptr) {  		hasTalkedTo = READ_BE_UINT16(ptr) != 0; ptr += 2;  		for (int i = 0; i < 4; i++) {  			values[i] = (int16)READ_BE_UINT16(ptr); ptr += 2;  		}	  	} -	void writeTo(byte *&ptr) { +	void readFromLE(byte *&ptr) { +		hasTalkedTo = READ_LE_UINT16(ptr) != 0; ptr += 2; +		for (int i = 0; i < 4; i++) { +			values[i] = (int16)READ_LE_UINT16(ptr); ptr += 2; +		}	 +	} + +	void writeToBE(byte *&ptr) {  		WRITE_BE_UINT16(ptr, (uint16)hasTalkedTo); ptr += 2;  		for (int i = 0; i < 4; i++) {  			WRITE_BE_UINT16(ptr, values[i]); ptr += 2; | 
