Files
source/Laptop/IMP MainPage.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

1181 lines
31 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#else
#include "IMP MainPage.h"
#include "CharProfile.h"
#include "IMPVideoObjects.h"
#include "Utilities.h"
#include "WCheck.h"
#include "Debug.h"
#include "WordWrap.h"
#include "Render Dirty.h"
#include "Encrypted File.h"
#include "cursors.h"
#include "laptop.h"
#include "finances.h"
#include "IMP Attribute Selection.h"
#include "IMP Text System.h"
#include "IMP Finish.h"
#include "mousesystem.h"
#include "Merc Hiring.h"
#include "LaptopSave.h"
#include "IMP Compile Character.h"
#include "IMP Portraits.h"
#include "soldier profile type.h"
#include "GameSettings.h"
#include "Soldier Profile.h"
#endif
#define MAIN_PAGE_BUTTON_TEXT_WIDTH 95
#define MAIN_PAGE_SPACE_BTN_BUTTONS 120
#define MAIN_PAGE__FIRST_BUTTON_POS_X ( LAPTOP_SCREEN_UL_X + 15 )
#define MAIN_PAGE__SECOND_BUTTON_POS_X ( MAIN_PAGE__FIRST_BUTTON_POS_X + MAIN_PAGE_SPACE_BTN_BUTTONS )
#define MAIN_PAGE__THIRD_BUTTON_POS_X ( MAIN_PAGE__SECOND_BUTTON_POS_X + MAIN_PAGE_SPACE_BTN_BUTTONS )
#define MAIN_PAGE__FOURTH_BUTTON_POS_X ( MAIN_PAGE__THIRD_BUTTON_POS_X + MAIN_PAGE_SPACE_BTN_BUTTONS )
// main page buttons
INT32 giIMPMainPageButton[6];
INT32 giIMPMainPageButtonImage[6];
// mouse regions for not entablable warning
MOUSE_REGION pIMPMainPageMouseRegions[ 4 ];
UINT32 guiCHARACTERPORTRAITFORMAINPAGE;
// function definitions
void CreateIMPMainPageButtons( void );
void DeleteIMPMainPageButtons( void );
void BtnIMPMainPageBackCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPageBeginCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPagePersonalityCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPagePortraitCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPageAttributesCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPagePortraitCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPMainPageVoiceCallback(GUI_BUTTON *btn,INT32 reason);
void ShadeUnSelectableButtons( void );
void UpDateIMPMainPageButtons( void );
void BeginMessageBoxCallBack( UINT8 bExitValue );
void DestoryMouseRegionsForIMPMainPageBasedOnCharGenStatus( void );
void CreateMouseRegionsForIMPMainPageBasedOnCharGenStatus( void );
void IMPMainPageNotSelectableBtnCallback(MOUSE_REGION * pRegion, INT32 iReason );
BOOLEAN LoadCharacterPortraitForMainPage( void );
BOOLEAN IMP_CanWeDisplayVoiceGraph( );
BOOLEAN IMP_CanWeDisplaySpecialtiesGraph( );
BOOLEAN IMP_CanWeDisplayAttributeGraph( );
BOOLEAN IMP_CanWeDisplayPortrait( );
BOOLEAN CheckIfFinishedCharacterGeneration( void );
// this is the current state of profiling the player is in.
/*
0 - Beginning
1 - Personnality
2 - Attributes and Skills
3 - Portrait
4 - Voice
5 - Done
*/
INT32 iCurrentProfileMode = IMP__REGISTRY;
extern INT32 iCurrentVoice;
// Return a count of how many IMP slots there are in total
INT32 CountIMPSlots()
{
INT32 idx;
// Keep a static count so we only count once
static INT32 iMaxIMPs = -1;
if (iMaxIMPs != -1)
return iMaxIMPs;
iMaxIMPs = 0;
// Count the males
for (idx = GetFirstMaleSlot(); idx <= GetLastMaleSlot(); ++idx)
{
++iMaxIMPs;
}
// Count the females
for (idx = GetFirstFemaleSlot(); idx <= GetLastFemaleSlot(); ++idx)
{
++iMaxIMPs;
}
Assert(iMaxIMPs > 0);
return iMaxIMPs;
}
INT32 GetFirstSlot(INT8 iSex)
{
if (iSex == MALE)
return GetFirstMaleSlot();
else if (iSex == FEMALE)
return GetFirstFemaleSlot();
else {
return GetFirstMaleSlot();
}
}
INT32 GetLastSlot(INT8 iSex)
{
if (iSex == MALE)
return GetLastMaleSlot();
else if (iSex == FEMALE)
return GetLastFemaleSlot();
else {
return GetLastFemaleSlot();
}
}
INT32 GetFirstFreeSlot(INT8 iSex) {
INT32 iStart = GetFirstSlot(iSex);
INT32 iEnd = GetLastSlot(iSex);
INT32 idx;
for (idx = iStart; idx <= iEnd; ++idx)
{
if (IsIMPSlotFree(gGameExternalOptions.iaIMPSlots[idx]) == TRUE)
return idx;
}
return -1;
}
// Return a count of how many IMP slots there are for males
INT32 CountMaleIMPSlots() {
INT32 idx;
// Keep a static count so we only count once
static INT32 iMaxMaleIMPS = -1;
if (iMaxMaleIMPS != -1)
return iMaxMaleIMPS;
iMaxMaleIMPS = 0;
for (idx = GetFirstMaleSlot(); idx <= GetLastMaleSlot(); ++idx)
// Count the males
{
++iMaxMaleIMPS;
}
Assert(iMaxMaleIMPS > 0);
return iMaxMaleIMPS;
}
INT32 GetFirstMaleSlot() {
Assert(gGameExternalOptions.iaIMPSlots[0] != -1);
return 0;
}
INT32 GetLastMaleSlot() {
// Keep a static count so we only count once
static INT32 idx = -1;
if (idx != -1)
return idx;
idx = 0;
// Skip the males
while (gGameExternalOptions.iaIMPSlots[idx] != -1)
{
++idx;
}
--idx;
Assert(idx >= 0);
Assert(gGameExternalOptions.iaIMPSlots[idx] != -1);
return idx;
}
// Return a count of how many IMP slots there are for females
INT32 CountFemaleIMPSlots() {
INT32 idx;
// Keep a static count so we only count once
static INT32 iMaxFemaleIMPS = -1;
if (iMaxFemaleIMPS != -1)
return iMaxFemaleIMPS;
iMaxFemaleIMPS = 0;
for (idx = GetFirstFemaleSlot(); idx <= GetLastFemaleSlot(); ++idx)
// Count the males
{
++iMaxFemaleIMPS;
}
Assert(iMaxFemaleIMPS > 0);
return iMaxFemaleIMPS;
}
INT32 GetFirstFemaleSlot() {
// Keep a static count so we only count once
static INT32 idx = -1;
if (idx != -1)
return idx;
idx = 0;
// Skip the males
while (gGameExternalOptions.iaIMPSlots[idx] != -1)
{
++idx;
}
++idx;
Assert(idx >= 0);
Assert(gGameExternalOptions.iaIMPSlots[idx] != -1);
return idx;
}
INT32 GetLastFemaleSlot() {
// Keep a static count so we only count once
static INT32 idx = -1;
if (idx != -1)
return idx;
idx = 0;
// Skip the males
while (gGameExternalOptions.iaIMPSlots[idx] != -1)
{
++idx;
}
++idx;
// Skip the females
while (gGameExternalOptions.iaIMPSlots[idx] != -1)
{
++idx;
}
--idx;
Assert(idx >= 0);
Assert(gGameExternalOptions.iaIMPSlots[idx] != -1);
return idx;
}
INT32 GetVoiceCountFromVoiceSlot(INT32 iSlot) {
if (iSlot <= GetLastMaleSlot())
return iSlot - GetFirstMaleSlot() + 1;
else
return iSlot - GetFirstFemaleSlot() + 1;
}
BOOLEAN IsIMPSlotFree(INT32 iIMPId)
{
if ((iIMPId >= 0) && (iIMPId < NUM_PROFILES) &&
((wcscmp(gMercProfiles[iIMPId].zName, L"") == 0) ||
(gMercProfiles[iIMPId].bMercStatus == MERC_IS_DEAD)))
{
return TRUE;
}
else
{
return FALSE;
}
}
void EnterIMPMainPage( void )
{
// turn off review mode
fReviewStats = FALSE;
// create buttons
CreateIMPMainPageButtons( );
// load portrait for face button, if applicable
LoadCharacterPortraitForMainPage( );
// create button masks for this screen
CreateMouseRegionsForIMPMainPageBasedOnCharGenStatus( );
// alter states
UpDateIMPMainPageButtons( );
// entry into IMP about us page
RenderIMPMainPage( );
return;
}
void ExitIMPMainPage( void )
{
// exit from IMP About us page
// delete Buttons
DeleteIMPMainPageButtons( );
DestoryMouseRegionsForIMPMainPageBasedOnCharGenStatus( );
return;
}
void RenderIMPMainPage( void )
{
// rneders the IMP about us page
// the background
RenderProfileBackGround( );
// the IMP symbol
//RenderIMPSymbol( 106, 1 );
// indent
RenderMainIndentFrame( 164, 74 );
return;
}
void HandleIMPMainPage( void )
{
// handles the IMP about main page
if ( CheckIfFinishedCharacterGeneration( ) )
{
iCurrentImpPage = IMP_FINISH;
}
// shade out buttons that should be shaded/unselectable
//ShadeUnSelectableButtons( );
return;
}
//
// this function will create the buttons needed for th IMP about us page
//
void CreateIMPMainPageButtons( void )
{
UINT16 usPosX=0;
CHAR16 sString[ 128 ];
// the back button button
giIMPMainPageButtonImage[0]= LoadButtonImage( "LAPTOP\\button_3.sti" ,-1,0,-1,1,-1 );
/* giIMPMainPageButton[0] = QuickCreateButton( giIMPMainPageButtonImage[0], LAPTOP_SCREEN_UL_X + 10 , LAPTOP_SCREEN_WEB_UL_Y + ( 360 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageBackCallback);
*/
//Cancel/back button
giIMPMainPageButton[0] = CreateIconAndTextButton( giIMPMainPageButtonImage[0], pImpButtonText[ 19 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
LAPTOP_SCREEN_UL_X + 15, LAPTOP_SCREEN_WEB_UL_Y + ( 360 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageBackCallback);
SpecifyButtonTextSubOffsets( giIMPMainPageButton[0], 0, -1, FALSE );
// the begin profiling button
giIMPMainPageButtonImage[1]= LoadButtonImage( "LAPTOP\\button_2.sti" ,-1,0,-1,1,-1 );
/*giIMPMainPageButton[1] = QuickCreateButton( giIMPMainPageButtonImage[1], LAPTOP_SCREEN_UL_X + 136 , LAPTOP_SCREEN_WEB_UL_Y + ( 174 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageBeginCallback);
*/
//Registry/Begin button
if(( iCurrentProfileMode == IMP__REGISTRY )||( iCurrentProfileMode > IMP__ATTRIBUTES) )
{
giIMPMainPageButton[1] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 1 ], pImpButtonText[ 1 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
LAPTOP_SCREEN_UL_X + 136 , LAPTOP_SCREEN_WEB_UL_Y + ( 174 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageBeginCallback);
}
else
{
giIMPMainPageButton[1] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 1 ], pImpButtonText[ 22 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
LAPTOP_SCREEN_UL_X + 136 , LAPTOP_SCREEN_WEB_UL_Y + ( 174 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageBeginCallback);
}
// the personality button
giIMPMainPageButtonImage[2]= LoadButtonImage( "LAPTOP\\button_8.sti" ,-1,0,-1,1,-1 );
/*
giIMPMainPageButton[2] = QuickCreateButton( giIMPMainPageButtonImage[2], LAPTOP_SCREEN_UL_X + 13 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPagePersonalityCallback);
*/
//Personality
giIMPMainPageButton[2] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 2 ], pImpButtonText[ 2 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
MAIN_PAGE__THIRD_BUTTON_POS_X, LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPagePersonalityCallback);
if( IMP_CanWeDisplaySpecialtiesGraph( ) )
{
SpecifyButtonIcon( giIMPMainPageButton[2], guiANALYSE, 0, 33, 23, FALSE );
}
// the attribs button
giIMPMainPageButtonImage[3]= LoadButtonImage( "LAPTOP\\button_8.sti" ,-1,0,-1,1,-1 );
/*
giIMPMainPageButton[3] = QuickCreateButton( giIMPMainPageButtonImage[3], LAPTOP_SCREEN_UL_X + 133 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageAttributesCallback);
*/
//Attributes
giIMPMainPageButton[3] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 3 ], pImpButtonText[ 3 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
MAIN_PAGE__FOURTH_BUTTON_POS_X, LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageAttributesCallback);
if( IMP_CanWeDisplayAttributeGraph( ) )
{
SpecifyButtonIcon( giIMPMainPageButton[3], guiATTRIBUTEGRAPH, 0, 25, 25, FALSE );
}
// the portrait button
giIMPMainPageButtonImage[4]= LoadButtonImage( "LAPTOP\\button_8.sti" ,-1,0,-1,1,-1 );
/*giIMPMainPageButton[4] = QuickCreateButton( giIMPMainPageButtonImage[4], LAPTOP_SCREEN_UL_X + 253 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPagePortraitCallback);
*/
//Portrait
giIMPMainPageButton[4] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 4 ], pImpButtonText[ 4 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
MAIN_PAGE__FIRST_BUTTON_POS_X, LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPagePortraitCallback);
// the voice button
giIMPMainPageButtonImage[5]= LoadButtonImage( "LAPTOP\\button_8.sti" ,-1,0,-1,1,-1 );
/*giIMPMainPageButton[5] = QuickCreateButton( giIMPMainPageButtonImage[5], LAPTOP_SCREEN_UL_X + 373 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ),
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageVoiceCallback);
*/
if( iCurrentProfileMode != IMP__VOICE && iCurrentProfileMode != IMP__PORTRAIT )
{
swprintf( sString, pImpButtonText[ 5 ], GetVoiceCountFromVoiceSlot(iCurrentVoice) );
}
else
{
swprintf( sString, pImpButtonText[ 25 ] );
}
//Voice
giIMPMainPageButton[5] = CreateIconAndTextButton( giIMPMainPageButtonImage[ 5 ], sString, FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
MAIN_PAGE__SECOND_BUTTON_POS_X, LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPMainPageVoiceCallback);
if( IMP_CanWeDisplayVoiceGraph( ) )
{
SpecifyButtonIcon( giIMPMainPageButton[5], guiSMALLSILHOUETTE, 0, 33, 23, FALSE );
}
SetButtonCursor(giIMPMainPageButton[ 0 ], CURSOR_WWW);
SetButtonCursor(giIMPMainPageButton[ 1 ], CURSOR_WWW);
SetButtonCursor(giIMPMainPageButton[ 2 ], CURSOR_WWW);
SetButtonCursor(giIMPMainPageButton[ 3 ], CURSOR_WWW);
SetButtonCursor(giIMPMainPageButton[ 4 ], CURSOR_WWW);
SetButtonCursor(giIMPMainPageButton[ 5 ], CURSOR_WWW);
SpecifyButtonTextOffsets( giIMPMainPageButton[ 2 ], 10, 40, TRUE );
SpecifyButtonTextOffsets( giIMPMainPageButton[ 3 ], 10, 40, TRUE );
SpecifyButtonTextOffsets( giIMPMainPageButton[ 4 ], 10, 40, TRUE );
SpecifyButtonTextOffsets( giIMPMainPageButton[ 5 ], 10, 40, TRUE );
SpecifyButtonTextWrappedWidth( giIMPMainPageButton[ 2 ], MAIN_PAGE_BUTTON_TEXT_WIDTH);
SpecifyButtonTextWrappedWidth( giIMPMainPageButton[ 3 ], MAIN_PAGE_BUTTON_TEXT_WIDTH);
SpecifyButtonTextWrappedWidth( giIMPMainPageButton[ 4 ], MAIN_PAGE_BUTTON_TEXT_WIDTH);
SpecifyButtonTextWrappedWidth( giIMPMainPageButton[ 5 ], MAIN_PAGE_BUTTON_TEXT_WIDTH);
return;
}
void DeleteIMPMainPageButtons( void )
{
// this function destroys the buttons needed for the IMP about Us Page
// the back button
RemoveButton(giIMPMainPageButton[0] );
UnloadButtonImage(giIMPMainPageButtonImage[0] );
// begin profiling button
RemoveButton(giIMPMainPageButton[1] );
UnloadButtonImage(giIMPMainPageButtonImage[1] );
// begin personna button
RemoveButton(giIMPMainPageButton[2] );
UnloadButtonImage(giIMPMainPageButtonImage[2] );
// begin attribs button
RemoveButton(giIMPMainPageButton[3] );
UnloadButtonImage(giIMPMainPageButtonImage[3] );
// begin portrait button
RemoveButton(giIMPMainPageButton[4] );
UnloadButtonImage(giIMPMainPageButtonImage[4] );
// begin voice button
RemoveButton(giIMPMainPageButton[5] );
UnloadButtonImage(giIMPMainPageButtonImage[5] );
return;
}
void BtnIMPMainPageBackCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for IMP Homepage About US button
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
iCurrentImpPage = IMP_HOME_PAGE;
fButtonPendingFlag = TRUE;
iCurrentProfileMode = IMP__REGISTRY;
fFinishedCharGeneration = FALSE;
ResetCharacterStats( );
}
}
}
void BtnIMPMainPageBeginCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for Main Page Begin Profiling
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
// too far along to change gender
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
// are we going to change name, or do we have to start over from scratch
if( iCurrentProfileMode > IMP__ATTRIBUTES )
{
// too far along, restart
DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 1 ], LAPTOP_SCREEN, MSG_BOX_FLAG_YESNO, BeginMessageBoxCallBack);
}
else
{
if( LaptopSaveInfo.iCurrentBalance < COST_OF_PROFILE )
{
DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 3 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, BeginMessageBoxCallBack);
}
else if( NumberOfMercsOnPlayerTeam() >= 18 )
{
DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 5 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, BeginMessageBoxCallBack);
}
else
{
// change name
iCurrentImpPage = IMP_BEGIN;
fButtonPendingFlag = TRUE;
}
}
}
}
}
void BtnIMPMainPagePersonalityCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for Main Page Begin Profiling
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
/*
// if not this far in char generation, don't alot ANY action
if( iCurrentProfileMode != IMP__PERSONALITY )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
return;
}
*/
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
iCurrentImpPage = IMP_PERSONALITY;
fButtonPendingFlag = TRUE;
}
}
}
void BtnIMPMainPageAttributesCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for Main Page Begin Profiling
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
// if not this far in char generation, don't alot ANY action
if( iCurrentProfileMode < IMP__ATTRIBUTES )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
return;
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
iCurrentImpPage = IMP_ATTRIBUTE_ENTRANCE;
fButtonPendingFlag = TRUE;
}
}
}
void BtnIMPMainPagePortraitCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for Main Page Begin Profiling
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
// if not this far in char generation, don't alot ANY action
if( ( iCurrentProfileMode != IMP__PORTRAIT )&&( iCurrentProfileMode != IMP__VOICE ) && ( iCurrentProfileMode > IMP__FINISH ) )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
return;
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
iCurrentImpPage = IMP_PORTRAIT;
fButtonPendingFlag = TRUE;
}
}
}
void BtnIMPMainPageVoiceCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for Main Page Begin Profiling
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
// if not this far in char generation, don't alot ANY action
if( ( iCurrentProfileMode != IMP__PORTRAIT ) && ( iCurrentProfileMode > IMP__FINISH ) )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
return;
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if (btn->uiFlags & BUTTON_CLICKED_ON)
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
iCurrentImpPage = IMP_VOICE;
fButtonPendingFlag = TRUE;
}
}
}
void NextProfilingMode( void )
{
// this function will change to mode the player is in for profiling
// if less than done
if(iCurrentProfileMode < IMP__VOICE)
iCurrentProfileMode++;
return;
}
BOOLEAN CheckIfFinishedCharacterGeneration( void )
{
// this function checks to see if character is done character generation
// are we done character generation
if( iCurrentProfileMode == IMP__FINISH )
{
// yes
return ( TRUE );
}
else
{
// no
return ( FALSE );
}
}
void ShadeUnSelectableButtons( void )
{
INT32 iCounter =0;
// this function looks at the status ofiCurrentProfileMode and decides which buttons
// should be shaded ( unselectable )
for( iCounter = iCurrentProfileMode; iCounter < 5; iCounter++ )
{
ShadowVideoSurfaceRect( FRAME_BUFFER, 13 + (iCounter ) * 120 + 114, 245, 13 + ( iCounter + 1 ) * 120 + 90, 245 + 92 );
InvalidateRegion(13 + (iCounter ) * 120 + 114, 245, 13 + (iCounter ) * 120 + 114, 245 + 92 );
}
fMarkButtonsDirtyFlag = FALSE;
return;
}
void UpDateIMPMainPageButtons( void )
{
// update mainpage button states
INT32 iCount = 0;
// disable all
for( iCount = 2; iCount < 6; iCount++)
{
DisableButton( giIMPMainPageButton[ iCount ] );
}
for( iCount = 0; iCount < 4; iCount++ )
{
MSYS_DisableRegion( &pIMPMainPageMouseRegions[ iCount ]);
}
// enable
switch( iCurrentProfileMode )
{
//begin
case IMP__REGISTRY:
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
break;
//Personality ( 3RD BUTTON )
case IMP__PERSONALITY:
EnableButton( giIMPMainPageButton[2] );
EnableButton( giIMPMainPageButton[4] );
EnableButton( giIMPMainPageButton[5] );
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
/*
EnableButton( giIMPMainPageButton[2] );
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
*/
break;
//Attributes ( 4th button )
case IMP__ATTRIBUTES:
EnableButton( giIMPMainPageButton[2] );
EnableButton( giIMPMainPageButton[4] );
EnableButton( giIMPMainPageButton[5] );
EnableButton( giIMPMainPageButton[3] );
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
/*
EnableButton( giIMPMainPageButton[3] );
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
*/
break;
//Portrait ( ist button
case IMP__PORTRAIT:
// EnableButton( giIMPMainPageButton[3] );
EnableButton( giIMPMainPageButton[4] );
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
/*
EnableButton( giIMPMainPageButton[3] );
EnableButton( giIMPMainPageButton[4] );
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
//MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
*/
break;
//Voice ( 2nd button )
case IMP__VOICE:
EnableButton( giIMPMainPageButton[4] );
EnableButton( giIMPMainPageButton[5] );
// MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 3 ]);
/*
//MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_EnableRegion( &pIMPMainPageMouseRegions[ 0 ]);
EnableButton( giIMPMainPageButton[3] );
EnableButton( giIMPMainPageButton[4] );
EnableButton( giIMPMainPageButton[5] );
*/
break;
}
return;
}
void BeginMessageBoxCallBack( UINT8 bExitValue )
{
// yes, so start over, else stay here and do nothing for now
if( bExitValue == MSG_BOX_RETURN_YES )
{
iCurrentImpPage = IMP_BEGIN;
iCurrentProfileMode = IMP__REGISTRY;
}
else if( bExitValue == MSG_BOX_RETURN_OK )
{
// if ok, then we are coming from financial warning, allow continue
}
return;
}
void CreateMouseRegionsForIMPMainPageBasedOnCharGenStatus( void )
{
// this procedure will create masks for the char generation main page
// mask for personality page button
MSYS_DefineRegion( &pIMPMainPageMouseRegions[ 0 ],LAPTOP_SCREEN_UL_X + 13 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), LAPTOP_SCREEN_UL_X + 13 + 115 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ) + 93 , MSYS_PRIORITY_HIGH+5,
CURSOR_WWW, MSYS_NO_CALLBACK, IMPMainPageNotSelectableBtnCallback );
// mask for attrib page button
MSYS_DefineRegion( &pIMPMainPageMouseRegions[ 1 ],LAPTOP_SCREEN_UL_X + 133 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), LAPTOP_SCREEN_UL_X + 133 + 115 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ) + 93 , MSYS_PRIORITY_HIGH+5,
CURSOR_WWW, MSYS_NO_CALLBACK, IMPMainPageNotSelectableBtnCallback );
// mask for portrait page button
MSYS_DefineRegion( &pIMPMainPageMouseRegions[ 2 ],LAPTOP_SCREEN_UL_X + 253 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), LAPTOP_SCREEN_UL_X + 253 + 115 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ) + 93 , MSYS_PRIORITY_HIGH+5,
CURSOR_WWW, MSYS_NO_CALLBACK, IMPMainPageNotSelectableBtnCallback );
// mask for voice page button
MSYS_DefineRegion( &pIMPMainPageMouseRegions[ 3 ],LAPTOP_SCREEN_UL_X + 373 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ), LAPTOP_SCREEN_UL_X + 373 + 115 , LAPTOP_SCREEN_WEB_UL_Y + ( 245 ) + 93 , MSYS_PRIORITY_HIGH+5,
CURSOR_WWW, MSYS_NO_CALLBACK, IMPMainPageNotSelectableBtnCallback );
return;
}
void DestoryMouseRegionsForIMPMainPageBasedOnCharGenStatus( void )
{
// will destroy button masks for the char gen pages
MSYS_RemoveRegion( &pIMPMainPageMouseRegions[ 0 ]);
MSYS_RemoveRegion( &pIMPMainPageMouseRegions[ 1 ]);
MSYS_RemoveRegion( &pIMPMainPageMouseRegions[ 2 ]);
MSYS_RemoveRegion( &pIMPMainPageMouseRegions[ 3 ]);
return;
}
void IMPMainPageNotSelectableBtnCallback(MOUSE_REGION * pRegion, INT32 iReason )
{
if (iReason & MSYS_CALLBACK_REASON_INIT)
{
return;
}
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 4 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, BeginMessageBoxCallBack);
}
return;
}
// WANNE NEW
// WDS: Allow flexible numbers of IMPs of each sex
INT32 CountFilledIMPSlots( INT8 iSex )
{
INT32 i;
INT32 iCount = 0;
INT32 iStart;
INT32 iEnd;
iStart = GetFirstSlot(iSex);
iEnd = GetLastSlot(iSex);
// Count the used slots
for (i = iStart; i <= iEnd; ++i)
{
if ((gGameExternalOptions.iaIMPSlots[i] != -1) &&
(!IsIMPSlotFree(gGameExternalOptions.iaIMPSlots[i])))
{
++iCount;
}
}
// Return the count of filled imp slots
return iCount;
}
INT32 CountEmptyIMPSlots( INT8 iSex )
{
INT32 i;
INT32 iCount = 0;
INT32 iStart;
INT32 iEnd;
iStart = GetFirstSlot(iSex);
iEnd = GetLastSlot(iSex);
// Count the free slots
for (i = iStart; i <= iEnd; ++i)
{
if (IsIMPSlotFree(gGameExternalOptions.iaIMPSlots[i]))
{
++iCount;
}
}
// Return the count of free imp slots
return iCount;
}
INT32 GetSexOfIMP(INT32 iIMPId)
{
INT32 ui;
for (ui = 0; ui < CountIMPSlots(); ++ui)
{
if (gGameExternalOptions.iaIMPSlots[ui] == iIMPId)
{
if (ui <= GetLastMaleSlot())
return MALE;
else
return FEMALE;
}
}
Assert(FALSE);
return MALE;
}
// WANNE NEW
INT32 GetFreeIMPSlot(INT32 iIMPId, INT32 iDefaultIMPId)
{
INT32 iStart;
INT32 iEnd;
INT32 i;
UINT32 iSex = GetSexOfIMP(iIMPId);
if (iIMPId != -1)
{
// We have a default imp id (90210 or nickname)
if (iDefaultIMPId != -1)
{
if (IsIMPSlotFree(iDefaultIMPId))
{
return iDefaultIMPId;
}
}
// The default IMP id is already used, find next free imp id
// Female
if (iSex == FEMALE)
{
iStart = GetFirstFemaleSlot();
iEnd = GetLastFemaleSlot();
}
else if (iSex == MALE)
{
iStart = GetFirstMaleSlot();
iEnd = GetLastMaleSlot();
}
// Find a free imp slot
for (i = iStart; i <= iEnd; ++i)
{
// Found a free imp slot
if (IsIMPSlotFree(gGameExternalOptions.iaIMPSlots[i]))
{
return gGameExternalOptions.iaIMPSlots[i];
}
}
}
/* Didn't find one */
return -1;
}
BOOLEAN LoadCharacterPortraitForMainPage( void )
{
// this function will load the character's portrait, to be used on portrait button
VOBJECT_DESC VObjectDesc;
if( IMP_CanWeDisplayPortrait( ) )
{
// load it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP( pPlayerSelectedFaceFileNames[ iPortraitNumber ] , VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiCHARACTERPORTRAITFORMAINPAGE));
// now specify
SpecifyButtonIcon( giIMPMainPageButton[4], guiCHARACTERPORTRAITFORMAINPAGE, 0,
33, 23, FALSE );
}
return( TRUE );
}
BOOLEAN IMP_CanWeDisplayPortrait( )
{
if( iCurrentProfileMode == IMP__VOICE ||
iCurrentProfileMode == IMP__ATTRIBUTES ||
iCurrentProfileMode == IMP__PERSONALITY ||
iCurrentProfileMode == IMP__FINISH )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOLEAN IMP_CanWeDisplayAttributeGraph( )
{
if( iCurrentProfileMode == IMP__FINISH )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOLEAN IMP_CanWeDisplaySpecialtiesGraph( )
{
if( iCurrentProfileMode == IMP__ATTRIBUTES ||
iCurrentProfileMode == IMP__FINISH )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOLEAN IMP_CanWeDisplayVoiceGraph( )
{
if( iCurrentProfileMode == IMP__ATTRIBUTES ||
// iCurrentProfileMode == IMP__VOICE ||
iCurrentProfileMode == IMP__PERSONALITY ||
iCurrentProfileMode == IMP__FINISH )
{
return( TRUE );
}
else
{
return( FALSE );
}
}