From 8c4201e335273495098f1fa1e0a41dd993e38cab Mon Sep 17 00:00:00 2001 From: Wanne Date: Tue, 3 Dec 2013 09:24:24 +0000 Subject: [PATCH] - Fixed wrong encoding and damaged content of mercs Files.cpp (by Buggler) - Moved Chinese Character from mercs Files.cpp to _ChineseText.cpp, so we can have correct encoding of mercs Files.cpp git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6675 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Laptop/mercs Files.cpp | 3796 ++++++++++++++++++++-------------------- Utils/_ChineseText.cpp | 1 + 2 files changed, 1900 insertions(+), 1897 deletions(-) diff --git a/Laptop/mercs Files.cpp b/Laptop/mercs Files.cpp index 83272e4f8..b308eb850 100644 --- a/Laptop/mercs Files.cpp +++ b/Laptop/mercs Files.cpp @@ -1,1897 +1,1899 @@ -ÿþ/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +// WANNE 3 +#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" + #include "Encyclopedia_new.h" //update encyclopedia item visibility when viewing that item +#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 + 144 +#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 + 15 + +#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 + 115 +#define MERC_STATS_SECOND_COL_X MERC_FILES_STATS_BOX_X + 190 +#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[ GetAvailableMercIDFromMERCArray( 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; iuiFlags |= 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[ GetAvailableMercIndex(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[ GetAvailableMercIDFromMERCArray( 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[ GetAvailableMercIndex(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); + +#ifdef CHINESE + if( sText[0] != ChineseSpecString13 ) + 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); +#else + 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); +#endif + + //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 ) + { + 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 | TEXT_SHADOWED); + + //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; +#ifdef JA2UB + gusMercVideoSpeckSpeech = SPECK_QUOTE_PLAYER_TRIES_TO_HIRE_ALREADY_HIRED_MERC; +#else + // 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; + +#endif + 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: + case 'a': + // 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[ GetAvailableMercIndex(gubCurMercIndex) ].uiAlternateIndex != 255) + gubCurMercIndex--; + + RenderMercsFiles( ); + + //Enable or disable the buttons + EnableDisableMercFilesNextPreviousButton( ); + break; + case RIGHTARROW: + case 'd': + // 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[ GetAvailableMercIndex(gubCurMercIndex) ].uiAlternateIndex != 255) + // gubCurMercIndex++; + + RenderMercsFiles( ); + + //Enable or disable the buttons + EnableDisableMercFilesNextPreviousButton( ); + break; + case SHIFT_LEFTARROW: + case 'A': + // 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[ GetAvailableMercIndex(gubCurMercIndex) ].uiAlternateIndex != 255) + gubCurMercIndex--; + + RenderMercsFiles( ); + + //Enable or disable the buttons + EnableDisableMercFilesNextPreviousButton( ); + break; + case SHIFT_RIGHTARROW: + case 'D': + // 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[ GetAvailableMercIndex(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( GetAvailableMercIDFromMERCArray( 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[ GetAvailableMercIDFromMERCArray( 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': + case '2': + case '3': + case '4': + case '5': + if ((UsingNewInventorySystem() == true) && (gubCurMercFilesTogglePage == MERC_FILES_INV_PAGE)) + { + UINT8 mercId = GetAvailableMercIDFromMERCArray( gubCurMercIndex ); + + if(!(gMercProfiles[mercId].ubMiscFlags & PROFILE_MISC_FLAG_ALREADY_USED_ITEMS)) + { + UINT8 kit = 0; + switch(InputEvent.usParam) + { + case '2': + kit = 1; + break; + case '3': + kit = 2; + break; + case '4': + kit = 3; + break; + case '5': + kit = 4; + break; + } + + for(UINT8 i=INV_START_POS; i 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[ GetAvailableMercIndex(gubCurMercIndex) ].uiAlternateIndex != 255) + gubCurMercIndex--; + + RenderMercsFiles( ); + + //Enable or disable the buttons + EnableDisableMercFilesNextPreviousButton( ); + break; + case RIGHTARROW: + case 'd': + // 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[ GetAvailableMercIndex(gubCurMercIndex) ].uiAlternateIndex != 255) + // gubCurMercIndex++; + + RenderMercsFiles( ); + + //Enable or disable the buttons + EnableDisableMercFilesNextPreviousButton( ); + break; + } + } + } +} +//JMich_MMG: Kit Selection Buttons +void CreateMercKitSelectionButtons() +{ + INT32 i; + + for (i=0;iuiFlags |= 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;iubGraphicNum;*/ + 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; + } + //Moa: update encyclopedia item visibility when item gets displayed + EncyclopediaSetItemAsVisible( usItem, ENC_ITEM_DISCOVERED_NOT_INSPECTABLE ); + } + } + 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 1){ + for (i=0;i 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( GetAvailableMercIDFromMERCArray( gubCurMercIndex ) ) ) + { + //start the merc talking + //HandlePlayerHiringMerc( GetAvailableMercIDFromMERCArray( gubCurMercIndex ) ); + + //We just hired a merc + gfJustHiredAMercMerc = TRUE; + } +} diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 904737a0b..a4d4ea277 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -8143,5 +8143,6 @@ STR16 ChineseSpecString9 = L"%s [%d%ï¼…(%d%ï¼…)]\n%s %d\n%s %d\n%s %1.1f %s"; STR16 ChineseSpecString10 = L"%s [%d%ï¼…(%d%ï¼…)]\n%s %d%ï¼… (%d/%d)\n%s %d%ï¼…\n%s %1.1f %s"; // added by Flugente STR16 ChineseSpecString11 = L"%s (%s) [%d%ï¼…(%d%ï¼…)]\n%s %d\n%s %d\n%s %d (%d)\n%s (%d) %s\n%s %1.1f %s"; // added by Flugente STR16 ChineseSpecString12 = L"%s (%s) [%d%ï¼…]\n%s %d\n%s %d\n%s %d (%d)\n%s (%d) %s\n%s %1.1f %s\n%s %.2f%%"; // added by Flugente +STR16 ChineseSpecString13 = L'쳌'; #endif //CHINESE \ No newline at end of file