Files
source/HelpScreen.cpp
T
Overhaul 7a27e7105d New attack busy system
Added missing #includes

Added LUA scripting and console

Changed the way tracers are visualized, so they work more like real tracers instead of a light fountain

Fixed signedness of many grid variables used in GetMouseMapPos calls

Fixed enemy weapon choosing:  Sometimes a mortar is chosen but later rejected, but the grenade class was not reset.  Caused assertion failure

Added checks so enemies don't try to chuck RPG grenades with their hands

Now possible to shoot a someone in the head if he's in water

Fixed InitSightArrays to also clear soldier interrupt duel points.  This was causing an assertion failure elsewhere in the code because the interrupt list still had soldiers on it sometimes when this function was called.

Soldiers are much less willing to forfeit their turn over an attempt to use more APs than they have

Removed early setting of muzzle flash.  This would allow enemies to get an interrupt before you even fired.

Fixed item dropping by AI.  If AI tried to drop something while standing it would cause deadlock

Change to greatly speed up closing the sector inventory window in an unloaded sector

Added conditional compile flag to always give robot weapon ready advantage, even for 360 degree sighting


Check builddefines.h for the conditional flags.  Of greatest interest might be LUA_CONSOLE.  This will cause the game to bring up a command console when run.  However this console is severely lacking in many areas.  If anybody knows of an open-source terminal/console that could be used instead, it would be appreciated.  The existing console does bad things when you try to close it, and since it counts as a separate app, it pauses the game while it has focus.

