2017-07-11 07:34:04 +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 .
*
*/
2017-07-11 05:33:46 +02:00
2017-07-17 16:44:08 +02:00
# include "common/system.h"
2017-08-25 16:15:55 +02:00
# include "graphics/palette.h"
2017-08-29 01:27:07 +02:00
# include "gui/message.h"
2017-07-11 05:33:46 +02:00
# include "supernova/supernova.h"
# include "supernova/state.h"
namespace Supernova {
2017-08-29 01:27:07 +02:00
bool GameManager : : serialize ( Common : : WriteStream * out ) {
if ( out - > err ( ) )
return false ;
// GameState
out - > writeSint32LE ( _state . _time ) ;
out - > writeSint32LE ( _state . _timeSleep ) ;
out - > writeSint32LE ( _state . _timeAlarm ) ;
out - > writeSint32LE ( _state . _eventTime ) ;
out - > writeSint32LE ( _state . _arrivalDaysLeft ) ;
out - > writeSint32LE ( _state . _shipEnergyDaysLeft ) ;
out - > writeSint32LE ( _state . _landingModuleEnergyDaysLeft ) ;
out - > writeUint16LE ( _state . _greatFlag ) ;
out - > writeSint16LE ( _state . _timeRobot ) ;
out - > writeSint16LE ( _state . _money ) ;
out - > writeByte ( _state . _coins ) ;
out - > writeByte ( _state . _shoes ) ;
out - > writeByte ( _state . _destination ) ;
out - > writeByte ( _state . _language ) ;
out - > writeByte ( _state . _corridorSearch ) ;
out - > writeByte ( _state . _alarmOn ) ;
out - > writeByte ( _state . _terminalStripConnected ) ;
out - > writeByte ( _state . _terminalStripWire ) ;
out - > writeByte ( _state . _cableConnected ) ;
out - > writeByte ( _state . _powerOff ) ;
out - > writeByte ( _state . _dream ) ;
// Inventory
out - > writeSByte ( _inventory . getSize ( ) ) ;
out - > writeSByte ( _inventoryScroll ) ;
for ( int i = 0 ; i < _inventory . getSize ( ) ; + + i ) {
Object * objectStateBegin = _rooms [ _inventory . get ( i ) - > _roomId ] - > getObject ( 0 ) ;
byte objectIndex = _inventory . get ( i ) - objectStateBegin ;
out - > writeByte ( _inventory . get ( i ) - > _roomId ) ;
out - > writeByte ( objectIndex ) ;
}
// Rooms
for ( int i = 0 ; i < kRoomsNum ; + + i ) {
_rooms [ i ] - > serialize ( out ) ;
}
return ! out - > err ( ) ;
}
bool GameManager : : deserialize ( Common : : ReadStream * in ) {
if ( in - > err ( ) ) {
return false ;
}
// GameState
_state . _time = in - > readSint32LE ( ) ;
_state . _timeSleep = in - > readSint32LE ( ) ;
_state . _timeAlarm = in - > readSint32LE ( ) ;
_state . _eventTime = in - > readSint32LE ( ) ;
_state . _arrivalDaysLeft = in - > readSint32LE ( ) ;
_state . _shipEnergyDaysLeft = in - > readSint32LE ( ) ;
_state . _landingModuleEnergyDaysLeft = in - > readSint32LE ( ) ;
_state . _greatFlag = in - > readUint16LE ( ) ;
_state . _timeRobot = in - > readSint16LE ( ) ;
_state . _money = in - > readSint16LE ( ) ;
_state . _coins = in - > readByte ( ) ;
_state . _shoes = in - > readByte ( ) ;
_state . _destination = in - > readByte ( ) ;
_state . _language = in - > readByte ( ) ;
_state . _corridorSearch = in - > readByte ( ) ;
_state . _alarmOn = in - > readByte ( ) ;
_state . _terminalStripConnected = in - > readByte ( ) ;
_state . _terminalStripWire = in - > readByte ( ) ;
_state . _cableConnected = in - > readByte ( ) ;
_state . _powerOff = in - > readByte ( ) ;
_state . _dream = in - > readByte ( ) ;
// Inventory
int inventorySize = in - > readSByte ( ) ;
_inventoryScroll = in - > readSByte ( ) ;
_inventory . clear ( ) ;
for ( int i = 0 ; i < inventorySize ; + + i ) {
RoomID objectRoom = static_cast < RoomID > ( in - > readByte ( ) ) ;
int objectIndex = in - > readByte ( ) ;
_inventory . add ( * _rooms [ objectRoom ] - > getObject ( objectIndex ) ) ;
}
// Rooms
for ( int i = 0 ; i < kRoomsNum ; + + i ) {
_rooms [ i ] - > deserialize ( in ) ;
}
return ! in - > err ( ) ;
}
2017-07-11 05:33:46 +02:00
Inventory : : Inventory ( )
: _numObjects ( 0 )
{ }
// TODO: Update Inventory surface for scrolling
void Inventory : : add ( Object & obj ) {
if ( _numObjects < kMaxCarry )
_inventory [ _numObjects + + ] = & obj ;
// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
// show_inventory();
}
// TODO: Update Inventory surface for scrolling
void Inventory : : remove ( Object & obj ) {
2017-07-17 16:42:13 +02:00
for ( int i = 0 ; i < _numObjects ; + + i ) {
2017-07-11 05:33:46 +02:00
if ( _inventory [ i ] = = & obj ) {
- - _numObjects ;
while ( i < _numObjects ) {
_inventory [ i ] = _inventory [ i + 1 ] ;
+ + i ;
}
obj . disableProperty ( CARRIED ) ;
}
}
}
2017-08-04 11:16:54 +02:00
void Inventory : : clear ( ) {
_numObjects = 0 ;
}
2017-07-17 16:42:13 +02:00
Object * Inventory : : get ( int index ) const {
2017-07-11 05:33:46 +02:00
if ( index < _numObjects )
return _inventory [ index ] ;
2017-07-18 18:30:50 +02:00
return const_cast < Object * > ( & Object : : nullObject ) ;
2017-07-11 05:33:46 +02:00
}
Object * Inventory : : get ( ObjectID id ) const {
2017-07-17 16:42:13 +02:00
for ( int i = 0 ; i < _numObjects ; + + i ) {
2017-07-11 05:33:46 +02:00
if ( _inventory [ i ] - > _id = = id )
return _inventory [ i ] ;
}
2017-07-18 18:30:50 +02:00
return const_cast < Object * > ( & Object : : nullObject ) ;
2017-07-11 05:33:46 +02:00
}
2017-08-11 21:55:09 +02:00
2017-07-17 10:33:57 +02:00
GuiElement : : GuiElement ( )
: _text ( " " )
, _isHighlighted ( false )
, _bgColorNormal ( kColorWhite25 )
, _bgColorHighlighted ( kColorWhite44 )
, _bgColor ( kColorWhite25 )
, _textColorNormal ( kColorGreen )
, _textColorHighlighted ( kColorLightGreen )
, _textColor ( kColorGreen )
{ }
void GuiElement : : setText ( const char * text ) {
strncpy ( _text , text , sizeof ( _text ) ) ;
}
void GuiElement : : setTextPosition ( int x , int y ) {
_textPosition . x = x ;
_textPosition . y = y ;
}
void GuiElement : : setSize ( int x1 , int y1 , int x2 , int y2 ) {
this - > left = x1 ;
this - > top = y1 ;
this - > right = x2 ;
this - > bottom = y2 ;
_textPosition . x = x1 + 1 ;
_textPosition . y = y1 + 1 ;
}
void GuiElement : : setColor ( int bgColor , int textColor , int bgColorHighlighted , int textColorHightlighted ) {
_bgColor = bgColor ;
_textColor = textColor ;
_bgColorNormal = bgColor ;
_textColorNormal = textColor ;
_bgColorHighlighted = bgColorHighlighted ;
_textColorHighlighted = textColorHightlighted ;
}
void GuiElement : : setHighlight ( bool isHighlighted ) {
if ( isHighlighted ) {
_bgColor = _bgColorHighlighted ;
_textColor = _textColorHighlighted ;
} else {
_bgColor = _bgColorNormal ;
_textColor = _textColorNormal ;
}
}
2017-07-11 05:33:46 +02:00
2017-08-23 04:25:01 +02:00
static Common : : String timeToString ( int msec ) {
2017-07-25 02:11:00 +02:00
char s [ 9 ] = " 0:00:00 " ;
2017-08-23 04:25:01 +02:00
msec / = 1000 ;
s [ 7 ] = msec % 10 + ' 0 ' ;
msec / = 10 ;
s [ 6 ] = msec % 6 + ' 0 ' ;
msec / = 6 ;
s [ 4 ] = msec % 10 + ' 0 ' ;
msec / = 10 ;
s [ 3 ] = msec % 6 + ' 0 ' ;
msec / = 6 ;
s [ 1 ] = msec % 10 + ' 0 ' ;
msec / = 10 ;
if ( msec )
s [ 0 ] = msec + ' 0 ' ;
2017-07-11 05:33:46 +02:00
2017-07-25 02:11:00 +02:00
return Common : : String ( s ) ;
2017-07-11 05:33:46 +02:00
}
GameManager : : GameManager ( SupernovaEngine * vm ) {
_vm = vm ;
2017-08-04 11:18:53 +02:00
initRooms ( ) ;
_currentRoom = _rooms [ SLEEP ] ;
initState ( ) ;
initGui ( ) ;
}
GameManager : : ~ GameManager ( ) {
destroyRooms ( ) ;
}
void GameManager : : destroyRooms ( ) {
delete _rooms [ INTRO ] ;
delete _rooms [ CORRIDOR ] ;
delete _rooms [ HALL ] ;
delete _rooms [ SLEEP ] ;
delete _rooms [ COCKPIT ] ;
delete _rooms [ AIRLOCK ] ;
delete _rooms [ HOLD ] ;
delete _rooms [ LANDINGMODULE ] ;
delete _rooms [ GENERATOR ] ;
delete _rooms [ OUTSIDE ] ;
delete _rooms [ CABIN_R1 ] ;
delete _rooms [ CABIN_R2 ] ;
delete _rooms [ CABIN_R3 ] ;
delete _rooms [ CABIN_L1 ] ;
delete _rooms [ CABIN_L2 ] ;
delete _rooms [ CABIN_L3 ] ;
delete _rooms [ BATHROOM ] ;
delete _rooms [ ROCKS ] ;
delete _rooms [ CAVE ] ;
delete _rooms [ MEETUP ] ;
delete _rooms [ ENTRANCE ] ;
delete _rooms [ REST ] ;
delete _rooms [ ROGER ] ;
delete _rooms [ GLIDER ] ;
delete _rooms [ MEETUP2 ] ;
delete _rooms [ MEETUP3 ] ;
delete _rooms [ CELL ] ;
delete _rooms [ CORRIDOR1 ] ;
delete _rooms [ CORRIDOR2 ] ;
delete _rooms [ CORRIDOR3 ] ;
delete _rooms [ CORRIDOR4 ] ;
delete _rooms [ CORRIDOR5 ] ;
delete _rooms [ CORRIDOR6 ] ;
delete _rooms [ CORRIDOR7 ] ;
delete _rooms [ CORRIDOR8 ] ;
delete _rooms [ CORRIDOR9 ] ;
delete _rooms [ BCORRIDOR ] ;
delete _rooms [ GUARD ] ;
delete _rooms [ GUARD3 ] ;
delete _rooms [ OFFICE_L1 ] ;
delete _rooms [ OFFICE_L2 ] ;
delete _rooms [ OFFICE_R1 ] ;
delete _rooms [ OFFICE_R2 ] ;
delete _rooms [ OFFICE_L ] ;
delete _rooms [ ELEVATOR ] ;
delete _rooms [ STATION ] ;
delete _rooms [ SIGN ] ;
}
void GameManager : : initState ( ) {
2017-07-17 16:44:08 +02:00
Object : : setObjectNull ( _currentInputObject ) ;
Object : : setObjectNull ( _inputObject [ 0 ] ) ;
Object : : setObjectNull ( _inputObject [ 1 ] ) ;
2017-07-11 05:33:46 +02:00
_inputVerb = ACTION_WALK ;
2017-07-17 16:44:08 +02:00
_processInput = false ;
2017-07-25 02:11:00 +02:00
_guiEnabled = true ;
_animationEnabled = true ;
2017-07-17 16:44:08 +02:00
_mouseField = - 1 ;
2017-07-11 05:33:46 +02:00
_inventoryScroll = 0 ;
2017-08-29 01:36:05 +02:00
_oldTime = 0 ;
2017-07-25 02:11:00 +02:00
_timer1 = 0 ;
_animationTimer = 0 ;
2017-08-29 01:36:05 +02:00
_state . _time = ticksToMsec ( 916364 ) ; // 2 pm
2017-08-22 22:33:09 +02:00
_state . _timeSleep = 0 ;
2017-08-23 04:21:24 +02:00
_state . _timeAlarm = ticksToMsec ( 458182 ) ; // 7 am
2017-08-22 22:33:09 +02:00
_state . _eventTime = 0xffffffff ;
2017-08-24 22:47:38 +02:00
_state . _arrivalDaysLeft = 2840 ;
_state . _shipEnergyDaysLeft = 2135 ;
_state . _landingModuleEnergyDaysLeft = 923 ;
2017-08-22 22:33:09 +02:00
_state . _greatFlag = 0 ;
_state . _timeRobot = 0 ;
_state . _money = 0 ;
_state . _coins = 0 ;
_state . _shoes = 0 ;
_state . _destination = 255 ;
_state . _language = 0 ;
_state . _corridorSearch = false ;
_state . _alarmOn = false ;
_state . _terminalStripConnected = false ;
_state . _terminalStripWire = false ;
_state . _cableConnected = false ;
_state . _powerOff = false ;
_state . _dream = false ;
2017-08-04 11:18:53 +02:00
}
2017-07-11 05:33:46 +02:00
2017-08-04 11:18:53 +02:00
void GameManager : : initRooms ( ) {
2017-08-28 13:40:32 +02:00
_rooms [ INTRO ] = new Intro ( _vm , this ) ;
2017-08-04 11:18:53 +02:00
_rooms [ CORRIDOR ] = new ShipCorridor ( _vm , this ) ;
_rooms [ HALL ] = new ShipHall ( _vm , this ) ;
_rooms [ SLEEP ] = new ShipSleepCabin ( _vm , this ) ;
_rooms [ COCKPIT ] = new ShipCockpit ( _vm , this ) ;
_rooms [ AIRLOCK ] = new ShipAirlock ( _vm , this ) ;
_rooms [ HOLD ] = new ShipHold ( _vm , this ) ;
_rooms [ LANDINGMODULE ] = new ShipLandingModule ( _vm , this ) ;
_rooms [ GENERATOR ] = new ShipGenerator ( _vm , this ) ;
_rooms [ OUTSIDE ] = new ShipOuterSpace ( _vm , this ) ;
_rooms [ CABIN_R1 ] = new ShipCabinR1 ( _vm , this ) ;
_rooms [ CABIN_R2 ] = new ShipCabinR2 ( _vm , this ) ;
_rooms [ CABIN_R3 ] = new ShipCabinR3 ( _vm , this ) ;
_rooms [ CABIN_L1 ] = new ShipCabinL1 ( _vm , this ) ;
_rooms [ CABIN_L2 ] = new ShipCabinL2 ( _vm , this ) ;
_rooms [ CABIN_L3 ] = new ShipCabinL3 ( _vm , this ) ;
_rooms [ BATHROOM ] = new ShipCabinBathroom ( _vm , this ) ;
_rooms [ ROCKS ] = new ArsanoRocks ( _vm , this ) ;
_rooms [ CAVE ] = new ArsanoCave ( _vm , this ) ;
_rooms [ MEETUP ] = new ArsanoMeetup ( _vm , this ) ;
_rooms [ ENTRANCE ] = new ArsanoEntrance ( _vm , this ) ;
_rooms [ REST ] = new ArsanoRemaining ( _vm , this ) ;
_rooms [ ROGER ] = new ArsanoRoger ( _vm , this ) ;
_rooms [ GLIDER ] = new ArsanoGlider ( _vm , this ) ;
_rooms [ MEETUP2 ] = new ArsanoMeetup2 ( _vm , this ) ;
_rooms [ MEETUP3 ] = new ArsanoMeetup3 ( _vm , this ) ;
_rooms [ CELL ] = new AxacussCell ( _vm , this ) ;
_rooms [ CORRIDOR1 ] = new AxacussCorridor1 ( _vm , this ) ;
_rooms [ CORRIDOR2 ] = new AxacussCorridor2 ( _vm , this ) ;
_rooms [ CORRIDOR3 ] = new AxacussCorridor3 ( _vm , this ) ;
_rooms [ CORRIDOR4 ] = new AxacussCorridor3 ( _vm , this ) ;
_rooms [ CORRIDOR5 ] = new AxacussCorridor4 ( _vm , this ) ;
_rooms [ CORRIDOR6 ] = new AxacussCorridor5 ( _vm , this ) ;
_rooms [ CORRIDOR7 ] = new AxacussCorridor6 ( _vm , this ) ;
_rooms [ CORRIDOR8 ] = new AxacussCorridor7 ( _vm , this ) ;
_rooms [ CORRIDOR9 ] = new AxacussCorridor8 ( _vm , this ) ;
_rooms [ BCORRIDOR ] = new AxacussBcorridor ( _vm , this ) ;
_rooms [ GUARD ] = new AxacussIntersection ( _vm , this ) ;
_rooms [ GUARD3 ] = new AxacussExit ( _vm , this ) ;
_rooms [ OFFICE_L1 ] = new AxacussOffice1 ( _vm , this ) ;
_rooms [ OFFICE_L2 ] = new AxacussOffice2 ( _vm , this ) ;
_rooms [ OFFICE_R1 ] = new AxacussOffice3 ( _vm , this ) ;
_rooms [ OFFICE_R2 ] = new AxacussOffice4 ( _vm , this ) ;
_rooms [ OFFICE_L ] = new AxacussOffice5 ( _vm , this ) ;
_rooms [ ELEVATOR ] = new AxacussElevator ( _vm , this ) ;
_rooms [ STATION ] = new AxacussStation ( _vm , this ) ;
_rooms [ SIGN ] = new AxacussSign ( _vm , this ) ;
2017-07-11 05:33:46 +02:00
}
void GameManager : : initGui ( ) {
2017-07-25 23:40:23 +02:00
int commandButtonX = 0 ;
2017-07-17 16:44:08 +02:00
for ( int i = 0 ; i < ARRAYSIZE ( _guiCommandButton ) ; + + i ) {
2017-07-11 05:33:46 +02:00
int width ;
if ( i < 9 )
2017-07-18 23:29:12 +02:00
width = _vm - > textWidth ( guiCommand_DE [ i ] ) + 2 ;
2017-07-11 05:33:46 +02:00
else
2017-07-25 23:40:23 +02:00
width = 320 - commandButtonX ;
2017-07-11 05:33:46 +02:00
2017-07-25 23:40:23 +02:00
_guiCommandButton [ i ] . setSize ( commandButtonX , 150 , commandButtonX + width , 159 ) ;
2017-07-17 16:44:08 +02:00
_guiCommandButton [ i ] . setText ( guiCommand_DE [ i ] ) ;
_guiCommandButton [ i ] . setColor ( kColorWhite25 , kColorDarkGreen , kColorWhite44 , kColorGreen ) ;
2017-07-25 23:40:23 +02:00
commandButtonX + = width + 2 ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
2017-07-19 02:45:50 +02:00
for ( int i = 0 ; i < ARRAYSIZE ( _guiInventory ) ; + + i ) {
2017-07-25 23:40:23 +02:00
int inventoryX = 136 * ( i % 2 ) ;
int inventoryY = 161 + 10 * ( i / 2 ) ;
2017-07-19 02:45:50 +02:00
2017-07-25 23:40:23 +02:00
_guiInventory [ i ] . setSize ( inventoryX , inventoryY , inventoryX + 135 , inventoryY + 9 ) ;
2017-07-19 02:45:50 +02:00
_guiInventory [ i ] . setColor ( kColorWhite25 , kColorDarkRed , kColorWhite35 , kColorRed ) ;
}
2017-07-11 05:33:46 +02:00
}
2017-07-25 02:11:00 +02:00
2017-07-11 05:33:46 +02:00
void GameManager : : processInput ( Common : : KeyState & state ) {
2017-08-04 11:02:49 +02:00
_key = state ;
2017-07-11 05:33:46 +02:00
switch ( state . keycode ) {
case Common : : KEYCODE_F1 :
// help
break ;
case Common : : KEYCODE_F2 :
// show game doc
break ;
case Common : : KEYCODE_F3 :
// show game info
break ;
case Common : : KEYCODE_F4 :
// set text speed
break ;
case Common : : KEYCODE_F5 :
// load/save
break ;
case Common : : KEYCODE_x :
if ( state . flags & Common : : KBD_ALT ) {
// quit game
2017-08-29 01:39:34 +02:00
GUI : : MessageDialog * dialog = new GUI : : MessageDialog ( " Quit Game? " , " Quit " , " Cancel " ) ;
if ( dialog - > runModal ( ) = = GUI : : kMessageOK )
_vm - > quitGame ( ) ;
delete dialog ;
// TODO: Add original quit game message prompt
2017-07-11 05:33:46 +02:00
}
break ;
default :
2017-08-04 11:02:49 +02:00
break ;
2017-07-11 05:33:46 +02:00
}
}
2017-07-17 16:44:08 +02:00
void GameManager : : resetInputState ( ) {
Object : : setObjectNull ( _inputObject [ 0 ] ) ;
Object : : setObjectNull ( _inputObject [ 1 ] ) ;
_inputVerb = ACTION_WALK ;
_processInput = false ;
2017-07-25 02:11:00 +02:00
_mouseClicked = false ;
2017-08-04 10:48:47 +02:00
_keyPressed = false ;
2017-08-04 11:02:49 +02:00
_key . reset ( ) ;
2017-07-25 02:11:00 +02:00
_mouseClickType = Common : : EVENT_MOUSEMOVE ;
2017-07-17 16:44:08 +02:00
2017-07-25 02:11:00 +02:00
processInput ( ) ;
2017-07-17 16:44:08 +02:00
}
2017-08-30 22:38:34 +02:00
bool GameManager : : keyPressed ( Common : : KeyCode keycode , bool equal ) {
bool ret = _key . keycode = = keycode ;
_key . reset ( ) ;
return equal ? ret : ! ret ;
}
2017-07-25 02:11:00 +02:00
void GameManager : : processInput ( ) {
2017-07-11 05:33:46 +02:00
if ( _mouseClickType = = Common : : EVENT_LBUTTONUP ) {
2017-07-17 16:44:08 +02:00
_vm - > removeMessage ( ) ;
2017-07-19 02:50:17 +02:00
if ( ( ( _mouseField > = 0 ) & & ( _mouseField < 256 ) ) | |
( ( _mouseField > = 512 ) & & ( _mouseField < 768 ) ) ) {
if ( _inputVerb = = ACTION_GIVE | | _inputVerb = = ACTION_USE ) {
2017-07-25 02:11:00 +02:00
if ( Object : : isNullObject ( _inputObject [ 0 ] ) ) {
2017-07-19 02:50:17 +02:00
_inputObject [ 0 ] = _currentInputObject ;
2017-07-25 02:11:00 +02:00
if ( ! _inputObject [ 0 ] - > hasProperty ( COMBINABLE ) )
_processInput = true ;
} else {
2017-07-19 02:50:17 +02:00
_inputObject [ 1 ] = _currentInputObject ;
2017-07-25 02:11:00 +02:00
_processInput = true ;
}
2017-07-19 02:50:17 +02:00
} else {
_inputObject [ 0 ] = _currentInputObject ;
if ( ! Object : : isNullObject ( _currentInputObject ) )
_processInput = true ;
}
} else if ( _mouseField > = 256 & & _mouseField < 512 ) {
2017-07-17 16:44:08 +02:00
resetInputState ( ) ;
_inputVerb = static_cast < Action > ( _mouseField - 256 ) ;
2017-07-19 02:50:17 +02:00
} else if ( _mouseField = = 768 ) {
2017-07-25 02:11:00 +02:00
if ( _inventoryScroll > = 2 )
_inventoryScroll - = 2 ;
2017-07-19 02:50:17 +02:00
} else if ( _mouseField = = 769 ) {
2017-07-25 02:11:00 +02:00
_inventoryScroll + = 2 ;
2017-07-17 16:44:08 +02:00
}
2017-07-11 05:33:46 +02:00
} else if ( _mouseClickType = = Common : : EVENT_RBUTTONUP ) {
2017-07-17 16:44:08 +02:00
_vm - > removeMessage ( ) ;
if ( Object : : isNullObject ( _currentInputObject ) )
return ;
2017-07-11 05:33:46 +02:00
if ( ( ( _mouseField > = 0 ) & & ( _mouseField < 256 ) ) | |
2017-07-17 16:44:08 +02:00
( ( _mouseField > = 512 ) & & ( _mouseField < 768 ) ) ) {
_inputObject [ 0 ] = _currentInputObject ;
2017-08-04 11:35:51 +02:00
ObjectType type = _inputObject [ 0 ] - > _type ;
2017-07-17 16:53:19 +02:00
if ( type & OPENABLE ) {
2017-07-11 05:33:46 +02:00
if ( type & OPENED )
_inputVerb = ACTION_CLOSE ;
else
_inputVerb = ACTION_OPEN ;
} else if ( type & PRESS ) {
_inputVerb = ACTION_PRESS ;
} else if ( type & TALK ) {
_inputVerb = ACTION_TALK ;
} else {
_inputVerb = ACTION_LOOK ;
}
2017-07-17 16:44:08 +02:00
_processInput = true ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
2017-07-11 05:33:46 +02:00
} else if ( _mouseClickType = = Common : : EVENT_MOUSEMOVE ) {
2017-07-17 16:44:08 +02:00
int field = - 1 ;
int click = - 1 ;
2017-07-11 05:33:46 +02:00
/* command row? */
2017-07-25 02:11:00 +02:00
if ( ( _mouseY > = _guiCommandButton [ 0 ] . top ) & & ( _mouseY < = _guiCommandButton [ 0 ] . bottom ) ) {
2017-07-11 05:33:46 +02:00
field = 9 ;
2017-07-25 02:11:00 +02:00
while ( _mouseX < _guiCommandButton [ field ] . left - 1 )
2017-07-11 05:33:46 +02:00
field - - ;
field + = 256 ;
}
/* exit box? */
2017-07-25 02:11:00 +02:00
else if ( ( _mouseX > = 283 ) & & ( _mouseX < = 317 ) & & ( _mouseY > = 163 ) & & ( _mouseY < = 197 ) ) {
field = _exitList [ ( _mouseX - 283 ) / 7 + 5 * ( ( _mouseY - 163 ) / 7 ) ] ;
2017-07-17 16:44:08 +02:00
}
2017-07-11 05:33:46 +02:00
/* inventory box */
2017-07-25 02:11:00 +02:00
else if ( ( _mouseY > = 161 ) & & ( _mouseX < = 270 ) ) {
field = ( _mouseX + 1 ) / 136 + ( ( _mouseY - 161 ) / 10 ) * 2 ;
2017-07-11 05:33:46 +02:00
if ( field + _inventoryScroll < _inventory . getSize ( ) )
field + = 512 ;
else
field = - 1 ;
}
/* inventory arrows */
2017-07-25 02:11:00 +02:00
else if ( ( _mouseY > = 161 ) & & ( _mouseX > = 271 ) & & ( _mouseX < 279 ) ) {
if ( _mouseY > 180 )
2017-07-17 16:44:08 +02:00
field = 769 ;
else
field = 768 ;
2017-07-11 05:33:46 +02:00
}
/* normal item */
else {
2017-08-26 06:51:46 +02:00
for ( int i = 0 ; ( _currentRoom - > getObject ( i ) - > _id ! = INVALIDOBJECT ) & &
( field = = - 1 ) & & i < kMaxObject ; i + + ) {
2017-07-11 05:33:46 +02:00
click = _currentRoom - > getObject ( i ) - > _click ;
if ( click ! = 255 ) {
MSNImageDecoder : : ClickField * clickField = _vm - > _currentImage - > _clickField ;
do {
2017-07-25 02:11:00 +02:00
if ( ( _mouseX > = clickField [ click ] . x1 ) & & ( _mouseX < = clickField [ click ] . x2 ) & &
( _mouseY > = clickField [ click ] . y1 ) & & ( _mouseY < = clickField [ click ] . y2 ) )
2017-07-11 05:33:46 +02:00
field = i ;
click = clickField [ click ] . next ;
} while ( ( click ! = 0 ) & & ( field = = - 1 ) ) ;
}
}
}
2017-07-17 16:44:08 +02:00
2017-07-11 05:33:46 +02:00
if ( _mouseField ! = field ) {
if ( _mouseField > = 768 ) {
2017-07-17 16:44:08 +02:00
inventory_arrow ( _mouseField - 768 , false ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField > = 512 ) {
2017-07-19 02:45:50 +02:00
_guiInventory [ _mouseField - 512 ] . setHighlight ( false ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField > = 256 ) {
2017-07-17 16:44:08 +02:00
_guiCommandButton [ _mouseField - 256 ] . setHighlight ( false ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField ! = - 1 ) {
}
2017-07-19 02:45:50 +02:00
Object : : setObjectNull ( _currentInputObject ) ;
2017-07-17 16:44:08 +02:00
2017-07-11 05:33:46 +02:00
_mouseField = field ;
if ( _mouseField > = 768 ) {
2017-07-17 16:44:08 +02:00
inventory_arrow ( _mouseField - 768 , true ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField > = 512 ) {
2017-07-19 02:45:50 +02:00
_guiInventory [ _mouseField - 512 ] . setHighlight ( true ) ;
2017-07-17 16:44:08 +02:00
_currentInputObject = _inventory . get ( _mouseField - 512 + _inventoryScroll ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField > = 256 ) {
2017-07-17 16:44:08 +02:00
_guiCommandButton [ _mouseField - 256 ] . setHighlight ( true ) ;
2017-07-11 05:33:46 +02:00
} else if ( _mouseField ! = - 1 ) {
2017-07-17 16:44:08 +02:00
_currentInputObject = _currentRoom - > getObject ( _mouseField ) ;
2017-07-11 05:33:46 +02:00
}
}
2017-07-17 16:44:08 +02:00
}
}
void GameManager : : drawImage ( int section ) {
bool sectionVisible = true ;
if ( section > 128 ) {
sectionVisible = false ;
section - = 128 ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
do {
_currentRoom - > setSectionVisible ( section , sectionVisible ) ;
if ( sectionVisible )
_vm - > renderImage ( _currentRoom - > getFileNumber ( ) , section ) ;
else
_vm - > renderImage ( _currentRoom - > getFileNumber ( ) , section + 128 ) ;
section = _vm - > _currentImage - > _section [ section ] . next ;
} while ( section ! = 0 ) ;
2017-07-11 05:33:46 +02:00
}
2017-08-11 21:55:09 +02:00
void GameManager : : corridorOnEntrance ( ) {
2017-08-22 22:33:09 +02:00
if ( _state . _corridorSearch )
2017-08-11 21:55:09 +02:00
busted ( 0 ) ;
}
void busted ( int i ) {
// STUB
}
void GameManager : : telomat ( int number ) {
// STUB
}
void GameManager : : startSearch ( ) {
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) > = CORRIDOR1 ) & & ( _currentRoom - > getId ( ) < = BCORRIDOR ) )
2017-08-11 21:55:09 +02:00
busted ( 0 ) ;
2017-08-22 22:33:09 +02:00
_state . _corridorSearch = true ;
2017-08-11 21:55:09 +02:00
}
void GameManager : : search ( int time ) {
2017-08-24 22:47:38 +02:00
_state . _eventTime = _state . _time + time ;
2017-08-11 21:55:09 +02:00
// *event = &search_start;
}
void GameManager : : guardNoticed ( ) {
// STUB
}
void GameManager : : busted ( int i ) {
if ( i > 0 )
drawImage ( i ) ;
if ( i = = 0 ) {
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) > = OFFICE_L1 ) & & ( _currentRoom - > getId ( ) < = OFFICE_R2 ) ) {
if ( _currentRoom - > getId ( ) < OFFICE_R1 )
2017-08-11 21:55:09 +02:00
i = 10 ;
else
i = 5 ;
if ( ! _currentRoom - > getObject ( 0 ) - > hasProperty ( OPENED ) ) {
drawImage ( i - 1 ) ;
_vm - > playSound ( kAudioDoorOpen ) ;
wait2 ( 2 ) ;
}
drawImage ( i ) ;
wait2 ( 3 ) ;
drawImage ( i + 3 ) ;
_vm - > playSound ( kAudioVoiceHalt ) ;
drawImage ( i ) ;
wait2 ( 5 ) ;
2017-08-28 13:40:32 +02:00
if ( _currentRoom - > getId ( ) = = OFFICE_L2 )
2017-08-11 21:55:09 +02:00
i = 13 ;
drawImage ( i + 1 ) ;
wait2 ( 3 ) ;
drawImage ( i + 2 ) ;
shot ( 0 , 0 ) ;
2017-08-28 13:40:32 +02:00
} else if ( _currentRoom - > getId ( ) = = BCORRIDOR ) {
2017-08-11 21:55:09 +02:00
drawImage ( 21 ) ;
} else {
if ( _currentRoom - > isSectionVisible ( 4 ) )
drawImage ( 32 ) ; // below
else if ( _currentRoom - > isSectionVisible ( 2 ) )
drawImage ( 30 ) ; // right
else if ( _currentRoom - > isSectionVisible ( 1 ) )
drawImage ( 31 ) ; // left
else
drawImage ( 33 ) ; // above
}
2017-07-11 05:33:46 +02:00
}
2017-08-11 21:55:09 +02:00
_vm - > playSound ( kAudioVoiceHalt ) ;
wait2 ( 3 ) ;
shot ( 0 , 0 ) ;
}
2017-07-11 05:33:46 +02:00
2017-08-11 21:55:09 +02:00
void GameManager : : guardReturned ( ) {
2017-08-28 13:40:32 +02:00
if ( _currentRoom - > getId ( ) = = GUARD )
2017-08-11 21:55:09 +02:00
busted ( - 1 ) ;
2017-08-28 13:40:32 +02:00
else if ( ( _currentRoom - > getId ( ) = = CORRIDOR9 ) & & ( _currentRoom - > isSectionVisible ( 27 ) ) )
2017-08-11 21:55:09 +02:00
busted ( 0 ) ;
_rooms [ GUARD ] - > setSectionVisible ( 1 , false ) ;
_rooms [ GUARD ] - > getObject ( 3 ) - > _click = 0 ;
_rooms [ GUARD ] - > setSectionVisible ( 6 , false ) ;
_rooms [ GUARD ] - > getObject ( 2 ) - > disableProperty ( OPENED ) ;
_rooms [ GUARD ] - > setSectionVisible ( 7 , false ) ;
_rooms [ GUARD ] - > getObject ( 5 ) - > _click = 255 ;
_rooms [ CORRIDOR9 ] - > setSectionVisible ( 27 , false ) ;
_rooms [ CORRIDOR9 ] - > setSectionVisible ( 28 , true ) ;
_rooms [ CORRIDOR9 ] - > getObject ( 1 ) - > disableProperty ( OPENED ) ;
}
void GameManager : : taxi ( ) {
2017-08-28 13:40:32 +02:00
if ( _currentRoom - > getId ( ) = = SIGN ) {
2017-08-11 21:55:09 +02:00
changeRoom ( STATION ) ;
}
drawImage ( 1 ) ;
drawImage ( 2 ) ;
_vm - > playSound ( kAudioRocks ) ;
screenShake ( ) ;
drawImage ( 9 ) ;
_currentRoom - > getObject ( 1 ) - > setProperty ( OPENED ) ;
drawImage ( 1 ) ;
_currentRoom - > setSectionVisible ( 2 , false ) ;
drawImage ( 3 ) ;
for ( int i = 4 ; i < = 8 ; i + + ) {
wait2 ( 2 ) ;
drawImage ( invertSection ( i - 1 ) ) ;
drawImage ( i ) ;
}
_rooms [ SIGN ] - > setSectionVisible ( 2 , false ) ;
_rooms [ SIGN ] - > setSectionVisible ( 3 , true ) ;
}
void GameManager : : outro ( ) {
// title = 2;
_vm - > playSoundMod ( 49 ) ;
// title = 0;
_vm - > paletteFadeOut ( ) ;
_vm - > renderImage ( 55 , 0 ) ;
_vm - > paletteFadeIn ( ) ;
getInput ( ) ;
_vm - > paletteFadeOut ( ) ;
// TODO: render info file
2017-08-29 01:36:05 +02:00
// Exit
2017-07-11 05:33:46 +02:00
}
void GameManager : : great ( uint number ) {
2017-08-22 22:33:09 +02:00
if ( number & & ( _state . _greatFlag & ( 1 < < number ) ) )
2017-07-11 05:33:46 +02:00
return ;
_vm - > playSound ( kAudioUndef7 ) ;
2017-08-22 22:33:09 +02:00
_state . _greatFlag | = 1 < < number ;
2017-07-11 05:33:46 +02:00
}
bool GameManager : : airless ( ) {
2017-08-28 13:40:32 +02:00
return ( _currentRoom - > getId ( ) = = HOLD | |
_currentRoom - > getId ( ) = = LANDINGMODULE | |
_currentRoom - > getId ( ) = = GENERATOR | |
_currentRoom - > getId ( ) = = OUTSIDE | |
_currentRoom - > getId ( ) = = ROCKS | |
_currentRoom - > getId ( ) = = CAVE | |
_currentRoom - > getId ( ) = = MEETUP | |
_currentRoom - > getId ( ) = = MEETUP2 | |
_currentRoom - > getId ( ) = = MEETUP3 | |
( _currentRoom - > getId ( ) = = AIRLOCK & & _rooms [ AIRLOCK ] - > getObject ( 1 ) - > hasProperty ( OPENED ) ) ) ;
2017-07-11 05:33:46 +02:00
}
2017-08-11 21:55:09 +02:00
void GameManager : : shipStart ( ) {
// STUB
}
void GameManager : : removeSentence ( int sentence , int number ) {
// STUB
}
void GameManager : : addSentence ( int sentence , int number ) {
// STUB
}
void GameManager : : say ( const char * text ) {
// STUB
}
void GameManager : : reply ( const char * text , int aus1 , int aus2 ) {
// STUB
}
int GameManager : : dialog ( int num , byte * rowLength [ ] , const char * * text [ 6 ] , int number ) {
// STUB
return 0 ;
}
2017-07-11 05:33:46 +02:00
void GameManager : : turnOff ( ) {
2017-08-22 22:33:09 +02:00
_state . _powerOff = true ;
2017-07-11 05:33:46 +02:00
}
2017-08-25 16:15:55 +02:00
2017-07-11 05:33:46 +02:00
void GameManager : : turnOn ( ) {
2017-08-22 22:33:09 +02:00
if ( ! _state . _powerOff )
2017-08-20 22:00:58 +02:00
return ;
2017-08-22 22:33:09 +02:00
_state . _powerOff = false ;
2017-08-25 16:15:55 +02:00
_vm - > _brightness = 255 ;
// _vm->paletteBrightness();
_rooms [ SLEEP ] - > setSectionVisible ( 1 , false ) ;
_rooms [ SLEEP ] - > setSectionVisible ( 2 , false ) ;
_rooms [ COCKPIT ] - > setSectionVisible ( 22 , false ) ;
2017-07-11 05:33:46 +02:00
}
void GameManager : : takeObject ( Object & obj ) {
if ( obj . hasProperty ( CARRIED ) )
return ;
if ( obj . _section ! = 0 )
2017-07-19 02:47:52 +02:00
drawImage ( obj . _section ) ;
2017-07-11 05:33:46 +02:00
obj . setProperty ( CARRIED ) ;
obj . _click = obj . _click2 = 255 ;
_inventory . add ( obj ) ;
}
void GameManager : : drawCommandBox ( ) {
2017-07-17 16:44:08 +02:00
for ( int i = 0 ; i < ARRAYSIZE ( _guiCommandButton ) ; + + i ) {
_vm - > renderBox ( _guiCommandButton [ i ] . left ,
_guiCommandButton [ i ] . top ,
_guiCommandButton [ i ] . width ( ) ,
_guiCommandButton [ i ] . height ( ) ,
_guiCommandButton [ i ] . _bgColor ) ;
_vm - > renderText ( _guiCommandButton [ i ] . _text ,
_guiCommandButton [ i ] . _textPosition . x ,
_guiCommandButton [ i ] . _textPosition . y ,
_guiCommandButton [ i ] . _textColor ) ;
}
2017-07-11 05:33:46 +02:00
}
void GameManager : : inventory_arrow ( int num , bool brightness ) {
// STUB
}
void GameManager : : drawInventory ( ) {
2017-07-19 02:45:50 +02:00
for ( int i = 0 ; i < ARRAYSIZE ( _guiInventory ) ; + + i ) {
_vm - > renderBox ( _guiInventory [ i ] . left ,
_guiInventory [ i ] . top ,
_guiInventory [ i ] . width ( ) ,
_guiInventory [ i ] . height ( ) ,
_guiInventory [ i ] . _bgColor ) ;
2017-08-24 15:09:38 +02:00
_vm - > renderText ( _inventory . get ( i + _inventoryScroll ) - > _name . c_str ( ) ,
2017-07-19 02:45:50 +02:00
_guiInventory [ i ] . _textPosition . x ,
_guiInventory [ i ] . _textPosition . y ,
_guiInventory [ i ] . _textColor ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-19 02:45:50 +02:00
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( 272 , 161 , 7 , 19 , kColorWhite25 ) ;
_vm - > renderBox ( 272 , 181 , 7 , 19 , kColorWhite25 ) ;
2017-07-11 05:33:46 +02:00
}
2017-08-04 11:02:49 +02:00
uint16 GameManager : : getKeyInput ( bool blockForPrintChar ) {
while ( true ) {
_vm - > updateEvents ( ) ;
if ( _keyPressed ) {
if ( blockForPrintChar ) {
if ( Common : : isPrint ( _key . keycode ) | |
_key . keycode = = Common : : KEYCODE_BACKSPACE | |
_key . keycode = = Common : : KEYCODE_DELETE | |
_key . keycode = = Common : : KEYCODE_RETURN | |
_key . keycode = = Common : : KEYCODE_SPACE | |
2017-08-11 21:55:09 +02:00
_key . keycode = = Common : : KEYCODE_ESCAPE | |
_key . keycode = = Common : : KEYCODE_UP | |
_key . keycode = = Common : : KEYCODE_DOWN | |
_key . keycode = = Common : : KEYCODE_LEFT | |
_key . keycode = = Common : : KEYCODE_RIGHT ) {
2017-08-04 11:02:49 +02:00
if ( _key . flags & Common : : KBD_SHIFT )
return toupper ( _key . ascii ) ;
else
return tolower ( _key . ascii ) ;
}
} else {
return _key . ascii ;
}
}
g_system - > updateScreen ( ) ;
g_system - > delayMillis ( _vm - > _delay ) ;
}
2017-07-11 05:33:46 +02:00
}
2017-08-04 11:02:49 +02:00
Common : : EventType GameManager : : getMouseInput ( ) {
while ( true ) {
_vm - > updateEvents ( ) ;
if ( _mouseClicked ) {
return _mouseClickType ;
}
g_system - > updateScreen ( ) ;
g_system - > delayMillis ( _vm - > _delay ) ;
}
}
void GameManager : : getInput ( ) {
2017-07-29 11:38:20 +02:00
while ( true ) {
_vm - > updateEvents ( ) ;
2017-08-04 10:48:47 +02:00
if ( _mouseClicked | | _keyPressed ) {
2017-07-29 11:38:20 +02:00
break ;
}
g_system - > updateScreen ( ) ;
g_system - > delayMillis ( _vm - > _delay ) ;
}
2017-07-11 05:33:46 +02:00
}
2017-08-04 11:02:49 +02:00
// TODO: Unify mouseInput3 and mouseWait with getMouseInput
2017-07-11 05:33:46 +02:00
void GameManager : : mouseInput3 ( ) {
// STUB
}
void GameManager : : mouseWait ( int delay ) {
// STUB
}
void GameManager : : roomBrightness ( ) {
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) ! = OUTSIDE ) & & ( _currentRoom - > getId ( ) < ROCKS ) ) {
2017-08-22 22:33:09 +02:00
if ( _state . _powerOff )
2017-08-25 16:15:55 +02:00
_vm - > _brightness = 153 ;
2017-08-28 13:40:32 +02:00
} else if ( ( _currentRoom - > getId ( ) = = CAVE ) ) {
2017-08-25 16:15:55 +02:00
_vm - > _brightness = 0 ;
2017-08-28 13:40:32 +02:00
} else if ( ( _currentRoom - > getId ( ) = = GUARD3 ) ) {
2017-08-22 22:33:09 +02:00
if ( _state . _powerOff )
_vm - > _brightness = 0 ;
}
_vm - > paletteBrightness ( ) ;
2017-07-11 05:33:46 +02:00
}
void GameManager : : loadTime ( ) {
2017-08-29 01:36:05 +02:00
// STUB
2017-07-11 05:33:46 +02:00
}
void GameManager : : saveTime ( ) {
// STUB
}
bool GameManager : : saveGame ( int number ) {
// STUB
return false ;
}
void GameManager : : changeRoom ( RoomID id ) {
_currentRoom = _rooms [ id ] ;
}
void GameManager : : errorTemp ( ) {
// STUB
}
2017-07-23 12:32:11 +02:00
void GameManager : : wait2 ( int ticks ) {
2017-08-29 01:36:05 +02:00
int32 end = _state . _time + ticksToMsec ( ticks ) ;
2017-08-30 22:39:53 +02:00
do {
2017-07-23 12:32:11 +02:00
_vm - > updateEvents ( ) ;
g_system - > updateScreen ( ) ;
g_system - > delayMillis ( _vm - > _delay ) ;
2017-08-30 22:39:53 +02:00
} while ( _state . _time < end ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-25 02:03:35 +02:00
void GameManager : : setAnimationTimer ( int ticks ) {
2017-08-29 01:36:05 +02:00
_animationTimer = ticksToMsec ( ticks ) ;
2017-07-25 02:03:35 +02:00
}
2017-07-25 02:11:00 +02:00
void GameManager : : handleTime ( ) {
2017-08-29 01:36:05 +02:00
int32 delta = g_system - > getMillis ( ) - _oldTime ;
_state . _time + = delta ;
if ( _state . _time > 86400000 )
_state . _time - = 86400000 ; // 24h wrap around
if ( _animationTimer > delta )
_animationTimer - = delta ;
else
2017-07-25 02:11:00 +02:00
_animationTimer = 0 ;
2017-08-29 01:36:05 +02:00
_oldTime = g_system - > getMillis ( ) ;
2017-07-11 05:33:46 +02:00
}
2017-08-29 01:36:05 +02:00
void GameManager : : screenShake ( ) {
2017-07-11 05:33:46 +02:00
// STUB
}
void GameManager : : shock ( ) {
_vm - > playSound ( kAudioShock ) ;
2017-08-04 11:37:31 +02:00
death ( " Du h \204 ttest besser vorher|den Stecker rausgezogen. " ) ;
2017-07-11 05:33:46 +02:00
}
void GameManager : : showMenu ( ) {
_vm - > renderBox ( 0 , 138 , 320 , 62 , 0 ) ;
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( 0 , 140 , 320 , 9 , kColorWhite25 ) ;
2017-07-17 16:44:08 +02:00
drawCommandBox ( ) ;
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( 281 , 161 , 39 , 39 , kColorWhite25 ) ;
2017-07-11 05:33:46 +02:00
drawInventory ( ) ;
}
void GameManager : : drawMapExits ( ) {
2017-08-04 11:02:49 +02:00
// TODO: Preload _exitList on room entry instead on every call
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( 281 , 161 , 39 , 39 , kColorWhite25 ) ;
2017-07-11 05:33:46 +02:00
for ( int i = 0 ; i < 25 ; i + + )
_exitList [ i ] = - 1 ;
for ( int i = 0 ; i < kMaxObject ; i + + ) {
if ( _currentRoom - > getObject ( i ) - > hasProperty ( EXIT ) ) {
byte r = _currentRoom - > getObject ( i ) - > _direction ;
_exitList [ r ] = i ;
int x = 284 + 7 * ( r % 5 ) ;
int y = 164 + 7 * ( r / 5 ) ;
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( x , y , 5 , 5 , kColorDarkRed ) ;
2017-07-11 05:33:46 +02:00
}
}
}
void GameManager : : animationOff ( ) {
2017-07-25 02:11:00 +02:00
_animationEnabled = false ;
2017-07-11 05:33:46 +02:00
}
void GameManager : : animationOn ( ) {
2017-07-25 02:11:00 +02:00
_animationEnabled = true ;
2017-07-11 05:33:46 +02:00
}
2017-08-18 13:40:42 +02:00
void GameManager : : edit ( Common : : String & input , int x , int y , uint length ) {
2017-08-04 11:25:44 +02:00
bool isEditing = true ;
uint cursorIndex = input . size ( ) ;
2017-08-24 15:23:53 +02:00
// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
int overdrawWidth = ( ( length + 1 ) * ( kFontWidth + 2 ) > kScreenWidth - x ) ?
kScreenWidth - x : ( length + 1 ) * ( kFontWidth + 2 ) ;
2017-08-04 11:25:44 +02:00
while ( isEditing ) {
_vm - > _textCursorX = x ;
_vm - > _textCursorY = y ;
2017-08-26 07:34:06 +02:00
_vm - > _textColor = kColorWhite99 ;
_vm - > renderBox ( x , y - 1 , overdrawWidth , 9 , kColorDarkBlue ) ;
2017-08-04 11:25:44 +02:00
for ( uint i = 0 ; i < input . size ( ) ; + + i ) {
// Draw char highlight depending on cursor position
2017-08-18 13:40:42 +02:00
if ( i = = cursorIndex ) {
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( _vm - > _textCursorX , y - 1 , _vm - > textWidth ( input [ i ] ) , 9 , kColorWhite99 ) ;
_vm - > _textColor = kColorDarkBlue ;
2017-08-18 13:40:42 +02:00
_vm - > renderText ( input [ i ] ) ;
2017-08-26 07:34:06 +02:00
_vm - > _textColor = kColorWhite99 ;
2017-08-04 11:25:44 +02:00
} else {
_vm - > renderText ( input [ i ] ) ;
}
}
if ( cursorIndex = = input . size ( ) ) {
2017-08-26 07:34:06 +02:00
_vm - > renderBox ( _vm - > _textCursorX + 1 , y - 1 , 6 , 9 , kColorDarkBlue ) ;
_vm - > renderBox ( _vm - > _textCursorX , y - 1 , 1 , 9 , kColorWhite99 ) ;
2017-08-04 11:25:44 +02:00
}
getKeyInput ( true ) ;
switch ( _key . keycode ) {
case Common : : KEYCODE_RETURN :
case Common : : KEYCODE_ESCAPE :
2017-08-18 13:40:42 +02:00
isEditing = false ;
break ;
2017-08-04 11:25:44 +02:00
case Common : : KEYCODE_UP :
case Common : : KEYCODE_DOWN :
2017-08-18 13:40:42 +02:00
cursorIndex = input . size ( ) ;
break ;
2017-08-04 11:25:44 +02:00
case Common : : KEYCODE_LEFT :
if ( cursorIndex ! = 0 ) {
- - cursorIndex ;
}
2017-08-18 13:40:42 +02:00
break ;
2017-08-04 11:25:44 +02:00
case Common : : KEYCODE_RIGHT :
if ( cursorIndex ! = input . size ( ) ) {
+ + cursorIndex ;
}
2017-08-18 13:40:42 +02:00
break ;
2017-08-04 11:25:44 +02:00
case Common : : KEYCODE_DELETE :
if ( cursorIndex ! = input . size ( ) ) {
input . deleteChar ( cursorIndex ) ;
}
2017-08-18 13:40:42 +02:00
break ;
2017-08-04 11:25:44 +02:00
case Common : : KEYCODE_BACKSPACE :
if ( cursorIndex ! = 0 ) {
- - cursorIndex ;
input . deleteChar ( cursorIndex ) ;
}
2017-08-18 13:40:42 +02:00
break ;
2017-08-04 11:25:44 +02:00
default :
if ( Common : : isPrint ( _key . ascii ) & & input . size ( ) < length ) {
input . insertChar ( _key . ascii , cursorIndex ) ;
+ + cursorIndex ;
}
2017-08-18 13:40:42 +02:00
break ;
2017-08-04 11:25:44 +02:00
}
}
2017-07-11 05:33:46 +02:00
}
void GameManager : : loadOverlayStart ( ) {
// STUB
}
2017-08-11 21:55:09 +02:00
void GameManager : : shot ( int a , int b ) {
if ( a )
drawImage ( a ) ;
_vm - > playSound ( kAudioGunShot ) ;
wait2 ( 2 ) ;
if ( b )
drawImage ( b ) ;
wait2 ( 2 ) ;
if ( a )
drawImage ( a ) ;
_vm - > playSound ( kAudioGunShot ) ;
wait2 ( 2 ) ;
if ( b )
drawImage ( b ) ;
death ( " Der Axacussaner hat dich erwischt. " ) ;
}
void GameManager : : takeMoney ( int amount ) {
2017-08-22 22:33:09 +02:00
_state . _money + = amount ;
2017-08-11 21:55:09 +02:00
if ( amount > 0 )
great ( 0 ) ;
// TODO: kmaxobject - 1?
// _rooms[OFFICE_R1]->getObject(5)->_name = _rooms[OFFICE_R1]->getObject(kMaxObject - 1);
// raumz[OFFICE_R1]->object[5].name = &(raumz[OFFICE_R1]->object[MAX_OBJECT-1]);
// strcpy(raumz[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
// strcat(raumz[OFFICE_R1]->object[5].name," Xa");
2017-08-22 22:33:09 +02:00
if ( _state . _money ) {
2017-08-11 21:55:09 +02:00
if ( ! _rooms [ OFFICE_R1 ] - > getObject ( 5 ) - > hasProperty ( CARRIED ) )
takeObject ( * _rooms [ OFFICE_R1 ] - > getObject ( 5 ) ) ;
} else {
_inventory . remove ( * _rooms [ OFFICE_R1 ] - > getObject ( 5 ) ) ;
}
}
2017-07-11 05:33:46 +02:00
void GameManager : : drawStatus ( ) {
int index = static_cast < int > ( _inputVerb ) ;
2017-07-25 02:11:00 +02:00
_vm - > renderBox ( 0 , 140 , 320 , 9 , kColorWhite25 ) ;
_vm - > renderText ( guiStatusCommand_DE [ index ] , 1 , 141 , kColorDarkGreen ) ;
2017-07-11 05:33:46 +02:00
2017-07-17 16:44:08 +02:00
if ( Object : : isNullObject ( _inputObject [ 0 ] ) ) {
2017-08-24 15:09:38 +02:00
_vm - > renderText ( _currentInputObject - > _name . c_str ( ) ) ;
2017-07-17 16:44:08 +02:00
} else {
2017-08-24 15:09:38 +02:00
_vm - > renderText ( _inputObject [ 0 ] - > _name . c_str ( ) ) ;
2017-07-17 16:44:08 +02:00
if ( _inputVerb = = ACTION_GIVE ) {
_vm - > renderText ( " an " ) ;
} else if ( _inputVerb = = ACTION_USE ) {
_vm - > renderText ( " mit " ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
2017-08-24 15:09:38 +02:00
_vm - > renderText ( _currentInputObject - > _name . c_str ( ) ) ;
2017-07-11 05:33:46 +02:00
}
}
void GameManager : : openLocker ( const Room * room , Object * obj , Object * lock , int section ) {
2017-07-25 02:11:00 +02:00
drawImage ( section ) ;
2017-07-11 05:33:46 +02:00
obj - > setProperty ( OPENED ) ;
lock - > _click = 255 ;
int i = obj - > _click ;
obj - > _click = obj - > _click2 ;
obj - > _click2 = i ;
}
void GameManager : : closeLocker ( const Room * room , Object * obj , Object * lock , int section ) {
2017-07-25 02:11:00 +02:00
if ( ! obj - > hasProperty ( OPENED ) ) {
_vm - > renderMessage ( " Das ist schon geschlossen. " ) ;
} else {
drawImage ( invertSection ( section ) ) ;
obj - > disableProperty ( OPENED ) ;
lock - > _click = lock - > _click2 ;
int i = obj - > _click ;
obj - > _click = obj - > _click2 ;
obj - > _click2 = i ;
}
2017-07-11 05:33:46 +02:00
}
2017-08-04 11:24:02 +02:00
void GameManager : : death ( const char * message ) {
_vm - > paletteFadeOut ( ) ;
_guiEnabled = false ;
_vm - > renderImage ( 11 , 0 ) ;
_vm - > renderMessage ( message ) ;
_vm - > playSound ( kAudioDeath ) ;
_vm - > paletteFadeIn ( ) ;
getInput ( ) ;
_vm - > paletteFadeOut ( ) ;
_vm - > removeMessage ( ) ;
// TODO: Load screen
destroyRooms ( ) ;
initRooms ( ) ;
initState ( ) ;
initGui ( ) ;
_inventory . clear ( ) ;
2017-08-28 13:40:32 +02:00
changeRoom ( CABIN_R3 ) ;
2017-08-20 22:01:26 +02:00
g_system - > fillScreen ( kColorBlack ) ;
2017-08-04 11:24:02 +02:00
_vm - > paletteFadeIn ( ) ;
_guiEnabled = true ;
}
2017-07-11 05:33:46 +02:00
int GameManager : : invertSection ( int section ) {
if ( section < 128 )
section + = 128 ;
else
section - = 128 ;
return section ;
}
2017-08-11 21:55:09 +02:00
bool GameManager : : isHelmetOff ( ) {
Object * helmet = _inventory . get ( HELMET ) ;
if ( helmet & & helmet - > hasProperty ( WORN ) ) {
_vm - > renderMessage ( " Irgendwie ist ein Raumhelm|beim Essen unpraktisch. " ) ;
return false ;
}
return true ;
}
2017-07-11 05:33:46 +02:00
bool GameManager : : genericInteract ( Action verb , Object & obj1 , Object & obj2 ) {
Room * r ;
char t [ 150 ] ;
2017-08-18 13:40:42 +02:00
Common : : String input ;
2017-07-11 05:33:46 +02:00
if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = SCHNUCK ) ) {
if ( isHelmetOff ( ) ) {
takeObject ( obj1 ) ;
_vm - > renderMessage ( " Schmeckt ganz gut. " ) ;
_inventory . remove ( obj1 ) ;
}
} else if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = EGG ) ) {
if ( isHelmetOff ( ) ) {
takeObject ( obj1 ) ;
if ( obj1 . hasProperty ( OPENED ) )
_vm - > renderMessage ( " Schmeckt ganz gut. " ) ;
else
_vm - > renderMessage ( " Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt. " ) ;
_inventory . remove ( obj1 ) ;
}
} else if ( ( verb = = ACTION_OPEN ) & & ( obj1 . _id = = EGG ) ) {
takeObject ( obj1 ) ;
if ( obj1 . hasProperty ( OPENED ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du hast es doch schon ge \224 ffnet. " ) ;
2017-07-11 05:33:46 +02:00
} else {
takeObject ( * _rooms [ ENTRANCE ] - > getObject ( 8 ) ) ;
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " In dem Ei ist eine Tablette|in einer Plastikh \201 lle. " ) ;
2017-07-11 05:33:46 +02:00
obj1 . setProperty ( OPENED ) ;
}
} else if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = PILL ) ) {
if ( isHelmetOff ( ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du iát die Tablette und merkst,|da \341 sich irgendetwas ver \216 ndert hat. " ) ;
2017-07-11 05:33:46 +02:00
great ( 0 ) ;
_inventory . remove ( obj1 ) ;
2017-08-22 22:33:09 +02:00
_state . _language = 2 ;
2017-07-11 05:33:46 +02:00
takeObject ( * _rooms [ ENTRANCE ] - > getObject ( 17 ) ) ;
}
} else if ( ( verb = = ACTION_LOOK ) & & ( obj1 . _id = = PILL_HULL ) & &
2017-08-22 22:33:09 +02:00
( _state . _language = = 2 ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht: \" Wenn Sie diese Schrift jetzt|lesen k \224 nnen, hat die Tablette gewirkt. \" " ) ;
2017-08-22 22:33:09 +02:00
_state . _language = 1 ;
2017-07-11 05:33:46 +02:00
} else if ( ( verb = = ACTION_OPEN ) & & ( obj1 . _id = = WALLET ) ) {
if ( ! _rooms [ ROGER ] - > getObject ( 3 ) - > hasProperty ( CARRIED ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Das mu \341 t du erst nehmen. " ) ;
2017-07-11 05:33:46 +02:00
} else if ( _rooms [ ROGER ] - > getObject ( 7 ) - > hasProperty ( CARRIED ) ) {
_vm - > renderMessage ( " Sie ist leer. " ) ;
} else {
_vm - > renderMessage ( " Du findest 10 Buckazoids und eine Keycard. " ) ;
takeObject ( * _rooms [ ROGER ] - > getObject ( 7 ) ) ;
takeObject ( * _rooms [ ROGER ] - > getObject ( 8 ) ) ;
}
} else if ( ( verb = = ACTION_LOOK ) & & ( obj1 . _id = = NEWSPAPER ) ) {
_vm - > renderMessage ( " Es ist eine Art elektronische Zeitung. " ) ;
mouseWait ( _timer1 ) ;
_vm - > removeMessage ( ) ;
_vm - > renderMessage ( " Halt, hier ist ein interessanter Artikel. " ) ;
mouseWait ( _timer1 ) ;
_vm - > removeMessage ( ) ;
2017-07-17 16:44:08 +02:00
_vm - > renderImage ( 2 , 0 ) ;
2017-07-11 05:33:46 +02:00
_vm - > setColor63 ( 40 ) ;
2017-08-04 11:02:49 +02:00
getInput ( ) ;
2017-07-11 05:33:46 +02:00
_vm - > renderRoom ( * _currentRoom ) ;
roomBrightness ( ) ;
_vm - > renderMessage ( " Hmm, irgendwie komme|ich mir verarscht vor. " ) ;
} else if ( ( verb = = ACTION_LOOK ) & & ( obj1 . _id = = KEYCARD2 ) ) {
2017-08-24 15:09:38 +02:00
_vm - > renderMessage ( obj1 . _description . c_str ( ) ) ;
2017-07-11 05:33:46 +02:00
obj1 . _description = " Es ist die Keycard des Commanders. " ;
} else if ( ( verb = = ACTION_LOOK ) & & ( obj1 . _id = = WATCH ) ) {
_vm - > renderMessage ( Common : : String : : format (
" Es ist eine Uhr mit extra|lautem Wecker. "
" Sie hat einen|Knopf zum Verstellen der Alarmzeit.| "
" Uhrzeit: %s Alarmzeit: %s " ,
2017-08-29 01:36:05 +02:00
timeToString ( _state . _time ) . c_str ( ) ,
2017-08-22 22:33:09 +02:00
timeToString ( _state . _timeAlarm ) . c_str ( ) ) . c_str ( ) ) ;
2017-07-11 05:33:46 +02:00
} else if ( ( verb = = ACTION_PRESS ) & & ( obj1 . _id = = WATCH ) ) {
2017-08-23 03:31:57 +02:00
bool validInput = true ;
int hours = 0 ;
int minutes = 0 ;
2017-07-11 05:33:46 +02:00
animationOff ( ) ;
_vm - > saveScreen ( 88 , 87 , 144 , 24 ) ;
_vm - > renderBox ( 88 , 87 , 144 , 24 , kColorWhite35 ) ;
_vm - > renderText ( " Neue Alarmzeit (hh:mm) : " , 91 , 90 , kColorWhite99 ) ;
do {
2017-08-23 03:31:57 +02:00
validInput = true ;
input . clear ( ) ;
2017-07-11 05:33:46 +02:00
_vm - > renderBox ( 91 , 99 , 138 , 9 , kColorDarkBlue ) ;
2017-08-22 23:24:24 +02:00
edit ( input , 91 , 100 , 5 ) ;
2017-08-23 03:31:57 +02:00
int seperator = - 1 ;
for ( int i = 0 ; i < input . size ( ) ; + + i ) {
if ( input [ i ] = = ' : ' ) {
seperator = i ;
break ;
}
}
if ( ( seperator = = - 1 ) | | ( seperator > 2 ) ) {
validInput = false ;
continue ;
2017-07-11 05:33:46 +02:00
}
2017-08-23 03:31:57 +02:00
int decimalPlace = 1 ;
for ( int i = 0 ; i < seperator ; + + i ) {
if ( Common : : isDigit ( input [ i ] ) ) {
hours = hours * decimalPlace + ( input [ i ] - ' 0 ' ) ;
decimalPlace * = 10 ;
} else {
validInput = false ;
break ;
}
}
decimalPlace = 1 ;
for ( int i = seperator + 1 ; i < input . size ( ) ; + + i ) {
if ( Common : : isDigit ( input [ i ] ) ) {
minutes = minutes * decimalPlace + ( input [ i ] - ' 0 ' ) ;
decimalPlace * = 10 ;
} else {
validInput = false ;
break ;
}
}
2017-08-22 22:33:09 +02:00
if ( ( hours > 23 ) | | ( minutes > 59 ) )
2017-08-23 03:31:57 +02:00
validInput = false ;
2017-07-11 05:33:46 +02:00
animationOn ( ) ;
2017-08-23 03:31:57 +02:00
} while ( ! validInput & & ( _key . keycode ! = Common : : KEYCODE_ESCAPE ) ) ;
2017-07-11 05:33:46 +02:00
_vm - > restoreScreen ( ) ;
2017-08-04 11:02:49 +02:00
if ( _key . keycode ! = Common : : KEYCODE_ESCAPE ) {
2017-08-23 03:31:57 +02:00
_state . _timeAlarm = ( hours * 60 + minutes ) * 60 * 1000 ;
2017-08-29 01:36:05 +02:00
_state . _alarmOn = ( _state . _timeAlarm > _state . _time ) ;
2017-07-11 05:33:46 +02:00
}
} else if ( ( verb = = ACTION_USE ) & & Object : : combine ( obj1 , obj2 , TERMINALSTRIP , WIRE ) ) {
r = _rooms [ CABIN_L3 ] ;
if ( ! r - > getObject ( 8 ) - > hasProperty ( CARRIED ) ) {
if ( r - > isSectionVisible ( 26 ) )
_vm - > renderMessage ( Object : : takeMessage ) ;
else
return false ;
} else {
2017-08-22 23:17:40 +02:00
r - > getObject ( 8 ) - > _name = " Leitung mit L \201 sterklemme " ;
2017-07-11 05:33:46 +02:00
r = _rooms [ HOLD ] ;
_inventory . remove ( * r - > getObject ( 2 ) ) ;
2017-08-22 22:33:09 +02:00
_state . _terminalStripConnected = true ;
_state . _terminalStripWire = true ;
2017-07-11 05:33:46 +02:00
_vm - > renderMessage ( " Ok. " ) ;
}
} else if ( ( verb = = ACTION_USE ) & & Object : : combine ( obj1 , obj2 , TERMINALSTRIP , SPOOL ) ) {
r = _rooms [ CABIN_L2 ] ;
takeObject ( * r - > getObject ( 9 ) ) ;
2017-08-22 23:17:40 +02:00
r - > getObject ( 9 ) - > _name = " Kabelrolle mit L \201 sterklemme " ;
2017-07-11 05:33:46 +02:00
r = _rooms [ HOLD ] ;
_inventory . remove ( * r - > getObject ( 2 ) ) ;
2017-08-22 22:33:09 +02:00
_state . _terminalStripConnected = true ;
2017-07-11 05:33:46 +02:00
_vm - > renderMessage ( " Ok. " ) ;
} else if ( ( verb = = ACTION_USE ) & & Object : : combine ( obj1 , obj2 , WIRE , SPOOL ) ) {
r = _rooms [ CABIN_L3 ] ;
2017-08-22 22:33:09 +02:00
if ( ! _state . _terminalStripConnected ) {
2017-07-11 05:33:46 +02:00
if ( r - > isSectionVisible ( 26 ) )
_vm - > renderMessage ( " Womit denn? " ) ;
else
return false ;
} else {
if ( ! r - > getObject ( 8 ) - > hasProperty ( CARRIED ) ) {
_vm - > renderMessage ( Object : : takeMessage ) ;
} else {
r = _rooms [ CABIN_L2 ] ;
takeObject ( * r - > getObject ( 9 ) ) ;
r = _rooms [ CABIN_L3 ] ;
r - > getObject ( 8 ) - > _name = " langes Kabel mit Stecker " ;
r = _rooms [ CABIN_L2 ] ;
_inventory . remove ( * r - > getObject ( 9 ) ) ;
2017-08-22 22:33:09 +02:00
_state . _cableConnected = true ;
2017-07-11 05:33:46 +02:00
_vm - > renderMessage ( " Ok. " ) ;
}
}
} else if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = SUIT ) ) {
takeObject ( obj1 ) ;
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) > = ENTRANCE ) & & ( _currentRoom - > getId ( ) < = ROGER ) ) {
2017-07-11 05:33:46 +02:00
if ( obj1 . hasProperty ( WORN ) ) {
_vm - > renderMessage ( " Die Luft hier ist atembar,|du ziehst den Anzug aus. " ) ;
_rooms [ AIRLOCK ] - > getObject ( 4 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 5 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 6 ) - > disableProperty ( WORN ) ;
} else
_vm - > renderMessage ( " Hier drinnen brauchtst du deinen Anzug nicht. " ) ;
} else {
if ( obj1 . hasProperty ( WORN ) ) {
r = _rooms [ AIRLOCK ] ;
if ( r - > getObject ( 4 ) - > hasProperty ( WORN ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du mu \341 t erst den Helm abnehmen. " ) ;
2017-07-11 05:33:46 +02:00
} else if ( r - > getObject ( 6 ) - > hasProperty ( WORN ) ) {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du mu \341 t erst den Versorgungsteil abnehmen. " ) ;
2017-07-11 05:33:46 +02:00
} else {
obj1 . disableProperty ( WORN ) ;
_vm - > renderMessage ( " Du ziehst den Raumanzug aus. " ) ;
}
} else {
obj1 . setProperty ( WORN ) ;
_vm - > renderMessage ( " Du ziehst den Raumanzug an. " ) ;
}
}
} else if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = HELMET ) ) {
takeObject ( obj1 ) ;
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) > = ENTRANCE ) & & ( _currentRoom - > getId ( ) < = ROGER ) ) {
2017-07-11 05:33:46 +02:00
if ( obj1 . hasProperty ( WORN ) ) {
_vm - > renderMessage ( " Die Luft hier ist atembar,|du ziehst den Anzug aus. " ) ;
_rooms [ AIRLOCK ] - > getObject ( 4 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 5 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 6 ) - > disableProperty ( WORN ) ;
} else {
_vm - > renderMessage ( " Hier drinnen brauchtst du deinen Anzug nicht. " ) ;
}
} else {
if ( obj1 . hasProperty ( WORN ) ) {
if ( airless ( ) ) {
2017-08-04 11:37:31 +02:00
death ( " Den Helm h \204 ttest du|besser angelassen! " ) ;
2017-07-11 05:33:46 +02:00
}
obj1 . disableProperty ( WORN ) ;
_vm - > renderMessage ( " Du ziehst den Helm ab. " ) ;
} else {
r = _rooms [ AIRLOCK ] ;
if ( r - > getObject ( 5 ) - > hasProperty ( WORN ) ) {
obj1 . setProperty ( WORN ) ;
_vm - > renderMessage ( " Du ziehst den Helm auf. " ) ;
} else {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du mu \341 t erst den Anzug anziehen. " ) ;
2017-07-11 05:33:46 +02:00
}
}
}
} else if ( ( verb = = ACTION_USE ) & & ( obj1 . _id = = LIFESUPPORT ) ) {
takeObject ( obj1 ) ;
2017-08-28 13:40:32 +02:00
if ( ( _currentRoom - > getId ( ) > = ENTRANCE ) & & ( _currentRoom - > getId ( ) < = ROGER ) ) {
2017-07-11 05:33:46 +02:00
if ( obj1 . hasProperty ( WORN ) ) {
_vm - > renderMessage ( " Die Luft hier ist atembar,|du ziehst den Anzug aus. " ) ;
_rooms [ AIRLOCK ] - > getObject ( 4 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 5 ) - > disableProperty ( WORN ) ;
_rooms [ AIRLOCK ] - > getObject ( 6 ) - > disableProperty ( WORN ) ;
} else
_vm - > renderMessage ( " Hier drinnen brauchtst du deinen Anzug nicht. " ) ;
} else {
if ( obj1 . hasProperty ( WORN ) ) {
if ( airless ( ) ) {
2017-08-04 11:37:31 +02:00
death ( " Den Versorgungsteil h \204 ttest du|besser nicht abgenommen! " ) ;
2017-07-11 05:33:46 +02:00
}
obj1 . disableProperty ( WORN ) ;
_vm - > renderMessage ( " Du nimmst den Versorgungsteil ab. " ) ;
} else {
r = _rooms [ AIRLOCK ] ;
if ( r - > getObject ( 5 ) - > hasProperty ( WORN ) ) {
obj1 . setProperty ( WORN ) ;
_vm - > renderMessage ( " Du ziehst den Versorgungsteil an. " ) ;
} else {
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Du mu \341 t erst den Anzug anziehen. " ) ;
2017-07-11 05:33:46 +02:00
}
}
}
} else if ( ( verb = = ACTION_WALK ) & & ( obj1 . _id = = BATHROOM_DOOR ) ) {
// *bathroom = current_room;
return false ;
} else if ( ( verb = = ACTION_USE ) & & Object : : combine ( obj1 , obj2 , WIRE , SOCKET ) )
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Die Leitung ist hier unn \201 tz. " ) ;
2017-07-11 05:33:46 +02:00
else if ( ( verb = = ACTION_LOOK ) & & ( obj1 . _id = = BOOK2 ) ) {
_vm - > renderMessage ( " Stark, das ist ja die Fortsetzung zum \" Anhalter \" :| \" Das Restaurant am Ende des Universums \" . " ) ;
mouseWait ( _timer1 ) ;
_vm - > removeMessage ( ) ;
_vm - > renderMessage ( " Moment mal, es ist ein Lesezeichen drin,|auf dem \" Zweiundvierzig \" steht. " ) ;
} else {
return false ;
}
return true ;
}
2017-07-25 02:11:00 +02:00
void GameManager : : handleInput ( ) {
2017-07-17 16:44:08 +02:00
bool validCommand = genericInteract ( _inputVerb , * _inputObject [ 0 ] , * _inputObject [ 1 ] ) ;
if ( ! validCommand )
2017-07-11 05:33:46 +02:00
validCommand = _currentRoom - > interact ( _inputVerb , * _inputObject [ 0 ] , * _inputObject [ 1 ] ) ;
2017-07-17 16:44:08 +02:00
if ( ! validCommand ) {
switch ( _inputVerb ) {
case ACTION_LOOK :
2017-08-24 15:09:38 +02:00
_vm - > renderMessage ( _inputObject [ 0 ] - > _description . c_str ( ) ) ;
2017-07-17 16:44:08 +02:00
break ;
case ACTION_WALK :
if ( _inputObject [ 0 ] - > hasProperty ( CARRIED ) ) {
// You already carry this.
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Das tr \204 gst du doch bei dir. " ) ;
2017-07-17 16:44:08 +02:00
} else if ( ! _inputObject [ 0 ] - > hasProperty ( EXIT ) ) {
// You're already there.
_vm - > renderMessage ( " Du bist doch schon da. " ) ;
2017-07-17 16:53:19 +02:00
} else if ( _inputObject [ 0 ] - > hasProperty ( OPENABLE ) & & ! _inputObject [ 0 ] - > hasProperty ( OPENED ) ) {
2017-07-17 16:44:08 +02:00
// This is closed
_vm - > renderMessage ( " Das ist geschlossen. " ) ;
} else {
changeRoom ( _inputObject [ 0 ] - > _exitRoom ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
break ;
case ACTION_TAKE :
if ( _inputObject [ 0 ] - > hasProperty ( OPENED ) ) {
// You already have that
_vm - > renderMessage ( " Das hast du doch schon. " ) ;
} else if ( _inputObject [ 0 ] - > hasProperty ( UNNECESSARY ) ) {
// You do not need that.
_vm - > renderMessage ( " Das brauchst du nicht. " ) ;
} else if ( ! _inputObject [ 0 ] - > hasProperty ( TAKE ) ) {
// You can't take that.
_vm - > renderMessage ( " Das kannst du nicht nehmen. " ) ;
} else {
takeObject ( * _inputObject [ 0 ] ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
break ;
case ACTION_OPEN :
2017-07-17 16:53:19 +02:00
if ( ! _inputObject [ 0 ] - > hasProperty ( OPENABLE ) ) {
2017-07-17 16:44:08 +02:00
// This can't be opened
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Das l \204 \341 t sich nicht \224 ffnen. " ) ;
2017-07-17 16:44:08 +02:00
} else if ( _inputObject [ 0 ] - > hasProperty ( OPENED ) ) {
// This is already opened.
_vm - > renderMessage ( " Das ist schon offen. " ) ;
} else if ( _inputObject [ 0 ] - > hasProperty ( CLOSED ) ) {
// This is locked.
_vm - > renderMessage ( " Das ist verschlossen. " ) ;
} else {
drawImage ( _inputObject [ 0 ] - > _section ) ;
_inputObject [ 0 ] - > setProperty ( OPENED ) ;
byte i = _inputObject [ 0 ] - > _click ;
_inputObject [ 0 ] - > _click = _inputObject [ 0 ] - > _click2 ;
_inputObject [ 0 ] - > _click2 = i ;
_vm - > playSound ( kAudioDoorOpen ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-17 16:44:08 +02:00
break ;
case ACTION_CLOSE :
2017-07-17 16:53:19 +02:00
if ( ! _inputObject [ 0 ] - > hasProperty ( OPENABLE ) | |
2017-07-17 16:44:08 +02:00
( _inputObject [ 0 ] - > hasProperty ( CLOSED ) & &
_inputObject [ 0 ] - > hasProperty ( OPENED ) ) ) {
// This can't be closed.
2017-08-22 23:17:40 +02:00
_vm - > renderMessage ( " Das l \204 \341 t sich nicht schlie \341 en. " ) ;
2017-07-17 16:44:08 +02:00
} else if ( ! _inputObject [ 0 ] - > hasProperty ( OPENED ) ) {
// This is already closed.
_vm - > renderMessage ( " Das ist schon geschlossen. " ) ;
} else {
drawImage ( invertSection ( _inputObject [ 0 ] - > _section ) ) ;
_inputObject [ 0 ] - > disableProperty ( OPENED ) ;
byte i = _inputObject [ 0 ] - > _click ;
_inputObject [ 0 ] - > _click = _inputObject [ 0 ] - > _click2 ;
_inputObject [ 0 ] - > _click2 = i ;
_vm - > playSound ( kAudioDoorClose ) ;
}
break ;
case ACTION_GIVE :
if ( _inputObject [ 0 ] - > hasProperty ( CARRIED ) ) {
// Better keep it!
_vm - > renderMessage ( " Behalt es lieber! " ) ;
}
break ;
default :
// This is not possible.
_vm - > renderMessage ( " Das geht nicht. " ) ;
}
2017-07-25 02:11:00 +02:00
}
}
2017-07-17 16:44:08 +02:00
2017-07-25 02:11:00 +02:00
void GameManager : : executeRoom ( ) {
2017-07-25 13:50:42 +02:00
if ( _processInput & & ! _vm - > _messageDisplayed & & _guiEnabled ) {
handleInput ( ) ;
resetInputState ( ) ;
}
2017-07-25 02:11:00 +02:00
if ( _guiEnabled ) {
if ( ! _vm - > _messageDisplayed ) {
g_system - > fillScreen ( kColorBlack ) ;
_vm - > renderRoom ( * _currentRoom ) ;
2017-07-11 05:33:46 +02:00
}
2017-07-25 02:11:00 +02:00
drawMapExits ( ) ;
drawInventory ( ) ;
drawStatus ( ) ;
drawCommandBox ( ) ;
}
roomBrightness ( ) ;
if ( ! _currentRoom - > hasSeen ( ) )
_currentRoom - > onEntrance ( ) ;
2017-07-11 05:33:46 +02:00
}
}