Files
source/Laptop/BobbyRGuns.cpp
T
MaddMugsy 72ad53d95e -removed disk space check because it was pissing me off and coming up with a warning despite the fact that I have 12 GB space free
-changed weapon ranges in tooltips to tiles to match the ranges in the item description screen

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@231 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2006-06-14 02:24:57 +00:00

2050 lines
67 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#else
#include "laptop.h"
#include "BobbyRGuns.h"
#include "BobbyR.h"
#include "Utilities.h"
#include "WCheck.h"
#include "WordWrap.h"
#include "Cursors.h"
#include "interface items.h"
#include "Encrypted File.h"
#include "text.h"
#include "Store Inventory.h"
#include "LaptopSave.h"
#include "Finances.h"
#include "AimMembers.h"
#include "Overhead.h"
#include "Text.h"
#include "Weapons.h"
#endif
#define BOBBYR_DEFAULT_MENU_COLOR 255
#define BOBBYR_GRID_PIC_WIDTH 118
#define BOBBYR_GRID_PIC_HEIGHT 69
#define BOBBYR_GRID_PIC_X BOBBYR_GRIDLOC_X + 3
#define BOBBYR_GRID_PIC_Y BOBBYR_GRIDLOC_Y + 3
#define BOBBYR_GRID_OFFSET 72
#define BOBBYR_ORDER_TITLE_FONT FONT14ARIAL
#define BOBBYR_ORDER_TEXT_FONT FONT10ARIAL
#define BOBBYR_ORDER_TEXT_COLOR 75
#define BOBBYR_STATIC_TEXT_COLOR 75
#define BOBBYR_ITEM_DESC_TEXT_FONT FONT10ARIAL
#define BOBBYR_ITEM_DESC_TEXT_COLOR FONT_MCOLOR_WHITE
#define BOBBYR_ITEM_NAME_TEXT_FONT FONT10ARIAL
#define BOBBYR_ITEM_NAME_TEXT_COLOR FONT_MCOLOR_WHITE
#define NUM_BOBBYRPAGE_MENU 6
#define NUM_CATALOGUE_BUTTONS 5
#define BOBBYR_NUM_WEAPONS_ON_PAGE 4
#define BOBBYR_BRTITLE_X LAPTOP_SCREEN_UL_X + 4
#define BOBBYR_BRTITLE_Y LAPTOP_SCREEN_WEB_UL_Y + 3
#define BOBBYR_BRTITLE_WIDTH 46
#define BOBBYR_BRTITLE_HEIGHT 42
#define BOBBYR_TO_ORDER_TITLE_X iScreenWidthOffset + 195
#define BOBBYR_TO_ORDER_TITLE_Y iScreenHeightOffset + 42 + LAPTOP_SCREEN_WEB_DELTA_Y
#define BOBBYR_TO_ORDER_TEXT_X BOBBYR_TO_ORDER_TITLE_X + 75
#define BOBBYR_TO_ORDER_TEXT_Y iScreenHeightOffset + 33 + LAPTOP_SCREEN_WEB_DELTA_Y
#define BOBBYR_TO_ORDER_TEXT_WIDTH 330
#define BOBBYR_PREVIOUS_BUTTON_X LAPTOP_SCREEN_UL_X + 5 //BOBBYR_HOME_BUTTON_X + BOBBYR_CATALOGUE_BUTTON_WIDTH + 5
#define BOBBYR_PREVIOUS_BUTTON_Y LAPTOP_SCREEN_WEB_UL_Y + 340 //BOBBYR_HOME_BUTTON_Y
#define BOBBYR_NEXT_BUTTON_X LAPTOP_SCREEN_UL_X + 412 //BOBBYR_ORDER_FORM_X + BOBBYR_ORDER_FORM_WIDTH + 5
#define BOBBYR_NEXT_BUTTON_Y BOBBYR_PREVIOUS_BUTTON_Y //BOBBYR_PREVIOUS_BUTTON_Y
#define BOBBYR_CATALOGUE_BUTTON_START_X BOBBYR_PREVIOUS_BUTTON_X + 92 //LAPTOP_SCREEN_UL_X + 93 - BOBBYR_CATALOGUE_BUTTON_WIDTH/2
#define BOBBYR_CATALOGUE_BUTTON_GAP ( 318 - NUM_CATALOGUE_BUTTONS * BOBBYR_CATALOGUE_BUTTON_WIDTH) / (NUM_CATALOGUE_BUTTONS + 1) + BOBBYR_CATALOGUE_BUTTON_WIDTH + 1//80
#define BOBBYR_CATALOGUE_BUTTON_Y LAPTOP_SCREEN_WEB_UL_Y + 340
#define BOBBYR_CATALOGUE_BUTTON_WIDTH 56//75
#define BOBBYR_HOME_BUTTON_X iScreenWidthOffset + 120
#define BOBBYR_HOME_BUTTON_Y iScreenHeightOffset + 400 + LAPTOP_SCREEN_WEB_DELTA_Y
#define BOBBYR_CATALOGUE_BUTTON_TEXT_Y BOBBYR_CATALOGUE_BUTTON_Y + 5
#define BOBBYR_PREVIOUS_PAGE 0
#define BOBBYR_NEXT_PAGE 1
#define BOBBYR_ITEM_DESC_START_X BOBBYR_GRIDLOC_X + 172 + 5
#define BOBBYR_ITEM_DESC_START_Y BOBBYR_GRIDLOC_Y + 6
#define BOBBYR_ITEM_DESC_START_WIDTH 214 - 10 + 20
#define BOBBYR_ITEM_NAME_X BOBBYR_GRIDLOC_X + 6
#define BOBBYR_ITEM_NAME_Y_OFFSET 54
#define BOBBYR_ORDER_NUM_WIDTH 15
#define BOBBYR_ORDER_NUM_X BOBBYR_GRIDLOC_X + 120 - BOBBYR_ORDER_NUM_WIDTH //BOBBYR_ITEM_STOCK_TEXT_X
#define BOBBYR_ORDER_NUM_Y_OFFSET 1
#define BOBBYR_ITEM_WEIGHT_TEXT_X BOBBYR_GRIDLOC_X + 409 + 3
#define BOBBYR_ITEM_WEIGHT_TEXT_Y 3
#define BOBBYR_ITEM_WEIGHT_NUM_X BOBBYR_GRIDLOC_X + 429 - 2
#define BOBBYR_ITEM_WEIGHT_NUM_Y 3
#define BOBBYR_ITEM_WEIGHT_NUM_WIDTH 60
#define BOBBYR_ITEM_SPEC_GAP 2
#define BOBBYR_ITEM_COST_TEXT_X BOBBYR_GRIDLOC_X + 125
#define BOBBYR_ITEM_COST_TEXT_Y BOBBYR_GRIDLOC_Y + 6
#define BOBBYR_ITEM_COST_TEXT_WIDTH 42
#define BOBBYR_ITEM_COST_NUM_X BOBBYR_ITEM_COST_TEXT_X
#define BOBBYR_ITEM_COST_NUM_Y BOBBYR_ITEM_COST_TEXT_Y + 10
#define BOBBYR_ITEM_STOCK_TEXT_X BOBBYR_ITEM_COST_TEXT_X
#define BOBBYR_ITEM_QTY_TEXT_X BOBBYR_GRIDLOC_X + 5//BOBBYR_ITEM_COST_TEXT_X
#define BOBBYR_ITEM_QTY_TEXT_Y BOBBYR_ITEM_COST_TEXT_Y + 28
#define BOBBYR_ITEM_QTY_WIDTH 95
#define BOBBYR_ITEM_QTY_NUM_X BOBBYR_GRIDLOC_X + 105//BOBBYR_ITEM_COST_TEXT_X + 1
#define BOBBYR_ITEM_QTY_NUM_Y BOBBYR_ITEM_QTY_TEXT_Y//BOBBYR_ITEM_COST_TEXT_Y + 40
#define BOBBYR_ITEMS_BOUGHT_X BOBBYR_GRIDLOC_X + 105 - BOBBYR_ORDER_NUM_WIDTH//BOBBYR_ITEM_QTY_NUM_X
#define BOBBY_RAY_NOT_PURCHASED 255
#define BOBBY_RAY_MAX_AMOUNT_OF_ITEMS_TO_PURCHASE 200
#define BOBBYR_ORDER_FORM_X LAPTOP_SCREEN_UL_X + 200//204
#define BOBBYR_ORDER_FORM_Y LAPTOP_SCREEN_WEB_UL_Y + 367
#define BOBBYR_ORDER_FORM_WIDTH 95
#define BOBBYR_ORDER_SUBTOTAL_X iScreenWidthOffset + 490
#define BOBBYR_ORDER_SUBTOTAL_Y BOBBYR_ORDER_FORM_Y+2//BOBBYR_HOME_BUTTON_Y
#define BOBBYR_PERCENT_FUNTCIONAL_X BOBBYR_ORDER_SUBTOTAL_X
#define BOBBYR_PERCENT_FUNTCIONAL_Y BOBBYR_ORDER_SUBTOTAL_Y + 15
BobbyRayPurchaseStruct BobbyRayPurchases[ MAX_PURCHASE_AMOUNT ];
//BobbyRayOrderStruct *BobbyRayOrdersOnDeliveryArray=NULL;
//UINT8 usNumberOfBobbyRayOrderItems = 0;
//UINT8 usNumberOfBobbyRayOrderUsed = 0;
extern BOOLEAN fExitingLaptopFlag;
UINT32 guiGunBackground;
UINT32 guiGunsGrid;
UINT32 guiBrTitle;
UINT16 gusCurWeaponIndex;
UINT8 gubCurPage;
UINT8 ubCatalogueButtonValues[] = {
LAPTOP_MODE_BOBBY_R_GUNS,
LAPTOP_MODE_BOBBY_R_AMMO,
LAPTOP_MODE_BOBBY_R_ARMOR,
LAPTOP_MODE_BOBBY_R_MISC,
LAPTOP_MODE_BOBBY_R_USED};
UINT16 gusLastItemIndex=0;
UINT16 gusFirstItemIndex=0;
UINT8 gubNumItemsOnScreen;
UINT8 gubNumPages;
BOOLEAN gfBigImageMouseRegionCreated;
UINT16 gusItemNumberForItemsOnScreen[ BOBBYR_NUM_WEAPONS_ON_PAGE ];
BOOLEAN gfOnUsedPage;
UINT16 gusOldItemNumOnTopOfPage=65535;
//The menu bar at the bottom that changes to different pages
void BtnBobbyRPageMenuCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiBobbyRPageMenu[ NUM_CATALOGUE_BUTTONS ];
INT32 guiBobbyRPageMenuImage;
//The next and previous buttons
void BtnBobbyRNextPreviousPageCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiBobbyRPreviousPage;
INT32 guiBobbyRPreviousPageImage;
UINT32 guiBobbyRNextPage;
INT32 guiBobbyRNextPageImage;
// Big Image Mouse region
MOUSE_REGION gSelectedBigImageRegion[ BOBBYR_NUM_WEAPONS_ON_PAGE ];
void SelectBigImageRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
// The order form button
void BtnBobbyROrderFormCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiBobbyROrderForm;
INT32 guiBobbyROrderFormImage;
// The Home button
void BtnBobbyRHomeButtonCallback(GUI_BUTTON *btn,INT32 reason);
extern UINT32 guiBobbyRHome; // symbol already defined in BobbyRMailOrder.cpp (jonathanl)
extern INT32 guiBobbyRHomeImage; // symbol already defined in BobbyRMailOrder.cpp (jonathanl)
// Link from the title
MOUSE_REGION gSelectedTitleImageLinkRegion;
void SelectTitleImageLinkRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
UINT32 guiTempCurrentMode;
BOOLEAN DisplayNonGunWeaponInfo(UINT16 usItemIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex);
BOOLEAN DisplayArmourInfo(UINT16 usItemIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex);
BOOLEAN DisplayMiscInfo(UINT16 usItemIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex);
BOOLEAN DisplayGunInfo(UINT16 usItemIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex);
BOOLEAN DisplayAmmoInfo(UINT16 usItemIndex, UINT16 usPosY, BOOLEAN fUsed, UINT16 usBobbyIndex);
BOOLEAN DisplayBigItemImage(UINT16 ubIndex, UINT16 usPosY);
//void InitFirstAndLastGlobalIndex(UINT32 ubItemClassMask);
UINT16 DisplayCostAndQty(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight, UINT16 usBobbyIndex, BOOLEAN fUsed);
UINT16 DisplayRof(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
UINT16 DisplayDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
UINT16 DisplayRange(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
UINT16 DisplayMagazine(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
void DisplayItemNameAndInfo(UINT16 usPosY, UINT16 usIndex, UINT16 usBobbyIndex, BOOLEAN fUsed);
UINT16 DisplayWeight(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
UINT16 DisplayCaliber(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
void CreateMouseRegionForBigImage(UINT16 usPosY, UINT8 ubCount, INT16 *pItemNumbers );
void PurchaseBobbyRayItem(UINT16 usItemNumber);
UINT8 CheckIfItemIsPurchased(UINT16 usItemNumber);
UINT8 GetNextPurchaseNumber();
void UnPurchaseBobbyRayItem(UINT16 usItemNumber);
UINT32 CalculateTotalPurchasePrice();
void DisableBobbyRButtons();
void CalcFirstIndexForPage( STORE_INVENTORY *pInv, UINT32 uiItemClass );
void OutOfStockMessageBoxCallBack( UINT8 bExitValue );
UINT8 CheckPlayersInventoryForGunMatchingGivenAmmoID( INT16 sItemID );
void BobbyrRGunsHelpTextDoneCallBack( void );
#ifdef JA2BETAVERSION
void ReportBobbyROrderError( UINT16 usItemNumber, UINT8 ubPurchaseNum, UINT8 ubQtyOnHand, UINT8 ubNumPurchasing );
#endif
//ppp
void GameInitBobbyRGuns()
{
guiTempCurrentMode=0;
memset(&BobbyRayPurchases, 0, MAX_PURCHASE_AMOUNT);
}
void EnterInitBobbyRGuns()
{
guiTempCurrentMode=0;
memset(&BobbyRayPurchases, 0, MAX_PURCHASE_AMOUNT);
}
BOOLEAN EnterBobbyRGuns()
{
VOBJECT_DESC VObjectDesc;
gfBigImageMouseRegionCreated = FALSE;
// load the background graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\gunbackground.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiGunBackground));
// load the gunsgrid graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\gunsgrid.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiGunsGrid));
InitBobbyBrTitle();
SetFirstLastPagesForNew( IC_BOBBY_GUN );
// CalculateFirstAndLastIndexs();
/*
if(giCurrentSubPage == 0)
gusCurWeaponIndex = gusFirstGunIndex;
else
gusCurWeaponIndex = (UINT8)giCurrentSubPage;
*/
//Draw menu bar
InitBobbyMenuBar( /*IC_GUN*/ ); // no parameteres (jonathanl)
// render once
RenderBobbyRGuns( );
// RenderBobbyRGuns();
return(TRUE);
}
void ExitBobbyRGuns()
{
DeleteVideoObjectFromIndex(guiGunBackground);
DeleteVideoObjectFromIndex(guiGunsGrid);
DeleteBobbyBrTitle();
DeleteBobbyMenuBar();
DeleteMouseRegionForBigImage();
giCurrentSubPage = gusCurWeaponIndex;
guiLastBobbyRayPage = LAPTOP_MODE_BOBBY_R_GUNS;
}
void HandleBobbyRGuns()
{
}
void RenderBobbyRGuns()
{
HVOBJECT hPixHandle;
WebPageTileBackground(BOBBYR_NUM_HORIZONTAL_TILES, BOBBYR_NUM_VERTICAL_TILES, BOBBYR_BACKGROUND_WIDTH, BOBBYR_BACKGROUND_HEIGHT, guiGunBackground);
//Display title at top of page
DisplayBobbyRBrTitle();
// GunForm
GetVideoObject(&hPixHandle, guiGunsGrid);
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, BOBBYR_GRIDLOC_X, BOBBYR_GRIDLOC_Y, VO_BLT_SRCTRANSPARENCY,NULL);
// DeleteMouseRegionForBigImage();
DisplayItemInfo( IC_BOBBY_GUN );
UpdateButtonText(guiCurrentLaptopMode);
MarkButtonsDirty( );
RenderWWWProgramTitleBar( );
InvalidateRegion(0,0,SCREEN_WIDTH, SCREEN_HEIGHT);
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
BOOLEAN DisplayBobbyRBrTitle()
{
HVOBJECT hPixHandle;
// BR title
GetVideoObject(&hPixHandle, guiBrTitle);
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, BOBBYR_BRTITLE_X, BOBBYR_BRTITLE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
// To Order Text
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_TO_ORDER], BOBBYR_TO_ORDER_TITLE_X, BOBBYR_TO_ORDER_TITLE_Y, 0, BOBBYR_ORDER_TITLE_FONT, BOBBYR_ORDER_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
//First put a shadow behind the image
ShadowVideoSurfaceRect( FRAME_BUFFER, BOBBYR_TO_ORDER_TEXT_X-2, BOBBYR_TO_ORDER_TEXT_Y-2, BOBBYR_TO_ORDER_TEXT_X+BOBBYR_TO_ORDER_TEXT_WIDTH, BOBBYR_TO_ORDER_TEXT_Y+31);
//To Order text
DisplayWrappedString(BOBBYR_TO_ORDER_TEXT_X, BOBBYR_TO_ORDER_TEXT_Y, BOBBYR_TO_ORDER_TEXT_WIDTH, 2, BOBBYR_ORDER_TEXT_FONT, BOBBYR_ORDER_TEXT_COLOR, BobbyRText[BOBBYR_GUNS_CLICK_ON_ITEMS], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
return(TRUE);
}
BOOLEAN InitBobbyBrTitle()
{
VOBJECT_DESC VObjectDesc;
// load the br title graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\br.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiBrTitle));
//initialize the link to the homepage by clicking on the title
MSYS_DefineRegion( &gSelectedTitleImageLinkRegion, BOBBYR_BRTITLE_X, BOBBYR_BRTITLE_Y, (BOBBYR_BRTITLE_X + BOBBYR_BRTITLE_WIDTH), (UINT16)(BOBBYR_BRTITLE_Y + BOBBYR_BRTITLE_HEIGHT), MSYS_PRIORITY_HIGH,
CURSOR_WWW, MSYS_NO_CALLBACK, SelectTitleImageLinkRegionCallBack);
MSYS_AddRegion( &gSelectedTitleImageLinkRegion );
gusOldItemNumOnTopOfPage=65535;
return(TRUE);
}
BOOLEAN DeleteBobbyBrTitle()
{
DeleteVideoObjectFromIndex(guiBrTitle);
MSYS_RemoveRegion( &gSelectedTitleImageLinkRegion);
DeleteMouseRegionForBigImage();
return(TRUE);
}
void SelectTitleImageLinkRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
if (iReason & MSYS_CALLBACK_REASON_INIT)
{
}
else if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
guiCurrentLaptopMode = LAPTOP_MODE_BOBBY_R;
}
}
BOOLEAN InitBobbyMenuBar( )
{
UINT8 i;
UINT16 usPosX;
UINT8 bCurMode;
// Previous button
guiBobbyRPreviousPageImage = LoadButtonImage("LAPTOP\\PreviousButton.sti", -1,0,-1,1,-1 );
guiBobbyRPreviousPage = CreateIconAndTextButton( guiBobbyRPreviousPageImage, BobbyRText[BOBBYR_GUNS_PREVIOUS_ITEMS], BOBBYR_GUNS_BUTTON_FONT,
BOBBYR_GUNS_TEXT_COLOR_ON, BOBBYR_GUNS_SHADOW_COLOR,
BOBBYR_GUNS_TEXT_COLOR_OFF, BOBBYR_GUNS_SHADOW_COLOR,
TEXT_CJUSTIFIED,
BOBBYR_PREVIOUS_BUTTON_X, BOBBYR_PREVIOUS_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnBobbyRNextPreviousPageCallback);
SetButtonCursor(guiBobbyRPreviousPage, CURSOR_LAPTOP_SCREEN);
MSYS_SetBtnUserData( guiBobbyRPreviousPage, 0, BOBBYR_PREVIOUS_PAGE);
SpecifyDisabledButtonStyle( guiBobbyRPreviousPage, DISABLED_STYLE_SHADED );
guiBobbyRPageMenuImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
// Next button
guiBobbyRNextPageImage = LoadButtonImage("LAPTOP\\NextButton.sti", -1,0,-1,1,-1 );
guiBobbyRNextPage = CreateIconAndTextButton( guiBobbyRNextPageImage, BobbyRText[BOBBYR_GUNS_MORE_ITEMS], BOBBYR_GUNS_BUTTON_FONT,
BOBBYR_GUNS_TEXT_COLOR_ON, BOBBYR_GUNS_SHADOW_COLOR,
BOBBYR_GUNS_TEXT_COLOR_OFF, BOBBYR_GUNS_SHADOW_COLOR,
TEXT_CJUSTIFIED,
BOBBYR_NEXT_BUTTON_X, BOBBYR_NEXT_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnBobbyRNextPreviousPageCallback);
SetButtonCursor(guiBobbyRNextPage, CURSOR_LAPTOP_SCREEN);
MSYS_SetBtnUserData( guiBobbyRNextPage, 0, BOBBYR_NEXT_PAGE);
SpecifyDisabledButtonStyle( guiBobbyRNextPage, DISABLED_STYLE_SHADED );
bCurMode = 0;
usPosX = BOBBYR_CATALOGUE_BUTTON_START_X;
for(i=0; i<NUM_CATALOGUE_BUTTONS; i++)
{
// Catalogue Buttons button
guiBobbyRPageMenu[i] = CreateIconAndTextButton( guiBobbyRPageMenuImage, BobbyRText[BOBBYR_GUNS_GUNS+i], BOBBYR_GUNS_BUTTON_FONT,
BOBBYR_GUNS_TEXT_COLOR_ON, BOBBYR_GUNS_SHADOW_COLOR,
BOBBYR_GUNS_TEXT_COLOR_OFF, BOBBYR_GUNS_SHADOW_COLOR,
TEXT_CJUSTIFIED,
usPosX, BOBBYR_CATALOGUE_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnBobbyRPageMenuCallback);
SetButtonCursor(guiBobbyRPageMenu[i], CURSOR_LAPTOP_SCREEN);
MSYS_SetBtnUserData( guiBobbyRPageMenu[i], 0, ubCatalogueButtonValues[bCurMode]);
usPosX += BOBBYR_CATALOGUE_BUTTON_GAP;
bCurMode++;
}
// Order Form button
guiBobbyROrderFormImage = LoadButtonImage("LAPTOP\\OrderFormButton.sti", -1,0,-1,1,-1 );
guiBobbyROrderForm = CreateIconAndTextButton( guiBobbyROrderFormImage, BobbyRText[BOBBYR_GUNS_ORDER_FORM], BOBBYR_GUNS_BUTTON_FONT,
BOBBYR_GUNS_TEXT_COLOR_ON, BOBBYR_GUNS_SHADOW_COLOR,
BOBBYR_GUNS_TEXT_COLOR_OFF, BOBBYR_GUNS_SHADOW_COLOR,
TEXT_CJUSTIFIED,
BOBBYR_ORDER_FORM_X, BOBBYR_ORDER_FORM_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnBobbyROrderFormCallback);
SetButtonCursor(guiBobbyROrderForm, CURSOR_LAPTOP_SCREEN);
// Home button
guiBobbyRHomeImage = LoadButtonImage("LAPTOP\\CatalogueButton.sti", -1,0,-1,1,-1 );
guiBobbyRHome = CreateIconAndTextButton( guiBobbyRHomeImage, BobbyRText[BOBBYR_GUNS_HOME], BOBBYR_GUNS_BUTTON_FONT,
BOBBYR_GUNS_TEXT_COLOR_ON, BOBBYR_GUNS_SHADOW_COLOR,
BOBBYR_GUNS_TEXT_COLOR_OFF, BOBBYR_GUNS_SHADOW_COLOR,
TEXT_CJUSTIFIED,
BOBBYR_HOME_BUTTON_X, BOBBYR_HOME_BUTTON_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnBobbyRHomeButtonCallback);
SetButtonCursor(guiBobbyRHome, CURSOR_LAPTOP_SCREEN);
return(TRUE);
}
BOOLEAN DeleteBobbyMenuBar()
{
UINT8 i;
UnloadButtonImage( guiBobbyRNextPageImage );
UnloadButtonImage( guiBobbyRPreviousPageImage );
UnloadButtonImage( guiBobbyRPageMenuImage );
UnloadButtonImage( guiBobbyROrderFormImage );
UnloadButtonImage( guiBobbyRHomeImage );
RemoveButton( guiBobbyRNextPage );
RemoveButton( guiBobbyRPreviousPage );
RemoveButton( guiBobbyROrderForm );
RemoveButton( guiBobbyRHome );
for(i=0; i<NUM_CATALOGUE_BUTTONS; i++)
{
RemoveButton( guiBobbyRPageMenu[i] );
}
return(TRUE);
}
void BtnBobbyRPageMenuCallback(GUI_BUTTON *btn,INT32 reason)
{
UINT32 bNewValue;
bNewValue = MSYS_GetBtnUserData( btn, 0 );
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
guiTempCurrentMode = bNewValue;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
guiTempCurrentMode = BOBBYR_DEFAULT_MENU_COLOR;
UpdateButtonText(guiCurrentLaptopMode);
guiCurrentLaptopMode = bNewValue;
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
guiTempCurrentMode = BOBBYR_DEFAULT_MENU_COLOR;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void BtnBobbyRNextPreviousPageCallback(GUI_BUTTON *btn,INT32 reason)
{
UINT32 bNewValue;
bNewValue = MSYS_GetBtnUserData( btn, 0 );
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 )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
//if previous screen
if( bNewValue == BOBBYR_PREVIOUS_PAGE)
{
if( gubCurPage > 0 )
gubCurPage--;
}
//else next screen
else
{
if( gubCurPage < gubNumPages-1 )
gubCurPage++;
}
DeleteMouseRegionForBigImage();
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
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 DisplayItemInfo(UINT32 uiItemClass)
{
UINT16 i;
UINT8 ubCount=0;
UINT16 PosY, usTextPosY;
UINT16 ubFirstIndex=0;
UINT16 usItemIndex;
wchar_t sDollarTemp[60];
wchar_t sTemp[60];
INT16 pItemNumbers[ BOBBYR_NUM_WEAPONS_ON_PAGE ];
PosY = BOBBYR_GRID_PIC_Y;
usTextPosY = BOBBYR_ITEM_DESC_START_Y;
// InitFirstAndLastGlobalIndex( uiItemClass );
//if there are no items then return
if( gusFirstItemIndex == BOBBYR_NO_ITEMS )
{
if( fExitingLaptopFlag )
return( TRUE );
DisableBobbyRButtons();
//Display a popup saying we are out of stock
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, BobbyRText[ BOBBYR_NO_MORE_STOCK ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, OutOfStockMessageBoxCallBack );
return( TRUE );
}
if( uiItemClass == BOBBYR_USED_ITEMS )
CalcFirstIndexForPage( LaptopSaveInfo.BobbyRayUsedInventory, uiItemClass );
else
CalcFirstIndexForPage( LaptopSaveInfo.BobbyRayInventory, uiItemClass );
DisableBobbyRButtons();
if( gusOldItemNumOnTopOfPage != gusCurWeaponIndex )
{
DeleteMouseRegionForBigImage();
}
for(i=gusCurWeaponIndex; ((i<=gusLastItemIndex) && (ubCount < 4)); i++)
{
if( uiItemClass == BOBBYR_USED_ITEMS )
{
//If there is not items in stock
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnHand == 0 )
continue;
usItemIndex = LaptopSaveInfo.BobbyRayUsedInventory[ i ].usItemIndex;
gfOnUsedPage = TRUE;
}
else
{
//If there is not items in stock
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand == 0 )
continue;
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
gfOnUsedPage = FALSE;
}
// skip items that aren't of the right item class
if( ! ( Item[ usItemIndex ].usItemClass & uiItemClass ) )
{
continue;
}
pItemNumbers[ ubCount ] = usItemIndex;
switch( Item[ usItemIndex ].usItemClass )
{
case IC_GUN:
case IC_LAUNCHER:
gusItemNumberForItemsOnScreen[ ubCount ] = i;
DisplayBigItemImage( usItemIndex, PosY);
//Display Items Name
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
DisplayGunInfo(usItemIndex, usTextPosY, gfOnUsedPage, i);
PosY += BOBBYR_GRID_OFFSET;
usTextPosY += BOBBYR_GRID_OFFSET;
ubCount++;
break;
case IC_AMMO:
gusItemNumberForItemsOnScreen[ ubCount ] = i;
DisplayBigItemImage( usItemIndex, PosY);
//Display Items Name
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
DisplayAmmoInfo( usItemIndex, usTextPosY, gfOnUsedPage, i);
PosY += BOBBYR_GRID_OFFSET;
usTextPosY += BOBBYR_GRID_OFFSET;
ubCount++;
break;
case IC_ARMOUR:
gusItemNumberForItemsOnScreen[ ubCount ] = i;
DisplayBigItemImage( usItemIndex, PosY);
//Display Items Name
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
DisplayArmourInfo( usItemIndex, usTextPosY, gfOnUsedPage, i);
PosY += BOBBYR_GRID_OFFSET;
usTextPosY += BOBBYR_GRID_OFFSET;
ubCount++;
break;
case IC_BLADE:
case IC_THROWING_KNIFE:
case IC_PUNCH:
gusItemNumberForItemsOnScreen[ ubCount ] = i;
DisplayBigItemImage( usItemIndex, PosY);
//Display Items Name
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
DisplayNonGunWeaponInfo(usItemIndex, usTextPosY, gfOnUsedPage, i);
PosY += BOBBYR_GRID_OFFSET;
usTextPosY += BOBBYR_GRID_OFFSET;
ubCount++;
break;
case IC_GRENADE:
case IC_BOMB:
case IC_MISC:
case IC_MEDKIT:
case IC_KIT:
case IC_FACE:
gusItemNumberForItemsOnScreen[ ubCount ] = i;
DisplayBigItemImage( usItemIndex, PosY);
//Display Items Name
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
DisplayMiscInfo( usItemIndex, usTextPosY, gfOnUsedPage, i);
PosY += BOBBYR_GRID_OFFSET;
usTextPosY += BOBBYR_GRID_OFFSET;
ubCount++;
break;
}
}
if( gusOldItemNumOnTopOfPage != gusCurWeaponIndex )
{
CreateMouseRegionForBigImage(BOBBYR_GRID_PIC_Y, ubCount, pItemNumbers );
gusOldItemNumOnTopOfPage = gusCurWeaponIndex;
}
//Display the subtotal at the bottom of the screen
swprintf( sDollarTemp, L"%d", CalculateTotalPurchasePrice() );
InsertCommasForDollarFigure( sDollarTemp );
InsertDollarSignInToString( sDollarTemp );
swprintf( sTemp, L"%s %s", BobbyRText[BOBBYR_GUNS_SUB_TOTAL], sDollarTemp );
DrawTextToScreen(sTemp, BOBBYR_ORDER_SUBTOTAL_X, BOBBYR_ORDER_SUBTOTAL_Y, 0, BOBBYR_ORDER_TITLE_FONT, BOBBYR_ORDER_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED | TEXT_SHADOWED);
//Display the Used item disclaimer
if( gfOnUsedPage )
{
DrawTextToScreen( BobbyRText[BOBBYR_GUNS_PERCENT_FUNCTIONAL], BOBBYR_PERCENT_FUNTCIONAL_X, BOBBYR_PERCENT_FUNTCIONAL_Y, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ORDER_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED | TEXT_SHADOWED);
}
return(TRUE);
}
BOOLEAN DisplayGunInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
{
UINT16 usHeight;
UINT32 uiStartLoc=0;
UINT16 usFontHeight;
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
//DisplayItemNameAndInfo(usTextPosY, usIndex, fUsed);
usHeight = usTextPosY;
//Display the weight, caliber, mag, rng, dam, rof text
//Weight
usHeight = DisplayWeight(usHeight, usIndex, usFontHeight);
//Caliber
usHeight = DisplayCaliber(usHeight, usIndex, usFontHeight);
//Magazine
usHeight = DisplayMagazine(usHeight, usIndex, usFontHeight);
//Range
usHeight = DisplayRange(usHeight, usIndex, usFontHeight);
//Damage
usHeight = DisplayDamage(usHeight, usIndex, usFontHeight);
//ROF
usHeight = DisplayRof(usHeight, usIndex, usFontHeight);
//Display the Cost and the qty bought and on hand
usHeight = DisplayCostAndQty(usTextPosY, usIndex, usFontHeight, usBobbyIndex, fUsed);
return(TRUE);
} //DisplayGunInfo
BOOLEAN DisplayNonGunWeaponInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
{
UINT16 usHeight;
UINT32 uiStartLoc=0;
UINT16 usFontHeight;
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
// DisplayItemNameAndInfo(usTextPosY, usIndex, fUsed);
usHeight = usTextPosY;
//Display the weight, caliber, mag, rng, dam, rof text
//Weight
usHeight = DisplayWeight(usHeight, usIndex, usFontHeight);
//Damage
usHeight = DisplayDamage(usHeight, usIndex, usFontHeight);
//Display the Cost and the qty bought and on hand
usHeight = DisplayCostAndQty(usTextPosY, usIndex, usFontHeight, usBobbyIndex, fUsed);
return(TRUE);
} //DisplayNonGunWeaponInfo
BOOLEAN DisplayAmmoInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
{
UINT16 usHeight;
UINT32 uiStartLoc=0;
UINT16 usFontHeight;
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
// DisplayItemNameAndInfo(usTextPosY, usIndex, fUsed);
usHeight = usTextPosY;
//Display the weight, caliber, mag, rng, dam, rof text
//Caliber
usHeight = DisplayCaliber(usHeight, usIndex, usFontHeight);
//Magazine
// usHeight = DisplayMagazine(usHeight, usIndex, usFontHeight);
//Display the Cost and the qty bought and on hand
usHeight = DisplayCostAndQty(usTextPosY, usIndex, usFontHeight, usBobbyIndex, fUsed);
return(TRUE);
} //DisplayAmmoInfo
BOOLEAN DisplayBigItemImage(UINT16 usIndex, UINT16 PosY)
{
INT16 PosX, sCenX, sCenY;
UINT32 usHeight, usWidth;
ETRLEObject *pTrav;
INVTYPE *pItem;
UINT32 uiImage;
HVOBJECT hPixHandle;
PosX = BOBBYR_GRID_PIC_X;
pItem = &Item[ usIndex ];
LoadTileGraphicForItem(pItem, &uiImage);
GetVideoObject(&hPixHandle, uiImage);
pTrav = &(hPixHandle->pETRLEObject[0]);
//center picture in frame
usHeight = (UINT32)pTrav->usHeight;
usWidth = (UINT32)pTrav->usWidth;
// sCenX = PosX + ( abs( BOBBYR_GRID_PIC_WIDTH - usWidth ) / 2 );
// sCenY = PosY + 8;
sCenX = PosX + ( abs( BOBBYR_GRID_PIC_WIDTH - usWidth ) / 2 ) - pTrav->sOffsetX;
sCenY = PosY + 8;
//blt the shadow of the item
BltVideoObjectOutlineShadowFromIndex( FRAME_BUFFER, uiImage, 0, sCenX-2, sCenY+2);//pItem->ubGraphicNum
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, sCenX, sCenY, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex(uiImage);
return(TRUE);
}
BOOLEAN DisplayArmourInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
{
UINT16 usHeight;
UINT32 uiStartLoc=0;
UINT16 usFontHeight;
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
// DisplayItemNameAndInfo(usTextPosY, usIndex, fUsed);
usHeight = usTextPosY;
//Display the weight, caliber, mag, rng, dam, rof text
//Weight
usHeight = DisplayWeight(usHeight, usIndex, usFontHeight);
//Display the Cost and the qty bought and on hand
usHeight = DisplayCostAndQty(usTextPosY, usIndex, usFontHeight, usBobbyIndex, fUsed);
return(TRUE);
} //DisplayArmourInfo
BOOLEAN DisplayMiscInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
{
UINT16 usHeight;
UINT32 uiStartLoc=0;
UINT16 usFontHeight;
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
// DisplayItemNameAndInfo(usTextPosY, usIndex, fUsed);
//Display the Cost and the qty bought and on hand
usHeight = DisplayCostAndQty(usTextPosY, usIndex, usFontHeight, usBobbyIndex, fUsed);
return(TRUE);
} //DisplayMiscInfo
UINT16 DisplayCostAndQty(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight, UINT16 usBobbyIndex, BOOLEAN fUsed)
{
wchar_t sTemp[20];
// UINT8 ubPurchaseNumber;
//
//Display the cost and the qty
//
//Display the cost
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_COST], BOBBYR_ITEM_COST_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
usPosY += usFontHeight + 2;
swprintf(sTemp, L"%d", CalcBobbyRayCost( usIndex, usBobbyIndex, fUsed ));
InsertCommasForDollarFigure( sTemp );
InsertDollarSignInToString( sTemp );
DrawTextToScreen(sTemp, BOBBYR_ITEM_COST_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
/*
//Display the # bought
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_QTY_ON_ORDER], BOBBYR_ITEM_QTY_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
usPosY += usFontHeight + 2;
ubPurchaseNumber = CheckIfItemIsPurchased(usBobbyIndex);
if( ubPurchaseNumber == BOBBY_RAY_NOT_PURCHASED)
swprintf(sTemp, L"% 4d", 0);
else
swprintf(sTemp, L"% 4d", BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased);
DrawTextToScreen(sTemp, BOBBYR_ITEMS_BOUGHT_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
*/
//Display Weight Number
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_WGHT], BOBBYR_ITEM_STOCK_TEXT_X, (UINT16)(usPosY), BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
usPosY += usFontHeight + 2;
swprintf( sTemp, L"%3.2f", GetWeightBasedOnMetricOption( Item[ usIndex ].ubWeight ) / (FLOAT)( 10.0 ) );
DrawTextToScreen(sTemp, BOBBYR_ITEM_STOCK_TEXT_X, (UINT16)(usPosY), BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
//Display the # In Stock
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_IN_STOCK], BOBBYR_ITEM_STOCK_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
usPosY += usFontHeight + 2;
if( fUsed )
swprintf(sTemp, L"% 4d", LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].ubQtyOnHand);
else
swprintf(sTemp, L"% 4d", LaptopSaveInfo.BobbyRayInventory[ usBobbyIndex ].ubQtyOnHand);
DrawTextToScreen(sTemp, BOBBYR_ITEM_STOCK_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_COST_TEXT_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayRof(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
wchar_t sTemp[20];
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_ROF], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
if( WeaponROF[ usIndex ] == -1 )
swprintf(sTemp, L"? %s", pMessageStrings[ MSG_RPM ] );
else
swprintf(sTemp, L"%3d/%s", WeaponROF[ usIndex ], pMessageStrings[ MSG_MINUTE_ABBREVIATION ]);
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
wchar_t sTemp[20];
UINT16 gunDamage = 0;
if ( Item[ usIndex ].usItemClass == IC_GUN || Item[ usIndex ].usItemClass == IC_LAUNCHER )
{
gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
}
else
{
gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
}
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_DAMAGE], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
swprintf(sTemp, L"%4d", gunDamage);
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayRange(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
wchar_t sTemp[20];
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_RANGE], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
swprintf(sTemp, L"%3d %s", Weapon[ usIndex ].usRange, pMessageStrings[ MSG_METER_ABBREVIATION ] );
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayMagazine(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
wchar_t sTemp[20];
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_MAGAZINE], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
swprintf(sTemp, L"%3d %s", Weapon[usIndex].ubMagSize, pMessageStrings[ MSG_ROUNDS_ABBREVIATION ] );
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayCaliber(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
CHAR16 zTemp[128];
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_CALIBRE], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
// if ammo is begin drawn
if( Item[ usIndex].usItemClass == IC_AMMO )
{
swprintf( zTemp, L"%s", BobbyRayAmmoCaliber[ Magazine[ Item[ usIndex ].ubClassIndex ].ubCalibre] );
// DrawTextToScreen( AmmoCaliber[ Magazine[ Item[ usIndex ].ubClassIndex ].ubCalibre], BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
}
else
{
//else a gun is being displayed
swprintf( zTemp, L"%s", BobbyRayAmmoCaliber[ Weapon[ Item[ usIndex ].ubClassIndex ].ubCalibre ] );
// DrawTextToScreen( AmmoCaliber[ Weapon[ Item[ usIndex ].ubClassIndex ].ubCalibre ], BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
}
if( StringPixLength( zTemp, BOBBYR_ITEM_DESC_TEXT_FONT ) > BOBBYR_ITEM_WEIGHT_NUM_WIDTH )
ReduceStringLength( zTemp, BOBBYR_GRID_PIC_WIDTH, BOBBYR_ITEM_NAME_TEXT_FONT );
DrawTextToScreen( zTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
UINT16 DisplayWeight(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
{
wchar_t sTemp[20];
//display the 'weight' string
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_WEIGHT], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
swprintf(sTemp, L"%3.2f %s", GetWeightBasedOnMetricOption(Item[ usIndex ].ubWeight)/10, GetWeightUnitString() );
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
usPosY += usFontHeight + 2;
return(usPosY);
}
void DisplayItemNameAndInfo(UINT16 usPosY, UINT16 usIndex, UINT16 usBobbyIndex, BOOLEAN fUsed)
{
wchar_t sText[400];
wchar_t sTemp[20];
UINT32 uiStartLoc=0;
UINT8 ubPurchaseNumber;
UINT16 usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
//Display Items Name
//uiStartLoc = BOBBYR_ITEM_DESC_FILE_SIZE * usIndex;
//LoadEncryptedDataFromFile(BOBBYRDESCFILE, sText, uiStartLoc, BOBBYR_ITEM_DESC_NAME_SIZE);
LoadBRName(usIndex,sText);
if( StringPixLength( sText, BOBBYR_ITEM_NAME_TEXT_FONT ) > ( BOBBYR_GRID_PIC_WIDTH - 6 ) )
ReduceStringLength( sText, BOBBYR_GRID_PIC_WIDTH - 6, BOBBYR_ITEM_NAME_TEXT_FONT );
DrawTextToScreen(sText, BOBBYR_ITEM_NAME_X, (UINT16)(usPosY+BOBBYR_ITEM_NAME_Y_OFFSET), 0, BOBBYR_ITEM_NAME_TEXT_FONT, BOBBYR_ITEM_NAME_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
//number bought
//Display the # bought
ubPurchaseNumber = CheckIfItemIsPurchased(usBobbyIndex);
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED)
{
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_QTY_ON_ORDER], BOBBYR_ITEM_QTY_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_QTY_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED)
{
swprintf(sTemp, L"% 4d", BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased);
DrawTextToScreen(sTemp, BOBBYR_ITEMS_BOUGHT_X, (UINT16)usPosY, 0, FONT14ARIAL, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
}
}
//if it's a used item, display how damaged the item is
if( fUsed )
{
swprintf( sTemp, L"*%3d%%%%", LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].ubItemQuality );
DrawTextToScreen(sTemp, (UINT16)(BOBBYR_ITEM_NAME_X-2), (UINT16)(usPosY - BOBBYR_ORDER_NUM_Y_OFFSET), BOBBYR_ORDER_NUM_WIDTH, BOBBYR_ITEM_NAME_TEXT_FONT, BOBBYR_ITEM_NAME_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
}
//Display Items description
//uiStartLoc = (BOBBYR_ITEM_DESC_FILE_SIZE * usIndex) + BOBBYR_ITEM_DESC_NAME_SIZE;
//LoadEncryptedDataFromFile(BOBBYRDESCFILE, sText, uiStartLoc, BOBBYR_ITEM_DESC_INFO_SIZE);
LoadBRDesc(usIndex,sText);
DisplayWrappedString(BOBBYR_ITEM_DESC_START_X, usPosY, BOBBYR_ITEM_DESC_START_WIDTH, 2, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
}
/*
void InitFirstAndLastGlobalIndex(UINT32 uiItemClass)
{
switch(uiItemClass)
{
case IC_BOBBY_GUN:
gusLastItemIndex = gusLastGunIndex ;
gusFirstItemIndex = gusFirstGunIndex;
gubNumPages = gubNumGunPages;
break;
case IC_BOBBY_MISC:
gusLastItemIndex = gusLastMiscIndex ;
gusFirstItemIndex = gusFirstMiscIndex;
gubNumPages = gubNumMiscPages;
break;
case IC_AMMO:
gusLastItemIndex = gusLastAmmoIndex ;
gusFirstItemIndex = gusFirstAmmoIndex;
gubNumPages = gubNumAmmoPages;
break;
case IC_ARMOUR:
gusLastItemIndex = gusLastArmourIndex;
gusFirstItemIndex = gusFirstArmourIndex;
gubNumPages = gubNumArmourPages;
break;
case BOBBYR_USED_ITEMS:
gusLastItemIndex = gusLastUsedIndex;
gusFirstItemIndex = gusFirstUsedIndex;
gubNumPages = gubNumUsedPages;
break;
default:
Assert(0);
break;
}
}
void CalculateFirstAndLastIndexs()
{
//Get the first and last gun index
SetFirstLastPagesForNew( IC_BOBBY_GUN, &gusFirstGunIndex, &gusLastGunIndex, &gubNumGunPages );
//Get the first and last misc index
SetFirstLastPagesForNew( IC_BOBBY_MISC, &gusFirstMiscIndex, &gusLastMiscIndex, &gubNumMiscPages );
//Get the first and last Ammo index
SetFirstLastPagesForNew( IC_AMMO, &gusFirstAmmoIndex, &gusLastAmmoIndex, &gubNumAmmoPages );
//Get the first and last Armour index
SetFirstLastPagesForNew( IC_ARMOUR, &gusFirstArmourIndex, &gusLastArmourIndex, &gubNumArmourPages );
//Get the first and last Used index
SetFirstLastPagesForUsed( &gusFirstUsedIndex, &gusLastUsedIndex, &gubNumUsedPages );
}
*/
//Loops through Bobby Rays Inventory to find the first and last index
void SetFirstLastPagesForNew( UINT32 uiClassMask )
{
UINT16 i;
INT16 sFirst = -1;
INT16 sLast = -1;
UINT16 ubPages=0;
UINT16 ubNumItems=0;
gubCurPage = 0;
//First loop through to get the first and last index indexs
for(i=0; i<MAXITEMS; i++)
{
if ( Item[i].usItemClass == 0 )
break;
//If we have some of the inventory on hand
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand != 0 )
{
if( Item[ LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex ].usItemClass & uiClassMask )
{
ubNumItems++;
if( sFirst == -1 )
sFirst = i;
sLast = i;
}
}
}
if( ubNumItems == 0 )
{
gusFirstItemIndex = BOBBYR_NO_ITEMS;
gusLastItemIndex = BOBBYR_NO_ITEMS;
gubNumPages = 0;
return;
}
gusFirstItemIndex = (UINT16)sFirst;
gusLastItemIndex = (UINT16)sLast;
gubNumPages = (UINT8)( ubNumItems / (FLOAT)BOBBYR_NUM_WEAPONS_ON_PAGE );
if( (ubNumItems % BOBBYR_NUM_WEAPONS_ON_PAGE ) != 0 )
gubNumPages += 1;
}
//Loops through Bobby Rays Used Inventory to find the first and last index
void SetFirstLastPagesForUsed()
{
UINT16 i;
INT16 sFirst = -1;
INT16 sLast = -1;
UINT16 ubPages=0;
UINT16 ubNumItems=0;
gubCurPage = 0;
//First loop through to get the first and last index indexs
for(i=0; i<MAXITEMS; i++)
{
if ( Item[i].usItemClass == 0 )
break;
//If we have some of the inventory on hand
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnHand != 0 )
{
ubNumItems++;
if( sFirst == -1 )
sFirst = i;
sLast = i;
}
}
if( sFirst == -1 )
{
gusFirstItemIndex = BOBBYR_NO_ITEMS;
gusLastItemIndex = BOBBYR_NO_ITEMS;
gubNumPages = 0;
return;
}
gusFirstItemIndex = (UINT16)sFirst;
gusLastItemIndex = (UINT16)sLast;
gubNumPages = (UINT8)( ubNumItems / (FLOAT)BOBBYR_NUM_WEAPONS_ON_PAGE );
if( (ubNumItems % BOBBYR_NUM_WEAPONS_ON_PAGE ) != 0 )
gubNumPages += 1;
}
void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNumbers )
{
UINT8 i;
CHAR16 zItemName[ SIZE_ITEM_NAME ];
UINT8 ubItemCount=0;
INT16 pStr[ 250 ];
if( gfBigImageMouseRegionCreated )
return;
for(i=0; i<ubCount; i++)
{
//Mouse region for the Big Item Image
MSYS_DefineRegion( &gSelectedBigImageRegion[ i ], BOBBYR_GRID_PIC_X, usPosY, (BOBBYR_GRID_PIC_X + BOBBYR_GRID_PIC_WIDTH), (UINT16)(usPosY + BOBBYR_GRID_PIC_HEIGHT), MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK, SelectBigImageRegionCallBack);
MSYS_AddRegion(&gSelectedBigImageRegion[ i ]);
MSYS_SetRegionUserData( &gSelectedBigImageRegion[ i ], 0, i);
//get item weight
FLOAT fWeight = GetWeightBasedOnMetricOption(Item[ pItemNumbers[ i ] ].ubWeight)/10;
switch( Item[ pItemNumbers[ i ] ].usItemClass )
{
case IC_GUN:
//Calculate AP's
//INT16 apStr[20];
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
//{
// INT16 apStr2[20];
// UINT8 ubAttackAPs = BaseAPsToShootOrStab( DEFAULT_APS, DEFAULT_AIMSKILL, pObject );
// swprintf( (wchar_t *)apStr, L"%d", ubAttackAPs );
// if (GetShotsPerBurst(pObject) > 0)
// {
// swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToBurst( DEFAULT_APS, pObject ) );
// wcscat( apStr, apStr2 );
// }
// else
// {
// wcscat( apStr, L" / -" );
// }
// if (GetAutofireShotsPerFiveAPs(pObject) > 0)
// {
// swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToAutofire( DEFAULT_APS, pObject, 3 ) );
// wcscat( apStr, apStr2 );
// }
// else
// {
// wcscat( apStr, L" / -" );
// }
//}
//else
//{
// swprintf( (wchar_t *)apStr, L"" );
//}
//Info for weapons
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
{
UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
swprintf( (wchar_t *)pStr, L"%s (%s)\n%s %d\n%s %d\n%s %d\n%s %s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
AmmoCaliber[ Weapon[ pItemNumbers[ i ] ].ubCalibre ],
gWeaponStatsDesc[ 9 ], //Accuracy String
Weapon[ pItemNumbers[ i ] ].bAccuracy, //Accuracy
gWeaponStatsDesc[ 11 ], //Damage String
gunDamage, //Gun damage
gWeaponStatsDesc[ 10 ], //Range String
Weapon[ pItemNumbers[ i ] ].usRange/10, //Gun Range
gWeaponStatsDesc[ 5 ], //AP String
//apStr, //AP's
L"- / - / -",
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
case IC_LAUNCHER:
//Calculate AP's
//INT16 apStr[20];
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
//{
// INT16 apStr2[20];
// UINT8 ubAttackAPs = BaseAPsToShootOrStab( DEFAULT_APS, DEFAULT_AIMSKILL, pObject );
// swprintf( (wchar_t *)apStr, L"%d", ubAttackAPs );
// if (GetShotsPerBurst(pObject) > 0)
// {
// swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToBurst( DEFAULT_APS, pObject ) );
// wcscat( apStr, apStr2 );
// }
// else
// {
// wcscat( apStr, L" / -" );
// }
// if (GetAutofireShotsPerFiveAPs(pObject) > 0)
// {
// swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToAutofire( DEFAULT_APS, pObject, 3 ) );
// wcscat( apStr, apStr2 );
// }
// else
// {
// wcscat( apStr, L" / -" );
// }
//}
//else
//{
// swprintf( (wchar_t *)apStr, L"" );
//}
//Info for weapons
//if ( Item[ pItemNumbers[ i ] ].usItemClass == IC_GUN )
{
UINT16 gunDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
swprintf( (wchar_t *)pStr, L"%s\n%s %d\n%s %d\n%s %d\n%s %s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
gWeaponStatsDesc[ 9 ], //Accuracy String
Weapon[ pItemNumbers[ i ] ].bAccuracy, //Accuracy
gWeaponStatsDesc[ 11 ], //Damage String
gunDamage, //Gun damage
gWeaponStatsDesc[ 10 ], //Range String
Weapon[ pItemNumbers[ i ] ].usRange/10, //Gun Range
gWeaponStatsDesc[ 5 ], //AP String
//apStr, //AP's
L"- / - / -",
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
case IC_BLADE:
case IC_THROWING_KNIFE:
case IC_PUNCH:
{
UINT16 meleeDamage = (UINT16)( Weapon[ pItemNumbers[ i ] ].ubImpact + ( (double) Weapon[ pItemNumbers[ i ] ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
swprintf( (wchar_t *)pStr, L"%s\n%s %d\n%s %s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
gWeaponStatsDesc[ 11 ], //Damage String
meleeDamage, //Melee damage
gWeaponStatsDesc[ 5 ], //AP String
//apStr, //AP's
L"-",
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
case IC_AMMO:
{
swprintf( (wchar_t *)pStr, L"%s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ], //Item long name
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
//Lal: do not delete, commented out for next version
//swprintf( (wchar_t *)pStr, L"%s %s %s %d [%d rnds]\n%s %1.1f %s",
// AmmoCaliber[ Magazine[ Item[usItem].ubClassIndex ].ubCalibre ], //Ammo calibre
// AmmoTypes[Magazine[ Item[usItem].ubClassIndex ].ubAmmoType].ammoName, //Ammo type
// MagNames[Magazine[ Item[usItem].ubClassIndex ].ubMagType], //Magazine type
// Magazine[ Item[usItem].ubClassIndex ].ubMagSize, //Magazine capacity
// pObject->ubShotsLeft[0], //Shots left
// gWeaponStatsDesc[ 12 ], //Weight String
// fWeight, //Weight
// GetWeightUnitString() //Weight units
// );
//specify the help text only if the items is ammo
//and only if the user has an item that can use the particular type of ammo
ubItemCount = CheckPlayersInventoryForGunMatchingGivenAmmoID( pItemNumbers[ i ] );
if( ubItemCount != 0 )
{
swprintf( zItemName, L"\n%s %d %s",BobbyRText[BOBBYR_GUNS_NUM_GUNS_THAT_USE_AMMO_1], ubItemCount, BobbyRText[BOBBYR_GUNS_NUM_GUNS_THAT_USE_AMMO_2] );
wcscat( (wchar_t *) pStr, zItemName );
}
}
break;
case IC_GRENADE:
case IC_BOMB:
// explosives
//if ( (Item[ pItemNumbers[ i ] ].usItemClass == IC_GRENADE)||(Item[ pItemNumbers[ i ] ].usItemClass == IC_BOMB) )
{
UINT16 explDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
UINT16 explStunDamage = (UINT16)( Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ pItemNumbers[ i ] ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
swprintf( (wchar_t *)pStr, L"%s\n%s %d\n%s %d\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ],
gWeaponStatsDesc[ 11 ], //Damage String
explDamage, //Expl damage
gWeaponStatsDesc[ 13 ], //Stun Damage String
explStunDamage, //Stun Damage
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
case IC_ARMOUR:
//Armor
//if (Item[ pItemNumbers[ i ] ].usItemClass == IC_ARMOUR)
{
INT32 iProtection = Armour[ Item[ pItemNumbers[ i ] ].ubClassIndex ].ubProtection;
switch( Armour[ Item[ pItemNumbers[ i ] ].ubClassIndex ].ubArmourClass )
{
case( ARMOURCLASS_HELMET ):
iProtection = 15 * iProtection / Armour[ Item[ SPECTRA_HELMET_18 ].ubClassIndex ].ubProtection;
break;
case( ARMOURCLASS_VEST ):
iProtection = 65 * iProtection / ( Armour[ Item[ SPECTRA_VEST_18 ].ubClassIndex ].ubProtection + Armour[ Item[ CERAMIC_PLATES ].ubClassIndex ].ubProtection );
break;
case( ARMOURCLASS_LEGGINGS ):
iProtection = 25 * iProtection / Armour[ Item[ SPECTRA_LEGGINGS_18 ].ubClassIndex ].ubProtection;
break;
case( ARMOURCLASS_PLATE ):
iProtection = 65 * iProtection / ( Armour[ Item[ CERAMIC_PLATES ].ubClassIndex ].ubProtection );
break;
}
swprintf( (wchar_t *)pStr, L"%s\n%s %d%% (%d)\n%s %d%%\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ], //Item long name
pInvPanelTitleStrings[ 4 ], //Protection string
iProtection, //Protection rating in % based on best armor
Armour[ Item[ pItemNumbers[ i ] ].ubClassIndex ].ubProtection, //Protection (raw data)
pInvPanelTitleStrings[ 3 ], //Camo string
Item[ pItemNumbers[ i ] ].camobonus, //Camo bonus
gWeaponStatsDesc[ 12 ], //Weight string
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
case IC_MISC:
case IC_MEDKIT:
case IC_KIT:
case IC_FACE:
default:
// The final, and typical case, is that of an item with a percent status
{
swprintf( (wchar_t *)pStr, L"%s\n%s %1.1f %s",
ItemNames[ pItemNumbers[ i ] ], //Item long name
gWeaponStatsDesc[ 12 ], //Weight String
fWeight, //Weight
GetWeightUnitString() //Weight units
);
}
break;
}
SetRegionFastHelpText( &gSelectedBigImageRegion[ i ], pStr );
SetRegionHelpEndCallback( &gSelectedBigImageRegion[ i ], BobbyrRGunsHelpTextDoneCallBack );
usPosY += BOBBYR_GRID_OFFSET;
}
gubNumItemsOnScreen = ubCount;
gfBigImageMouseRegionCreated = TRUE;
}
void DeleteMouseRegionForBigImage()
{
UINT8 i;
if( !gfBigImageMouseRegionCreated )
return;
for(i=0; i<gubNumItemsOnScreen; i++)
MSYS_RemoveRegion( &gSelectedBigImageRegion[i]);
gfBigImageMouseRegionCreated = FALSE;
gusOldItemNumOnTopOfPage = 65535;
gubNumItemsOnScreen = 0;
}
void SelectBigImageRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
if (iReason & MSYS_CALLBACK_REASON_INIT)
{
}
else if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
PurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum] );
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
{
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
UnPurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum] );
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
else if(iReason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT)
{
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
PurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum] );
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_REPEAT)
{
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
UnPurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum] );
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
}
void PurchaseBobbyRayItem(UINT16 usItemNumber)
{
UINT8 ubPurchaseNumber;
ubPurchaseNumber = CheckIfItemIsPurchased(usItemNumber);
//if we are in the used page
if( guiCurrentLaptopMode == LAPTOP_MODE_BOBBY_R_USED )
{
//if there is enough inventory in stock to cover the purchase
if( ubPurchaseNumber == BOBBY_RAY_NOT_PURCHASED || LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].ubQtyOnHand >= ( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased + 1) )
{
// If the item has not yet been purchased
if( ubPurchaseNumber == BOBBY_RAY_NOT_PURCHASED )
{
ubPurchaseNumber = GetNextPurchaseNumber();
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED )
{
BobbyRayPurchases[ ubPurchaseNumber ].usItemIndex = LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].usItemIndex;
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased = 1;
BobbyRayPurchases[ ubPurchaseNumber ].bItemQuality = LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].ubItemQuality;
BobbyRayPurchases[ ubPurchaseNumber ].usBobbyItemIndex = usItemNumber;
BobbyRayPurchases[ ubPurchaseNumber ].fUsed = TRUE;
}
else
{
//display error popup because the player is trying to purchase more thenn 10 items
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
}
}
// Else If the item is already purchased increment purchase amount. Only if ordering less then the max amount!
else
{
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased <= BOBBY_RAY_MAX_AMOUNT_OF_ITEMS_TO_PURCHASE)
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased++;
}
}
else
{
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, BobbyRText[ BOBBYR_MORE_NO_MORE_IN_STOCK ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
#ifdef JA2BETAVERSION
ReportBobbyROrderError( usItemNumber, ubPurchaseNumber, LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].ubQtyOnHand, BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased );
#endif
}
}
//else the player is on a any other page except the used page
else
{
//if there is enough inventory in stock to cover the purchase
if( ubPurchaseNumber == BOBBY_RAY_NOT_PURCHASED || LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].ubQtyOnHand >= ( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased + 1) )
{
// If the item has not yet been purchased
if( ubPurchaseNumber == BOBBY_RAY_NOT_PURCHASED )
{
ubPurchaseNumber = GetNextPurchaseNumber();
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED )
{
BobbyRayPurchases[ ubPurchaseNumber ].usItemIndex = LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].usItemIndex;
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased = 1;
BobbyRayPurchases[ ubPurchaseNumber ].bItemQuality = 100;
BobbyRayPurchases[ ubPurchaseNumber ].usBobbyItemIndex = usItemNumber;
BobbyRayPurchases[ ubPurchaseNumber ].fUsed = FALSE;
}
else
{
//display error popup because the player is trying to purchase more thenn 10 items
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
}
}
// Else If the item is already purchased increment purchase amount. Only if ordering less then the max amount!
else
{
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased <= BOBBY_RAY_MAX_AMOUNT_OF_ITEMS_TO_PURCHASE)
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased++;
}
}
else
{
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, BobbyRText[ BOBBYR_MORE_NO_MORE_IN_STOCK ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL);
#ifdef JA2BETAVERSION
ReportBobbyROrderError( usItemNumber, ubPurchaseNumber, LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].ubQtyOnHand, BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased );
#endif
}
}
}
// Checks to see if the clicked item is already bought or not.
UINT8 CheckIfItemIsPurchased(UINT16 usItemNumber)
{
UINT8 i;
for(i=0; i<MAX_PURCHASE_AMOUNT; i++)
{
if( ( usItemNumber == BobbyRayPurchases[i].usBobbyItemIndex ) && ( BobbyRayPurchases[i].ubNumberPurchased != 0 ) && ( BobbyRayPurchases[i].fUsed == gfOnUsedPage ) )
return(i);
}
return(BOBBY_RAY_NOT_PURCHASED);
}
UINT8 GetNextPurchaseNumber()
{
UINT8 i;
for(i=0; i<MAX_PURCHASE_AMOUNT; i++)
{
if( ( BobbyRayPurchases[i].usBobbyItemIndex == 0) && ( BobbyRayPurchases[i].ubNumberPurchased == 0 ) )
return(i);
}
return(BOBBY_RAY_NOT_PURCHASED);
}
void UnPurchaseBobbyRayItem(UINT16 usItemNumber)
{
UINT8 ubPurchaseNumber;
ubPurchaseNumber = CheckIfItemIsPurchased(usItemNumber);
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED )
{
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased > 1)
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased--;
else
{
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased = 0;
BobbyRayPurchases[ ubPurchaseNumber ].usBobbyItemIndex = 0;
}
}
}
void BtnBobbyROrderFormCallback(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 )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
guiCurrentLaptopMode = LAPTOP_MODE_BOBBY_R_MAILORDER;
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 BtnBobbyRHomeButtonCallback(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 )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
guiCurrentLaptopMode = LAPTOP_MODE_BOBBY_R;
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 UpdateButtonText(UINT32 uiCurPage)
{
switch( uiCurPage )
{
case LAPTOP_MODE_BOBBY_R_GUNS:
DisableButton( guiBobbyRPageMenu[0] );
break;
case LAPTOP_MODE_BOBBY_R_AMMO:
DisableButton( guiBobbyRPageMenu[1] );
break;
case LAPTOP_MODE_BOBBY_R_ARMOR:
DisableButton( guiBobbyRPageMenu[2] );
break;
case LAPTOP_MODE_BOBBY_R_MISC:
DisableButton( guiBobbyRPageMenu[3] );
break;
case LAPTOP_MODE_BOBBY_R_USED:
DisableButton( guiBobbyRPageMenu[4] );
break;
}
}
UINT16 CalcBobbyRayCost( UINT16 usIndex, UINT16 usBobbyIndex, BOOLEAN fUsed)
{
DOUBLE value;
if( fUsed )
value = Item[ LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].usItemIndex ].usPrice *
( .5 + .5 * ( LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].ubItemQuality ) / 100 ) + .5;
else
value = Item[ LaptopSaveInfo.BobbyRayInventory[ usBobbyIndex ].usItemIndex ].usPrice;
return( (UINT16) value);
}
UINT32 CalculateTotalPurchasePrice()
{
UINT16 i;
UINT32 uiTotal = 0;
for(i=0; i<MAX_PURCHASE_AMOUNT; i++)
{
//if the item was purchased
if( BobbyRayPurchases[ i ].ubNumberPurchased )
{
uiTotal += CalcBobbyRayCost( BobbyRayPurchases[ i ].usItemIndex, BobbyRayPurchases[ i ].usBobbyItemIndex, BobbyRayPurchases[ i ].fUsed ) * BobbyRayPurchases[ i ].ubNumberPurchased;
}
}
return(uiTotal);
}
void DisableBobbyRButtons()
{
//if it is the last page, disable the next page button
if( gubNumPages == 0 )
DisableButton( guiBobbyRNextPage );
else
{
if( gubCurPage >= gubNumPages-1 )
DisableButton( guiBobbyRNextPage );
else
EnableButton( guiBobbyRNextPage );
}
// if it is the first page, disable the prev page buitton
if( gubCurPage == 0 )
DisableButton( guiBobbyRPreviousPage );
else
EnableButton( guiBobbyRPreviousPage );
/*
//if it is the last page, disable the next page button
if( !(gusCurWeaponIndex < (gusLastItemIndex - BOBBYR_NUM_WEAPONS_ON_PAGE) ) )
DisableButton( guiBobbyRNextPage );
else
EnableButton( guiBobbyRNextPage );
// if it is the first page, disable the prev page buitton
if( (gusCurWeaponIndex == gusFirstItemIndex ) )
DisableButton( guiBobbyRPreviousPage );
else
EnableButton( guiBobbyRPreviousPage );
*/
}
void CalcFirstIndexForPage( STORE_INVENTORY *pInv, UINT32 uiItemClass )
{
UINT16 i;
UINT16 usNumItems=0;
//Reset the Current weapon Index
gusCurWeaponIndex = 0;
if( uiItemClass == BOBBYR_USED_ITEMS )
{
//Get to the first index on the page
for(i=gusFirstItemIndex; i<=gusLastItemIndex; i++)
{
//If we have some of the inventory on hand
if( pInv[ i ].ubQtyOnHand != 0 )
{
if( gubCurPage == 0 )
{
gusCurWeaponIndex = i;
break;
}
if( usNumItems <= ( gubCurPage * 4 ) )
gusCurWeaponIndex = i;
usNumItems++;
}
}
}
else
{
//Get to the first index on the page
for(i=gusFirstItemIndex; i<=gusLastItemIndex; i++)
{
if( Item[ pInv[ i ].usItemIndex ].usItemClass & uiItemClass )
{
//If we have some of the inventory on hand
if( pInv[ i ].ubQtyOnHand != 0 )
{
if( gubCurPage == 0 )
{
gusCurWeaponIndex = i;
break;
}
if( usNumItems <= ( gubCurPage * 4 ) )
gusCurWeaponIndex = i;
usNumItems++;
}
}
}
}
}
void OutOfStockMessageBoxCallBack( UINT8 bExitValue )
{
// yes, load the game
if( bExitValue == MSG_BOX_RETURN_OK )
{
// guiCurrentLaptopMode = LAPTOP_MODE_BOBBY_R;
}
}
UINT8 CheckPlayersInventoryForGunMatchingGivenAmmoID( INT16 sItemID )
{
UINT8 ubItemCount=0;
UINT8 ubMercCount;
UINT8 ubPocketCount;
UINT8 ubFirstID = gTacticalStatus.Team[ OUR_TEAM ].bFirstID;
UINT8 ubLastID = gTacticalStatus.Team[ OUR_TEAM ].bLastID;
//loop through all the mercs on the team
for( ubMercCount = ubFirstID; ubMercCount <= ubLastID; ubMercCount++ )
{
if( Menptr[ ubMercCount ].bActive )
{
//loop through all the pockets on the merc
for( ubPocketCount=0; ubPocketCount<NUM_INV_SLOTS; ubPocketCount++)
{
//if there is a weapon here
if( Item[ Menptr[ ubMercCount ].inv[ ubPocketCount ].usItem ].usItemClass == IC_GUN )
{
//if the weapon uses the same kind of ammo as the one passed in, return true
if( Weapon[ Menptr[ ubMercCount ].inv[ ubPocketCount ].usItem ].ubCalibre == Magazine[ Item[ sItemID ].ubClassIndex ].ubCalibre )
{
ubItemCount++;
}
}
}
}
}
return( ubItemCount );
}
void BobbyrRGunsHelpTextDoneCallBack( void )
{
fReDrawScreenFlag = TRUE;
fPausedReDrawScreenFlag = TRUE;
}
#ifdef JA2BETAVERSION
void ReportBobbyROrderError( UINT16 usItemNumber, UINT8 ubPurchaseNum, UINT8 ubQtyOnHand, UINT8 ubNumPurchasing )
{
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("**** Bobby Rays Ordering Error ****" ) );
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("usItemNumber = %d", usItemNumber ) );
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ubPurchaseNum = %d", ubPurchaseNum ) );
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ubQtyOnHand = %d", ubQtyOnHand ) );
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ubNumPurchasing = %d", ubNumPurchasing ) );
}
#endif