2013-07-11 17:36:59 +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 .
2014-02-18 02:34:18 +01:00
*
2013-07-11 17:36:59 +02:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2014-02-18 02:34:18 +01:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
2013-07-11 17:36:59 +02:00
* GNU General Public License for more details .
2014-02-18 02:34:18 +01:00
*
2013-07-11 17:36:59 +02:00
* 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-07 09:00:34 +02:00
# ifndef AVALANCHE_GRAPHICS_H
# define AVALANCHE_GRAPHICS_H
2013-07-11 17:36:59 +02:00
2013-10-04 20:50:28 +02:00
# include "avalanche/enums.h"
2013-07-16 13:03:22 +02:00
# include "common/file.h"
2013-09-19 21:21:53 +02:00
# include "common/rect.h"
2013-07-11 17:36:59 +02:00
# include "graphics/surface.h"
namespace Avalanche {
class AvalancheEngine ;
2013-10-15 01:07:26 +02:00
class AnimationType ;
2013-09-29 17:54:03 +02:00
struct SpriteType ;
2014-02-04 12:06:11 +01:00
struct ChunkBlock ;
2013-07-11 17:36:59 +02:00
2013-09-21 13:10:14 +02:00
typedef byte FontType [ 256 ] [ 16 ] ;
typedef byte ManiType [ 2049 ] ;
2013-09-05 13:20:03 +02:00
typedef byte SilType [ 51 ] [ 11 ] ; // 35, 4
2013-07-18 15:13:23 +02:00
2013-10-02 23:39:18 +02:00
struct MouseHotspotType {
2013-10-01 23:31:31 +02:00
int16 _horizontal , _vertical ;
} ;
2013-09-29 17:54:03 +02:00
class GraphicManager {
2013-07-11 17:36:59 +02:00
public :
2013-10-01 23:31:31 +02:00
static const MouseHotspotType kMouseHotSpots [ 9 ] ;
2013-10-01 07:43:21 +02:00
Color _talkBackgroundColor , _talkFontColor ;
2013-07-30 20:33:05 +02:00
2013-09-29 17:54:03 +02:00
GraphicManager ( AvalancheEngine * vm ) ;
~ GraphicManager ( ) ;
2013-09-05 13:20:03 +02:00
void init ( ) ;
2013-10-04 17:40:24 +02:00
void loadDigits ( ) ;
2013-09-28 10:00:23 +02:00
void loadMouse ( byte which ) ;
2013-09-28 09:43:28 +02:00
2014-02-18 13:53:20 +01:00
void drawRectangle ( Common : : Rect rect , Color color ) ;
2014-02-18 14:05:03 +01:00
void drawFilledRectangle ( Common : : Rect rect , Color color ) ;
void blackOutScreen ( ) ;
2014-02-05 13:36:10 +01:00
void drawDot ( int x , int y , Color color ) ;
2014-01-15 17:59:53 +01:00
void drawLine ( int x1 , int y1 , int x2 , int y2 , int penX , int penY , Color color ) ;
2013-09-29 21:28:43 +02:00
Common : : Point drawScreenArc ( int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
2013-09-28 15:08:41 +02:00
void drawPieSlice ( int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
void drawTriangle ( Common : : Point * p , Color color ) ;
void drawNormalText ( const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
void drawScrollText ( const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
2013-09-28 09:43:28 +02:00
void drawDigit ( int index , int x , int y ) ;
void drawDirection ( int index , int x , int y ) ;
2013-09-28 15:08:41 +02:00
void drawScrollShadow ( int16 x1 , int16 y1 , int16 x2 , int16 y2 ) ;
void drawShadowBox ( int16 x1 , int16 y1 , int16 x2 , int16 y2 , Common : : String text ) ;
2013-09-28 17:09:50 +02:00
void drawScroll ( int mx , int lx , int my , int ly ) ;
2013-09-29 19:03:52 +02:00
void drawMenuBar ( Color color ) ;
2013-09-29 11:26:21 +02:00
void drawSpeedBar ( int speed ) ;
2013-09-29 17:54:03 +02:00
void drawBackgroundSprite ( int16 x , int16 y , SpriteType & sprite ) ;
2013-09-29 19:03:52 +02:00
void drawMenuBlock ( int x1 , int y1 , int x2 , int y2 , Color color ) ;
2013-09-29 19:49:57 +02:00
void drawMenuItem ( int x1 , int y1 , int x2 , int y2 ) ;
2013-09-29 19:03:52 +02:00
void wipeChar ( int x , int y , Color color ) ;
void drawChar ( byte ander , int x , int y , Color color ) ;
2013-09-29 22:19:12 +02:00
void drawDebugLines ( ) ;
2013-09-29 11:26:21 +02:00
2013-12-17 08:32:19 +01:00
// For the mini-game "Nim".
2013-12-21 19:02:17 +01:00
void nimLoad ( ) ;
void nimDrawStone ( int x , int y ) ;
void nimDrawInitials ( ) ;
void nimDrawLogo ( ) ;
2013-12-21 19:09:57 +01:00
void nimFree ( ) ;
2013-12-17 08:32:19 +01:00
2014-01-15 20:03:06 +01:00
// Used in wobble()
void shiftScreen ( ) ;
2014-02-10 10:49:02 +01:00
// Used in winning()
void drawWinningPic ( ) ;
2014-02-04 08:58:48 +01:00
// Ghostroom's functions:
2014-04-12 21:03:17 +02:00
void ghostDrawMonster ( byte * * * picture , uint16 destX , int16 destY , MonsterType type ) ;
2014-02-04 19:54:41 +01:00
Graphics : : Surface ghostLoadPicture ( Common : : File & file , Common : : Point & coord ) ;
2014-02-04 10:30:41 +01:00
void ghostDrawPicture ( const Graphics : : Surface & picture , uint16 destX , uint16 destY ) ;
2014-02-04 18:51:13 +01:00
void ghostDrawBackgroundItems ( Common : : File & file ) ;
2014-02-04 08:58:48 +01:00
2014-02-11 23:10:16 +01:00
// Help's function:
void helpDrawButton ( int y , byte which ) ;
2014-02-14 04:55:36 +01:00
void helpDrawHighlight ( byte which , Color color ) ;
2014-04-12 19:51:10 +02:00
void helpDrawBigText ( const Common : : String text , int16 x , int16 y , Color color ) ;
2014-02-11 23:10:16 +01:00
2014-02-14 17:12:00 +01:00
// Shoot em' up's functions:
void seuDrawTitle ( ) ;
2014-02-16 15:24:13 +01:00
void seuLoad ( ) ;
void seuFree ( ) ;
void seuDrawPicture ( int x , int y , byte which ) ;
2014-02-19 17:55:32 +01:00
void seuDrawCameo ( int destX , int destY , byte w1 , byte w2 ) ;
2014-02-21 16:22:37 +01:00
uint16 seuGetPicWidth ( int which ) ;
uint16 seuGetPicHeight ( int which ) ;
2014-02-14 17:12:00 +01:00
2014-03-04 12:01:41 +01:00
// Main Menu's functions:
// The main menu uses a different screen height (350) from the game itself (200 * 2)
// so it needs it's own graphic functions on that matter.
void menuRefreshScreen ( ) ;
void menuInitialize ( ) ;
2014-03-06 23:01:53 +01:00
void menuFree ( ) ;
void menuRestoreScreen ( ) ;
2014-03-04 15:25:26 +01:00
void menuLoadPictures ( ) ;
2014-03-05 18:28:15 +01:00
void menuDrawBigText ( FontType font , uint16 x , uint16 y , Common : : String text , Color color ) ;
2014-03-06 23:01:53 +01:00
void menuDrawIndicator ( int x ) ;
2014-03-04 12:01:41 +01:00
2013-09-28 15:08:41 +02:00
void clearAlso ( ) ;
void clearTextBar ( ) ;
void setAlsoLine ( int x1 , int y1 , int x2 , int y2 , Color color ) ;
2013-09-28 14:31:54 +02:00
byte getAlsoColor ( int x1 , int y1 , int x2 , int y2 ) ;
2013-09-29 19:49:57 +02:00
byte getScreenColor ( Common : : Point pos ) ;
2013-08-11 14:06:15 +02:00
2013-12-17 11:07:05 +01:00
// Further information about this: http://www.shikadi.net/moddingwiki/Raw_EGA_data
2013-10-03 07:14:36 +02:00
Graphics : : Surface loadPictureRaw ( Common : : File & file , uint16 width , uint16 height ) ;
2013-07-26 13:32:08 +02:00
2013-10-15 01:07:26 +02:00
void drawSprite ( AnimationType * sprite , byte picnum , int16 x , int16 y ) ;
2013-09-28 10:41:52 +02:00
void drawThinkPic ( Common : : String filename , int id ) ;
void drawToolbar ( ) ;
2013-09-29 12:13:06 +02:00
void drawCursor ( byte pos ) ;
void drawReadyLight ( Color color ) ;
2014-03-03 21:11:07 +01:00
void drawSoundLight ( bool state ) ;
void drawErrorLight ( bool state ) ;
2013-10-03 07:14:36 +02:00
void drawSign ( Common : : String name , int16 xl , int16 yl , int16 y ) ;
void drawIcon ( int16 x , int16 y , byte which ) ;
2013-10-02 23:39:18 +02:00
void drawScreenLine ( int16 x , int16 y , int16 x2 , int16 y2 , Color color ) ;
2013-09-29 12:13:06 +02:00
void prepareBubble ( int xc , int xw , int my , Common : : Point points [ 3 ] ) ;
2013-07-12 10:25:16 +02:00
void refreshScreen ( ) ;
2013-09-27 23:48:53 +02:00
void loadBackground ( Common : : File & file ) ;
2013-08-23 11:33:37 +02:00
void refreshBackground ( ) ;
2014-01-15 16:26:01 +01:00
void setBackgroundColor ( Color newColor ) ;
2013-10-01 07:43:21 +02:00
void setDialogColor ( Color bg , Color text ) ;
2013-09-28 10:41:52 +02:00
2013-10-03 07:14:36 +02:00
void zoomOut ( int16 x , int16 y ) ;
2013-09-29 12:13:06 +02:00
void showScroll ( ) ;
2013-10-02 23:39:18 +02:00
void getNaturalPicture ( SpriteType & sprite ) ;
2013-09-29 11:26:21 +02:00
void saveScreen ( ) ;
void restoreScreen ( ) ;
2014-01-15 17:59:53 +01:00
void removeBackup ( ) ;
2013-10-02 23:39:18 +02:00
2013-07-11 17:36:59 +02:00
private :
2014-01-22 18:09:25 +01:00
static const int16 kMouseSize = 134 ;
2013-09-28 10:41:52 +02:00
static const uint16 kBackgroundWidth = kScreenWidth ;
2013-10-02 23:39:18 +02:00
static const byte kEgaPaletteIndex [ 16 ] ;
2013-09-28 10:41:52 +02:00
static const byte kBackgroundHeight = 8 * 12080 / kScreenWidth ; // With 640 width it's 151.
// The 8 = number of bits in a byte, and 12080 comes from Lucerna::load().
2014-03-04 12:01:41 +01:00
static const uint16 kMenuScreenHeight = 350 ;
2013-09-28 10:41:52 +02:00
2013-09-29 17:54:03 +02:00
Graphics : : Surface _background ;
2013-10-02 23:39:18 +02:00
Graphics : : Surface _backup ;
2013-09-29 17:54:03 +02:00
Graphics : : Surface _digits [ 10 ] ; // digitsize and rwlitesize are defined in loadDigits() !!!
Graphics : : Surface _directions [ 9 ] ; // Maybe it will be needed to move them to the class itself instead.
2013-10-02 23:39:18 +02:00
Graphics : : Surface _magics ; // Lucerna::draw_also_lines() draws the "magical" lines here. Further information: https://github.com/urukgit/avalot/wiki/Also
2013-09-29 17:54:03 +02:00
Graphics : : Surface _screen ; // Only used in refreshScreen() to make it more optimized. (No recreation of it at every call of the function.)
Graphics : : Surface _scrolls ;
2013-10-02 23:39:18 +02:00
Graphics : : Surface _surface ;
2014-03-04 12:01:41 +01:00
Graphics : : Surface _menu ;
2013-12-17 11:07:05 +01:00
// For the mini-game "Nim".
2014-02-16 18:21:37 +01:00
Graphics : : Surface _nimStone ;
2013-12-17 11:07:05 +01:00
Graphics : : Surface _nimInitials [ 3 ] ;
Graphics : : Surface _nimLogo ;
2014-02-16 15:24:13 +01:00
// For the mini-game "Shoot em' up".
Graphics : : Surface _seuPictures [ 99 ] ;
2013-09-28 09:43:28 +02:00
byte _egaPalette [ 64 ] [ 3 ] ;
AvalancheEngine * _vm ;
2014-02-16 15:24:13 +01:00
void skipDifference ( int size , const Graphics : : Surface & picture , Common : : File & file ) ;
2013-12-17 11:07:05 +01:00
// Further information about these two: http://www.shikadi.net/moddingwiki/Raw_EGA_data
2013-09-29 17:54:03 +02:00
Graphics : : Surface loadPictureGraphic ( Common : : File & file ) ; // Reads Graphic-planar EGA data.
2014-02-18 15:47:17 +01:00
Graphics : : Surface loadPictureSign ( Common : : File & file , uint16 width , uint16 height ) ; // Reads a tricky type of picture used for the "game over"/"about" scrolls and in the mini-game Nim.
2014-02-16 18:21:37 +01:00
2013-09-29 17:54:03 +02:00
void drawText ( Graphics : : Surface & surface , const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
2014-04-12 19:51:10 +02:00
void drawBigText ( Graphics : : Surface & surface , const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
2013-12-17 11:07:05 +01:00
void drawPicture ( Graphics : : Surface & target , const Graphics : : Surface picture , uint16 destX , uint16 destY ) ;
2013-09-29 21:28:43 +02:00
// Taken from Free Pascal's Procedure InternalEllipseDefault. Used to replace Pascal's procedure arc.
// Returns the end point of the arc. (Needed in Clock.)
Common : : Point drawArc ( Graphics : : Surface & surface , int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
2013-07-11 17:36:59 +02:00
} ;
} // End of namespace Avalanche
2013-09-07 09:00:34 +02:00
# endif // AVALANCHE_GRAPHICS_H