2013-06-25 18:03:46 +02: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 .
*
*/
/*
* This code is based on the original source code of Lord Avalot d ' Argent version 1.3 .
* Copyright ( c ) 1994 - 1995 Mike , Mark and Thomas Thurman .
*/
2013-06-28 18:29:59 +02:00
/* LUCERNA The screen, [keyboard] and mouse handler.*/
# include "avalanche/avalanche.h"
2013-06-25 18:03:46 +02:00
# include "avalanche/lucerna2.h"
# include "avalanche/gyro2.h"
# include "avalanche/scrolls2.h"
2013-06-28 18:29:59 +02:00
# include "avalanche/visa2.h"
# include "avalanche/timeout2.h"
# include "avalanche/trip6.h"
# include "avalanche/enid2.h"
# include "avalanche/celer2.h"
# include "avalanche/pingo2.h"
# include "avalanche/sequence2.h"
2013-06-29 16:36:40 +02:00
# include "avalanche/acci2.h"
2013-07-01 23:57:56 +02:00
# include "avalanche/roomnums.h"
2013-06-25 18:03:46 +02:00
2013-07-30 20:33:05 +02:00
# include "common/rect.h"
2013-06-29 16:36:40 +02:00
# include "common/system.h"
2013-06-25 18:03:46 +02:00
2013-07-12 09:37:21 +02:00
# include "graphics/palette.h"
2013-06-28 18:29:59 +02:00
namespace Avalanche {
2013-09-07 15:58:02 +02:00
Lucerna : : Lucerna ( AvalancheEngine * vm ) : _fxHidden ( false ) {
2013-06-28 18:29:59 +02:00
_vm = vm ;
}
2013-07-01 23:57:56 +02:00
2013-09-05 12:31:29 +02:00
Lucerna : : ~ Lucerna ( ) {
2013-09-05 15:09:13 +02:00
for ( byte i = 0 ; i < 31 ; i + + )
for ( byte j = 0 ; j < 2 ; j + + )
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _also [ i ] [ j ] ! = 0 ) {
delete _vm - > _gyro - > _also [ i ] [ j ] ;
_vm - > _gyro - > _also [ i ] [ j ] = 0 ;
2013-09-05 15:09:13 +02:00
}
2013-09-05 12:31:29 +02:00
}
2013-07-01 23:57:56 +02:00
void Lucerna : : init ( ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _oh = _vm - > _gyro - > _onh = _vm - > _gyro - > _om = 17717 ;
2013-09-05 14:44:55 +02:00
2013-09-05 15:09:13 +02:00
for ( byte i = 0 ; i < 31 ; i + + )
for ( byte j = 0 ; j < 2 ; j + + )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _also [ i ] [ j ] = 0 ;
2013-09-05 15:09:13 +02:00
2013-09-05 07:47:40 +02:00
#if 0
if ( _vm - > _enhanced - > atbios )
2013-09-04 17:54:08 +02:00
_vm - > _gyro - > atkey = " f1 " ;
else
2013-09-05 07:47:40 +02:00
_vm - > _gyro - > atkey = " alt- " ;
# endif
2013-07-01 23:57:56 +02:00
}
2013-09-07 09:00:34 +02:00
2013-09-06 07:52:02 +02:00
/**
* Call a given Verb
* @ remarks Originally called ' callverb '
*/
void Lucerna : : callVerb ( byte id ) {
if ( id = = _vm - > _acci - > kPardon ) {
2013-07-24 19:43:10 +02:00
_vm - > _scrolls - > display ( Common : : String ( " The f5 key lets you do a particular action in certain " ) +
2013-07-01 23:57:56 +02:00
" situations. However, at the moment there is nothing " +
" assigned to it. You may press alt-A to see what the " +
" current setting of this key is. " ) ;
} else {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _weirdWord = false ;
2013-09-03 15:35:09 +02:00
_vm - > _acci - > _polite = true ;
2013-09-06 07:52:02 +02:00
_vm - > _acci - > _verb = id ;
2013-09-03 15:35:09 +02:00
_vm - > _acci - > doThat ( ) ;
2013-07-01 23:57:56 +02:00
}
}
2013-09-07 15:58:02 +02:00
void Lucerna : : drawAlsoLines ( ) {
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( false ) ;
2013-07-30 20:33:05 +02:00
_vm - > _graphics - > _magics . fillRect ( Common : : Rect ( 0 , 0 , 640 , 200 ) , 0 ) ;
2013-08-21 18:01:31 +02:00
_vm - > _graphics - > _magics . frameRect ( Common : : Rect ( 0 , 45 , 640 , 161 ) , 15 ) ;
2013-08-16 13:40:58 +02:00
2013-09-07 15:58:02 +02:00
for ( byte i = 0 ; i < _vm - > _gyro - > _lineNum ; i + + ) {
2013-08-30 11:23:17 +02:00
// We had to check if the lines are within the borders of the screen.
2013-09-07 15:58:02 +02:00
if ( ( _vm - > _gyro - > _lines [ i ] . _x1 > = 0 ) & & ( _vm - > _gyro - > _lines [ i ] . _x1 < _vm - > _graphics - > kScreenWidth ) & & ( _vm - > _gyro - > _lines [ i ] . _y1 > = 0 ) & & ( _vm - > _gyro - > _lines [ i ] . _y1 < _vm - > _graphics - > kScreenHeight )
& & ( _vm - > _gyro - > _lines [ i ] . _x2 > = 0 ) & & ( _vm - > _gyro - > _lines [ i ] . _x2 < _vm - > _graphics - > kScreenWidth ) & & ( _vm - > _gyro - > _lines [ i ] . _y2 > = 0 ) & & ( _vm - > _gyro - > _lines [ i ] . _y2 < _vm - > _graphics - > kScreenHeight ) )
_vm - > _graphics - > _magics . drawLine ( _vm - > _gyro - > _lines [ i ] . _x1 , _vm - > _gyro - > _lines [ i ] . _y1 , _vm - > _gyro - > _lines [ i ] . _x2 , _vm - > _gyro - > _lines [ i ] . _y2 , _vm - > _gyro - > _lines [ i ] . _color ) ;
2013-09-04 11:18:09 +02:00
}
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( true ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 09:00:34 +02:00
// nextstring, scram1 and unscrable are only used in load_also
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
Common : : String Lucerna : : readAlsoStringFromFile ( ) {
2013-07-04 18:26:18 +02:00
Common : : String str ;
2013-09-07 15:58:02 +02:00
byte length = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
for ( int i = 0 ; i < length ; i + + )
2013-09-07 15:58:02 +02:00
str + = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
return str ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : scram ( Common : : String & str ) {
for ( uint i = 0 ; i < str . size ( ) ; i + + )
str . setChar ( str [ i ] ^ 177 , i ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : unScramble ( ) {
for ( byte i = 0 ; i < 31 ; i + + )
for ( byte j = 0 ; j < 2 ; j + + )
if ( _vm - > _gyro - > _also [ i ] [ j ] ! = 0 )
scram ( * _vm - > _gyro - > _also [ i ] [ j ] ) ;
scram ( _vm - > _gyro - > _listen ) ;
scram ( _vm - > _gyro - > _flags ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : loadAlso ( byte num ) {
for ( byte i = 0 ; i < 31 ; i + + )
for ( byte j = 0 ; j < 2 ; j + + )
if ( _vm - > _gyro - > _also [ i ] [ j ] ! = 0 ) {
delete _vm - > _gyro - > _also [ i ] [ j ] ;
_vm - > _gyro - > _also [ i ] [ j ] = 0 ;
2013-07-01 23:57:56 +02:00
}
2013-07-04 18:26:18 +02:00
Common : : String filename ;
2013-09-07 15:58:02 +02:00
filename = filename . format ( " also%d.avd " , num ) ;
if ( ! file . open ( filename ) ) {
2013-07-04 18:26:18 +02:00
warning ( " AVALANCHE: Lucerna: File not found: %s " , filename . c_str ( ) ) ;
return ;
}
2013-09-07 15:58:02 +02:00
file . seek ( 128 ) ;
2013-07-04 18:26:18 +02:00
2013-09-07 15:58:02 +02:00
byte alsoNum = file . readByte ( ) ;
for ( byte i = 0 ; i < = alsoNum ; i + + ) {
for ( byte j = 0 ; j < 2 ; j + + ) {
_vm - > _gyro - > _also [ i ] [ j ] = new Common : : String ;
* _vm - > _gyro - > _also [ i ] [ j ] = readAlsoStringFromFile ( ) ;
2013-07-04 18:26:18 +02:00
}
2013-09-07 15:58:02 +02:00
* _vm - > _gyro - > _also [ i ] [ 0 ] = Common : : String ( ' \x9D ' ) + * _vm - > _gyro - > _also [ i ] [ 0 ] + Common : : String ( ' \x9D ' ) ;
2013-07-04 18:26:18 +02:00
}
2013-09-07 09:00:34 +02:00
2013-09-06 16:23:57 +02:00
memset ( _vm - > _gyro - > _lines , 0xFF , sizeof ( _vm - > _gyro - > _lines ) ) ;
2013-09-07 09:00:34 +02:00
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _lineNum = file . readByte ( ) ;
2013-09-06 16:23:57 +02:00
for ( byte i = 0 ; i < _vm - > _gyro - > _lineNum ; i + + ) {
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _lines [ i ] . _x1 = file . readSint16LE ( ) ;
_vm - > _gyro - > _lines [ i ] . _y1 = file . readSint16LE ( ) ;
_vm - > _gyro - > _lines [ i ] . _x2 = file . readSint16LE ( ) ;
_vm - > _gyro - > _lines [ i ] . _y2 = file . readSint16LE ( ) ;
_vm - > _gyro - > _lines [ i ] . _color = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
}
2013-09-06 16:23:57 +02:00
memset ( _vm - > _gyro - > _peds , 177 , sizeof ( _vm - > _gyro - > _peds ) ) ;
2013-09-07 15:58:02 +02:00
byte pedNum = file . readByte ( ) ;
for ( byte i = 0 ; i < pedNum ; i + + ) {
_vm - > _gyro - > _peds [ i ] . _x = file . readSint16LE ( ) ;
_vm - > _gyro - > _peds [ i ] . _y = file . readSint16LE ( ) ;
_vm - > _gyro - > _peds [ i ] . _direction = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
}
2013-08-21 18:01:31 +02:00
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _fieldNum = file . readByte ( ) ;
2013-09-06 16:23:57 +02:00
for ( byte i = 0 ; i < _vm - > _gyro - > _fieldNum ; i + + ) {
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _fields [ i ] . _x1 = file . readSint16LE ( ) ;
_vm - > _gyro - > _fields [ i ] . _y1 = file . readSint16LE ( ) ;
_vm - > _gyro - > _fields [ i ] . _x2 = file . readSint16LE ( ) ;
_vm - > _gyro - > _fields [ i ] . _y2 = file . readSint16LE ( ) ;
2013-07-04 18:26:18 +02:00
}
for ( byte i = 0 ; i < 15 ; i + + ) {
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _magics [ i ] . _operation = file . readByte ( ) ;
_vm - > _gyro - > _magics [ i ] . _data = file . readUint16LE ( ) ;
2013-07-04 18:26:18 +02:00
}
for ( byte i = 0 ; i < 7 ; i + + ) {
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _portals [ i ] . _operation = file . readByte ( ) ;
_vm - > _gyro - > _portals [ i ] . _data = file . readUint16LE ( ) ;
2013-07-04 18:26:18 +02:00
}
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _flags . clear ( ) ;
2013-07-04 18:26:18 +02:00
for ( byte i = 0 ; i < 26 ; i + + )
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _flags + = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
2013-09-07 15:58:02 +02:00
int16 listen_length = file . readByte ( ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _listen . clear ( ) ;
2013-07-04 18:26:18 +02:00
for ( byte i = 0 ; i < listen_length ; i + + )
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _listen + = file . readByte ( ) ;
2013-07-04 18:26:18 +02:00
2013-09-07 15:58:02 +02:00
drawAlsoLines ( ) ;
2013-07-04 18:26:18 +02:00
2013-09-07 15:58:02 +02:00
file . close ( ) ;
unScramble ( ) ;
for ( byte i = 0 ; i < = alsoNum ; i + + )
* _vm - > _gyro - > _also [ i ] [ 0 ] = Common : : String ( ' , ' ) + * _vm - > _gyro - > _also [ i ] [ 0 ] + ' , ' ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : loadRoom ( byte num ) {
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( false ) ;
2013-09-07 09:00:34 +02:00
2013-09-05 13:20:03 +02:00
_vm - > _graphics - > fleshColors ( ) ;
2013-07-05 15:30:26 +02:00
Common : : String filename ;
2013-09-07 15:58:02 +02:00
filename = filename . format ( " place%d.avd " , num ) ;
if ( ! file . open ( filename ) ) {
2013-07-05 15:30:26 +02:00
warning ( " AVALANCHE: Lucerna: File not found: %s " , filename . c_str ( ) ) ;
return ;
}
2013-09-07 15:58:02 +02:00
file . seek ( 146 ) ;
2013-09-06 16:23:57 +02:00
if ( ! _vm - > _gyro - > _roomnName . empty ( ) )
_vm - > _gyro - > _roomnName . clear ( ) ;
2013-08-20 19:23:24 +02:00
for ( byte i = 0 ; i < 30 ; i + + ) {
2013-09-07 15:58:02 +02:00
char actChar = file . readByte ( ) ;
2013-08-20 19:23:24 +02:00
if ( ( 32 < = actChar ) & & ( actChar < = 126 ) )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _roomnName + = actChar ;
2013-08-20 19:23:24 +02:00
}
2013-09-05 07:47:40 +02:00
// Compression method byte follows this...
2013-07-05 15:30:26 +02:00
2013-09-07 15:58:02 +02:00
file . seek ( 177 ) ;
2013-07-12 18:08:27 +02:00
2013-09-07 15:58:02 +02:00
_vm - > _graphics - > _background = _vm - > _graphics - > loadPictureRow ( file , _vm - > _graphics - > kBackgroundWidth , _vm - > _graphics - > kBackgroundHeight ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-07-12 16:11:07 +02:00
2013-09-07 15:58:02 +02:00
file . close ( ) ;
2013-07-12 16:11:07 +02:00
2013-09-07 15:58:02 +02:00
loadAlso ( num ) ;
_vm - > _celer - > loadBackgroundSprites ( num ) ;
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( true ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : zoomOut ( int16 x , int16 y ) {
2013-07-01 23:57:56 +02:00
warning ( " STUB: Lucerna::zoomout() " ) ;
}
2013-09-07 15:58:02 +02:00
void Lucerna : : findPeople ( byte room ) {
for ( byte i = 1 ; i < 29 ; i + + ) {
if ( _vm - > _gyro - > _whereIs [ i ] = = room ) {
if ( i < 25 )
_vm - > _gyro - > _him = i + 150 ;
2013-07-16 22:47:07 +02:00
else
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _her = i + 150 ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 07:52:02 +02:00
}
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : exitRoom ( byte x ) {
2013-07-01 23:57:56 +02:00
//nosound();
2013-09-03 22:22:42 +02:00
_vm - > _celer - > forgetBackgroundSprites ( ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _seeScroll = true ; // This stops the trippancy system working over the length of this procedure.
2013-07-01 23:57:56 +02:00
2013-07-16 22:47:07 +02:00
switch ( x ) {
case r__spludwicks :
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > lose_timer ( _vm - > _timeout - > reason_avariciustalks ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _avariciusTalk = 0 ;
2013-09-05 07:47:40 +02:00
// He doesn't HAVE to be talking for this to work. It just deletes it IF it exists.
2013-07-01 23:57:56 +02:00
break ;
2013-07-16 22:47:07 +02:00
case r__bridge :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _drawbridgeOpen > 0 ) {
_vm - > _gyro - > _dna . _drawbridgeOpen = 4 ; // Fully open.
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > lose_timer ( _vm - > _timeout - > reason_drawbridgefalls ) ;
2013-07-01 23:57:56 +02:00
}
2013-07-16 22:47:07 +02:00
break ;
case r__outsidecardiffcastle :
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > lose_timer ( _vm - > _timeout - > reason_cardiffsurvey ) ;
2013-07-16 22:47:07 +02:00
break ;
case r__robins :
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > lose_timer ( _vm - > _timeout - > reason_getting_tied_up ) ;
2013-07-16 22:47:07 +02:00
break ;
2013-07-01 23:57:56 +02:00
}
2013-09-05 23:57:58 +02:00
_vm - > _gyro - > _interrogation = 0 ; // Leaving the room cancels all the questions automatically.
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _seeScroll = false ; // Now it can work again!
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _lastRoom = _vm - > _gyro - > _dna . _room ;
if ( _vm - > _gyro - > _dna . _room ! = r__map )
_vm - > _gyro - > _dna . _lastRoomNotMap = _vm - > _gyro - > _dna . _room ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : enterNewTown ( ) {
2013-09-04 18:12:06 +02:00
_vm - > _dropdown - > setupMenu ( ) ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
switch ( _vm - > _gyro - > _dna . _room ) {
2013-09-05 07:47:40 +02:00
case r__outsidenottspub : // Entry into Nottingham.
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _roomCount [ r__robins ] > 0 ) & & ( _vm - > _gyro - > _dna . _beenTiedUp ) & & ( ! _vm - > _gyro - > _dna . _takenMushroom ) )
_vm - > _gyro - > _dna . _mushroomGrowing = true ;
2013-07-01 23:57:56 +02:00
break ;
2013-09-05 07:47:40 +02:00
case r__wisewomans : { // Entry into Argent.
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _talkedToCrapulus & & ( ! _vm - > _gyro - > _dna . _lustieIsAsleep ) ) {
_vm - > _gyro - > _dna . _spludwickAtHome = ! ( ( _vm - > _gyro - > _dna . _roomCount [ r__wisewomans ] % 3 ) = = 1 ) ;
_vm - > _gyro - > _dna . _crapulusWillTell = ! _vm - > _gyro - > _dna . _spludwickAtHome ;
2013-07-01 23:57:56 +02:00
} else {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _spludwickAtHome = true ;
_vm - > _gyro - > _dna . _crapulusWillTell = false ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _boxContent = = _vm - > _gyro - > kObjectWine )
_vm - > _gyro - > _dna . _wineState = 3 ; // Vinegar
2013-07-01 23:57:56 +02:00
}
break ;
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _room ! = r__outsideducks ) {
if ( ( _vm - > _gyro - > _dna . _objects [ _vm - > _gyro - > kObjectOnion - 1 ] ) & & ! ( _vm - > _gyro - > _dna . _onionInVinegar ) )
_vm - > _gyro - > _dna . _rottenOnion = true ; // You're holding the onion
2013-07-01 23:57:56 +02:00
}
}
2013-09-07 15:58:02 +02:00
void Lucerna : : putGeidaAt ( byte whichPed , byte & ped ) {
2013-07-16 22:47:07 +02:00
if ( ped = = 0 )
return ;
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 5 , false , _vm - > _trip ) ; // load Geida
2013-09-07 15:58:02 +02:00
_vm - > _trip - > apped ( 2 , whichPed ) ;
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . call_eachstep = true ;
_vm - > _trip - > tr [ 1 ] . eachstep = _vm - > _trip - > procgeida_procs ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : enterRoom ( byte room , byte ped ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _seeScroll = true ; // This stops the trippancy system working over the length of this procedure.
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
findPeople ( room ) ;
_vm - > _gyro - > _dna . _room = room ;
2013-07-16 22:47:07 +02:00
if ( ped ! = 0 )
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _dna . _roomCount [ room ] + + ;
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
loadRoom ( room ) ;
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
if ( ( _vm - > _gyro - > _dna . _roomCount [ room ] = = 0 ) & & ( ! _vm - > _gyro - > setFlag ( ' S ' ) ) )
incScore ( 1 ) ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleAvalot - 150 ] = _vm - > _gyro - > _dna . _room ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows )
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleGeida - 150 ] = room ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _roomTime = 0 ;
2013-07-01 23:57:56 +02:00
2013-09-07 09:00:34 +02:00
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _lastRoom = = r__map ) & & ( _vm - > _gyro - > _dna . _lastRoomNotMap ! = _vm - > _gyro - > _dna . _room ) )
2013-09-07 15:58:02 +02:00
enterNewTown ( ) ;
2013-09-07 09:00:34 +02:00
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
switch ( room ) {
2013-07-01 23:57:56 +02:00
case r__yours :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _avvyInBed ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 100 , _vm - > _timeout - > procarkata_shouts , _vm - > _timeout - > reason_arkata_shouts ) ;
2013-07-01 23:57:56 +02:00
}
break ;
case r__outsideyours :
if ( ped > 0 ) {
2013-09-06 16:23:57 +02:00
if ( ! _vm - > _gyro - > _dna . _talkedToCrapulus ) {
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleCrapulus - 150 ] = r__outsideyours ;
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 8 , false , _vm - > _trip ) ; // load Crapulus
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _roomCount [ r__outsideyours ] = = 1 ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > apped ( 2 , 4 ) ; // Start on the right-hand side of the screen.
_vm - > _trip - > tr [ 1 ] . walkto ( 5 ) ; // Walks up to greet you.
2013-07-01 23:57:56 +02:00
} else {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > apped ( 2 , 5 ) ; // Starts where he was before.
2013-08-09 03:02:28 +02:00
_vm - > _trip - > tr [ 1 ] . face = 3 ;
2013-07-01 23:57:56 +02:00
}
2013-08-12 17:23:39 +02:00
_vm - > _trip - > tr [ 1 ] . call_eachstep = true ;
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . eachstep = _vm - > _trip - > procface_avvy ; // He always faces Avvy.
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
} else _vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleCrapulus - 150 ] = r__nowhere ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _crapulusWillTell ) {
2013-08-09 03:02:28 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 8 , false , _vm - > _trip ) ;
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ;
_vm - > _trip - > tr [ 1 ] . walkto ( 4 ) ;
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 20 , _vm - > _timeout - > proccrapulus_splud_out , _vm - > _timeout - > reason_crapulus_says_spludwick_out ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _crapulusWillTell = false ;
2013-07-01 23:57:56 +02:00
}
}
break ;
2013-08-09 13:21:57 +02:00
case r__outsidespludwicks :
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _roomCount [ r__outsidespludwicks ] = = 1 ) & & ( ped = = 1 ) ) {
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 20 , _vm - > _timeout - > procbang , _vm - > _timeout - > reason_explosion ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _spludwickAtHome = true ;
2013-07-01 23:57:56 +02:00
}
2013-08-09 13:21:57 +02:00
break ;
2013-07-01 23:57:56 +02:00
case r__spludwicks :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _spludwickAtHome ) {
2013-07-01 23:57:56 +02:00
if ( ped > 0 ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 2 , false , _vm - > _trip ) ; // load Spludwick
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ;
2013-09-05 23:57:58 +02:00
_vm - > _gyro - > _whereIs [ 1 ] = r__spludwicks ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _dogFoodPos = 0 ; // _vm->_gyro->also Spludwick pos.
2013-07-01 23:57:56 +02:00
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . call_eachstep = true ;
_vm - > _trip - > tr [ 1 ] . eachstep = _vm - > _trip - > procgeida_procs ;
2013-08-29 12:07:04 +02:00
} else
2013-09-05 23:57:58 +02:00
_vm - > _gyro - > _whereIs [ 1 ] = r__nowhere ;
2013-07-01 23:57:56 +02:00
break ;
2013-09-06 07:52:02 +02:00
case r__brummieroad :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows )
2013-09-07 15:58:02 +02:00
putGeidaAt ( 5 , ped ) ;
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _cwytalotGone ) {
_vm - > _gyro - > _magics [ kColorLightred - 1 ] . _operation = _vm - > _gyro - > kMagicNothing ;
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleCwytalot - 150 ] = r__nowhere ;
2013-07-01 23:57:56 +02:00
} else {
if ( ped > 0 ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 4 , false , _vm - > _trip ) ; // 4 = Cwytalot
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . call_eachstep = true ;
_vm - > _trip - > tr [ 1 ] . eachstep = _vm - > _trip - > procfollow_avvy_y ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleCwytalot - 150 ] = r__brummieroad ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _roomCount [ r__brummieroad ] = = 1 ) { // First time here...
2013-09-05 07:47:40 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ; // He appears on the right of the screen...
_vm - > _trip - > tr [ 1 ] . walkto ( 4 ) ; // ...and he walks up...
2013-07-01 23:57:56 +02:00
} else {
2013-09-05 07:47:40 +02:00
// You've been here before.
_vm - > _trip - > apped ( 2 , 4 ) ; // He's standing in your way straight away...
2013-09-07 09:14:14 +02:00
_vm - > _trip - > tr [ 1 ] . face = _vm - > _trip - > kDirLeft ;
2013-07-01 23:57:56 +02:00
}
}
}
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__argentroad :
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _cwytalotGone ) & & ( ! _vm - > _gyro - > _dna . _passedCwytalotInHerts ) & & ( ped = = 2 ) & &
( _vm - > _gyro - > _dna . _roomCount [ r__argentroad ] > 3 ) ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 4 , false , _vm - > _trip ) ; // 4 = Cwytalot again
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 1 ) ;
_vm - > _trip - > tr [ 1 ] . walkto ( 2 ) ;
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . vanishifstill = true ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _passedCwytalotInHerts = true ;
2013-09-05 07:47:40 +02:00
// _vm->_gyro->whereis[#157] = r__Nowhere; // can we fit this in?
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 20 , _vm - > _timeout - > proc_cwytalot_in_herts , _vm - > _timeout - > reason_cwytalot_in_herts ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__bridge :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _drawbridgeOpen = = 4 ) { // open
2013-09-05 07:47:40 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ; // Position of drawbridge
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _magics [ kColorGreen - 1 ] . _operation = _vm - > _gyro - > kMagicNothing ; // You may enter the drawbridge.
2013-07-01 23:57:56 +02:00
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows )
2013-09-07 15:58:02 +02:00
putGeidaAt ( ped + 3 , ped ) ; // load Geida
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__robins :
2013-07-01 23:57:56 +02:00
if ( ped > 0 ) {
2013-09-06 16:23:57 +02:00
if ( ! _vm - > _gyro - > _dna . _beenTiedUp ) {
2013-09-05 07:47:40 +02:00
// A welcome party... or maybe not...
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 6 , false , _vm - > _trip ) ;
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ;
_vm - > _trip - > tr [ 1 ] . walkto ( 3 ) ;
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 36 , _vm - > _timeout - > procget_tied_up , _vm - > _timeout - > reason_getting_tied_up ) ;
2013-07-01 23:57:56 +02:00
}
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _beenTiedUp ) {
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleRobinHood - 150 ] = 0 ;
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleFriarTuck - 150 ] = 0 ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _tiedUp )
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-07-01 23:57:56 +02:00
2013-09-07 09:00:34 +02:00
if ( ! _vm - > _gyro - > _dna . _mushroomGrowing )
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__outsidecardiffcastle :
2013-07-01 23:57:56 +02:00
if ( ped > 0 )
2013-09-06 16:23:57 +02:00
switch ( _vm - > _gyro - > _dna . _cardiffQuestionNum ) {
2013-09-05 07:47:40 +02:00
case 0 : { // You've answered NONE of his questions.
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 9 , false , _vm - > _trip ) ;
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ;
_vm - > _trip - > tr [ 1 ] . walkto ( 3 ) ;
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 47 , _vm - > _timeout - > proccardiffsurvey , _vm - > _timeout - > reason_cardiffsurvey ) ;
2013-07-01 23:57:56 +02:00
}
break ;
case 5 :
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _magics [ 1 ] . _operation = _vm - > _gyro - > kMagicNothing ;
2013-09-05 07:47:40 +02:00
break ; // You've answered ALL his questions. => nothing happens.
default : { // You've answered SOME of his questions.
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 9 , false , _vm - > _trip ) ;
2013-08-23 16:03:06 +02:00
_vm - > _trip - > apped ( 2 , 3 ) ;
2013-09-07 09:14:14 +02:00
_vm - > _trip - > tr [ 1 ] . face = _vm - > _trip - > kDirRight ;
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 3 , _vm - > _timeout - > proccardiff_return , _vm - > _timeout - > reason_cardiffsurvey ) ;
2013-07-01 23:57:56 +02:00
}
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _cardiffQuestionNum < 5 )
_vm - > _gyro - > _interrogation = _vm - > _gyro - > _dna . _cardiffQuestionNum ;
2013-09-05 23:57:58 +02:00
else _vm - > _gyro - > _interrogation = 0 ;
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__map :
2013-09-05 07:47:40 +02:00
// You're entering the map.
2013-08-23 16:58:22 +02:00
dawn ( ) ;
//setactivepage(cp);
if ( ped > 0 )
2013-09-07 15:58:02 +02:00
zoomOut ( _vm - > _gyro - > _peds [ ped - 1 ] . _x , _vm - > _gyro - > _peds [ ped - 1 ] . _y ) ;
2013-08-23 16:58:22 +02:00
//setactivepage(1 - cp);
{
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _objects [ _vm - > _gyro - > kObjectWine - 1 ] ) & & ( _vm - > _gyro - > _dna . _wineState ! = 3 ) ) {
2013-09-05 07:47:40 +02:00
_vm - > _visa - > dixi ( ' q ' , 9 ) ; // Don't want to waste the wine!
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _objects [ _vm - > _gyro - > kObjectWine - 1 ] = false ;
2013-09-07 15:58:02 +02:00
refreshObjectList ( ) ;
2013-08-23 16:58:22 +02:00
}
}
_vm - > _visa - > dixi ( ' q ' , 69 ) ;
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__catacombs :
2013-08-29 23:38:47 +02:00
if ( ( ped = = 0 ) | | ( ped = = 3 ) | | ( ped = = 5 ) | | ( ped = = 6 ) ) {
switch ( ped ) {
case 3 : { // Enter from oubliette
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _catacombX = 8 ;
_vm - > _gyro - > _dna . _catacombY = 4 ;
2013-08-29 23:38:47 +02:00
}
2013-09-07 09:00:34 +02:00
break ;
2013-08-29 23:38:47 +02:00
case 5 : { // Enter from du Lustie's
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _catacombX = 8 ;
_vm - > _gyro - > _dna . _catacombY = 7 ;
2013-08-29 23:38:47 +02:00
}
2013-09-07 09:00:34 +02:00
break ;
2013-08-29 23:38:47 +02:00
case 6 : { // Enter from Geida's
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _catacombX = 4 ;
_vm - > _gyro - > _dna . _catacombY = 1 ;
2013-08-29 23:38:47 +02:00
}
2013-09-07 09:00:34 +02:00
break ;
2013-08-29 23:38:47 +02:00
}
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _enterCatacombsFromLustiesRoom = true ;
2013-08-29 23:38:47 +02:00
_vm - > _trip - > catamove ( ped ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _enterCatacombsFromLustiesRoom = false ;
2013-08-29 23:38:47 +02:00
}
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__argentpub :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _wonNim )
2013-09-05 07:47:40 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ; // No lute by the settle.
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _malagauche = 0 ; // Ready to boot Malagauche
if ( _vm - > _gyro - > _dna . _givenBadgeToIby ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 8 ) ;
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 9 ) ;
2013-07-01 23:57:56 +02:00
}
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__lustiesroom :
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _dogFoodPos = 1 ; // Actually, du Lustie pos.
2013-09-05 07:47:40 +02:00
if ( _vm - > _trip - > tr [ 0 ] . whichsprite = = 0 ) // Avvy in his normal clothes
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 3 , _vm - > _timeout - > proccallsguards , _vm - > _timeout - > reason_du_lustie_talks ) ;
2013-09-06 16:23:57 +02:00
else if ( ! _vm - > _gyro - > _dna . _enteredLustiesRoomAsMonk ) // already
2013-09-05 07:47:40 +02:00
// Presumably, Avvy dressed as a monk.
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 3 , _vm - > _timeout - > procgreetsmonk , _vm - > _timeout - > reason_du_lustie_talks ) ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows ) {
2013-09-07 15:58:02 +02:00
putGeidaAt ( 5 , ped ) ;
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _lustieIsAsleep ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 5 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
}
2013-07-01 23:57:56 +02:00
}
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
2013-09-06 07:52:02 +02:00
case r__musicroom :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _jacquesState > 0 ) {
_vm - > _gyro - > _dna . _jacquesState = 5 ;
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 4 ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _magics [ kColorBrown - 1 ] . _operation = _vm - > _gyro - > kMagicNothing ;
_vm - > _gyro - > _whereIs [ _vm - > _gyro - > kPeopleJacques - 150 ] = 0 ;
2013-07-01 23:57:56 +02:00
}
if ( ped ! = 0 ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 6 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 6 ) ;
_vm - > _sequence - > then_show ( 5 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 7 ) ;
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
case r__outsidenottspub :
if ( ped = = 2 ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 3 ) ;
_vm - > _sequence - > then_show ( 2 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 1 ) ;
_vm - > _sequence - > then_show ( 4 ) ;
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
case r__outsideargentpub :
if ( ped = = 2 ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 6 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 6 ) ;
_vm - > _sequence - > then_show ( 5 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 7 ) ;
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
2013-09-06 07:52:02 +02:00
case r__wisewomans :
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 11 , false , _vm - > _trip ) ;
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _dna . _roomCount [ r__wisewomans ] = = 1 ) & & ( ped > 0 ) ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > apped ( 2 , 2 ) ; // Start on the right-hand side of the screen.
_vm - > _trip - > tr [ 1 ] . walkto ( 4 ) ; // Walks up to greet you.
2013-07-01 23:57:56 +02:00
} else {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > apped ( 2 , 4 ) ; // Starts where she was before.
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . face = 3 ;
2013-07-01 23:57:56 +02:00
}
2013-08-09 13:21:57 +02:00
_vm - > _trip - > tr [ 1 ] . call_eachstep = true ;
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . eachstep = _vm - > _trip - > procface_avvy ; // She always faces Avvy.
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
case r__insidecardiffcastle :
if ( ped > 0 ) {
2013-09-05 07:47:40 +02:00
_vm - > _trip - > tr [ 1 ] . init ( 10 , false , _vm - > _trip ) ; // Define the dart.
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > first_show ( 1 ) ;
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _arrowInTheDoor )
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 3 ) ;
2013-07-01 23:57:56 +02:00
else
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 2 ) ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _takenPen )
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 4 ) ;
2013-07-01 23:57:56 +02:00
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
} else {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ;
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _arrowInTheDoor )
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-08-23 11:33:37 +02:00
else
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
case r__avvysgarden :
if ( ped = = 1 ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 2 ) ;
_vm - > _sequence - > then_show ( 1 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > then_show ( 3 ) ;
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
2013-09-07 09:00:34 +02:00
2013-07-01 23:57:56 +02:00
case r__entrancehall :
case r__insideabbey :
2013-08-23 11:33:37 +02:00
case r__yourhall :
2013-07-01 23:57:56 +02:00
if ( ped = = 2 ) {
2013-09-05 07:47:40 +02:00
#if 0
// It was the original:
2013-08-30 11:56:16 +02:00
_vm - > _celer - > show_one ( - 1 , - 1 , 2 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > first_show ( 1 ) ;
_vm - > _sequence - > then_show ( 3 ) ;
2013-09-05 07:47:40 +02:00
_vm - > _sequence - > start_to_close ( ) ;
# endif
2013-08-23 11:33:37 +02:00
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 2 ) ;
_vm - > _sequence - > then_show ( 1 ) ;
_vm - > _sequence - > then_show ( 3 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
case r__aylesoffice :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _aylesIsAwake )
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
2013-09-05 07:47:40 +02:00
break ; // Ayles awake.
2013-07-01 23:57:56 +02:00
case r__geidas :
2013-09-07 15:58:02 +02:00
putGeidaAt ( 2 , ped ) ;
2013-09-05 07:47:40 +02:00
break ; // load Geida
2013-07-01 23:57:56 +02:00
case r__easthall :
case r__westhall :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows )
2013-09-07 15:58:02 +02:00
putGeidaAt ( ped + 2 , ped ) ;
2013-07-01 23:57:56 +02:00
break ;
case r__lusties :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _geidaFollows )
2013-09-07 15:58:02 +02:00
putGeidaAt ( ped + 6 , ped ) ;
2013-07-01 23:57:56 +02:00
break ;
2013-09-06 07:52:02 +02:00
case r__nottspub :
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dna . _sittingInPub ) _vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
_vm - > _gyro - > _dna . _dogFoodPos = 1 ; // Actually, du Lustie pos.
2013-09-06 07:52:02 +02:00
break ;
2013-07-01 23:57:56 +02:00
case r__outsideducks :
if ( ped = = 2 ) {
2013-09-05 07:47:40 +02:00
// Shut the door
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-08-23 11:33:37 +02:00
_vm - > _graphics - > refreshBackground ( ) ;
_vm - > _sequence - > first_show ( 3 ) ;
2013-07-24 19:43:10 +02:00
_vm - > _sequence - > first_show ( 2 ) ;
_vm - > _sequence - > then_show ( 1 ) ;
_vm - > _sequence - > then_show ( 4 ) ;
_vm - > _sequence - > start_to_close ( ) ;
2013-07-01 23:57:56 +02:00
}
break ;
2013-08-23 16:03:06 +02:00
2013-07-01 23:57:56 +02:00
case r__ducks :
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _dogFoodPos = 1 ;
2013-09-05 07:47:40 +02:00
break ; // Actually, Duck pos.
2013-07-01 23:57:56 +02:00
}
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _seeScroll = false ; // Now it can work again!
2013-07-01 23:57:56 +02:00
2013-08-25 17:38:22 +02:00
if ( _vm - > _gyro - > isLoaded )
_vm - > _gyro - > isLoaded = false ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : thinkAbout ( byte object , bool type ) {
const int16 picSize = 966 ;
2013-07-05 16:38:34 +02:00
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _thinks = object ;
object - - ;
2013-07-05 16:38:34 +02:00
2013-09-06 07:52:02 +02:00
_vm - > _gyro - > setMousePointerWait ( ) ;
2013-07-16 13:03:22 +02:00
2013-09-07 15:58:02 +02:00
switch ( type ) {
case Gyro : : kThing :
if ( ! file . open ( " thinks.avd " ) ) {
2013-07-05 16:38:34 +02:00
warning ( " AVALANCHE: Lucerna: File not found: thinks.avd " ) ;
return ;
}
2013-09-07 15:58:02 +02:00
break ;
case Gyro : : kPerson :
if ( ! file . open ( " folk.avd " ) ) {
2013-07-05 18:05:08 +02:00
warning ( " AVALANCHE: Lucerna: File not found: folk.avd " ) ;
2013-07-05 16:38:34 +02:00
return ;
}
2013-09-07 15:58:02 +02:00
object = object - 149 ;
if ( object > = 25 )
object - = 8 ;
if ( object = = 20 )
object - - ; // Last time...
2013-07-05 16:38:34 +02:00
2013-09-07 15:58:02 +02:00
break ;
2013-07-16 13:03:22 +02:00
}
2013-07-05 16:38:34 +02:00
2013-09-07 15:58:02 +02:00
file . seek ( object * picSize + 65 ) ;
2013-09-07 09:00:34 +02:00
2013-09-07 15:58:02 +02:00
: : Graphics : : Surface picture = _vm - > _graphics - > loadPictureGraphic ( file ) ;
2013-07-05 16:38:34 +02:00
2013-08-21 18:01:31 +02:00
_vm - > _graphics - > drawPicture ( _vm - > _graphics - > _surface , picture , 205 , 170 ) ;
2013-07-17 11:35:40 +02:00
2013-07-26 13:32:08 +02:00
picture . free ( ) ;
2013-09-07 09:00:34 +02:00
2013-09-07 15:58:02 +02:00
file . close ( ) ;
2013-07-16 13:03:22 +02:00
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( false ) ;
2013-07-05 16:38:34 +02:00
2013-09-05 07:47:40 +02:00
#if 0
setactivepage ( 3 ) ;
2013-07-05 16:38:34 +02:00
putimage ( x , y , p , 0 ) ;
2013-09-05 07:47:40 +02:00
setactivepage ( 1 - cp ) ;
# endif
2013-07-05 16:38:34 +02:00
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( true ) ;
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _thinkThing = type ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : loadDigits ( ) { // Load the scoring digits & rwlites
2013-07-05 18:05:08 +02:00
const byte digitsize = 134 ;
const byte rwlitesize = 126 ;
2013-09-07 15:58:02 +02:00
if ( ! file . open ( " digit.avd " ) ) {
2013-07-05 18:05:08 +02:00
warning ( " AVALANCHE: Lucerna: File not found: digit.avd " ) ;
return ;
}
2013-09-07 15:58:02 +02:00
for ( byte i = 0 ; i < 10 ; i + + ) {
file . seek ( i * digitsize ) ;
_vm - > _gyro - > _digits [ i ] = _vm - > _graphics - > loadPictureGraphic ( file ) ;
2013-07-05 18:05:08 +02:00
}
2013-09-07 15:58:02 +02:00
for ( byte i = 0 ; i < 9 ; i + + ) {
file . seek ( 10 * digitsize + i * rwlitesize ) ;
_vm - > _gyro - > _directions [ i ] = _vm - > _graphics - > loadPictureGraphic ( file ) ;
2013-07-05 18:05:08 +02:00
}
2013-07-09 18:54:53 +02:00
2013-09-07 15:58:02 +02:00
file . close ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : drawToolbar ( ) {
if ( ! file . open ( " useful.avd " ) ) {
2013-07-05 18:28:43 +02:00
warning ( " AVALANCHE: Lucerna: File not found: useful.avd " ) ;
return ;
}
2013-09-07 15:58:02 +02:00
file . seek ( 40 ) ;
2013-09-07 09:00:34 +02:00
2013-09-07 15:58:02 +02:00
CursorMan . showMouse ( false ) ;
2013-07-05 18:28:43 +02:00
2013-09-07 15:58:02 +02:00
: : Graphics : : Surface picture = _vm - > _graphics - > loadPictureGraphic ( file ) ;
2013-07-17 11:35:40 +02:00
2013-08-21 18:01:31 +02:00
_vm - > _graphics - > drawPicture ( _vm - > _graphics - > _surface , picture , 5 , 169 ) ;
2013-07-15 16:57:03 +02:00
2013-07-26 13:32:08 +02:00
picture . free ( ) ;
2013-07-17 11:35:40 +02:00
2013-09-07 15:58:02 +02:00
file . close ( ) ;
2013-07-05 18:28:43 +02:00
2013-09-07 15:58:02 +02:00
CursorMan . showMouse ( true ) ;
2013-07-15 16:57:03 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _oldDirection = 177 ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : drawScore ( ) {
2013-09-05 23:57:58 +02:00
if ( _vm - > _gyro - > kDemo )
2013-07-17 11:35:40 +02:00
return ;
2013-09-06 16:23:57 +02:00
uint16 score = _vm - > _gyro - > _dna . _score ;
2013-07-17 12:27:08 +02:00
int8 numbers [ 3 ] = { 0 , 0 , 0 } ;
2013-07-17 11:35:40 +02:00
for ( byte i = 0 ; i < 2 ; i + + ) {
byte divisor = 1 ;
for ( byte j = 0 ; j < ( 2 - i ) ; j + + )
divisor * = 10 ;
numbers [ i ] = score / divisor ;
score - = numbers [ i ] * divisor ;
}
numbers [ 2 ] = score ;
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( false ) ;
2013-07-17 11:35:40 +02:00
2013-09-04 13:34:58 +02:00
for ( byte fv = 0 ; fv < 3 ; fv + + )
2013-09-07 09:00:34 +02:00
if ( _vm - > _gyro - > _scoreToDisplay [ fv ] ! = numbers [ fv ] )
2013-09-06 16:23:57 +02:00
_vm - > _graphics - > drawPicture ( _vm - > _graphics - > _surface , _vm - > _gyro - > _digits [ numbers [ fv ] ] , 250 + ( fv + 1 ) * 15 , 177 ) ;
2013-07-17 11:35:40 +02:00
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( true ) ;
2013-09-07 15:58:02 +02:00
2013-07-17 12:27:08 +02:00
for ( byte i = 0 ; i < 3 ; i + + )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _scoreToDisplay [ i ] = numbers [ i ] ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : incScore ( byte num ) { // Add on no. of points
2013-09-04 13:34:58 +02:00
for ( byte q = 1 ; q < = num ; q + + ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _score + + ;
2013-09-05 07:47:40 +02:00
#if 0
if ( soundfx ) {
2013-09-04 13:34:58 +02:00
for ( byte fv = 1 ; fv < = 97 ; fv + + )
2013-07-17 13:00:15 +02:00
sound ( 177 + dna . score * 3 ) ;
2013-09-05 07:47:40 +02:00
}
nosound ;
# endif
2013-07-17 13:00:15 +02:00
}
2013-07-01 23:57:56 +02:00
warning ( " STUB: Lucerna::points() " ) ;
2013-07-17 13:00:15 +02:00
2013-09-07 15:58:02 +02:00
drawScore ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : useCompass ( const Common : : Point & cursorPos ) {
byte color = * ( byte * ) _vm - > _graphics - > _surface . getBasePtr ( cursorPos . x , cursorPos . y / 2 ) ;
2013-08-17 15:07:02 +02:00
2013-09-07 15:58:02 +02:00
switch ( color ) {
2013-09-05 23:07:08 +02:00
case kColorGreen : {
2013-09-07 09:14:14 +02:00
_vm - > _gyro - > _dna . _direction = _vm - > _trip - > kDirUp ;
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirUp ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-08-17 15:07:02 +02:00
}
break ;
2013-09-05 23:07:08 +02:00
case kColorBrown : {
2013-09-07 09:14:14 +02:00
_vm - > _gyro - > _dna . _direction = _vm - > _trip - > kDirDown ;
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirDown ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-08-17 15:07:02 +02:00
}
break ;
2013-09-05 23:07:08 +02:00
case kColorCyan : {
2013-09-07 09:14:14 +02:00
_vm - > _gyro - > _dna . _direction = _vm - > _trip - > kDirLeft ;
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirLeft ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-08-17 15:07:02 +02:00
}
break ;
2013-09-05 23:07:08 +02:00
case kColorLightmagenta : {
2013-09-07 09:14:14 +02:00
_vm - > _gyro - > _dna . _direction = _vm - > _trip - > kDirRight ;
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirRight ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-08-17 15:07:02 +02:00
}
break ;
2013-09-05 23:07:08 +02:00
case kColorRed :
case kColorWhite :
case kColorLightcyan :
case kColorYellow : { // Fall-throughs are intended.
2013-08-17 15:07:02 +02:00
_vm - > _trip - > stopwalking ( ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-08-17 15:07:02 +02:00
}
break ;
}
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : fxToggle ( ) {
2013-07-01 23:57:56 +02:00
warning ( " STUB: Lucerna::fxtoggle() " ) ;
}
2013-06-25 18:03:46 +02:00
2013-09-07 15:58:02 +02:00
void Lucerna : : refreshObjectList ( ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _carryNum = 0 ;
if ( _vm - > _gyro - > _thinkThing & & ! _vm - > _gyro - > _dna . _objects [ _vm - > _gyro - > _thinks - 1 ] )
2013-09-07 15:58:02 +02:00
thinkAbout ( _vm - > _gyro - > kObjectMoney , Gyro : : kThing ) ; // you always have money
for ( byte i = 0 ; i < kObjectNum ; i + + )
if ( _vm - > _gyro - > _dna . _objects [ i ] ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _carryNum + + ;
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _objectList [ _vm - > _gyro - > _dna . _carryNum ] = i + 1 ;
2013-07-01 23:57:56 +02:00
}
2013-06-28 18:29:59 +02:00
}
2013-06-25 18:03:46 +02:00
2013-09-07 15:58:02 +02:00
void Lucerna : : guideAvvy ( Common : : Point cursorPos ) {
2013-09-07 09:00:34 +02:00
if ( ! _vm - > _gyro - > _dna . _userMovesAvvy )
2013-07-16 22:47:07 +02:00
return ;
2013-07-01 23:57:56 +02:00
2013-08-16 23:29:03 +02:00
cursorPos . y / = 2 ;
byte what ;
2013-07-01 23:57:56 +02:00
2013-08-16 23:29:03 +02:00
// _vm->_trip->tr[0] : that's the only one we're interested in here. (It's Avalot.)
2013-09-07 09:00:34 +02:00
if ( cursorPos . x < _vm - > _trip - > tr [ 0 ] . x )
2013-07-16 22:47:07 +02:00
what = 1 ;
2013-09-07 09:00:34 +02:00
else if ( cursorPos . x > ( _vm - > _trip - > tr [ 0 ] . x + _vm - > _trip - > tr [ 0 ] . _info . _xLength ) )
2013-07-16 22:47:07 +02:00
what = 2 ;
else
2013-08-16 23:29:03 +02:00
what = 0 ; // On top
2013-07-16 22:47:07 +02:00
2013-08-16 23:29:03 +02:00
if ( cursorPos . y < _vm - > _trip - > tr [ 0 ] . y )
2013-07-16 22:47:07 +02:00
what + = 3 ;
2013-09-05 13:20:03 +02:00
else if ( cursorPos . y > ( _vm - > _trip - > tr [ 0 ] . y + _vm - > _trip - > tr [ 0 ] . _info . _yLength ) )
2013-07-16 22:47:07 +02:00
what + = 6 ;
switch ( what ) {
case 0 :
2013-07-24 19:43:10 +02:00
_vm - > _trip - > stopwalking ( ) ;
2013-08-16 23:29:03 +02:00
break ; // Clicked on Avvy: no movement.
2013-07-16 22:47:07 +02:00
case 1 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirLeft ) ;
2013-07-16 22:47:07 +02:00
break ;
case 2 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirRight ) ;
2013-07-16 22:47:07 +02:00
break ;
case 3 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirUp ) ;
2013-07-16 22:47:07 +02:00
break ;
case 4 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirUpLeft ) ;
2013-07-16 22:47:07 +02:00
break ;
case 5 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirUpRight ) ;
2013-07-16 22:47:07 +02:00
break ;
case 6 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirDown ) ;
2013-07-16 22:47:07 +02:00
break ;
case 7 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirDownLeft ) ;
2013-07-16 22:47:07 +02:00
break ;
case 8 :
2013-09-07 09:14:14 +02:00
_vm - > _trip - > rwsp ( 0 , _vm - > _trip - > kDirDownRight ) ;
2013-07-16 22:47:07 +02:00
break ;
2013-08-16 23:29:03 +02:00
} // No other values are possible.
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : checkClick ( ) {
2013-08-16 23:02:53 +02:00
Common : : Point cursorPos = _vm - > getMousePos ( ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _onToolbar = _vm - > _gyro - > kSlowComputer & & ( ( cursorPos . y > = 169 ) | | ( cursorPos . y < = 10 ) ) ;
2013-09-07 09:00:34 +02:00
2013-09-05 15:48:30 +02:00
/*if (_vm->_gyro->mrelease > 0)
_vm - > _gyro - > after_the_scroll = false ; */
2013-08-16 23:02:53 +02:00
if ( ( 0 < = cursorPos . y ) & & ( cursorPos . y < = 21 ) )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > newMouse ( 1 ) ; // up arrow
2013-08-16 23:02:53 +02:00
else if ( ( 317 < = cursorPos . y ) & & ( cursorPos . y < = 339 ) )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > newMouse ( 8 ) ; //I-beam
2013-08-16 23:02:53 +02:00
else if ( ( 340 < = cursorPos . y ) & & ( cursorPos . y < = 399 ) )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > newMouse ( 2 ) ; // screwdriver
else if ( ! _vm - > _gyro - > _dropdownActive ) { // Dropdown can handle its own pointers.
2013-08-16 23:02:53 +02:00
if ( holdLeftMouse ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > newMouse ( 7 ) ; // Mark's crosshairs
2013-09-07 15:58:02 +02:00
guideAvvy ( cursorPos ) ; // Normally, if you click on the picture, you're guiding Avvy around.
2013-08-16 23:02:53 +02:00
} else
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > newMouse ( 4 ) ; // fletch
2013-08-16 23:02:53 +02:00
}
2013-09-07 09:00:34 +02:00
2013-09-05 01:27:51 +02:00
if ( holdLeftMouse ) {
2013-09-01 17:15:55 +02:00
if ( ( 0 < = cursorPos . y ) & & ( cursorPos . y < = 21 ) ) { // Click on the dropdown menu.
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dropsOk )
2013-09-04 18:12:06 +02:00
_vm - > _dropdown - > updateMenu ( ) ;
2013-08-17 15:07:02 +02:00
} else if ( ( 317 < = cursorPos . y ) & & ( cursorPos . y < = 339 ) ) { // Click on the command line.
_vm - > _parser - > _inputTextPos = ( cursorPos . x - 23 ) / 8 ;
if ( _vm - > _parser - > _inputTextPos > _vm - > _parser - > _inputText . size ( ) + 1 )
_vm - > _parser - > _inputTextPos = _vm - > _parser - > _inputText . size ( ) + 1 ;
if ( _vm - > _parser - > _inputTextPos < 1 )
_vm - > _parser - > _inputTextPos = 1 ;
_vm - > _parser - > _inputTextPos - - ;
_vm - > _parser - > plotText ( ) ;
} else if ( ( 340 < = cursorPos . y ) & & ( cursorPos . y < = 399 ) ) { // Check the toolbar.
if ( ( 137 < = cursorPos . x ) & & ( cursorPos . x < = 207 ) ) { // Control Avvy with the compass.
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _alive & & _vm - > _gyro - > _dna . _avvyIsAwake )
2013-09-07 15:58:02 +02:00
useCompass ( cursorPos ) ;
2013-09-03 15:35:09 +02:00
} else if ( ( 208 < = cursorPos . x ) & & ( cursorPos . x < = 260 ) ) { // Examine the _thing.
2013-08-17 15:07:02 +02:00
do {
_vm - > updateEvents ( ) ;
} while ( holdLeftMouse ) ;
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _thinkThing ) {
_vm - > _acci - > _thing = _vm - > _gyro - > _thinks ;
2013-09-03 15:35:09 +02:00
_vm - > _acci - > _thing + = 49 ;
_vm - > _acci - > _person = _vm - > _acci - > kPardon ;
2013-08-17 15:07:02 +02:00
} else {
2013-09-06 16:23:57 +02:00
_vm - > _acci - > _person = _vm - > _gyro - > _thinks ;
2013-09-03 15:35:09 +02:00
_vm - > _acci - > _thing = _vm - > _acci - > kPardon ;
2013-08-17 15:07:02 +02:00
}
2013-09-06 07:52:02 +02:00
callVerb ( _vm - > _acci - > kVerbCodeExam ) ;
2013-08-17 15:07:02 +02:00
} else if ( ( 261 < = cursorPos . x ) & & ( cursorPos . x < = 319 ) ) { // Display the score.
do {
_vm - > updateEvents ( ) ;
} while ( holdLeftMouse ) ;
2013-09-06 07:52:02 +02:00
callVerb ( _vm - > _acci - > kVerbCodeScore ) ;
2013-08-17 15:07:02 +02:00
} else if ( ( 320 < = cursorPos . x ) & & ( cursorPos . x < = 357 ) ) { // Change speed.
2013-09-05 23:57:58 +02:00
_vm - > _trip - > tr [ 0 ] . xs = _vm - > _gyro - > kWalk ;
2013-08-17 15:07:02 +02:00
_vm - > _trip - > newspeed ( ) ;
} else if ( ( 358 < = cursorPos . x ) & & ( cursorPos . x < = 395 ) ) { // Change speed.
2013-09-05 23:57:58 +02:00
_vm - > _trip - > tr [ 0 ] . xs = _vm - > _gyro - > kRun ;
2013-08-17 15:07:02 +02:00
_vm - > _trip - > newspeed ( ) ;
} else if ( ( 396 < = cursorPos . x ) & & ( cursorPos . x < = 483 ) )
2013-09-07 15:58:02 +02:00
fxToggle ( ) ;
2013-08-17 15:07:02 +02:00
else if ( ( 535 < = cursorPos . x ) & & ( cursorPos . x < = 640 ) )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _mouseText = Common : : String ( 13 ) + _vm - > _gyro - > _mouseText ;
} else if ( ! _vm - > _gyro - > _dropsOk )
_vm - > _gyro - > _mouseText = Common : : String ( 13 ) + _vm - > _gyro - > _mouseText ;
2013-09-05 01:27:51 +02:00
}
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : errorLed ( ) {
2013-07-01 23:57:56 +02:00
warning ( " STUB: Lucerna::errorled() " ) ;
}
int8 Lucerna : : fades ( int8 x ) {
2013-09-07 15:58:02 +02:00
warning ( " STUB: Lucerna::fades() " ) ;
return 0 ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : fadeOut ( byte n ) {
warning ( " STUB: Lucerna::fadeOut() " ) ;
2013-07-01 23:57:56 +02:00
}
void Lucerna : : dusk ( ) {
2013-09-07 15:58:02 +02:00
warning ( " STUB: Lucerna::dusk() " ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : fadeIn ( byte n ) {
warning ( " STUB: Lucerna::fadeIn() " ) ;
2013-07-01 23:57:56 +02:00
}
void Lucerna : : dawn ( ) {
warning ( " STUB: Lucerna::dawn() " ) ;
}
2013-09-07 15:58:02 +02:00
void Lucerna : : drawDirection ( ) { // It's data is loaded in load_digits().
2013-09-07 09:00:34 +02:00
if ( _vm - > _gyro - > _oldDirection = = _vm - > _gyro - > _dna . _direction )
2013-07-18 23:56:55 +02:00
return ;
2013-09-07 15:58:02 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _oldDirection = _vm - > _gyro - > _dna . _direction ;
2013-09-07 09:00:34 +02:00
2013-09-07 15:58:02 +02:00
CursorMan . showMouse ( false ) ;
2013-07-18 23:56:55 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _graphics - > drawPicture ( _vm - > _graphics - > _surface , _vm - > _gyro - > _directions [ _vm - > _gyro - > _dna . _direction ] , 0 , 161 ) ;
2013-07-18 23:56:55 +02:00
2013-08-16 13:40:58 +02:00
CursorMan . showMouse ( true ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : calcHand ( uint16 angle , uint16 length , Common : : Point & endPoint , byte color ) {
if ( angle > 900 ) {
endPoint . x = 177 ;
2013-08-08 03:59:29 +02:00
return ;
}
2013-09-07 15:58:02 +02:00
endPoint = _vm - > _graphics - > drawArc ( _vm - > _graphics - > _surface , _clockCenterX , _clockCenterY , 449 - angle , 450 - angle , length , color ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : drawHand ( const Common : : Point & endPoint , byte color ) {
if ( endPoint . x = = 177 )
2013-08-08 03:59:29 +02:00
return ;
2013-09-07 15:58:02 +02:00
_vm - > _graphics - > _surface . drawLine ( _clockCenterX , _clockCenterY , endPoint . x , endPoint . y , color ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : plotHands ( ) {
calcHand ( _vm - > _gyro - > _onh , 14 , _clockHandHour , kColorYellow ) ;
calcHand ( _vm - > _gyro - > _om * 6 , 17 , _clockHandMinute , kColorYellow ) ;
drawHand ( _clockHandHour , kColorBrown ) ;
drawHand ( _clockHandMinute , kColorBrown ) ;
2013-08-08 03:59:29 +02:00
2013-09-07 15:58:02 +02:00
calcHand ( _hourAngle , 14 , _clockHandHour , kColorBrown ) ;
calcHand ( _vm - > _gyro - > _minutes * 6 , 17 , _clockHandMinute , kColorBrown ) ;
drawHand ( _clockHandHour , kColorYellow ) ;
drawHand ( _clockHandMinute , kColorYellow ) ;
2013-08-08 03:59:29 +02:00
}
void Lucerna : : chime ( ) {
warning ( " STUB: Lucerna::chime() " ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : updateClock ( ) { // TODO: Move variables from Gyro to here (or at least somewhere nearby), rename them.
2013-08-08 03:59:29 +02:00
TimeDate t ;
_vm - > _system - > getTimeAndDate ( t ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _hours = t . tm_hour ;
_vm - > _gyro - > _minutes = t . tm_min ;
_vm - > _gyro - > _seconds = t . tm_sec ;
2013-08-08 03:59:29 +02:00
2013-09-07 15:58:02 +02:00
_hourAngle = ( _vm - > _gyro - > _hours % 12 ) * 30 + _vm - > _gyro - > _minutes / 2 ;
2013-08-08 03:59:29 +02:00
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _oh ! = _vm - > _gyro - > _hours ) {
2013-09-07 15:58:02 +02:00
plotHands ( ) ;
2013-08-08 03:59:29 +02:00
chime ( ) ;
}
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _om ! = _vm - > _gyro - > _minutes )
2013-09-07 15:58:02 +02:00
plotHands ( ) ;
2013-08-08 03:59:29 +02:00
2013-09-06 16:23:57 +02:00
if ( ( _vm - > _gyro - > _hours = = 0 ) & & ( _vm - > _gyro - > _oh ! = 0 ) & & ( _vm - > _gyro - > _oh ! = 17717 ) )
2013-09-06 07:52:02 +02:00
_vm - > _scrolls - > display ( Common : : String ( " Good morning! \n \n Yes, it's just past midnight. Are you having an all-night Avvy session? Glad you like the game that much! " ) ) ;
2013-09-07 09:00:34 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _oh = _vm - > _gyro - > _hours ;
2013-09-07 15:58:02 +02:00
_vm - > _gyro - > _onh = _hourAngle ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _om = _vm - > _gyro - > _minutes ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : gameOver ( ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _dna . _userMovesAvvy = false ;
2013-07-01 23:57:56 +02:00
2013-09-04 11:18:09 +02:00
int16 sx = _vm - > _trip - > tr [ 0 ] . x ;
int16 sy = _vm - > _trip - > tr [ 0 ] . y ;
2013-09-07 09:00:34 +02:00
2013-08-07 10:30:44 +02:00
_vm - > _trip - > tr [ 0 ] . done ( ) ;
2013-08-25 13:25:50 +02:00
_vm - > _trip - > tr [ 0 ] . init ( 12 , true , _vm - > _trip ) ; // 12 = Avalot falls
2013-08-07 10:30:44 +02:00
_vm - > _trip - > tr [ 0 ] . step = 0 ;
_vm - > _trip - > tr [ 0 ] . appear ( sx , sy , 0 ) ;
2013-09-07 09:00:34 +02:00
2013-07-24 18:42:41 +02:00
_vm - > _timeout - > set_up_timer ( 3 , _vm - > _timeout - > procavalot_falls , _vm - > _timeout - > reason_falling_over ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _alive = false ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : minorRedraw ( ) {
2013-07-01 23:57:56 +02:00
dusk ( ) ;
2013-08-20 13:37:14 +02:00
2013-09-07 15:58:02 +02:00
enterRoom ( _vm - > _gyro - > _dna . _room , 0 ) ; // Ped unknown or non-existant.
2013-07-01 23:57:56 +02:00
2013-09-07 15:58:02 +02:00
for ( byte i = 0 ; i < = 1 ; i + + ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _cp = 1 - _vm - > _gyro - > _cp ;
2013-07-24 19:43:10 +02:00
_vm - > _trip - > getback ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 09:00:34 +02:00
2013-07-17 12:27:08 +02:00
for ( byte i = 0 ; i < 3 ; i + + )
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _scoreToDisplay [ i ] = - 1 ; // impossible digits
2013-09-07 15:58:02 +02:00
drawScore ( ) ;
2013-09-07 09:00:34 +02:00
2013-07-01 23:57:56 +02:00
dawn ( ) ;
}
2013-09-07 15:58:02 +02:00
void Lucerna : : majorRedraw ( ) {
2013-07-01 23:57:56 +02:00
warning ( " STUB: Lucerna::major_redraw() " ) ;
}
2013-09-07 15:58:02 +02:00
uint16 Lucerna : : bearing ( byte whichPed ) {
byte pedId = whichPed - 1 ; // Different array indexes in Pascal and C.
2013-08-25 13:52:05 +02:00
2013-09-05 07:47:40 +02:00
const double rad2deg = 180 / 3.14 ; // Pi
2013-09-07 09:00:34 +02:00
2013-09-06 23:51:04 +02:00
if ( _vm - > _trip - > tr [ 0 ] . x = = _vm - > _gyro - > _peds [ pedId ] . _x )
2013-08-25 13:52:05 +02:00
return 0 ;
2013-09-06 23:51:04 +02:00
else if ( _vm - > _trip - > tr [ 0 ] . x < _vm - > _gyro - > _peds [ pedId ] . _x ) {
return ( uint16 ) ( ( atan ( double ( ( _vm - > _trip - > tr [ 0 ] . y - _vm - > _gyro - > _peds [ pedId ] . _y ) )
/ ( _vm - > _trip - > tr [ 0 ] . x - _vm - > _gyro - > _peds [ pedId ] . _x ) ) * rad2deg ) + 90 ) ;
} else {
return ( uint16 ) ( ( atan ( double ( ( _vm - > _trip - > tr [ 0 ] . y - _vm - > _gyro - > _peds [ pedId ] . _y ) )
/ ( _vm - > _trip - > tr [ 0 ] . x - _vm - > _gyro - > _peds [ pedId ] . _x ) ) * rad2deg ) + 270 ) ;
2013-09-05 07:47:40 +02:00
}
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : spriteRun ( ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _doingSpriteRun = true ;
2013-07-01 23:57:56 +02:00
2013-07-30 00:30:10 +02:00
_vm - > _trip - > get_back_loretta ( ) ;
_vm - > _trip - > trippancy_link ( ) ;
2013-07-01 23:57:56 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _doingSpriteRun = false ;
2013-07-01 23:57:56 +02:00
}
2013-09-07 15:58:02 +02:00
void Lucerna : : fixFlashers ( ) {
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _ledStatus = 177 ;
_vm - > _gyro - > _oldDirection = 177 ;
2013-07-24 19:43:10 +02:00
_vm - > _scrolls - > state ( 2 ) ;
2013-09-07 15:58:02 +02:00
drawDirection ( ) ;
2013-07-01 23:57:56 +02:00
}
2013-06-25 18:03:46 +02:00
2013-06-28 18:29:59 +02:00
} // End of namespace Avalanche