2014-10-06 12:50:05 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
/*
* This code is based on Labyrinth of Time code with assistance of
*
* Copyright ( c ) 1993 Terra Nova Development
* Copyright ( c ) 2004 The Wyrmkeep Entertainment Co .
*
*/
2014-12-25 18:13:52 +00:00
# include "lab/lab.h"
2015-12-08 20:10:54 +00:00
2015-12-08 20:19:41 +00:00
# include "lab/dispman.h"
# include "lab/eventman.h"
2015-12-08 20:10:54 +00:00
# include "lab/image.h"
2015-12-08 20:00:50 +00:00
# include "lab/labsets.h"
2015-12-08 19:36:05 +00:00
# include "lab/music.h"
2015-12-08 20:47:36 +00:00
# include "lab/processroom.h"
2015-12-08 20:10:54 +00:00
# include "lab/resource.h"
2015-12-08 20:00:50 +00:00
# include "lab/utils.h"
2014-10-06 12:50:05 +00:00
namespace Lab {
/*---------------------------------------------------------------------------*/
/*------------------------------ The Map stuff ------------------------------*/
/*---------------------------------------------------------------------------*/
2015-12-08 15:08:04 +00:00
enum MapFloor {
kFloorNone ,
kFloorLower ,
kFloorMiddle ,
kFloorUpper ,
kFloorMedMaze ,
kFloorHedgeMaze ,
kFloorSurMaze ,
kFloorCarnival
} ;
2014-10-06 12:50:05 +00:00
2015-12-08 14:53:30 +00:00
void LabEngine : : loadMapData ( ) {
2015-12-09 17:09:46 +00:00
Common : : File * mapImages = _resource - > openDataFile ( " P:MapImage " ) ;
2015-12-13 21:51:23 +00:00
_imgMap = new Image ( mapImages , this ) ;
_imgRoom = new Image ( mapImages , this ) ;
_imgUpArrowRoom = new Image ( mapImages , this ) ;
_imgDownArrowRoom = new Image ( mapImages , this ) ;
_imgHRoom = new Image ( mapImages , this ) ;
_imgVRoom = new Image ( mapImages , this ) ;
_imgMaze = new Image ( mapImages , this ) ;
_imgHugeMaze = new Image ( mapImages , this ) ;
2015-12-23 20:59:59 +00:00
_imgMapX [ kDirectionNorth ] = new Image ( mapImages , this ) ;
_imgMapX [ kDirectionEast ] = new Image ( mapImages , this ) ;
_imgMapX [ kDirectionSouth ] = new Image ( mapImages , this ) ;
_imgMapX [ kDirectionWest ] = new Image ( mapImages , this ) ;
2015-12-13 21:51:23 +00:00
_imgPath = new Image ( mapImages , this ) ;
_imgBridge = new Image ( mapImages , this ) ;
2015-12-24 17:12:02 +00:00
_mapButtonList . push_back ( _event - > createButton ( 8 , _utils - > vgaScaleY ( 105 ) , 0 , Common : : KEYCODE_ESCAPE , new Image ( mapImages , this ) , new Image ( mapImages , this ) ) ) ; // back
_mapButtonList . push_back ( _event - > createButton ( 55 , _utils - > vgaScaleY ( 105 ) , 1 , Common : : KEYCODE_UP , new Image ( mapImages , this ) , new Image ( mapImages , this ) ) ) ; // up
_mapButtonList . push_back ( _event - > createButton ( 101 , _utils - > vgaScaleY ( 105 ) , 2 , Common : : KEYCODE_DOWN , new Image ( mapImages , this ) , new Image ( mapImages , this ) ) ) ; // down
2014-10-06 12:50:05 +00:00
2015-12-03 13:06:45 +00:00
delete mapImages ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
Common : : File * mapFile = _resource - > openDataFile ( " Lab:Maps " , MKTAG ( ' M ' , ' A ' , ' P ' , ' 0 ' ) ) ;
2015-12-27 19:12:41 +00:00
updateEvents ( ) ;
2015-12-09 17:09:46 +00:00
_maxRooms = mapFile - > readUint16LE ( ) ;
2015-12-21 00:49:41 +00:00
_maps = new MapData [ _maxRooms + 1 ] ; // will be freed when the user exits the map
2015-12-26 16:07:01 +00:00
for ( int i = 0 ; i < = _maxRooms ; i + + ) {
2015-12-09 17:09:46 +00:00
_maps [ i ] . _x = mapFile - > readUint16LE ( ) ;
_maps [ i ] . _y = mapFile - > readUint16LE ( ) ;
_maps [ i ] . _pageNumber = mapFile - > readUint16LE ( ) ;
2015-12-27 00:05:43 +00:00
_maps [ i ] . _specialID = ( SpecialRoom ) mapFile - > readUint16LE ( ) ;
2015-12-09 17:09:46 +00:00
_maps [ i ] . _mapFlags = mapFile - > readUint32LE ( ) ;
2015-10-13 22:51:18 +00:00
}
2014-10-06 12:50:05 +00:00
2015-10-13 22:51:18 +00:00
delete mapFile ;
2014-10-06 12:50:05 +00:00
}
2015-12-08 14:53:30 +00:00
void LabEngine : : freeMapData ( ) {
2015-12-13 17:36:56 +00:00
_event - > freeButtonList ( & _mapButtonList ) ;
2015-12-06 20:50:41 +00:00
2015-12-09 17:09:46 +00:00
delete _imgMap ;
delete _imgRoom ;
delete _imgUpArrowRoom ;
delete _imgDownArrowRoom ;
delete _imgBridge ;
delete _imgHRoom ;
delete _imgVRoom ;
delete _imgMaze ;
delete _imgHugeMaze ;
delete _imgPath ;
2015-12-13 18:29:58 +00:00
for ( int i = 0 ; i < 4 ; i + + )
delete _imgMapX [ i ] ;
2015-12-10 10:39:32 +00:00
delete [ ] _maps ;
2015-12-09 17:09:46 +00:00
_imgMap = nullptr ;
_imgRoom = nullptr ;
_imgUpArrowRoom = nullptr ;
_imgDownArrowRoom = nullptr ;
_imgBridge = nullptr ;
_imgHRoom = nullptr ;
_imgVRoom = nullptr ;
_imgMaze = nullptr ;
_imgHugeMaze = nullptr ;
_imgPath = nullptr ;
2015-12-13 18:29:58 +00:00
for ( int i = 0 ; i < 4 ; i + + )
_imgMapX [ i ] = nullptr ;
2015-12-09 17:09:46 +00:00
_maps = nullptr ;
2015-10-13 22:51:18 +00:00
}
2014-10-06 12:50:05 +00:00
2015-12-09 10:49:10 +00:00
Common : : Rect LabEngine : : roomCoords ( uint16 curRoom ) {
Image * curRoomImg = nullptr ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
switch ( _maps [ curRoom ] . _specialID ) {
2015-12-27 00:05:43 +00:00
case kNormalRoom :
case kUpArrowRoom :
case kDownArrowRoom :
2015-12-09 17:09:46 +00:00
curRoomImg = _imgRoom ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kBridgeRoom :
2015-12-09 17:09:46 +00:00
curRoomImg = _imgBridge ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kVerticalCorridor :
2015-12-09 17:09:46 +00:00
curRoomImg = _imgVRoom ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kHorizontalCorridor :
2015-12-09 17:09:46 +00:00
curRoomImg = _imgHRoom ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-04 20:52:55 +00:00
default :
// Some rooms (like the map) do not have an image
break ;
2014-10-06 12:50:05 +00:00
}
2015-12-03 12:30:32 +00:00
2015-12-09 17:09:46 +00:00
int x1 = _utils - > mapScaleX ( _maps [ curRoom ] . _x ) ;
int y1 = _utils - > mapScaleY ( _maps [ curRoom ] . _y ) ;
2015-12-09 10:49:10 +00:00
int x2 = x1 ;
int y2 = y1 ;
2015-12-04 20:52:55 +00:00
if ( curRoomImg ) {
2015-12-09 10:49:10 +00:00
x2 + = curRoomImg - > _width ;
y2 + = curRoomImg - > _height ;
2015-12-04 20:52:55 +00:00
}
2015-12-09 10:49:10 +00:00
return Common : : Rect ( x1 , y1 , x2 , y2 ) ;
2014-10-06 12:50:05 +00:00
}
2015-12-09 17:09:46 +00:00
void LabEngine : : drawRoomMap ( uint16 curRoom , bool drawMarkFl ) {
2015-12-09 10:49:10 +00:00
uint16 drawX , drawY , offset ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
uint16 x = _utils - > mapScaleX ( _maps [ curRoom ] . _x ) ;
uint16 y = _utils - > mapScaleY ( _maps [ curRoom ] . _y ) ;
uint32 flags = _maps [ curRoom ] . _mapFlags ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
switch ( _maps [ curRoom ] . _specialID ) {
2015-12-27 00:05:43 +00:00
case kNormalRoom :
case kUpArrowRoom :
case kDownArrowRoom :
if ( _maps [ curRoom ] . _specialID = = kNormalRoom )
2015-12-09 17:09:46 +00:00
_imgRoom - > drawImage ( x , y ) ;
2015-12-27 00:05:43 +00:00
else if ( _maps [ curRoom ] . _specialID = = kDownArrowRoom )
2015-12-09 17:09:46 +00:00
_imgDownArrowRoom - > drawImage ( x , y ) ;
2014-10-06 12:50:05 +00:00
else
2015-12-09 17:09:46 +00:00
_imgUpArrowRoom - > drawImage ( x , y ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgRoom - > _width - _imgPath - > _width ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( ( kDoorLeftNorth & flags ) & & ( y > = _imgPath - > _height ) )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y - _imgPath - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftSouth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y + _imgRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgRoom - > _height - _imgPath - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftEast & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + _imgRoom - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftWest & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - _imgPath - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-13 18:29:58 +00:00
drawX = x + ( _imgRoom - > _width - _imgMapX [ _direction ] - > _width ) / 2 ;
drawY = y + ( _imgRoom - > _height - _imgMapX [ _direction ] - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kBridgeRoom :
2015-12-09 17:09:46 +00:00
_imgBridge - > drawImage ( x , y ) ;
2014-10-06 12:50:05 +00:00
2015-12-13 18:29:58 +00:00
drawX = x + ( _imgBridge - > _width - _imgMapX [ _direction ] - > _width ) / 2 ;
drawY = y + ( _imgBridge - > _height - _imgMapX [ _direction ] - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kVerticalCorridor :
2015-12-09 17:09:46 +00:00
_imgVRoom - > drawImage ( x , y ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgVRoom - > _width - _imgPath - > _width ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftNorth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y - _imgPath - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftSouth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y + _imgVRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgRoom - > _height - _imgPath - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftEast & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + _imgVRoom - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftWest & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - _imgPath - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorBottomEast & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + _imgVRoom - > _width , y - offset - _imgPath - > _height + _imgVRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorBottomWest & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - _imgPath - > _width , y - offset - _imgPath - > _height + _imgVRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgVRoom - > _height - _imgPath - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorMiddleEast & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + _imgVRoom - > _width , y - offset - _imgPath - > _height + _imgVRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorMiddleWest & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - _imgPath - > _width , y - offset - _imgPath - > _height + _imgVRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-13 18:29:58 +00:00
drawX = x + ( _imgVRoom - > _width - _imgMapX [ _direction ] - > _width ) / 2 ;
drawY = y + ( _imgVRoom - > _height - _imgMapX [ _direction ] - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
break ;
2015-12-27 00:05:43 +00:00
case kHorizontalCorridor :
2015-12-09 17:09:46 +00:00
_imgHRoom - > drawImage ( x , y ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgRoom - > _width - _imgPath - > _width ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftNorth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y - _imgPath - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftSouth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + offset , y + _imgRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorRightNorth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - offset - _imgPath - > _width + _imgHRoom - > _width , y - _imgPath - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorRightSouth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - offset - _imgPath - > _width + _imgHRoom - > _width , y + _imgRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgHRoom - > _width - _imgPath - > _width ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorMiddleNorth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - offset - _imgPath - > _width + _imgHRoom - > _width , y - _imgPath - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorMiddleSouth & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - offset - _imgPath - > _width + _imgHRoom - > _width , y + _imgRoom - > _height ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
offset = ( _imgRoom - > _height - _imgPath - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftEast & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x + _imgHRoom - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 20:59:59 +00:00
if ( kDoorLeftWest & flags )
2015-12-09 17:09:46 +00:00
_imgPath - > drawImage ( x - _imgPath - > _width , y + offset ) ;
2014-10-06 12:50:05 +00:00
2015-12-13 18:29:58 +00:00
drawX = x + ( _imgHRoom - > _width - _imgMapX [ _direction ] - > _width ) / 2 ;
drawY = y + ( _imgHRoom - > _height - _imgMapX [ _direction ] - > _height ) / 2 ;
2014-10-06 12:50:05 +00:00
break ;
default :
return ;
}
2015-12-09 10:49:10 +00:00
if ( drawMarkFl )
2015-12-13 18:29:58 +00:00
_imgMapX [ _direction ] - > drawImage ( drawX , drawY ) ;
2014-10-06 12:50:05 +00:00
}
2015-12-12 16:24:47 +00:00
bool LabEngine : : floorVisited ( uint16 floorNum ) {
2015-12-23 19:44:48 +00:00
for ( int i = 0 ; i < _maxRooms ; i + + ) {
2015-12-09 17:09:46 +00:00
if ( ( _maps [ i ] . _pageNumber = = floorNum ) & & _roomsFound - > in ( i ) & & _maps [ i ] . _x )
2014-10-06 12:50:05 +00:00
return true ;
}
return false ;
}
2015-12-12 16:24:47 +00:00
uint16 LabEngine : : getUpperFloor ( uint16 floorNum ) {
2015-12-16 16:03:42 +00:00
if ( ( floorNum = = kFloorCarnival ) | | ( floorNum = = kFloorNone ) )
2015-12-12 16:24:47 +00:00
return kFloorNone ;
2015-12-23 19:44:48 +00:00
for ( int i = floorNum ; i < kFloorCarnival ; i + + )
2015-12-12 16:24:47 +00:00
if ( floorVisited ( i + 1 ) )
return i + 1 ;
2015-12-09 05:07:34 +00:00
2015-12-12 16:24:47 +00:00
return kFloorNone ;
2014-10-06 12:50:05 +00:00
}
2015-12-12 16:24:47 +00:00
uint16 LabEngine : : getLowerFloor ( uint16 floorNum ) {
2015-12-16 16:03:42 +00:00
if ( ( floorNum = = kFloorLower ) | | ( floorNum = = kFloorNone ) )
2015-12-12 16:24:47 +00:00
return kFloorNone ;
2014-10-06 12:50:05 +00:00
2015-12-23 19:44:48 +00:00
for ( int i = floorNum ; i > kFloorLower ; i - - )
2015-12-12 16:24:47 +00:00
if ( floorVisited ( i - 1 ) )
return i - 1 ;
2015-12-09 05:07:34 +00:00
2015-12-12 16:24:47 +00:00
return kFloorNone ;
2014-10-06 12:50:05 +00:00
}
2015-12-24 17:54:27 +00:00
void LabEngine : : drawMap ( uint16 curRoom , uint16 curMsg , uint16 floorNum , bool fadeIn ) {
2015-11-29 17:10:06 +00:00
_event - > mouseHide ( ) ;
2014-10-06 12:50:05 +00:00
2015-12-24 10:08:51 +00:00
_graphics - > rectFill ( 0 , 0 , _graphics - > _screenWidth - 1 , _graphics - > _screenHeight - 1 , 0 ) ;
2015-12-09 17:09:46 +00:00
_imgMap - > drawImage ( 0 , 0 ) ;
2015-12-13 17:36:56 +00:00
_event - > drawButtonList ( & _mapButtonList ) ;
2014-10-06 12:50:05 +00:00
2015-12-23 19:44:48 +00:00
for ( int i = 1 ; i < = _maxRooms ; i + + ) {
2015-12-09 17:09:46 +00:00
if ( ( _maps [ i ] . _pageNumber = = floorNum ) & & _roomsFound - > in ( i ) & & _maps [ i ] . _x ) {
2015-12-09 05:07:34 +00:00
drawRoomMap ( i , ( bool ) ( i = = curRoom ) ) ;
2014-10-06 12:50:05 +00:00
}
}
2015-12-27 19:12:41 +00:00
updateEvents ( ) ;
2015-12-26 10:43:18 +00:00
2015-12-08 10:27:34 +00:00
// Makes sure the X is drawn in corridors
// NOTE: this here on purpose just in case there's some weird
// condition, like the surreal maze where there are no rooms
2015-12-09 17:09:46 +00:00
if ( ( _maps [ curRoom ] . _pageNumber = = floorNum ) & & _roomsFound - > in ( curRoom ) & & _maps [ curRoom ] . _x )
2015-12-09 05:07:34 +00:00
drawRoomMap ( curRoom , true ) ;
2015-12-18 01:31:07 +00:00
_event - > toggleButton ( _event - > getButton ( 1 ) , 12 , ( getUpperFloor ( floorNum ) ! = kFloorNone ) ) ; // up button
_event - > toggleButton ( _event - > getButton ( 2 ) , 12 , ( getLowerFloor ( floorNum ) ! = kFloorNone ) ) ; // down button
2014-10-06 12:50:05 +00:00
2015-10-13 22:51:18 +00:00
// Labyrinth specific code
2015-12-09 17:09:46 +00:00
if ( floorNum = = kFloorLower ) {
2015-12-12 16:24:47 +00:00
if ( floorVisited ( kFloorSurMaze ) )
2015-12-09 17:09:46 +00:00
_imgMaze - > drawImage ( _utils - > mapScaleX ( 538 ) , _utils - > mapScaleY ( 277 ) ) ;
} else if ( floorNum = = kFloorMiddle ) {
2015-12-12 16:24:47 +00:00
if ( floorVisited ( kFloorCarnival ) )
2015-12-09 17:09:46 +00:00
_imgMaze - > drawImage ( _utils - > mapScaleX ( 358 ) , _utils - > mapScaleY ( 72 ) ) ;
2014-10-06 12:50:05 +00:00
2015-12-12 16:24:47 +00:00
if ( floorVisited ( kFloorMedMaze ) )
2015-12-09 17:09:46 +00:00
_imgMaze - > drawImage ( _utils - > mapScaleX ( 557 ) , _utils - > mapScaleY ( 325 ) ) ;
} else if ( floorNum = = kFloorUpper ) {
2015-12-12 16:24:47 +00:00
if ( floorVisited ( kFloorHedgeMaze ) )
2015-12-09 17:09:46 +00:00
_imgHugeMaze - > drawImage ( _utils - > mapScaleX ( 524 ) , _utils - > mapScaleY ( 97 ) ) ;
} else if ( floorNum = = kFloorSurMaze ) {
2015-12-17 17:35:53 +00:00
Common : : Rect textRect = Common : : Rect ( _utils - > mapScaleX ( 360 ) , 0 , _utils - > mapScaleX ( 660 ) , _utils - > mapScaleY ( 450 ) ) ;
2015-12-17 18:05:02 +00:00
const char * textPtr = _resource - > getStaticText ( kTextSurmazeMessage ) . c_str ( ) ;
_graphics - > flowText ( _msgFont , 0 , 7 , 0 , true , true , true , true , textRect , textPtr ) ;
2014-10-06 12:50:05 +00:00
}
2015-12-09 17:09:46 +00:00
if ( ( floorNum > = kFloorLower ) & & ( floorNum < = kFloorCarnival ) ) {
2015-12-17 18:05:02 +00:00
const char * textPrt = _resource - > getStaticText ( floorNum - 1 ) . c_str ( ) ;
_graphics - > flowText ( _msgFont , 0 , 5 , 3 , true , true , true , true , _utils - > vgaRectScale ( 14 , 75 , 134 , 97 ) , textPrt ) ;
2015-12-05 20:35:38 +00:00
}
2014-10-06 12:50:05 +00:00
2015-12-21 00:27:50 +00:00
if ( ! _rooms [ curMsg ] . _roomMsg . empty ( ) )
2015-12-19 00:12:42 +00:00
_graphics - > flowText ( _msgFont , 0 , 5 , 3 , true , true , true , true , _utils - > vgaRectScale ( 14 , 148 , 134 , 186 ) , _rooms [ curMsg ] . _roomMsg . c_str ( ) ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
if ( fadeIn )
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2014-10-06 12:50:05 +00:00
2015-11-29 17:10:06 +00:00
_event - > mouseShow ( ) ;
2014-10-06 12:50:05 +00:00
}
2015-12-09 05:07:34 +00:00
void LabEngine : : processMap ( uint16 curRoom ) {
2015-12-15 23:07:31 +00:00
byte place = 1 ;
2015-12-09 17:09:46 +00:00
uint16 curMsg = curRoom ;
uint16 curFloor = _maps [ curRoom ] . _pageNumber ;
2014-10-06 12:50:05 +00:00
while ( 1 ) {
2015-12-08 10:27:34 +00:00
// Make sure we check the music at least after every message
2015-12-27 19:12:41 +00:00
updateEvents ( ) ;
2015-12-13 13:37:39 +00:00
IntuiMessage * msg = _event - > getMsg ( ) ;
2015-12-24 00:21:40 +00:00
if ( shouldQuit ( ) ) {
2015-12-15 23:07:31 +00:00
_quitLab = true ;
return ;
}
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
if ( ! msg ) {
2015-12-27 19:12:41 +00:00
updateEvents ( ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 05:07:34 +00:00
byte newcolor [ 3 ] ;
2014-10-06 12:50:05 +00:00
if ( place < = 14 ) {
newcolor [ 0 ] = 14 < < 2 ;
newcolor [ 1 ] = place < < 2 ;
newcolor [ 2 ] = newcolor [ 1 ] ;
} else {
newcolor [ 0 ] = 14 < < 2 ;
newcolor [ 1 ] = ( 28 - place ) < < 2 ;
newcolor [ 2 ] = newcolor [ 1 ] ;
}
2015-11-29 22:34:35 +00:00
waitTOF ( ) ;
2015-12-06 13:36:49 +00:00
_graphics - > writeColorRegs ( newcolor , 1 , 1 ) ;
2015-11-29 17:10:06 +00:00
_event - > updateMouse ( ) ;
2015-11-29 22:34:35 +00:00
waitTOF ( ) ;
2014-10-06 12:50:05 +00:00
place + + ;
if ( place > = 28 )
place = 1 ;
} else {
2015-12-09 05:07:34 +00:00
uint32 msgClass = msg - > _msgClass ;
uint16 msgCode = msg - > _code ;
2015-12-17 22:58:36 +00:00
uint16 mouseX = msg - > _mouse . x ;
uint16 mouseY = msg - > _mouse . y ;
2015-12-09 05:07:34 +00:00
2015-12-17 22:41:24 +00:00
if ( ( msgClass = = kMessageRightClick ) | | ( ( msgClass = = kMessageRawKey ) & & ( msgCode = = Common : : KEYCODE_ESCAPE ) ) )
2014-10-06 12:50:05 +00:00
return ;
2015-12-17 22:41:24 +00:00
if ( msgClass = = kMessageButtonUp ) {
if ( msgCode = = 0 ) {
2015-12-08 10:27:34 +00:00
// Quit menu button
2014-10-06 12:50:05 +00:00
return ;
2015-12-17 22:41:24 +00:00
} else if ( msgCode = = 1 ) {
2015-12-08 10:27:34 +00:00
// Up arrow
2015-12-12 16:24:47 +00:00
uint16 upperFloor = getUpperFloor ( curFloor ) ;
if ( upperFloor ! = kFloorNone ) {
curFloor = upperFloor ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-12 16:24:47 +00:00
}
2015-12-17 22:41:24 +00:00
} else if ( msgCode = = 2 ) {
2015-12-08 10:27:34 +00:00
// Down arrow
2015-12-12 16:24:47 +00:00
uint16 lowerFloor = getLowerFloor ( curFloor ) ;
if ( lowerFloor ! = kFloorNone ) {
curFloor = lowerFloor ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-12 16:24:47 +00:00
}
2014-10-06 12:50:05 +00:00
}
2015-12-17 22:41:24 +00:00
} else if ( msgClass = = kMessageLeftClick ) {
2015-12-18 01:15:44 +00:00
if ( ( curFloor = = kFloorLower ) & & _utils - > mapRectScale ( 538 , 277 , 633 , 352 ) . contains ( mouseX , mouseY )
2015-12-12 16:24:47 +00:00
& & floorVisited ( kFloorSurMaze ) ) {
2015-12-09 05:07:34 +00:00
curFloor = kFloorSurMaze ;
2014-10-06 12:50:05 +00:00
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-18 01:15:44 +00:00
} else if ( ( curFloor = = kFloorMiddle ) & & _utils - > mapRectScale ( 358 , 71 , 452 , 147 ) . contains ( mouseX , mouseY )
& & floorVisited ( kFloorCarnival ) ) {
2015-12-09 05:07:34 +00:00
curFloor = kFloorCarnival ;
2014-10-06 12:50:05 +00:00
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-18 01:15:44 +00:00
} else if ( ( curFloor = = kFloorMiddle ) & & _utils - > mapRectScale ( 557 , 325 , 653 , 401 ) . contains ( mouseX , mouseY )
& & floorVisited ( kFloorMedMaze ) ) {
2015-12-09 05:07:34 +00:00
curFloor = kFloorMedMaze ;
2014-10-06 12:50:05 +00:00
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-18 01:15:44 +00:00
} else if ( ( curFloor = = kFloorUpper ) & & _utils - > mapRectScale ( 524 , 97 , 645 , 207 ) . contains ( mouseX , mouseY )
& & floorVisited ( kFloorHedgeMaze ) ) {
2015-12-09 05:07:34 +00:00
curFloor = kFloorHedgeMaze ;
2014-10-06 12:50:05 +00:00
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curMsg , curFloor , false ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( true ) ;
2015-12-09 10:30:12 +00:00
} else if ( mouseX > _utils - > mapScaleX ( 314 ) ) {
2015-12-09 05:07:34 +00:00
uint16 oldMsg = curMsg ;
2015-12-09 10:49:10 +00:00
Common : : Rect curCoords ;
2014-10-06 12:50:05 +00:00
2015-12-23 19:44:48 +00:00
for ( int i = 1 ; i < = _maxRooms ; i + + ) {
2015-12-09 10:49:10 +00:00
curCoords = roomCoords ( i ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
if ( ( _maps [ i ] . _pageNumber = = curFloor )
2015-12-09 10:49:10 +00:00
& & _roomsFound - > in ( i ) & & curCoords . contains ( Common : : Point ( mouseX , mouseY ) ) ) {
2015-12-09 05:07:34 +00:00
curMsg = i ;
2014-10-06 12:50:05 +00:00
}
}
2015-12-09 05:07:34 +00:00
if ( oldMsg ! = curMsg ) {
2015-12-21 00:27:50 +00:00
if ( ! _rooms [ curMsg ] . _roomMsg . empty ( ) )
2015-12-09 05:07:34 +00:00
_resource - > readViews ( curMsg ) ;
2014-10-06 12:50:05 +00:00
2015-12-19 00:12:42 +00:00
const char * sptr ;
if ( ( sptr = _rooms [ curMsg ] . _roomMsg . c_str ( ) ) ) {
2015-11-29 17:10:06 +00:00
_event - > mouseHide ( ) ;
2015-12-24 10:08:51 +00:00
_graphics - > rectFillScaled ( 13 , 148 , 135 , 186 , 3 ) ;
2015-12-17 17:46:46 +00:00
_graphics - > flowText ( _msgFont , 0 , 5 , 3 , true , true , true , true , _utils - > vgaRectScale ( 14 , 148 , 134 , 186 ) , sptr ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
if ( _maps [ oldMsg ] . _pageNumber = = curFloor )
2015-12-09 05:07:34 +00:00
drawRoomMap ( oldMsg , ( bool ) ( oldMsg = = curRoom ) ) ;
2014-10-06 12:50:05 +00:00
2015-12-09 10:49:10 +00:00
curCoords = roomCoords ( curMsg ) ;
int right = ( curCoords . left + curCoords . right ) / 2 ;
int left = right - 1 ;
int top , bottom ;
top = bottom = ( curCoords . top + curCoords . bottom ) / 2 ;
2014-10-06 12:50:05 +00:00
2015-12-09 17:09:46 +00:00
if ( ( curMsg ! = curRoom ) & & ( _maps [ curMsg ] . _pageNumber = = curFloor ) ) {
2015-12-24 10:08:51 +00:00
_graphics - > rectFill ( left , top , right , bottom , 1 ) ;
2014-10-06 12:50:05 +00:00
}
2015-11-29 17:10:06 +00:00
_event - > mouseShow ( ) ;
2014-10-06 12:50:05 +00:00
}
}
}
}
2015-12-04 12:32:08 +00:00
_graphics - > screenUpdate ( ) ;
2014-10-06 12:50:05 +00:00
}
}
}
2015-12-09 05:07:34 +00:00
void LabEngine : : doMap ( uint16 curRoom ) {
static uint16 amigaMapPalette [ ] = {
2015-12-06 17:16:26 +00:00
0x0BA8 , 0x0C11 , 0x0A74 , 0x0076 ,
0x0A96 , 0x0DCB , 0x0CCA , 0x0222 ,
0x0444 , 0x0555 , 0x0777 , 0x0999 ,
0x0AAA , 0x0ED0 , 0x0EEE , 0x0694
} ;
2015-12-14 07:59:16 +00:00
_graphics - > _fadePalette = amigaMapPalette ;
2014-10-06 12:50:05 +00:00
2015-12-27 19:12:41 +00:00
updateEvents ( ) ;
2014-10-06 12:50:05 +00:00
loadMapData ( ) ;
2015-12-04 12:32:08 +00:00
_graphics - > blackAllScreen ( ) ;
2015-12-13 17:36:56 +00:00
_event - > attachButtonList ( & _mapButtonList ) ;
2015-12-24 17:54:27 +00:00
drawMap ( curRoom , curRoom , _maps [ curRoom ] . _pageNumber , true ) ;
2015-11-29 17:10:06 +00:00
_event - > mouseShow ( ) ;
2015-12-04 12:32:08 +00:00
_graphics - > screenUpdate ( ) ;
2015-12-09 05:07:34 +00:00
processMap ( curRoom ) ;
2015-12-13 17:36:56 +00:00
_event - > attachButtonList ( nullptr ) ;
2015-12-23 22:41:53 +00:00
_graphics - > fade ( false ) ;
2015-12-04 12:32:08 +00:00
_graphics - > blackAllScreen ( ) ;
2015-11-29 17:10:06 +00:00
_event - > mouseHide ( ) ;
2015-12-24 10:08:51 +00:00
_graphics - > rectFill ( 0 , 0 , _graphics - > _screenWidth - 1 , _graphics - > _screenHeight - 1 , 0 ) ;
2015-10-13 22:51:18 +00:00
freeMapData ( ) ;
2015-12-04 12:32:08 +00:00
_graphics - > blackAllScreen ( ) ;
2015-11-29 17:10:06 +00:00
_event - > mouseShow ( ) ;
2015-12-04 12:32:08 +00:00
_graphics - > screenUpdate ( ) ;
2014-10-06 12:50:05 +00:00
}
} // End of namespace Lab