2013-06-27 09:21:41 +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-09-08 11:30:23 +02:00
/* Original name: TIMEOUT The scheduling unit. */
2013-06-27 09:21:41 +02:00
2013-06-28 20:01:47 +02:00
# include "avalanche/avalanche.h"
2013-09-08 11:30:23 +02:00
# include "avalanche/timer.h"
2013-09-15 13:03:21 +02:00
# include "avalanche/lucerna.h"
2013-09-07 19:09:06 +02:00
# include "avalanche/animation.h"
2013-09-15 13:03:21 +02:00
# include "avalanche/scrolls.h"
# include "avalanche/acci.h"
# include "avalanche/sequence.h"
# include "avalanche/pingo.h"
2013-06-27 09:21:41 +02:00
2013-06-29 16:36:40 +02:00
# include "common/textconsole.h"
2013-06-27 09:21:41 +02:00
namespace Avalanche {
2013-09-08 11:30:23 +02:00
Timer : : Timer ( AvalancheEngine * vm ) {
2013-07-24 18:42:41 +02:00
_vm = vm ;
2013-07-25 22:42:41 +02:00
for ( byte i = 0 ; i < 7 ; i + + ) {
2013-09-08 10:48:22 +02:00
_times [ i ] . _timeLeft = 0 ;
2013-09-08 11:14:00 +02:00
_times [ i ] . _action = 0 ;
_times [ i ] . _reason = 0 ;
2013-06-27 09:21:41 +02:00
}
2013-09-08 10:53:33 +02:00
_timerLost = false ;
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:14:00 +02:00
/**
* Add a nex timer
* @ remarks Originally called ' set_up_timer '
*/
2013-09-08 11:30:23 +02:00
void Timer : : addTimer ( int32 duration , byte action , byte reason ) {
2013-09-08 10:48:22 +02:00
if ( ( _vm - > _gyro - > isLoaded = = false ) | | ( _timerLost = = true ) ) {
2013-08-21 13:45:22 +02:00
byte i = 0 ;
2013-09-08 10:48:22 +02:00
while ( ( i < 7 ) & & ( _times [ i ] . _timeLeft ! = 0 ) )
2013-08-21 13:45:22 +02:00
i + + ;
if ( i = = 7 )
2013-09-08 11:14:00 +02:00
return ; // Oh dear... No timer left
2013-08-21 13:45:22 +02:00
// Everything's OK here!
2013-09-08 11:14:00 +02:00
_times [ i ] . _timeLeft = duration ;
_times [ i ] . _action = action ;
_times [ i ] . _reason = reason ;
2013-08-21 13:45:22 +02:00
} else {
_vm - > _gyro - > isLoaded = false ;
return ;
}
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:14:00 +02:00
/**
* Update the timers
* @ remarks Originally called ' one_tick '
*/
2013-09-08 11:30:23 +02:00
void Timer : : updateTimer ( ) {
2013-09-06 16:23:57 +02:00
if ( _vm - > _gyro - > _dropdownActive )
2013-06-30 14:10:33 +02:00
return ;
2013-06-27 09:21:41 +02:00
2013-09-08 11:14:00 +02:00
for ( byte i = 0 ; i < 7 ; i + + ) {
if ( _times [ i ] . _timeLeft < = 0 )
continue ;
_times [ i ] . _timeLeft - - ;
if ( _times [ i ] . _timeLeft = = 0 ) {
switch ( _times [ i ] . _action ) {
case kProcOpenDrawbridge :
openDrawbridge ( ) ;
break ;
case kProcAvariciusTalks :
avariciusTalks ( ) ;
break ;
case kProcUrinate :
urinate ( ) ;
break ;
case kProcToilet :
toilet ( ) ;
break ;
case kProcBang :
bang ( ) ;
break ;
case kProcBang2 :
bang2 ( ) ;
break ;
case kProcStairs :
stairs ( ) ;
break ;
case kProcCardiffSurvey :
cardiffSurvey ( ) ;
break ;
case kProcCardiffReturn :
cardiffReturn ( ) ;
break ;
case kProcCwytalotInHerts :
cwytalotInHerts ( ) ;
break ;
case kProcGetTiedUp :
getTiedUp ( ) ;
break ;
case kProcGetTiedUp2 :
getTiedUp2 ( ) ;
break ;
case kProcHangAround :
hangAround ( ) ;
break ;
case kProcHangAround2 :
hangAround2 ( ) ;
break ;
case kProcAfterTheShootemup :
afterTheShootemup ( ) ;
break ;
case kProcJacquesWakesUp :
jacquesWakesUp ( ) ;
break ;
case kProcNaughtyDuke :
naughtyDuke ( ) ;
break ;
case kProcNaughtyDuke2 :
naughtyDuke2 ( ) ;
break ;
case kProcNaughtyDuke3 :
naughtyDuke3 ( ) ;
break ;
case kProcJump :
jump ( ) ;
break ;
case kProcSequence :
_vm - > _sequence - > callSequencer ( ) ;
break ;
case kProcCrapulusSpludOut :
crapulusSaysSpludOut ( ) ;
break ;
case kProcDawnDelay :
_vm - > _lucerna - > dawn ( ) ;
break ;
case kProcBuyDrinks :
buyDrinks ( ) ;
break ;
case kProcBuyWine :
buyWine ( ) ;
break ;
case kProcCallsGuards :
callsGuards ( ) ;
break ;
case kProcGreetsMonk :
greetsMonk ( ) ;
break ;
case kProcFallDownOubliette :
fallDownOubliette ( ) ;
break ;
case kProcMeetAvaroid :
meetAvaroid ( ) ;
break ;
case kProcRiseUpOubliette :
riseUpOubliette ( ) ;
break ;
case kProcRobinHoodAndGeida :
robinHoodAndGeida ( ) ;
break ;
case kProcRobinHoodAndGeidaTalk :
robinHoodAndGeidaTalk ( ) ;
break ;
case kProcAvalotReturns :
avalotReturns ( ) ;
break ;
case kProcAvvySitDown :
avvySitDown ( ) ;
break ;
case kProcGhostRoomPhew :
ghostRoomPhew ( ) ;
break ;
case kProcArkataShouts :
arkataShouts ( ) ;
break ;
case kProcWinning :
winning ( ) ;
break ;
case kProcAvalotFalls :
avalotFalls ( ) ;
break ;
case kProcSpludwickGoesToCauldron :
spludwickGoesToCauldron ( ) ;
break ;
case kProcSpludwickLeavesCauldron :
spludwickLeavesCauldron ( ) ;
break ;
case kProcGiveLuteToGeida :
giveLuteToGeida ( ) ;
break ;
2013-06-30 14:10:33 +02:00
}
2013-06-27 09:21:41 +02:00
}
}
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _roomTime + + ; // Cycles since you've been in this room.
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _totalTime + + ; // Total amount of time for this game.
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : loseTimer ( byte which ) {
2013-09-08 11:14:00 +02:00
for ( byte i = 0 ; i < 7 ; i + + ) {
if ( _times [ i ] . _reason = = which )
_times [ i ] . _timeLeft = 0 ; // Cancel this one!
2013-08-11 02:06:11 +02:00
}
2013-08-21 18:01:31 +02:00
2013-09-08 10:48:22 +02:00
_timerLost = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : openDrawbridge ( ) {
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _drawbridgeOpen + + ;
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , _vm - > _gyro - > _drawbridgeOpen - 1 ) ;
2013-06-27 09:21:41 +02:00
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _drawbridgeOpen = = 4 )
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 1 ] . _operation = Gyro : : kMagicNothing ; // You may enter the drawbridge.
2013-06-30 14:10:33 +02:00
else
2013-09-08 10:48:22 +02:00
addTimer ( 7 , kProcOpenDrawbridge , kReasonDrawbridgeFalls ) ;
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : avariciusTalks ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , _vm - > _gyro - > _avariciusTalk ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _avariciusTalk + + ;
2013-06-28 20:01:47 +02:00
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _avariciusTalk < 17 )
2013-09-08 10:48:22 +02:00
addTimer ( 177 , kProcAvariciusTalks , kReasonAvariciusTalks ) ;
2013-06-30 14:10:33 +02:00
else
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > incScore ( 3 ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : urinate ( ) {
2013-09-08 12:06:08 +02:00
_vm - > _animation - > _sprites [ 0 ] . turn ( Animation : : kDirUp ) ;
2013-09-07 23:03:27 +02:00
_vm - > _animation - > stopWalking ( ) ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > drawDirection ( ) ;
2013-09-08 10:48:22 +02:00
addTimer ( 14 , kProcToilet , kReasonGoToToilet ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : toilet ( ) {
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( " That's better! " ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : bang ( ) {
2013-09-08 23:13:58 +02:00
Common : : String tmpStr = Common : : String : : format ( " %c< BANG! > " , Scrolls : : kControlItalic ) ;
_vm - > _scrolls - > displayText ( tmpStr ) ;
2013-09-08 10:48:22 +02:00
addTimer ( 30 , kProcBang2 , kReasonExplosion ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : bang2 ( ) {
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( " Hmm... sounds like Spludwick's up to something... " ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : stairs ( ) {
2013-07-24 18:25:07 +02:00
_vm - > _gyro - > blip ( ) ;
2013-09-15 15:50:05 +02:00
_vm - > _animation - > _sprites [ 0 ] . walkTo ( 3 ) ;
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _brummieStairs = 2 ;
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 10 ] . _operation = Gyro : : kMagicSpecial ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _magics [ 10 ] . _data = 2 ; // Reached the bottom of the stairs.
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 3 ] . _operation = Gyro : : kMagicNothing ; // Stop them hitting the sides (or the game will hang.)
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : cardiffSurvey ( ) {
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _cardiffQuestionNum = = 0 ) {
_vm - > _gyro - > _cardiffQuestionNum + + ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 27 ) ;
2013-06-28 20:01:47 +02:00
}
2013-08-26 20:13:43 +02:00
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' z ' , _vm - > _gyro - > _cardiffQuestionNum ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _interrogation = _vm - > _gyro - > _cardiffQuestionNum ;
2013-09-08 10:48:22 +02:00
addTimer ( 182 , kProcCardiffSurvey , kReasonCardiffsurvey ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : cardiffReturn ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 28 ) ;
2013-09-08 10:48:22 +02:00
cardiffSurvey ( ) ; // Add end of question.
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : cwytalotInHerts ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 29 ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : getTiedUp ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 34 ) ; // ...Trouble!
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _userMovesAvvy = false ;
_vm - > _gyro - > _beenTiedUp = true ;
2013-09-07 23:03:27 +02:00
_vm - > _animation - > stopWalking ( ) ;
2013-09-14 19:38:52 +02:00
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
spr - > stopWalk ( ) ;
spr - > stopHoming ( ) ;
spr - > _callEachStepFl = true ;
spr - > _eachStepProc = Animation : : kProcGrabAvvy ;
2013-09-08 10:48:22 +02:00
addTimer ( 70 , kProcGetTiedUp2 , kReasonGettingTiedUp ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : getTiedUp2 ( ) {
2013-09-15 15:50:05 +02:00
_vm - > _animation - > _sprites [ 0 ] . walkTo ( 3 ) ;
_vm - > _animation - > _sprites [ 1 ] . walkTo ( 4 ) ;
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 3 ] . _operation = Gyro : : kMagicNothing ; // No effect when you touch the boundaries.
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _friarWillTieYouUp = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : hangAround ( ) {
2013-09-08 12:06:08 +02:00
_vm - > _animation - > _sprites [ 1 ] . _doCheck = false ;
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
avvy - > init ( 7 , true , _vm - > _animation ) ; // Robin Hood
2013-09-15 16:50:12 +02:00
_vm - > _gyro - > _whereIs [ Gyro : : kPeopleRobinHood - 150 ] = kRoomRobins ;
2013-09-15 16:01:05 +02:00
_vm - > _animation - > appearPed ( 1 , 1 ) ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 39 ) ;
2013-09-15 15:50:05 +02:00
avvy - > walkTo ( 6 ) ;
2013-09-08 10:48:22 +02:00
addTimer ( 55 , kProcHangAround2 , kReasonHangingAround ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : hangAround2 ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 40 ) ;
2013-09-14 19:38:52 +02:00
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
spr - > _vanishIfStill = false ;
2013-09-15 15:50:05 +02:00
spr - > walkTo ( 3 ) ;
2013-09-15 16:50:12 +02:00
_vm - > _gyro - > _whereIs [ Gyro : : kPeopleFriarTuck - 150 ] = kRoomRobins ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 41 ) ;
2013-09-08 12:23:48 +02:00
_vm - > _animation - > _sprites [ 0 ] . remove ( ) ;
2013-09-14 19:38:52 +02:00
spr - > remove ( ) ; // Get rid of Robin Hood and Friar Tuck.
2013-06-28 20:01:47 +02:00
2013-09-08 10:48:22 +02:00
addTimer ( 1 , kProcAfterTheShootemup , kReasonHangingAround ) ;
2013-08-31 21:15:33 +02:00
// Immediately call the following proc (when you have a chance).
2013-06-28 20:01:47 +02:00
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _tiedUp = false ;
2013-06-28 20:01:47 +02:00
2013-09-15 13:21:03 +02:00
// _vm->_enid->backToBootstrap(1); Call the shoot-'em-up. TODO: Replace it with proper ScummVM-friendly function(s)! Do not remove until then!
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : afterTheShootemup ( ) {
2013-09-07 09:00:34 +02:00
2013-09-13 21:30:03 +02:00
_vm - > _animation - > flipRoom ( _vm - > _gyro - > _room , 0 ) ;
2013-08-26 16:10:17 +02:00
// Only placed this here to replace the minigame. TODO: Remove it when the shoot em' up is implemented!
2013-09-08 12:06:08 +02:00
_vm - > _animation - > _sprites [ 0 ] . init ( 0 , true , _vm - > _animation ) ; // Avalot.
2013-09-15 16:01:05 +02:00
_vm - > _animation - > appearPed ( 1 , 1 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _userMovesAvvy = true ;
_vm - > _gyro - > _objects [ Gyro : : kObjectCrossbow - 1 ] = true ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > refreshObjectList ( ) ;
2013-08-26 16:10:17 +02:00
// Same as the added line above: TODO: Remove it later!!!
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( Common : : String ( " P.S.: There should have been the mini-game called \" shoot em' up \" , but I haven't implemented it yet: you get the crossbow automatically. " )
2013-09-09 23:16:48 +02:00
+ Scrolls : : kControlNewLine + Scrolls : : kControlNewLine + " Peter (uruk) " ) ;
2013-08-26 16:10:17 +02:00
2013-09-05 07:47:40 +02:00
#if 0
byte shootscore , gain ;
2013-08-26 16:10:17 +02:00
2013-09-05 07:47:40 +02:00
shootscore = mem [ storage_seg * storage_ofs ] ;
gain = ( shootscore + 5 ) / 10 ; // Rounding up.
2013-08-26 16:10:17 +02:00
2013-09-05 07:47:40 +02:00
display ( string ( " \6 Your score was " ) + strf ( shootscore ) + ' . ' + " \r \r You gain ( " +
2013-09-08 11:14:00 +02:00
strf ( shootscore ) + " 0xF6 10) = " + strf ( gain ) + " points. " ) ;
2013-08-26 16:10:17 +02:00
2013-09-05 07:47:40 +02:00
if ( gain > 20 ) {
display ( " But we won't let you have more than 20 points! " ) ;
points ( 20 ) ;
} else
points ( gain ) ;
# endif
2013-08-26 16:10:17 +02:00
2013-09-08 11:30:23 +02:00
warning ( " STUB: Timer::after_the_shootemup() " ) ;
2013-08-26 16:10:17 +02:00
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 70 ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : jacquesWakesUp ( ) {
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _jacquesState + + ;
2013-06-28 20:01:47 +02:00
2013-09-13 21:30:03 +02:00
switch ( _vm - > _gyro - > _jacquesState ) { // Additional pictures.
2013-06-30 14:10:33 +02:00
case 1 :
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ; // Eyes open.
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' Q ' , 45 ) ;
2013-06-30 14:10:33 +02:00
break ;
2013-08-31 21:15:33 +02:00
case 2 : // Going through the door.
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ; // Not on the floor.
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ; // But going through the door.
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 5 ] . _operation = Gyro : : kMagicNothing ; // You can't wake him up now.
2013-06-30 14:10:33 +02:00
break ;
2013-08-31 21:15:33 +02:00
case 3 : // Gone through the door.
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ; // Not on the floor, either.
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 4 ) ; // He's gone... so the door's open.
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _whereIs [ Gyro : : kPeopleJacques - 150 ] = 0 ; // Gone!
2013-06-30 14:10:33 +02:00
break ;
2013-06-28 20:01:47 +02:00
}
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _jacquesState = = 5 ) {
_vm - > _gyro - > _bellsAreRinging = true ;
_vm - > _gyro - > _aylesIsAwake = true ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > incScore ( 2 ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-13 21:30:03 +02:00
switch ( _vm - > _gyro - > _jacquesState ) {
2013-06-28 20:01:47 +02:00
case 1 :
case 2 :
case 3 :
2013-09-08 10:48:22 +02:00
addTimer ( 12 , kProcJacquesWakesUp , kReasonJacquesWakingUp ) ;
2013-06-27 09:21:41 +02:00
break ;
2013-06-28 20:01:47 +02:00
case 4 :
2013-09-08 10:48:22 +02:00
addTimer ( 24 , kProcJacquesWakesUp , kReasonJacquesWakingUp ) ;
2013-06-27 09:21:41 +02:00
break ;
2013-06-28 20:01:47 +02:00
}
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : naughtyDuke ( ) { // This is when the Duke comes in and takes your money.
2013-09-14 19:38:52 +02:00
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
spr - > init ( 9 , false , _vm - > _animation ) ; // Here comes the Duke.
2013-09-15 16:01:05 +02:00
_vm - > _animation - > appearPed ( 2 , 0 ) ; // He starts at the door...
2013-09-15 15:50:05 +02:00
spr - > walkTo ( 2 ) ; // He walks over to you.
2013-06-27 09:21:41 +02:00
2013-08-31 21:15:33 +02:00
// Let's get the door opening.
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ;
2013-09-08 00:02:20 +02:00
_vm - > _sequence - > firstShow ( 2 ) ;
_vm - > _sequence - > startToClose ( ) ;
2013-06-27 09:21:41 +02:00
2013-09-08 10:48:22 +02:00
addTimer ( 50 , kProcNaughtyDuke2 , kReasonNaughtyDuke ) ;
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : naughtyDuke2 ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 48 ) ; // "Ha ha, it worked again!"
2013-09-15 15:50:05 +02:00
spr - > walkTo ( 0 ) ; // Walk to the door.
2013-09-14 19:38:52 +02:00
spr - > _vanishIfStill = true ; // Then go away!
2013-09-08 10:48:22 +02:00
addTimer ( 32 , kProcNaughtyDuke3 , kReasonNaughtyDuke ) ;
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : naughtyDuke3 ( ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 1 ) ;
2013-09-08 00:02:20 +02:00
_vm - > _sequence - > firstShow ( 2 ) ;
_vm - > _sequence - > startToClose ( ) ;
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : jump ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
2013-06-27 09:21:41 +02:00
2013-09-14 19:38:52 +02:00
_vm - > _gyro - > _jumpStatus + + ;
2013-09-13 21:30:03 +02:00
switch ( _vm - > _gyro - > _jumpStatus ) {
2013-06-30 14:10:33 +02:00
case 1 :
case 2 :
case 3 :
case 5 :
case 7 :
case 9 :
2013-09-14 19:38:52 +02:00
avvy - > _y - - ;
2013-06-30 14:10:33 +02:00
break ;
case 12 :
case 13 :
case 14 :
case 16 :
case 18 :
case 19 :
2013-09-14 19:38:52 +02:00
avvy - > _y + + ;
2013-06-30 14:10:33 +02:00
break ;
}
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _jumpStatus = = 20 ) { // End of jump.
_vm - > _gyro - > _userMovesAvvy = true ;
_vm - > _gyro - > _jumpStatus = 0 ;
2013-08-31 21:15:33 +02:00
} else { // Still jumping.
2013-09-08 10:48:22 +02:00
addTimer ( 1 , kProcJump , kReasonJumping ) ;
2013-06-30 14:10:33 +02:00
}
2013-09-13 21:30:03 +02:00
if ( ( _vm - > _gyro - > _jumpStatus = = 10 ) // You're at the highest point of your jump.
2013-09-15 16:50:12 +02:00
& & ( _vm - > _gyro - > _room = = kRoomInsideCardiffCastle )
2013-09-13 21:30:03 +02:00
& & ( _vm - > _gyro - > _arrowInTheDoor = = true )
2013-09-08 12:06:08 +02:00
& & ( _vm - > _animation - > inField ( 3 ) ) ) { // Beside the wall
2013-08-31 21:15:33 +02:00
// Grab the arrow!
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _carryNum > = kCarryLimit )
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( " You fail to grab it, because your hands are full. " ) ;
2013-06-30 14:10:33 +02:00
else {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 2 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _arrowInTheDoor = false ; // You've got it.
_vm - > _gyro - > _objects [ Gyro : : kObjectBolt - 1 ] = true ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > refreshObjectList ( ) ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 50 ) ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > incScore ( 3 ) ;
2013-06-27 09:21:41 +02:00
}
}
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : crapulusSaysSpludOut ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 56 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _crapulusWillTell = false ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : buyDrinks ( ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 11 ) ; // Malagauche gets up again.
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _malagauche = 0 ;
2013-06-28 20:01:47 +02:00
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' D ' , _vm - > _gyro - > _drinking ) ; // Display message about it.
2013-08-31 21:15:33 +02:00
_vm - > _pingo - > wobble ( ) ; // Do the special effects.
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' D ' , 1 ) ; // That'll be thruppence.
2013-09-07 12:35:44 +02:00
if ( _vm - > _gyro - > decreaseMoney ( 3 ) ) // Pay 3d.
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' D ' , 3 ) ; // Tell 'em you paid up.
2013-09-03 15:35:09 +02:00
_vm - > _acci - > drink ( ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : buyWine ( ) {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 11 ) ; // Malagauche gets up again.
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _malagauche = 0 ;
2013-06-28 20:01:47 +02:00
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' D ' , 50 ) ; // You buy the wine.
_vm - > _scrolls - > displayScrollChain ( ' D ' , 1 ) ; // It'll be thruppence.
2013-09-07 12:35:44 +02:00
if ( _vm - > _gyro - > decreaseMoney ( 3 ) ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' D ' , 4 ) ; // You paid up.
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _objects [ Gyro : : kObjectWine - 1 ] = true ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > refreshObjectList ( ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _wineState = 1 ; // OK Wine.
2013-06-28 20:01:47 +02:00
}
}
2013-09-08 11:30:23 +02:00
void Timer : : callsGuards ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' Q ' , 58 ) ; // "GUARDS!!!"
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > gameOver ( ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : greetsMonk ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' Q ' , 59 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _enteredLustiesRoomAsMonk = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : fallDownOubliette ( ) {
2013-09-09 23:34:12 +02:00
_vm - > _gyro - > _magics [ 8 ] . _operation = Gyro : : kMagicNothing ;
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
avvy - > _moveY + + ; // Increments dx/dy!
avvy - > _y + = avvy - > _moveY ; // Dowwwn we go...
2013-09-08 10:48:22 +02:00
addTimer ( 3 , kProcFallDownOubliette , kReasonFallingDownOubliette ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : meetAvaroid ( ) {
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _metAvaroid ) {
2013-09-08 23:13:58 +02:00
Common : : String tmpStr = Common : : String : : format ( " You can't expect to be %cthat%c lucky twice in a row! " , Scrolls : : kControlItalic , Scrolls : : kControlRoman ) ;
_vm - > _scrolls - > displayText ( tmpStr ) ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > gameOver ( ) ;
2013-06-28 20:01:47 +02:00
} else {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' Q ' , 60 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _metAvaroid = true ;
2013-09-08 10:48:22 +02:00
addTimer ( 1 , kProcRiseUpOubliette , kReasonRisingUpOubliette ) ;
2013-06-30 14:10:33 +02:00
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
avvy - > _facingDir = Animation : : kDirLeft ;
avvy - > _x = 151 ;
avvy - > _moveX = - 3 ;
avvy - > _moveY = - 5 ;
2013-06-30 14:10:33 +02:00
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > setBackgroundColor ( 2 ) ;
2013-06-27 09:21:41 +02:00
}
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
2013-09-08 11:30:23 +02:00
void Timer : : riseUpOubliette ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
avvy - > _visible = true ;
avvy - > _moveY + + ; // Decrements dx/dy!
avvy - > _y - = avvy - > _moveY ; // Uuuupppp we go...
if ( avvy - > _moveY > 0 )
2013-09-08 10:48:22 +02:00
addTimer ( 3 , kProcRiseUpOubliette , kReasonRisingUpOubliette ) ;
2013-06-30 14:10:33 +02:00
else
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _userMovesAvvy = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : robinHoodAndGeida ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
avvy - > init ( 7 , true , _vm - > _animation ) ;
2013-09-15 16:01:05 +02:00
_vm - > _animation - > appearPed ( 1 , 6 ) ;
2013-09-15 15:50:05 +02:00
avvy - > walkTo ( 5 ) ;
2013-09-14 19:38:52 +02:00
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
spr - > stopWalk ( ) ;
spr - > _facingDir = Animation : : kDirLeft ;
2013-09-08 10:48:22 +02:00
addTimer ( 20 , kProcRobinHoodAndGeidaTalk , kReasonRobinHoodAndGeida ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _geidaFollows = false ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : robinHoodAndGeidaTalk ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 66 ) ;
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
2013-09-15 15:50:05 +02:00
avvy - > walkTo ( 1 ) ;
spr - > walkTo ( 1 ) ;
2013-09-14 19:38:52 +02:00
avvy - > _vanishIfStill = true ;
spr - > _vanishIfStill = true ;
2013-09-08 10:48:22 +02:00
addTimer ( 162 , kProcAvalotReturns , kReasonRobinHoodAndGeida ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : avalotReturns ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
AnimationType * spr = & _vm - > _animation - > _sprites [ 1 ] ;
avvy - > remove ( ) ;
spr - > remove ( ) ;
avvy - > init ( 0 , true , _vm - > _animation ) ;
2013-09-15 16:01:05 +02:00
_vm - > _animation - > appearPed ( 1 , 0 ) ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 67 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _userMovesAvvy = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:14:00 +02:00
/**
* This is used when you sit down in the pub in Notts . It loops around
* so that it will happen when Avvy stops walking .
* @ remarks Originally called ' avvy_sit_down '
*/
2013-09-08 11:30:23 +02:00
void Timer : : avvySitDown ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
if ( avvy - > _homing ) // Still walking.
2013-09-08 10:48:22 +02:00
addTimer ( 1 , kProcAvvySitDown , kReasonSittingDown ) ;
2013-06-28 20:01:47 +02:00
else {
2013-09-03 22:22:42 +02:00
_vm - > _celer - > drawBackgroundSprite ( - 1 , - 1 , 3 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _sittingInPub = true ;
_vm - > _gyro - > _userMovesAvvy = false ;
2013-09-14 19:38:52 +02:00
avvy - > _visible = false ;
2013-06-28 20:01:47 +02:00
}
}
2013-09-08 11:30:23 +02:00
void Timer : : ghostRoomPhew ( ) {
2013-09-14 19:38:52 +02:00
Common : : String tmpStr = Common : : String : : format ( " %cPHEW!%c You're glad to get out of %cthere! " ,
Scrolls : : kControlItalic , Scrolls : : kControlRoman , Scrolls : : kControlItalic ) ;
2013-09-08 23:13:58 +02:00
_vm - > _scrolls - > displayText ( tmpStr ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : arkataShouts ( ) {
2013-09-13 21:30:03 +02:00
if ( _vm - > _gyro - > _teetotal )
2013-06-30 14:10:33 +02:00
return ;
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 76 ) ;
2013-09-08 10:48:22 +02:00
addTimer ( 160 , kProcArkataShouts , kReasonArkataShouts ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : winning ( ) {
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' q ' , 79 ) ;
2013-09-07 18:18:25 +02:00
_vm - > _pingo - > winningPic ( ) ;
2013-09-08 11:14:00 +02:00
2013-09-08 11:30:23 +02:00
warning ( " STUB: Timer::winning() " ) ;
2013-09-05 07:47:40 +02:00
#if 0
do {
_vm - > _lucerna - > checkclick ( ) ;
} while ( ! ( _vm - > _gyro - > mrelease = = 0 ) ) ;
2013-09-07 09:00:34 +02:00
# endif
2013-09-07 18:18:25 +02:00
// TODO: To be implemented with Pingo::winningPic().
2013-06-30 14:10:33 +02:00
2013-09-09 23:48:36 +02:00
_vm - > _lucerna - > callVerb ( Acci : : kVerbCodeScore ) ;
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( " T H E E N D " ) ;
2013-09-06 16:23:57 +02:00
_vm - > _gyro - > _letMeOut = true ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : avalotFalls ( ) {
2013-09-14 19:38:52 +02:00
AnimationType * avvy = & _vm - > _animation - > _sprites [ 0 ] ;
if ( avvy - > _stepNum < 5 ) {
avvy - > _stepNum + + ;
2013-09-08 10:48:22 +02:00
addTimer ( 3 , kProcAvalotFalls , kReasonFallingOver ) ;
2013-08-31 21:15:33 +02:00
} else {
2013-09-09 23:00:24 +02:00
Common : : String toDisplay = Common : : String : : format ( " %c%c%c%c%c%c%c%c%c%c%c%c%cZ%c " ,
Scrolls : : kControlNewLine , Scrolls : : kControlNewLine , Scrolls : : kControlNewLine ,
Scrolls : : kControlNewLine , Scrolls : : kControlNewLine , Scrolls : : kControlNewLine ,
Scrolls : : kControlInsertSpaces , Scrolls : : kControlInsertSpaces , Scrolls : : kControlInsertSpaces ,
Scrolls : : kControlInsertSpaces , Scrolls : : kControlInsertSpaces , Scrolls : : kControlInsertSpaces ,
Scrolls : : kControlRegister , Scrolls : : kControlIcon ) ;
2013-09-07 20:37:42 +02:00
_vm - > _scrolls - > displayText ( toDisplay ) ;
2013-08-31 21:15:33 +02:00
}
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : spludwickGoesToCauldron ( ) {
2013-09-08 12:06:08 +02:00
if ( _vm - > _animation - > _sprites [ 1 ] . _homing )
2013-09-08 14:10:40 +02:00
addTimer ( 1 , kProcSpludwickGoesToCauldron , kReasonSpludwickWalk ) ;
2013-06-28 20:01:47 +02:00
else
2013-09-08 14:10:40 +02:00
addTimer ( 17 , kProcSpludwickLeavesCauldron , kReasonSpludwickWalk ) ;
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : spludwickLeavesCauldron ( ) {
2013-09-08 12:06:08 +02:00
_vm - > _animation - > _sprites [ 1 ] . _callEachStepFl = true ; // So that normal procs will continue.
2013-06-28 20:01:47 +02:00
}
2013-09-08 11:30:23 +02:00
void Timer : : giveLuteToGeida ( ) { // Moved here from Acci.
2013-09-15 12:25:07 +02:00
_vm - > _scrolls - > displayScrollChain ( ' Q ' , 86 ) ;
2013-09-07 15:58:02 +02:00
_vm - > _lucerna - > incScore ( 4 ) ;
2013-09-13 21:30:03 +02:00
_vm - > _gyro - > _lustieIsAsleep = true ;
2013-09-08 00:02:20 +02:00
_vm - > _sequence - > firstShow ( 5 ) ;
_vm - > _sequence - > thenShow ( 6 ) ; // He falls asleep...
_vm - > _sequence - > startToClose ( ) ; // Not really closing, but we're using the same procedure.
2013-06-28 20:01:47 +02:00
}
2013-06-27 09:21:41 +02:00
} // End of namespace Avalanche.