mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
o Speck can be hired by M.E.R.C o From now on, as long as Speck is hired (or dead, or POW, or travelling), he won't be sitting on Speck Com nor sending you emails. However, is he's able to, he'll comment on current situation from battlefield: player owing money, Flo getting married, MERC merc dying, etc., so keeping him alive might be a good idea o GameDir data revision >= 1701 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6215 3b4a5df2-a311-0410-b5c6-a8a6f20db521
1921 lines
140 KiB
C++
1921 lines
140 KiB
C++
// WANNE 3 <changed some lines>
|
|
#ifdef PRECOMPILEDHEADERS
|
|
#include "Laptop All.h"
|
|
#else
|
|
#include "laptop.h"
|
|
#include "mercs Files.h"
|
|
#include "mercs.h"
|
|
#include "Utilities.h"
|
|
#include "WCheck.h"
|
|
#include "WordWrap.h"
|
|
#include "Cursors.h"
|
|
#include "Soldier Profile.h"
|
|
#include "stdio.h"
|
|
#include "Encrypted File.h"
|
|
#include "AimMembers.h"
|
|
#include "InterFace Items.h"
|
|
#include "Game Clock.h"
|
|
#include "Soldier Add.h"
|
|
#include "OverHead.h"
|
|
#include "Game Clock.h"
|
|
#include "message.h"
|
|
#include "Font.h"
|
|
#include "LaptopSave.h"
|
|
#include "Text.h"
|
|
#include "Speck Quotes.h"
|
|
#include "Multi Language Graphic Utils.h"
|
|
#include "Quests.h"
|
|
#include "Assignments.h"
|
|
#include "Input.h"
|
|
#include "english.h"
|
|
#include "finances.h"
|
|
#include "GameSettings.h"
|
|
#include "Personnel.h"
|
|
#endif
|
|
|
|
#include "Cheats.h"
|
|
#include "connect.h"
|
|
#include "fresh_header.h"
|
|
#include "aim.h"
|
|
|
|
#define MERCBIOFILE "BINARYDATA\\MercBios.edt"
|
|
|
|
#define MERC_BIO_FONT FONT14ARIAL//FONT12ARIAL
|
|
#define MERC_BIO_COLOR FONT_MCOLOR_WHITE
|
|
|
|
#define MERC_TITLE_FONT FONT14ARIAL
|
|
#define MERC_TITLE_COLOR FONT_YELLOW
|
|
|
|
#define MERC_NAME_FONT FONT14ARIAL
|
|
#define MERC_NAME_COLOR FONT_MCOLOR_WHITE
|
|
|
|
#define MERC_STATS_FONT FONT12ARIAL
|
|
#define MERC_STATIC_STATS_COLOR FONT_YELLOW
|
|
#define MERC_DYNAMIC_STATS_COLOR FONT_MCOLOR_WHITE
|
|
#define HIGH_STATS_COLOR FONT_MCOLOR_WHITE
|
|
#define MED_STATS_COLOR FONT_MCOLOR_DKWHITE
|
|
#define LOW_STATS_COLOR FONT_MCOLOR_DKGRAY
|
|
|
|
#define MERC_FILES_PORTRAIT_BOX_X LAPTOP_SCREEN_UL_X + 16
|
|
#define MERC_FILES_PORTRAIT_BOX_Y LAPTOP_SCREEN_WEB_UL_Y + 17
|
|
|
|
#define MERC_FACE_X MERC_FILES_PORTRAIT_BOX_X + 2
|
|
#define MERC_FACE_Y MERC_FILES_PORTRAIT_BOX_Y + 2
|
|
#define MERC_FACE_WIDTH 106
|
|
#define MERC_FACE_HEIGHT 122
|
|
|
|
#define MERC_FILES_STATS_BOX_X LAPTOP_SCREEN_UL_X + 164
|
|
#define MERC_FILES_STATS_BOX_Y MERC_FILES_PORTRAIT_BOX_Y
|
|
|
|
|
|
#define MERC_FILES_BIO_BOX_X MERC_FILES_PORTRAIT_BOX_X
|
|
#define MERC_FILES_BIO_BOX_Y LAPTOP_SCREEN_WEB_UL_Y + 155
|
|
|
|
// OK
|
|
//JMich_MMG: Moving the buttons around a bit, and adding a new one
|
|
#define MERC_FILES_PREV_BUTTON_X MERC_FILES_PORTRAIT_BOX_X + 2
|
|
#define MERC_FILES_PREV_BUTTON_Y iScreenHeightOffset + 380
|
|
|
|
#define MERC_FILES_HIRE_BUTTON_X MERC_FILES_PREV_BUTTON_X + 92
|
|
#define MERC_FILES_HIRE_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
#define MERC_FILES_BIO_INV_BUTTON_X MERC_FILES_HIRE_BUTTON_X + 92
|
|
#define MERC_FILES_BIO_INV_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
#define MERC_FILES_BACK_BUTTON_X MERC_FILES_BIO_INV_BUTTON_X + 92
|
|
#define MERC_FILES_BACK_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
#define MERC_FILES_NEXT_BUTTON_X MERC_FILES_BACK_BUTTON_X + 92
|
|
#define MERC_FILES_NEXT_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
/*JMich_MMG: Original button positions
|
|
#define MERC_FILES_PREV_BUTTON_X iScreenWidthOffset + 128
|
|
#define MERC_FILES_PREV_BUTTON_Y iScreenHeightOffset + 380
|
|
|
|
#define MERC_FILES_HIRE_BUTTON_X MERC_FILES_PREV_BUTTON_X + 103 + 16 //iScreenWidthOffset + 260
|
|
#define MERC_FILES_HIRE_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
#define MERC_FILES_BACK_BUTTON_X MERC_FILES_HIRE_BUTTON_X + 103 + 16 //iScreenWidthOffset + 380
|
|
#define MERC_FILES_BACK_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
|
|
// OK
|
|
#define MERC_FILES_NEXT_BUTTON_X iScreenWidthOffset + 485 //490
|
|
#define MERC_FILES_NEXT_BUTTON_Y MERC_FILES_PREV_BUTTON_Y
|
|
*/
|
|
|
|
#define MERC_PAGE_X iScreenWidthOffset + 570
|
|
#define MERC_PAGE_Y iScreenHeightOffset + 425
|
|
|
|
#define MERC_NAME_X MERC_FILES_STATS_BOX_X + 50
|
|
#define MERC_NAME_Y MERC_FILES_STATS_BOX_Y + 10
|
|
|
|
#define MERC_BIO_TEXT_X MERC_FILES_BIO_BOX_X + 5
|
|
#define MERC_BIO_TEXT_Y MERC_FILES_BIO_BOX_Y + 10
|
|
|
|
#define MERC_ADD_BIO_TITLE_X MERC_BIO_TEXT_X
|
|
#define MERC_ADD_BIO_TITLE_Y MERC_BIO_TEXT_Y + 100
|
|
|
|
#define MERC_ADD_BIO_TEXT_X MERC_BIO_TEXT_X
|
|
#define MERC_ADD_BIO_TEXT_Y MERC_ADD_BIO_TITLE_Y + 20
|
|
|
|
#define MERC_BIO_WIDTH 460 - 10
|
|
|
|
#define MERC_BIO_INFO_TEXT_SIZE 5 * 80 * 2
|
|
#define MERC_BIO_ADD_INFO_TEXT_SIZE 2 * 80 * 2
|
|
#define MERC_BIO_SIZE 7 * 80 * 2
|
|
|
|
#define MERC_STATS_FIRST_COL_X MERC_NAME_X
|
|
#define MERC_STATS_FIRST_NUM_COL_X MERC_STATS_FIRST_COL_X + 90
|
|
#define MERC_STATS_SECOND_COL_X MERC_FILES_STATS_BOX_X + 170
|
|
#define MERC_STATS_SECOND_NUM_COL_X MERC_STATS_SECOND_COL_X + 115
|
|
#define MERC_SPACE_BN_LINES 15
|
|
|
|
#define MERC_HEALTH_Y MERC_FILES_STATS_BOX_Y + 30
|
|
|
|
#define MERC_PORTRAIT_TEXT_OFFSET_Y 107
|
|
|
|
//JMich_MMG: Defines for the inventory boxes
|
|
#define MERC_MEMBER_WEAPON_NAME_X MERC_WEAPONBOX_X
|
|
#define MERC_MEMBER_WEAPON_NAME_Y MERC_WEAPONBOX_Y + MERC_WEAPONBOX_SIZE_Y + 1
|
|
#define MERC_MEMBER_WEAPON_NAME_WIDTH MERC_WEAPONBOX_SIZE_X - 2
|
|
#define MERC_WEAPONBOX_X MERC_FILES_PORTRAIT_BOX_X + 3
|
|
#define MERC_WEAPONBOX_Y MERC_FILES_BIO_BOX_Y + 10
|
|
#define MERC_WEAPONBOX_SIZE_X 61
|
|
#define MERC_WEAPONBOX_SIZE_Y 31
|
|
#define MERC_WEAPONBOX_NUMBER 8
|
|
#define MERC_WEAPONBOX_X_NSGI MERC_FILES_PORTRAIT_BOX_X + 6
|
|
#define MERC_WEAPONBOX_Y_NSGI MERC_FILES_BIO_BOX_Y + 10
|
|
#define MERC_WEAPONBOX_SIZE_X_NSGI 64
|
|
#define MERC_WEAPONBOX_SIZE_Y_NSGI 30
|
|
#define MERC_WEAPONBOX_COLUMNS 7
|
|
#define MERC_WEAPONBOX_ROWS 3
|
|
#define MERC_WEAPONBOX_TOTAL_ITEMS MERC_WEAPONBOX_COLUMNS * MERC_WEAPONBOX_ROWS
|
|
|
|
#define MERC_WEAPONBOX_BUTTON_START_WIDTH 75
|
|
#define MERC_WEAPONBOX_BUTTON_START_HEIGHT 30
|
|
|
|
#define MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE 20
|
|
|
|
#define MERC_WEAPONBOX_LOADOUT_ONE_X MERC_FILES_PORTRAIT_BOX_X + 3
|
|
#define MERC_WEAPONBOX_LOADOUT_ONE_Y iScreenHeightOffset + 330 + LAPTOP_SCREEN_WEB_DELTA_Y
|
|
#define MERC_WEAPONBOX_LOADOUT_ONE_BOX_Y MERC_WEAPONBOX_LOADOUT_ONE_Y - 4
|
|
#define MERC_WEAPONBOX_LOADOUT_ONE_BR_X MERC_WEAPONBOX_LOADOUT_ONE_X + MERC_WEAPONBOX_BUTTON_START_WIDTH
|
|
#define MERC_WEAPONBOX_LOADOUT_ONE_BR_Y MERC_WEAPONBOX_LOADOUT_ONE_BOX_Y + MERC_WEAPONBOX_BUTTON_START_HEIGHT
|
|
#define MERC_WEAPONBOX_LOADOUT_TWO_X MERC_WEAPONBOX_LOADOUT_ONE_X + MERC_WEAPONBOX_BUTTON_START_WIDTH + MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE
|
|
#define MERC_WEAPONBOX_LOADOUT_TWO_Y MERC_WEAPONBOX_LOADOUT_ONE_Y
|
|
#define MERC_WEAPONBOX_LOADOUT_TWO_BOX_Y MERC_WEAPONBOX_LOADOUT_TWO_Y - 4
|
|
#define MERC_WEAPONBOX_LOADOUT_TWO_BR_X MERC_WEAPONBOX_LOADOUT_TWO_X + MERC_WEAPONBOX_BUTTON_START_WIDTH
|
|
#define MERC_WEAPONBOX_LOADOUT_TWO_BR_Y MERC_WEAPONBOX_LOADOUT_TWO_BOX_Y + MERC_WEAPONBOX_BUTTON_START_HEIGHT
|
|
#define MERC_WEAPONBOX_LOADOUT_THREE_X MERC_WEAPONBOX_LOADOUT_TWO_X + MERC_WEAPONBOX_BUTTON_START_WIDTH + MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE
|
|
#define MERC_WEAPONBOX_LOADOUT_THREE_Y MERC_WEAPONBOX_LOADOUT_TWO_Y
|
|
#define MERC_WEAPONBOX_LOADOUT_THREE_BOX_Y MERC_WEAPONBOX_LOADOUT_THREE_Y - 4
|
|
#define MERC_WEAPONBOX_LOADOUT_THREE_BR_X MERC_WEAPONBOX_LOADOUT_THREE_X + MERC_WEAPONBOX_BUTTON_START_WIDTH
|
|
#define MERC_WEAPONBOX_LOADOUT_THREE_BR_Y MERC_WEAPONBOX_LOADOUT_THREE_BOX_Y + MERC_WEAPONBOX_BUTTON_START_HEIGHT
|
|
#define MERC_WEAPONBOX_LOADOUT_FOUR_X MERC_WEAPONBOX_LOADOUT_THREE_X + MERC_WEAPONBOX_BUTTON_START_WIDTH + MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE
|
|
#define MERC_WEAPONBOX_LOADOUT_FOUR_Y MERC_WEAPONBOX_LOADOUT_THREE_Y
|
|
#define MERC_WEAPONBOX_LOADOUT_FOUR_BOX_Y MERC_WEAPONBOX_LOADOUT_FOUR_Y - 4
|
|
#define MERC_WEAPONBOX_LOADOUT_FOUR_BR_X MERC_WEAPONBOX_LOADOUT_FOUR_X + MERC_WEAPONBOX_BUTTON_START_WIDTH
|
|
#define MERC_WEAPONBOX_LOADOUT_FOUR_BR_Y MERC_WEAPONBOX_LOADOUT_FOUR_BOX_Y + MERC_WEAPONBOX_BUTTON_START_HEIGHT
|
|
#define MERC_WEAPONBOX_LOADOUT_FIVE_X MERC_WEAPONBOX_LOADOUT_FOUR_X + MERC_WEAPONBOX_BUTTON_START_WIDTH + MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE
|
|
#define MERC_WEAPONBOX_LOADOUT_FIVE_Y MERC_WEAPONBOX_LOADOUT_FOUR_Y
|
|
#define MERC_WEAPONBOX_LOADOUT_FIVE_BOX_Y MERC_WEAPONBOX_LOADOUT_FIVE_Y - 4
|
|
#define MERC_WEAPONBOX_LOADOUT_FIVE_BR_X MERC_WEAPONBOX_LOADOUT_FIVE_X + MERC_WEAPONBOX_BUTTON_START_WIDTH
|
|
#define MERC_WEAPONBOX_LOADOUT_FIVE_BR_Y MERC_WEAPONBOX_LOADOUT_FIVE_BOX_Y + MERC_WEAPONBOX_BUTTON_START_HEIGHT
|
|
|
|
//JMich_MMG: defines for the inventory buttons text
|
|
|
|
#define MERC_M_FONT_DYNAMIC_TEXT FONT10ARIAL
|
|
#define MERC_M_WEAPON_TEXT_FONT FONT10ARIAL
|
|
#define MERC_M_WEAPON_TEXT_COLOR FONT_MCOLOR_WHITE
|
|
#define MERC_M_KIT_BUTTON_FONT FONT12ARIAL
|
|
#define MERC_M_KIT_BUTTON_UP_COLOR FONT_MCOLOR_WHITE
|
|
#define MERC_M_KIT_BUTTON_DOWN_COLOR 138
|
|
|
|
|
|
UINT32 guiPortraitBox;
|
|
UINT32 guiStatsBox;
|
|
UINT32 guiBioBox;
|
|
UINT32 guiMercFace;
|
|
UINT32 lguiWeaponBox;
|
|
|
|
//JMich_MMG: Image for the inventory boxes.
|
|
UINT32 guiMercWeaponBox;
|
|
UINT32 guiMercWeaponKitButtonImage;
|
|
void EnableMercWeaponKitSelectionButtons();
|
|
void CreateMercWeaponBoxBackground();
|
|
|
|
//JMich_MMG: Adding a global variable for which page to display at the MERC files page
|
|
UINT8 gubCurMercFilesTogglePage;
|
|
//JMich_MMG: Array to hold the gearkit costs, to use when displaying the gearkit price buttons
|
|
UINT16 gubCurMercGearkitPrice[NUM_MERCSTARTINGGEAR_KITS];
|
|
enum
|
|
{
|
|
MERC_FILES_BIO_PAGE,
|
|
MERC_FILES_INV_PAGE,
|
|
NUM_MERC_PAGES
|
|
};
|
|
|
|
// flag for buying gear when hiring
|
|
BOOLEAN fMercBuyEquipment;
|
|
|
|
extern BOOLEAN fMercHireOverPlayerLimitMerc;
|
|
//
|
|
// Buttons
|
|
//
|
|
|
|
// The Prev button
|
|
void BtnMercPrevButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
UINT32 guiPrevButton;
|
|
INT32 guiButtonImage;
|
|
|
|
// The Next button
|
|
void BtnMercNextButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
UINT32 guiNextButton;
|
|
|
|
// The Hire button
|
|
void BtnMercHireButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
UINT32 guiHireButton;
|
|
|
|
// The Back button
|
|
void BtnMercFilesBackButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
UINT32 guiMercBackButton;
|
|
|
|
// Message box to buy gear
|
|
void MercHireButtonGearYesNoCallback (UINT8 bExitValue);
|
|
|
|
void MercProcessHireAfterGear();
|
|
|
|
//JMich_MMG: The BIO/INV toggle button
|
|
void BtnMercFilesBioInvToggleButtonCallback(GUI_BUTTON *btn, INT32 reason);
|
|
UINT32 guiBioInvButton;
|
|
|
|
//JMich_MMG: Mouseregion for item tooltips
|
|
MOUSE_REGION gMercWeaponboxFasthelpRegion[MERC_WEAPONBOX_TOTAL_ITEMS];
|
|
extern void GetHelpTextForItemInLaptop( STR16 pzStr, UINT16 usItemNumber );
|
|
void CreateMercWeaponBoxMouseRegions();
|
|
extern void HelpTextDoneCallback( void );
|
|
|
|
//JMich_MMG: Merc Kit Selection Buttons
|
|
UINT32 guiMercWeaponBoxSelectionButton[NUM_MERCSTARTINGGEAR_KITS];
|
|
void BtnMercWeaponboxSelectButtonCallback( GUI_BUTTON * btn, INT32 Reason);
|
|
|
|
//Mouse Regions
|
|
//Clicking on guys Face
|
|
MOUSE_REGION gMercSelectedFaceRegion;
|
|
void SelectMercsFaceRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
|
|
|
|
//****************************
|
|
//
|
|
// Function Prototypes
|
|
//
|
|
//****************************
|
|
|
|
BOOLEAN DisplayMercFace( UINT8 ubMercID );
|
|
void DisplayMercMemberClickOnFaceHelpText( UINT8 ubMercID );
|
|
void LoadAndDisplayMercBio( UINT8 ubMercID );
|
|
void DisplayMercsStats( UINT8 ubMercID );
|
|
BOOLEAN MercFilesHireMerc(UINT8 ubMercID);
|
|
void EnableDisableMercFilesNextPreviousButton( );
|
|
|
|
UINT8 GetStatsColor( INT8 bStat );
|
|
|
|
//Hotkey Assignment
|
|
void HandleMercsFilesKeyBoardInput( );
|
|
|
|
//JMich_MMG: Declaration of the display inventory function
|
|
BOOLEAN DisplayMERCMercsInventory(UINT8 ubMercID);
|
|
void CreateMercKitSelectionButtons();
|
|
void DisableMercWeaponKitSelectionButtons();
|
|
void RefreshMercWeaponKitSelectionButtons();
|
|
void MercWeaponKitSelectionUpdate(UINT8 selectedInventory = 0);
|
|
UINT8 gSelectedMercKit;
|
|
|
|
|
|
void GameInitMercsFiles()
|
|
{
|
|
|
|
}
|
|
|
|
BOOLEAN EnterMercsFiles()
|
|
{
|
|
VOBJECT_DESC VObjectDesc;
|
|
|
|
InitMercBackGround();
|
|
|
|
//JMich_MMG: Initialize the page to be used
|
|
gubCurMercFilesTogglePage = MERC_FILES_BIO_PAGE;
|
|
|
|
// load the stats box graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
GetMLGFilename( VObjectDesc.ImageFile, MLG_STATSBOX );
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiStatsBox));
|
|
|
|
// load the Portrait box graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\PortraitBox.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiPortraitBox));
|
|
|
|
// load the bio box graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BioBox.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiBioBox));
|
|
|
|
// load the WeaponBox graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\weaponbox.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &lguiWeaponBox));
|
|
|
|
// load the WeaponBox graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\mercbox.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiMercWeaponBox));
|
|
|
|
//** Mouse Regions **
|
|
// mouse region for skills/traits tooltip on merc portrait
|
|
MSYS_DefineRegion( &gMercSelectedFaceRegion, MERC_FACE_X, MERC_FACE_Y , MERC_FACE_X + MERC_FACE_WIDTH , MERC_FACE_Y + MERC_FACE_HEIGHT, MSYS_PRIORITY_HIGH,
|
|
CURSOR_WWW, MSYS_NO_CALLBACK, SelectMercsFaceRegionCallBack );
|
|
MSYS_AddRegion(&gMercSelectedFaceRegion);
|
|
|
|
// Prev Box button
|
|
guiButtonImage = LoadButtonImage("LAPTOP\\mercmediumbuttons.sti", -1,0,-1,1,-1 );
|
|
// Weapon Kit Button
|
|
guiMercWeaponKitButtonImage = LoadButtonImage("LAPTOP\\MERCGEARKITBUTTON.sti", -1,0,-1,1,-1 );
|
|
|
|
guiPrevButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_PREVIOUS],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_PREV_BUTTON_X, MERC_FILES_PREV_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercPrevButtonCallback);
|
|
|
|
SetButtonCursor(guiPrevButton, CURSOR_LAPTOP_SCREEN);
|
|
SpecifyDisabledButtonStyle( guiPrevButton, DISABLED_STYLE_SHADED);
|
|
|
|
//Next Button
|
|
guiNextButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_NEXT],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_NEXT_BUTTON_X, MERC_FILES_NEXT_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercNextButtonCallback);
|
|
|
|
SetButtonCursor(guiNextButton, CURSOR_LAPTOP_SCREEN);
|
|
SpecifyDisabledButtonStyle( guiNextButton, DISABLED_STYLE_SHADED);
|
|
|
|
//Hire button
|
|
guiHireButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_HIRE],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_HIRE_BUTTON_X, MERC_FILES_HIRE_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercHireButtonCallback);
|
|
SetButtonCursor(guiHireButton, CURSOR_LAPTOP_SCREEN);
|
|
SpecifyDisabledButtonStyle( guiHireButton, DISABLED_STYLE_SHADED);
|
|
|
|
//Back button
|
|
guiMercBackButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_HOME],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_BACK_BUTTON_X, MERC_FILES_BACK_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercFilesBackButtonCallback);
|
|
SetButtonCursor(guiMercBackButton, CURSOR_LAPTOP_SCREEN);
|
|
SpecifyDisabledButtonStyle( guiMercBackButton, DISABLED_STYLE_SHADED);
|
|
|
|
//JMich_MMG: Bio/Inv button
|
|
if (gubCurMercFilesTogglePage + 1 == NUM_MERC_PAGES)
|
|
{
|
|
guiBioInvButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_BIO],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_BIO_INV_BUTTON_X, MERC_FILES_BIO_INV_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercFilesBioInvToggleButtonCallback);
|
|
SetButtonCursor(guiBioInvButton, CURSOR_LAPTOP_SCREEN);
|
|
}
|
|
else
|
|
{
|
|
guiBioInvButton = CreateIconAndTextButton( guiButtonImage, MercInfo[MERC_FILES_BIO + gubCurMercFilesTogglePage + 1],
|
|
FONT12ARIAL,
|
|
MERC_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_FILES_BIO_INV_BUTTON_X, MERC_FILES_BIO_INV_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercFilesBioInvToggleButtonCallback);
|
|
SetButtonCursor(guiBioInvButton, CURSOR_LAPTOP_SCREEN);
|
|
}
|
|
SpecifyDisabledButtonStyle( guiBioInvButton, DISABLED_STYLE_SHADED);
|
|
CreateMercKitSelectionButtons();
|
|
CreateMercWeaponBoxMouseRegions();
|
|
DisableMercWeaponKitSelectionButtons();
|
|
// RenderMercsFiles();
|
|
return( TRUE );
|
|
}
|
|
|
|
void SelectMercsFaceRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
//if the players account is suspended, go back to the main screen and have Speck inform the players
|
|
if( LaptopSaveInfo.gubPlayersMercAccountStatus == MERC_ACCOUNT_SUSPENDED )
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
#ifdef JA2UB
|
|
// gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#else
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#endif
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
}
|
|
//else try to hire the merc
|
|
else
|
|
{
|
|
if( gMercProfiles[ GetMercIDFromMERCArray( gubCurMercIndex ) ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS )
|
|
{
|
|
//bought gear before
|
|
fMercBuyEquipment = 0;
|
|
MercProcessHireAfterGear();
|
|
}
|
|
else
|
|
//prompt to buy gear
|
|
DoLapTopMessageBox( MSG_BOX_BLUE_ON_GREY, MercInfo[ MERC_FILES_BUY_GEAR ], LAPTOP_SCREEN, MSG_BOX_FLAG_YESNO, MercHireButtonGearYesNoCallback );
|
|
}
|
|
}
|
|
}
|
|
|
|
void BtnMercFilesBioInvToggleButtonCallback (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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
if (gubCurMercFilesTogglePage + 1 == NUM_MERC_PAGES)
|
|
{
|
|
gubCurMercFilesTogglePage = 0;
|
|
}
|
|
else
|
|
{
|
|
gubCurMercFilesTogglePage++;
|
|
}
|
|
RenderMercsFiles();
|
|
|
|
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 ExitMercsFiles()
|
|
{
|
|
UINT8 i;
|
|
DeleteVideoObjectFromIndex(guiPortraitBox);
|
|
DeleteVideoObjectFromIndex(guiStatsBox);
|
|
DeleteVideoObjectFromIndex(guiBioBox);
|
|
//JMich_MMG: Deleting the image for inventory boxes
|
|
DeleteVideoObjectFromIndex(guiMercWeaponBox);
|
|
|
|
MSYS_RemoveRegion( &gMercSelectedFaceRegion);
|
|
|
|
UnloadButtonImage( guiButtonImage );
|
|
RemoveButton( guiPrevButton );
|
|
RemoveButton( guiNextButton );
|
|
RemoveButton( guiHireButton );
|
|
|
|
RemoveButton( guiMercBackButton );
|
|
DeleteVideoObjectFromIndex(lguiWeaponBox);//hayden
|
|
|
|
//JMich_MMG: removing buttons
|
|
RemoveButton (guiBioInvButton );
|
|
for (i = 0; i<NUM_MERCSTARTINGGEAR_KITS; i++)
|
|
{
|
|
RemoveButton( guiMercWeaponBoxSelectionButton[i] );
|
|
}
|
|
for (i = 0; i<MERC_WEAPONBOX_TOTAL_ITEMS;i++)
|
|
{
|
|
MSYS_RemoveRegion( &gMercWeaponboxFasthelpRegion[i] );
|
|
}
|
|
RemoveMercBackGround();
|
|
}
|
|
|
|
void HandleMercsFiles()
|
|
{
|
|
HandleMercsFilesKeyBoardInput( );
|
|
}
|
|
|
|
void RenderMercsFiles()
|
|
{
|
|
HVOBJECT hPixHandle;
|
|
UINT8 i;
|
|
|
|
DrawMecBackGround();
|
|
|
|
// Portrait Box
|
|
GetVideoObject(&hPixHandle, guiPortraitBox);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,MERC_FILES_PORTRAIT_BOX_X, MERC_FILES_PORTRAIT_BOX_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// Stats Box
|
|
GetVideoObject(&hPixHandle, guiStatsBox);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,MERC_FILES_STATS_BOX_X, MERC_FILES_STATS_BOX_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
UINT8 mercID = GetMercIDFromMERCArray( gubCurMercIndex );
|
|
|
|
//JMich_MMG disabling tooltips and inventory buttons
|
|
DisableMercWeaponKitSelectionButtons();
|
|
for (i = 0; i<MERC_WEAPONBOX_TOTAL_ITEMS;i++)
|
|
{
|
|
MSYS_DisableRegion( &gMercWeaponboxFasthelpRegion[i] );
|
|
}
|
|
//JMich_MMG: adding a switch here, to see what we should display
|
|
switch (gubCurMercFilesTogglePage)
|
|
{
|
|
|
|
case MERC_FILES_BIO_PAGE:
|
|
// bio box
|
|
GetVideoObject(&hPixHandle, guiBioBox);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,MERC_FILES_BIO_BOX_X+1, MERC_FILES_BIO_BOX_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
//Load and display the mercs bio
|
|
|
|
if(is_networked)
|
|
DisplayMercsInventory(mercID);
|
|
|
|
if (gConditionsForMercAvailabilityTemp[gubCurMercIndex].MercBio != 255)
|
|
{
|
|
LoadAndDisplayMercBio( gConditionsForMercAvailabilityTemp[gubCurMercIndex].MercBio );
|
|
}
|
|
break;
|
|
case MERC_FILES_INV_PAGE:
|
|
// Inv box
|
|
GetVideoObject(&hPixHandle, guiBioBox);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,MERC_FILES_BIO_BOX_X+1, MERC_FILES_BIO_BOX_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
CreateMercWeaponBoxBackground();
|
|
DisplayMERCMercsInventory(mercID);
|
|
RefreshMercWeaponKitSelectionButtons();
|
|
EnableMercWeaponKitSelectionButtons();
|
|
break;
|
|
|
|
}
|
|
if (gubCurMercFilesTogglePage + 1 == NUM_MERC_PAGES)
|
|
{
|
|
|
|
SpecifyButtonText(guiBioInvButton, MercInfo[MERC_FILES_BIO]);
|
|
}
|
|
else
|
|
{
|
|
SpecifyButtonText(guiBioInvButton, MercInfo[MERC_FILES_BIO + gubCurMercFilesTogglePage + 1]);
|
|
}
|
|
// WANNE: Removed the background for the items
|
|
/*
|
|
if(is_networked)//hayden - load bgnd
|
|
{
|
|
GetVideoObject(&hPixHandle, lguiWeaponBox);
|
|
UINT16 uiPosX = IMAGE_OFFSET_X + 6;
|
|
for(int x=0; x< 8; x++)
|
|
{
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, uiPosX, IMAGE_OFFSET_Y + 296 -30, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
uiPosX += 61;
|
|
}
|
|
}
|
|
*/
|
|
|
|
//Display the mercs face
|
|
DisplayMercFace( GetMercIDFromMERCArray( gubCurMercIndex ) );
|
|
|
|
//Display Mercs Name
|
|
DrawTextToScreen(gMercProfiles[ GetMercIDFromMERCArray( gubCurMercIndex ) ].zName, MERC_NAME_X, MERC_NAME_Y, 0, MERC_NAME_FONT, MERC_NAME_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
//Render the 'click face' text
|
|
DisplayMercMemberClickOnFaceHelpText( GetMercIDFromMERCArray( gubCurMercIndex ) );
|
|
|
|
//Display the mercs statistic
|
|
DisplayMercsStats( GetMercIDFromMERCArray( gubCurMercIndex ) );
|
|
|
|
//check to see if the merc is dead if so disable the contact button
|
|
if( IsMercDead( GetMercIDFromMERCArray( gubCurMercIndex ) ) )
|
|
{
|
|
DisableButton( guiHireButton );
|
|
}
|
|
else if( ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_VALID ) && ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_SUSPENDED ) && ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_VALID_FIRST_WARNING ) )
|
|
{
|
|
//if the players account is suspended, disable the button
|
|
DisableButton( guiHireButton );
|
|
}
|
|
else
|
|
EnableButton( guiHireButton );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
|
|
MarkButtonsDirty( );
|
|
RenderWWWProgramTitleBar( );
|
|
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
|
|
}
|
|
|
|
|
|
void BtnMercNextButtonCallback(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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = LaptopSaveInfo.gubLastMercIndex;
|
|
else if (gfKeyState [ SHIFT ])
|
|
{
|
|
if (gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex - 10)
|
|
gubCurMercIndex += 10;
|
|
else
|
|
gubCurMercIndex = LaptopSaveInfo.gubLastMercIndex;
|
|
}
|
|
else
|
|
{
|
|
if( gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex-1 )
|
|
gubCurMercIndex++;
|
|
}
|
|
// WANNE: If current profile has an alternate profile, skip the next one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
{
|
|
gubCurMercIndex++;
|
|
}
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
|
|
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 BtnMercHireButtonCallback(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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
|
|
//if the players account is suspended, go back to the main screen and have Speck inform the players
|
|
if( LaptopSaveInfo.gubPlayersMercAccountStatus == MERC_ACCOUNT_SUSPENDED )
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
#ifdef JA2UB
|
|
// gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#else
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#endif
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
}
|
|
//else try to hire the merc
|
|
else
|
|
{
|
|
if( gMercProfiles[ GetMercIDFromMERCArray( gubCurMercIndex ) ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS )
|
|
{
|
|
//bought gear before
|
|
fMercBuyEquipment = 0;
|
|
MercProcessHireAfterGear();
|
|
}
|
|
else
|
|
//prompt to buy gear
|
|
DoLapTopMessageBox( MSG_BOX_BLUE_ON_GREY, MercInfo[ MERC_FILES_BUY_GEAR ], LAPTOP_SCREEN, MSG_BOX_FLAG_YESNO, MercHireButtonGearYesNoCallback );
|
|
}
|
|
|
|
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 BtnMercPrevButtonCallback(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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = 0;
|
|
else if (gfKeyState [ SHIFT ])
|
|
{
|
|
if ( gubCurMercIndex > 10)
|
|
gubCurMercIndex -= 10;
|
|
else
|
|
gubCurMercIndex = 0;
|
|
}
|
|
else
|
|
{
|
|
if( gubCurMercIndex > 0 )
|
|
gubCurMercIndex--;
|
|
}
|
|
// WANNE: If current profile has an alternate profile, skip the previous one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
{
|
|
gubCurMercIndex--;
|
|
}
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
|
|
BOOLEAN DisplayMercFace( UINT8 ubMercID)
|
|
{
|
|
HVOBJECT hFaceHandle;
|
|
HVOBJECT hPortraitHandle;
|
|
STR sFaceLoc = "FACES\\BIGFACES\\";
|
|
char sTemp[100];
|
|
MERCPROFILESTRUCT *pMerc;
|
|
VOBJECT_DESC VObjectDesc;
|
|
SOLDIERTYPE *pSoldier=NULL;
|
|
|
|
// Portrait Frame
|
|
GetVideoObject(&hPortraitHandle, guiPortraitBox);
|
|
BltVideoObject(FRAME_BUFFER, hPortraitHandle, 0,MERC_FILES_PORTRAIT_BOX_X, MERC_FILES_PORTRAIT_BOX_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
pMerc = &gMercProfiles[ ubMercID ];
|
|
|
|
//See if the merc is currently hired
|
|
pSoldier = FindSoldierByProfileID( ubMercID, TRUE );
|
|
|
|
// load the Face graphic and add it
|
|
if (gGameExternalOptions.fReadProfileDataFromXML)
|
|
{
|
|
// HEADROCK PROFEX: Do not read direct profile number, instead, look inside the profile for a ubFaceIndex value.
|
|
sprintf(sTemp, "%s%02d.sti", sFaceLoc, gMercProfiles[ubMercID].ubFaceIndex);
|
|
}
|
|
else
|
|
{
|
|
sprintf(sTemp, "%s%02d.sti", sFaceLoc, ubMercID);
|
|
}
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP(sTemp, VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiMercFace));
|
|
|
|
//Blt face to screen
|
|
GetVideoObject(&hFaceHandle, guiMercFace);
|
|
BltVideoObject(FRAME_BUFFER, hFaceHandle, 0,MERC_FACE_X, MERC_FACE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
//if the merc is dead, shadow the face red and put text over top saying the merc is dead
|
|
if( IsMercDead( ubMercID ) )
|
|
{
|
|
//shade the face red, (to signif that he is dead)
|
|
hFaceHandle->pShades[ 0 ] = Create16BPPPaletteShaded( hFaceHandle->pPaletteEntry, DEAD_MERC_COLOR_RED, DEAD_MERC_COLOR_GREEN, DEAD_MERC_COLOR_BLUE, TRUE );
|
|
|
|
//get the face object
|
|
GetVideoObject(&hFaceHandle, guiMercFace);
|
|
|
|
//set the red pallete to the face
|
|
SetObjectHandleShade( guiMercFace, 0 );
|
|
|
|
//Blt face to screen
|
|
BltVideoObject(FRAME_BUFFER, hFaceHandle, 0,MERC_FACE_X, MERC_FACE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
DisplayWrappedString(MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, MercInfo[MERC_FILES_MERC_IS_DEAD], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED);
|
|
}
|
|
|
|
else if( ubMercID == FLO && gubFact[ FACT_PC_MARRYING_DARYL_IS_FLO ] )
|
|
{
|
|
ShadowVideoSurfaceRect( FRAME_BUFFER, MERC_FACE_X, MERC_FACE_Y, MERC_FACE_X + MERC_FACE_WIDTH, MERC_FACE_Y + MERC_FACE_HEIGHT);
|
|
DisplayWrappedString( MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, pPersonnelDepartedStateStrings[3], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
|
|
}
|
|
|
|
//else if the merc is currently a POW or, the merc was fired as a pow
|
|
else if( pMerc->bMercStatus == MERC_FIRED_AS_A_POW || ( pSoldier && pSoldier->bAssignment == ASSIGNMENT_POW ) )
|
|
{
|
|
ShadowVideoSurfaceRect( FRAME_BUFFER, MERC_FACE_X, MERC_FACE_Y, MERC_FACE_X + MERC_FACE_WIDTH, MERC_FACE_Y + MERC_FACE_HEIGHT);
|
|
DisplayWrappedString(MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, pPOWStrings[0], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED);
|
|
}
|
|
|
|
//if the merc is hired already, say it
|
|
else if( !IsMercHireable( ubMercID ) && pMerc->bMercStatus == MERC_HIRED_BUT_NOT_ARRIVED_YET || pMerc->bMercStatus > 0 )
|
|
{
|
|
ShadowVideoSurfaceRect( FRAME_BUFFER, MERC_FACE_X, MERC_FACE_Y, MERC_FACE_X + MERC_FACE_WIDTH, MERC_FACE_Y + MERC_FACE_HEIGHT);
|
|
DisplayWrappedString(MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, MercInfo[MERC_FILES_ALREADY_HIRED], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED);
|
|
}
|
|
|
|
//if the merc is away on another assignemnt, say the merc is unavailable
|
|
else if( !IsMercHireable( ubMercID ) )
|
|
{
|
|
ShadowVideoSurfaceRect( FRAME_BUFFER, MERC_FACE_X, MERC_FACE_Y, MERC_FACE_X + MERC_FACE_WIDTH, MERC_FACE_Y + MERC_FACE_HEIGHT);
|
|
DisplayWrappedString(MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, MercInfo[MERC_FILES_MERC_UNAVAILABLE], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED);
|
|
}
|
|
|
|
//if the merc not paid yet, dont hire
|
|
else if( gMercProfiles[ ubMercID ].iMercMercContractLength != 0 )
|
|
{
|
|
DisplayWrappedString(MERC_FACE_X, MERC_FACE_Y+MERC_PORTRAIT_TEXT_OFFSET_Y, MERC_FACE_WIDTH, 2, FONT14ARIAL, 145, MercInfo[MERC_FILES_MERC_OUTSTANDING], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED);
|
|
}
|
|
|
|
DeleteVideoObjectFromIndex(guiMercFace);
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
void DisplayMercMemberClickOnFaceHelpText( UINT8 ubMercID )
|
|
{
|
|
CHAR16 sString[ 128 ], sTemp[ 20 ];
|
|
|
|
// Buggler: skills/traits tooltip on merc portrait
|
|
if( gGameExternalOptions.fShowSkillsInHirePage == TRUE )
|
|
{
|
|
// clear string value
|
|
swprintf( sString, L"");
|
|
|
|
if (gGameOptions.fNewTraitSystem) // SANDRO - old/new traits check
|
|
{
|
|
UINT8 ubTempSkillArray[30];
|
|
INT8 bNumSkillTraits = 0;
|
|
|
|
// lets rearrange our skills to a temp array
|
|
// we also get the number of lines (skills) to be displayed
|
|
for ( UINT8 ubCnt = 1; ubCnt < NUM_SKILLTRAITS_NT; ubCnt++ )
|
|
{
|
|
if ( ProfileHasSkillTrait( ubMercID, ubCnt ) == 2 )
|
|
{
|
|
ubTempSkillArray[bNumSkillTraits] = (ubCnt + NEWTRAIT_MERCSKILL_EXPERTOFFSET);
|
|
bNumSkillTraits++;
|
|
}
|
|
else if ( ProfileHasSkillTrait( ubMercID, ubCnt ) == 1 )
|
|
{
|
|
ubTempSkillArray[bNumSkillTraits] = ubCnt;
|
|
bNumSkillTraits++;
|
|
}
|
|
}
|
|
|
|
if ( bNumSkillTraits == 0 )
|
|
{
|
|
swprintf( sString, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] );
|
|
}
|
|
else
|
|
{
|
|
for ( UINT8 ubCnt = 0; ubCnt < bNumSkillTraits; ubCnt++ )
|
|
{
|
|
swprintf( sTemp, L"%s\n", gzMercSkillTextNew[ ubTempSkillArray[ubCnt] ] );
|
|
wcscat( sString, sTemp );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
INT8 bSkill1 = 0, bSkill2 = 0;
|
|
bSkill1 = gMercProfiles[ ubMercID ].bSkillTraits[0];
|
|
bSkill2 = gMercProfiles[ ubMercID ].bSkillTraits[1];
|
|
|
|
if ( bSkill1 == 0 && bSkill2 == 0 )
|
|
{
|
|
swprintf( sString, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] );
|
|
}
|
|
else
|
|
{
|
|
//if the 2 skills are the same, add the '(expert)' at the end
|
|
if( bSkill1 == bSkill2 )
|
|
{
|
|
swprintf( sString, L"%s %s", gzMercSkillText[bSkill1], gzMercSkillText[EXPERT] );
|
|
}
|
|
else
|
|
{
|
|
//Display the first skill
|
|
if( bSkill1 != 0 )
|
|
{
|
|
swprintf( sString, L"%s\n", gzMercSkillText[bSkill1] );
|
|
}
|
|
if( bSkill2 != 0 )
|
|
{
|
|
swprintf( sTemp, L"%s", gzMercSkillText[bSkill2] );
|
|
wcscat( sString, sTemp );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
SetRegionFastHelpText( &gMercSelectedFaceRegion, sString );
|
|
}
|
|
}
|
|
|
|
void LoadAndDisplayMercBio( UINT8 ubMercID )
|
|
{
|
|
CHAR16 sText[400];
|
|
UINT32 uiStartLoc = 0;
|
|
|
|
//load and display the merc bio
|
|
//#ifdef JA2UB
|
|
// //Ja25 UB
|
|
// if( ubMercID < 17 )
|
|
// uiStartLoc = MERC_BIO_SIZE * ubMercID;
|
|
// else
|
|
// uiStartLoc = MERC_BIO_SIZE * ( ubMercID - 7 );
|
|
//#else
|
|
uiStartLoc = MERC_BIO_SIZE * ubMercID;
|
|
//#endif
|
|
|
|
LoadEncryptedDataFromFile(MERCBIOFILE, sText, uiStartLoc, MERC_BIO_INFO_TEXT_SIZE);
|
|
|
|
if( sText[0] != L'쳌' )
|
|
{
|
|
DisplayWrappedString(MERC_BIO_TEXT_X, MERC_BIO_TEXT_Y, MERC_BIO_WIDTH, 2, MERC_BIO_FONT, MERC_BIO_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
}
|
|
|
|
//load and display the merc's additioanl info (if any)
|
|
//#ifdef JA2UB
|
|
//Ja25 UB
|
|
// if( ubMercID < 17 )
|
|
// uiStartLoc = MERC_BIO_SIZE * ubMercID + MERC_BIO_INFO_TEXT_SIZE;
|
|
// else
|
|
// uiStartLoc = MERC_BIO_SIZE * ( ubMercID - 7 ) + MERC_BIO_INFO_TEXT_SIZE;
|
|
//#else
|
|
uiStartLoc = MERC_BIO_SIZE * ubMercID + MERC_BIO_INFO_TEXT_SIZE;
|
|
//#endif
|
|
LoadEncryptedDataFromFile(MERCBIOFILE, sText, uiStartLoc, MERC_BIO_ADD_INFO_TEXT_SIZE);
|
|
|
|
if( sText[0] != 0 && !is_networked )
|
|
{
|
|
DrawTextToScreen( MercInfo[ MERC_FILES_ADDITIONAL_INFO ], MERC_ADD_BIO_TITLE_X, MERC_ADD_BIO_TITLE_Y, 0, MERC_TITLE_FONT, MERC_TITLE_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
|
DisplayWrappedString( MERC_ADD_BIO_TEXT_X, MERC_ADD_BIO_TEXT_Y, MERC_BIO_WIDTH, 2, MERC_BIO_FONT, MERC_BIO_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
|
}
|
|
}
|
|
|
|
|
|
void DisplayMercsStats( UINT8 ubMercID )
|
|
{
|
|
UINT16 usPosY, usPosX;
|
|
CHAR16 sPage[60];
|
|
CHAR16 sTemp[128];
|
|
CHAR16 sString[128];
|
|
CHAR16 NsString[128];
|
|
CHAR16 N2sString[128];
|
|
UINT8 ubColor;
|
|
|
|
usPosY = MERC_HEALTH_Y;
|
|
|
|
//Health
|
|
DrawTextToScreen(MercInfo[MERC_FILES_HEALTH], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bLife );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bLife, 3, MERC_STATS_FIRST_NUM_COL_X, MERC_HEALTH_Y, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Agility
|
|
DrawTextToScreen(MercInfo[MERC_FILES_AGILITY], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bAgility );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bAgility, 3, MERC_STATS_FIRST_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Dexterity
|
|
DrawTextToScreen(MercInfo[MERC_FILES_DEXTERITY], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bDexterity );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bDexterity, 3, MERC_STATS_FIRST_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Strength
|
|
DrawTextToScreen(MercInfo[MERC_FILES_STRENGTH], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bStrength );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bStrength, 3, MERC_STATS_FIRST_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Leadership
|
|
DrawTextToScreen(MercInfo[MERC_FILES_LEADERSHIP], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bLeadership );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bLeadership, 3, MERC_STATS_FIRST_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Wisdom
|
|
DrawTextToScreen(MercInfo[MERC_FILES_WISDOM], MERC_STATS_FIRST_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bWisdom );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bWisdom, 3, MERC_STATS_FIRST_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
|
|
usPosY = MERC_HEALTH_Y;
|
|
|
|
//Experience Level
|
|
DrawTextToScreen(MercInfo[MERC_FILES_EXPLEVEL], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
// ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bExpLevel );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bExpLevel, 3, MERC_STATS_SECOND_NUM_COL_X, usPosY, MERC_STATS_FONT, FONT_MCOLOR_WHITE);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Marksmanship
|
|
DrawTextToScreen(MercInfo[MERC_FILES_MARKSMANSHIP], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bMarksmanship );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bMarksmanship, 3, MERC_STATS_SECOND_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Mechanical
|
|
DrawTextToScreen(MercInfo[MERC_FILES_MECHANICAL], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bMechanical );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bMechanical, 3, MERC_STATS_SECOND_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Explosive
|
|
DrawTextToScreen(MercInfo[MERC_FILES_EXPLOSIVE], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bExplosive );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bExplosive, 3, MERC_STATS_SECOND_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Medical
|
|
DrawTextToScreen(MercInfo[MERC_FILES_MEDICAL], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
ubColor = GetStatsColor( gMercProfiles[ ubMercID ].bMedical );
|
|
DrawNumeralsToScreen(gMercProfiles[ ubMercID ].bMedical, 3, MERC_STATS_SECOND_NUM_COL_X, usPosY, MERC_STATS_FONT, ubColor);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Daily Salary
|
|
DrawTextToScreen( MercInfo[MERC_FILES_SALARY], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
usPosX = MERC_STATS_SECOND_COL_X + StringPixLength(MercInfo[MERC_FILES_SALARY], MERC_NAME_FONT);
|
|
swprintf(sString, L"%d", gMercProfiles[ ubMercID ].sSalary);
|
|
InsertCommasForDollarFigure( sString );
|
|
InsertDollarSignInToString( sString );
|
|
swprintf(sTemp, L" %s", MercInfo[MERC_FILES_PER_DAY]);
|
|
wcscat( sString, sTemp );
|
|
DrawTextToScreen( sString, usPosX, usPosY, 95, MERC_NAME_FONT, MERC_DYNAMIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
|
|
// Buggler: Display current MERC index & total MERC members at the bottom of the screen
|
|
swprintf( sPage, L"%d / %d", gubCurMercIndex + 1, LaptopSaveInfo.gubLastMercIndex + 1 );
|
|
DrawTextToScreen(sPage, MERC_PAGE_X, MERC_PAGE_Y, 0, MERC_STATS_FONT, MERC_DYNAMIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
|
|
//Only show when in inventory page
|
|
if (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE)
|
|
{
|
|
//Gear Cost
|
|
usPosY = usPosY + 145;
|
|
DrawTextToScreen( MercInfo[MERC_FILES_GEAR], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_STATS_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
if( (gMercProfiles[ ubMercID ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS ) && (!(gMercProfiles[ ubMercID ].ubMiscFlags2 & PROFILE_MISC_FLAG2_MERC_GEARKIT_UNPAID)))
|
|
gMercProfiles[ ubMercID ].usOptionalGearCost = 0;
|
|
swprintf(NsString, L"+ ");
|
|
swprintf(sTemp, L"%d",gMercProfiles[ ubMercID ].usOptionalGearCost);
|
|
InsertCommasForDollarFigure( sTemp );
|
|
InsertDollarSignInToString( sTemp );
|
|
wcscat( NsString, sTemp );
|
|
DrawTextToScreen( NsString, usPosX, usPosY, 95, MERC_NAME_FONT, MERC_DYNAMIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += MERC_SPACE_BN_LINES;
|
|
|
|
//Total Cost
|
|
DrawTextToScreen( MercInfo[MERC_FILES_TOTAL], MERC_STATS_SECOND_COL_X, usPosY, 0, MERC_NAME_FONT, MERC_STATIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
swprintf(N2sString, L"= ");
|
|
swprintf(sTemp, L"%d",gMercProfiles[ ubMercID ].usOptionalGearCost+gMercProfiles[ ubMercID ].sSalary);
|
|
InsertCommasForDollarFigure( sTemp );
|
|
InsertDollarSignInToString( sTemp );
|
|
wcscat( N2sString, sTemp );
|
|
DrawTextToScreen( N2sString, usPosX, usPosY, 95, MERC_NAME_FONT, MERC_DYNAMIC_STATS_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
}
|
|
}
|
|
|
|
UINT8 GetStatsColor( INT8 bStat )
|
|
{
|
|
if( bStat >= 80 )
|
|
return( HIGH_STATS_COLOR );
|
|
else if( bStat >= 20 )
|
|
return( MED_STATS_COLOR );
|
|
else
|
|
return( LOW_STATS_COLOR );
|
|
}
|
|
|
|
BOOLEAN MercFilesHireMerc(UINT8 ubMercID)
|
|
{
|
|
MERC_HIRE_STRUCT HireMercStruct;
|
|
INT8 bReturnCode;
|
|
INT32 Namount=0;
|
|
|
|
memset(&HireMercStruct, 0, sizeof(MERC_HIRE_STRUCT));
|
|
|
|
//if the ALT key is down
|
|
if( gfKeyState[ ALT ] && CHEATER_CHEAT_LEVEL( ) )
|
|
{
|
|
//set the merc to be hireable
|
|
gMercProfiles[ ubMercID ].bMercStatus = MERC_OK;
|
|
gMercProfiles[ ubMercID ].uiDayBecomesAvailable = 0;
|
|
}
|
|
|
|
//if the merc is away, dont hire
|
|
if( !IsMercHireable( ubMercID ) )
|
|
{
|
|
if( gMercProfiles[ ubMercID ].bMercStatus != MERC_IS_DEAD )
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
// anv: unlocked unused Biff unavailable quote and added one for Speck
|
|
if( ubMercID == BIFF )
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_BIFF_UNAVALIABLE;
|
|
else if( ubMercID == SPECK_PLAYABLE )
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_SPECK_UNAVAILABLE;
|
|
else
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_PLAYER_TRIES_TO_HIRE_ALREADY_HIRED_MERC;
|
|
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
//if the merc not paid yet, dont hire
|
|
if( gMercProfiles[ ubMercID ].iMercMercContractLength != 0 )
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_PLAYER_TRIES_TO_HIRE_ALREADY_HIRED_MERC;
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
HireMercStruct.ubProfileID = ubMercID;
|
|
|
|
HireMercStruct.fCopyProfileItemsOver = fMercBuyEquipment;
|
|
|
|
HireMercStruct.iTotalContractLength = 1;
|
|
|
|
//Specify where the merc is to appear
|
|
HireMercStruct.sSectorX = gsMercArriveSectorX;//13;
|
|
HireMercStruct.sSectorY = gsMercArriveSectorY;
|
|
HireMercStruct.fUseLandingZoneForArrival = TRUE;
|
|
|
|
HireMercStruct.uiTimeTillMercArrives = GetMercArrivalTimeOfDay( );// + ubMercID
|
|
|
|
|
|
//Set the time and ID of the last hired merc will arrive
|
|
// LaptopSaveInfo.sLastHiredMerc.iIdOfMerc = HireMercStruct.ubProfileID;
|
|
// LaptopSaveInfo.sLastHiredMerc.uiArrivalTime = HireMercStruct.uiTimeTillMercArrives;
|
|
|
|
Namount += gMercProfiles[ ubMercID ].sSalary * (-1);
|
|
if(cAllowMercEquipment && fMercBuyEquipment==1)
|
|
Namount += gMercProfiles[ubMercID].usOptionalGearCost * (-1);
|
|
|
|
if(is_networked && (Namount*(-1) > LaptopSaveInfo.iCurrentBalance))
|
|
{
|
|
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, sATMText[ 4 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
|
|
return(FALSE);//not enough big ones $$$sATMText
|
|
}
|
|
|
|
bReturnCode = HireMerc( &HireMercStruct );
|
|
|
|
//already have limit of mercs on the team
|
|
if( bReturnCode == MERC_HIRE_OVER_PLAYER_LIMIT )
|
|
{
|
|
fMercHireOverPlayerLimitMerc = TRUE;
|
|
return(FALSE);
|
|
}
|
|
else if( bReturnCode == MERC_HIRE_FAILED )
|
|
{
|
|
//function failed
|
|
return(FALSE);
|
|
}
|
|
else
|
|
{
|
|
//take off nominal fee: hayden,
|
|
if (is_networked)
|
|
{
|
|
AddTransactionToPlayersBook( HIRED_MERC, ubMercID, GetWorldTotalMin(), Namount );
|
|
}
|
|
|
|
#ifdef JA2UB
|
|
//add an entry in the finacial page for the hiring of the merc
|
|
AddTransactionToPlayersBook(PAY_SPECK_FOR_MERC, ubMercID, GetWorldTotalMin(), -(INT32)( gMercProfiles[ubMercID].uiWeeklySalary ) );
|
|
#endif
|
|
|
|
//JMich_MMG: Setting the flag that we bought the gear and still haven't paid for it if we succesfully hired the merc
|
|
if ( fMercBuyEquipment )
|
|
{
|
|
gMercProfiles[ ubMercID ].ubMiscFlags |= PROFILE_MISC_FLAG_ALREADY_USED_ITEMS;
|
|
gMercProfiles[ ubMercID ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_MERC_GEARKIT_UNPAID;
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void BtnMercFilesBackButtonCallback(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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
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 EnableDisableMercFilesNextPreviousButton( )
|
|
{
|
|
if( gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex-1 )
|
|
EnableButton( guiNextButton );
|
|
else
|
|
DisableButton( guiNextButton );
|
|
|
|
if( gubCurMercIndex > 0 )
|
|
EnableButton( guiPrevButton );
|
|
else
|
|
DisableButton( guiPrevButton );
|
|
}
|
|
|
|
void HandleMercsFilesKeyBoardInput( )
|
|
{
|
|
InputAtom InputEvent;
|
|
|
|
while (DequeueSpecificEvent(&InputEvent, KEY_DOWN|KEY_UP|KEY_REPEAT))
|
|
{
|
|
if( InputEvent.usEvent == KEY_DOWN )
|
|
{
|
|
switch (InputEvent.usParam)
|
|
{
|
|
case LEFTARROW:
|
|
// previous button
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = 0;
|
|
else if ( gubCurMercIndex > 0 )
|
|
gubCurMercIndex--;
|
|
// WANNE: If current profile has an alternate profile, skip the previous one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex--;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
case RIGHTARROW:
|
|
// next button
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = LaptopSaveInfo.gubLastMercIndex;
|
|
else if ( gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex-1 )
|
|
gubCurMercIndex++;
|
|
// WANNE: If current profile has an alternate profile, skip the next one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex++;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
case SHIFT_LEFTARROW:
|
|
// previous button
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = 0;
|
|
else if ( gubCurMercIndex > 10)
|
|
gubCurMercIndex -= 10;
|
|
else
|
|
gubCurMercIndex = 0;
|
|
// WANNE: If current profile has an alternate profile, skip the previous one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex--;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
case SHIFT_RIGHTARROW:
|
|
// next button
|
|
if (gfKeyState [ CTRL ])
|
|
gubCurMercIndex = LaptopSaveInfo.gubLastMercIndex;
|
|
else if (gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex - 10)
|
|
gubCurMercIndex += 10;
|
|
else
|
|
gubCurMercIndex = LaptopSaveInfo.gubLastMercIndex;
|
|
// WANNE: If current profile has an alternate profile, skip the next one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex++;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
case ENTER:
|
|
//for no or invalid merc account, do nothing
|
|
if( ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_VALID ) && ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_SUSPENDED ) && ( LaptopSaveInfo.gubPlayersMercAccountStatus != MERC_ACCOUNT_VALID_FIRST_WARNING ) )
|
|
{
|
|
//do nothing
|
|
}
|
|
// hire only if alive
|
|
else if( !IsMercDead( GetMercIDFromMERCArray( gubCurMercIndex ) ) )
|
|
{
|
|
//if the players account is suspended, go back to the main screen and have Speck inform the players
|
|
if( LaptopSaveInfo.gubPlayersMercAccountStatus == MERC_ACCOUNT_SUSPENDED )
|
|
{
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
#ifdef JA2UB
|
|
//gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#else
|
|
gusMercVideoSpeckSpeech = SPECK_QUOTE_ALTERNATE_OPENING_5_PLAYER_OWES_SPECK_ACCOUNT_SUSPENDED;
|
|
#endif
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
}
|
|
//else try to hire the merc
|
|
else
|
|
{
|
|
//bought gear before
|
|
if( gMercProfiles[ GetMercIDFromMERCArray( gubCurMercIndex ) ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS )
|
|
{
|
|
fMercBuyEquipment = 0;
|
|
MercProcessHireAfterGear();
|
|
}
|
|
//prompt to buy gear
|
|
else
|
|
DoLapTopMessageBox( MSG_BOX_BLUE_ON_GREY, MercInfo[ MERC_FILES_BUY_GEAR ], LAPTOP_SCREEN, MSG_BOX_FLAG_YESNO, MercHireButtonGearYesNoCallback );
|
|
}
|
|
}
|
|
break;
|
|
case BACKSPACE:
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
break;
|
|
case 't':
|
|
case 'T':
|
|
if (gubCurMercFilesTogglePage + 1 == NUM_MERC_PAGES)
|
|
{
|
|
gubCurMercFilesTogglePage = 0;
|
|
}
|
|
else
|
|
{
|
|
gubCurMercFilesTogglePage++;
|
|
}
|
|
RenderMercsFiles();
|
|
break;
|
|
case '1':
|
|
if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE))
|
|
{
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS))
|
|
{
|
|
UINT8 i;
|
|
for(i=INV_START_POS; i<NUM_INV_SLOTS; i++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][0].inv[i] != NONE)
|
|
{
|
|
MercWeaponKitSelectionUpdate(0);
|
|
RenderMercsFiles( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case '2':
|
|
if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE))
|
|
{
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS))
|
|
{
|
|
UINT8 i;
|
|
for(i=INV_START_POS; i<NUM_INV_SLOTS; i++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][1].inv[i] != NONE)
|
|
{
|
|
MercWeaponKitSelectionUpdate(1);
|
|
RenderMercsFiles( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case '3':
|
|
if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE))
|
|
{
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS))
|
|
{
|
|
UINT8 i;
|
|
for(i=INV_START_POS; i<NUM_INV_SLOTS; i++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][2].inv[i] != NONE)
|
|
{
|
|
MercWeaponKitSelectionUpdate(2);
|
|
RenderMercsFiles( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case '4':
|
|
if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE))
|
|
{
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS))
|
|
{
|
|
UINT8 i;
|
|
for(i=INV_START_POS; i<NUM_INV_SLOTS; i++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][3].inv[i] != NONE)
|
|
{
|
|
MercWeaponKitSelectionUpdate(3);
|
|
RenderMercsFiles( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case '5':
|
|
if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE))
|
|
{
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS))
|
|
{
|
|
UINT8 i;
|
|
for(i=INV_START_POS; i<NUM_INV_SLOTS; i++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][4].inv[i] != NONE)
|
|
{
|
|
MercWeaponKitSelectionUpdate(4);
|
|
RenderMercsFiles( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
HandleKeyBoardShortCutsForLapTop( InputEvent.usEvent, InputEvent.usParam, InputEvent.usKeyState );
|
|
break;
|
|
}
|
|
}
|
|
else if( InputEvent.usEvent == KEY_REPEAT )
|
|
{
|
|
switch( InputEvent.usParam )
|
|
{
|
|
case LEFTARROW:
|
|
// previous button
|
|
if( gubCurMercIndex > 0 )
|
|
gubCurMercIndex--;
|
|
// WANNE: If current profile has an alternate profile, skip the previous one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex--;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
case RIGHTARROW:
|
|
// next button
|
|
if( gubCurMercIndex <= LaptopSaveInfo.gubLastMercIndex-1 )
|
|
gubCurMercIndex++;
|
|
// WANNE: If current profile has an alternate profile, skip the next one, because it is the alternate profile,
|
|
// otherwise we have both profiles available in MERC!
|
|
if (gConditionsForMercAvailability[ gubCurMercIndex ].uiAlternateIndex != 255)
|
|
gubCurMercIndex++;
|
|
|
|
RenderMercsFiles( );
|
|
|
|
//Enable or disable the buttons
|
|
EnableDisableMercFilesNextPreviousButton( );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//JMich_MMG: Kit Selection Buttons
|
|
void CreateMercKitSelectionButtons()
|
|
{
|
|
INT32 i;
|
|
|
|
for (i=0;i<NUM_MERCSTARTINGGEAR_KITS;i++)
|
|
{
|
|
guiMercWeaponBoxSelectionButton[i]=CreateIconAndTextButton( guiMercWeaponKitButtonImage, CharacterInfo[AIM_MEMBER_GEAR_KIT_ONE+i], MERC_M_KIT_BUTTON_FONT,
|
|
MERC_M_KIT_BUTTON_UP_COLOR, DEFAULT_SHADOW,
|
|
MERC_M_KIT_BUTTON_DOWN_COLOR, DEFAULT_SHADOW,
|
|
TEXT_CJUSTIFIED,
|
|
MERC_WEAPONBOX_LOADOUT_ONE_X + i * (MERC_WEAPONBOX_BUTTON_START_WIDTH + MERC_WEAPONBOX_LOADOUT_BUTTON_X_DISTANCE),
|
|
MERC_WEAPONBOX_LOADOUT_ONE_BOX_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnMercWeaponboxSelectButtonCallback);
|
|
SetButtonCursor(guiMercWeaponBoxSelectionButton[i], CURSOR_WWW );
|
|
MSYS_SetBtnUserData(guiMercWeaponBoxSelectionButton[i],0, i );
|
|
}
|
|
}
|
|
void BtnMercWeaponboxSelectButtonCallback( 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 )
|
|
{
|
|
if (btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
gSelectedMercKit = MSYS_GetBtnUserData(btn,0);
|
|
//tais: handle selected kit
|
|
MercWeaponKitSelectionUpdate(gSelectedMercKit);
|
|
|
|
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
|
RenderMercsFiles();
|
|
|
|
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 DisableMercWeaponKitSelectionButtons()
|
|
{
|
|
UINT8 i;
|
|
for (i=0;i<NUM_MERCSTARTINGGEAR_KITS;i++)
|
|
{
|
|
HideButton(guiMercWeaponBoxSelectionButton[i]);
|
|
//HideButton(guiMercWeaponBoxPriceSelectionButton[i]);
|
|
}
|
|
}
|
|
void RefreshMercWeaponKitSelectionButtons()
|
|
{
|
|
UINT8 ubMercID = GetMercIDFromMERCArray( gubCurMercIndex );
|
|
UINT8 i;
|
|
STR16 KitLabel;
|
|
if (ubMercID != -1)
|
|
{
|
|
for (i=0;i<NUM_MERCSTARTINGGEAR_KITS;i++)
|
|
{
|
|
KitLabel = CharacterInfo[AIM_MEMBER_GEAR_KIT_ONE + i];
|
|
if (gMercProfileGear[ubMercID][i].mGearKitName[0] != '\0')
|
|
{
|
|
KitLabel = gMercProfileGear[ubMercID][i].mGearKitName;
|
|
}
|
|
SpecifyButtonText( guiMercWeaponBoxSelectionButton[i], KitLabel);
|
|
}
|
|
}
|
|
}
|
|
|
|
//JMich_MMG: Copying (and modifying) the DisplayMercsInventory function from AimMembers.cpp
|
|
BOOLEAN DisplayMERCMercsInventory(UINT8 ubMercID)
|
|
{
|
|
UINT8 i;
|
|
INT16 PosX, PosY, sCenX, sCenY;
|
|
UINT16 usItem;
|
|
INVTYPE *pItem;
|
|
HVOBJECT hVObject;
|
|
UINT32 usHeight, usWidth;
|
|
ETRLEObject *pTrav;
|
|
CHAR16 gzItemName[ 5000 ];
|
|
UINT8 ubItemCount=0;
|
|
UINT8 ubColumnCount=0;
|
|
|
|
//if the mercs inventory has already been purchased, dont display the inventory
|
|
if( gMercProfiles[ ubMercID ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS )
|
|
return( TRUE );
|
|
|
|
UINT16 wnameY = MERC_MEMBER_WEAPON_NAME_Y;
|
|
PosX = MERC_WEAPONBOX_X_NSGI+3; // + 3 ( 1 to take care of the shadow, +2 to get past the weapon box border )
|
|
PosY = MERC_WEAPONBOX_Y_NSGI;
|
|
|
|
//tais: disable Weaponbox Mouseregions to stop crashing when changing kit selection and hovering over item
|
|
//tooltips for weaponbox
|
|
for(i=0;i<MERC_WEAPONBOX_TOTAL_ITEMS;i++)
|
|
{
|
|
MSYS_DisableRegion(&gMercWeaponboxFasthelpRegion[i]);
|
|
}
|
|
|
|
for(i=0; i<gMercProfiles[ubMercID].inv.size(); i++)
|
|
{
|
|
usItem = gMercProfiles[ubMercID].inv[ i ];
|
|
|
|
//if its a valid item AND we are only displaying less then 8 items
|
|
if( usItem && ubItemCount < MERC_WEAPONBOX_TOTAL_ITEMS )
|
|
{
|
|
//increase the item count
|
|
ubItemCount++;
|
|
ubColumnCount++;
|
|
|
|
pItem = &Item[ usItem ];
|
|
GetVideoObject( &hVObject, GetInterfaceGraphicForItem( pItem ) );
|
|
/*JMich_MMG: this is the original one, but g_bUsePngItemImages is set to false, so I'm skipping it
|
|
UINT16 usGraphicNum = g_bUsePngItemImages ? 0 : pItem->ubGraphicNum;*/
|
|
UINT16 usGraphicNum = pItem->ubGraphicNum;
|
|
|
|
if(usGraphicNum < hVObject->usNumberOfObjects)
|
|
{
|
|
pTrav = &(hVObject->pETRLEObject[ usGraphicNum ] );
|
|
}
|
|
else
|
|
{
|
|
SGP_THROW(_BS(L"Number of images in VObject [") << hVObject->usNumberOfObjects
|
|
<< L"] is smaller than the requested index [" << (int)pItem->ubGraphicNum << L"]" << _BS::wget);
|
|
}
|
|
|
|
usHeight = (UINT32)pTrav->usHeight;
|
|
usWidth = (UINT32)pTrav->usWidth;
|
|
|
|
sCenX = PosX + ( abs( MERC_WEAPONBOX_SIZE_X_NSGI - 3 - (int)usWidth ) / 2 ) - pTrav->sOffsetX;
|
|
sCenY = PosY + ( abs( MERC_WEAPONBOX_SIZE_Y_NSGI - (int)usHeight ) / 2 ) - pTrav->sOffsetY;
|
|
|
|
//blt the shadow of the item
|
|
if(gGameSettings.fOptions[ TOPTION_SHOW_ITEM_SHADOW ])
|
|
BltVideoObjectOutlineShadowFromIndex( FRAME_BUFFER, GetInterfaceGraphicForItem( pItem ), usGraphicNum, sCenX-2, sCenY+2);
|
|
|
|
//blt the item
|
|
BltVideoObjectOutlineFromIndex( FRAME_BUFFER, GetInterfaceGraphicForItem( pItem ), usGraphicNum, sCenX, sCenY, 0, FALSE );
|
|
|
|
//if there are more then 1 piece of equipment in the current slot, display how many there are
|
|
if( gMercProfiles[ubMercID].bInvNumber[ i ] > 1 )
|
|
{
|
|
CHAR16 zTempStr[ 32 ];
|
|
|
|
swprintf( zTempStr, L"x%d", gMercProfiles[ ubMercID ].bInvNumber[ i ] );
|
|
|
|
DrawTextToScreen( zTempStr, (UINT16)(PosX-1), (UINT16)(PosY+20), MERC_MEMBER_WEAPON_NAME_WIDTH, MERC_M_FONT_DYNAMIC_TEXT, MERC_M_WEAPON_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED );
|
|
}
|
|
|
|
GetHelpTextForItemInLaptop( gzItemName, usItem );
|
|
SetRegionFastHelpText( &(gMercWeaponboxFasthelpRegion[ubItemCount-1]), gzItemName );
|
|
SetRegionHelpEndCallback( &(gMercWeaponboxFasthelpRegion[ubItemCount-1]), HelpTextDoneCallback );
|
|
MSYS_EnableRegion( &gMercWeaponboxFasthelpRegion[ubItemCount-1] );
|
|
|
|
|
|
if(ubColumnCount == MERC_WEAPONBOX_COLUMNS)
|
|
{
|
|
PosX = MERC_WEAPONBOX_X_NSGI+3;
|
|
PosY += MERC_WEAPONBOX_SIZE_Y_NSGI;
|
|
ubColumnCount = 0;
|
|
}
|
|
else
|
|
{
|
|
PosX += MERC_WEAPONBOX_SIZE_X_NSGI;
|
|
}
|
|
}
|
|
}
|
|
return(TRUE);
|
|
}
|
|
//JMich_MMG: Creating the mouseregion for tooltips
|
|
void CreateMercWeaponBoxMouseRegions()
|
|
{
|
|
UINT16 i, x, uiPosX, uiPosY;
|
|
UINT16 itemcounter = 0;
|
|
//tais: Weaponbox Mouseregions
|
|
for(i=0; i<MERC_WEAPONBOX_ROWS; i++) {
|
|
uiPosX = MERC_WEAPONBOX_X_NSGI;
|
|
uiPosY = MERC_WEAPONBOX_Y_NSGI + (MERC_WEAPONBOX_SIZE_Y_NSGI*i);
|
|
for(x=0; x<MERC_WEAPONBOX_COLUMNS; x++) {
|
|
MSYS_DefineRegion(&gMercWeaponboxFasthelpRegion[itemcounter],uiPosX,uiPosY,uiPosX+MERC_WEAPONBOX_SIZE_X_NSGI,uiPosY+MERC_WEAPONBOX_SIZE_Y_NSGI,MSYS_PRIORITY_HIGHEST, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, MSYS_NO_CALLBACK);
|
|
MSYS_AddRegion(&gMercWeaponboxFasthelpRegion[itemcounter]);
|
|
MSYS_DisableRegion(&gMercWeaponboxFasthelpRegion[itemcounter]);
|
|
uiPosX += MERC_WEAPONBOX_SIZE_X_NSGI;
|
|
itemcounter++;
|
|
}
|
|
}
|
|
}
|
|
|
|
//JMich_MMG: Enabling of kit selection buttons
|
|
void EnableMercWeaponKitSelectionButtons()
|
|
{
|
|
UINT8 i,j;
|
|
UINT8 buttonCount = 0;
|
|
BOOL buttonEnabled[NUM_MERCSTARTINGGEAR_KITS];
|
|
//tais: weaponbox gear selection buttons
|
|
if(UsingNewInventorySystem() == true) {
|
|
if(!(gMercProfiles[GetMercIDFromMERCArray( gubCurMercIndex )].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS)) {
|
|
for(i=0; i<NUM_MERCSTARTINGGEAR_KITS; i++)
|
|
{
|
|
buttonEnabled[i] = FALSE;
|
|
for(j=INV_START_POS; j<NUM_INV_SLOTS; j++)
|
|
{
|
|
if(gMercProfileGear[GetMercIDFromMERCArray( gubCurMercIndex )][i].inv[j] != NONE)
|
|
{
|
|
buttonEnabled[i] = TRUE;
|
|
buttonCount++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(buttonCount > 1){
|
|
for (i=0;i<NUM_MERCSTARTINGGEAR_KITS;i++)
|
|
{
|
|
if(buttonEnabled[i] == TRUE)
|
|
{
|
|
ShowButton(guiMercWeaponBoxSelectionButton[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//JMich_MMG: Adding the weaponbox background, currently using the AIM one
|
|
void CreateMercWeaponBoxBackground()
|
|
{
|
|
//tais: nsgi, create background for multiline weaponbox
|
|
HVOBJECT hMercWeaponBoxHandle;
|
|
UINT16 i, x, uiPosX, uiPosY;
|
|
|
|
GetVideoObject(&hMercWeaponBoxHandle, guiMercWeaponBox);
|
|
for(i=0; i<MERC_WEAPONBOX_ROWS; i++) {
|
|
uiPosX = MERC_WEAPONBOX_X_NSGI;
|
|
uiPosY = MERC_WEAPONBOX_Y_NSGI + (MERC_WEAPONBOX_SIZE_Y_NSGI*i);
|
|
for(x=0; x<MERC_WEAPONBOX_COLUMNS; x++)
|
|
{
|
|
BltVideoObject(FRAME_BUFFER, hMercWeaponBoxHandle, 0, uiPosX, uiPosY, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
uiPosX += MERC_WEAPONBOX_SIZE_X_NSGI;
|
|
}
|
|
}
|
|
}
|
|
//JMich_MMG: Stealing tais routine (again)
|
|
void MercWeaponKitSelectionUpdate(UINT8 selectedInventory)
|
|
{
|
|
UINT8 ubMercID = GetMercIDFromMERCArray( gubCurMercIndex );
|
|
UINT32 uiLoop;
|
|
INT16 usItem;
|
|
if(!( gMercProfiles[ ubMercID ].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS ))
|
|
{
|
|
if(UsingNewInventorySystem() == true){
|
|
// Start by resetting all profile inventory values to 0
|
|
gMercProfiles[ubMercID].clearInventory();
|
|
gMercProfiles[ubMercID].ubInvUndroppable = 0;
|
|
// Next, go through and assign everything but lbe gear
|
|
for(uiLoop=INV_START_POS; uiLoop<NUM_INV_SLOTS; uiLoop++)
|
|
{
|
|
if(gMercProfileGear[ubMercID][selectedInventory].inv[uiLoop] != NONE)
|
|
{
|
|
gMercProfiles[ubMercID].inv[uiLoop] = gMercProfileGear[ubMercID][selectedInventory].inv[uiLoop];
|
|
gMercProfiles[ubMercID].bInvStatus[uiLoop] = gMercProfileGear[ubMercID][selectedInventory].iStatus[uiLoop];
|
|
if(uiLoop > 5)
|
|
gMercProfiles[ubMercID].bInvNumber[uiLoop] = gMercProfileGear[ubMercID][selectedInventory].iNumber[uiLoop];
|
|
else
|
|
gMercProfiles[ubMercID].bInvNumber[uiLoop] = 1;
|
|
}
|
|
}
|
|
// Last, go through and assign LBE items. Only needed for new inventory system
|
|
if((UsingNewInventorySystem() == true))
|
|
{
|
|
for(uiLoop=0; uiLoop<5; uiLoop++)
|
|
{
|
|
UINT32 uiLoop2 = uiLoop + VESTPOCKPOS;
|
|
if(gMercProfileGear[ubMercID][selectedInventory].lbe[uiLoop] != NONE){
|
|
gMercProfiles[ubMercID].inv[uiLoop2] = gMercProfileGear[ubMercID][selectedInventory].lbe[uiLoop];
|
|
gMercProfiles[ubMercID].bInvStatus[uiLoop2] = gMercProfileGear[ubMercID][selectedInventory].lStatus[uiLoop];
|
|
gMercProfiles[ubMercID].bInvNumber[uiLoop2] = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gMercProfiles[ubMercID].bMainGunAttractiveness = -1;
|
|
gMercProfiles[ubMercID].bArmourAttractiveness = -1;
|
|
|
|
for ( uiLoop = 0; uiLoop < gMercProfiles[ubMercID].inv.size(); uiLoop++ )
|
|
{
|
|
usItem = gMercProfiles[ubMercID].inv[ uiLoop ];
|
|
|
|
if ( usItem != NOTHING )
|
|
{
|
|
// Check if it's a gun
|
|
if ( Item[ usItem ].usItemClass & IC_GUN )
|
|
{
|
|
gMercProfiles[ubMercID].bMainGunAttractiveness = Weapon[ usItem ].ubDeadliness;
|
|
}
|
|
|
|
// If it's armour
|
|
if ( Item[ usItem ].usItemClass & IC_ARMOUR )
|
|
{
|
|
gMercProfiles[ubMercID].bArmourAttractiveness = min(128,Armour[ Item[ usItem ].ubClassIndex ].ubProtection);
|
|
}
|
|
}
|
|
}
|
|
|
|
//reset Gear Kit Price
|
|
gMercProfiles[ ubMercID ].usOptionalGearCost = 0;
|
|
|
|
//tais: new tag in gearkit that sets an absolute price for gearkit that will override item value and price modifier if it's a sensible value between 0 and 32000
|
|
if(gMercProfileGear[ubMercID][selectedInventory].AbsolutePrice >= 0 && gMercProfileGear[ubMercID][selectedInventory].AbsolutePrice <= 32000)
|
|
{
|
|
gMercProfiles[ ubMercID ].usOptionalGearCost = gMercProfileGear[ubMercID][selectedInventory].AbsolutePrice;
|
|
}
|
|
else
|
|
{
|
|
UINT16 tempGearCost = 0;
|
|
for ( uiLoop = 0; uiLoop< gMercProfiles[ ubMercID ].inv.size(); uiLoop++ )
|
|
{
|
|
if ( gMercProfiles[ ubMercID ].inv[ uiLoop ] != NOTHING )
|
|
{
|
|
//get the item
|
|
usItem = gMercProfiles[ ubMercID ].inv[ uiLoop ];
|
|
|
|
//add the cost
|
|
tempGearCost += Item[ usItem ].usPrice;
|
|
}
|
|
}
|
|
//tais: added optional price modifier for gearkits, reads the xml tag mPriceMod from MercStartingGear.xml
|
|
if(gMercProfileGear[ubMercID][selectedInventory].PriceModifier != 0 &&
|
|
gMercProfileGear[ubMercID][selectedInventory].PriceModifier <= 200 &&
|
|
gMercProfileGear[ubMercID][selectedInventory].PriceModifier >= -100)
|
|
{
|
|
FLOAT mod;
|
|
mod = (FLOAT) (gMercProfileGear[ubMercID][selectedInventory].PriceModifier + 100) / 100;
|
|
gMercProfiles[ ubMercID ].usOptionalGearCost = (UINT16)(tempGearCost * mod);
|
|
}
|
|
else
|
|
{
|
|
gMercProfiles[ ubMercID ].usOptionalGearCost = tempGearCost;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void MercHireButtonGearYesNoCallback (UINT8 bExitValue)
|
|
{
|
|
//yes, buy gear
|
|
if( bExitValue == MSG_BOX_RETURN_YES )
|
|
fMercBuyEquipment = 1;
|
|
//no, no gear
|
|
else
|
|
fMercBuyEquipment = 0;
|
|
|
|
MercProcessHireAfterGear();
|
|
}
|
|
|
|
void MercProcessHireAfterGear()
|
|
{
|
|
//process after gear check
|
|
guiCurrentLaptopMode = LAPTOP_MODE_MERC;
|
|
gubArrivedFromMercSubSite = MERC_CAME_FROM_HIRE_PAGE;
|
|
|
|
if( MercFilesHireMerc( GetMercIDFromMERCArray( gubCurMercIndex ) ) )
|
|
{
|
|
//start the merc talking
|
|
//HandlePlayerHiringMerc( GetMercIDFromMERCArray( gubCurMercIndex ) );
|
|
|
|
//We just hired a merc
|
|
gfJustHiredAMercMerc = TRUE;
|
|
}
|
|
}
|