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; |