aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--queen/command.cpp10
-rw-r--r--queen/debug.cpp13
-rw-r--r--queen/debug.h3
-rw-r--r--queen/logic.cpp45
-rw-r--r--queen/music.cpp4
-rw-r--r--queen/sound.cpp13
-rw-r--r--queen/sound.h2
-rw-r--r--queen/structs.h95
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;