aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/preagi_mickey.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/preagi_mickey.cpp')
-rw-r--r--engines/agi/preagi_mickey.cpp279
1 files changed, 129 insertions, 150 deletions
diff --git a/engines/agi/preagi_mickey.cpp b/engines/agi/preagi_mickey.cpp
index 4c004fde0f..9a332210aa 100644
--- a/engines/agi/preagi_mickey.cpp
+++ b/engines/agi/preagi_mickey.cpp
@@ -176,8 +176,9 @@ void Mickey::printExeMsg(int ofs) {
waitAnyKeyAnim();
}
-void Mickey::printDatStr(int iDat, int iStr) {
+void Mickey::printDatString(int iStr) {
char *buffer = (char *)malloc(256);
+ int iDat = getDat(game.iRoom);
MSA_DAT_HEADER hdr;
char szFile[256] = {0};
@@ -406,7 +407,16 @@ bool Mickey::getMenuSelRow(MSA_MENU menu, int *sel0, int *sel1, int iRow) {
case Common::EVENT_KEYDOWN:
switch (event.kbd.keycode) {
case Common::KEYCODE_2:
- hidden();
+ // Hidden message
+ if (game.iRoom == IDI_MSA_PIC_MERCURY_CAVE_0) {
+ for (int i = 0; i < 5; i++) {
+ printExeMsg(IDO_MSA_HIDDEN_MSG[i]);
+ }
+ _vm->clearTextArea();
+ //_vm->_gfx->doUpdate();
+ //_vm->_system->updateScreen(); // TODO: this should go in the game's main loop
+ waitAnyKey();
+ }
break;
case Common::KEYCODE_8:
if (event.kbd.flags & Common::KBD_CTRL) {
@@ -559,10 +569,6 @@ void Mickey::patchMenu(MSA_MENU *menu) {
centerMenu(menu);
}
-void Mickey::printDatString(int iStr) {
- printDatStr(getDat(game.iRoom), iStr);
-}
-
void Mickey::printDatMessage(int iStr) {
printDatString(iStr);
//_vm->_gfx->doUpdate();
@@ -707,52 +713,6 @@ void Mickey::drawPic(int iPic) {
//_vm->_system->updateScreen(); // TODO: this should go in the game's main loop
}
-void Mickey::drawRoomPicture() {
- if (false) { // (getDebug()) { // TODO
- drawPic(0);
- debug();
- } else {
- if (game.iRoom == IDI_MSA_PIC_TITLE) {
- drawPic(IDI_MSA_PIC_TITLE);
- } else {
- drawPic(game.iRmPic[game.iRoom]);
- }
- }
-}
-
-void Mickey::drawRoomObjects() {
- if (game.iRoom >= IDI_MSA_MAX_PIC_ROOM)
- return;
-
- uint8 buffer[256];
- int pBuf = 0;
- int nObjs;
-
- // draw ship control room window
-
- if (game.iRoom == IDI_MSA_PIC_SHIP_CONTROLS) {
- if (game.fFlying) {
- drawObj(IDI_MSA_OBJECT_W_SPACE, 0, 0);
- } else {
- drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_W_EARTH + game.iPlanet), 0, 1);
- }
- }
-
- // draw objects
-
- if (game.iRmObj[game.iRoom] != IDI_MSA_OBJECT_NONE) {
- readOfsData(IDO_MSA_ROOM_OBJECT_XY_OFFSETS,
- game.iRmObj[game.iRoom], buffer, sizeof(buffer));
-
- nObjs = buffer[pBuf++];
-
- for (int iObj = 0; iObj < nObjs; iObj++) {
- drawObj((ENUM_MSA_OBJECT)buffer[pBuf], buffer[pBuf + 1], buffer[pBuf + 2]);
- pBuf += 3;
- }
- }
-}
-
void Mickey::drawRoomAnimation() {
uint8 objLight[] = {
0xF0, 1, 0xF9, 2, 43, 45, 0xFF
@@ -807,7 +767,6 @@ void Mickey::drawRoomAnimation() {
case IDI_MSA_PIC_SHIP_CONTROLS:
// draw XL30 screen
-
if (game.fAnimXL30) {
if (game.nFrame > 5) game.nFrame = 0;
drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_XL31 + game.nFrame), 0, 4);
@@ -819,7 +778,6 @@ void Mickey::drawRoomAnimation() {
default:
// draw crystal
-
if (game.iRoom == IDI_MSA_XTAL_ROOM_XY[game.iPlanet][0]) {
if (!game.fHasXtal) {
switch(game.iPlanet) {
@@ -841,8 +799,51 @@ void Mickey::drawRoomAnimation() {
}
void Mickey::drawRoom() {
- drawRoomPicture();
- drawRoomObjects();
+ uint8 buffer[256];
+ int pBuf = 0;
+ int nObjs;
+
+ // Draw room picture
+ if (true) { // (!getDebug()) { // TODO
+ if (game.iRoom == IDI_MSA_PIC_TITLE) {
+ drawPic(IDI_MSA_PIC_TITLE);
+ } else {
+ drawPic(game.iRmPic[game.iRoom]);
+
+ if (game.iRoom == IDI_MSA_PIC_SHIP_CONTROLS) {
+ // Draw ship control room window
+ if (game.fFlying) {
+ drawObj(IDI_MSA_OBJECT_W_SPACE, 0, 0);
+ } else {
+ drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_W_EARTH + game.iPlanet), 0, 1);
+ }
+ }
+ }
+ } else {
+ // Debug
+ drawPic(0);
+ debug();
+ }
+
+ // Draw room objects
+ if (game.iRoom >= IDI_MSA_MAX_PIC_ROOM) {
+ drawRoomAnimation();
+ return;
+ }
+
+ if (game.iRmObj[game.iRoom] != IDI_MSA_OBJECT_NONE) {
+ readOfsData(IDO_MSA_ROOM_OBJECT_XY_OFFSETS,
+ game.iRmObj[game.iRoom], buffer, sizeof(buffer));
+
+ nObjs = buffer[pBuf++];
+
+ for (int iObj = 0; iObj < nObjs; iObj++) {
+ drawObj((ENUM_MSA_OBJECT)buffer[pBuf], buffer[pBuf + 1], buffer[pBuf + 2]);
+ pBuf += 3;
+ }
+ }
+
+ // Draw room animation
drawRoomAnimation();
}
@@ -1053,18 +1054,6 @@ void Mickey::printStory() {
game.fStoryShown = true;
}
-void Mickey::hidden() {
- if (game.iRoom == IDI_MSA_PIC_MERCURY_CAVE_0) {
- for (int i = 0; i < 5; i++) {
- printExeMsg(IDO_MSA_HIDDEN_MSG[i]);
- }
- _vm->clearTextArea();
- //_vm->_gfx->doUpdate();
- //_vm->_system->updateScreen(); // TODO: this should go in the game's main loop
- waitAnyKey();
- }
-}
-
int Mickey::getPlanet() {
if (!game.nButtons)
return -1;
@@ -1975,72 +1964,6 @@ bool Mickey::parse(int cmd, int arg) {
return false;
}
-void Mickey::gameLoop() {
- char *buffer = new char[sizeof(MSA_MENU)];
- MSA_MENU menu;
- int iSel0, iSel1;
- bool done;
- MSA_DAT_HEADER hdr;
- char szFile[256] = {0};
- Common::File infile;
-
- for (;;) {
- drawRoom();
-
- if (game.fIntro) {
- game.fIntro = false;
- } else {
- printRoomDesc();
- }
-
- if (game.iRoom == IDI_MSA_PIC_NEPTUNE_GUARD) {
- game.iRoom = IDI_MSA_PIC_NEPTUNE_LEADER;
- done = true;
- } else {
- done = false;
- }
-
- while (!done) {
- // Check air supply
- if (game.fSuit) {
- game.nAir -= 1;
- for (int i = 0; i < 4; i++) {
- if (game.nAir == IDI_MSA_AIR_SUPPLY[i]) {
- playSound(IDI_MSA_SND_XL30);
- printExeMsg(IDO_MSA_XL30_SPEAKING);
- printExeMsg(IDO_MSA_AIR_SUPPLY[i]);
- if (i == 3) {
- exit(0);
- }
- }
- }
- } else {
- game.nAir = IDI_MSA_MAX_AIR_SUPPLY;
- }
-
- // Read menu
- getDatFileName(game.iRoom, szFile);
- readDatHdr(szFile, &hdr);
- if (!infile.open(szFile))
- return;
- infile.seek(hdr.ofsRoom[game.iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
- infile.read((uint8 *)buffer, sizeof(MSA_MENU));
- infile.close();
-
- memcpy(&menu, buffer, sizeof(MSA_MENU));
- patchMenu(&menu);
- memcpy(buffer, &menu, sizeof(MSA_MENU));
-
- getMenuSel(buffer, &iSel0, &iSel1);
- done = parse(menu.cmd[iSel0].data[iSel1], menu.arg[iSel0].data[iSel1]);
- }
-
- game.nFrame = 0;
- }
-
- delete [] buffer;
-}
-
// Keyboard
void Mickey::waitAnyKeyAnim() {
@@ -2112,7 +2035,13 @@ void Mickey::debug_DrawPics(){
// Init
-void Mickey::initVars() {
+Mickey::Mickey(PreAgiEngine *vm) : _vm(vm) {
+}
+
+Mickey::~Mickey() {
+}
+
+void Mickey::init() {
uint8 buffer[512];
// clear game struct
@@ -2161,27 +2090,77 @@ void Mickey::initVars() {
game.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
#endif
-
}
-void Mickey::initEngine() {
- // PreAGI sets the screen params here, but we've already done that in the preagi class
-}
+void Mickey::run() {
+ char *buffer = new char[sizeof(MSA_MENU)];
+ MSA_MENU menu;
+ int iSel0, iSel1;
+ bool done;
+ MSA_DAT_HEADER hdr;
+ char szFile[256] = {0};
+ Common::File infile;
-Mickey::Mickey(PreAgiEngine *vm) : _vm(vm) {
-}
+ // Game intro
+ intro();
-Mickey::~Mickey() {
-}
+ // Game loop
+ for (;;) {
+ drawRoom();
-void Mickey::init() {
- initEngine();
- initVars();
-}
+ if (game.fIntro) {
+ game.fIntro = false;
+ } else {
+ printRoomDesc();
+ }
+
+ if (game.iRoom == IDI_MSA_PIC_NEPTUNE_GUARD) {
+ game.iRoom = IDI_MSA_PIC_NEPTUNE_LEADER;
+ done = true;
+ } else {
+ done = false;
+ }
+
+ while (!done) {
+ // Check air supply
+ if (game.fSuit) {
+ game.nAir -= 1;
+ for (int i = 0; i < 4; i++) {
+ if (game.nAir == IDI_MSA_AIR_SUPPLY[i]) {
+ playSound(IDI_MSA_SND_XL30);
+ printExeMsg(IDO_MSA_XL30_SPEAKING);
+ printExeMsg(IDO_MSA_AIR_SUPPLY[i]);
+ if (i == 3) {
+ exit(0);
+ }
+ }
+ }
+ } else {
+ game.nAir = IDI_MSA_MAX_AIR_SUPPLY;
+ }
+
+ // Read menu
+ getDatFileName(game.iRoom, szFile);
+ readDatHdr(szFile, &hdr);
+ if (!infile.open(szFile))
+ return;
+ infile.seek(hdr.ofsRoom[game.iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
+ infile.read((uint8 *)buffer, sizeof(MSA_MENU));
+ infile.close();
+
+ memcpy(&menu, buffer, sizeof(MSA_MENU));
+ patchMenu(&menu);
+ memcpy(buffer, &menu, sizeof(MSA_MENU));
+
+ getMenuSel(buffer, &iSel0, &iSel1);
+ done = parse(menu.cmd[iSel0].data[iSel1], menu.arg[iSel0].data[iSel1]);
+ }
+
+ game.nFrame = 0;
+ }
+
+ delete [] buffer;
-void Mickey::run() {
- intro();
- gameLoop();
gameOver();
}