LUA scripting is very limited, basically just proof of concept.  There is one global variable, the Soldiers array.  An array index gives you the soldier in that slot in the currently loaded sector.  The soldier has a few things that can be accessed:  name (short name); fullname (long name); grid (current grid #, can be changed); walkto(grid) (function to walk to another grid); runto(grid) (function to run to another grid)


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@924 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2007-06-09 09:01:04 +00:00

2572 lines
73 KiB
C++

// WANNE 2 <changed some lines>
#ifdef PRECOMPILEDHEADERS
#include "JA2 All.h"
#include "HelpScreen.h"
#include "HelpScreenText.h"
#include "Line.h"
#else
#include "sgp.h"
#include "sys globals.h"
#include "sysutil.h"
#include "vobject_blitters.h"
#include "wcheck.h"
#include "cursors.h"
#include "font control.h"
#include "cursor control.h"
#include "render dirty.h"
#include "GameScreen.h"
#include "Text.h"
#include "Utilities.h"
#include "WordWrap.h"
#include "Font Control.h"
#include "text.h"
#include "Multi Language Graphic Utils.h"
#include "HelpScreen.h"
#include "HelpScreenText.h"
#include "Line.h"
#include "Game Clock.h"
#include "GameSettings.h"
#include "laptop.h"
#include "Text Input.h"
#include "english.h"
#include "renderworld.h"
#include "Game Init.h"
#include "Overhead.h"
#endif
extern INT16 gsVIEWPORT_END_Y;
extern void PrintDate( void );
extern void PrintNumberOnTeam( void );
extern void PrintBalance( void );
extern BOOLEAN fMapScreenBottomDirty;
extern BOOLEAN fCharacterInfoPanelDirty;
extern BOOLEAN fTeamPanelDirty;
extern BOOLEAN fMapScreenBottomDirty;
extern BOOLEAN fMapPanelDirty;
extern BOOLEAN gfGamePaused;
extern BOOLEAN fShowMapInventoryPool;
extern BOOLEAN BltVSurfaceUsingDD( HVSURFACE hDestVSurface, HVSURFACE hSrcVSurface, UINT32 fBltFlags, INT32 iDestX, INT32 iDestY, RECT *SrcRect );
#define HELP_SCREEN_ACTIVE 0x00000001
//The defualt size and placement of the screen
//#define HELP_SCREEN_DEFUALT_LOC_X 155
//#define HELP_SCREEN_DEFUALT_LOC_Y 105
#define HELP_SCREEN_DEFUALT_LOC_WIDTH HELP_SCREEN_SMALL_LOC_WIDTH + HELP_SCREEN_BUTTON_BORDER_WIDTH
#define HELP_SCREEN_DEFUALT_LOC_HEIGHT 292//300
#define HELP_SCREEN_BUTTON_BORDER_WIDTH 92
#define HELP_SCREEN_SMALL_LOC_WIDTH 320
#define HELP_SCREEN_SMALL_LOC_HEIGHT HELP_SCREEN_DEFUALT_LOC_HEIGHT //224
#define HELP_SCREEN_BTN_OFFSET_X 11
#define HELP_SCREEN_BTN_OFFSET_Y 12//50
#define HELP_SCREEN_BTN_FONT_ON_COLOR 73
#define HELP_SCREEN_BTN_FONT_OFF_COLOR FONT_MCOLOR_WHITE
#define HELP_SCREEN_BTN_FONT_BACK_COLOR 50
#define HELP_SCREEN_BTN_FONT FONT10ARIAL
#define HELP_SCREEN_BTN_WIDTH 77
#define HELP_SCREEN_BTN_HEIGHT 22
#define HELP_SCREEN_GAP_BN_BTNS 8
#define HELP_SCREEN_MARGIN_SIZE 10
#define HELP_SCREEN_TEXT_RIGHT_MARGIN_SPACE 36
#define HELP_SCREEN_TEXT_LEFT_MARGIN_WITH_BTN ( HELP_SCREEN_BUTTON_BORDER_WIDTH + 5 + HELP_SCREEN_MARGIN_SIZE )
#define HELP_SCREEN_TEXT_LEFT_MARGIN ( 5 + HELP_SCREEN_MARGIN_SIZE )
#define HELP_SCREEN_TEXT_OFFSET_Y 48
#define HELP_SCREEN_GAP_BTN_LINES 2
#define HELP_SCREEN_TITLE_BODY_FONT FONT12ARIAL
#define HELP_SCREEN_TITLE_BODY_COLOR FONT_MCOLOR_WHITE//FONT_NEARBLACK
#define HELP_SCREEN_TEXT_BODY_FONT FONT10ARIAL
#define HELP_SCREEN_TEXT_BODY_COLOR FONT_MCOLOR_WHITE//FONT_NEARBLACK
#define HELP_SCREEN_TEXT_BACKGROUND 0//NO_SHADOW//FONT_MCOLOR_WHITE
#define HELP_SCREEN_TITLE_OFFSET_Y 7
#define HELP_SCREEN_HELP_REMINDER_Y HELP_SCREEN_TITLE_OFFSET_Y + 15
#define HELP_SCREEN_NUM_BTNS 8
#define HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_X 4
#define HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_Y 18
#define HELP_SCREEN_SHOW_HELP_AGAIN_REGION_TEXT_OFFSET_X 25 + HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_X
#define HELP_SCREEN_SHOW_HELP_AGAIN_REGION_TEXT_OFFSET_Y ( HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_Y )
#define HELP_SCREEN_EXIT_BTN_OFFSET_X 291
#define HELP_SCREEN_EXIT_BTN_LOC_Y 9
#define HELP_SCREEN_
//the type of help screen
#define HLP_SCRN_DEFAULT_TYPE 9
#define HLP_SCRN_BUTTON_BORDER 8
//this is the size of the text buffer where everything will be blitted.
// 2 ( bytest for char ) * width of buffer * height of 1 line * # of text lines
//#define HLP_SCRN__NUMBER_BYTES_IN_TEXT_BUFFER ( 2 * HLP_SCRN__WIDTH_OF_TEXT_BUFFER * HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER * HLP_SCRN__MAX_NUMBER_OF_LINES_IN_BUFFER )
#define HLP_SCRN__WIDTH_OF_TEXT_BUFFER 280
#define HLP_SCRN__MAX_NUMBER_OF_LINES_IN_BUFFER 170//100
#define HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER ( GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT ) + HELP_SCREEN_GAP_BTN_LINES )
#define HLP_SCRN__MAX_NUMBER_PIXELS_DISPLAYED_IN_TEXT_BUFFER HELP_SCREEN_DEFUALT_LOC_HEIGHT
#define HLP_SCRN__HEIGHT_OF_TEXT_BUFFER ( HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER * HLP_SCRN__MAX_NUMBER_OF_LINES_IN_BUFFER )
#define HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER ( HLP_SCRN__HEIGHT_OF_TEXT_AREA / HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER )
#define HLP_SCRN__HEIGHT_OF_TEXT_AREA 228
#define HLP_SCRN__HEIGHT_OF_SCROLL_AREA 182
#define HLP_SCRN__WIDTH_OF_SCROLL_AREA 20
#define HLP_SCRN__SCROLL_POSX 292
#define HLP_SCRN__SCROLL_POSY ( gHelpScreen.usScreenLocY + 63 )
#define HLP_SCRN__SCROLL_UP_ARROW_X 292
#define HLP_SCRN__SCROLL_UP_ARROW_Y 43
#define HLP_SCRN__SCROLL_DWN_ARROW_X HLP_SCRN__SCROLL_UP_ARROW_X
#define HLP_SCRN__SCROLL_DWN_ARROW_Y HLP_SCRN__SCROLL_UP_ARROW_Y + 202
//enums for the different dirty levels
enum
{
HLP_SCRN_DRTY_LVL_NOT_DIRTY,
HLP_SCRN_DRTY_LVL_REFRESH_TEXT,
HLP_SCRN_DRTY_LVL_REFRESH_ALL,
};
//new screen:
enum
{
HLP_SCRN_MPSCRN_SCTR_OVERVIEW,
};
//mapscreen, welcome to arulco
enum
{
HLP_SCRN_MPSCRN_OVERVIEW,
HLP_SCRN_MPSCRN_ASSIGNMENTS,
HLP_SCRN_MPSCRN_DESTINATIONS,
HLP_SCRN_MPSCRN_MAP,
HLP_SCRN_MPSCRN_MILITIA,
HLP_SCRN_MPSCRN_AIRSPACE,
HLP_SCRN_MPSCRN_ITEMS,
HLP_SCRN_MPSCRN_KEYBOARD,
HLP_SCRN_NUM_MPSCRN_BTNS,
};
//laptop sub pages
enum
{
HLP_SCRN_LPTP_OVERVIEW,
HLP_SCRN_LPTP_EMAIL,
HLP_SCRN_LPTP_WEB,
HLP_SCRN_LPTP_FILES,
HLP_SCRN_LPTP_HISTORY,
HLP_SCRN_LPTP_PERSONNEL,
HLP_SCRN_LPTP_FINANCIAL,
HLP_SCRN_LPTP_MERC_STATS,
HLP_SCRN_LPTP_NUM_PAGES,
};
//Mapscreen no one hired yet pages
enum
{
HLP_SCRN_NO_ONE_HIRED,
HLP_SCRN_NUM_MAPSCREEN_NO_1_HIRED_YET_PAGES,
};
//mapscreen no 1 hired yet pages
enum
{
HLP_SCRN_NOT_IN_ARULCO,
HLP_SCRN_NUM_NOT_IN_ARULCO_PAGES,
};
//Tactical
enum
{
HLP_SCRN_TACTICAL_OVERVIEW,
HLP_SCRN_TACTICAL_MOVEMENT,
HLP_SCRN_TACTICAL_SIGHT,
HLP_SCRN_TACTICAL_ATTACKING,
HLP_SCRN_TACTICAL_ITEMS,
HLP_SCRN_TACTICAL_KEYBOARD,
HLP_SCRN_NUM_TACTICAL_PAGES,
};
//ddd
HELP_SCREEN_STRUCT gHelpScreen;
typedef struct
{
INT32 iButtonTextNum[ HELP_SCREEN_NUM_BTNS ];
} HELP_SCREEN_BTN_TEXT_RECORD;
//An array of record nums for the text on the help buttons
HELP_SCREEN_BTN_TEXT_RECORD gHelpScreenBtnTextRecordNum[ HELP_SCREEN_NUMBER_OF_HELP_SCREENS ] =
{
//new screen:
//Laptop button record nums
// HELP_SCREEN_LAPTOP,
{ HLP_TXT_LAPTOP_BUTTON_1,
HLP_TXT_LAPTOP_BUTTON_2,
HLP_TXT_LAPTOP_BUTTON_3,
HLP_TXT_LAPTOP_BUTTON_4,
HLP_TXT_LAPTOP_BUTTON_5,
HLP_TXT_LAPTOP_BUTTON_6,
HLP_TXT_LAPTOP_BUTTON_7,
HLP_TXT_LAPTOP_BUTTON_8, },
// HELP_SCREEN_MAPSCREEN,
{ HLP_TXT_WELCOM_TO_ARULCO_BUTTON_1,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_2,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_3,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_4,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_5,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_6,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_7,
HLP_TXT_WELCOM_TO_ARULCO_BUTTON_8, },
// HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED,
{ -1, -1, -1, -1, -1, -1, -1, -1, },
// HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO,
{ -1, -1, -1, -1, -1, -1, -1, -1, },
// HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY,
{ -1, -1, -1, -1, -1, -1, -1, -1, },
// HELP_SCREEN_TACTICAL,
{ HLP_TXT_TACTICAL_BUTTON_1,
HLP_TXT_TACTICAL_BUTTON_2,
HLP_TXT_TACTICAL_BUTTON_3,
HLP_TXT_TACTICAL_BUTTON_4,
HLP_TXT_TACTICAL_BUTTON_5,
HLP_TXT_TACTICAL_BUTTON_6,
-1, -1, },
// HELP_SCREEN_OPTIONS,
{ -1, -1, -1, -1, -1, -1, -1, -1, },
// HELP_SCREEN_LOAD_GAME,
{ -1, -1, -1, -1, -1, -1, -1, -1, },
};
BOOLEAN gfHelpScreenEntry = TRUE;
BOOLEAN gfHelpScreenExit = FALSE;
UINT32 guiHelpScreenBackGround;
UINT32 guiHelpScreenTextBufferSurface;
BOOLEAN gfScrollBoxIsScrolling = FALSE;
BOOLEAN gfHaveRenderedFirstFrameToSaveBuffer=FALSE;
// must use this cause you have ur cursor over a button when entering the help screen, the button will burn though.
//It does this cause that region loses it focus so it draws the button again.
UINT8 gubRenderHelpScreenTwiceInaRow=0;
//mmm
// region to mask the background
MOUSE_REGION gHelpScreenFullScreenMask;
//void SelectHelpTextFullScreenMaskCallBack(MOUSE_REGION * pRegion, INT32 iReason );
// region to mask the background
MOUSE_REGION gHelpScreenScrollArea;
void SelectHelpScrollAreaMovementCallBack( MOUSE_REGION * pRegion, INT32 iReason );
void SelectHelpScrollAreaCallBack( MOUSE_REGION * pRegion, INT32 iReason );
// region to mask the background
MOUSE_REGION gHelpScreenScrollAreaArrows;
void SelectHelpScrollAreaArrowsCallBack( MOUSE_REGION * pRegion, INT32 iReason );
//checkbox to toggle show help again toggle
UINT32 gHelpScreenDontShowHelpAgainToggle;
void BtnHelpScreenDontShowHelpAgainCallback(GUI_BUTTON *btn,INT32 reason);
//MOUSE_REGION HelpScreenDontShowHelpAgainToggleTextRegion;
//void HelpScreenDontShowHelpAgainToggleTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
INT32 giHelpScreenButtonsImage[ HELP_SCREEN_NUM_BTNS ];
UINT32 guiHelpScreenBtns[ HELP_SCREEN_NUM_BTNS ];
void BtnHelpScreenBtnsCallback(GUI_BUTTON *btn,INT32 reason);
INT32 giExitBtnImage;
UINT32 guiHelpScreenExitBtn;
void BtnHelpScreenExitCallback(GUI_BUTTON *btn,INT32 reason);
INT32 giHelpScreenScrollArrows[2];
UINT32 guiHelpScreenScrollArrowImage[2];
void BtnHelpScreenScrollArrowsCallback(GUI_BUTTON *btn,INT32 reason);
//ggg
BOOLEAN EnterHelpScreen();
void HandleHelpScreen();
void RenderHelpScreen();
void ExitHelpScreen();
void GetHelpScreenUserInput();
void HelpScreenSpecialExitCode();
void SetSizeAndPropertiesOfHelpScreen();
BOOLEAN DrawHelpScreenBackGround();
void PrepareToExitHelpScreen();
void SpecialHandlerCode();
UINT16 RenderSpecificHelpScreen();
UINT16 RenderLaptopHelpScreen();
UINT16 RenderTacticalHelpScreen();
UINT16 RenderMapScreenHelpScreen();
UINT16 RenderMapScreenNoOneHiredYetHelpScreen();
UINT16 RenderMapScreenNotYetInArulcoHelpScreen();
UINT16 RenderMapScreenSectorInventoryHelpScreen();
void GetHelpScreenTextPositions( UINT16 *pusPosX, UINT16 *pusPosY, UINT16 *pusWidth );
void DisplayCurrentScreenTitleAndFooter();
void GetHelpScreenText( UINT32 uiRecordToGet, STR16 pText );
UINT16 GetAndDisplayHelpScreenText( UINT32 uiRecord, UINT16 usPosX, UINT16 usPosY, UINT16 usWidth );
void CreateHelpScreenButtons();
void RefreshAllHelpScreenButtons();
void RenderTextBufferToScreen();
void RenderCurrentHelpScreenTextToBuffer();
void DestroyHelpScreenTextBuffer();
BOOLEAN CreateHelpScreenTextBuffer();
void ChangeHelpScreenSubPage();
void ClearHelpScreenTextBuffer();
void ChangeTopLineInTextBufferByAmount( INT32 iAmouontToMove );
void DisplayHelpScreenTextBufferScrollBox();
void CalculateHeightAndPositionForHelpScreenScrollBox( INT32 *piHeightOfScrollBox, INT32 *iTopOfScrollBox );
void HelpScreenMouseMoveScrollBox( INT32 usMousePosY );
void CreateScrollAreaButtons();
void DeleteScrollArrowButtons();
void ChangeToHelpScreenSubPage( INT8 bNewPage );
BOOLEAN AreWeClickingOnScrollBar( INT32 usMousePosY );
//ppp
void InitHelpScreenSystem()
{
//set some values
memset( &gHelpScreen, 0, sizeof( gHelpScreen ) );
//set it up so we can enter the screen
gfHelpScreenEntry = TRUE;
gfHelpScreenExit = FALSE;
gHelpScreen.bCurrentHelpScreenActiveSubPage = -1;
gHelpScreen.fHaveAlreadyBeenInHelpScreenSinceEnteringCurrenScreen = FALSE;
}
BOOLEAN ShouldTheHelpScreenComeUp( UINT8 ubScreenID, BOOLEAN fForceHelpScreenToComeUp )
{
//if the screen is being forsced to come up ( user pressed 'h' )
if( fForceHelpScreenToComeUp )
{
//Set thefact that the user broughtthe help screen up
gHelpScreen.fForceHelpScreenToComeUp = TRUE;
goto HELP_SCREEN_SHOULD_COME_UP;
}
//if we are already in the help system, return true
if( gHelpScreen.uiFlags & HELP_SCREEN_ACTIVE )
{
return( TRUE );
}
//has the player been in the screen before
if( ( gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen >> ubScreenID ) & 0x01 )
{
goto HELP_SCREEN_WAIT_1_FRAME;
}
//if we have already been in the screen, and the user DIDNT press 'h', leave
if( gHelpScreen.fHaveAlreadyBeenInHelpScreenSinceEnteringCurrenScreen )
{
return( FALSE );
}
//should the screen come up, based on the users choice for it automatically coming up
// if( !( gHelpScreen.fHideHelpInAllScreens ) )
{
// goto HELP_SCREEN_WAIT_1_FRAME;
}
//the help screen shouldnt come up
return( FALSE );
HELP_SCREEN_WAIT_1_FRAME:
// we have to wait 1 frame while the screen renders
if( gHelpScreen.bDelayEnteringHelpScreenBy1FrameCount < 2 )
{
gHelpScreen.bDelayEnteringHelpScreenBy1FrameCount += 1;
UnmarkButtonsDirty( );
return( FALSE );
}
HELP_SCREEN_SHOULD_COME_UP:
//Record which screen it is
//if its mapscreen
if( ubScreenID == HELP_SCREEN_MAPSCREEN )
{
//determine which screen it is ( is any mercs hired, did game just start )
gHelpScreen.bCurrentHelpScreen = HelpScreenDetermineWhichMapScreenHelpToShow();
}
else
{
gHelpScreen.bCurrentHelpScreen = ubScreenID;
}
//mark it that the help screnn is enabled
gHelpScreen.uiFlags |= HELP_SCREEN_ACTIVE;
// reset
gHelpScreen.bDelayEnteringHelpScreenBy1FrameCount = 0;
return( TRUE );
}
void HelpScreenHandler()
{
//if we are just entering the help screen
if( gfHelpScreenEntry )
{
//setup the help screen
EnterHelpScreen();
gfHelpScreenEntry = FALSE;
gfHelpScreenExit = FALSE;
}
RestoreBackgroundRects();
//get the mouse and keyboard inputs
GetHelpScreenUserInput();
//handle the help screen
HandleHelpScreen();
//if the help screen is dirty, re-render it
if( gHelpScreen.ubHelpScreenDirty != HLP_SCRN_DRTY_LVL_NOT_DIRTY )
{
//temp
// gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_ALL;
RenderHelpScreen();
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_NOT_DIRTY;
}
// render buttons marked dirty
// MarkButtonsDirty( );
RenderButtons( );
SaveBackgroundRects( );
RenderButtonsFastHelp();
ExecuteBaseDirtyRectQueue();
EndFrameBufferRender();
//if we are leaving the help screen
if( gfHelpScreenExit )
{
gfHelpScreenExit = FALSE;
gfHelpScreenEntry = TRUE;
//exit mouse regions etc..
ExitHelpScreen();
//reset the helpscreen id
gHelpScreen.bCurrentHelpScreen = -1;
}
}
BOOLEAN EnterHelpScreen()
{
VOBJECT_DESC VObjectDesc;
UINT16 usPosX, usPosY;//, usWidth, usHeight;
// INT32 iStartLoc;
// CHAR16 zText[1024];
//Clear out all the save background rects
EmptyBackgroundRects( );
UnmarkButtonsDirty( );
// remeber if the game was paused or not ( so when we exit we know what to do )
gHelpScreen.fWasTheGamePausedPriorToEnteringHelpScreen = gfGamePaused;
//pause the game
PauseGame( );
//Determine the help screen size, based off the help screen
SetSizeAndPropertiesOfHelpScreen();
//Create a mouse region 'mask' the entrire screen
MSYS_DefineRegion( &gHelpScreenFullScreenMask, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_HIGHEST,
gHelpScreen.usCursor, MSYS_NO_CALLBACK, MSYS_NO_CALLBACK );
MSYS_AddRegion( &gHelpScreenFullScreenMask );
//Create the exit button
if( gHelpScreen.bNumberOfButtons != 0 )
usPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_EXIT_BTN_OFFSET_X + HELP_SCREEN_BUTTON_BORDER_WIDTH;
else
usPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_EXIT_BTN_OFFSET_X;
usPosY = gHelpScreen.usScreenLocY + HELP_SCREEN_EXIT_BTN_LOC_Y;
//Create the exit buttons
giExitBtnImage = LoadButtonImage("INTERFACE\\HelpScreen.sti", -1,0,4,2,6 );
guiHelpScreenExitBtn = CreateIconAndTextButton( giExitBtnImage, L"", HELP_SCREEN_BTN_FONT,
HELP_SCREEN_BTN_FONT_ON_COLOR, DEFAULT_SHADOW,
HELP_SCREEN_BTN_FONT_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
usPosX, usPosY, BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, BtnHelpScreenExitCallback );
SetButtonFastHelpText( guiHelpScreenExitBtn, gzHelpScreenText[HLP_SCRN_TXT__EXIT_SCREEN] );
SetButtonCursor( guiHelpScreenExitBtn, gHelpScreen.usCursor);
//Create the buttons needed for the screen
CreateHelpScreenButtons();
//if there are buttons
if( gHelpScreen.bNumberOfButtons != 0 )
usPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_X + HELP_SCREEN_BUTTON_BORDER_WIDTH;
else
usPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_X;
usPosY = gHelpScreen.usScreenLocY + gHelpScreen.usScreenHeight - HELP_SCREEN_SHOW_HELP_AGAIN_REGION_OFFSET_Y;
if( !gHelpScreen.fForceHelpScreenToComeUp)
{
gHelpScreenDontShowHelpAgainToggle = CreateCheckBoxButton( usPosX, (UINT16)(usPosY-3),
"INTERFACE\\OptionsCheckBoxes.sti", MSYS_PRIORITY_HIGHEST,
BtnHelpScreenDontShowHelpAgainCallback );
SetButtonCursor( gHelpScreenDontShowHelpAgainToggle, gHelpScreen.usCursor );
// Set the state of the chec box
if( gGameSettings.fHideHelpInAllScreens )
ButtonList[ gHelpScreenDontShowHelpAgainToggle ]->uiFlags |= BUTTON_CLICKED_ON;
else
ButtonList[ gHelpScreenDontShowHelpAgainToggle ]->uiFlags &= ~BUTTON_CLICKED_ON;
}
/*
///creatre a region for the text that says ' [ x ] click to continue seeing ....'
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_CONSTANT_FOOTER;
LoadEncryptedDataFromFile(HELPSCREEN_FILE, zText, iStartLoc, HELPSCREEN_RECORD_SIZE );
usWidth = StringPixLength( zText, HELP_SCREEN_TEXT_BODY_FONT );
usHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
/*
MSYS_DefineRegion( &HelpScreenDontShowHelpAgainToggleTextRegion, usPosX, usPosY, (UINT16)(usPosX+usWidth), (UINT16)(usPosY+usHeight), MSYS_PRIORITY_HIGHEST-1,
gHelpScreen.usCursor, MSYS_NO_CALLBACK, HelpScreenDontShowHelpAgainToggleTextRegionCallBack );
MSYS_AddRegion( &HelpScreenDontShowHelpAgainToggleTextRegion );
*/
// load the help screen background graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("INTERFACE\\HelpScreen.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiHelpScreenBackGround));
//create the text buffer
CreateHelpScreenTextBuffer();
//make sure we redraw everything
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_ALL;
//mark it that we have been in since we enter the current screen
gHelpScreen.fHaveAlreadyBeenInHelpScreenSinceEnteringCurrenScreen = TRUE;
//set the fact that we have been to the screen
gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen &= ~( 1 << gHelpScreen.bCurrentHelpScreen );
//always start at the top
gHelpScreen.iLineAtTopOfTextBuffer = 0;
//set it so there was no previous click
gHelpScreen.iLastMouseClickY = -1;
//Create the scroll box, and scroll arrow regions/buttons
CreateScrollAreaButtons();
//render the active page to the text buffer
ChangeHelpScreenSubPage();
//reset scroll box flag
gfScrollBoxIsScrolling = FALSE;
//reset first frame buffer
gfHaveRenderedFirstFrameToSaveBuffer = FALSE;
gubRenderHelpScreenTwiceInaRow = 0;
return( TRUE );
}
void HandleHelpScreen()
{
//if any of the possible screens need to have a some code done every loop.. its done in here
SpecialHandlerCode();
if( gfScrollBoxIsScrolling )
{
if( gfLeftButtonState )
{
HelpScreenMouseMoveScrollBox( gusMouseYPos );
}
else
{
gfScrollBoxIsScrolling = FALSE;
gHelpScreen.iLastMouseClickY = -1;
}
}
if( gubRenderHelpScreenTwiceInaRow < 3 )
{
//test
// gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_ALL;
gubRenderHelpScreenTwiceInaRow++;
UnmarkButtonsDirty( );
}
// refresh all of help screens buttons
RefreshAllHelpScreenButtons();
}
void RenderHelpScreen()
{
//rrr
if( gfHaveRenderedFirstFrameToSaveBuffer )
{
//Restore the background before blitting the text back on
RestoreExternBackgroundRect( gHelpScreen.usScreenLocX, gHelpScreen.usScreenLocY, gHelpScreen.usScreenWidth, gHelpScreen.usScreenHeight );
}
if( gHelpScreen.ubHelpScreenDirty == HLP_SCRN_DRTY_LVL_REFRESH_ALL )
{
//Display the helpscreen background
DrawHelpScreenBackGround();
//Display the current screens title, and footer info
DisplayCurrentScreenTitleAndFooter();
}
if( !gfHaveRenderedFirstFrameToSaveBuffer )
{
gfHaveRenderedFirstFrameToSaveBuffer = TRUE;
//blit everything to the save buffer ( cause the save buffer can bleed through )
BlitBufferToBuffer(guiRENDERBUFFER, guiSAVEBUFFER, gHelpScreen.usScreenLocX, gHelpScreen.usScreenLocY, (UINT16)(gHelpScreen.usScreenWidth), (UINT16)(gHelpScreen.usScreenHeight) );
UnmarkButtonsDirty( );
}
//render the text buffer to the screen
if( gHelpScreen.ubHelpScreenDirty >= HLP_SCRN_DRTY_LVL_REFRESH_TEXT )
{
RenderTextBufferToScreen();
}
}
void ExitHelpScreen()
{
INT32 i;
if( !gHelpScreen.fForceHelpScreenToComeUp )
{
//Get the current value of the checkbox
if( ButtonList[ gHelpScreenDontShowHelpAgainToggle ]->uiFlags & BUTTON_CLICKED_ON )
{
gGameSettings.fHideHelpInAllScreens = TRUE;
gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen = 0;
}
else
{
gGameSettings.fHideHelpInAllScreens = FALSE;
}
//remove the mouse region for the '[ ] dont show help...'
RemoveButton( gHelpScreenDontShowHelpAgainToggle );
}
//mark it that the help screen is not active
gHelpScreen.uiFlags &= ~HELP_SCREEN_ACTIVE;
//remove the mouse region that blankets
MSYS_RemoveRegion( &gHelpScreenFullScreenMask );
//checkbox to toggle show help again toggle
// MSYS_RemoveRegion( &HelpScreenDontShowHelpAgainToggleTextRegion );
//remove the hepl graphic
DeleteVideoObjectFromIndex( guiHelpScreenBackGround );
//remove the exit button
RemoveButton( guiHelpScreenExitBtn );
//if there are any buttons, remove them
if( gHelpScreen.bNumberOfButtons != 0 )
{
for( i=0; i< gHelpScreen.bNumberOfButtons; i++ )
{
UnloadButtonImage( giHelpScreenButtonsImage[i] );
RemoveButton( guiHelpScreenBtns[i] );
}
}
//destroy the text buffer for the help screen
DestroyHelpScreenTextBuffer();
//Handles the dirtying of any special screen we are about to reenter
HelpScreenSpecialExitCode();
//if the game was NOT paused
if( gHelpScreen.fWasTheGamePausedPriorToEnteringHelpScreen == FALSE )
{
//un pause the game
UnPauseGame( );
}
//Delete the scroll box, and scroll arrow regions/buttons
DeleteScrollArrowButtons();
//reset
gHelpScreen.fForceHelpScreenToComeUp = FALSE;
SaveGameSettings();
}
BOOLEAN DrawHelpScreenBackGround()
{
HVOBJECT hPixHandle;
UINT16 usPosX;
//Get and display the background image
GetVideoObject(&hPixHandle, guiHelpScreenBackGround );
usPosX = gHelpScreen.usScreenLocX;
//if there are buttons, blit the button border
if( gHelpScreen.bNumberOfButtons != 0 )
{
BltVideoObject(FRAME_BUFFER, hPixHandle, HLP_SCRN_BUTTON_BORDER, usPosX, gHelpScreen.usScreenLocY, VO_BLT_SRCTRANSPARENCY,NULL);
usPosX += HELP_SCREEN_BUTTON_BORDER_WIDTH;
}
BltVideoObject(FRAME_BUFFER, hPixHandle, HLP_SCRN_DEFAULT_TYPE, usPosX, gHelpScreen.usScreenLocY, VO_BLT_SRCTRANSPARENCY,NULL);
InvalidateRegion( gHelpScreen.usScreenLocX, gHelpScreen.usScreenLocY, gHelpScreen.usScreenLocX+gHelpScreen.usScreenWidth, gHelpScreen.usScreenLocY + gHelpScreen.usScreenHeight );
return( TRUE );
}
void SetSizeAndPropertiesOfHelpScreen()
{
//new screen:
gHelpScreen.bNumberOfButtons = 0;
//
//these are the default settings, so if the screen uses different then defualt, set them in the switch
//
{
gHelpScreen.usScreenWidth = HELP_SCREEN_DEFUALT_LOC_WIDTH;
gHelpScreen.usScreenHeight = HELP_SCREEN_DEFUALT_LOC_HEIGHT;
gHelpScreen.usScreenLocX = ( SCREEN_WIDTH - gHelpScreen.usScreenWidth ) / 2;
gHelpScreen.usScreenLocY = ( SCREEN_HEIGHT - gHelpScreen.usScreenHeight ) / 2;
gHelpScreen.bCurrentHelpScreenActiveSubPage = 0;
gHelpScreen.usCursor = CURSOR_NORMAL;
}
switch( gHelpScreen.bCurrentHelpScreen )
{
case HELP_SCREEN_LAPTOP:
gHelpScreen.bNumberOfButtons = HLP_SCRN_LPTP_NUM_PAGES;
gHelpScreen.usCursor = CURSOR_LAPTOP_SCREEN;
//center the screen inside the laptop screen
gHelpScreen.usScreenLocX = LAPTOP_SCREEN_UL_X + ( 502 - gHelpScreen.usScreenWidth ) / 2;
gHelpScreen.usScreenLocY = LAPTOP_SCREEN_UL_Y + ( LAPTOP_SCREEN_HEIGHT - gHelpScreen.usScreenHeight ) / 2;
break;
case HELP_SCREEN_MAPSCREEN:
gHelpScreen.bNumberOfButtons = HLP_SCRN_NUM_MPSCRN_BTNS;
//calc the center position based on the current panel thats being displayed
gHelpScreen.usScreenLocY = ( gsVIEWPORT_END_Y - gHelpScreen.usScreenHeight ) / 2;
break;
case HELP_SCREEN_TACTICAL:
gHelpScreen.bNumberOfButtons = HLP_SCRN_NUM_TACTICAL_PAGES;
//calc the center position based on the current panel thats being displayed
gHelpScreen.usScreenLocY = ( gsVIEWPORT_END_Y - gHelpScreen.usScreenHeight ) / 2;
break;
case HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED:
case HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO:
case HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY:
gHelpScreen.usScreenWidth = HELP_SCREEN_SMALL_LOC_WIDTH;
gHelpScreen.usScreenHeight = HELP_SCREEN_SMALL_LOC_HEIGHT;
//calc screen position since we just set the width and height
gHelpScreen.usScreenLocX = ( SCREEN_WIDTH - gHelpScreen.usScreenWidth ) / 2;
//calc the center position based on the current panel thats being displayed
gHelpScreen.usScreenLocY = ( gsVIEWPORT_END_Y - gHelpScreen.usScreenHeight ) / 2;
gHelpScreen.bNumberOfButtons = 0;
gHelpScreen.bCurrentHelpScreenActiveSubPage = 0;
break;
case HELP_SCREEN_OPTIONS:
case HELP_SCREEN_LOAD_GAME:
break;
default:
#ifdef JA2BETAVERSION
AssertMsg( 0, "Error in help screen. DF 0" );
#else
break;
#endif
}
//if there are buttons
if( gHelpScreen.bNumberOfButtons != 0 )
gHelpScreen.usLeftMarginPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_TEXT_LEFT_MARGIN_WITH_BTN;
else
gHelpScreen.usLeftMarginPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_TEXT_LEFT_MARGIN;
}
void CreateHelpScreenButtons()
{
UINT16 usPosX, usPosY;
CHAR16 sText[1024];
INT32 i;
//if there are buttons to create
if( gHelpScreen.bNumberOfButtons != 0 )
{
usPosX = gHelpScreen.usScreenLocX + HELP_SCREEN_BTN_OFFSET_X;
usPosY = HELP_SCREEN_BTN_OFFSET_Y + gHelpScreen.usScreenLocY;
//loop through all the buttons, and create them
for( i=0; i< gHelpScreen.bNumberOfButtons; i++ )
{
//get the text for the button
GetHelpScreenText( gHelpScreenBtnTextRecordNum[ gHelpScreen.bCurrentHelpScreen ].iButtonTextNum[i], sText );
/*
guiHelpScreenBtns[i] = CreateTextButton( sText, HELP_SCREEN_BTN_FONT, HELP_SCREEN_BTN_FONT_COLOR, HELP_SCREEN_BTN_FONT_BACK_COLOR,
BUTTON_USE_DEFAULT, usPosX, usPosY, HELP_SCREEN_BTN_WIDTH, HELP_SCREEN_BTN_HEIGHT,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST, BUTTON_NO_CALLBACK, BtnHelpScreenBtnsCallback );
*/
giHelpScreenButtonsImage[i] = UseLoadedButtonImage( giExitBtnImage, -1,1,5,3,7 );
guiHelpScreenBtns[i] = CreateIconAndTextButton( giHelpScreenButtonsImage[i], sText, HELP_SCREEN_BTN_FONT,
HELP_SCREEN_BTN_FONT_ON_COLOR, DEFAULT_SHADOW,
HELP_SCREEN_BTN_FONT_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
usPosX, usPosY, BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, BtnHelpScreenBtnsCallback);
SetButtonCursor( guiHelpScreenBtns[i], gHelpScreen.usCursor);
MSYS_SetBtnUserData( guiHelpScreenBtns[i], 0, i);
// SpecifyButtonTextOffsets( guiHelpScreenBtns[i], 19, 9, TRUE );
usPosY += HELP_SCREEN_BTN_HEIGHT + HELP_SCREEN_GAP_BN_BTNS;
}
ButtonList[ guiHelpScreenBtns[0] ]->uiFlags |= BUTTON_CLICKED_ON;
}
}
void GetHelpScreenUserInput()
{
InputAtom Event;
POINT MousePos;
GetCursorPos(&MousePos);
while( DequeueEvent( &Event ) )
{
// HOOK INTO MOUSE HOOKS
switch( Event.usEvent)
{
case LEFT_BUTTON_DOWN:
MouseSystemHook(LEFT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case LEFT_BUTTON_UP:
MouseSystemHook(LEFT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y ,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_DOWN:
MouseSystemHook(RIGHT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_UP:
MouseSystemHook(RIGHT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_REPEAT:
MouseSystemHook(RIGHT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case LEFT_BUTTON_REPEAT:
MouseSystemHook(LEFT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
}
if( !HandleTextInput( &Event ) && Event.usEvent == KEY_UP )
{
switch( Event.usParam )
{
case ESC:
PrepareToExitHelpScreen();
break;
case DNARROW:
{
ChangeTopLineInTextBufferByAmount( 1 );
}
break;
case UPARROW:
{
ChangeTopLineInTextBufferByAmount( -1 );
}
break;
case PGUP:
{
ChangeTopLineInTextBufferByAmount( -( HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER -1 ) );
}
break;
case PGDN:
{
ChangeTopLineInTextBufferByAmount( ( HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER -1 ) );
}
break;
case LEFTARROW:
ChangeToHelpScreenSubPage( (INT8)( gHelpScreen.bCurrentHelpScreenActiveSubPage - 1 ) );
break;
case RIGHTARROW:
ChangeToHelpScreenSubPage( (INT8)( gHelpScreen.bCurrentHelpScreenActiveSubPage + 1 ) );
break;
/*
case LEFTARROW:
{
}
break;
case RIGHTARROW:
{
}
break;
*/
#ifdef JA2TESTVERSION
//rerender the hepl screen
case 'r':
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_ALL;
break;
case 'i':
InvalidateRegion( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
break;
case 'd':
InvalidateRegion( gHelpScreen.usScreenLocX, gHelpScreen.usScreenLocY, gHelpScreen.usScreenLocX+gHelpScreen.usScreenWidth, gHelpScreen.usScreenLocY + gHelpScreen.usScreenHeight );
break;
#endif
}
}
if( !HandleTextInput( &Event ) && Event.usEvent == KEY_REPEAT )
{
switch( Event.usParam )
{
case DNARROW:
{
ChangeTopLineInTextBufferByAmount( 1 );
}
break;
case UPARROW:
{
ChangeTopLineInTextBufferByAmount( -1 );
}
break;
case PGUP:
{
ChangeTopLineInTextBufferByAmount( -( HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER -1 ) );
}
break;
case PGDN:
{
ChangeTopLineInTextBufferByAmount( ( HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER -1 ) );
}
break;
}
}
}
}
//Handles anything spcial that must be done when exiting the specific screen we are about to reenter ( eg. dirtying of the screen )
void HelpScreenSpecialExitCode()
{
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreen )
{
case HELP_SCREEN_LAPTOP:
fReDrawScreenFlag = TRUE;
break;
case HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED:
case HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO:
case HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY:
case HELP_SCREEN_MAPSCREEN:
fCharacterInfoPanelDirty = TRUE;
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
fMapPanelDirty=TRUE;
break;
case HELP_SCREEN_TACTICAL:
fInterfacePanelDirty = DIRTYLEVEL2;
SetRenderFlags(RENDER_FLAG_FULL);
break;
case HELP_SCREEN_OPTIONS:
break;
case HELP_SCREEN_LOAD_GAME:
break;
default:
#ifdef JA2BETAVERSION
AssertMsg( 0, "Error in help screen. DF 0" );
#else
break;
#endif
}
}
void PrepareToExitHelpScreen()
{
gfHelpScreenExit = TRUE;
}
//Handles anything special that must be done when exiting the specific screen we are about to reenter ( eg. dirtying of the screen )
void SpecialHandlerCode()
{
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreen )
{
case HELP_SCREEN_LAPTOP:
PrintDate( );
PrintBalance( );
PrintNumberOnTeam( );
break;
case HELP_SCREEN_MAPSCREEN:
break;
case HELP_SCREEN_TACTICAL:
break;
case HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED:
break;
case HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO:
break;
case HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY:
break;
break;
case HELP_SCREEN_OPTIONS:
break;
case HELP_SCREEN_LOAD_GAME:
break;
default:
#ifdef JA2BETAVERSION
AssertMsg( 0, "Error in help screen: SpecialHandlerCode(). DF 0" );
#else
break;
#endif
}
}
UINT16 RenderSpecificHelpScreen()
{
UINT16 usNumVerticalPixelsDisplayed = 0;
//new screen:
//set the buffer for the text to go to
// SetFontDestBuffer( guiHelpScreenTextBufferSurface, gHelpScreen.usLeftMarginPosX, gHelpScreen.usScreenLocY + HELP_SCREEN_TEXT_OFFSET_Y,
// HLP_SCRN__WIDTH_OF_TEXT_BUFFER, HLP_SCRN__NUMBER_BYTES_IN_TEXT_BUFFER, FALSE );
SetFontDestBuffer( guiHelpScreenTextBufferSurface, 0, 0,
HLP_SCRN__WIDTH_OF_TEXT_BUFFER, HLP_SCRN__HEIGHT_OF_TEXT_BUFFER, FALSE );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreen )
{
case HELP_SCREEN_LAPTOP:
usNumVerticalPixelsDisplayed = RenderLaptopHelpScreen();
break;
case HELP_SCREEN_MAPSCREEN:
usNumVerticalPixelsDisplayed = RenderMapScreenHelpScreen();
break;
case HELP_SCREEN_TACTICAL:
usNumVerticalPixelsDisplayed = RenderTacticalHelpScreen();
break;
case HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED:
usNumVerticalPixelsDisplayed = RenderMapScreenNoOneHiredYetHelpScreen();
break;
case HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO:
usNumVerticalPixelsDisplayed = RenderMapScreenNotYetInArulcoHelpScreen();
break;
case HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY:
usNumVerticalPixelsDisplayed = RenderMapScreenSectorInventoryHelpScreen();
break;
case HELP_SCREEN_OPTIONS:
break;
case HELP_SCREEN_LOAD_GAME:
break;
default:
#ifdef JA2BETAVERSION
SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
AssertMsg( 0, "Error in help screen: RenderSpecificHelpScreen(). DF 0" );
#else
break;
#endif
}
SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
//add 1 line to the bottom of the buffer
usNumVerticalPixelsDisplayed += 10;
return( usNumVerticalPixelsDisplayed );
}
void GetHelpScreenTextPositions( UINT16 *pusPosX, UINT16 *pusPosY, UINT16 *pusWidth )
{
//if there are buttons
if( pusPosX != NULL )
*pusPosX = 0;
if( pusWidth != NULL )
*pusWidth = HLP_SCRN__WIDTH_OF_TEXT_BUFFER - 1 * HELP_SCREEN_MARGIN_SIZE; //DEF was 2
if( pusPosY != NULL )
*pusPosY = 0;
}
void DisplayCurrentScreenTitleAndFooter()
{
INT32 iStartLoc = -1;
CHAR16 zText[1024];
UINT16 usPosX=0, usPosY=0, usWidth=0;
//new screen:
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreen )
{
case HELP_SCREEN_LAPTOP:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_LAPTOP_TITLE;
break;
case HELP_SCREEN_MAPSCREEN:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_WELCOM_TO_ARULCO_TITLE;
break;
case HELP_SCREEN_TACTICAL:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_TACTICAL_TITLE;
break;
case HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_MPSCRN_NO_1_HIRED_YET_TITLE;
break;
case HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_MPSCRN_NOT_IN_ARULCO_TITLE;
break;
case HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY:
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_SECTOR_INVTRY_TITLE;
break;
case HELP_SCREEN_OPTIONS:
break;
case HELP_SCREEN_LOAD_GAME:
break;
default:
#ifdef JA2BETAVERSION
AssertMsg( 0, "Error in help screen: DisplayCurrentScreenTitleAndFooter(). DF 0" );
#else
break;
#endif
}
// GetHelpScreenTextPositions( NULL, NULL, &usWidth );
if( gHelpScreen.bNumberOfButtons != 0 )
usWidth = gHelpScreen.usScreenWidth - HELP_SCREEN_TEXT_LEFT_MARGIN_WITH_BTN - HELP_SCREEN_TEXT_RIGHT_MARGIN_SPACE;
else
usWidth = gHelpScreen.usScreenWidth - HELP_SCREEN_TEXT_LEFT_MARGIN - HELP_SCREEN_TEXT_RIGHT_MARGIN_SPACE;
//if this screen has a valid title
if( iStartLoc != -1 )
{
LoadEncryptedDataFromFile(HELPSCREEN_FILE, zText, iStartLoc, HELPSCREEN_RECORD_SIZE );
SetFontShadow( NO_SHADOW );
usPosX = gHelpScreen.usLeftMarginPosX;
// DrawTextToScreen( zText, usPosX, (UINT16)(gHelpScreen.usScreenLocY+HELP_SCREEN_TITLE_OFFSET_Y), usWidth,
// HELP_SCREEN_TITLE_BODY_FONT, HELP_SCREEN_TITLE_BODY_COLOR, HELP_SCREEN_TEXT_BACKGROUND, FALSE, CENTER_JUSTIFIED );
//Display the Title
IanDisplayWrappedString( usPosX, (UINT16)(gHelpScreen.usScreenLocY+HELP_SCREEN_TITLE_OFFSET_Y), usWidth, HELP_SCREEN_GAP_BTN_LINES,
HELP_SCREEN_TITLE_BODY_FONT, HELP_SCREEN_TITLE_BODY_COLOR, zText,
HELP_SCREEN_TEXT_BACKGROUND, FALSE, 0 );
}
//Display the '( press H to get help... )'
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_CONSTANT_SUBTITLE;
LoadEncryptedDataFromFile(HELPSCREEN_FILE, zText, iStartLoc, HELPSCREEN_RECORD_SIZE );
usPosX = gHelpScreen.usLeftMarginPosX;
usPosY = gHelpScreen.usScreenLocY+HELP_SCREEN_HELP_REMINDER_Y;
// DrawTextToScreen( zText, usPosX, usPosY, usWidth,
// HELP_SCREEN_TEXT_BODY_FONT, HELP_SCREEN_TITLE_BODY_COLOR, HELP_SCREEN_TEXT_BACKGROUND, FALSE, CENTER_JUSTIFIED );
IanDisplayWrappedString( usPosX, usPosY, usWidth, HELP_SCREEN_GAP_BTN_LINES,
HELP_SCREEN_TITLE_BODY_FONT, HELP_SCREEN_TITLE_BODY_COLOR, zText,
HELP_SCREEN_TEXT_BACKGROUND, FALSE, 0 );
if( !gHelpScreen.fForceHelpScreenToComeUp )
{
//calc location for the ' [ x ] Dont display again...'
iStartLoc = HELPSCREEN_RECORD_SIZE * HLP_TXT_CONSTANT_FOOTER;
LoadEncryptedDataFromFile(HELPSCREEN_FILE, zText, iStartLoc, HELPSCREEN_RECORD_SIZE );
usPosX = gHelpScreen.usLeftMarginPosX + HELP_SCREEN_SHOW_HELP_AGAIN_REGION_TEXT_OFFSET_X;
usPosY = gHelpScreen.usScreenLocY + gHelpScreen.usScreenHeight - HELP_SCREEN_SHOW_HELP_AGAIN_REGION_TEXT_OFFSET_Y + 2;
//Display the ' [ x ] Dont display again...'
IanDisplayWrappedString( usPosX, usPosY, usWidth, HELP_SCREEN_GAP_BTN_LINES,
HELP_SCREEN_TEXT_BODY_FONT, HELP_SCREEN_TITLE_BODY_COLOR, zText,
HELP_SCREEN_TEXT_BACKGROUND, FALSE, 0 );
}
SetFontShadow( DEFAULT_SHADOW );
}
void BtnHelpScreenBtnsCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
// btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
//Get the btn id
INT8 bRetValue = (UINT8)MSYS_GetBtnUserData( btn, 0 );
ChangeToHelpScreenSubPage( bRetValue );
/*
//change the current page to the new one
gHelpScreen.bCurrentHelpScreenActiveSubPage = ( bRetValue > gHelpScreen.bNumberOfButtons ) ? gHelpScreen.bNumberOfButtons-1 : bRetValue;
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_TEXT;
for( i=0; i< gHelpScreen.bNumberOfButtons; i++ )
{
ButtonList[ guiHelpScreenBtns[i] ]->uiFlags &= (~BUTTON_CLICKED_ON );
}
//change the current sub page, and render it to the buffer
ChangeHelpScreenSubPage();
*/
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
// btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void ChangeToHelpScreenSubPage( INT8 bNewPage )
{
INT8 i;
//if for some reason, we are assigning a lower number
if( bNewPage < 0 )
{
gHelpScreen.bCurrentHelpScreenActiveSubPage = 0;
}
//for some reason if the we are passing in a # that is greater then the max, set it to the max
else if( bNewPage >= gHelpScreen.bNumberOfButtons )
{
gHelpScreen.bCurrentHelpScreenActiveSubPage = ( gHelpScreen.bNumberOfButtons == 0 ) ? 0: gHelpScreen.bNumberOfButtons -1;
}
//if we are selecting the current su page, exit
else if( bNewPage == gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
return;
}
//else assign the new subpage
else
{
gHelpScreen.bCurrentHelpScreenActiveSubPage = bNewPage;
}
//refresh the screen
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_TEXT;
//'undepress' all the buttons
for( i=0; i< gHelpScreen.bNumberOfButtons; i++ )
{
ButtonList[ guiHelpScreenBtns[i] ]->uiFlags &= (~BUTTON_CLICKED_ON );
}
//depress the proper button
ButtonList[ guiHelpScreenBtns[ gHelpScreen.bCurrentHelpScreenActiveSubPage ] ]->uiFlags |= BUTTON_CLICKED_ON;
//change the current sub page, and render it to the buffer
ChangeHelpScreenSubPage();
}
void GetHelpScreenText( UINT32 uiRecordToGet, STR16 pText )
{
INT32 iStartLoc = -1;
iStartLoc = HELPSCREEN_RECORD_SIZE * uiRecordToGet;
LoadEncryptedDataFromFile(HELPSCREEN_FILE, pText, iStartLoc, HELPSCREEN_RECORD_SIZE );
}
//returns the number of vertical pixels printed
UINT16 GetAndDisplayHelpScreenText( UINT32 uiRecord, UINT16 usPosX, UINT16 usPosY, UINT16 usWidth )
{
CHAR16 zText[1024];
UINT16 usNumVertPixels = 0;
UINT32 uiStartLoc;
SetFontShadow( NO_SHADOW );
GetHelpScreenText( uiRecord, zText );
//Get the record
uiStartLoc = HELPSCREEN_RECORD_SIZE * uiRecord;
LoadEncryptedDataFromFile(HELPSCREEN_FILE, zText, uiStartLoc, HELPSCREEN_RECORD_SIZE );
//Display the text
usNumVertPixels = IanDisplayWrappedString( usPosX, usPosY, usWidth, HELP_SCREEN_GAP_BTN_LINES,
HELP_SCREEN_TEXT_BODY_FONT, HELP_SCREEN_TEXT_BODY_COLOR, zText,
HELP_SCREEN_TEXT_BACKGROUND, FALSE, 0 );
SetFontShadow( DEFAULT_SHADOW );
return( usNumVertPixels );
}
void BtnHelpScreenDontShowHelpAgainCallback( GUI_BUTTON *btn, INT32 reason )
{
// UINT8 ubButton = (UINT8)MSYS_GetBtnUserData( btn, 0 );
if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
}
else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
/*
btn->uiFlags &= ~BUTTON_CLICKED_ON;
if( gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen & ( 1 << gHelpScreen.bCurrentHelpScreen ) )
{
//
gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen &= ~( 1 << gHelpScreen.bCurrentHelpScreen );
}
else
{
// gHelpScreen.usHasPlayerSeenHelpScreenInCurrentScreen |= ( 1 << gHelpScreen.bCurrentHelpScreen );
}
// btn->uiFlags |= BUTTON_CLICKED_ON;
*/
}
}
/*
void HelpScreenDontShowHelpAgainToggleTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
else if( iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
if( gGameSettings.fOptions[ ubButton ] )
{
}
else
{
}
}
}
*/
//set the fact the we have chmaged to a new screen
void NewScreenSoResetHelpScreen( )
{
gHelpScreen.fHaveAlreadyBeenInHelpScreenSinceEnteringCurrenScreen = FALSE;
gHelpScreen.bDelayEnteringHelpScreenBy1FrameCount = 0;
}
void BtnHelpScreenExitCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
PrepareToExitHelpScreen();
btn->uiFlags &= (~BUTTON_CLICKED_ON );
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
UINT16 RenderLaptopHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_LPTP_OVERVIEW:
//Display all the paragraphs
for( ubCnt=0; ubCnt<2; ubCnt++ )
{
//Display the text, and get the number of pixels it used to display it
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_OVERVIEW_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
/*
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_OVERVIEW_P1, usPosX, usPosY, usWidth );
usPosY = usPosY+ usNumVertPixels + GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
//Display the second paragraph
usTotalNumberOfVerticalPixels += GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_OVERVIEW_P2, usPosX, usPosY, usWidth );
*/
break;
case HLP_SCRN_LPTP_EMAIL:
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_EMAIL_P1, usPosX, usPosY, usWidth );
break;
case HLP_SCRN_LPTP_WEB:
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_WEB_P1, usPosX, usPosY, usWidth );
break;
case HLP_SCRN_LPTP_FILES:
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_FILES_P1, usPosX, usPosY, usWidth );
break;
case HLP_SCRN_LPTP_HISTORY:
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_HISTORY_P1, usPosX, usPosY, usWidth );
break;
case HLP_SCRN_LPTP_PERSONNEL:
//Display the first paragraph
usTotalNumberOfVerticalPixels = GetAndDisplayHelpScreenText( HLP_TXT_LAPTOP_PERSONNEL_P1, usPosX, usPosY, usWidth );
break;
case HLP_SCRN_LPTP_FINANCIAL:
//Display all the paragraphs
for( ubCnt=0; ubCnt<2; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_FINANCES_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_LPTP_MERC_STATS:
//Display all the paragraphs
for( ubCnt=0; ubCnt<15; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_MERC_STATS_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
UINT16 RenderMapScreenNoOneHiredYetHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_NO_ONE_HIRED:
//Display all the paragraphs
for( ubCnt=0; ubCnt<2; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_MPSCRN_NO_1_HIRED_YET_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
UINT16 RenderMapScreenNotYetInArulcoHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_NOT_IN_ARULCO:
//Display all the paragraphs
for( ubCnt=0; ubCnt<3; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_MPSCRN_NOT_IN_ARULCO_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
UINT16 RenderMapScreenSectorInventoryHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_MPSCRN_SCTR_OVERVIEW:
//Display all the paragraphs
for( ubCnt=0; ubCnt<2; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_SECTOR_INVTRY_OVERVIEW_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
UINT16 RenderTacticalHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_TACTICAL_OVERVIEW:
//Display all the paragraph
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_OVERVIEW_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_TACTICAL_MOVEMENT:
//Display all the paragraphs
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_MOVEMENT_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_TACTICAL_SIGHT:
//Display all the paragraphs
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_SIGHT_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_TACTICAL_ATTACKING:
//Display all the paragraphs
for( ubCnt=0; ubCnt<3; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_ATTACKING_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_TACTICAL_ITEMS:
//Display all the paragraphs
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_ITEMS_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_TACTICAL_KEYBOARD:
//Display all the paragraphs
for( ubCnt=0; ubCnt<8; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_TACTICAL_KEYBOARD_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
UINT16 RenderMapScreenHelpScreen()
{
UINT16 usPosX, usPosY, usWidth, usNumVertPixels;
UINT8 ubCnt;
UINT16 usTotalNumberOfVerticalPixels=0;
UINT16 usFontHeight = GetFontHeight( HELP_SCREEN_TEXT_BODY_FONT );
if( gHelpScreen.bCurrentHelpScreenActiveSubPage == -1 )
{
return( 0 );
}
//Get the position for the text
GetHelpScreenTextPositions( &usPosX, &usPosY, &usWidth );
//switch on the current screen
switch( gHelpScreen.bCurrentHelpScreenActiveSubPage )
{
case HLP_SCRN_MPSCRN_OVERVIEW:
//Display all the paragraph
for( ubCnt=0; ubCnt<3; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_OVERVIEW_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_ASSIGNMENTS:
//Display all the paragraphs
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_ASSNMNT_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_DESTINATIONS:
//Display all the paragraphs
for( ubCnt=0; ubCnt<5; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_DSTINATION_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_MAP:
//Display all the paragraphs
for( ubCnt=0; ubCnt<3; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_MAP_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_MILITIA:
//Display all the paragraphs
for( ubCnt=0; ubCnt<3; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_MILITIA_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_AIRSPACE:
//Display all the paragraphs
for( ubCnt=0; ubCnt<2; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_AIRSPACE_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_ITEMS:
//Display all the paragraphs
for( ubCnt=0; ubCnt<1; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_ITEMS_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
case HLP_SCRN_MPSCRN_KEYBOARD:
//Display all the paragraphs
for( ubCnt=0; ubCnt<4; ubCnt++ )
{
usNumVertPixels = GetAndDisplayHelpScreenText( HLP_TXT_WELCOM_TO_ARULCO_KEYBOARD_P1+ubCnt, usPosX, usPosY, usWidth );
//move the next text down by the right amount
usPosY = usPosY+ usNumVertPixels + usFontHeight;
//add the total amount of pixels used
usTotalNumberOfVerticalPixels += usNumVertPixels + usFontHeight;
}
break;
}
return( usTotalNumberOfVerticalPixels );
}
void RefreshAllHelpScreenButtons()
{
UINT8 i;
//loop through all the buttons, and refresh them
for( i=0; i< gHelpScreen.bNumberOfButtons; i++ )
{
ButtonList[ guiHelpScreenBtns[i] ]->uiFlags |= BUTTON_DIRTY;
}
ButtonList[ guiHelpScreenExitBtn ]->uiFlags |= BUTTON_DIRTY;
if( !gHelpScreen.fForceHelpScreenToComeUp )
{
ButtonList[ gHelpScreenDontShowHelpAgainToggle ]->uiFlags |= BUTTON_DIRTY;
}
ButtonList[ giHelpScreenScrollArrows[0] ]->uiFlags |= BUTTON_DIRTY;
ButtonList[ giHelpScreenScrollArrows[1] ]->uiFlags |= BUTTON_DIRTY;
}
INT8 HelpScreenDetermineWhichMapScreenHelpToShow()
{
if( fShowMapInventoryPool )
{
return( HELP_SCREEN_MAPSCREEN_SECTOR_INVENTORY );
}
if( AnyMercsHired() == FALSE )
{
return( HELP_SCREEN_MAPSCREEN_NO_ONE_HIRED );
}
if( gTacticalStatus.fDidGameJustStart )
{
return( HELP_SCREEN_MAPSCREEN_NOT_IN_ARULCO );
}
return( HELP_SCREEN_MAPSCREEN );
}
BOOLEAN CreateHelpScreenTextBuffer()
{
VSURFACE_DESC vs_desc;
// Create a background video surface to blt the face onto
vs_desc.fCreateFlags = VSURFACE_CREATE_DEFAULT | VSURFACE_SYSTEM_MEM_USAGE;
vs_desc.usWidth = HLP_SCRN__WIDTH_OF_TEXT_BUFFER;
vs_desc.usHeight = HLP_SCRN__HEIGHT_OF_TEXT_BUFFER;
vs_desc.ubBitDepth = 16;
CHECKF( AddVideoSurface( &vs_desc, &guiHelpScreenTextBufferSurface) );
return( TRUE );
}
void DestroyHelpScreenTextBuffer()
{
DeleteVideoSurfaceFromIndex( guiHelpScreenTextBufferSurface );
}
void RenderCurrentHelpScreenTextToBuffer()
{
//clear the buffer ( use 0, black as a transparent color
ClearHelpScreenTextBuffer();
//Render the current screen, and get the number of pixels it used to display
gHelpScreen.usTotalNumberOfPixelsInBuffer = RenderSpecificHelpScreen();
//calc the number of lines in the buffer
gHelpScreen.usTotalNumberOfLinesInBuffer = gHelpScreen.usTotalNumberOfPixelsInBuffer / ( HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER );
}
void RenderTextBufferToScreen()
{
HVSURFACE hDestVSurface, hSrcVSurface;
SGPRect SrcRect;
GetVideoSurface( &hDestVSurface, guiRENDERBUFFER );
GetVideoSurface( &hSrcVSurface, guiHelpScreenTextBufferSurface );
SrcRect.iLeft = 0;
SrcRect.iTop = gHelpScreen.iLineAtTopOfTextBuffer * HLP_SCRN__HEIGHT_OF_1_LINE_IN_BUFFER;
SrcRect.iRight = HLP_SCRN__WIDTH_OF_TEXT_BUFFER;
SrcRect.iBottom = SrcRect.iTop + HLP_SCRN__HEIGHT_OF_TEXT_AREA - ( 2 * 8 );
BltVSurfaceUsingDD( hDestVSurface, hSrcVSurface, VO_BLT_SRCTRANSPARENCY, gHelpScreen.usLeftMarginPosX, ( gHelpScreen.usScreenLocY + HELP_SCREEN_TEXT_OFFSET_Y ), (RECT*)&SrcRect );
DisplayHelpScreenTextBufferScrollBox();
}
void ChangeHelpScreenSubPage()
{
//reset
gHelpScreen.iLineAtTopOfTextBuffer = 0;
RenderCurrentHelpScreenTextToBuffer();
//enable or disable the help screen arrow buttons
if( gHelpScreen.usTotalNumberOfLinesInBuffer <= HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER )
{
DisableButton( giHelpScreenScrollArrows[0] );
DisableButton( giHelpScreenScrollArrows[1] );
}
else
{
EnableButton( giHelpScreenScrollArrows[0] );
EnableButton( giHelpScreenScrollArrows[1] );
}
}
void ClearHelpScreenTextBuffer()
{
UINT32 uiDestPitchBYTES;
UINT8 *pDestBuf;
// CLEAR THE FRAME BUFFER
pDestBuf = LockVideoSurface( guiHelpScreenTextBufferSurface, &uiDestPitchBYTES );
memset(pDestBuf, 0, HLP_SCRN__HEIGHT_OF_TEXT_BUFFER * uiDestPitchBYTES );
UnLockVideoSurface( guiHelpScreenTextBufferSurface );
InvalidateScreen( );
}
// - is up, + is down
void ChangeTopLineInTextBufferByAmount( INT32 iAmouontToMove )
{
//if we are moving up
if( iAmouontToMove < 0 )
{
if( gHelpScreen.iLineAtTopOfTextBuffer + iAmouontToMove >= 0 )
{
//if we can move up by the requested amount
if( ( gHelpScreen.usTotalNumberOfLinesInBuffer - gHelpScreen.iLineAtTopOfTextBuffer ) > iAmouontToMove )
{
gHelpScreen.iLineAtTopOfTextBuffer += iAmouontToMove;
}
//else, trying to move past the top
else
{
gHelpScreen.iLineAtTopOfTextBuffer = 0;
}
}
else
{
gHelpScreen.iLineAtTopOfTextBuffer = 0;
}
}
//else we are moving down
else
{
//if we dont have to scroll cause there is not enough text
if( gHelpScreen.usTotalNumberOfLinesInBuffer <= HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER )
{
gHelpScreen.iLineAtTopOfTextBuffer = 0;
}
else
{
if( ( gHelpScreen.iLineAtTopOfTextBuffer + HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER + iAmouontToMove ) <= gHelpScreen.usTotalNumberOfLinesInBuffer )
{
gHelpScreen.iLineAtTopOfTextBuffer += iAmouontToMove;
}
else
{
gHelpScreen.iLineAtTopOfTextBuffer = gHelpScreen.usTotalNumberOfLinesInBuffer - HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER;
}
}
}
// RenderCurrentHelpScreenTextToBuffer();
gHelpScreen.ubHelpScreenDirty = HLP_SCRN_DRTY_LVL_REFRESH_TEXT;
}
void DisplayHelpScreenTextBufferScrollBox()
{
INT32 iSizeOfBox;
INT32 iTopPosScrollBox=0;
UINT8 *pDestBuf;
UINT32 uiDestPitchBYTES;
UINT16 usPosX;
if( gHelpScreen.bNumberOfButtons != 0 )
{
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_POSX + HELP_SCREEN_BUTTON_BORDER_WIDTH;
}
else
{
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_POSX;
}
//
//first calculate the height of the scroll box
//
CalculateHeightAndPositionForHelpScreenScrollBox( &iSizeOfBox, &iTopPosScrollBox );
//
// next draw the box
//
//if there ARE scroll bars, draw the
if( !( gHelpScreen.usTotalNumberOfLinesInBuffer <= HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER ) )
{
ColorFillVideoSurfaceArea( FRAME_BUFFER, usPosX, iTopPosScrollBox, usPosX+HLP_SCRN__WIDTH_OF_SCROLL_AREA, iTopPosScrollBox+iSizeOfBox-1, Get16BPPColor( FROMRGB( 227, 198, 88 ) ) );
//display the line
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// draw the gold highlite line on the top and left
LineDraw(FALSE, usPosX, iTopPosScrollBox, usPosX+HLP_SCRN__WIDTH_OF_SCROLL_AREA, iTopPosScrollBox, Get16BPPColor( FROMRGB( 235, 222, 171 ) ), pDestBuf);
LineDraw(FALSE, usPosX, iTopPosScrollBox, usPosX, iTopPosScrollBox+iSizeOfBox-1, Get16BPPColor( FROMRGB( 235, 222, 171 ) ), pDestBuf);
// draw the shadow line on the bottom and right
LineDraw(FALSE, usPosX, iTopPosScrollBox+iSizeOfBox-1, usPosX+HLP_SCRN__WIDTH_OF_SCROLL_AREA, iTopPosScrollBox+iSizeOfBox-1, Get16BPPColor( FROMRGB( 65, 49, 6 ) ), pDestBuf);
LineDraw(FALSE, usPosX+HLP_SCRN__WIDTH_OF_SCROLL_AREA, iTopPosScrollBox, usPosX+HLP_SCRN__WIDTH_OF_SCROLL_AREA, iTopPosScrollBox+iSizeOfBox-1, Get16BPPColor( FROMRGB( 65, 49, 6 ) ), pDestBuf);
// unlock frame buffer
UnLockVideoSurface( FRAME_BUFFER );
}
}
void CreateScrollAreaButtons()
{
UINT16 usPosX, usWidth, usPosY;
INT32 iPosY, iHeight;
if( gHelpScreen.bNumberOfButtons != 0 )
{
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_POSX + HELP_SCREEN_BUTTON_BORDER_WIDTH;
}
else
{
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_POSX;
}
usWidth = HLP_SCRN__WIDTH_OF_SCROLL_AREA;
//Get the height and position of the scroll box
CalculateHeightAndPositionForHelpScreenScrollBox( &iHeight, &iPosY );
//Create a mouse region 'mask' the entrire screen
MSYS_DefineRegion( &gHelpScreenScrollArea, usPosX, (UINT16)iPosY, (UINT16)(usPosX+usWidth), (UINT16)(iPosY+HLP_SCRN__HEIGHT_OF_SCROLL_AREA), MSYS_PRIORITY_HIGHEST,
gHelpScreen.usCursor, SelectHelpScrollAreaMovementCallBack, SelectHelpScrollAreaCallBack );
MSYS_AddRegion( &gHelpScreenScrollArea );
guiHelpScreenScrollArrowImage[ 0 ] = LoadButtonImage( "INTERFACE\\HelpScreen.sti", 14,10, 11, 12 ,13 );
guiHelpScreenScrollArrowImage[ 1 ] = UseLoadedButtonImage( guiHelpScreenScrollArrowImage[ 0 ] ,19,15,16,17,18 );
if( gHelpScreen.bNumberOfButtons != 0 )
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_UP_ARROW_X + HELP_SCREEN_BUTTON_BORDER_WIDTH;
else
usPosX = gHelpScreen.usScreenLocX + HLP_SCRN__SCROLL_UP_ARROW_X;
usPosY = gHelpScreen.usScreenLocY + HLP_SCRN__SCROLL_UP_ARROW_Y;
//Create the scroll arrows
giHelpScreenScrollArrows[ 0 ] = QuickCreateButton( guiHelpScreenScrollArrowImage[ 0 ], usPosX, usPosY,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, BtnHelpScreenScrollArrowsCallback );
MSYS_SetBtnUserData( giHelpScreenScrollArrows[0],0,0);
SetButtonCursor( giHelpScreenScrollArrows[0], gHelpScreen.usCursor );
usPosY = gHelpScreen.usScreenLocY + HLP_SCRN__SCROLL_DWN_ARROW_Y;
//Create the scroll arrows
giHelpScreenScrollArrows[ 1 ] = QuickCreateButton( guiHelpScreenScrollArrowImage[ 1 ], usPosX, usPosY,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, BtnHelpScreenScrollArrowsCallback );
MSYS_SetBtnUserData( giHelpScreenScrollArrows[1],0,1);
SetButtonCursor( giHelpScreenScrollArrows[1], gHelpScreen.usCursor );
}
void DeleteScrollArrowButtons()
{
INT8 i;
//remove the mouse region that blankets
MSYS_RemoveRegion( &gHelpScreenScrollArea );
for( i=0; i<2; i++)
{
RemoveButton( giHelpScreenScrollArrows[ i ] );
UnloadButtonImage( guiHelpScreenScrollArrowImage[ i ] );
}
}
void CalculateHeightAndPositionForHelpScreenScrollBox( INT32 *piHeightOfScrollBox, INT32 *piTopOfScrollBox )
{
INT32 iSizeOfBox, iTopPosScrollBox;
FLOAT dPercentSizeOfBox = 0;
FLOAT dTemp=0;
dPercentSizeOfBox = HLP_SCRN__MAX_NUMBER_DISPLAYED_LINES_IN_BUFFER / (FLOAT ) gHelpScreen.usTotalNumberOfLinesInBuffer;
//if the # is >= 1 then the box is the full size of the scroll area
if( dPercentSizeOfBox >= 1.0 )
{
iSizeOfBox = HLP_SCRN__HEIGHT_OF_SCROLL_AREA;
//no need to calc the top spot for the box
iTopPosScrollBox = HLP_SCRN__SCROLL_POSY;
}
else
{
iSizeOfBox = (INT32)( dPercentSizeOfBox * HLP_SCRN__HEIGHT_OF_SCROLL_AREA + 0.5 );
//
//next, calculate the top position of the box
//
dTemp = ( HLP_SCRN__HEIGHT_OF_SCROLL_AREA / ( FLOAT ) gHelpScreen.usTotalNumberOfLinesInBuffer ) * gHelpScreen.iLineAtTopOfTextBuffer;
iTopPosScrollBox = (INT32)( dTemp +.5 ) + HLP_SCRN__SCROLL_POSY;
}
if( piHeightOfScrollBox != NULL )
*piHeightOfScrollBox = iSizeOfBox;
if( piTopOfScrollBox != NULL )
*piTopOfScrollBox = iTopPosScrollBox;
}
void SelectHelpScrollAreaCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
if (iReason & MSYS_CALLBACK_REASON_INIT)
{
}
else if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
gfScrollBoxIsScrolling = FALSE;
gHelpScreen.iLastMouseClickY = -1;
}
else if( iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
gfScrollBoxIsScrolling = TRUE;
HelpScreenMouseMoveScrollBox( pRegion->MouseYPos );
}
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
{
}
}
void SelectHelpScrollAreaMovementCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
if( iReason & MSYS_CALLBACK_REASON_LOST_MOUSE )
{
// InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
else if( iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
}
else if( iReason & MSYS_CALLBACK_REASON_MOVE )
{
if( gfLeftButtonState )
{
HelpScreenMouseMoveScrollBox( pRegion->MouseYPos );
}
}
}
void HelpScreenMouseMoveScrollBox( INT32 usMousePosY )
{
INT32 iPosY, iHeight;
INT32 iNumberOfIncrements=0;
FLOAT dSizeOfIncrement = ( HLP_SCRN__HEIGHT_OF_SCROLL_AREA / ( FLOAT ) gHelpScreen.usTotalNumberOfLinesInBuffer );
FLOAT dTemp;
INT32 iNewPosition;
CalculateHeightAndPositionForHelpScreenScrollBox( &iHeight, &iPosY );
if( AreWeClickingOnScrollBar( usMousePosY ) || gHelpScreen.iLastMouseClickY != -1 )
{
if( gHelpScreen.iLastMouseClickY == -1 )
gHelpScreen.iLastMouseClickY = usMousePosY;
if( usMousePosY < gHelpScreen.iLastMouseClickY )
{
// iNewPosition = iPosY - ( UINT16)( dSizeOfIncrement + .5);
iNewPosition = iPosY - ( gHelpScreen.iLastMouseClickY - usMousePosY );
}
else if( usMousePosY > gHelpScreen.iLastMouseClickY )
{
// iNewPosition = iPosY + ( UINT16)( dSizeOfIncrement + .5);
iNewPosition = iPosY + usMousePosY - gHelpScreen.iLastMouseClickY;
}
else
{
return;
}
dTemp = ( iNewPosition - iPosY ) / dSizeOfIncrement;
if( dTemp < 0 )
iNumberOfIncrements = (INT32)( dTemp - 0.5 );
else
iNumberOfIncrements = (INT32)( dTemp + 0.5 );
gHelpScreen.iLastMouseClickY = usMousePosY;
// return;
}
else
{
//if the mouse is higher then the top of the scroll area, set it to the top of the scroll area
if( usMousePosY < HLP_SCRN__SCROLL_POSY )
usMousePosY = HLP_SCRN__SCROLL_POSY;
dTemp = ( usMousePosY - iPosY ) / dSizeOfIncrement;
if( dTemp < 0 )
iNumberOfIncrements = (INT32)( dTemp - 0.5 );
else
iNumberOfIncrements = (INT32)( dTemp + 0.5 );
}
//if there has been a change
if( iNumberOfIncrements != 0 )
{
ChangeTopLineInTextBufferByAmount( iNumberOfIncrements );
}
}
void BtnHelpScreenScrollArrowsCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
INT32 iButtonID = MSYS_GetBtnUserData( btn, 0);
btn->uiFlags |= BUTTON_CLICKED_ON;
//if up
if( iButtonID == 0 )
{
ChangeTopLineInTextBufferByAmount( -1 );
}
else
{
ChangeTopLineInTextBufferByAmount( 1 );
}
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if( reason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT )
{
INT32 iButtonID = MSYS_GetBtnUserData( btn, 0);
//if up
if( iButtonID == 0 )
{
ChangeTopLineInTextBufferByAmount( -1 );
}
else
{
ChangeTopLineInTextBufferByAmount( 1 );
}
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
BOOLEAN AreWeClickingOnScrollBar( INT32 usMousePosY )
{
INT32 iPosY, iHeight;
CalculateHeightAndPositionForHelpScreenScrollBox( &iHeight, &iPosY );
if( usMousePosY >= iPosY && usMousePosY < ( iPosY + iHeight ) )
return( TRUE );
else
return( FALSE );
}