mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7600 3b4a5df2-a311-0410-b5c6-a8a6f20db521
4347 lines
137 KiB
C++
4347 lines
137 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 "Overhead.h"
|
|
#include "Weapons.h"
|
|
#include "GameSettings.h"
|
|
#include "Points.h"
|
|
#include "Multi Language Graphic Utils.h"
|
|
#include "english.h"
|
|
// HEADROCK HAM 4
|
|
#include "input.h"
|
|
#include "Encyclopedia_new.h" //update encyclopedia item visibility when viewing that item
|
|
#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_DESC_TEXT_COLOR_ALT FONT_GRAY1
|
|
#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 + 300 //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 + 300
|
|
#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
|
|
|
|
#ifdef CHINESE
|
|
#define BOBBYR_ITEMS_BOUGHT_X BOBBYR_GRIDLOC_X + 105 - BOBBYR_ORDER_NUM_WIDTH - 10 //BOBBYR_ITEM_QTY_NUM_X
|
|
#else
|
|
#define BOBBYR_ITEMS_BOUGHT_X BOBBYR_GRIDLOC_X + 105 - BOBBYR_ORDER_NUM_WIDTH//BOBBYR_ITEM_QTY_NUM_X
|
|
#endif
|
|
|
|
#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 + 470//490
|
|
#define BOBBYR_ORDER_SUBTOTAL_Y BOBBYR_ORDER_FORM_Y+2//BOBBYR_HOME_BUTTON_Y
|
|
|
|
#define BOBBYR_ORDER_PAGE_X iScreenWidthOffset + 285
|
|
#define BOBBYR_ORDER_PAGE_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[ 100 ];
|
|
|
|
//BobbyRayOrderStruct *BobbyRayOrdersOnDeliveryArray=NULL;
|
|
//UINT8 usNumberOfBobbyRayOrderItems = 0;
|
|
//UINT8 usNumberOfBobbyRayOrderUsed = 0;
|
|
|
|
#define FILTER_BUTTONS_GUN_START_X BOBBYR_PREVIOUS_BUTTON_X
|
|
#define FILTER_BUTTONS_AMMO_START_X FILTER_BUTTONS_GUN_START_X
|
|
#define FILTER_BUTTONS_USED_START_X FILTER_BUTTONS_GUN_START_X //FILTER_BUTTONS_GUN_START_X + 122
|
|
#define FILTER_BUTTONS_ARMOUR_START_X FILTER_BUTTONS_GUN_START_X
|
|
#define FILTER_BUTTONS_MISC_START_X FILTER_BUTTONS_GUN_START_X
|
|
#define FILTER_BUTTONS_Y_OFFSET 22 //Madd: added to standardize this value, and decreased slightly from 25 to make more room
|
|
#define FILTER_BUTTONS_Y BOBBYR_PREVIOUS_BUTTON_Y + FILTER_BUTTONS_Y_OFFSET
|
|
|
|
// The number of filter buttons which category uses
|
|
#define NUMBER_GUNS_FILTER_BUTTONS 9
|
|
#define NUMBER_AMMO_FILTER_BUTTONS 8
|
|
#define NUMBER_ARMOUR_FILTER_BUTTONS 4
|
|
#define NUMBER_MISC_FILTER_BUTTONS 16 // Madd: Increased to 16 for new categories
|
|
#define NUMBER_USED_FILTER_BUTTONS 4
|
|
|
|
#define BOBBYR_GUNS_FILTER_BUTTON_GAP BOBBYR_CATALOGUE_BUTTON_GAP - 1
|
|
#define BOBBYR_AMMO_FILTER_BUTTON_GAP BOBBYR_CATALOGUE_BUTTON_GAP - 1
|
|
#define BOBBYR_USED_FILTER_BUTTON_GAP BOBBYR_CATALOGUE_BUTTON_GAP - 1
|
|
#define BOBBYR_ARMOUR_FILTER_BUTTON_GAP BOBBYR_CATALOGUE_BUTTON_GAP - 1
|
|
#define BOBBYR_MISC_FILTER_BUTTON_GAP BOBBYR_CATALOGUE_BUTTON_GAP - 1
|
|
|
|
//Madd: new BR filters
|
|
#define BR_MISC_FILTER_OPTICS (AC_SCOPE | AC_SIGHT | AC_IRONSIGHT)
|
|
#define BR_MISC_FILTER_SIDE_BOTTOM (AC_LASER | AC_FOREGRIP | AC_BIPOD)
|
|
#define BR_MISC_FILTER_MUZZLE (AC_MUZZLE | AC_EXTENDER)
|
|
#define BR_MISC_FILTER_STOCK AC_STOCK
|
|
#define BR_MISC_FILTER_INTERNAL (AC_MAGWELL | AC_INTERNAL | AC_EXTERNAL)
|
|
#define BR_MISC_FILTER_STD_ATTACHMENTS (BR_MISC_FILTER_OPTICS | BR_MISC_FILTER_SIDE_BOTTOM | BR_MISC_FILTER_MUZZLE | BR_MISC_FILTER_STOCK | BR_MISC_FILTER_INTERNAL)
|
|
#define BR_MISC_FILTER_OTHER_ATTACHMENTS AC_SLING
|
|
#define BR_MISC_FILTER_NO_ATTACHMENTS 0
|
|
|
|
|
|
UINT32 guiBobbyRFilterGuns[ NUMBER_GUNS_FILTER_BUTTONS ];
|
|
UINT32 guiBobbyRFilterAmmo[ NUMBER_AMMO_FILTER_BUTTONS ];
|
|
UINT32 guiBobbyRFilterArmour[ NUMBER_ARMOUR_FILTER_BUTTONS ];
|
|
UINT32 guiBobbyRFilterMisc[ NUMBER_MISC_FILTER_BUTTONS ];
|
|
UINT32 guiBobbyRFilterUsed[ NUMBER_USED_FILTER_BUTTONS ];
|
|
|
|
INT32 guiBobbyRFilterImage;
|
|
|
|
void BtnBobbyRFilterGunsCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void BtnBobbyRFilterAmmoCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void BtnBobbyRFilterUsedCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void BtnBobbyRFilterArmourCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void BtnBobbyRFilterMiscCallback(GUI_BUTTON *btn,INT32 reason);
|
|
|
|
BOOLEAN IsAmmoMatchinWeaponType(UINT16 usItemIndex, UINT8 ubWeaponType);
|
|
|
|
INT8 ubFilterGunsButtonValues[] = {
|
|
BOBBYR_FILTER_GUNS_PISTOL,
|
|
BOBBYR_FILTER_GUNS_M_PISTOL,
|
|
BOBBYR_FILTER_GUNS_SMG,
|
|
BOBBYR_FILTER_GUNS_RIFLE,
|
|
BOBBYR_FILTER_GUNS_SN_RIFLE,
|
|
BOBBYR_FILTER_GUNS_AS_RIFLE,
|
|
BOBBYR_FILTER_GUNS_LMG,
|
|
BOBBYR_FILTER_GUNS_SHOTGUN,
|
|
BOBBYR_FILTER_GUNS_HEAVY};
|
|
|
|
INT8 ubFilterAmmoButtonValues[] = {
|
|
BOBBYR_FILTER_AMMO_PISTOL,
|
|
BOBBYR_FILTER_AMMO_M_PISTOL,
|
|
BOBBYR_FILTER_AMMO_SMG,
|
|
BOBBYR_FILTER_AMMO_RIFLE,
|
|
BOBBYR_FILTER_AMMO_SN_RIFLE,
|
|
BOBBYR_FILTER_AMMO_AS_RIFLE,
|
|
BOBBYR_FILTER_AMMO_LMG,
|
|
BOBBYR_FILTER_AMMO_SHOTGUN};
|
|
|
|
INT8 ubFilterUsedButtonValues[] = {
|
|
BOBBYR_FILTER_USED_GUNS,
|
|
BOBBYR_FILTER_USED_ARMOR,
|
|
BOBBYR_FILTER_USED_LBEGEAR,
|
|
BOBBYR_FILTER_USED_MISC};
|
|
|
|
INT8 ubFilterArmourButtonValues[] = {
|
|
BOBBYR_FILTER_ARMOUR_HELM,
|
|
BOBBYR_FILTER_ARMOUR_VEST,
|
|
BOBBYR_FILTER_ARMOUR_LEGGING,
|
|
BOBBYR_FILTER_ARMOUR_PLATE};
|
|
|
|
INT8 ubFilterMiscButtonValues[] = {
|
|
BOBBYR_FILTER_MISC_BLADE,
|
|
BOBBYR_FILTER_MISC_THROWING_KNIFE,
|
|
BOBBYR_FILTER_MISC_PUNCH,
|
|
BOBBYR_FILTER_MISC_GRENADE,
|
|
BOBBYR_FILTER_MISC_BOMB,
|
|
BOBBYR_FILTER_MISC_MEDKIT,
|
|
BOBBYR_FILTER_MISC_KIT,
|
|
BOBBYR_FILTER_MISC_FACE,
|
|
BOBBYR_FILTER_MISC_LBEGEAR,
|
|
BOBBYR_FILTER_MISC_OPTICS_ATTACHMENTS, // Madd: new BR filters
|
|
BOBBYR_FILTER_MISC_SIDE_AND_BOTTOM_ATTACHMENTS,
|
|
BOBBYR_FILTER_MISC_MUZZLE_ATTACHMENTS,
|
|
BOBBYR_FILTER_MISC_STOCK_ATTACHMENTS,
|
|
BOBBYR_FILTER_MISC_INTERNAL_ATTACHMENTS,
|
|
BOBBYR_FILTER_MISC_OTHER_ATTACHMENTS,
|
|
BOBBYR_FILTER_MISC_MISC};
|
|
|
|
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;
|
|
UINT8 gubNumPagesMod;
|
|
|
|
|
|
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 DisplayGrenadeBombInfo(UINT16 usIndex, UINT16 usTextPosY, 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 DisplayGunAP(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayMeleeAP(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);
|
|
// CHRISL: New display function for LBE Gear
|
|
UINT16 DisplayLBEInfo(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayWeight(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayCaliber(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayExplosiveDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayExplosiveStunDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayProtection(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
UINT16 DisplayCamo(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight);
|
|
void CreateMouseRegionForBigImage(UINT16 usPosY, UINT8 ubCount, INT16 *pItemNumbers );
|
|
// HEADROCK HAM 4: Now can purchase ALL items available.
|
|
void PurchaseBobbyRayItem(UINT16 usItemNumber, BOOLEAN fAllItems );
|
|
UINT8 CheckIfItemIsPurchased(UINT16 usItemNumber);
|
|
UINT8 GetNextPurchaseNumber();
|
|
// HEADROCK HAM 4: Now can purchase ALL items available.
|
|
void UnPurchaseBobbyRayItem(UINT16 usItemNumber, BOOLEAN fAllItems );
|
|
UINT32 CalculateTotalPurchasePrice();
|
|
void DisableBobbyRButtons();
|
|
void CalcFirstIndexForPage( STORE_INVENTORY *pInv, UINT32 uiItemClass );
|
|
void OutOfStockMessageBoxCallBack( UINT8 bExitValue );
|
|
UINT8 CheckPlayersInventoryForGunMatchingGivenAmmoID( INT16 sItemID );
|
|
void BobbyrRGunsHelpTextDoneCallBack( void );
|
|
|
|
//Buggler: Seperated function for easy code reuse
|
|
void GetHelpTextForItemInLaptop( STR16 pzStr, UINT16 usItemNumber );
|
|
|
|
#ifdef JA2BETAVERSION
|
|
void ReportBobbyROrderError( UINT16 usItemNumber, UINT8 ubPurchaseNum, UINT8 ubQtyOnHand, UINT8 ubNumPurchasing );
|
|
#endif
|
|
|
|
//Hotkey Assignment
|
|
void HandleBobbyRGunsKeyBoardInput();
|
|
|
|
void GameInitBobbyRGuns()
|
|
{
|
|
guiTempCurrentMode=0;
|
|
|
|
guiPrevGunFilterMode = -1;
|
|
guiPrevAmmoFilterMode = -1;
|
|
guiPrevUsedFilterMode = -1;
|
|
guiPrevArmourFilterMode = -1;
|
|
guiPrevMiscFilterMode = -1;
|
|
|
|
guiCurrentGunFilterMode = -1;
|
|
guiCurrentAmmoFilterMode = -1;
|
|
guiCurrentUsedFilterMode = -1;
|
|
guiCurrentArmourFilterMode = -1;
|
|
guiCurrentMiscFilterMode = -1;
|
|
guiCurrentMiscSubFilterMode = -1;
|
|
|
|
memset(&BobbyRayPurchases, 0, gGameExternalOptions.ubBobbyRayMaxPurchaseAmount);
|
|
}
|
|
|
|
void EnterInitBobbyRGuns()
|
|
{
|
|
guiTempCurrentMode=0;
|
|
|
|
memset(&BobbyRayPurchases, 0, gGameExternalOptions.ubBobbyRayMaxPurchaseAmount);
|
|
}
|
|
|
|
|
|
|
|
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();
|
|
|
|
guiPrevGunFilterMode = -1;
|
|
guiCurrentGunFilterMode = -1;
|
|
|
|
// Search for all guns. Take NOT_GUN for all guns
|
|
SetFirstLastPagesForNew( IC_BOBBY_GUN, guiCurrentGunFilterMode );
|
|
|
|
//Draw menu bar
|
|
InitBobbyMenuBar();
|
|
InitBobbyRGunsFilterBar();
|
|
|
|
// render once
|
|
RenderBobbyRGuns( );
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
void ExitBobbyRGuns()
|
|
{
|
|
DeleteVideoObjectFromIndex(guiGunBackground);
|
|
DeleteVideoObjectFromIndex(guiGunsGrid);
|
|
DeleteBobbyBrTitle();
|
|
DeleteBobbyMenuBar();
|
|
|
|
DeleteBobbyRGunsFilter();
|
|
|
|
DeleteMouseRegionForBigImage();
|
|
|
|
giCurrentSubPage = gusCurWeaponIndex;
|
|
guiLastBobbyRayPage = LAPTOP_MODE_BOBBY_R_GUNS;
|
|
}
|
|
|
|
void HandleBobbyRGuns()
|
|
{
|
|
//Hotkey Assignment
|
|
HandleBobbyRGunsKeyBoardInput();
|
|
}
|
|
|
|
void RenderBobbyRGuns()
|
|
{
|
|
HVOBJECT hPixHandle;
|
|
|
|
WebPageTileBackground(BOBBYR_NUM_HORIZONTAL_TILES, BOBBYR_NUM_VERTICAL_TILES, BOBBYR_BACKGROUND_WIDTH, BOBBYR_BACKGROUND_HEIGHT, guiGunBackground);
|
|
|
|
// WANNE: Do not display the title
|
|
//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);
|
|
|
|
DisplayItemInfo( IC_BOBBY_GUN, guiCurrentGunFilterMode );
|
|
UpdateButtonText(guiCurrentLaptopMode);
|
|
UpdateGunFilterButtons();
|
|
|
|
MarkButtonsDirty( );
|
|
RenderWWWProgramTitleBar( );
|
|
//InvalidateRegion(0,0,SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
|
|
//Moa removed below. See comment above LAPTOP_SCREEN_UL_X in laptop.h
|
|
// 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;
|
|
GetMLGFilename( VObjectDesc.ImageFile, MLG_BR );
|
|
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 InitBobbyRGunsFilterBar()
|
|
{
|
|
UINT8 i;
|
|
UINT16 usPosX;
|
|
UINT8 bCurMode;
|
|
UINT16 usYOffset = 0;
|
|
|
|
bCurMode = 0;
|
|
usPosX = FILTER_BUTTONS_GUN_START_X;
|
|
|
|
guiBobbyRFilterImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
|
|
|
|
// Loop through the filter buttons
|
|
for(i=0; i<NUMBER_GUNS_FILTER_BUTTONS; i++)
|
|
{
|
|
// Next row
|
|
if (i > 7)
|
|
{
|
|
usPosX = FILTER_BUTTONS_GUN_START_X;
|
|
usYOffset = FILTER_BUTTONS_Y_OFFSET;
|
|
}
|
|
|
|
// Filter buttons
|
|
guiBobbyRFilterGuns[i] = CreateIconAndTextButton( guiBobbyRFilterImage, BobbyRFilter[BOBBYR_FILTER_GUNS_PISTOL+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, FILTER_BUTTONS_Y + usYOffset, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnBobbyRFilterGunsCallback);
|
|
|
|
SetButtonCursor(guiBobbyRFilterGuns[i], CURSOR_LAPTOP_SCREEN);
|
|
|
|
MSYS_SetBtnUserData( guiBobbyRFilterGuns[i], 0, ubFilterGunsButtonValues[bCurMode]);
|
|
|
|
usPosX += BOBBYR_GUNS_FILTER_BUTTON_GAP;
|
|
bCurMode++;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOLEAN InitBobbyRAmmoFilterBar()
|
|
{
|
|
UINT8 i;
|
|
UINT16 usPosX;
|
|
UINT8 bCurMode;
|
|
UINT16 usYOffset = 0;
|
|
|
|
|
|
bCurMode = 0;
|
|
usPosX = FILTER_BUTTONS_AMMO_START_X;
|
|
|
|
guiBobbyRFilterImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
|
|
|
|
// Loop through the filter buttons
|
|
for(i=0; i<NUMBER_AMMO_FILTER_BUTTONS; i++)
|
|
{
|
|
// Next row
|
|
if (i > 7)
|
|
{
|
|
usPosX = FILTER_BUTTONS_AMMO_START_X;
|
|
usYOffset = FILTER_BUTTONS_Y_OFFSET;
|
|
}
|
|
|
|
// Filter buttons
|
|
guiBobbyRFilterAmmo[i] = CreateIconAndTextButton( guiBobbyRFilterImage, BobbyRFilter[BOBBYR_FILTER_AMMO_PISTOL+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, FILTER_BUTTONS_Y + usYOffset, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnBobbyRFilterAmmoCallback);
|
|
|
|
SetButtonCursor(guiBobbyRFilterAmmo[i], CURSOR_LAPTOP_SCREEN);
|
|
|
|
MSYS_SetBtnUserData( guiBobbyRFilterAmmo[i], 0, ubFilterAmmoButtonValues[bCurMode]);
|
|
|
|
usPosX += BOBBYR_AMMO_FILTER_BUTTON_GAP;
|
|
bCurMode++;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOLEAN InitBobbyRArmourFilterBar()
|
|
{
|
|
UINT8 i;
|
|
UINT16 usPosX;
|
|
UINT8 bCurMode;
|
|
UINT16 usYOffset = 0;
|
|
|
|
bCurMode = 0;
|
|
usPosX = FILTER_BUTTONS_GUN_START_X;
|
|
|
|
guiBobbyRFilterImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
|
|
|
|
// Loop through the filter buttons
|
|
for(i=0; i<NUMBER_ARMOUR_FILTER_BUTTONS; i++)
|
|
{
|
|
// Next row
|
|
if (i > 7)
|
|
{
|
|
usPosX = FILTER_BUTTONS_ARMOUR_START_X;
|
|
usYOffset = FILTER_BUTTONS_Y_OFFSET;
|
|
}
|
|
|
|
// Filter buttons
|
|
guiBobbyRFilterArmour[i] = CreateIconAndTextButton( guiBobbyRFilterImage, BobbyRFilter[BOBBYR_FILTER_ARMOUR_HELM+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, FILTER_BUTTONS_Y + usYOffset, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnBobbyRFilterArmourCallback);
|
|
|
|
SetButtonCursor(guiBobbyRFilterArmour[i], CURSOR_LAPTOP_SCREEN);
|
|
|
|
MSYS_SetBtnUserData( guiBobbyRFilterArmour[i], 0, ubFilterArmourButtonValues[bCurMode]);
|
|
|
|
usPosX += BOBBYR_ARMOUR_FILTER_BUTTON_GAP;
|
|
bCurMode++;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN InitBobbyRUsedFilterBar()
|
|
{
|
|
UINT8 i;
|
|
UINT16 usPosX;
|
|
|
|
usPosX = FILTER_BUTTONS_USED_START_X;
|
|
|
|
guiBobbyRFilterImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
|
|
|
|
// Loop through the filter buttons
|
|
for(i=0; i<NUMBER_USED_FILTER_BUTTONS; i++)
|
|
{
|
|
//CHRISL: Don't display the LBEGEAR button if we're using the old inventory system
|
|
if((UsingNewInventorySystem() == false) && ubFilterUsedButtonValues[i] == BOBBYR_FILTER_USED_LBEGEAR)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Filter buttons
|
|
guiBobbyRFilterUsed[i] = CreateIconAndTextButton( guiBobbyRFilterImage, BobbyRFilter[BOBBYR_FILTER_USED_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, FILTER_BUTTONS_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnBobbyRFilterUsedCallback);
|
|
|
|
SetButtonCursor(guiBobbyRFilterUsed[i], CURSOR_LAPTOP_SCREEN);
|
|
|
|
MSYS_SetBtnUserData( guiBobbyRFilterUsed[i], 0, ubFilterUsedButtonValues[i]);
|
|
|
|
usPosX += BOBBYR_USED_FILTER_BUTTON_GAP;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOLEAN InitBobbyRMiscFilterBar()
|
|
{
|
|
UINT8 i;
|
|
UINT16 usPosX = 0, usPosY = 0;
|
|
UINT8 bCurMode;
|
|
UINT16 usYOffset = FILTER_BUTTONS_Y_OFFSET - 2, sItemWidth = 8; //Madd: reduced Y offset to 20 to make more room
|
|
UINT16 usXOffset = BOBBYR_MISC_FILTER_BUTTON_GAP;
|
|
|
|
bCurMode = 0;
|
|
usPosX = FILTER_BUTTONS_MISC_START_X;
|
|
|
|
guiBobbyRFilterImage = LoadButtonImage("LAPTOP\\CatalogueButton1.sti", -1,0,-1,1,-1 );
|
|
|
|
// Loop through the filter buttons
|
|
for(i=0; i<NUMBER_MISC_FILTER_BUTTONS; i++)
|
|
{
|
|
//CHRISL: Don't display the LBEGEAR button if we're using the old inventory system
|
|
if((UsingNewInventorySystem() == false) && ubFilterMiscButtonValues[i] == BOBBYR_FILTER_MISC_LBEGEAR)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
|
|
usPosX = FILTER_BUTTONS_MISC_START_X + ( (bCurMode % sItemWidth) * usXOffset);
|
|
usPosY = FILTER_BUTTONS_Y + ( (bCurMode / sItemWidth) * usYOffset);
|
|
|
|
// Filter buttons
|
|
guiBobbyRFilterMisc[i] = CreateIconAndTextButton( guiBobbyRFilterImage, BobbyRFilter[BOBBYR_FILTER_MISC_BLADE+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, usPosY, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
|
DEFAULT_MOVE_CALLBACK, BtnBobbyRFilterMiscCallback);
|
|
|
|
SetButtonCursor(guiBobbyRFilterMisc[i], CURSOR_LAPTOP_SCREEN);
|
|
|
|
MSYS_SetBtnUserData( guiBobbyRFilterMisc[i], 0, ubFilterMiscButtonValues[i]);
|
|
bCurMode++;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
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 DeleteBobbyRGunsFilter()
|
|
{
|
|
UINT8 i;
|
|
|
|
UnloadButtonImage( guiBobbyRFilterImage );
|
|
|
|
for (i=0; i<NUMBER_GUNS_FILTER_BUTTONS; i++)
|
|
{
|
|
if(guiBobbyRFilterGuns[i])
|
|
RemoveButton (guiBobbyRFilterGuns[i]);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOLEAN DeleteBobbyRAmmoFilter()
|
|
{
|
|
UINT8 i;
|
|
|
|
UnloadButtonImage( guiBobbyRFilterImage );
|
|
|
|
for (i=0; i<NUMBER_AMMO_FILTER_BUTTONS; i++)
|
|
{
|
|
if(guiBobbyRFilterAmmo[i])
|
|
RemoveButton (guiBobbyRFilterAmmo[i]);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOLEAN DeleteBobbyRUsedFilter()
|
|
{
|
|
UINT8 i;
|
|
|
|
UnloadButtonImage( guiBobbyRFilterImage );
|
|
|
|
for (i=0; i<NUMBER_USED_FILTER_BUTTONS; i++)
|
|
{
|
|
if(guiBobbyRFilterUsed[i])
|
|
RemoveButton (guiBobbyRFilterUsed[i]);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOLEAN DeleteBobbyRArmourFilter()
|
|
{
|
|
UINT8 i;
|
|
|
|
UnloadButtonImage( guiBobbyRFilterImage );
|
|
|
|
for (i=0; i<NUMBER_ARMOUR_FILTER_BUTTONS; i++)
|
|
{
|
|
if(guiBobbyRFilterArmour[i])
|
|
RemoveButton (guiBobbyRFilterArmour[i]);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOLEAN DeleteBobbyRMiscFilter()
|
|
{
|
|
UINT8 i;
|
|
|
|
UnloadButtonImage( guiBobbyRFilterImage );
|
|
|
|
for (i=0; i<NUMBER_MISC_FILTER_BUTTONS; i++)
|
|
{
|
|
if(guiBobbyRFilterMisc[i])
|
|
RemoveButton (guiBobbyRFilterMisc[i]);
|
|
}
|
|
|
|
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++)
|
|
{
|
|
if(guiBobbyRPageMenu[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;
|
|
|
|
//gbMessageDisplayed = TRUE;
|
|
|
|
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);
|
|
|
|
// Set the new category button
|
|
guiCurrentLaptopMode = bNewValue;
|
|
|
|
// Set no Filter!
|
|
switch (bNewValue)
|
|
{
|
|
case LAPTOP_MODE_BOBBY_R_GUNS:
|
|
guiPrevGunFilterMode = guiCurrentGunFilterMode;
|
|
guiCurrentGunFilterMode = -1;
|
|
UpdateGunFilterButtons();
|
|
SetFirstLastPagesForNew(IC_BOBBY_GUN, guiCurrentGunFilterMode);
|
|
break;
|
|
case LAPTOP_MODE_BOBBY_R_AMMO:
|
|
guiPrevAmmoFilterMode = guiCurrentAmmoFilterMode;
|
|
guiCurrentAmmoFilterMode = -1;
|
|
UpdateAmmoFilterButtons();
|
|
SetFirstLastPagesForNew(IC_AMMO, guiCurrentAmmoFilterMode);
|
|
break;
|
|
case LAPTOP_MODE_BOBBY_R_ARMOR:
|
|
guiPrevArmourFilterMode = guiCurrentArmourFilterMode;
|
|
guiCurrentArmourFilterMode = -1;
|
|
UpdateArmourFilterButtons();
|
|
SetFirstLastPagesForNew(IC_ARMOUR, guiCurrentArmourFilterMode);
|
|
break;
|
|
case LAPTOP_MODE_BOBBY_R_MISC:
|
|
guiPrevMiscFilterMode = guiCurrentMiscFilterMode;
|
|
guiPrevMiscSubFilterMode = guiCurrentMiscSubFilterMode;
|
|
guiCurrentMiscFilterMode = -1;
|
|
guiCurrentMiscSubFilterMode = -1;
|
|
UpdateMiscFilterButtons();
|
|
SetFirstLastPagesForNew(IC_BOBBY_MISC, guiCurrentMiscFilterMode, guiCurrentMiscSubFilterMode);
|
|
break;
|
|
case LAPTOP_MODE_BOBBY_R_USED:
|
|
guiPrevUsedFilterMode = guiCurrentUsedFilterMode;
|
|
guiCurrentUsedFilterMode = -1;
|
|
|
|
UpdateUsedFilterButtons();
|
|
|
|
SetFirstLastPagesForUsed(guiCurrentUsedFilterMode);
|
|
break;
|
|
}
|
|
}
|
|
|
|
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 BtnBobbyRFilterGunsCallback(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;
|
|
|
|
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 );
|
|
|
|
guiPrevGunFilterMode = guiCurrentGunFilterMode;
|
|
|
|
switch (bNewValue)
|
|
{
|
|
case BOBBYR_FILTER_GUNS_PISTOL:
|
|
guiCurrentGunFilterMode = GUN_PISTOL;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_M_PISTOL:
|
|
guiCurrentGunFilterMode = GUN_M_PISTOL;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_SMG:
|
|
guiCurrentGunFilterMode = GUN_SMG;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_RIFLE:
|
|
guiCurrentGunFilterMode = GUN_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_SN_RIFLE:
|
|
guiCurrentGunFilterMode = GUN_SN_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_AS_RIFLE:
|
|
guiCurrentGunFilterMode = GUN_AS_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_LMG:
|
|
guiCurrentGunFilterMode = GUN_LMG;
|
|
break;
|
|
case BOBBYR_FILTER_GUNS_SHOTGUN:
|
|
guiCurrentGunFilterMode = GUN_SHOTGUN;
|
|
break;
|
|
// "Heavy Weapons" (Weapon Type = NOT_GUN
|
|
// ItemClass = IC_LAUNCHER. (IC_LAUNCHER is already included in IC_BOBBY_GUN!)
|
|
case BOBBYR_FILTER_GUNS_HEAVY:
|
|
guiCurrentGunFilterMode = NOT_GUN;
|
|
break;
|
|
}
|
|
|
|
SetFirstLastPagesForNew(IC_BOBBY_GUN, guiCurrentGunFilterMode);
|
|
UpdateGunFilterButtons();
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
void BtnBobbyRFilterAmmoCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
UINT32 bNewValue;
|
|
bNewValue = MSYS_GetBtnUserData( btn, 0 );
|
|
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
//gbMessageDisplayed = TRUE;
|
|
|
|
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 );
|
|
|
|
guiPrevAmmoFilterMode = guiCurrentAmmoFilterMode;
|
|
|
|
switch (bNewValue)
|
|
{
|
|
case BOBBYR_FILTER_AMMO_PISTOL:
|
|
guiCurrentAmmoFilterMode = GUN_PISTOL;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_M_PISTOL:
|
|
guiCurrentAmmoFilterMode = GUN_M_PISTOL;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_SMG:
|
|
guiCurrentAmmoFilterMode = GUN_SMG;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_RIFLE:
|
|
guiCurrentAmmoFilterMode = GUN_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_SN_RIFLE:
|
|
guiCurrentAmmoFilterMode = GUN_SN_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_AS_RIFLE:
|
|
guiCurrentAmmoFilterMode = GUN_AS_RIFLE;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_LMG:
|
|
guiCurrentAmmoFilterMode = GUN_LMG;
|
|
break;
|
|
case BOBBYR_FILTER_AMMO_SHOTGUN:
|
|
guiCurrentAmmoFilterMode = GUN_SHOTGUN;
|
|
break;
|
|
}
|
|
|
|
SetFirstLastPagesForNew(IC_AMMO, guiCurrentAmmoFilterMode);
|
|
UpdateAmmoFilterButtons();
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
void BtnBobbyRFilterUsedCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
UINT32 bNewValue;
|
|
bNewValue = MSYS_GetBtnUserData( btn, 0 );
|
|
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
//gbMessageDisplayed = TRUE;
|
|
|
|
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 );
|
|
|
|
guiPrevUsedFilterMode = guiCurrentUsedFilterMode;
|
|
|
|
switch (bNewValue)
|
|
{
|
|
case BOBBYR_FILTER_USED_GUNS:
|
|
guiCurrentUsedFilterMode = IC_BOBBY_GUN;
|
|
break;
|
|
case BOBBYR_FILTER_USED_ARMOR:
|
|
guiCurrentUsedFilterMode = IC_ARMOUR;
|
|
break;
|
|
case BOBBYR_FILTER_USED_LBEGEAR:
|
|
guiCurrentUsedFilterMode = IC_LBEGEAR;
|
|
break;
|
|
case BOBBYR_FILTER_USED_MISC:
|
|
guiCurrentUsedFilterMode = IC_BOBBY_MISC;
|
|
break;
|
|
}
|
|
|
|
UpdateUsedFilterButtons();
|
|
SetFirstLastPagesForUsed(guiCurrentUsedFilterMode);
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
|
|
void BtnBobbyRFilterArmourCallback(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;
|
|
|
|
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 );
|
|
|
|
guiPrevArmourFilterMode = guiCurrentArmourFilterMode;
|
|
|
|
switch (bNewValue)
|
|
{
|
|
case BOBBYR_FILTER_ARMOUR_HELM:
|
|
guiCurrentArmourFilterMode = ARMOURCLASS_HELMET;
|
|
break;
|
|
case BOBBYR_FILTER_ARMOUR_VEST:
|
|
guiCurrentArmourFilterMode = ARMOURCLASS_VEST;
|
|
break;
|
|
case BOBBYR_FILTER_ARMOUR_LEGGING:
|
|
guiCurrentArmourFilterMode = ARMOURCLASS_LEGGINGS;
|
|
break;
|
|
case BOBBYR_FILTER_ARMOUR_PLATE:
|
|
guiCurrentArmourFilterMode = ARMOURCLASS_PLATE;
|
|
break;
|
|
}
|
|
|
|
SetFirstLastPagesForNew(IC_ARMOUR, guiCurrentArmourFilterMode);
|
|
|
|
UpdateArmourFilterButtons();
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
void BtnBobbyRFilterMiscCallback(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;
|
|
|
|
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 );
|
|
|
|
guiPrevMiscFilterMode = guiCurrentMiscFilterMode;
|
|
guiPrevMiscSubFilterMode = guiCurrentMiscSubFilterMode;
|
|
|
|
guiCurrentMiscSubFilterMode = -1;
|
|
switch (bNewValue)
|
|
{
|
|
case BOBBYR_FILTER_MISC_BLADE:
|
|
guiCurrentMiscFilterMode = IC_BLADE;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_THROWING_KNIFE:
|
|
guiCurrentMiscFilterMode = IC_THROWING_KNIFE;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_PUNCH:
|
|
guiCurrentMiscFilterMode = IC_PUNCH;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_GRENADE:
|
|
guiCurrentMiscFilterMode = IC_GRENADE;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_BOMB:
|
|
guiCurrentMiscFilterMode = IC_BOMB;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_MEDKIT:
|
|
guiCurrentMiscFilterMode = IC_MEDKIT;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_KIT:
|
|
guiCurrentMiscFilterMode = IC_KIT;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_FACE:
|
|
guiCurrentMiscFilterMode = IC_FACE;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_LBEGEAR:
|
|
guiCurrentMiscFilterMode = IC_LBEGEAR;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_OPTICS_ATTACHMENTS: // Madd: New BR filters
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_OPTICS;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_SIDE_AND_BOTTOM_ATTACHMENTS:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_SIDE_BOTTOM;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_MUZZLE_ATTACHMENTS:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_MUZZLE;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_STOCK_ATTACHMENTS:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_STOCK;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_INTERNAL_ATTACHMENTS:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_INTERNAL;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_OTHER_ATTACHMENTS:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_OTHER_ATTACHMENTS;
|
|
break;
|
|
case BOBBYR_FILTER_MISC_MISC:
|
|
guiCurrentMiscFilterMode = IC_MISC;
|
|
guiCurrentMiscSubFilterMode = BR_MISC_FILTER_NO_ATTACHMENTS;
|
|
break;
|
|
}
|
|
|
|
SetFirstLastPagesForNew(IC_BOBBY_MISC, guiCurrentMiscFilterMode,guiCurrentMiscSubFilterMode);
|
|
|
|
UpdateMiscFilterButtons();
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// HEADROCK HAM 4: Added ability to scroll forward 5 pages instead of one.
|
|
// This is done by holding down SHIFT while clicking.
|
|
//
|
|
|
|
//if previous screen
|
|
if( bNewValue == BOBBYR_PREVIOUS_PAGE)
|
|
{
|
|
if( gubCurPage > 0 )
|
|
{
|
|
if (_KeyDown( 17 ) ) // CTRL
|
|
gubCurPage = 0;
|
|
else if (_KeyDown( 16 ) ) // SHIFT
|
|
gubCurPage = __max(gubCurPage - 10, 0);
|
|
else
|
|
gubCurPage--;
|
|
}
|
|
}
|
|
//else next screen
|
|
else
|
|
{
|
|
if( gubCurPage < gubNumPages - 1 )
|
|
{
|
|
if (_KeyDown( 17 ) ) // CTRL
|
|
gubCurPage = gubNumPages - 1;
|
|
else if (_KeyDown( 16 ) ) // SHIFT
|
|
gubCurPage = __min(gubNumPages - 1, gubCurPage + 10);
|
|
else
|
|
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, INT32 iFilter, INT32 iSubFilter)
|
|
{
|
|
UINT16 i;
|
|
UINT8 ubCount=0;
|
|
UINT16 PosY, usTextPosY;
|
|
UINT16 usItemIndex;
|
|
CHAR16 sDollarTemp[60];
|
|
CHAR16 sTemp[60];
|
|
CHAR16 sPage[60];
|
|
INT16 pItemNumbers[ BOBBYR_NUM_WEAPONS_ON_PAGE ];
|
|
BOOLEAN bAddItem = FALSE;
|
|
|
|
PosY = BOBBYR_GRID_PIC_Y;
|
|
usTextPosY = BOBBYR_ITEM_DESC_START_Y;
|
|
|
|
//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);
|
|
|
|
//Buggler: Display the current page & total pages at the bottom of the screen
|
|
swprintf( sPage, L"%d / %d", gubCurPage + 1, gubNumPages );
|
|
DrawTextToScreen(sPage, BOBBYR_ORDER_PAGE_X, BOBBYR_ORDER_PAGE_Y, 0, BOBBYR_ORDER_TITLE_FONT, BOBBYR_ORDER_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, RIGHT_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);
|
|
}
|
|
|
|
// InitFirstAndLastGlobalIndex( uiItemClass );
|
|
|
|
//if there are no items then return
|
|
if( gusFirstItemIndex == BOBBYR_NO_ITEMS )
|
|
{
|
|
if( fExitingLaptopFlag )
|
|
return( TRUE );
|
|
|
|
DisableBobbyRButtons();
|
|
|
|
if (gbMessageDisplayed == FALSE)
|
|
{
|
|
//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 );
|
|
|
|
gbMessageDisplayed = TRUE;
|
|
}
|
|
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++)
|
|
{
|
|
bAddItem = FALSE;
|
|
|
|
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;
|
|
}
|
|
|
|
// No Filter->Take all
|
|
if (iFilter == -1)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
|
|
pItemNumbers[ ubCount ] = usItemIndex;
|
|
|
|
switch( Item[ usItemIndex ].usItemClass )
|
|
{
|
|
case IC_GUN:
|
|
case IC_LAUNCHER:
|
|
// Used
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == IC_GUN ||
|
|
Item[usItemIndex].usItemClass == IC_LAUNCHER)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// Guns
|
|
else
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Weapon[ Item[usItemIndex].ubClassIndex ].ubWeaponType == iFilter)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
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:
|
|
// USED
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == iFilter)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// AMMO
|
|
else
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (IsAmmoMatchinWeaponType(usItemIndex, iFilter))
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
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:
|
|
// USED
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == iFilter)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// ARMOUR
|
|
else
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Armour[ Item[usItemIndex].ubClassIndex ].ubArmourClass == iFilter)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
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:
|
|
// USED
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == IC_BLADE ||
|
|
Item[usItemIndex].usItemClass == IC_THROWING_KNIFE ||
|
|
Item[usItemIndex].usItemClass == IC_PUNCH)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// MISC
|
|
else
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == iFilter)
|
|
{
|
|
bAddItem = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
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:
|
|
// USED
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == IC_GRENADE ||
|
|
Item[usItemIndex].usItemClass == IC_BOMB)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// MISC
|
|
else
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == iFilter)
|
|
{
|
|
bAddItem = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
gusItemNumberForItemsOnScreen[ ubCount ] = i;
|
|
|
|
DisplayBigItemImage( usItemIndex, PosY);
|
|
|
|
//Display Items Name
|
|
DisplayItemNameAndInfo(usTextPosY, usItemIndex, i, gfOnUsedPage);
|
|
|
|
DisplayGrenadeBombInfo(usItemIndex, usTextPosY, gfOnUsedPage, i);
|
|
|
|
PosY += BOBBYR_GRID_OFFSET;
|
|
usTextPosY += BOBBYR_GRID_OFFSET;
|
|
ubCount++;
|
|
}
|
|
break;
|
|
case IC_MISC:
|
|
case IC_MEDKIT:
|
|
case IC_KIT:
|
|
case IC_FACE:
|
|
case IC_LBEGEAR:
|
|
// USED
|
|
if (uiItemClass == BOBBYR_USED_ITEMS)
|
|
{
|
|
if (iFilter > -1)
|
|
{
|
|
if (Item[usItemIndex].usItemClass == IC_MISC ||
|
|
Item[usItemIndex].usItemClass == IC_MEDKIT ||
|
|
Item[usItemIndex].usItemClass == IC_KIT ||
|
|
Item[usItemIndex].usItemClass == IC_LBEGEAR ||
|
|
Item[usItemIndex].usItemClass == IC_FACE)
|
|
{
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// MISC
|
|
else
|
|
{
|
|
if (iFilter > -1 && Item[usItemIndex].usItemClass == iFilter)
|
|
{
|
|
if ( iSubFilter > -1 ) // Madd: new BR filters
|
|
{
|
|
if (Item[usItemIndex].attachment && Item[usItemIndex].attachmentclass & iSubFilter )
|
|
bAddItem = TRUE;
|
|
else if (iSubFilter == BR_MISC_FILTER_OTHER_ATTACHMENTS && !(Item[usItemIndex].attachmentclass & BR_MISC_FILTER_STD_ATTACHMENTS) && Item[usItemIndex].attachment)
|
|
bAddItem = TRUE;
|
|
else if (iSubFilter == BR_MISC_FILTER_NO_ATTACHMENTS && !Item[usItemIndex].attachment)
|
|
bAddItem = TRUE;
|
|
}
|
|
else
|
|
bAddItem = TRUE;
|
|
}
|
|
}
|
|
|
|
if (bAddItem == TRUE)
|
|
{
|
|
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;
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN DisplayGunInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
|
|
{
|
|
UINT16 usHeight;
|
|
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 - Removed due to limited space
|
|
//usHeight = DisplayWeight(usHeight, usIndex, usFontHeight);
|
|
|
|
//Caliber
|
|
usHeight = DisplayCaliber(usHeight, usIndex, usFontHeight);
|
|
|
|
//Magazine
|
|
usHeight = DisplayMagazine(usHeight, usIndex, usFontHeight);
|
|
|
|
//Damage
|
|
usHeight = DisplayDamage(usHeight, usIndex, usFontHeight);
|
|
|
|
//Range
|
|
usHeight = DisplayRange(usHeight, usIndex, usFontHeight);
|
|
|
|
//ROF
|
|
usHeight = DisplayRof(usHeight, usIndex, usFontHeight);
|
|
|
|
//AP
|
|
usHeight = DisplayGunAP(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;
|
|
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);
|
|
|
|
//AP
|
|
usHeight = DisplayMeleeAP(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;
|
|
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 DisplayGrenadeBombInfo(UINT16 usIndex, UINT16 usTextPosY, BOOLEAN fUsed, UINT16 usBobbyIndex)
|
|
{
|
|
UINT16 usHeight;
|
|
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);
|
|
|
|
//Explosive Damage
|
|
usHeight = DisplayExplosiveDamage(usHeight, usIndex, usFontHeight);
|
|
|
|
//Explosive Stun Damage
|
|
usHeight = DisplayExplosiveStunDamage(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;
|
|
INT32 sOffsetX, sOffsetY;
|
|
ETRLEObject *pTrav;
|
|
INVTYPE *pItem;
|
|
UINT32 uiImage;
|
|
HVOBJECT hPixHandle;
|
|
|
|
PosX = BOBBYR_GRID_PIC_X;
|
|
|
|
pItem = &Item[ usIndex ];
|
|
LoadTileGraphicForItem(pItem, &uiImage);
|
|
|
|
GetVideoObject(&hPixHandle, uiImage);
|
|
|
|
if(hPixHandle->ubBitDepth == 8)
|
|
{
|
|
pTrav = &(hPixHandle->pETRLEObject[ 0 ] );
|
|
|
|
//center picture in frame
|
|
usHeight = (UINT32)pTrav->usHeight;
|
|
usWidth = (UINT32)pTrav->usWidth;
|
|
sOffsetX = (INT32)pTrav->sOffsetX;
|
|
sOffsetY = (INT32)pTrav->sOffsetY;
|
|
}
|
|
else if(hPixHandle->ubBitDepth == 16 && hPixHandle->p16BPPObject)
|
|
{
|
|
usHeight = hPixHandle->p16BPPObject->usHeight;
|
|
usWidth = hPixHandle->p16BPPObject->usWidth;
|
|
sOffsetX = hPixHandle->p16BPPObject->sOffsetX;
|
|
sOffsetY = hPixHandle->p16BPPObject->sOffsetY;
|
|
}
|
|
else if(hPixHandle->ubBitDepth == 32)
|
|
{
|
|
usHeight = hPixHandle->p16BPPObject->usHeight;
|
|
usWidth = hPixHandle->p16BPPObject->usWidth;
|
|
sOffsetX = hPixHandle->p16BPPObject->sOffsetX;
|
|
sOffsetY = hPixHandle->p16BPPObject->sOffsetY;
|
|
}
|
|
else
|
|
{
|
|
Assert(false);
|
|
}
|
|
|
|
// sCenX = PosX + ( abs( BOBBYR_GRID_PIC_WIDTH - usWidth ) / 2 );
|
|
// sCenY = PosY + 8;
|
|
sCenX = PosX + ( abs( BOBBYR_GRID_PIC_WIDTH - (int)usWidth ) / 2 ) - sOffsetX;
|
|
sCenY = PosY + 8;
|
|
|
|
|
|
//blt the shadow of the item
|
|
if(gGameSettings.fOptions[ TOPTION_SHOW_ITEM_SHADOW ])
|
|
{
|
|
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;
|
|
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);
|
|
|
|
//Protection
|
|
usHeight = DisplayProtection(usHeight, usIndex, usFontHeight);
|
|
|
|
//Camo
|
|
usHeight = DisplayCamo(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;
|
|
UINT16 usFontHeight;
|
|
usFontHeight = GetFontHeight(BOBBYR_ITEM_DESC_TEXT_FONT);
|
|
|
|
//CHRISL: Display extra information for LBE Items when using new inventory system
|
|
if((UsingNewInventorySystem() == true) && Item[usIndex].usItemClass == IC_LBEGEAR)
|
|
{
|
|
usHeight = DisplayLBEInfo(usTextPosY, usIndex, usFontHeight);
|
|
}
|
|
|
|
//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)
|
|
{
|
|
CHAR16 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)
|
|
{
|
|
CHAR16 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 DisplayGunAP(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
CHAR16 sTemp2[20];
|
|
OBJECTTYPE pObject;
|
|
|
|
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_AP], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
CreateItem(usIndex, 100, &pObject);
|
|
UINT16 readyAPs = (UINT16)(( Weapon[ usIndex ].ubReadyTime * (100 - Item[ usIndex ].percentreadytimeapreduction)) / 100);
|
|
INT16 ubAttackAPs = BaseAPsToShootOrStab( APBPConstants[DEFAULT_APS], APBPConstants[DEFAULT_AIMSKILL], &pObject, NULL );
|
|
|
|
swprintf( sTemp, L"(%d)", readyAPs );
|
|
|
|
if ( Weapon[ usIndex ].NoSemiAuto )
|
|
wcscat( sTemp, L"-" );
|
|
else
|
|
{
|
|
swprintf( sTemp2, L"%d", ubAttackAPs );
|
|
wcscat( sTemp, sTemp2 );
|
|
}
|
|
|
|
if (GetShotsPerBurst(&pObject) > 0)
|
|
{
|
|
swprintf( sTemp2, L"/%d", ubAttackAPs + CalcAPsToBurst( APBPConstants[DEFAULT_APS], &pObject, NULL ) );
|
|
wcscat( sTemp, sTemp2 );
|
|
}
|
|
else
|
|
wcscat( sTemp, L"/-" );
|
|
|
|
if (GetAutofireShotsPerFiveAPs(&pObject) > 0)
|
|
{
|
|
swprintf( sTemp2, L"/%d", ubAttackAPs + CalcAPsToAutofire( APBPConstants[DEFAULT_APS], &pObject, 3, NULL ) );
|
|
wcscat( sTemp, sTemp2 );
|
|
}
|
|
else
|
|
wcscat( sTemp, L"/-" );
|
|
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
UINT16 DisplayMeleeAP(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
OBJECTTYPE pObject;
|
|
|
|
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_AP], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
CreateItem(usIndex, 100, &pObject);
|
|
INT16 ubAttackAPs = BaseAPsToShootOrStab( APBPConstants[DEFAULT_APS], APBPConstants[DEFAULT_AIMSKILL], &pObject, NULL );
|
|
|
|
swprintf( sTemp, L"%d", ubAttackAPs );
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
UINT16 DisplayDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
UINT16 gunDamage = 0;
|
|
|
|
if ( Item[ usIndex ].usItemClass == IC_GUN || Item[ usIndex ].usItemClass == IC_LAUNCHER )
|
|
{
|
|
// HEADROCK HAM 3.6: Can now take a negative modifier
|
|
gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ usIndex ].ubImpact );
|
|
//gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
|
|
|
|
// modify by ini values
|
|
if ( Item[ usIndex ].usItemClass == IC_GUN )
|
|
gunDamage *= gItemSettings.fDamageModifierGun[ Weapon[ usIndex ].ubWeaponType ];
|
|
}
|
|
else
|
|
{
|
|
// HEADROCK HAM 3.6: Can now take a negative modifier
|
|
gunDamage = (UINT16)GetModifiedMeleeDamage( Weapon[ usIndex ].ubImpact );
|
|
//gunDamage = (UINT16)( Weapon[ usIndex ].ubImpact + ( (double) Weapon[ usIndex ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
|
|
|
|
// modify by ini values
|
|
if ( Item[ usIndex ].usItemClass == IC_BLADE )
|
|
gunDamage *= gItemSettings.fDamageModifierBlade;
|
|
else if ( Item[ usIndex ].usItemClass == IC_PUNCH )
|
|
gunDamage *= gItemSettings.fDamageModifierPunch;
|
|
}
|
|
|
|
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)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
UINT16 gunRange = 0;
|
|
|
|
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);
|
|
|
|
gunRange = (UINT16)GetModifiedGunRange( usIndex);
|
|
|
|
swprintf(sTemp, L"%3d %s", gunRange, 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_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
UINT16 DisplayMagazine(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 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);
|
|
if(Item[usIndex].usItemClass & IC_BOBBY_GUN){
|
|
swprintf(sTemp, L"%3d %s", Weapon[Item[usIndex].ubClassIndex].ubMagSize, pMessageStrings[ MSG_ROUNDS_ABBREVIATION ] );
|
|
}else{
|
|
swprintf(sTemp, L"%3d %s", Magazine[Item[usIndex].ubClassIndex].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_ALT, 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 DisplayExplosiveDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
|
|
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);
|
|
|
|
UINT16 explDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usIndex ].ubClassIndex].ubDamage, 0 );
|
|
|
|
swprintf(sTemp, L"%4d", explDamage);
|
|
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 DisplayExplosiveStunDamage(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
|
|
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_STUN], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
UINT16 explStunDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usIndex ].ubClassIndex].ubStunDamage, 1 );
|
|
|
|
swprintf(sTemp, L"%4d", explStunDamage);
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
UINT16 DisplayProtection(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
CHAR16 sTemp2[20];
|
|
|
|
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_PROTECTION], BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, 0, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_STATIC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
|
|
INT32 iProtection = Armour[ Item[ usIndex ].ubClassIndex ].ubProtection;
|
|
|
|
switch( Armour[ Item[ usIndex ].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(sTemp, L"%d", iProtection, Armour[ Item[ usIndex ].ubClassIndex ].ubProtection); // FIXME: param4 is unused
|
|
wcscat( sTemp, L"%%" );
|
|
swprintf( sTemp2, L"(%d)", Armour[ Item[ usIndex ].ubClassIndex ].ubProtection );
|
|
wcscat( sTemp, sTemp2 );
|
|
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 DisplayCamo(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
|
|
DrawTextToScreen(BobbyRText[BOBBYR_GUNS_CAMO], 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"%d", Item[ usIndex ].camobonus);
|
|
wcscat( sTemp, L"%%" );
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_NUM_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
// CHRISL: New display function for LBE Gear
|
|
UINT16 DisplayLBEInfo(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 sTemp[20];
|
|
CHAR16 pName[80];
|
|
int lnCnt=0, count, size;
|
|
UINT16 lbeIndex;
|
|
UINT8 pIndex=0;
|
|
std::vector<int> pocketNum;
|
|
|
|
size = LBEPocketType.size();
|
|
pocketNum.reserve(size);
|
|
lbeIndex = Item[usIndex].ubClassIndex;
|
|
// Determine number of each pocket definition
|
|
for(count = 0; count<size; count++)
|
|
{
|
|
pocketNum.push_back(0);
|
|
}
|
|
// Populate "Number" for each type of pocket this LBE item has
|
|
for(count = 0; count<12; count++)
|
|
{
|
|
pIndex = LoadBearingEquipment[lbeIndex].lbePocketIndex[count];
|
|
pocketNum[pIndex]++;
|
|
}
|
|
// Go through and display the pocket type and number
|
|
for(count = 1; count<size; count++)
|
|
{
|
|
if(pocketNum[count]>0)
|
|
{
|
|
if(lnCnt>4)
|
|
{
|
|
swprintf(sTemp, L"More..." );
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
//mbstowcs(pName,LBEPocketType[count].pName,80);
|
|
for(UINT8 i = 0; i<14; i++)
|
|
pName[i] = LBEPocketType[count].pName[i];
|
|
//pName = LBEPocketType[count].pName;
|
|
pName[14] = '\0';
|
|
swprintf(sTemp, L"%s(x%d)", pName, pocketNum[count] );
|
|
DrawTextToScreen(sTemp, BOBBYR_ITEM_WEIGHT_TEXT_X, (UINT16)usPosY, BOBBYR_ITEM_WEIGHT_NUM_WIDTH, BOBBYR_ITEM_DESC_TEXT_FONT, BOBBYR_ITEM_DESC_TEXT_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
lnCnt++;
|
|
}
|
|
}
|
|
}
|
|
return(usPosY);
|
|
}
|
|
|
|
|
|
UINT16 DisplayWeight(UINT16 usPosY, UINT16 usIndex, UINT16 usFontHeight)
|
|
{
|
|
CHAR16 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_ALT, FONT_MCOLOR_BLACK, FALSE, RIGHT_JUSTIFIED);
|
|
usPosY += usFontHeight + 2;
|
|
return(usPosY);
|
|
}
|
|
|
|
|
|
void DisplayItemNameAndInfo(UINT16 usPosY, UINT16 usIndex, UINT16 usBobbyIndex, BOOLEAN fUsed)
|
|
{
|
|
CHAR16 sText[400];
|
|
CHAR16 sTemp[20];
|
|
|
|
UINT8 ubPurchaseNumber;
|
|
|
|
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 )
|
|
{
|
|
#ifdef CHINESE
|
|
swprintf( sTemp, ChineseSpecString2, LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].ubItemQuality );//zww
|
|
#else
|
|
swprintf( sTemp, L"*%3d%%%%", LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyIndex ].ubItemQuality );
|
|
#endif
|
|
|
|
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
|
|
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);
|
|
|
|
//Moa: update encyclopedia item visibility when item gets displayed
|
|
EncyclopediaSetItemAsVisible( usIndex, ENC_ITEM_DISCOVERED_NOT_INSPECTABLE );
|
|
}
|
|
|
|
/*
|
|
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, INT32 iFilter, INT32 iSubFilter )
|
|
{
|
|
UINT16 i;
|
|
INT16 sFirst = -1;
|
|
INT16 sLast = -1;
|
|
UINT16 ubNumItems=0;
|
|
UINT16 usItemIndex = 0;
|
|
|
|
BOOLEAN bCntNumItems = FALSE;
|
|
|
|
gubCurPage = 0;
|
|
|
|
//First loop through to get the first and last index indexs
|
|
for(i=0; i<MAXITEMS; ++i)
|
|
{
|
|
//If we have some of the inventory on hand
|
|
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand != 0 )
|
|
{
|
|
if( Item[ LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex ].usItemClass & uiClassMask )
|
|
{
|
|
// No Filter->Take all
|
|
if (iFilter == -1)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
// Filter!
|
|
else
|
|
{
|
|
bCntNumItems = FALSE;
|
|
|
|
// Get the weapon from the item
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
|
|
switch (uiClassMask)
|
|
{
|
|
// Guns
|
|
case IC_BOBBY_GUN:
|
|
if (Weapon[ Item[usItemIndex].ubClassIndex ].ubWeaponType == iFilter)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
// Ammo
|
|
case IC_AMMO:
|
|
if (IsAmmoMatchinWeaponType(usItemIndex, guiCurrentAmmoFilterMode))
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
// Armour
|
|
case IC_ARMOUR:
|
|
if (Armour[ Item[usItemIndex].ubClassIndex ].ubArmourClass == iFilter)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
// Misc
|
|
case IC_BOBBY_MISC:
|
|
if (Item[usItemIndex].usItemClass == iFilter) // Madd: new BR filter options
|
|
{
|
|
if (iSubFilter > -1 )
|
|
{
|
|
if (Item[usItemIndex].attachment && Item[usItemIndex].attachmentclass & iSubFilter)
|
|
bCntNumItems = TRUE;
|
|
else if (iSubFilter == BR_MISC_FILTER_OTHER_ATTACHMENTS && !(Item[usItemIndex].attachmentclass & BR_MISC_FILTER_STD_ATTACHMENTS) && Item[usItemIndex].attachment)
|
|
bCntNumItems = TRUE;
|
|
else if (iSubFilter == BR_MISC_FILTER_NO_ATTACHMENTS && !Item[usItemIndex].attachment )
|
|
bCntNumItems = TRUE;
|
|
}
|
|
else
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bCntNumItems == TRUE)
|
|
{
|
|
ubNumItems++;
|
|
|
|
if( sFirst == -1 )
|
|
sFirst = i;
|
|
sLast = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( ubNumItems == 0 )
|
|
{
|
|
gbMessageDisplayed = FALSE;
|
|
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 );
|
|
gubNumPagesMod = ubNumItems % BOBBYR_NUM_WEAPONS_ON_PAGE;
|
|
if( gubNumPagesMod != 0 )
|
|
gubNumPages += 1;
|
|
}
|
|
|
|
//Loops through Bobby Rays Used Inventory to find the first and last index
|
|
void SetFirstLastPagesForUsed(INT32 iFilter)
|
|
{
|
|
UINT16 i;
|
|
INT16 sFirst = -1;
|
|
INT16 sLast = -1;
|
|
UINT16 ubNumItems=0;
|
|
UINT16 usItemIndex;
|
|
|
|
gubCurPage = 0;
|
|
BOOLEAN bCntNumItems = FALSE;
|
|
|
|
//First loop through to get the first and last index indexs
|
|
for(i=0; i<MAXITEMS; ++i)
|
|
{
|
|
//If we have some of the inventory on hand
|
|
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnHand != 0 )
|
|
{
|
|
// No Filter->Take all
|
|
if (iFilter == -1)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bCntNumItems = FALSE;
|
|
// Get the weapon from the item
|
|
usItemIndex = LaptopSaveInfo.BobbyRayUsedInventory[ i ].usItemIndex;
|
|
|
|
switch (iFilter)
|
|
{
|
|
case IC_BOBBY_GUN:
|
|
if (Item[usItemIndex].usItemClass == IC_GUN ||
|
|
Item[usItemIndex].usItemClass == IC_LAUNCHER)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
case IC_AMMO:
|
|
if (Item[usItemIndex].usItemClass == IC_AMMO)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
case IC_ARMOUR:
|
|
if (Item[usItemIndex].usItemClass == IC_ARMOUR)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
case IC_LBEGEAR:
|
|
if (Item[usItemIndex].usItemClass == IC_LBEGEAR)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
case IC_BOBBY_MISC:
|
|
if (Item[usItemIndex].usItemClass == IC_BLADE ||
|
|
Item[usItemIndex].usItemClass == IC_THROWING_KNIFE ||
|
|
Item[usItemIndex].usItemClass == IC_PUNCH ||
|
|
Item[usItemIndex].usItemClass == IC_GRENADE ||
|
|
Item[usItemIndex].usItemClass == IC_BOMB ||
|
|
Item[usItemIndex].usItemClass == IC_MISC ||
|
|
Item[usItemIndex].usItemClass == IC_MEDKIT ||
|
|
Item[usItemIndex].usItemClass == IC_KIT ||
|
|
Item[usItemIndex].usItemClass == IC_FACE)
|
|
{
|
|
bCntNumItems = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bCntNumItems == TRUE)
|
|
{
|
|
ubNumItems++;
|
|
|
|
if( sFirst == -1 )
|
|
sFirst = i;
|
|
sLast = i;
|
|
}
|
|
}
|
|
}
|
|
if( sFirst == -1 )
|
|
{
|
|
gbMessageDisplayed = FALSE;
|
|
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 );
|
|
gubNumPagesMod = ubNumItems % BOBBYR_NUM_WEAPONS_ON_PAGE;
|
|
if( gubNumPagesMod != 0 )
|
|
gubNumPages += 1;
|
|
}
|
|
|
|
|
|
void CreateMouseRegionForBigImage( UINT16 usPosY, UINT8 ubCount, INT16 *pItemNumbers )
|
|
{
|
|
UINT8 i;
|
|
UINT16 usItem;
|
|
// HEADROCK HAM 3: Increased size, to allow larger tooltips. Used for Attachments Shown on Tooltips feature.
|
|
// Please note, if a mod introduces a weapon that can take several hundred attachments, this value MIGHT overflow.
|
|
// I do not have the expertise to think of a better solution. Still, 5000 is enough for around 200 possible attachments,
|
|
// so overflow will first be felt ON-SCREEN. I consider that scenario extremely unlikely.
|
|
//CHAR16 pStr[ 250 ];
|
|
CHAR16 pStr[ 5000 ];
|
|
|
|
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);
|
|
|
|
usItem = pItemNumbers[ i ];
|
|
|
|
GetHelpTextForItemInLaptop( pStr, usItem );
|
|
|
|
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 );
|
|
|
|
// HEADROCK HAM 4: Purchase all at once.
|
|
if (_KeyDown( 16 ) ) // SHIFT
|
|
PurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], TRUE );
|
|
else
|
|
PurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], FALSE );
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
|
|
|
|
// HEADROCK HAM 4: Unpurchase all at once.
|
|
if (_KeyDown( 16 ) ) // SHIFT
|
|
UnPurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], TRUE );
|
|
else
|
|
UnPurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], FALSE );
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
}
|
|
else if(iReason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT)
|
|
{
|
|
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
|
|
|
|
PurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], FALSE );
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_REPEAT)
|
|
{
|
|
UINT16 usItemNum = (UINT16)MSYS_GetRegionUserData( pRegion, 0 );
|
|
|
|
UnPurchaseBobbyRayItem( gusItemNumberForItemsOnScreen[ usItemNum], FALSE );
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PurchaseBobbyRayItem(UINT16 usItemNumber, BOOLEAN fAllItems )
|
|
{
|
|
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 )
|
|
{
|
|
UINT8 ubNumItems = fAllItems ? LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].ubQtyOnHand : 1;
|
|
|
|
BobbyRayPurchases[ ubPurchaseNumber ].usItemIndex = LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].usItemIndex;
|
|
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased = ubNumItems;
|
|
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
|
|
CHAR16 sMaxPurchase[255];
|
|
swprintf(sMaxPurchase, L"%s%d%s", BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES_A], gGameExternalOptions.ubBobbyRayMaxPurchaseAmount, BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES_B]);
|
|
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, sMaxPurchase, 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
|
|
{
|
|
UINT8 ubNumItems = fAllItems ? LaptopSaveInfo.BobbyRayUsedInventory[ usItemNumber ].ubQtyOnHand - BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased : 1;
|
|
|
|
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased <= BOBBY_RAY_MAX_AMOUNT_OF_ITEMS_TO_PURCHASE - (ubNumItems-1))
|
|
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased += ubNumItems;
|
|
}
|
|
}
|
|
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 )
|
|
{
|
|
UINT8 ubNumItems = fAllItems ? LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].ubQtyOnHand : 1;
|
|
|
|
BobbyRayPurchases[ ubPurchaseNumber ].usItemIndex = LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].usItemIndex;
|
|
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased = ubNumItems;
|
|
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
|
|
CHAR16 sMaxPurchase[255];
|
|
swprintf(sMaxPurchase, L"%s%d%s", BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES_A], gGameExternalOptions.ubBobbyRayMaxPurchaseAmount, BobbyRText[ BOBBYR_MORE_THEN_10_PURCHASES_B]);
|
|
DoLapTopMessageBox( MSG_BOX_LAPTOP_DEFAULT, sMaxPurchase, 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
|
|
{
|
|
UINT8 ubNumItems = fAllItems ? LaptopSaveInfo.BobbyRayInventory[ usItemNumber ].ubQtyOnHand - BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased : 1;
|
|
|
|
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased <= BOBBY_RAY_MAX_AMOUNT_OF_ITEMS_TO_PURCHASE - (ubNumItems-1))
|
|
BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased += ubNumItems;
|
|
}
|
|
}
|
|
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<gGameExternalOptions.ubBobbyRayMaxPurchaseAmount; 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<gGameExternalOptions.ubBobbyRayMaxPurchaseAmount; i++)
|
|
{
|
|
if( ( BobbyRayPurchases[i].usBobbyItemIndex == 0) && ( BobbyRayPurchases[i].ubNumberPurchased == 0 ) )
|
|
return(i);
|
|
}
|
|
return(BOBBY_RAY_NOT_PURCHASED);
|
|
}
|
|
|
|
|
|
|
|
void UnPurchaseBobbyRayItem(UINT16 usItemNumber, BOOLEAN fAllItems )
|
|
{
|
|
UINT8 ubPurchaseNumber;
|
|
|
|
ubPurchaseNumber = CheckIfItemIsPurchased(usItemNumber);
|
|
|
|
if( ubPurchaseNumber != BOBBY_RAY_NOT_PURCHASED )
|
|
{
|
|
if( BobbyRayPurchases[ ubPurchaseNumber ].ubNumberPurchased > 1 && !fAllItems)
|
|
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:
|
|
if (guiCurrentGunFilterMode != -1)
|
|
{
|
|
EnableButton( guiBobbyRPageMenu[0] );
|
|
}
|
|
else
|
|
{
|
|
DisableButton( guiBobbyRPageMenu[0] );
|
|
}
|
|
break;
|
|
|
|
case LAPTOP_MODE_BOBBY_R_AMMO:
|
|
if (guiCurrentAmmoFilterMode != -1)
|
|
{
|
|
EnableButton( guiBobbyRPageMenu[1] );
|
|
}
|
|
else
|
|
{
|
|
DisableButton( guiBobbyRPageMenu[1] );
|
|
}
|
|
break;
|
|
|
|
case LAPTOP_MODE_BOBBY_R_ARMOR:
|
|
if (guiCurrentArmourFilterMode != -1)
|
|
{
|
|
EnableButton( guiBobbyRPageMenu[2] );
|
|
}
|
|
else
|
|
{
|
|
DisableButton( guiBobbyRPageMenu[2] );
|
|
}
|
|
break;
|
|
|
|
case LAPTOP_MODE_BOBBY_R_MISC:
|
|
if (guiCurrentMiscFilterMode != -1)
|
|
{
|
|
EnableButton( guiBobbyRPageMenu[3] );
|
|
}
|
|
else
|
|
{
|
|
DisableButton( guiBobbyRPageMenu[3] );
|
|
}
|
|
break;
|
|
|
|
case LAPTOP_MODE_BOBBY_R_USED:
|
|
if (guiCurrentUsedFilterMode != -1)
|
|
{
|
|
EnableButton( guiBobbyRPageMenu[4] );
|
|
}
|
|
else
|
|
{
|
|
DisableButton( guiBobbyRPageMenu[4] );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UpdateAmmoFilterButtons()
|
|
{
|
|
EnableButton(guiBobbyRFilterAmmo[0]);
|
|
EnableButton(guiBobbyRFilterAmmo[1]);
|
|
EnableButton(guiBobbyRFilterAmmo[2]);
|
|
EnableButton(guiBobbyRFilterAmmo[3]);
|
|
EnableButton(guiBobbyRFilterAmmo[4]);
|
|
EnableButton(guiBobbyRFilterAmmo[5]);
|
|
EnableButton(guiBobbyRFilterAmmo[6]);
|
|
EnableButton(guiBobbyRFilterAmmo[7]);
|
|
|
|
switch (guiCurrentAmmoFilterMode)
|
|
{
|
|
case GUN_PISTOL:
|
|
DisableButton(guiBobbyRFilterAmmo[0]);
|
|
break;
|
|
case GUN_M_PISTOL:
|
|
DisableButton(guiBobbyRFilterAmmo[1]);
|
|
break;
|
|
case GUN_SMG:
|
|
DisableButton(guiBobbyRFilterAmmo[2]);
|
|
break;
|
|
case GUN_RIFLE:
|
|
DisableButton(guiBobbyRFilterAmmo[3]);
|
|
break;
|
|
case GUN_SN_RIFLE:
|
|
DisableButton(guiBobbyRFilterAmmo[4]);
|
|
break;
|
|
case GUN_AS_RIFLE:
|
|
DisableButton(guiBobbyRFilterAmmo[5]);
|
|
break;
|
|
case GUN_LMG:
|
|
DisableButton(guiBobbyRFilterAmmo[6]);
|
|
break;
|
|
case GUN_SHOTGUN:
|
|
DisableButton(guiBobbyRFilterAmmo[7]);
|
|
break;
|
|
}
|
|
|
|
//// Bugged when >1 row of buttons
|
|
//if (iNewButton != iOldButton)
|
|
//{
|
|
// if (iNewButton > -1)
|
|
// {
|
|
// // Disable new Button
|
|
// DisableButton(guiBobbyRFilterAmmo[iNewButton - 1]);
|
|
// }
|
|
|
|
// if (iOldButton > -1)
|
|
// {
|
|
// // Enable old Button
|
|
// EnableButton(guiBobbyRFilterAmmo[iOldButton - 1]);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
void UpdateGunFilterButtons()
|
|
{
|
|
EnableButton(guiBobbyRFilterGuns[0]);
|
|
EnableButton(guiBobbyRFilterGuns[1]);
|
|
EnableButton(guiBobbyRFilterGuns[2]);
|
|
EnableButton(guiBobbyRFilterGuns[3]);
|
|
EnableButton(guiBobbyRFilterGuns[4]);
|
|
EnableButton(guiBobbyRFilterGuns[5]);
|
|
EnableButton(guiBobbyRFilterGuns[6]);
|
|
EnableButton(guiBobbyRFilterGuns[7]);
|
|
EnableButton(guiBobbyRFilterGuns[8]);
|
|
|
|
switch (guiCurrentGunFilterMode)
|
|
{
|
|
case GUN_PISTOL:
|
|
DisableButton(guiBobbyRFilterGuns[0]);
|
|
break;
|
|
case GUN_M_PISTOL:
|
|
DisableButton(guiBobbyRFilterGuns[1]);
|
|
break;
|
|
case GUN_SMG:
|
|
DisableButton(guiBobbyRFilterGuns[2]);
|
|
break;
|
|
case GUN_RIFLE:
|
|
DisableButton(guiBobbyRFilterGuns[3]);
|
|
break;
|
|
case GUN_SN_RIFLE:
|
|
DisableButton(guiBobbyRFilterGuns[4]);
|
|
break;
|
|
case GUN_AS_RIFLE:
|
|
DisableButton(guiBobbyRFilterGuns[5]);
|
|
break;
|
|
case GUN_LMG:
|
|
DisableButton(guiBobbyRFilterGuns[6]);
|
|
break;
|
|
case GUN_SHOTGUN:
|
|
DisableButton(guiBobbyRFilterGuns[7]);
|
|
break;
|
|
case NOT_GUN:
|
|
DisableButton(guiBobbyRFilterGuns[8]);
|
|
break;
|
|
}
|
|
|
|
//if (iNewButton != iOldButton)
|
|
//{
|
|
// if (iNewButton > -1)
|
|
// {
|
|
// // Disable new Button
|
|
// DisableButton(guiBobbyRFilterGuns[iNewButton - 1]);
|
|
// }
|
|
|
|
// if (iOldButton > -1)
|
|
// {
|
|
// // Enable old Button
|
|
// EnableButton(guiBobbyRFilterGuns[iOldButton - 1]);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
void UpdateUsedFilterButtons()
|
|
{
|
|
EnableButton(guiBobbyRFilterUsed[0]);
|
|
EnableButton(guiBobbyRFilterUsed[1]);
|
|
if(guiBobbyRFilterUsed[2])
|
|
EnableButton(guiBobbyRFilterUsed[2]);
|
|
EnableButton(guiBobbyRFilterUsed[3]);
|
|
|
|
switch (guiCurrentUsedFilterMode)
|
|
{
|
|
case IC_BOBBY_GUN:
|
|
DisableButton(guiBobbyRFilterUsed[0]);
|
|
break;
|
|
case IC_ARMOUR:
|
|
DisableButton(guiBobbyRFilterUsed[1]);
|
|
break;
|
|
case IC_LBEGEAR:
|
|
DisableButton(guiBobbyRFilterUsed[2]);
|
|
break;
|
|
case IC_BOBBY_MISC:
|
|
DisableButton(guiBobbyRFilterUsed[3]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UpdateArmourFilterButtons()
|
|
{
|
|
EnableButton(guiBobbyRFilterArmour[0]);
|
|
EnableButton(guiBobbyRFilterArmour[1]);
|
|
EnableButton(guiBobbyRFilterArmour[2]);
|
|
EnableButton(guiBobbyRFilterArmour[3]);
|
|
|
|
switch (guiCurrentArmourFilterMode)
|
|
{
|
|
case ARMOURCLASS_HELMET:
|
|
DisableButton(guiBobbyRFilterArmour[0]);
|
|
break;
|
|
case ARMOURCLASS_VEST:
|
|
DisableButton(guiBobbyRFilterArmour[1]);
|
|
break;
|
|
case ARMOURCLASS_LEGGINGS:
|
|
DisableButton(guiBobbyRFilterArmour[2]);
|
|
break;
|
|
case ARMOURCLASS_PLATE:
|
|
DisableButton(guiBobbyRFilterArmour[3]);
|
|
break;
|
|
}
|
|
|
|
//if (iNewButton != iOldButton)
|
|
//{
|
|
// if (iNewButton > -1)
|
|
// {
|
|
// // Disable new Button
|
|
// DisableButton(guiBobbyRFilterArmor[iNewButton]);
|
|
// }
|
|
|
|
// if (iOldButton > -1)
|
|
// {
|
|
// // Enable old Button
|
|
// EnableButton(guiBobbyRFilterArmor[iOldButton]);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
void UpdateMiscFilterButtons()
|
|
{
|
|
EnableButton(guiBobbyRFilterMisc[0]);
|
|
EnableButton(guiBobbyRFilterMisc[1]);
|
|
EnableButton(guiBobbyRFilterMisc[2]);
|
|
EnableButton(guiBobbyRFilterMisc[3]);
|
|
EnableButton(guiBobbyRFilterMisc[4]);
|
|
EnableButton(guiBobbyRFilterMisc[5]);
|
|
EnableButton(guiBobbyRFilterMisc[6]);
|
|
EnableButton(guiBobbyRFilterMisc[7]);
|
|
if(guiBobbyRFilterMisc[8])
|
|
EnableButton(guiBobbyRFilterMisc[8]);
|
|
EnableButton(guiBobbyRFilterMisc[9]);
|
|
EnableButton(guiBobbyRFilterMisc[10]); // Madd: New BR filter options
|
|
EnableButton(guiBobbyRFilterMisc[11]);
|
|
EnableButton(guiBobbyRFilterMisc[12]);
|
|
EnableButton(guiBobbyRFilterMisc[13]);
|
|
EnableButton(guiBobbyRFilterMisc[14]);
|
|
EnableButton(guiBobbyRFilterMisc[15]);
|
|
|
|
switch (guiCurrentMiscFilterMode)
|
|
{
|
|
case IC_BLADE:
|
|
DisableButton(guiBobbyRFilterMisc[0]);
|
|
break;
|
|
case IC_THROWING_KNIFE:
|
|
DisableButton(guiBobbyRFilterMisc[1]);
|
|
break;
|
|
case IC_PUNCH:
|
|
DisableButton(guiBobbyRFilterMisc[2]);
|
|
break;
|
|
case IC_GRENADE:
|
|
DisableButton(guiBobbyRFilterMisc[3]);
|
|
break;
|
|
case IC_BOMB:
|
|
DisableButton(guiBobbyRFilterMisc[4]);
|
|
break;
|
|
case IC_MEDKIT:
|
|
DisableButton(guiBobbyRFilterMisc[5]);
|
|
break;
|
|
case IC_KIT:
|
|
DisableButton(guiBobbyRFilterMisc[6]);
|
|
break;
|
|
case IC_FACE:
|
|
DisableButton(guiBobbyRFilterMisc[7]);
|
|
break;
|
|
case IC_LBEGEAR:
|
|
DisableButton(guiBobbyRFilterMisc[8]);
|
|
break;
|
|
case IC_MISC:
|
|
// Madd: new BR filters
|
|
if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_OPTICS)
|
|
DisableButton(guiBobbyRFilterMisc[9]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_SIDE_BOTTOM)
|
|
DisableButton(guiBobbyRFilterMisc[10]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_MUZZLE)
|
|
DisableButton(guiBobbyRFilterMisc[11]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_STOCK)
|
|
DisableButton(guiBobbyRFilterMisc[12]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_INTERNAL)
|
|
DisableButton(guiBobbyRFilterMisc[13]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_OTHER_ATTACHMENTS)
|
|
DisableButton(guiBobbyRFilterMisc[14]);
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_NO_ATTACHMENTS)
|
|
DisableButton(guiBobbyRFilterMisc[15]);
|
|
break;
|
|
}
|
|
|
|
//if (iNewButton != iOldButton)
|
|
//{
|
|
// if (iNewButton > -1)
|
|
// {
|
|
// // Disable new Button
|
|
// DisableButton(guiBobbyRFilterMisc[iNewButton]);
|
|
// }
|
|
|
|
// if (iOldButton > -1)
|
|
// {
|
|
// // Enable old Button
|
|
// EnableButton(guiBobbyRFilterMisc[iOldButton]);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
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<gGameExternalOptions.ubBobbyRayMaxPurchaseAmount; 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;
|
|
BOOLEAN bCntItem = FALSE;
|
|
UINT32 usItemIndex = 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++)
|
|
{
|
|
bCntItem = FALSE;
|
|
|
|
if (guiCurrentUsedFilterMode == -1)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
usItemIndex = pInv[ i ].usItemIndex;
|
|
|
|
switch (guiCurrentUsedFilterMode)
|
|
{
|
|
case IC_BOBBY_GUN:
|
|
if (Item[usItemIndex].usItemClass == IC_GUN ||
|
|
Item[usItemIndex].usItemClass == IC_LAUNCHER)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
break;
|
|
case IC_AMMO:
|
|
if (Item[usItemIndex].usItemClass == IC_AMMO)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
break;
|
|
case IC_ARMOUR:
|
|
if (Item[usItemIndex].usItemClass == IC_ARMOUR)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
break;
|
|
case IC_LBEGEAR:
|
|
if (Item[usItemIndex].usItemClass == IC_LBEGEAR)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
break;
|
|
case IC_BOBBY_MISC:
|
|
if (Item[usItemIndex].usItemClass == IC_BLADE ||
|
|
Item[usItemIndex].usItemClass == IC_THROWING_KNIFE ||
|
|
Item[usItemIndex].usItemClass == IC_PUNCH ||
|
|
Item[usItemIndex].usItemClass == IC_GRENADE ||
|
|
Item[usItemIndex].usItemClass == IC_BOMB ||
|
|
Item[usItemIndex].usItemClass == IC_MISC ||
|
|
Item[usItemIndex].usItemClass == IC_MEDKIT ||
|
|
Item[usItemIndex].usItemClass == IC_KIT ||
|
|
Item[usItemIndex].usItemClass == IC_FACE)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//If we have some of the inventory on hand
|
|
if( pInv[ i ].ubQtyOnHand != 0 )
|
|
{
|
|
if (bCntItem == TRUE)
|
|
{
|
|
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++)
|
|
{
|
|
bCntItem = FALSE;
|
|
|
|
if( Item[ pInv[ i ].usItemIndex ].usItemClass & uiItemClass )
|
|
{
|
|
if (uiItemClass == IC_BOBBY_GUN)
|
|
{
|
|
if (guiCurrentGunFilterMode == -1)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
|
|
if (Weapon[ Item[usItemIndex].ubClassIndex ].ubWeaponType == guiCurrentGunFilterMode)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else if (uiItemClass == IC_AMMO)
|
|
{
|
|
if (guiCurrentAmmoFilterMode == -1)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
|
|
if (IsAmmoMatchinWeaponType(usItemIndex, guiCurrentAmmoFilterMode))
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
|
|
}
|
|
}
|
|
else if (uiItemClass == IC_ARMOUR)
|
|
{
|
|
if (guiCurrentArmourFilterMode == -1)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
|
|
if (Armour[ Item[usItemIndex].ubClassIndex ].ubArmourClass == guiCurrentArmourFilterMode)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else if (uiItemClass == IC_BOBBY_MISC)
|
|
{
|
|
if (guiCurrentMiscFilterMode == -1)
|
|
{
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
if (Item[usItemIndex].usItemClass == guiCurrentMiscFilterMode)
|
|
{
|
|
if (guiCurrentMiscSubFilterMode > -1) // Madd: new BR filter options
|
|
{
|
|
if (Item[usItemIndex].attachment && Item[usItemIndex].attachmentclass & guiCurrentMiscSubFilterMode)
|
|
bCntItem = TRUE;
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_OTHER_ATTACHMENTS && !(Item[usItemIndex].attachmentclass & BR_MISC_FILTER_STD_ATTACHMENTS) && Item[usItemIndex].attachment)
|
|
bCntItem = TRUE;
|
|
else if (guiCurrentMiscSubFilterMode == BR_MISC_FILTER_NO_ATTACHMENTS && !Item[usItemIndex].attachment)
|
|
bCntItem = TRUE;
|
|
}
|
|
else
|
|
bCntItem = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
//If we have some of the inventory on hand
|
|
if( pInv[ i ].ubQtyOnHand != 0 )
|
|
{
|
|
if (bCntItem == TRUE)
|
|
{
|
|
if( gubCurPage == 0 )
|
|
{
|
|
gusCurWeaponIndex = i;
|
|
break;
|
|
}
|
|
|
|
if( usNumItems <= ( gubCurPage * 4 ) )
|
|
gusCurWeaponIndex = i;
|
|
|
|
usNumItems++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOLEAN IsAmmoMatchinWeaponType(UINT16 usItemIndex, UINT8 ubWeaponType)
|
|
{
|
|
BOOLEAN bRetValue = FALSE;
|
|
|
|
for ( UINT32 i = 0; i < gMAXITEMS_READ; ++i )
|
|
{
|
|
if (Item[i].usItemClass != IC_GUN )
|
|
continue;
|
|
|
|
// We found the Weapon that uses this Ammo
|
|
if (Magazine[ Item[ usItemIndex ].ubClassIndex ].ubCalibre == Weapon[i].ubCalibre)
|
|
{
|
|
// Weapon has the correct filter ammo weapon type
|
|
if (Weapon[i].ubWeaponType == ubWeaponType)
|
|
{
|
|
//Weapon has correct magazine size
|
|
if(Magazine[ Item[ usItemIndex ].ubClassIndex ].ubMagType >= AMMO_BOX || (Magazine[ Item[ usItemIndex ].ubClassIndex ].ubMagType < AMMO_BOX && Weapon[i].ubMagSize == Magazine[Item[usItemIndex].ubClassIndex].ubMagSize ))
|
|
{
|
|
bRetValue = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return bRetValue;
|
|
}
|
|
|
|
|
|
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
|
|
UINT8 invsize = Menptr[ ubMercCount ].inv.size();
|
|
for( ubPocketCount=0; ubPocketCount<invsize; ++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
|
|
|
|
void HandleBobbyRGunsKeyBoardInput()
|
|
{
|
|
InputAtom InputEvent;
|
|
BOOLEAN fCtrl, fAlt;
|
|
|
|
fCtrl = _KeyDown( CTRL );
|
|
fAlt = _KeyDown( ALT );
|
|
|
|
//while (DequeueSpecificEvent(&InputEvent, KEY_DOWN |KEY_REPEAT) == TRUE)
|
|
while (DequeueEvent(&InputEvent) == TRUE)
|
|
{
|
|
if( InputEvent.usEvent == KEY_DOWN )
|
|
{
|
|
switch (InputEvent.usParam)
|
|
{
|
|
case LEFTARROW:
|
|
case 'a':
|
|
// previous page
|
|
if( gubCurPage > 0 )
|
|
{
|
|
if( fCtrl )
|
|
gubCurPage = 0;
|
|
else
|
|
gubCurPage--;
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case RIGHTARROW:
|
|
case 'd':
|
|
// next page
|
|
if( gubCurPage < gubNumPages - 1 )
|
|
{
|
|
if( fCtrl )
|
|
gubCurPage = gubNumPages - 1;
|
|
else
|
|
gubCurPage++;
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case SHIFT_LEFTARROW:
|
|
case 'A':
|
|
// jump to 10 pages back
|
|
if( gubCurPage > 0 )
|
|
{
|
|
if( fCtrl )
|
|
gubCurPage = 0;
|
|
else
|
|
gubCurPage = __max(gubCurPage - 10, 0);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case SHIFT_RIGHTARROW:
|
|
case 'D':
|
|
// jump to 10 pages forward
|
|
if( gubCurPage < gubNumPages - 1 )
|
|
{
|
|
if( fCtrl )
|
|
gubCurPage = gubNumPages - 1;
|
|
else
|
|
gubCurPage = __min(gubNumPages - 1, gubCurPage + 10);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case ENTER:
|
|
case 'e':
|
|
// order form
|
|
guiCurrentLaptopMode = LAPTOP_MODE_BOBBY_R_MAILORDER;
|
|
break;
|
|
case '1':
|
|
// 1st item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '2':
|
|
// 2nd item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 2 ) ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '3':
|
|
// 3rd item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 3 ) ) ) ) {
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '4':
|
|
// 4th item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages -1 ) && ( gubNumPagesMod == 0 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '!':
|
|
// 1st item on screen all at once
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], TRUE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], TRUE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '@':
|
|
// 2nd item on screen all at once
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 2 ) ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], TRUE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], TRUE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '#':
|
|
// 3rd item on screen all at once
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 3 ) ) ) ) {
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], TRUE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], TRUE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '$':
|
|
// 4th item on screen all at once
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages -1 ) && ( gubNumPagesMod == 0 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], TRUE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], TRUE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
default:
|
|
HandleKeyBoardShortCutsForLapTop( InputEvent.usEvent, InputEvent.usParam, InputEvent.usKeyState );
|
|
break;
|
|
}
|
|
}
|
|
else if( InputEvent.usEvent == KEY_REPEAT )
|
|
{
|
|
switch( InputEvent.usParam )
|
|
{
|
|
case LEFTARROW:
|
|
case 'a':
|
|
// previous page
|
|
if( gubCurPage > 0 )
|
|
gubCurPage--;
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case RIGHTARROW:
|
|
case 'd':
|
|
// next page
|
|
if( gubCurPage < gubNumPages - 1 )
|
|
gubCurPage++;
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case SHIFT_LEFTARROW:
|
|
case 'A':
|
|
// jump to 10 pages back
|
|
if( gubCurPage > 0 )
|
|
gubCurPage = __max(gubCurPage - 10, 0);
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case SHIFT_RIGHTARROW:
|
|
case 'D':
|
|
// jump to 10 pages forward
|
|
if( gubCurPage < gubNumPages - 1 )
|
|
gubCurPage = __min(gubNumPages - 1, gubCurPage + 10);
|
|
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '1':
|
|
// 1st item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 0 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '2':
|
|
// 2nd item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 2 ) ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 1 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '3':
|
|
// 3rd item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages - 1 ) && ( ( gubNumPagesMod == 0 ) || ( gubNumPagesMod >= 3 ) ) ) ) {
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 2 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
case '4':
|
|
// 4th item on screen
|
|
if( ( ( gubNumPages > 0 ) && ( gubCurPage != gubNumPages - 1 ) ) ||
|
|
( ( gubCurPage == gubNumPages -1 ) && ( gubNumPagesMod == 0 ) ) )
|
|
{
|
|
if( fCtrl )
|
|
UnPurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], FALSE);
|
|
else
|
|
PurchaseBobbyRayItem(gusItemNumberForItemsOnScreen[ 3 ], FALSE);
|
|
}
|
|
fReDrawScreenFlag = TRUE;
|
|
fPausedReDrawScreenFlag = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
extern void HandleDefaultEvent(InputAtom *Event);
|
|
HandleDefaultEvent(&InputEvent);
|
|
}
|
|
}
|
|
}
|
|
|
|
void GetHelpTextForItemInLaptop( STR16 pzStr, UINT16 usItemNumber )
|
|
{
|
|
CHAR16 zItemName[ SIZE_ITEM_NAME ];
|
|
UINT8 ubItemCount=0;
|
|
|
|
//get item weight
|
|
FLOAT fWeight = GetWeightBasedOnMetricOption(Item[ usItemNumber ].ubWeight)/10;
|
|
|
|
switch( Item[ usItemNumber ].usItemClass )
|
|
{
|
|
case IC_GUN:
|
|
{
|
|
// HEADROCK HAM 3.6: Can now take a negative modifier.
|
|
//UINT16 gunDamage = (UINT16)( Weapon[ usItemNumber ].ubImpact + ( (double) Weapon[ usItemNumber ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
|
|
UINT16 gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ usItemNumber ].ubImpact );
|
|
// modify by ini values
|
|
gunDamage *= gItemSettings.fDamageModifierGun[ Weapon[ usItemNumber ].ubWeaponType ];
|
|
UINT16 readyAPs = (UINT16)(( Weapon[ usItemNumber ].ubReadyTime * (100 - Item[ usItemNumber ].percentreadytimeapreduction)) / 100);
|
|
UINT16 gunRange = (UINT16)GetModifiedGunRange(usItemNumber);
|
|
|
|
//Calculate AP's
|
|
CHAR16 apStr[20];
|
|
CHAR16 apStr2[20];
|
|
OBJECTTYPE pObject;
|
|
|
|
// HEADROCK HAM 3: Variables for "Possible Attachment List"
|
|
BOOLEAN fAttachmentsFound = FALSE;
|
|
// Contains entire string of attachment names
|
|
CHAR16 attachStr[3900];
|
|
// Contains current attachment string
|
|
CHAR16 attachStr2[100];
|
|
// Contains temporary attachment list before added to string constant from text.h
|
|
CHAR16 attachStr3[3900];
|
|
UINT16 usAttachment;
|
|
|
|
CreateItem(usItemNumber, 100, &pObject);
|
|
INT16 ubAttackAPs = BaseAPsToShootOrStab( APBPConstants[DEFAULT_APS], APBPConstants[DEFAULT_AIMSKILL], &pObject, NULL );
|
|
|
|
if ( Weapon[ usItemNumber ].NoSemiAuto )
|
|
swprintf( apStr, L"-" );
|
|
else
|
|
swprintf( apStr, L"%d", ubAttackAPs );
|
|
|
|
if (GetShotsPerBurst(&pObject) > 0)
|
|
{
|
|
swprintf( apStr2, L" / %d", ubAttackAPs + CalcAPsToBurst( APBPConstants[DEFAULT_APS], &pObject, NULL ) );
|
|
wcscat( apStr, apStr2 );
|
|
}
|
|
else
|
|
wcscat( apStr, L" / -" );
|
|
|
|
if (GetAutofireShotsPerFiveAPs(&pObject) > 0)
|
|
{
|
|
swprintf( apStr2, L" / %d", ubAttackAPs + CalcAPsToAutofire( APBPConstants[DEFAULT_APS], &pObject, 3, NULL ) );
|
|
wcscat( apStr, apStr2 );
|
|
}
|
|
else
|
|
wcscat( apStr, L" / -" );
|
|
|
|
// HEADROCK HAM 3: Empty these strings first, to avoid crashes. Please keep this here.
|
|
swprintf( attachStr, L"" );
|
|
swprintf( attachStr2, L"" );
|
|
swprintf( attachStr3, L"" );
|
|
|
|
// HEADROCK HAM 3: Generate list of possible attachments to a gun (Guns only!)
|
|
if (gGameExternalOptions.fBobbyRayTooltipsShowAttachments)
|
|
{
|
|
UINT16 iLoop = 0;
|
|
// Check entire attachment list
|
|
while( 1 )
|
|
{
|
|
//Madd: Common Attachment Framework
|
|
//TODO: Note that the items in this list will be duplicated if they are present in both the CAF and the old attachment method
|
|
//need to refactor this to work more like the NAS attachment slots method
|
|
usAttachment = 0;
|
|
if ( IsAttachmentPointAvailable(Item[usItemNumber].uiIndex, iLoop) )
|
|
{
|
|
usAttachment = iLoop;
|
|
// If the attachment is not hidden
|
|
if (usAttachment > 0 && !Item[ usAttachment ].hiddenaddon && !Item[ usAttachment ].hiddenattachment)
|
|
{
|
|
if (wcslen( attachStr3 ) + wcslen(Item[usAttachment].szItemName) > 3800)
|
|
{
|
|
// End list early to avoid stack overflow
|
|
wcscat( attachStr3, L"\n..." );
|
|
break;
|
|
}
|
|
else
|
|
{// Add the attachment's name to the list.
|
|
fAttachmentsFound = TRUE;
|
|
swprintf( attachStr2, L"\n%s", Item[ usAttachment ].szItemName );
|
|
wcscat( attachStr3, attachStr2);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Is the weapon we're checking the same as the one we're tooltipping?
|
|
usAttachment = 0;
|
|
if (Attachment[iLoop][1] == Item[usItemNumber].uiIndex)
|
|
{
|
|
usAttachment = Attachment[iLoop][0];
|
|
}
|
|
|
|
// If the attachment is not hidden
|
|
if (usAttachment > 0 && !Item[ usAttachment ].hiddenaddon && !Item[ usAttachment ].hiddenattachment)
|
|
{
|
|
if (wcslen( attachStr3 ) + wcslen(Item[usAttachment].szItemName) > 3800)
|
|
{
|
|
// End list early to avoid stack overflow
|
|
wcscat( attachStr3, L"\n..." );
|
|
break;
|
|
}
|
|
else
|
|
{// Add the attachment's name to the list.
|
|
fAttachmentsFound = TRUE;
|
|
swprintf( attachStr2, L"\n%s", Item[ usAttachment ].szItemName );
|
|
wcscat( attachStr3, attachStr2);
|
|
}
|
|
}
|
|
|
|
|
|
iLoop++;
|
|
if (Attachment[iLoop][0] == 0 && Item[iLoop].usItemClass == 0)
|
|
{
|
|
// Reached end of list
|
|
break;
|
|
}
|
|
}
|
|
if (fAttachmentsFound)
|
|
{
|
|
// Add extra empty line and attachment list title
|
|
swprintf( attachStr, L"\n \n%s", gWeaponStatsDesc[ 14 ] );
|
|
wcscat( attachStr, attachStr3 );
|
|
}
|
|
}
|
|
|
|
//Sum up default attachments.
|
|
BOOLEAN fFoundDefault = FALSE;
|
|
swprintf( attachStr2, L"" );
|
|
swprintf( attachStr3, L"" );
|
|
for(UINT8 cnt = 0; cnt < MAX_DEFAULT_ATTACHMENTS; cnt++){
|
|
if(Item[usItemNumber].defaultattachments[cnt] != 0){
|
|
if (wcslen( attachStr ) + wcslen(attachStr3) + wcslen(Item[ Item[usItemNumber].defaultattachments[cnt] ].szItemName) > 3800)
|
|
{
|
|
// End list early to avoid stack overflow
|
|
wcscat( attachStr3, L"\n..." );
|
|
break;
|
|
}
|
|
fFoundDefault = TRUE;
|
|
swprintf( attachStr2, L"\n%s", Item[ Item[usItemNumber].defaultattachments[cnt] ].szItemName );
|
|
wcscat( attachStr3, attachStr2 );
|
|
} else {
|
|
//If we found an empty entry, we can assume the rest will be empty too.
|
|
break;
|
|
}
|
|
}
|
|
if(fFoundDefault){
|
|
//Found at least one default attachment, write it to the attachment string.
|
|
CHAR16 defaultStr[50];
|
|
swprintf( defaultStr, L"\n \n%s", gWeaponStatsDesc[ 17 ] );
|
|
wcscat( attachStr, defaultStr );
|
|
wcscat( attachStr, attachStr3 );
|
|
}
|
|
|
|
// HEADROCK HAM 3: Added last string (attachStr), for display of the possible attachment list.
|
|
// If the feature is deactivated, the attachStr will simply be empty at this point
|
|
// (remember? we emptied it earlier!).
|
|
INT8 accuracy = (UsingNewCTHSystem()==true?Weapon[ usItemNumber ].nAccuracy:Weapon[ usItemNumber ].bAccuracy);
|
|
swprintf( pzStr, L"%s (%s)\n%s %d\n%s %d\n%s %d\n%s (%d) %s\n%s %1.1f %s%s",
|
|
ItemNames[ usItemNumber ],
|
|
AmmoCaliber[ Weapon[ usItemNumber ].ubCalibre ],
|
|
gWeaponStatsDesc[ 9 ], //Accuracy String
|
|
accuracy, //Accuracy
|
|
gWeaponStatsDesc[ 11 ], //Damage String
|
|
gunDamage, //Gun damage
|
|
gWeaponStatsDesc[ 10 ], //Range String
|
|
gGameSettings.fOptions[ TOPTION_SHOW_WEAPON_RANGE_IN_TILES ] ? gunRange/10 : gunRange, //Gun Range
|
|
gWeaponStatsDesc[ 6 ], //AP String
|
|
readyAPs,
|
|
apStr, //AP's
|
|
gWeaponStatsDesc[ 12 ], //Weight String
|
|
fWeight, //Weight
|
|
GetWeightUnitString(), //Weight units
|
|
attachStr
|
|
);
|
|
}
|
|
break;
|
|
|
|
case IC_LAUNCHER:
|
|
{
|
|
// HEADROCK HAM 3.6: Can now take a negative modifier.
|
|
UINT16 gunDamage = (UINT16)GetModifiedGunDamage( Weapon[ usItemNumber ].ubImpact );
|
|
UINT16 readyAPs = (UINT16)(( Weapon[ usItemNumber ].ubReadyTime * (100 - Item[ usItemNumber ].percentreadytimeapreduction)) / 100);
|
|
UINT16 usRange = (UINT16)GetModifiedGunRange(usItemNumber);
|
|
INT8 accuracy = (UsingNewCTHSystem()==true?Weapon[ usItemNumber ].nAccuracy:Weapon[ usItemNumber ].bAccuracy);
|
|
//UINT16 gunDamage = (UINT16)( Weapon[ usItemNumber ].ubImpact + ( (double) Weapon[ usItemNumber ].ubImpact / 100) * gGameExternalOptions.ubGunDamageMultiplier );
|
|
|
|
//Calculate AP's
|
|
CHAR16 apStr[20];
|
|
CHAR16 apStr2[20];
|
|
OBJECTTYPE pObject;
|
|
|
|
CreateItem(usItemNumber, 100, &pObject);
|
|
INT16 ubAttackAPs = BaseAPsToShootOrStab( APBPConstants[DEFAULT_APS], APBPConstants[DEFAULT_AIMSKILL], &pObject, NULL );
|
|
|
|
if ( Weapon[ usItemNumber ].NoSemiAuto )
|
|
swprintf( apStr, L"-" );
|
|
else
|
|
swprintf( apStr, L"%d", ubAttackAPs );
|
|
|
|
if (GetShotsPerBurst(&pObject) > 0)
|
|
{
|
|
swprintf( apStr2, L" / %d", ubAttackAPs + CalcAPsToBurst( APBPConstants[DEFAULT_APS], &pObject, NULL ) );
|
|
wcscat( apStr, apStr2 );
|
|
}
|
|
else
|
|
wcscat( apStr, L" / -" );
|
|
|
|
if (GetAutofireShotsPerFiveAPs(&pObject) > 0)
|
|
{
|
|
swprintf( apStr2, L" / %d", ubAttackAPs + CalcAPsToAutofire( APBPConstants[DEFAULT_APS], &pObject, 3, NULL ) );
|
|
wcscat( apStr, apStr2 );
|
|
}
|
|
else
|
|
wcscat( apStr, L" / -" );
|
|
|
|
swprintf( pzStr, L"%s\n%s %d\n%s %d\n%s %d\n%s (%d) %s\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ],
|
|
gWeaponStatsDesc[ 9 ], //Accuracy String
|
|
accuracy, //Accuracy
|
|
gWeaponStatsDesc[ 11 ], //Damage String
|
|
gunDamage, //Gun damage
|
|
gWeaponStatsDesc[ 10 ], //Range String
|
|
gGameSettings.fOptions[ TOPTION_SHOW_WEAPON_RANGE_IN_TILES ] ? usRange/10 : usRange, //Gun Range
|
|
gWeaponStatsDesc[ 6 ], //AP String
|
|
readyAPs,
|
|
apStr, //AP's
|
|
gWeaponStatsDesc[ 12 ], //Weight String
|
|
fWeight, //Weight
|
|
GetWeightUnitString() //Weight units
|
|
);
|
|
}
|
|
break;
|
|
|
|
case IC_BLADE:
|
|
case IC_THROWING_KNIFE:
|
|
case IC_PUNCH:
|
|
{
|
|
// HEADROCK HAM 3.6: Can now take a negative modifier
|
|
//UINT16 meleeDamage = (UINT16)( Weapon[ usItemNumber ].ubImpact + ( (double) Weapon[ usItemNumber ].ubImpact / 100) * gGameExternalOptions.ubMeleeDamageMultiplier );
|
|
//UINT16 meleeDamage = (UINT16)GetModifiedMeleeDamage( Weapon[ usItemNumber ].ubImpact );
|
|
OBJECTTYPE pObject;
|
|
|
|
CreateItem(usItemNumber, 100, &pObject);
|
|
swprintf( pzStr, L"%s\n%s %d\n%s %d\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ],
|
|
gWeaponStatsDesc[ 11 ], //Damage String
|
|
GetDamage(&pObject), //Melee damage
|
|
gWeaponStatsDesc[ 6 ], //AP String
|
|
BaseAPsToShootOrStab( APBPConstants[DEFAULT_APS], APBPConstants[DEFAULT_AIMSKILL], &pObject, NULL ), //AP's
|
|
gWeaponStatsDesc[ 12 ], //Weight String
|
|
fWeight, //Weight
|
|
GetWeightUnitString() //Weight units
|
|
);
|
|
}
|
|
break;
|
|
|
|
case IC_AMMO:
|
|
{
|
|
swprintf( pzStr, L"%s\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ], //Item long name
|
|
gWeaponStatsDesc[ 12 ], //Weight String
|
|
fWeight, //Weight
|
|
GetWeightUnitString() //Weight units
|
|
);
|
|
|
|
//Lal: do not delete, commented out for next version
|
|
//swprintf( pzStr, 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)[0]->data.ubShotsLeft, //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( usItemNumber );
|
|
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( pzStr, zItemName );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IC_GRENADE:
|
|
case IC_BOMB:
|
|
// explosives
|
|
//if ( (Item[ usItemNumber ].usItemClass == IC_GRENADE)||(Item[ usItemNumber ].usItemClass == IC_BOMB) )
|
|
{
|
|
// HEADROCK HAM 3.6: Can now use negative modifier.
|
|
//UINT16 explDamage = (UINT16)( Explosive[Item[ usItemNumber ].ubClassIndex].ubDamage + ( (double) Explosive[Item[ usItemNumber ].ubClassIndex].ubDamage / 100) * gGameExternalOptions.bExplosivesDamageModifier );
|
|
//UINT16 explStunDamage = (UINT16)( Explosive[Item[ usItemNumber ].ubClassIndex].ubStunDamage + ( (double) Explosive[Item[ usItemNumber ].ubClassIndex].ubStunDamage / 100) * gGameExternalOptions.ubExplosivesDamageMultiplier );
|
|
UINT16 explDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usItemNumber ].ubClassIndex].ubDamage, 0 );
|
|
UINT16 explStunDamage = (UINT16) GetModifiedExplosiveDamage( Explosive[Item[ usItemNumber ].ubClassIndex].ubStunDamage, 1 );
|
|
|
|
|
|
swprintf( pzStr, L"%s\n%s %d\n%s %d\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ],
|
|
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[ usItemNumber ].usItemClass == IC_ARMOUR)
|
|
{
|
|
INT32 iProtection = Armour[ Item[ usItemNumber ].ubClassIndex ].ubProtection;
|
|
|
|
switch( Armour[ Item[ usItemNumber ].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( pzStr, L"%s\n%s %d%% (%d)\n%s %d%%\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ], //Item long name
|
|
pInvPanelTitleStrings[ 4 ], //Protection string
|
|
iProtection, //Protection rating in % based on best armor
|
|
Armour[ Item[ usItemNumber ].ubClassIndex ].ubProtection, //Protection (raw data)
|
|
pInvPanelTitleStrings[ 3 ], //Camo string
|
|
Item[ usItemNumber ].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( pzStr, L"%s\n%s %1.1f %s",
|
|
ItemNames[ usItemNumber ], //Item long name
|
|
gWeaponStatsDesc[ 12 ], //Weight String
|
|
fWeight, //Weight
|
|
GetWeightUnitString() //Weight units
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
}
|