2007-09-01 14:58:46 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
* $ URL $
* $ Id $
*
*/
2008-10-06 12:48:52 +00:00
# include "common/events.h"
2007-09-03 01:55:56 +00:00
# include "common/savefile.h"
2007-09-01 18:46:55 +00:00
2007-09-04 06:54:40 +00:00
# include "graphics/cursorman.h"
2007-09-18 16:20:44 +00:00
# include "agi/preagi.h"
2007-09-01 14:58:46 +00:00
# include "agi/preagi_mickey.h"
# include "agi/graphics.h"
2007-09-01 18:46:55 +00:00
namespace Agi {
int Mickey : : getDat ( int iRoom ) {
if ( ( ( iRoom > 0 ) & & ( iRoom < 24 ) ) | | iRoom = = 154 | | iRoom = = 155 ) return IDI_MSA_PLANET_EARTH ;
if ( ( iRoom > = 30 ) & & ( iRoom < = 39 ) ) return IDI_MSA_PLANET_VENUS ;
if ( ( iRoom > = 40 ) & & ( iRoom < = 69 ) ) return IDI_MSA_PLANET_NEPTUNE ;
if ( ( iRoom > = 70 ) & & ( iRoom < = 82 ) ) return IDI_MSA_PLANET_MERCURY ;
if ( ( iRoom > = 83 ) & & ( iRoom < = 92 ) ) return IDI_MSA_PLANET_SATURN ;
if ( ( iRoom > = 93 ) & & ( iRoom < = 103 ) ) return IDI_MSA_PLANET_PLUTO ;
if ( ( iRoom > = 106 ) & & ( iRoom < = 120 ) ) return IDI_MSA_PLANET_JUPITER ;
if ( ( iRoom > = 121 ) & & ( iRoom < = 132 ) ) return IDI_MSA_PLANET_MARS ;
if ( ( iRoom > = 133 ) & & ( iRoom < = 145 ) ) return IDI_MSA_PLANET_URANUS ;
return IDI_MSA_PLANET_SPACESHIP ;
}
void Mickey : : readExe ( int ofs , uint8 * buffer , long buflen ) {
Common : : File infile ;
2009-01-18 16:41:35 +00:00
if ( ! infile . open ( " mickey.exe " ) )
2007-09-01 18:46:55 +00:00
return ;
infile . seek ( ofs , SEEK_SET ) ;
infile . read ( buffer , buflen ) ;
infile . close ( ) ;
}
void Mickey : : getDatFileName ( int iRoom , char * szFile ) {
sprintf ( szFile , IDS_MSA_PATH_DAT , IDS_MSA_NAME_DAT [ getDat ( iRoom ) ] ) ;
}
void Mickey : : readDatHdr ( char * szFile , MSA_DAT_HEADER * hdr ) {
Common : : File infile ;
if ( ! infile . open ( szFile ) )
return ;
hdr - > filelen = infile . readByte ( ) ;
hdr - > filelen + = infile . readByte ( ) * 0x100 ;
2007-09-21 20:06:57 +00:00
2007-09-01 18:46:55 +00:00
for ( int i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + ) {
hdr - > ofsRoom [ i ] = infile . readByte ( ) ;
hdr - > ofsRoom [ i ] + = infile . readByte ( ) * 0x100 ;
}
for ( int i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + ) {
hdr - > ofsDesc [ i ] = infile . readByte ( ) ;
hdr - > ofsDesc [ i ] + = infile . readByte ( ) * 0x100 ;
}
for ( int i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + ) {
hdr - > ofsStr [ i ] = infile . readByte ( ) ;
hdr - > ofsStr [ i ] + = infile . readByte ( ) * 0x100 ;
}
infile . close ( ) ;
}
void Mickey : : readOfsData ( int offset , int iItem , uint8 * buffer , long buflen ) {
uint16 ofs [ 256 ] ;
readExe ( offset , buffer , buflen ) ;
2007-09-03 00:47:51 +00:00
memcpy ( ofs , buffer , sizeof ( ofs ) ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
for ( int i = 0 ; i < 256 ; i + + )
ofs [ i ] = buffer [ i * 2 ] + 256 * buffer [ i * 2 + 1 ] ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
readExe ( ofs [ iItem ] + IDI_MSA_OFS_EXE , buffer , buflen ) ;
}
// User Interface
bool Mickey : : chooseY_N ( int ofsPrompt , bool fErrorMsg ) {
printExeStr ( ofsPrompt ) ;
2009-01-05 01:40:08 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
2007-11-20 20:25:37 +00:00
switch ( _vm - > getSelection ( kSelYesNo ) ) {
2008-01-13 23:43:17 +00:00
case 0 : return false ;
case 1 : return true ;
default :
if ( fErrorMsg ) {
printExeStr ( IDO_MSA_PRESS_YES_OR_NO ) ;
waitAnyKey ( ) ;
printExeStr ( ofsPrompt ) ;
}
break ;
2007-09-01 18:46:55 +00:00
}
}
2009-05-24 15:17:42 +00:00
2009-01-05 01:40:08 +00:00
return false ;
2007-09-01 18:46:55 +00:00
}
int Mickey : : choose1to9 ( int ofsPrompt ) {
2007-11-20 20:25:37 +00:00
int answer = 0 ;
2007-09-01 18:46:55 +00:00
printExeStr ( ofsPrompt ) ;
2009-01-05 01:40:08 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
2007-11-20 20:25:37 +00:00
answer = _vm - > getSelection ( kSelNumber ) ;
if ( answer = = 10 ) {
2007-09-01 18:46:55 +00:00
printExeStr ( IDO_MSA_PRESS_1_TO_9 ) ;
2007-09-19 09:54:42 +00:00
if ( _vm - > getSelection ( kSelAnyKey ) = = 0 )
2007-09-01 18:46:55 +00:00
return 0 ;
printExeStr ( ofsPrompt ) ;
2007-11-20 20:25:37 +00:00
} else return answer ;
2007-09-01 18:46:55 +00:00
}
2009-01-05 01:40:08 +00:00
return 0 ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : printStr ( char * buffer ) {
int pc = 1 ;
int nRows , iCol , iRow ;
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
nRows = * buffer + IDI_MSA_ROW_MENU_0 ;
2007-09-02 02:25:13 +00:00
_vm - > clearTextArea ( ) ;
2007-09-01 18:46:55 +00:00
for ( iRow = IDI_MSA_ROW_MENU_0 ; iRow < nRows ; iRow + + ) {
iCol = * ( buffer + pc + + ) ;
2007-09-02 01:45:59 +00:00
_vm - > drawStr ( iRow , iCol , IDA_DEFAULT , buffer + pc ) ;
2007-09-01 18:46:55 +00:00
pc + = strlen ( buffer + pc ) + 1 ;
}
2007-11-20 20:25:37 +00:00
// Show the string on screen
_vm - > _gfx - > doUpdate ( ) ;
_vm - > _system - > updateScreen ( ) ;
2007-09-01 18:46:55 +00:00
}
2009-01-18 16:41:35 +00:00
void Mickey : : printLine ( const char * buffer ) {
_vm - > clearTextArea ( ) ;
_vm - > drawStr ( 22 , 18 - strlen ( buffer ) / 2 , IDA_DEFAULT , buffer ) ;
// Show the string on screen
_vm - > _gfx - > doUpdate ( ) ;
_vm - > _system - > updateScreen ( ) ;
2009-01-18 22:02:22 +00:00
waitAnyKey ( true ) ;
2009-01-18 16:41:35 +00:00
}
2007-09-01 18:46:55 +00:00
void Mickey : : printExeStr ( int ofs ) {
uint8 buffer [ 256 ] = { 0 } ;
if ( ! ofs )
return ;
readExe ( ofs , buffer , sizeof ( buffer ) ) ;
printStr ( ( char * ) buffer ) ;
}
void Mickey : : printExeMsg ( int ofs ) {
if ( ! ofs )
return ;
2007-09-21 20:06:57 +00:00
2007-09-01 18:46:55 +00:00
printExeStr ( ofs ) ;
2007-11-20 20:25:37 +00:00
waitAnyKey ( true ) ;
2007-09-01 18:46:55 +00:00
}
2007-09-22 13:27:10 +00:00
void Mickey : : printDatString ( int iStr ) {
2009-01-18 16:41:35 +00:00
char buffer [ 256 ] ;
2007-09-23 16:52:53 +00:00
int iDat = getDat ( _game . iRoom ) ;
2007-09-22 11:31:46 +00:00
MSA_DAT_HEADER hdr ;
char szFile [ 256 ] = { 0 } ;
sprintf ( szFile , IDS_MSA_PATH_DAT , IDS_MSA_NAME_DAT [ iDat ] ) ;
readDatHdr ( szFile , & hdr ) ;
Common : : File infile ;
if ( ! infile . open ( szFile ) )
return ;
infile . seek ( hdr . ofsStr [ iStr ] + IDI_MSA_OFS_DAT , SEEK_SET ) ;
infile . read ( ( uint8 * ) buffer , 256 ) ;
infile . close ( ) ;
2007-09-01 18:46:55 +00:00
printStr ( buffer ) ;
}
void Mickey : : printDesc ( int iRoom ) {
2007-09-22 11:31:46 +00:00
MSA_DAT_HEADER hdr ;
char szFile [ 256 ] = { 0 } ;
getDatFileName ( iRoom , szFile ) ;
readDatHdr ( szFile , & hdr ) ;
Common : : File infile ;
if ( ! infile . open ( szFile ) )
return ;
2009-10-01 12:09:02 +00:00
char * buffer = ( char * ) malloc ( 256 ) ;
2007-09-22 11:31:46 +00:00
memset ( buffer , 0 , 256 ) ;
infile . seek ( hdr . ofsDesc [ iRoom - 1 ] + IDI_MSA_OFS_DAT , SEEK_SET ) ;
infile . read ( buffer , 256 ) ;
infile . close ( ) ;
2007-09-01 18:46:55 +00:00
printStr ( buffer ) ;
free ( buffer ) ;
}
2008-01-09 10:31:52 +00:00
bool Mickey : : checkMenu ( ) {
MSA_MENU menu ;
int iSel0 , iSel1 ;
MSA_DAT_HEADER hdr ;
char szFile [ 256 ] = { 0 } ;
Common : : File infile ;
getDatFileName ( _game . iRoom , szFile ) ;
readDatHdr ( szFile , & hdr ) ;
if ( ! infile . open ( szFile ) )
return false ;
2009-10-01 12:09:02 +00:00
char * buffer = new char [ sizeof ( MSA_MENU ) ] ;
2008-01-09 10:31:52 +00:00
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 ) ;
2008-05-07 14:31:45 +00:00
delete [ ] buffer ;
2008-01-09 10:31:52 +00:00
return parse ( menu . cmd [ iSel0 ] . data [ iSel1 ] , menu . arg [ iSel0 ] . data [ iSel1 ] ) ;
}
2007-09-01 18:46:55 +00:00
void Mickey : : drawMenu ( MSA_MENU menu , int sel0 , int sel1 ) {
int iWord ;
int iRow ;
int sel ;
uint8 attr ;
// draw menu
2007-09-02 02:25:13 +00:00
_vm - > clearTextArea ( ) ;
2007-09-01 18:46:55 +00:00
for ( iRow = 0 ; iRow < 2 ; iRow + + ) {
for ( iWord = 0 ; iWord < menu . row [ iRow ] . count ; iWord + + ) {
if ( iRow )
2007-09-19 08:40:12 +00:00
sel = sel1 ;
else
2007-09-01 18:46:55 +00:00
sel = sel0 ;
2007-09-19 08:40:12 +00:00
if ( iWord = = sel )
attr = IDA_DEFAULT_REV ;
else
2007-09-01 18:46:55 +00:00
attr = IDA_DEFAULT ;
2007-09-19 08:40:12 +00:00
_vm - > drawStr ( IDI_MSA_ROW_MENU_0 + iRow , menu . row [ iRow ] . entry [ iWord ] . x0 ,
2007-09-02 01:45:59 +00:00
attr , ( char * ) menu . row [ iRow ] . entry [ iWord ] . szText ) ;
2007-09-01 18:46:55 +00:00
}
}
2007-11-23 18:28:40 +00:00
// Menu created, show it on screen
2007-11-20 23:42:45 +00:00
_vm - > _gfx - > doUpdate ( ) ;
2007-11-23 18:28:40 +00:00
_vm - > _system - > updateScreen ( ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : getMouseMenuSelRow ( MSA_MENU menu , int * sel0 , int * sel1 , int iRow , int x , int y ) {
int iWord ;
int * sel = 0 ;
2009-09-30 16:16:53 +00:00
switch ( iRow ) {
2007-09-01 18:46:55 +00:00
case 0 :
if ( y ! = IDI_MSA_ROW_MENU_0 ) return ;
sel = sel0 ;
break ;
case 1 :
if ( y ! = IDI_MSA_ROW_MENU_1 ) return ;
sel = sel1 ;
break ;
2010-10-15 08:49:20 +00:00
default :
return ;
2007-09-01 18:46:55 +00:00
}
for ( iWord = 0 ; iWord < menu . row [ iRow ] . count ; iWord + + ) {
2007-09-19 08:40:12 +00:00
if ( ( x > = menu . row [ iRow ] . entry [ iWord ] . x0 ) & &
( x < ( int ) ( menu . row [ iRow ] . entry [ iWord ] . x0 +
2007-09-01 18:46:55 +00:00
strlen ( ( char * ) menu . row [ iRow ] . entry [ iWord ] . szText ) ) ) ) {
* sel = iWord ;
break ;
}
}
}
bool Mickey : : getMenuSelRow ( MSA_MENU menu , int * sel0 , int * sel1 , int iRow ) {
Common : : Event event ;
int * sel = 0 ;
int nWords ;
int x , y ;
2007-09-05 15:43:56 +00:00
int goIndex = - 1 , northIndex = - 1 , southIndex = - 1 , eastIndex = - 1 , westIndex = - 1 ;
2007-09-01 18:46:55 +00:00
2009-09-30 16:16:53 +00:00
switch ( iRow ) {
2007-09-01 18:46:55 +00:00
case 0 :
sel = sel0 ;
break ;
case 1 :
sel = sel1 ;
break ;
}
nWords = menu . row [ iRow ] . count ;
2007-09-23 16:52:53 +00:00
_clickToMove = false ;
2007-09-05 15:43:56 +00:00
for ( int i = 0 ; i < = menu . row [ 0 ] . count ; i + + )
if ( menu . row [ 0 ] . entry [ i ] . szText [ 0 ] = = 71 & & menu . row [ 0 ] . entry [ i ] . szText [ 1 ] = = 79 ) // GO
goIndex = i ;
if ( goIndex > = 0 ) {
for ( int j = 0 ; j < = menu . row [ 1 ] . count ; j + + ) {
if ( menu . row [ 1 ] . entry [ j ] . szText [ 0 ] = = 78 & & menu . row [ 1 ] . entry [ j ] . szText [ 1 ] = = 79 & &
menu . row [ 1 ] . entry [ j ] . szText [ 2 ] = = 82 & & menu . row [ 1 ] . entry [ j ] . szText [ 3 ] = = 84 & &
menu . row [ 1 ] . entry [ j ] . szText [ 4 ] = = 72 )
northIndex = j ;
if ( menu . row [ 1 ] . entry [ j ] . szText [ 0 ] = = 83 & & menu . row [ 1 ] . entry [ j ] . szText [ 1 ] = = 79 & &
menu . row [ 1 ] . entry [ j ] . szText [ 2 ] = = 85 & & menu . row [ 1 ] . entry [ j ] . szText [ 3 ] = = 84 & &
menu . row [ 1 ] . entry [ j ] . szText [ 4 ] = = 72 )
southIndex = j ;
if ( menu . row [ 1 ] . entry [ j ] . szText [ 0 ] = = 69 & & menu . row [ 1 ] . entry [ j ] . szText [ 1 ] = = 65 & &
menu . row [ 1 ] . entry [ j ] . szText [ 2 ] = = 83 & & menu . row [ 1 ] . entry [ j ] . szText [ 3 ] = = 84 )
eastIndex = j ;
if ( menu . row [ 1 ] . entry [ j ] . szText [ 0 ] = = 87 & & menu . row [ 1 ] . entry [ j ] . szText [ 1 ] = = 69 & &
menu . row [ 1 ] . entry [ j ] . szText [ 2 ] = = 83 & & menu . row [ 1 ] . entry [ j ] . szText [ 3 ] = = 84 )
westIndex = j ;
}
}
2007-09-01 18:46:55 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-01-05 01:40:08 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
2007-09-01 18:46:55 +00:00
while ( _vm - > _system - > getEventManager ( ) - > pollEvent ( event ) ) {
2009-09-30 16:16:53 +00:00
switch ( event . type ) {
2008-07-16 04:22:56 +00:00
case Common : : EVENT_RTL :
2007-09-01 18:46:55 +00:00
case Common : : EVENT_QUIT :
2008-07-08 01:33:57 +00:00
return 0 ;
2007-09-01 18:46:55 +00:00
case Common : : EVENT_MOUSEMOVE :
if ( iRow < 2 ) {
2007-09-01 23:30:37 +00:00
x = event . mouse . x / 8 ;
y = event . mouse . y / 8 ;
2007-09-04 06:54:40 +00:00
// If the mouse hovers over the menu, refresh the menu
if ( ( iRow = = 0 & & y = = IDI_MSA_ROW_MENU_0 ) | | ( iRow = = 1 & & y = = IDI_MSA_ROW_MENU_1 ) ) {
getMouseMenuSelRow ( menu , sel0 , sel1 , iRow , x , y ) ;
drawMenu ( menu , * sel0 , * sel1 ) ;
}
2007-09-05 15:43:56 +00:00
// Change cursor
if ( northIndex > = 0 & & ( event . mouse . x > = 20 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . y > = 0 & & event . mouse . y < = 10 ) ) {
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( true ) ;
2007-09-05 15:43:56 +00:00
} else if ( southIndex > = 0 & & ( event . mouse . x > = 20 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . y > = IDI_MSA_PIC_HEIGHT - 10 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) ) {
2007-09-19 08:40:12 +00:00
_vm - > _gfx - > setCursorPalette ( true ) ;
2007-09-05 15:43:56 +00:00
} else if ( westIndex > = 0 & & ( event . mouse . y > = 0 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . x > = 20 & & event . mouse . x < = 30 ) ) {
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( true ) ;
2007-09-05 15:43:56 +00:00
} else if ( eastIndex > = 0 & & ( event . mouse . y > = 0 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . x > = IDI_MSA_PIC_WIDTH * 2 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) ) {
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( true ) ;
2007-09-05 15:43:56 +00:00
} else {
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-05 15:43:56 +00:00
}
2007-09-01 18:46:55 +00:00
}
break ;
case Common : : EVENT_LBUTTONUP :
2007-09-05 15:43:56 +00:00
// Click to move
if ( northIndex > = 0 & & ( event . mouse . x > = 20 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . y > = 0 & & event . mouse . y < = 10 ) ) {
* sel0 = goIndex ;
* sel1 = northIndex ;
2007-09-05 15:43:56 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-06-06 17:39:13 +00:00
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-23 16:52:53 +00:00
_clickToMove = true ;
2007-09-05 15:43:56 +00:00
} else if ( southIndex > = 0 & & ( event . mouse . x > = 20 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . y > = IDI_MSA_PIC_HEIGHT - 10 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) ) {
* sel0 = goIndex ;
* sel1 = southIndex ;
2007-09-05 15:43:56 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-06-06 17:39:13 +00:00
2007-09-19 08:40:12 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-23 16:52:53 +00:00
_clickToMove = true ;
2007-09-05 15:43:56 +00:00
} else if ( westIndex > = 0 & & ( event . mouse . y > = 0 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . x > = 20 & & event . mouse . x < = 30 ) ) {
* sel0 = goIndex ;
* sel1 = westIndex ;
2007-09-05 15:43:56 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-06-06 17:39:13 +00:00
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-23 16:52:53 +00:00
_clickToMove = true ;
2007-09-05 15:43:56 +00:00
} else if ( eastIndex > = 0 & & ( event . mouse . y > = 0 & & event . mouse . y < = IDI_MSA_PIC_HEIGHT ) & &
2009-06-06 17:39:13 +00:00
( event . mouse . x > = IDI_MSA_PIC_WIDTH * 2 & & event . mouse . x < = ( IDI_MSA_PIC_WIDTH + 10 ) * 2 ) ) {
* sel0 = goIndex ;
* sel1 = eastIndex ;
2007-09-05 15:43:56 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-06-06 17:39:13 +00:00
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-23 16:52:53 +00:00
_clickToMove = true ;
2007-09-05 15:43:56 +00:00
} else {
2007-09-05 21:57:57 +00:00
_vm - > _gfx - > setCursorPalette ( false ) ;
2007-09-05 15:43:56 +00:00
}
2007-09-01 18:46:55 +00:00
return true ;
case Common : : EVENT_RBUTTONUP :
2009-06-06 17:39:13 +00:00
* sel0 = 0 ;
* sel1 = - 1 ;
2007-09-01 18:46:55 +00:00
return false ;
case Common : : EVENT_WHEELUP :
if ( iRow < 2 ) {
* sel - = 1 ;
2009-06-06 17:39:13 +00:00
if ( * sel < 0 )
* sel = nWords - 1 ;
2007-09-01 18:46:55 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
}
break ;
case Common : : EVENT_WHEELDOWN :
if ( iRow < 2 ) {
* sel + = 1 ;
2009-06-06 17:39:13 +00:00
if ( * sel = = nWords )
* sel = 0 ;
2007-09-01 18:46:55 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
}
break ;
case Common : : EVENT_KEYDOWN :
2008-01-09 09:19:17 +00:00
if ( event . kbd . keycode = = Common : : KEYCODE_d & & ( event . kbd . flags & Common : : KBD_CTRL ) & & _vm - > _console ) {
_vm - > _console - > attach ( ) ;
_vm - > _console - > onFrame ( ) ;
continue ;
}
2007-09-01 18:46:55 +00:00
switch ( event . kbd . keycode ) {
case Common : : KEYCODE_2 :
2007-09-22 13:27:10 +00:00
// Hidden message
2007-09-23 16:52:53 +00:00
if ( _game . iRoom = = IDI_MSA_PIC_MERCURY_CAVE_0 ) {
2007-09-22 13:27:10 +00:00
for ( int i = 0 ; i < 5 ; i + + ) {
printExeMsg ( IDO_MSA_HIDDEN_MSG [ i ] ) ;
}
_vm - > clearTextArea ( ) ;
waitAnyKey ( ) ;
}
2007-09-01 18:46:55 +00:00
break ;
case Common : : KEYCODE_8 :
if ( event . kbd . flags & Common : : KBD_CTRL ) {
2009-06-06 17:39:13 +00:00
* sel0 = 0 ;
* sel1 = - 1 ;
return false ;
2007-09-01 18:46:55 +00:00
}
break ;
case Common : : KEYCODE_ESCAPE :
2009-06-06 17:39:13 +00:00
* sel0 = 0 ;
* sel1 = - 1 ;
return false ;
2007-09-01 18:46:55 +00:00
case Common : : KEYCODE_s :
2007-09-03 09:39:15 +00:00
_vm - > flipflag ( fSoundOn ) ;
2007-09-01 18:46:55 +00:00
break ;
case Common : : KEYCODE_c :
inventory ( ) ;
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
* sel0 = 0 ;
* sel1 = - 1 ;
return false ;
2007-09-01 18:46:55 +00:00
case Common : : KEYCODE_b :
printRoomDesc ( ) ;
drawMenu ( menu , * sel0 , * sel1 ) ;
2009-06-06 17:39:13 +00:00
* sel0 = 0 ;
* sel1 = - 1 ;
return false ;
2007-09-01 18:46:55 +00:00
case Common : : KEYCODE_LEFT :
case Common : : KEYCODE_KP4 :
case Common : : KEYCODE_4 :
if ( iRow < 2 ) {
* sel - = 1 ;
2009-06-06 17:39:13 +00:00
if ( * sel < 0 )
* sel = nWords - 1 ;
2007-09-01 18:46:55 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
}
break ;
case Common : : KEYCODE_RIGHT :
case Common : : KEYCODE_SPACE :
case Common : : KEYCODE_KP6 :
case Common : : KEYCODE_6 :
if ( iRow < 2 ) {
* sel + = 1 ;
2009-06-06 17:39:13 +00:00
if ( * sel = = nWords )
* sel = 0 ;
2007-09-01 18:46:55 +00:00
drawMenu ( menu , * sel0 , * sel1 ) ;
}
break ;
case Common : : KEYCODE_RETURN :
2007-09-04 06:54:40 +00:00
case Common : : KEYCODE_KP_ENTER :
2007-09-01 18:46:55 +00:00
return true ;
default :
break ;
}
break ;
2007-09-01 19:03:22 +00:00
default :
break ;
2007-09-01 18:46:55 +00:00
}
animate ( ) ;
drawMenu ( menu , * sel0 , * sel1 ) ;
}
animate ( ) ;
drawMenu ( menu , * sel0 , * sel1 ) ;
}
2009-05-24 15:17:42 +00:00
2009-01-05 01:40:08 +00:00
return false ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : getMenuSel ( char * buffer , int * sel0 , int * sel1 ) {
MSA_MENU menu ;
memcpy ( & menu , buffer , sizeof ( MSA_MENU ) ) ;
* sel0 = 0 ;
* sel1 = - 1 ;
2007-09-04 06:54:40 +00:00
// Show the mouse cursor for the menu
CursorMan . showMouse ( true ) ;
2009-01-05 01:40:08 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
while ( ! _vm - > shouldQuit ( ) ) {
2007-09-01 18:46:55 +00:00
if ( getMenuSelRow ( menu , sel0 , sel1 , 0 ) ) {
2007-09-23 16:52:53 +00:00
if ( _clickToMove )
2007-09-05 15:43:56 +00:00
break ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
* sel1 = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
if ( getMenuSelRow ( menu , sel0 , sel1 , 1 ) ) {
break ;
}
}
}
2009-05-24 15:17:42 +00:00
2007-09-23 16:52:53 +00:00
if ( _clickToMove | | getMenuSelRow ( menu , sel0 , sel1 , 2 ) ) {
2007-09-01 18:46:55 +00:00
break ;
}
}
2007-09-04 06:54:40 +00:00
// Menu selection made, hide the mouse cursor
CursorMan . showMouse ( false ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : centerMenu ( MSA_MENU * menu ) {
int iWord ;
int iRow ;
int w , x ;
for ( iRow = 0 ; iRow < 2 ; iRow + + ) {
w = 0 ;
for ( iWord = 0 ; iWord < menu - > row [ iRow ] . count ; iWord + + ) {
w + = strlen ( ( char * ) menu - > row [ iRow ] . entry [ iWord ] . szText ) ;
}
w + = menu - > row [ iRow ] . count - 1 ;
x = ( 40 - w ) / 2 ; // FIX
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
for ( iWord = 0 ; iWord < menu - > row [ iRow ] . count ; iWord + + ) {
menu - > row [ iRow ] . entry [ iWord ] . x0 = x ;
x + = strlen ( ( char * ) menu - > row [ iRow ] . entry [ iWord ] . szText ) + 1 ;
}
}
}
void Mickey : : patchMenu ( MSA_MENU * menu ) {
uint8 buffer [ 512 ] ;
uint8 menubuf [ sizeof ( MSA_MENU ) ] ;
int nPatches ;
int pBuf = 0 ;
// change planet name in ship airlock menu
2007-09-23 16:52:53 +00:00
if ( _game . iRoom = = IDI_MSA_PIC_SHIP_AIRLOCK ) {
strcpy ( ( char * ) menu - > row [ 1 ] . entry [ 2 ] . szText , IDS_MSA_NAME_PLANET [ _game . iPlanet ] ) ;
2007-09-01 18:46:55 +00:00
}
// exit if fix unnecessary
2007-09-23 16:52:53 +00:00
if ( ! _game . iRmMenu [ _game . iRoom ] ) {
2007-09-01 18:46:55 +00:00
centerMenu ( menu ) ;
return ;
}
// copy menu to menubuf
memcpy ( menubuf , menu , sizeof ( menubuf ) ) ;
// read patches
readOfsData (
2007-09-19 08:40:12 +00:00
IDOFS_MSA_MENU_PATCHES ,
2007-09-23 16:52:53 +00:00
_game . nRmMenu [ _game . iRoom ] + _game . iRmMenu [ _game . iRoom ] - 1 ,
2007-09-01 18:46:55 +00:00
buffer , sizeof ( buffer )
) ;
// get number of patches
nPatches = buffer [ pBuf + + ] ;
// patch menubuf
for ( int iPatch = 0 ; iPatch < nPatches ; iPatch + + ) {
if ( buffer [ pBuf ] > sizeof ( menubuf ) ) {
// patch address out of bounds
}
menubuf [ buffer [ pBuf ] ] = buffer [ pBuf + 1 ] ;
pBuf + = 2 ;
}
// copy menubuf back to menu
memcpy ( menu , menubuf , sizeof ( MSA_MENU ) ) ;
// center menu
centerMenu ( menu ) ;
}
void Mickey : : printDatMessage ( int iStr ) {
printDatString ( iStr ) ;
2007-11-20 20:25:37 +00:00
waitAnyKey ( true ) ;
2007-09-01 18:46:55 +00:00
}
// Sound
2007-09-03 10:25:48 +00:00
void Mickey : : playNote ( MSA_SND_NOTE note ) {
if ( ! note . counter ) {
2007-11-20 00:26:36 +00:00
// Pause
2007-11-20 19:15:11 +00:00
_vm - > _system - > delayMillis ( ( uint ) ( note . length / IDI_SND_TIMER_RESOLUTION ) ) ;
2007-09-03 10:25:48 +00:00
} else {
2007-11-20 19:15:11 +00:00
_vm - > playNote ( IDI_SND_OSCILLATOR_FREQUENCY / note . counter , ( int32 ) ( note . length / IDI_SND_TIMER_RESOLUTION ) ) ;
2007-09-03 10:25:48 +00:00
}
2007-09-01 18:46:55 +00:00
}
2007-09-03 01:33:17 +00:00
void Mickey : : playSound ( ENUM_MSA_SOUND iSound ) {
2007-09-03 09:39:15 +00:00
if ( ! _vm - > getflag ( fSoundOn ) )
2007-09-01 18:46:55 +00:00
return ;
2007-09-03 01:33:17 +00:00
Common : : Event event ;
2007-09-01 18:46:55 +00:00
MSA_SND_NOTE note ;
uint8 * buffer = new uint8 [ 1024 ] ;
int pBuf = 1 ;
2009-09-30 16:16:53 +00:00
switch ( iSound ) {
2007-09-01 18:46:55 +00:00
case IDI_MSA_SND_XL30 :
for ( int iNote = 0 ; iNote < 6 ; iNote + + ) {
2007-09-01 23:30:37 +00:00
note . counter = _vm - > rnd ( 59600 ) + 59 ;
2007-09-01 18:46:55 +00:00
note . length = 4 ;
2007-09-03 10:25:48 +00:00
playNote ( note ) ;
2007-09-01 18:46:55 +00:00
}
break ;
default :
readOfsData ( IDOFS_MSA_SOUND_DATA , iSound , buffer , 1024 ) ;
for ( ; ; ) {
memcpy ( & note , buffer + pBuf , sizeof ( note ) ) ;
if ( ! note . counter & & ! note . length )
break ;
2007-09-03 10:25:48 +00:00
playNote ( note ) ;
2007-09-01 18:46:55 +00:00
pBuf + = 3 ;
if ( iSound = = IDI_MSA_SND_THEME ) {
2007-09-03 01:33:17 +00:00
while ( _vm - > _system - > getEventManager ( ) - > pollEvent ( event ) ) {
2009-09-30 16:16:53 +00:00
switch ( event . type ) {
2008-07-16 04:22:56 +00:00
case Common : : EVENT_RTL :
2007-09-03 01:33:17 +00:00
case Common : : EVENT_QUIT :
case Common : : EVENT_LBUTTONUP :
case Common : : EVENT_RBUTTONUP :
case Common : : EVENT_KEYDOWN :
2008-05-07 14:31:45 +00:00
delete [ ] buffer ;
2007-09-01 18:46:55 +00:00
return ;
2007-09-03 01:36:55 +00:00
default :
break ;
2007-09-01 18:46:55 +00:00
}
}
}
}
break ;
}
2008-05-07 14:31:45 +00:00
delete [ ] buffer ;
2007-09-01 18:46:55 +00:00
}
// Graphics
void Mickey : : drawObj ( ENUM_MSA_OBJECT iObj , int x0 , int y0 ) {
2007-09-11 21:39:16 +00:00
char szFile [ 255 ] = { 0 } ;
sprintf ( szFile , IDS_MSA_PATH_OBJ , IDS_MSA_NAME_OBJ [ iObj ] ) ;
Common : : File file ;
if ( ! file . open ( szFile ) )
return ;
2009-06-06 17:39:13 +00:00
2009-10-01 12:09:02 +00:00
uint8 * buffer = new uint8 [ 4096 ] ;
2007-09-11 21:39:16 +00:00
uint32 size = file . size ( ) ;
file . read ( buffer , size ) ;
file . close ( ) ;
2007-09-05 15:43:56 +00:00
if ( iObj = = IDI_MSA_OBJECT_CRYSTAL )
2007-09-06 01:18:13 +00:00
_vm - > _picture - > setPictureFlags ( kPicFStep ) ;
2008-01-27 19:47:41 +00:00
2007-09-06 01:18:13 +00:00
_vm - > _picture - > setOffset ( x0 , y0 ) ;
2007-09-11 21:39:16 +00:00
_vm - > _picture - > decodePicture ( buffer , size , false , IDI_MSA_PIC_WIDTH , IDI_MSA_PIC_HEIGHT ) ;
2007-09-06 01:18:13 +00:00
_vm - > _picture - > setOffset ( 0 , 0 ) ;
_vm - > _picture - > showPic ( 10 , 0 , IDI_MSA_PIC_WIDTH , IDI_MSA_PIC_HEIGHT ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : drawPic ( int iPic ) {
2007-09-11 21:39:16 +00:00
char szFile [ 255 ] = { 0 } ;
sprintf ( szFile , IDS_MSA_PATH_PIC , iPic ) ;
Common : : File file ;
if ( ! file . open ( szFile ) )
return ;
2009-06-06 17:39:13 +00:00
2009-10-01 12:09:02 +00:00
uint8 * buffer = new uint8 [ 4096 ] ;
2007-09-11 21:39:16 +00:00
uint32 size = file . size ( ) ;
file . read ( buffer , size ) ;
file . close ( ) ;
2007-09-02 13:44:37 +00:00
// Note that decodePicture clears the screen
2007-09-11 21:39:16 +00:00
_vm - > _picture - > decodePicture ( buffer , size , true , IDI_MSA_PIC_WIDTH , IDI_MSA_PIC_HEIGHT ) ;
2007-09-03 15:03:50 +00:00
_vm - > _picture - > showPic ( 10 , 0 , IDI_MSA_PIC_WIDTH , IDI_MSA_PIC_HEIGHT ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : drawRoomAnimation ( ) {
uint8 objLight [ ] = {
2007-09-05 19:36:13 +00:00
0xF0 , 1 , 0xF9 , 2 , 43 , 45 , 0xFF
2007-09-01 18:46:55 +00:00
} ;
2009-09-30 16:16:53 +00:00
switch ( _game . iRoom ) {
2007-09-01 18:46:55 +00:00
case IDI_MSA_PIC_EARTH_SHIP :
case IDI_MSA_PIC_VENUS_SHIP :
case IDI_MSA_PIC_NEPTUNE_SHIP :
case IDI_MSA_PIC_MERCURY_SHIP :
case IDI_MSA_PIC_SATURN_SHIP :
case IDI_MSA_PIC_PLUTO_SHIP :
case IDI_MSA_PIC_JUPITER_SHIP :
case IDI_MSA_PIC_MARS_SHIP :
case IDI_MSA_PIC_URANUS_SHIP :
case IDI_MSA_PIC_SHIP_VENUS :
case IDI_MSA_PIC_SHIP_NEPTUNE :
case IDI_MSA_PIC_SHIP_MERCURY :
case IDI_MSA_PIC_SHIP_SATURN :
case IDI_MSA_PIC_SHIP_PLUTO :
case IDI_MSA_PIC_SHIP_JUPITER :
case IDI_MSA_PIC_SHIP_MARS :
case IDI_MSA_PIC_SHIP_URANUS :
2007-09-03 15:03:50 +00:00
{
2009-06-06 17:39:13 +00:00
// draw blinking ship lights
2007-09-01 18:46:55 +00:00
2009-06-06 17:39:13 +00:00
uint8 iColor = 0 ;
2007-09-03 15:03:50 +00:00
2009-06-06 17:39:13 +00:00
_vm - > _picture - > setPattern ( 2 , 0 ) ;
2007-09-01 18:46:55 +00:00
2009-06-06 17:39:13 +00:00
for ( int i = 0 ; i < 12 ; i + + ) {
iColor = _game . nFrame + i ;
if ( iColor > 15 )
iColor - = 15 ;
2007-09-01 18:46:55 +00:00
2009-06-06 17:39:13 +00:00
objLight [ 1 ] = iColor ;
objLight [ 4 ] + = 7 ;
2007-09-03 15:03:50 +00:00
2009-06-06 17:39:13 +00:00
_vm - > _picture - > setPictureData ( objLight ) ;
_vm - > _picture - > setPictureFlags ( kPicFCircle ) ;
_vm - > _picture - > drawPicture ( ) ;
}
_vm - > _picture - > showPic ( 10 , 0 , IDI_MSA_PIC_WIDTH , IDI_MSA_PIC_HEIGHT ) ;
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
2009-06-06 17:39:13 +00:00
_game . nFrame - - ;
if ( _game . nFrame < 0 )
_game . nFrame = 15 ;
2007-09-01 18:46:55 +00:00
2009-06-06 17:39:13 +00:00
playSound ( IDI_MSA_SND_PRESS_BLUE ) ;
2007-09-03 15:03:50 +00:00
}
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_PIC_SHIP_CONTROLS :
// draw XL30 screen
2007-09-23 16:52:53 +00:00
if ( _game . fAnimXL30 ) {
2009-06-06 17:39:13 +00:00
if ( _game . nFrame > 5 )
_game . nFrame = 0 ;
2007-09-23 16:52:53 +00:00
drawObj ( ( ENUM_MSA_OBJECT ) ( IDI_MSA_OBJECT_XL31 + _game . nFrame ) , 0 , 4 ) ;
_game . nFrame + + ;
2007-09-01 18:46:55 +00:00
} ;
break ;
default :
// draw crystal
2007-09-23 16:52:53 +00:00
if ( _game . iRoom = = IDI_MSA_XTAL_ROOM_XY [ _game . iPlanet ] [ 0 ] ) {
if ( ! _game . fHasXtal ) {
2009-09-30 16:16:53 +00:00
switch ( _game . iPlanet ) {
2007-09-01 18:46:55 +00:00
case IDI_MSA_PLANET_VENUS :
2009-06-06 17:39:13 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ! = 2 )
break ;
2007-09-01 18:46:55 +00:00
default :
drawObj (
2007-09-19 08:40:12 +00:00
IDI_MSA_OBJECT_CRYSTAL ,
2007-09-23 16:52:53 +00:00
IDI_MSA_XTAL_ROOM_XY [ _game . iPlanet ] [ 1 ] ,
IDI_MSA_XTAL_ROOM_XY [ _game . iPlanet ] [ 2 ]
2007-09-01 18:46:55 +00:00
) ;
break ;
}
}
}
break ;
}
}
void Mickey : : drawRoom ( ) {
2007-09-22 13:27:10 +00:00
uint8 buffer [ 256 ] ;
int pBuf = 0 ;
int nObjs ;
// Draw room picture
2008-01-09 09:46:26 +00:00
if ( _game . iRoom = = IDI_MSA_PIC_TITLE ) {
drawPic ( IDI_MSA_PIC_TITLE ) ;
} else {
drawPic ( _game . iRmPic [ _game . iRoom ] ) ;
2007-09-22 13:27:10 +00:00
2008-01-09 09:46:26 +00:00
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 ) ;
2007-09-22 13:27:10 +00:00
}
}
}
// Draw room objects
2007-09-23 16:52:53 +00:00
if ( _game . iRoom > = IDI_MSA_MAX_PIC_ROOM ) {
2007-09-22 13:27:10 +00:00
drawRoomAnimation ( ) ;
return ;
}
2007-09-23 16:52:53 +00:00
if ( _game . iRmObj [ _game . iRoom ] ! = IDI_MSA_OBJECT_NONE ) {
2007-09-22 13:27:10 +00:00
readOfsData ( IDO_MSA_ROOM_OBJECT_XY_OFFSETS ,
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] , buffer , sizeof ( buffer ) ) ;
2007-09-22 13:27:10 +00:00
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
2007-09-01 18:46:55 +00:00
drawRoomAnimation ( ) ;
}
2007-09-09 23:14:29 +00:00
const uint8 colorBCG [ 16 ] [ 2 ] = {
2007-09-10 13:15:40 +00:00
{ 0x00 , 0x00 } , // 0 (black, black)
{ 0 , 0 } ,
{ 0x00 , 0x0D } , // 2 (black, purple)
{ 0x00 , 0xFF } , // 3 (black, white)
{ 0 , 0 } ,
{ 0 , 0 } ,
{ 0 , 0 } ,
{ 0 , 0 } ,
{ 0x0D , 0x00 } , // 8 (purple, black)
{ 0 , 0 } ,
{ 0x0D , 0x0D } , // A (purple, purple)
{ 0 , 0 } ,
{ 0xFF , 0x00 } , // C (white, black)
{ 0 , 0 } ,
{ 0 , 0 } ,
{ 0xFF , 0xFF } // F (white, white)
2007-09-06 21:58:57 +00:00
} ;
2007-09-01 18:46:55 +00:00
void Mickey : : drawLogo ( ) {
2007-09-20 01:38:07 +00:00
// TODO: clean this up and make it work properly, the logo is drawn way off to the right
2009-09-24 09:01:33 +00:00
#if 0
2007-09-01 18:46:55 +00:00
char szFile [ 256 ] = { 0 } ;
uint8 * buffer = new uint8 [ 16384 ] ;
2007-09-20 01:38:07 +00:00
const int w = 150 ;
const int h = 80 ;
const int xoffset = 30 ; // FIXME: remove this
uint8 bitmap [ w ] [ h ] ;
uint8 color , color2 , color3 , color4 ;
2007-09-01 18:46:55 +00:00
// read in logos.bcg
sprintf ( szFile , IDS_MSA_PATH_LOGO ) ;
Common : : File infile ;
if ( ! infile . open ( szFile ) )
return ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
infile . read ( buffer , infile . size ( ) ) ;
infile . close ( ) ;
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
// draw logo bitmap
2007-09-06 21:58:57 +00:00
memcpy ( bitmap , buffer , sizeof ( bitmap ) ) ;
2007-09-20 01:38:07 +00:00
_vm - > _picture - > setDimensions ( w , h ) ;
// Show BCG picture
2007-09-06 21:58:57 +00:00
for ( int y = 0 ; y < h ; y + + ) {
2007-09-20 01:38:07 +00:00
for ( int x = xoffset ; x < w ; x + + ) {
color = colorBCG [ ( bitmap [ y ] [ x ] & 0xf0 ) / 0x10 ] [ 0 ] ; // background
color2 = colorBCG [ ( bitmap [ y ] [ x ] & 0xf0 ) / 0x10 ] [ 1 ] ; // background
color3 = colorBCG [ bitmap [ y ] [ x ] & 0x0f ] [ 0 ] ; // foreground
color4 = colorBCG [ bitmap [ y ] [ x ] & 0x0f ] [ 1 ] ; // foreground
_vm - > _picture - > putPixel ( x * 4 - xoffset , y , color ) ;
_vm - > _picture - > putPixel ( x * 4 + 1 - xoffset , y , color2 ) ;
_vm - > _picture - > putPixel ( x * 4 + 2 - xoffset , y , color3 ) ;
_vm - > _picture - > putPixel ( x * 4 + 3 - xoffset , y , color4 ) ;
_vm - > _picture - > putPixel ( x * 4 - xoffset , y + 1 , color ) ;
_vm - > _picture - > putPixel ( x * 4 + 1 - xoffset , y + 1 , color2 ) ;
_vm - > _picture - > putPixel ( x * 4 + 2 - xoffset , y + 1 , color3 ) ;
_vm - > _picture - > putPixel ( x * 4 + 3 - xoffset , y + 1 , color4 ) ;
2007-09-06 21:58:57 +00:00
}
}
2007-09-20 01:38:07 +00:00
_vm - > _picture - > showPic ( 10 , 10 , w , h ) ;
2008-01-27 19:47:41 +00:00
2008-05-07 14:31:45 +00:00
delete [ ] buffer ;
2009-09-24 09:01:33 +00:00
# endif
2007-09-01 18:46:55 +00:00
}
void Mickey : : animate ( ) {
2007-09-03 15:03:50 +00:00
_vm - > _system - > delayMillis ( IDI_MSA_ANIM_DELAY ) ;
drawRoomAnimation ( ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : printRoomDesc ( ) {
// print room description
2007-09-23 16:52:53 +00:00
printDesc ( _game . iRoom ) ;
2007-11-20 20:25:37 +00:00
waitAnyKey ( true ) ;
2007-09-01 18:46:55 +00:00
// print extended room description
2007-09-23 16:52:53 +00:00
if ( _game . oRmTxt [ _game . iRoom ] ) {
printExeMsg ( _game . oRmTxt [ _game . iRoom ] + IDI_MSA_OFS_EXE ) ;
2007-09-01 18:46:55 +00:00
}
}
bool Mickey : : loadGame ( ) {
2007-09-03 01:55:56 +00:00
Common : : InSaveFile * infile ;
2007-09-01 18:46:55 +00:00
char szFile [ 256 ] = { 0 } ;
bool diskerror = true ;
int sel ;
2007-12-08 17:51:23 +00:00
int saveVersion = 0 ;
int i = 0 ;
2007-09-01 18:46:55 +00:00
while ( diskerror ) {
sel = choose1to9 ( IDO_MSA_LOAD_GAME [ 1 ] ) ;
if ( ! sel )
return false ;
// load game
2007-09-21 19:12:53 +00:00
sprintf ( szFile , " %s.s%02d " , _vm - > getTargetName ( ) . c_str ( ) , sel ) ;
2007-09-03 01:55:56 +00:00
if ( ! ( infile = _vm - > getSaveFileMan ( ) - > openForLoading ( szFile ) ) ) {
2009-01-18 22:02:22 +00:00
printLine ( " PLEASE CHECK THE DISK DRIVE " ) ;
2009-06-06 17:39:13 +00:00
2007-09-19 09:54:42 +00:00
if ( _vm - > getSelection ( kSelAnyKey ) = = 0 )
2007-09-01 18:46:55 +00:00
return false ;
} else {
2011-04-12 14:53:15 +00:00
if ( infile - > readUint32BE ( ) ! = MKTAG ( ' M ' , ' I ' , ' C ' , ' K ' ) ) {
2008-08-26 12:34:05 +00:00
warning ( " Mickey::loadGame wrong save game format " ) ;
return false ;
}
2007-12-08 17:51:23 +00:00
saveVersion = infile - > readByte ( ) ;
2008-08-26 12:34:05 +00:00
if ( saveVersion < 2 ) {
warning ( " The planet data in this save game is corrupted. Load aborted " ) ;
return false ;
}
2007-12-08 18:19:09 +00:00
if ( saveVersion ! = MSA_SAVEGAME_VERSION )
warning ( " Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen " , saveVersion , MSA_SAVEGAME_VERSION ) ;
2007-12-08 17:51:23 +00:00
_game . iRoom = infile - > readByte ( ) ;
_game . iPlanet = infile - > readByte ( ) ;
_game . iDisk = infile - > readByte ( ) ;
_game . nAir = infile - > readByte ( ) ;
_game . nButtons = infile - > readByte ( ) ;
_game . nRocks = infile - > readByte ( ) ;
_game . nXtals = infile - > readByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_DAT ; i + + )
2007-12-08 17:51:23 +00:00
_game . iPlanetXtal [ i ] = infile - > readByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_PLANET ; i + + )
2008-08-26 12:34:05 +00:00
_game . iClue [ i ] = infile - > readUint16LE ( ) ;
2007-12-08 17:51:23 +00:00
infile - > read ( _game . szAddr , IDI_MSA_MAX_BUTTON + 1 ) ;
_game . fHasXtal = infile - > readByte ( ) = = 1 ;
_game . fIntro = infile - > readByte ( ) = = 1 ;
_game . fSuit = infile - > readByte ( ) = = 1 ;
_game . fShipDoorOpen = infile - > readByte ( ) = = 1 ;
_game . fFlying = infile - > readByte ( ) = = 1 ;
_game . fStoryShown = infile - > readByte ( ) = = 1 ;
_game . fPlanetsInitialized = infile - > readByte ( ) = = 1 ;
_game . fTempleDoorOpen = infile - > readByte ( ) = = 1 ;
_game . fAnimXL30 = infile - > readByte ( ) = = 1 ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 17:51:23 +00:00
_game . fItem [ i ] = infile - > readByte ( ) = = 1 ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 17:51:23 +00:00
_game . fItemUsed [ i ] = infile - > readByte ( ) = = 1 ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 18:16:30 +00:00
_game . iItem [ i ] = infile - > readSByte ( ) ;
2007-12-08 17:51:23 +00:00
_game . nItems = infile - > readByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
_game . iRmObj [ i ] = infile - > readSByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
_game . iRmPic [ i ] = infile - > readByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
_game . oRmTxt [ i ] = infile - > readUint16LE ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
_game . iRmMenu [ i ] = infile - > readByte ( ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
_game . nRmMenu [ i ] = infile - > readByte ( ) ;
2007-12-08 18:16:30 +00:00
_game . nFrame = infile - > readSByte ( ) ;
2007-12-08 17:51:23 +00:00
2007-09-01 18:46:55 +00:00
diskerror = false ;
2007-09-19 08:40:12 +00:00
delete infile ;
2007-09-01 18:46:55 +00:00
}
}
printExeMsg ( IDO_MSA_LOAD_GAME [ 2 ] ) ;
return true ;
}
void Mickey : : saveGame ( ) {
2007-09-03 01:55:56 +00:00
Common : : OutSaveFile * outfile ;
2007-09-03 00:47:51 +00:00
char szFile [ 256 ] = { 0 } ;
2007-09-01 18:46:55 +00:00
bool diskerror = true ;
int sel ;
2007-12-08 17:51:23 +00:00
int i = 0 ;
2007-09-01 18:46:55 +00:00
bool fOldDisk = chooseY_N ( IDO_MSA_SAVE_GAME [ 0 ] , false ) ;
if ( fOldDisk )
printExeStr ( IDO_MSA_SAVE_GAME [ 1 ] ) ;
else
printExeStr ( IDO_MSA_SAVE_GAME [ 2 ] ) ;
2007-09-19 09:54:42 +00:00
if ( _vm - > getSelection ( kSelAnyKey ) = = 0 )
2007-09-01 18:46:55 +00:00
return ;
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
while ( diskerror ) {
sel = choose1to9 ( IDO_MSA_SAVE_GAME [ 3 ] ) ;
if ( ! sel )
return ;
if ( fOldDisk )
printExeStr ( IDO_MSA_SAVE_GAME [ 5 ] ) ;
else
printExeStr ( IDO_MSA_SAVE_GAME [ 4 ] ) ;
2007-09-19 09:54:42 +00:00
if ( _vm - > getSelection ( kSelAnyKey ) = = 0 )
2007-09-01 18:46:55 +00:00
return ;
// save game
2007-09-21 19:12:53 +00:00
sprintf ( szFile , " %s.s%02d " , _vm - > getTargetName ( ) . c_str ( ) , sel ) ;
2007-09-03 01:55:56 +00:00
if ( ! ( outfile = _vm - > getSaveFileMan ( ) - > openForSaving ( szFile ) ) ) {
2009-01-18 22:02:22 +00:00
printLine ( " PLEASE CHECK THE DISK DRIVE " ) ;
2009-06-06 17:39:13 +00:00
2007-09-19 09:54:42 +00:00
if ( _vm - > getSelection ( kSelAnyKey ) = = 0 )
2007-09-01 18:46:55 +00:00
return ;
} else {
2011-04-12 14:53:15 +00:00
outfile - > writeUint32BE ( MKTAG ( ' M ' , ' I ' , ' C ' , ' K ' ) ) ; // header
2007-12-08 18:19:09 +00:00
outfile - > writeByte ( MSA_SAVEGAME_VERSION ) ;
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . iRoom ) ;
outfile - > writeByte ( _game . iPlanet ) ;
outfile - > writeByte ( _game . iDisk ) ;
outfile - > writeByte ( _game . nAir ) ;
outfile - > writeByte ( _game . nButtons ) ;
outfile - > writeByte ( _game . nRocks ) ;
outfile - > writeByte ( _game . nXtals ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_DAT ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . iPlanetXtal [ i ] ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_PLANET ; i + + )
2008-08-26 12:34:05 +00:00
outfile - > writeUint16LE ( _game . iClue [ i ] ) ;
2007-12-08 17:51:23 +00:00
outfile - > write ( _game . szAddr , IDI_MSA_MAX_BUTTON + 1 ) ;
outfile - > writeByte ( _game . fHasXtal ? 1 : 0 ) ;
outfile - > writeByte ( _game . fIntro ? 1 : 0 ) ;
outfile - > writeByte ( _game . fSuit ? 1 : 0 ) ;
outfile - > writeByte ( _game . fShipDoorOpen ? 1 : 0 ) ;
outfile - > writeByte ( _game . fFlying ? 1 : 0 ) ;
outfile - > writeByte ( _game . fStoryShown ? 1 : 0 ) ;
outfile - > writeByte ( _game . fPlanetsInitialized ? 1 : 0 ) ;
outfile - > writeByte ( _game . fTempleDoorOpen ? 1 : 0 ) ;
outfile - > writeByte ( _game . fAnimXL30 ? 1 : 0 ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . fItem [ i ] ? 1 : 0 ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . fItemUsed [ i ] ? 1 : 0 ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ITEM ; i + + )
2007-12-08 18:16:30 +00:00
outfile - > writeSByte ( _game . iItem [ i ] ) ;
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . nItems ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeSByte ( _game . iRmObj [ i ] ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . iRmPic [ i ] ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeUint16LE ( _game . oRmTxt [ i ] ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . iRmMenu [ i ] ) ;
2009-01-29 05:26:12 +00:00
for ( i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-12-08 17:51:23 +00:00
outfile - > writeByte ( _game . nRmMenu [ i ] ) ;
2007-12-08 18:16:30 +00:00
outfile - > writeSByte ( _game . nFrame ) ;
2007-12-08 17:51:23 +00:00
outfile - > finalize ( ) ;
2009-05-19 11:42:14 +00:00
if ( outfile - > err ( ) )
2007-12-08 17:51:23 +00:00
warning ( " Can't write file '%s'. (Disk full?) " , szFile ) ;
2007-09-01 18:46:55 +00:00
diskerror = false ;
2007-09-19 08:40:12 +00:00
delete outfile ;
2007-09-01 18:46:55 +00:00
}
}
printExeMsg ( IDO_MSA_SAVE_GAME [ 6 ] ) ;
}
void Mickey : : showPlanetInfo ( ) {
2009-01-18 22:02:22 +00:00
for ( int i = 0 ; i < 4 ; i + + ) {
2007-09-23 16:52:53 +00:00
printExeStr ( IDO_MSA_PLANET_INFO [ _game . iPlanet ] [ i ] ) ;
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
}
}
void Mickey : : printStory ( ) {
char buffer [ IDI_MSA_LEN_STORY ] = { 0 } ;
char szLine [ 41 ] = { 0 } ;
int iRow ;
int pBuf = 0 ;
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
readExe ( IDO_MSA_GAME_STORY , ( uint8 * ) buffer , sizeof ( buffer ) ) ;
2007-09-19 08:40:12 +00:00
2007-09-02 23:25:39 +00:00
_vm - > clearScreen ( IDA_DEFAULT ) ;
2007-09-01 18:46:55 +00:00
for ( iRow = 0 ; iRow < 25 ; iRow + + ) {
strcpy ( szLine , buffer + pBuf ) ;
2007-09-02 01:45:59 +00:00
_vm - > drawStr ( iRow , 0 , IDA_DEFAULT , szLine ) ;
2007-09-01 18:46:55 +00:00
pBuf + = strlen ( szLine ) + 1 ;
}
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
2007-09-02 23:25:39 +00:00
_vm - > clearScreen ( IDA_DEFAULT ) ;
2007-09-01 18:46:55 +00:00
for ( iRow = 0 ; iRow < 21 ; iRow + + ) {
strcpy ( szLine , buffer + pBuf ) ;
2007-09-03 00:47:51 +00:00
_vm - > drawStr ( iRow , 0 , IDA_DEFAULT , szLine ) ;
2007-09-01 18:46:55 +00:00
pBuf + = strlen ( szLine ) + 1 ;
}
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
2007-09-05 19:47:32 +00:00
//Set back to black
_vm - > _gfx - > clearScreen ( 0 ) ;
2007-11-23 18:28:40 +00:00
_vm - > _gfx - > doUpdate ( ) ;
2007-09-05 19:47:32 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2007-09-23 16:52:53 +00:00
_game . fStoryShown = true ;
2007-09-01 18:46:55 +00:00
}
int Mickey : : getPlanet ( ) {
2007-09-23 16:52:53 +00:00
if ( ! _game . nButtons )
2007-09-01 18:46:55 +00:00
return - 1 ;
2010-10-15 08:49:20 +00:00
for ( int iPlanet = 0 ; iPlanet < IDI_MSA_MAX_DAT - 1 ; iPlanet + + ) {
2007-09-23 16:52:53 +00:00
if ( ! strcmp ( IDS_MSA_ADDR_PLANET [ iPlanet ] , _game . szAddr ) ) {
2007-09-01 18:46:55 +00:00
return iPlanet ;
}
}
return - 1 ;
}
void Mickey : : pressOB ( int iButton ) {
char szButtons [ 12 ] = { 0 } ;
// check if too many buttons pressed
2007-09-23 16:52:53 +00:00
if ( _game . nButtons = = IDI_MSA_MAX_BUTTON ) {
_game . nButtons = 0 ;
memset ( _game . szAddr , 0 , sizeof ( _game . szAddr ) ) ;
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_TOO_MANY_BUTTONS_PRESSED ) ;
return ;
}
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
// add button press to address
2007-09-23 16:52:53 +00:00
_game . nButtons + + ;
_game . szAddr [ _game . nButtons - 1 ] = ( char ) iButton ;
2007-09-01 18:46:55 +00:00
// format buttons string
for ( int i = 0 ; i < IDI_MSA_MAX_BUTTON ; i + + ) {
2007-09-23 16:52:53 +00:00
szButtons [ i * 2 ] = _game . szAddr [ i ] ;
if ( _game . szAddr [ i + 1 ] ) szButtons [ ( i * 2 ) + 1 ] = ' , ' ;
2007-09-01 18:46:55 +00:00
}
// print pressed buttons
2009-07-20 20:59:35 +00:00
printLine ( " MICKEY HAS PRESSED: " ) ;
2009-01-18 22:02:22 +00:00
_vm - > drawStr ( 20 , 22 , IDA_DEFAULT , szButtons ) ;
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : insertDisk ( int iDisk ) {
2007-09-02 02:25:13 +00:00
_vm - > clearTextArea ( ) ;
2007-09-02 13:50:26 +00:00
_vm - > drawStr ( IDI_MSA_ROW_INSERT_DISK , IDI_MSA_COL_INSERT_DISK , IDA_DEFAULT , ( const char * ) IDS_MSA_INSERT_DISK [ iDisk ] ) ;
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
}
void Mickey : : gameOver ( ) {
2009-01-05 01:40:08 +00:00
// We shouldn't run the game over segment if we're quitting.
if ( _vm - > shouldQuit ( ) )
return ;
2007-09-01 18:46:55 +00:00
drawPic ( IDI_MSA_PIC_EARTH_SHIP_LEAVING ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 3 ] ) ;
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_GAME_OVER ) ;
2007-09-01 14:58:46 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_LETTER ] ) {
2007-09-01 18:46:55 +00:00
drawPic ( IDI_MSA_PIC_EARTH_MINNIE ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 4 ] ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 5 ] ) ;
} else {
printExeMsg ( IDO_MSA_GAME_OVER [ 6 ] ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 7 ] ) ;
}
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 14:58:46 +00:00
}
2007-09-01 18:46:55 +00:00
void Mickey : : flipSwitch ( ) {
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal | | _game . nXtals ) {
if ( ! _game . fStoryShown )
2007-09-01 18:46:55 +00:00
printStory ( ) ;
2007-09-21 19:12:53 +00:00
2007-09-22 11:31:46 +00:00
// Initialize planet data
2007-09-23 16:52:53 +00:00
if ( ! _game . fPlanetsInitialized ) {
2007-09-22 11:31:46 +00:00
int iHint = 0 ;
int iPlanet = 0 ;
2007-09-23 16:52:53 +00:00
memset ( _game . iPlanetXtal , 0 , sizeof ( _game . iPlanetXtal ) ) ;
memset ( _game . iClue , 0 , sizeof ( _game . iClue ) ) ;
2007-09-22 11:31:46 +00:00
2007-09-23 16:52:53 +00:00
_game . iPlanetXtal [ 0 ] = IDI_MSA_PLANET_EARTH ;
_game . iPlanetXtal [ 8 ] = IDI_MSA_PLANET_URANUS ;
2007-09-22 11:31:46 +00:00
2010-10-15 08:49:20 +00:00
for ( int i = 1 ; i < IDI_MSA_MAX_PLANET ; i + + ) {
2007-11-23 18:28:40 +00:00
if ( i < 8 ) {
do {
// Earth (planet 0) and Uranus (planet 8) are excluded
iPlanet = _vm - > rnd ( IDI_MSA_MAX_PLANET - 2 ) ;
} while ( planetIsAlreadyAssigned ( iPlanet ) ) ;
} else {
iPlanet = IDI_MSA_PLANET_URANUS ; // Uranus is always last
}
2007-09-22 11:31:46 +00:00
2007-09-23 16:52:53 +00:00
_game . iPlanetXtal [ i ] = iPlanet ;
2007-09-22 11:31:46 +00:00
iHint = _vm - > rnd ( 5 ) - 1 ; // clues are 0-4
2007-09-23 16:52:53 +00:00
_game . iClue [ i ] = IDO_MSA_NEXT_PIECE [ iPlanet ] [ iHint ] ;
2007-09-22 11:31:46 +00:00
}
2007-09-23 16:52:53 +00:00
_game . fPlanetsInitialized = true ;
2007-09-22 11:31:46 +00:00
}
2007-09-01 18:46:55 +00:00
// activate screen animation
2007-09-23 16:52:53 +00:00
_game . fAnimXL30 = true ;
2007-09-01 18:46:55 +00:00
2007-09-02 02:25:13 +00:00
_vm - > clearTextArea ( ) ;
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_XL30 ) ;
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_XL30_SPEAKING ) ;
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
_game . fHasXtal = false ;
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_CRYSTAL_PIECE_FOUND ) ;
}
2007-09-19 08:40:12 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . nXtals = = IDI_MSA_MAX_PLANET ) {
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_GAME_OVER [ 0 ] ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 1 ] ) ;
printExeMsg ( IDO_MSA_GAME_OVER [ 2 ] ) ;
2007-09-05 22:38:08 +00:00
#if 0
// DEBUG
2007-09-23 16:52:53 +00:00
strcpy ( _game . szAddr , ( char * ) IDS_MSA_ADDR_PLANET [ IDI_MSA_PLANET_EARTH ] ) ;
_game . nButtons = strlen ( _game . szAddr ) ;
2007-09-01 18:46:55 +00:00
# endif
} else {
2007-09-23 16:52:53 +00:00
printExeStr ( _game . iClue [ _game . nXtals ] ) ;
2007-09-01 18:46:55 +00:00
2007-09-05 22:38:08 +00:00
#if 0
// DEBUG
2007-09-23 16:52:53 +00:00
_vm - > drawStr ( 24 , 12 , IDA_DEFAULT , ( char * ) IDS_MSA_NAME_PLANET_2 [ _game . iPlanetXtal [ _game . nXtals ] ] ) ;
_vm - > drawStr ( 24 , 22 , IDA_DEFAULT , ( char * ) IDS_MSA_ADDR_PLANET [ _game . iPlanetXtal [ _game . nXtals ] ] ) ;
strcpy ( _game . szAddr , ( char * ) IDS_MSA_ADDR_PLANET [ _game . iPlanetXtal [ _game . nXtals ] ] ) ;
_game . nButtons = strlen ( _game . szAddr ) ;
2007-09-01 18:46:55 +00:00
_vm - > _gfx - > doUpdate ( ) ;
_vm - > _system - > updateScreen ( ) ; // TODO: this should go in the game's main loop
# endif
2007-11-20 20:25:37 +00:00
waitAnyKey ( true ) ;
2007-09-01 18:46:55 +00:00
}
} else {
printStory ( ) ;
}
2007-09-01 14:58:46 +00:00
}
2007-09-01 18:46:55 +00:00
void Mickey : : inventory ( ) {
2007-09-02 01:45:59 +00:00
int iRow = IDI_MSA_ROW_INV_ITEMS ;
2007-09-01 18:46:55 +00:00
char szCrystals [ 12 ] = { 0 } ;
2007-09-23 16:52:53 +00:00
sprintf ( szCrystals , IDS_MSA_CRYSTALS , IDS_MSA_CRYSTAL_NO [ _game . nXtals ] ) ;
2007-09-01 18:46:55 +00:00
2007-09-04 06:54:40 +00:00
CursorMan . showMouse ( false ) ;
2007-09-02 23:25:39 +00:00
_vm - > clearScreen ( IDA_DEFAULT ) ;
2007-09-02 01:45:59 +00:00
_vm - > drawStr ( IDI_MSA_ROW_INV_TITLE , IDI_MSA_COL_INV_TITLE , IDA_DEFAULT , IDS_MSA_INVENTORY ) ;
_vm - > drawStr ( IDI_MSA_ROW_INV_CRYSTALS , IDI_MSA_COL_INV_ITEMS , IDA_DEFAULT , szCrystals ) ;
2007-09-01 18:46:55 +00:00
for ( int iItem = 0 ; iItem < IDI_MSA_MAX_ITEM ; iItem + + ) {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ _game . iItem [ iItem ] ] & & ( _game . iItem [ iItem ] ! = IDI_MSA_OBJECT_NONE ) ) {
_vm - > drawStr ( iRow + + , IDI_MSA_COL_INV_ITEMS , IDA_DEFAULT , ( const char * ) IDS_MSA_NAME_ITEM [ _game . iItem [ iItem ] ] ) ;
2007-09-01 18:46:55 +00:00
}
}
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
2007-09-02 23:25:39 +00:00
_vm - > clearScreen ( IDA_DEFAULT ) ;
2007-09-04 06:54:40 +00:00
CursorMan . showMouse ( true ) ;
2007-09-01 14:58:46 +00:00
}
void Mickey : : intro ( ) {
2007-11-23 18:28:40 +00:00
// Draw Sierra logo
//drawLogo(); // Original does not even show this, so we skip it too
2007-09-06 21:58:57 +00:00
//waitAnyKey(); // Not in the original, but needed so that the logo is visible
2007-09-01 18:46:55 +00:00
2007-09-01 14:58:46 +00:00
// draw title picture
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_TITLE ;
2007-09-01 14:58:46 +00:00
drawRoom ( ) ;
2007-09-19 08:40:12 +00:00
2007-09-01 14:58:46 +00:00
// show copyright and play theme
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_COPYRIGHT ) ;
2009-05-24 15:17:42 +00:00
2009-01-05 01:40:08 +00:00
// Quit if necessary
if ( _vm - > shouldQuit ( ) )
return ;
2009-05-24 15:17:42 +00:00
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_THEME ) ;
2007-09-19 08:40:12 +00:00
2007-09-01 14:58:46 +00:00
// load game
2007-09-23 16:52:53 +00:00
_game . fIntro = true ;
2007-09-01 18:46:55 +00:00
if ( chooseY_N ( IDO_MSA_LOAD_GAME [ 0 ] , true ) ) {
if ( loadGame ( ) ) {
2007-09-23 16:52:53 +00:00
_game . iPlanet = IDI_MSA_PLANET_EARTH ;
_game . fIntro = false ;
_game . iRoom = IDI_MSA_PIC_SHIP_CORRIDOR ;
2007-09-01 14:58:46 +00:00
return ;
}
}
2009-05-24 15:17:42 +00:00
2009-01-05 01:40:08 +00:00
// Quit if necessary
if ( _vm - > shouldQuit ( ) )
return ;
2007-09-01 14:58:46 +00:00
// play spaceship landing scene
2007-09-23 16:52:53 +00:00
_game . iPlanet = IDI_MSA_PLANET_EARTH ;
_game . iRoom = IDI_MSA_PIC_EARTH_ROAD_4 ;
2007-09-01 14:58:46 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printRoomDesc ( ) ;
2009-05-24 15:17:42 +00:00
2009-01-05 01:40:08 +00:00
// Quit if necessary
if ( _vm - > shouldQuit ( ) )
return ;
2007-09-01 14:58:46 +00:00
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_SHIP_LAND ) ;
2007-09-01 14:58:46 +00:00
2007-09-22 11:31:46 +00:00
// Flash screen 3 times
2009-01-05 01:40:08 +00:00
for ( byte i = 0 ; i < 3 ; i + + ) {
2007-09-22 11:31:46 +00:00
playSound ( IDI_MSA_SND_PRESS_BLUE ) ;
//Set screen to white
_vm - > _gfx - > clearScreen ( 15 ) ;
_vm - > _gfx - > doUpdate ( ) ;
2007-11-23 18:28:40 +00:00
_vm - > _system - > updateScreen ( ) ;
2007-09-22 11:31:46 +00:00
_vm - > _system - > delayMillis ( IDI_MSA_ANIM_DELAY ) ;
//Set back to black
_vm - > _gfx - > clearScreen ( 0 ) ;
_vm - > _gfx - > doUpdate ( ) ;
2007-11-23 18:28:40 +00:00
_vm - > _system - > updateScreen ( ) ;
2007-09-22 11:31:46 +00:00
drawRoom ( ) ;
2007-09-23 16:52:53 +00:00
printDesc ( _game . iRoom ) ;
2007-09-22 11:31:46 +00:00
}
2007-09-01 14:58:46 +00:00
2007-09-01 18:46:55 +00:00
printExeMsg ( IDO_MSA_INTRO ) ;
2007-09-01 14:58:46 +00:00
}
2007-09-01 18:46:55 +00:00
void Mickey : : getItem ( ENUM_MSA_ITEM iItem ) {
2007-09-23 16:52:53 +00:00
_game . fItem [ iItem ] = true ;
_game . iItem [ _game . nItems + + ] = iItem ;
_game . oRmTxt [ _game . iRoom ] = 0 ;
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_TAKE ) ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
}
2007-09-01 14:58:46 +00:00
2007-09-01 18:46:55 +00:00
void Mickey : : getXtal ( int iStr ) {
2007-09-23 16:52:53 +00:00
_game . oRmTxt [ _game . iRoom ] = 0 ;
_game . fHasXtal = true ;
_game . nXtals + + ;
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_CRYSTAL ) ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( iStr ) ;
}
bool Mickey : : parse ( int cmd , int arg ) {
2009-09-30 16:16:53 +00:00
switch ( cmd ) {
2007-09-01 18:46:55 +00:00
// BASIC
case IDI_MSA_ACTION_GOTO_ROOM :
2007-09-23 16:52:53 +00:00
_game . iRoom = arg ;
2007-09-01 18:46:55 +00:00
return true ;
case IDI_MSA_ACTION_SHOW_INT_STR :
2009-01-18 16:41:35 +00:00
printLine ( IDS_MSA_ERRORS [ arg ] ) ;
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_ACTION_SHOW_DAT_STR :
printDatMessage ( arg ) ;
break ;
// GENERAL
case IDI_MSA_ACTION_PLANET_INFO :
showPlanetInfo ( ) ;
break ;
case IDI_MSA_ACTION_SAVE_GAME :
saveGame ( ) ;
break ;
case IDI_MSA_ACTION_LOOK_MICKEY :
2009-01-18 22:02:22 +00:00
printLine ( " YOU CAN SEE MICKEY ALREADY " ) ;
2007-09-01 18:46:55 +00:00
break ;
// EARTH
case IDI_MSA_ACTION_GET_ROPE :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] = = 2 ) {
_game . iRmObj [ _game . iRoom ] = IDI_MSA_OBJECT_NONE ;
_game . iRmMenu [ _game . iRoom ] = 3 ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_ROPE ) ;
2009-01-18 22:02:22 +00:00
printLine ( " MICKEY TAKES THE ROPE " ) ;
2007-09-01 18:46:55 +00:00
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
printDatMessage ( 11 ) ;
}
break ;
case IDI_MSA_ACTION_UNTIE_ROPE :
2007-09-23 16:52:53 +00:00
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_EARTH_TIRE_SWING_1 ;
_game . iRmObj [ _game . iRoom ] = 0 ;
_game . iRmMenu [ _game . iRoom ] = 2 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( 12 ) ;
break ;
case IDI_MSA_ACTION_GET_BONE :
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] = IDI_MSA_OBJECT_NONE ;
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_BONE ) ;
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_GET_XTAL_EARTH :
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
break ;
case IDI_MSA_ACTION_LOOK_DESK :
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmObj [ _game . iRoom ] = 2 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_WRITE_LETTER :
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 3 ;
_game . iRmMenu [ IDI_MSA_PIC_EARTH_MAILBOX ] = 1 ;
_game . iRmObj [ _game . iRoom ] = IDI_MSA_OBJECT_NONE ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_LETTER ) ;
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_MAIL_LETTER :
2007-09-23 16:52:53 +00:00
_game . fItemUsed [ IDI_MSA_ITEM_LETTER ] = true ;
_game . fItem [ IDI_MSA_ITEM_LETTER ] = false ;
_game . iRmMenu [ _game . iRoom ] = 0 ;
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_OPEN_MAILBOX :
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_LETTER ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 110 ) ;
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_OPEN_CUPBOARD :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ) {
if ( _game . iRmObj [ _game . iRoom ] = = IDI_MSA_OBJECT_NONE ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 78 ) ;
} else {
printDatMessage ( arg ) ;
}
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_EARTH_KITCHEN_1 ;
_game . iRmObj [ _game . iRoom ] = 3 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_FLASHLIGHT :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_FLASHLIGHT ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] = IDI_MSA_OBJECT_NONE ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_FLASHLIGHT ) ;
drawRoom ( ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_OPEN_CABINET :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 109 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_EARTH_GARAGE_1 ;
_game . iRmObj [ _game . iRoom ] = 15 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_CROWBAR :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_CROWBAR ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] - - ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_CROWBAR ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_WRENCH :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_WRENCH ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] - = 2 ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_WRENCH ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_OPEN_CLOSET :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 99 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_EARTH_BEDROOM_1 ;
_game . iRmObj [ _game . iRoom ] = 7 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_MATTRESS :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_MATTRESS ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] - - ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_MATTRESS ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_SCARF :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_SCARF ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] - = 2 ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_SCARF ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_SUNGLASSES :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_SUNGLASSES ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] - - ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_SUNGLASSES ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_SCALE :
2007-09-22 10:53:53 +00:00
if ( ! mickeyHasItem ( IDI_MSA_ITEM_SCALE ) ) {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ IDI_MSA_PIC_VENUS_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_NEPTUNE_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_MERCURY_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_SATURN_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_PLUTO_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_JUPITER_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_MARS_WEIGH ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_URANUS_WEIGH ] = 1 ;
_game . iRmObj [ _game . iRoom ] - = 2 ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_SCALE ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GOTO_SPACESHIP :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_SHIP_AIRLOCK ;
if ( _game . iPlanet ! = IDI_MSA_PLANET_EARTH )
2007-09-01 18:46:55 +00:00
insertDisk ( 0 ) ;
return true ;
// VENUS
case IDI_MSA_ACTION_DOWN_CHASM :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_ROPE ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_DOWN_ROPE :
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_ROPE ] ) {
_game . iRoom = IDI_MSA_PIC_VENUS_PROBE ;
2007-09-01 18:46:55 +00:00
return true ;
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_USE_ROPE :
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_ROPE ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 22 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . fItemUsed [ IDI_MSA_ITEM_ROPE ] = true ;
_game . fItem [ IDI_MSA_ITEM_ROPE ] = false ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_VENUS_CHASM_1 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_OPEN_HATCH :
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_WRENCH ] ) {
if ( ( _game . iRmMenu [ _game . iRoom ] = = 3 ) | | ( _game . iRmPic [ _game . iRoom ] = = IDI_MSA_PIC_VENUS_PROBE_1 ) )
2007-09-01 18:46:55 +00:00
printDatMessage ( 39 ) ;
else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 2 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_VENUS_PROBE_1 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( 24 ) ;
}
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_WRENCH ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_USE_WRENCH :
2007-09-23 16:52:53 +00:00
_game . fItemUsed [ IDI_MSA_ITEM_WRENCH ] = true ;
2007-09-01 18:46:55 +00:00
printDatString ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . iRmPic [ _game . iRoom ] = = IDI_MSA_PIC_VENUS_PROBE_1 ) {
2007-09-03 00:47:51 +00:00
_vm - > clearRow ( 22 ) ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_ACTION_GET_XTAL_VENUS :
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 3 ;
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
break ;
// TRITON (NEPTUNE)
case IDI_MSA_ACTION_LOOK_CASTLE :
2007-09-23 16:52:53 +00:00
if ( ! _game . iRmMenu [ _game . iRoom ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_ENTER_OPENING :
2007-09-23 16:52:53 +00:00
if ( _game . fItemUsed [ IDI_MSA_ITEM_CROWBAR ] ) {
_game . iRoom = IDI_MSA_PIC_NEPTUNE_CASTLE_4 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_CROWBAR ] ) {
_game . iRmMenu [ _game . iRoom ] = 2 ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_USE_CROWBAR :
2007-09-23 16:52:53 +00:00
_game . fItemUsed [ IDI_MSA_ITEM_CROWBAR ] = true ;
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_NEPTUNE_ENTRANCE_1 ;
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
printDatMessage ( arg ) ;
break ;
case IDI_MSA_ACTION_GET_XTAL_NEPTUNE :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 71 ) ;
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_SCARF ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_TALK_LEADER :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
return true ;
case IDI_MSA_ACTION_GIVE_SCARF :
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] = 18 ;
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
2007-09-23 16:52:53 +00:00
_game . fItem [ IDI_MSA_ITEM_SCARF ] = false ;
_game . iRmMenu [ _game . iRoom ] = 0 ;
_game . iRmMenu [ IDI_MSA_PIC_EARTH_BEDROOM ] = 2 ;
_game . iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
// MERCURY
case IDI_MSA_ACTION_GET_XTAL_MERCURY :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
_game . iRmMenu [ _game . iRoom ] = 2 ;
2007-09-01 18:46:55 +00:00
printDatMessage ( 32 ) ;
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_SUNGLASSES ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GIVE_SUNGLASSES :
2007-09-23 16:52:53 +00:00
_game . iRmObj [ _game . iRoom ] = 17 ;
_game . iRmMenu [ _game . iRoom ] = 2 ;
_game . fItem [ IDI_MSA_ITEM_SUNGLASSES ] = false ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
// TITAN (SATURN)
case IDI_MSA_ACTION_CROSS_LAKE :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_MATTRESS ] ) {
_game . iRmMenu [ IDI_MSA_PIC_SATURN_LAKE_0 ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_SATURN_LAKE_1 ] = 1 ;
_game . iRmMenu [ IDI_MSA_PIC_SATURN_LAKE_2 ] = 1 ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_ACTION_USE_MATTRESS :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_SATURN_ISLAND ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
case IDI_MSA_ACTION_GET_XTAL_SATURN :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 29 ) ;
} else {
getXtal ( arg ) ;
}
break ;
case IDI_MSA_ACTION_LEAVE_ISLAND :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_SATURN_LAKE_1 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
// PLUTO
case IDI_MSA_ACTION_GET_XTAL_PLUTO :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 19 ) ;
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_BONE ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GIVE_BONE :
2007-09-23 16:52:53 +00:00
_game . fItem [ IDI_MSA_ITEM_BONE ] = false ;
_game . iRmMenu [ _game . iRoom ] = 0 ;
_game . iRmObj [ _game . iRoom ] = 16 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
// IO (JUPITER)
case IDI_MSA_ACTION_GET_ROCK_0 :
case IDI_MSA_ACTION_GET_ROCK_1 :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_ROCK ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 38 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmObj [ _game . iRoom ] = IDI_MSA_OBJECT_NONE ;
2007-09-01 18:46:55 +00:00
getItem ( IDI_MSA_ITEM_ROCK ) ;
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_XTAL_JUPITER :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 15 ) ;
} else {
2007-09-23 16:52:53 +00:00
switch ( _game . nRocks ) {
2007-09-01 18:46:55 +00:00
case 0 :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_ROCK ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
break ;
case 1 :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_ROCK ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( 34 ) ;
break ;
case 2 :
getXtal ( 35 ) ;
break ;
}
}
break ;
case IDI_MSA_ACTION_THROW_ROCK :
2007-09-23 16:52:53 +00:00
_game . fItem [ IDI_MSA_ITEM_ROCK ] = false ;
_game . nItems - - ;
_game . iRmObj [ _game . iRoom ] + + ;
_game . iRmMenu [ _game . iRoom ] = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . nRocks ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 37 ) ;
} else {
printDatMessage ( arg ) ;
}
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
_game . nRocks + + ;
2007-09-01 18:46:55 +00:00
break ;
// MARS
case IDI_MSA_ACTION_GO_TUBE :
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_FLASHLIGHT ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_ACTION_USE_FLASHLIGHT :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_MARS_TUBE_1 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 15 ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
case IDI_MSA_ACTION_PLUTO_DIG :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 21 ) ;
} else {
getXtal ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_XTAL_MARS :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 23 ) ;
} else {
printDatMessage ( arg ) ;
}
break ;
// OBERON (URANUS)
case IDI_MSA_ACTION_ENTER_TEMPLE :
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_URANUS_TEMPLE ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
case IDI_MSA_ACTION_USE_CRYSTAL :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 25 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_URANUS_TEMPLE_1 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_URANUS_TEMPLE ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_OPEN_DOOR :
2007-09-23 16:52:53 +00:00
if ( _game . fTempleDoorOpen ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 36 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . fTempleDoorOpen = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_URANUS_TEMPLE_2 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_ENTER_DOOR :
2007-09-23 16:52:53 +00:00
if ( _game . fTempleDoorOpen ) {
_game . iRoom = IDI_MSA_PIC_URANUS_STEPS ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GET_XTAL_URANUS :
2007-09-23 16:52:53 +00:00
if ( _game . fHasXtal ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 34 ) ;
} else {
2007-09-23 16:52:53 +00:00
if ( _game . fItem [ IDI_MSA_ITEM_CROWBAR ] ) {
_game . iRmMenu [ _game . iRoom ] = 1 ;
2007-09-01 18:46:55 +00:00
}
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_USE_CROWBAR_1 :
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
getXtal ( arg ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
// SPACESHIP
case IDI_MSA_ACTION_GO_NORTH :
2007-09-23 16:52:53 +00:00
if ( _game . fShipDoorOpen ) {
if ( _game . fSuit ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 45 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_PIC_SHIP_CORRIDOR ;
2007-09-01 18:46:55 +00:00
return true ;
}
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_GO_PLANET :
2007-09-23 16:52:53 +00:00
if ( ! _game . fShipDoorOpen ) {
if ( ( _game . nXtals = = IDI_MSA_MAX_PLANET ) & & ( _game . iPlanet = = IDI_MSA_PLANET_EARTH ) )
2007-09-01 18:46:55 +00:00
gameOver ( ) ;
2007-09-23 16:52:53 +00:00
if ( ( _game . iPlanet = = _game . iPlanetXtal [ _game . nXtals ] ) | | ( _game . iPlanet = = IDI_MSA_PLANET_EARTH ) ) {
_game . fHasXtal = false ;
_game . iRoom = IDI_MSA_HOME_PLANET [ _game . iPlanet ] ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . iPlanet ! = IDI_MSA_PLANET_EARTH )
2007-09-01 18:46:55 +00:00
insertDisk ( 1 ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRoom = IDI_MSA_SHIP_PLANET [ _game . iPlanet ] ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
}
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_PRESS_BUTTON :
2007-09-23 16:52:53 +00:00
if ( _game . fShipDoorOpen ) { // inner door open
if ( _game . iPlanet & & ! _game . fSuit ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . fShipDoorOpen = false ;
_game . iRmPic [ _game . iRoom ] - - ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 2 ) ;
}
} else {
2007-09-23 16:52:53 +00:00
_game . fShipDoorOpen = true ;
_game . iRmPic [ _game . iRoom ] + + ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 14 ) ;
}
break ;
case IDI_MSA_ACTION_WEAR_SPACESUIT :
2007-09-23 16:52:53 +00:00
if ( _game . fSuit ) {
if ( _game . fShipDoorOpen ) {
_game . fSuit = false ;
_game . iRmMenu [ _game . iRoom ] = 0 ;
_game . iRmPic [ _game . iRoom ] - = 2 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 13 ) ;
} else {
printDatMessage ( 3 ) ;
}
} else {
2007-09-23 16:52:53 +00:00
if ( _game . iPlanet ) {
_game . fSuit = true ;
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] + = 2 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
} else {
printDatMessage ( 12 ) ;
}
}
break ;
case IDI_MSA_ACTION_READ_GAUGE :
printDatString ( arg ) ;
2009-06-06 17:39:13 +00:00
_vm - > drawStr ( 21 , 15 , IDA_DEFAULT , ( const char * ) IDS_MSA_TEMP_C [ _game . iPlanet ] ) ;
_vm - > drawStr ( 21 , 23 , IDA_DEFAULT , ( const char * ) IDS_MSA_TEMP_F [ _game . iPlanet ] ) ;
2007-09-05 15:43:56 +00:00
waitAnyKey ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
break ;
case IDI_MSA_ACTION_PRESS_ORANGE :
2007-09-23 16:52:53 +00:00
if ( _game . fFlying ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 4 ) ;
} else {
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_PRESS_ORANGE ) ;
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
pressOB ( IDI_MSA_BUTTON_ORANGE ) ;
}
break ;
case IDI_MSA_ACTION_PRESS_BLUE :
2007-09-23 16:52:53 +00:00
if ( _game . fFlying ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 4 ) ;
} else {
2007-09-03 01:33:17 +00:00
playSound ( IDI_MSA_SND_PRESS_BLUE ) ;
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
pressOB ( IDI_MSA_BUTTON_BLUE ) ;
}
break ;
case IDI_MSA_ACTION_FLIP_SWITCH :
flipSwitch ( ) ;
break ;
case IDI_MSA_ACTION_PUSH_THROTTLE :
2007-09-23 16:52:53 +00:00
if ( _game . fFlying ) {
_game . fFlying = false ;
_game . nButtons = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
memset ( _game . szAddr , 0 , sizeof ( _game . szAddr ) ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatString ( 22 ) ;
2009-06-06 17:39:13 +00:00
2007-09-02 01:45:59 +00:00
_vm - > drawStr ( IDI_MSA_ROW_PLANET , IDI_MSA_COL_PLANET , IDA_DEFAULT ,
2007-09-23 16:52:53 +00:00
( const char * ) IDS_MSA_PLANETS [ _game . iPlanet ] ) ;
2009-06-06 17:39:13 +00:00
2007-11-20 20:25:37 +00:00
waitAnyKey ( true ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
showPlanetInfo ( ) ;
} else {
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_PULL_THROTTLE :
2007-09-23 16:52:53 +00:00
if ( _game . fFlying ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 18 ) ;
} else {
if ( getPlanet ( ) ! = - 1 ) {
2007-09-23 16:52:53 +00:00
_game . fFlying = true ;
_game . iPlanet = getPlanet ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 16 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . nButtons = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
memset ( _game . szAddr , 0 , sizeof ( _game . szAddr ) ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 17 ) ;
}
}
break ;
case IDI_MSA_ACTION_LEAVE_ROOM :
2007-09-23 16:52:53 +00:00
if ( _game . fFlying ) {
2007-09-01 18:46:55 +00:00
printDatMessage ( 24 ) ;
} else {
2007-09-23 16:52:53 +00:00
_game . iRoom = arg ;
2007-09-01 18:46:55 +00:00
return true ;
}
break ;
case IDI_MSA_ACTION_OPEN_CABINET_1 :
2007-09-23 16:52:53 +00:00
if ( _game . iRmMenu [ _game . iRoom ] ) {
2009-01-18 22:02:22 +00:00
printLine ( " THE CABINET IS ALREADY OPEN " ) ;
2007-09-01 18:46:55 +00:00
} else {
2007-09-23 16:52:53 +00:00
_game . iRmMenu [ _game . iRoom ] = 1 ;
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_SHIP_KITCHEN_1 ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( arg ) ;
}
break ;
case IDI_MSA_ACTION_READ_MAP :
2007-09-23 16:52:53 +00:00
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_STAR_MAP ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
printDatMessage ( 46 ) ;
printDatMessage ( 47 ) ;
printDatMessage ( 48 ) ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
_game . iRmPic [ _game . iRoom ] = IDI_MSA_PIC_SHIP_BEDROOM ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
drawRoom ( ) ;
break ;
case IDI_MSA_ACTION_GO_WEST :
2007-09-23 16:52:53 +00:00
_game . nButtons = 0 ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
memset ( _game . szAddr , 0 , sizeof ( _game . szAddr ) ) ;
2009-06-06 17:39:13 +00:00
2007-09-23 16:52:53 +00:00
_game . iRoom = arg ;
2009-06-06 17:39:13 +00:00
2007-09-01 18:46:55 +00:00
return true ;
}
return false ;
}
2007-09-05 15:43:56 +00:00
// Keyboard
void Mickey : : waitAnyKey ( bool anim ) {
Common : : Event event ;
2007-09-06 01:18:13 +00:00
2007-09-19 09:54:42 +00:00
if ( ! anim )
2007-09-06 01:18:13 +00:00
_vm - > _gfx - > doUpdate ( ) ;
2009-01-05 01:40:08 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
2007-09-05 15:43:56 +00:00
while ( _vm - > _system - > getEventManager ( ) - > pollEvent ( event ) ) {
2009-09-30 16:16:53 +00:00
switch ( event . type ) {
2008-07-16 04:22:56 +00:00
case Common : : EVENT_RTL :
2007-09-05 15:43:56 +00:00
case Common : : EVENT_QUIT :
case Common : : EVENT_KEYDOWN :
case Common : : EVENT_LBUTTONUP :
case Common : : EVENT_RBUTTONUP :
return ;
default :
break ;
}
}
2009-05-24 15:17:42 +00:00
2007-09-05 15:43:56 +00:00
if ( anim ) {
animate ( ) ;
_vm - > _gfx - > doUpdate ( ) ;
}
2007-09-19 09:54:42 +00:00
_vm - > _system - > updateScreen ( ) ;
_vm - > _system - > delayMillis ( 10 ) ;
2007-09-05 15:43:56 +00:00
}
}
2008-01-09 09:19:17 +00:00
// Console-related functions
void Mickey : : debugCurRoom ( ) {
_vm - > _console - > DebugPrintf ( " Current Room = %d \n " , _game . iRoom ) ;
2008-01-09 09:46:26 +00:00
if ( _game . iRmObj [ _game . iRoom ] ! = IDI_MSA_OBJECT_NONE ) {
_vm - > _console - > DebugPrintf ( " Object %d is in the room \n " , _game . iRmObj [ _game . iRoom ] ) ;
}
2008-01-09 09:19:17 +00:00
}
2007-09-01 18:46:55 +00:00
2008-01-09 10:31:52 +00:00
void Mickey : : debugGotoRoom ( int room ) {
_game . iRoom = room ;
drawRoom ( ) ;
}
2007-09-22 13:27:10 +00:00
Mickey : : Mickey ( PreAgiEngine * vm ) : _vm ( vm ) {
2008-01-09 09:19:17 +00:00
_vm - > _console = new Mickey_Console ( _vm , this ) ;
2007-09-22 13:27:10 +00:00
}
Mickey : : ~ Mickey ( ) {
}
void Mickey : : init ( ) {
2007-09-01 18:46:55 +00:00
uint8 buffer [ 512 ] ;
// clear game struct
2007-09-23 16:52:53 +00:00
memset ( & _game , 0 , sizeof ( _game ) ) ;
memset ( & _game . iItem , IDI_MSA_OBJECT_NONE , sizeof ( _game . iItem ) ) ;
2007-09-01 18:46:55 +00:00
// read room extended desc flags
2007-09-22 10:10:01 +00:00
//readExe(IDO_MSA_ROOM_TEXT, buffer, sizeof(buffer));
2007-09-23 16:52:53 +00:00
//memcpy(_game.fRmTxt, buffer, sizeof(_game.fRmTxt));
2007-09-01 18:46:55 +00:00
// read room extended desc offsets
readExe ( IDO_MSA_ROOM_TEXT_OFFSETS , buffer , sizeof ( buffer ) ) ;
2007-09-23 16:52:53 +00:00
memcpy ( _game . oRmTxt , buffer , sizeof ( _game . oRmTxt ) ) ;
2007-09-01 18:46:55 +00:00
for ( int i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + )
2007-09-23 16:52:53 +00:00
_game . oRmTxt [ i ] = buffer [ i * 2 ] + 256 * buffer [ i * 2 + 1 ] ;
2007-09-01 18:46:55 +00:00
// read room object indices
2007-09-22 10:10:01 +00:00
//readExe(IDO_MSA_ROOM_OBJECT, buffer, sizeof(buffer));
2007-09-23 16:52:53 +00:00
//memcpy(_game.iRmObj, buffer, sizeof(_game.iRmObj));
2007-09-19 08:40:12 +00:00
2007-09-01 18:46:55 +00:00
// read room picture indices
2007-09-03 00:47:51 +00:00
//readExe(IDO_MSA_ROOM_PICTURE, buffer, sizeof(buffer));
2007-09-23 16:52:53 +00:00
//memcpy(_game.iRmPic, buffer, sizeof(_game.iRmPic));
2007-09-01 18:46:55 +00:00
// read room menu patch indices
readExe ( IDO_MSA_ROOM_MENU_FIX , buffer , sizeof ( buffer ) ) ;
2007-09-23 16:52:53 +00:00
memcpy ( _game . nRmMenu , buffer , sizeof ( _game . nRmMenu ) ) ;
2007-09-01 18:46:55 +00:00
2007-09-22 10:10:01 +00:00
// set room picture and room object indices
2007-09-01 18:46:55 +00:00
for ( int i = 0 ; i < IDI_MSA_MAX_ROOM ; i + + ) {
2007-09-23 16:52:53 +00:00
_game . iRmPic [ i ] = i ;
_game . iRmObj [ i ] = - 1 ;
2007-09-01 18:46:55 +00:00
}
2007-09-23 16:52:53 +00:00
_game . iRmPic [ IDI_MSA_PIC_SHIP_AIRLOCK ] = IDI_MSA_PIC_SHIP_AIRLOCK_0 ;
_game . iRmObj [ IDI_MSA_PIC_EARTH_BATHROOM ] = 11 ;
_game . iRmObj [ IDI_MSA_PIC_JUPITER_LAVA ] = 21 ;
_game . iRmObj [ IDI_MSA_PIC_JUPITER_ROCK_0 ] = 20 ;
_game . iRmObj [ IDI_MSA_PIC_JUPITER_ROCK_1 ] = 19 ;
_game . iRmObj [ IDI_MSA_PIC_EARTH_IN_DOGHOUSE ] = 1 ;
2007-09-01 18:46:55 +00:00
2007-09-05 22:38:08 +00:00
#if 0
// DEBUG
2007-09-23 16:52:53 +00:00
_game . iPlanet = IDI_MSA_PLANET_EARTH ;
_game . iRoom = IDI_MSA_PIC_SHIP_CONTROLS ;
_game . fHasXtal = true ;
_game . nXtals = 9 ;
_game . fItemUsed [ IDI_MSA_ITEM_LETTER ] = true ;
2007-09-01 18:46:55 +00:00
# endif
}
2007-09-22 13:27:10 +00:00
void Mickey : : run ( ) {
bool done ;
2007-09-01 18:46:55 +00:00
2007-09-22 13:27:10 +00:00
// Game intro
intro ( ) ;
2007-09-01 18:46:55 +00:00
2007-09-22 13:27:10 +00:00
// Game loop
2008-09-30 12:27:38 +00:00
while ( ! _vm - > shouldQuit ( ) ) {
2007-09-22 13:27:10 +00:00
drawRoom ( ) ;
2007-09-01 18:46:55 +00:00
2007-09-23 16:52:53 +00:00
if ( _game . fIntro ) {
_game . fIntro = false ;
2007-09-22 13:27:10 +00:00
} else {
printRoomDesc ( ) ;
}
2007-09-23 16:52:53 +00:00
if ( _game . iRoom = = IDI_MSA_PIC_NEPTUNE_GUARD ) {
_game . iRoom = IDI_MSA_PIC_NEPTUNE_LEADER ;
2007-09-22 13:27:10 +00:00
done = true ;
} else {
done = false ;
}
2009-01-05 01:40:08 +00:00
while ( ! done & & ! _vm - > shouldQuit ( ) ) {
2007-09-22 13:27:10 +00:00
// Check air supply
2007-09-23 16:52:53 +00:00
if ( _game . fSuit ) {
_game . nAir - = 1 ;
2007-09-22 13:27:10 +00:00
for ( int i = 0 ; i < 4 ; i + + ) {
2007-09-23 16:52:53 +00:00
if ( _game . nAir = = IDI_MSA_AIR_SUPPLY [ i ] ) {
2007-09-22 13:27:10 +00:00
playSound ( IDI_MSA_SND_XL30 ) ;
printExeMsg ( IDO_MSA_XL30_SPEAKING ) ;
printExeMsg ( IDO_MSA_AIR_SUPPLY [ i ] ) ;
2009-01-05 01:40:08 +00:00
if ( i = = 3 )
return ;
2007-09-22 13:27:10 +00:00
}
}
} else {
2009-01-18 22:02:22 +00:00
_game . nAir = 50 ; // max air supply
2007-09-22 13:27:10 +00:00
}
2008-01-09 10:31:52 +00:00
done = checkMenu ( ) ;
2007-09-22 13:27:10 +00:00
}
2007-09-23 16:52:53 +00:00
_game . nFrame = 0 ;
2007-09-22 13:27:10 +00:00
}
2007-09-01 18:46:55 +00:00
gameOver ( ) ;
2007-09-01 14:58:46 +00:00
}
}