mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Added missing #includes Added LUA scripting and console Changed the way tracers are visualized, so they work more like real tracers instead of a light fountain Fixed signedness of many grid variables used in GetMouseMapPos calls Fixed enemy weapon choosing: Sometimes a mortar is chosen but later rejected, but the grenade class was not reset. Caused assertion failure Added checks so enemies don't try to chuck RPG grenades with their hands Now possible to shoot a someone in the head if he's in water Fixed InitSightArrays to also clear soldier interrupt duel points. This was causing an assertion failure elsewhere in the code because the interrupt list still had soldiers on it sometimes when this function was called. Soldiers are much less willing to forfeit their turn over an attempt to use more APs than they have Removed early setting of muzzle flash. This would allow enemies to get an interrupt before you even fired. Fixed item dropping by AI. If AI tried to drop something while standing it would cause deadlock Change to greatly speed up closing the sector inventory window in an unloaded sector Added conditional compile flag to always give robot weapon ready advantage, even for 360 degree sighting Check builddefines.h for the conditional flags. Of greatest interest might be LUA_CONSOLE. This will cause the game to bring up a command console when run. However this console is severely lacking in many areas. If anybody knows of an open-source terminal/console that could be used instead, it would be appreciated. The existing console does bad things when you try to close it, and since it counts as a separate app, it pauses the game while it has focus. LUA scripting is very limited, basically just proof of concept. There is one global variable, the Soldiers array. An array index gives you the soldier in that slot in the currently loaded sector. The soldier has a few things that can be accessed: name (short name); fullname (long name); grid (current grid #, can be changed); walkto(grid) (function to walk to another grid); runto(grid) (function to run to another grid) git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@924 3b4a5df2-a311-0410-b5c6-a8a6f20db521
921 lines
32 KiB
C++
921 lines
32 KiB
C++
#ifdef PRECOMPILEDHEADERS
|
|
#include "Laptop All.h"
|
|
#else
|
|
#include "laptop.h"
|
|
#include "BobbyR.h"
|
|
#include "BobbyRGuns.h"
|
|
#include "Utilities.h"
|
|
#include "WCheck.h"
|
|
#include "WordWrap.h"
|
|
#include "Cursors.h"
|
|
#include "interface items.h"
|
|
#include "Weapons.h"
|
|
#include "Store Inventory.h"
|
|
#include "Game Event Hook.h"
|
|
#include "Game Clock.h"
|
|
#include "LaptopSave.h"
|
|
#include "Random.h"
|
|
#include "Text.h"
|
|
#include "Multi Language Graphic Utils.h"
|
|
// #include "Utility.h"
|
|
#include "armsdealerinvinit.h"
|
|
#include "GameSettings.h"
|
|
#include "message.h"
|
|
#endif
|
|
|
|
|
|
#ifdef JA2TESTVERSION
|
|
#define BR_INVENTORY_TURNOVER_DEBUG
|
|
#endif
|
|
|
|
|
|
#define BOBBIES_SIGN_FONT FONT14ARIAL
|
|
#define BOBBIES_SIGN_COLOR 2
|
|
#define BOBBIES_SIGN_BACKCOLOR FONT_MCOLOR_BLACK
|
|
#define BOBBIES_SIGN_BACKGROUNDCOLOR 78
|
|
|
|
#define BOBBIES_NUMBER_SIGNS 5
|
|
|
|
#define BOBBIES_SENTENCE_FONT FONT12ARIAL
|
|
#define BOBBIES_SENTENCE_COLOR FONT_MCOLOR_WHITE
|
|
#define BOBBIES_SENTENCE_BACKGROUNDCOLOR 2
|
|
|
|
#define BOBBY_WOOD_BACKGROUND_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBY_WOOD_BACKGROUND_Y LAPTOP_SCREEN_WEB_UL_Y
|
|
#define BOBBY_WOOD_BACKGROUND_WIDTH 125
|
|
#define BOBBY_WOOD_BACKGROUND_HEIGHT 100
|
|
|
|
#define BOBBY_RAYS_NAME_X LAPTOP_SCREEN_UL_X + 77
|
|
#define BOBBY_RAYS_NAME_Y LAPTOP_SCREEN_WEB_UL_Y + 0
|
|
#define BOBBY_RAYS_NAME_WIDTH 344
|
|
#define BOBBY_RAYS_NAME_HEIGHT 66
|
|
|
|
#define BOBBYS_PLAQUES_X LAPTOP_SCREEN_UL_X + 39
|
|
#define BOBBYS_PLAQUES_Y LAPTOP_SCREEN_WEB_UL_Y + 174
|
|
#define BOBBYS_PLAQUES_WIDTH 414
|
|
#define BOBBYS_PLAQUES_HEIGHT 190
|
|
|
|
#define BOBBIES_TOPHINGE_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBIES_TOPHINGE_Y LAPTOP_SCREEN_WEB_UL_Y + 42
|
|
|
|
#define BOBBIES_BOTTOMHINGE_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBIES_BOTTOMHINGE_Y LAPTOP_SCREEN_WEB_UL_Y + 338
|
|
|
|
#define BOBBIES_STORE_PLAQUE_X LAPTOP_SCREEN_UL_X + 148
|
|
#define BOBBIES_STORE_PLAQUE_Y LAPTOP_SCREEN_WEB_UL_Y + 66
|
|
#define BOBBIES_STORE_PLAQUE_HEIGHT 93
|
|
|
|
#define BOBBIES_HANDLE_X LAPTOP_SCREEN_UL_X + 457
|
|
#define BOBBIES_HANDLE_Y LAPTOP_SCREEN_WEB_UL_Y + 147
|
|
|
|
#define BOBBIES_FIRST_SENTENCE_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBIES_FIRST_SENTENCE_Y BOBBIES_STORE_PLAQUE_Y + BOBBIES_STORE_PLAQUE_HEIGHT - 3
|
|
#define BOBBIES_FIRST_SENTENCE_WIDTH 500
|
|
|
|
#define BOBBIES_2ND_SENTENCE_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBIES_2ND_SENTENCE_Y BOBBIES_FIRST_SENTENCE_Y + 13
|
|
#define BOBBIES_2ND_SENTENCE_WIDTH 500
|
|
|
|
#define BOBBIES_CENTER_SIGN_OFFSET_Y 23
|
|
|
|
#define BOBBIES_USED_SIGN_X BOBBYS_PLAQUES_X + 93
|
|
#define BOBBIES_USED_SIGN_Y BOBBYS_PLAQUES_Y + 32
|
|
#define BOBBIES_USED_SIGN_WIDTH 92
|
|
#define BOBBIES_USED_SIGN_HEIGHT 50
|
|
#define BOBBIES_USED_SIGN_TEXT_OFFSET BOBBIES_USED_SIGN_Y + 10
|
|
|
|
#define BOBBIES_MISC_SIGN_X BOBBYS_PLAQUES_X + 238
|
|
#define BOBBIES_MISC_SIGN_Y BOBBYS_PLAQUES_Y + 27
|
|
#define BOBBIES_MISC_SIGN_WIDTH 103
|
|
#define BOBBIES_MISC_SIGN_HEIGHT 57
|
|
#define BOBBIES_MISC_SIGN_TEXT_OFFSET BOBBIES_MISC_SIGN_Y + BOBBIES_CENTER_SIGN_OFFSET_Y
|
|
|
|
#define BOBBIES_GUNS_SIGN_X BOBBYS_PLAQUES_X + 3
|
|
#define BOBBIES_GUNS_SIGN_Y BOBBYS_PLAQUES_Y + 102
|
|
#define BOBBIES_GUNS_SIGN_WIDTH 116
|
|
#define BOBBIES_GUNS_SIGN_HEIGHT 75
|
|
#define BOBBIES_GUNS_SIGN_TEXT_OFFSET BOBBIES_GUNS_SIGN_Y + BOBBIES_CENTER_SIGN_OFFSET_Y
|
|
|
|
#define BOBBIES_AMMO_SIGN_X BOBBYS_PLAQUES_X + 150
|
|
#define BOBBIES_AMMO_SIGN_Y BOBBYS_PLAQUES_Y + 105
|
|
#define BOBBIES_AMMO_SIGN_WIDTH 112
|
|
#define BOBBIES_AMMO_SIGN_HEIGHT 71
|
|
#define BOBBIES_AMMO_SIGN_TEXT_OFFSET BOBBIES_AMMO_SIGN_Y + BOBBIES_CENTER_SIGN_OFFSET_Y
|
|
|
|
#define BOBBIES_ARMOUR_SIGN_X BOBBYS_PLAQUES_X + 290
|
|
#define BOBBIES_ARMOUR_SIGN_Y BOBBYS_PLAQUES_Y + 108
|
|
#define BOBBIES_ARMOUR_SIGN_WIDTH 114
|
|
#define BOBBIES_ARMOUR_SIGN_HEIGHT 70
|
|
#define BOBBIES_ARMOUR_SIGN_TEXT_OFFSET BOBBIES_ARMOUR_SIGN_Y + BOBBIES_CENTER_SIGN_OFFSET_Y
|
|
|
|
#define BOBBIES_3RD_SENTENCE_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBIES_3RD_SENTENCE_Y BOBBIES_BOTTOMHINGE_Y + 40
|
|
#define BOBBIES_3RD_SENTENCE_WIDTH 500
|
|
|
|
#define BOBBY_R_NEW_PURCHASE_ARRIVAL_TIME (1 * 60 * 24) // minutes in 1 day
|
|
|
|
#define BOBBY_R_USED_PURCHASE_OFFSET MAXITEMS
|
|
|
|
#define BOBBYR_UNDERCONSTRUCTION_ANI_DELAY 150
|
|
#define BOBBYR_UNDERCONSTRUCTION_NUM_FRAMES 5
|
|
|
|
#define BOBBYR_UNDERCONSTRUCTION_X iScreenWidthOffset + 111 + ( 613 - 111 - BOBBYR_UNDERCONSTRUCTION_WIDTH) / 2
|
|
#define BOBBYR_UNDERCONSTRUCTION_Y iScreenHeightOffset + 175
|
|
#define BOBBYR_UNDERCONSTRUCTION1_Y iScreenHeightOffset + 378
|
|
|
|
#define BOBBYR_UNDERCONSTRUCTION_WIDTH 414
|
|
#define BOBBYR_UNDERCONSTRUCTION_HEIGHT 64
|
|
|
|
#define BOBBYR_UNDER_CONSTRUCTION_TEXT_X LAPTOP_SCREEN_UL_X
|
|
#define BOBBYR_UNDER_CONSTRUCTION_TEXT_Y BOBBYR_UNDERCONSTRUCTION_Y + 62 + 60
|
|
#define BOBBYR_UNDER_CONSTRUCTION_TEXT_WIDTH 613 - 111
|
|
|
|
|
|
|
|
UINT32 guiBobbyName;
|
|
UINT32 guiPlaque;
|
|
UINT32 guiTopHinge;
|
|
UINT32 guiBottomHinge;
|
|
UINT32 guiStorePlaque;
|
|
UINT32 guiHandle;
|
|
UINT32 guiWoodBackground;
|
|
UINT32 guiUnderConstructionImage;
|
|
|
|
/*
|
|
UINT16 gusFirstGunIndex;
|
|
UINT16 gusLastGunIndex;
|
|
UINT8 gubNumGunPages;
|
|
|
|
UINT16 gusFirstAmmoIndex;
|
|
UINT16 gusLastAmmoIndex;
|
|
UINT8 gubNumAmmoPages;
|
|
|
|
UINT16 gusFirstMiscIndex;
|
|
UINT16 gusLastMiscIndex;
|
|
UINT8 gubNumMiscPages;
|
|
|
|
UINT16 gusFirstArmourIndex;
|
|
UINT16 gusLastArmourIndex;
|
|
UINT8 gubNumArmourPages;
|
|
|
|
UINT16 gusFirstUsedIndex;
|
|
UINT16 gusLastUsedIndex;
|
|
UINT8 gubNumUsedPages;
|
|
*/
|
|
|
|
UINT32 guiLastBobbyRayPage;
|
|
|
|
|
|
|
|
UINT8 gubBobbyRPages[]={
|
|
LAPTOP_MODE_BOBBY_R_USED,
|
|
LAPTOP_MODE_BOBBY_R_MISC,
|
|
LAPTOP_MODE_BOBBY_R_GUNS,
|
|
LAPTOP_MODE_BOBBY_R_AMMO,
|
|
LAPTOP_MODE_BOBBY_R_ARMOR};
|
|
|
|
|
|
//Bobby's Sign menu mouse regions
|
|
MOUSE_REGION gSelectedBobbiesSignMenuRegion[ BOBBIES_NUMBER_SIGNS ];
|
|
void SelectBobbiesSignMenuRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
|
|
|
|
BOOLEAN InitBobbiesMouseRegion(UINT8 ubNumerRegions, UINT16 *usMouseRegionPosArray, MOUSE_REGION *MouseRegion);
|
|
BOOLEAN RemoveBobbiesMouseRegion(UINT8 ubNumberRegions, MOUSE_REGION *Mouse_Region);
|
|
void HandleBobbyRUnderConstructionAni( BOOLEAN fReset );
|
|
|
|
void SimulateBobbyRayCustomer(STORE_INVENTORY *pInventoryArray, BOOLEAN fUsed);
|
|
|
|
|
|
|
|
void GameInitBobbyR()
|
|
{
|
|
}
|
|
|
|
|
|
BOOLEAN EnterBobbyR()
|
|
{
|
|
VOBJECT_DESC VObjectDesc;
|
|
UINT8 i;
|
|
|
|
// an array of mouse regions for the bobbies signs. Top Left corner, bottom right corner
|
|
UINT16 usMouseRegionPosArray[] = {BOBBIES_USED_SIGN_X, BOBBIES_USED_SIGN_Y, BOBBIES_USED_SIGN_X+BOBBIES_USED_SIGN_WIDTH, BOBBIES_USED_SIGN_Y+BOBBIES_USED_SIGN_HEIGHT,
|
|
BOBBIES_MISC_SIGN_X, BOBBIES_MISC_SIGN_Y, BOBBIES_MISC_SIGN_X+BOBBIES_MISC_SIGN_WIDTH, BOBBIES_MISC_SIGN_Y+BOBBIES_MISC_SIGN_HEIGHT,
|
|
BOBBIES_GUNS_SIGN_X, BOBBIES_GUNS_SIGN_Y, BOBBIES_GUNS_SIGN_X+BOBBIES_GUNS_SIGN_WIDTH, BOBBIES_GUNS_SIGN_Y+BOBBIES_GUNS_SIGN_HEIGHT,
|
|
BOBBIES_AMMO_SIGN_X, BOBBIES_AMMO_SIGN_Y, BOBBIES_AMMO_SIGN_X+BOBBIES_AMMO_SIGN_WIDTH, BOBBIES_AMMO_SIGN_Y+BOBBIES_AMMO_SIGN_HEIGHT,
|
|
BOBBIES_ARMOUR_SIGN_X, BOBBIES_ARMOUR_SIGN_Y, BOBBIES_ARMOUR_SIGN_X+BOBBIES_ARMOUR_SIGN_WIDTH, BOBBIES_ARMOUR_SIGN_Y+BOBBIES_ARMOUR_SIGN_HEIGHT};
|
|
|
|
InitBobbyRWoodBackground();
|
|
|
|
// load the Bobbyname graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
GetMLGFilename( VObjectDesc.ImageFile, MLG_BOBBYNAME );
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiBobbyName));
|
|
|
|
// load the plaque graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BobbyPlaques.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiPlaque));
|
|
|
|
// load the TopHinge graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BobbyTopHinge.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiTopHinge));
|
|
|
|
// load the BottomHinge graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BobbyBottomHinge.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiBottomHinge));
|
|
|
|
// load the Store Plaque graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
GetMLGFilename( VObjectDesc.ImageFile, MLG_STOREPLAQUE );
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiStorePlaque));
|
|
|
|
// load the Handle graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BobbyHandle.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiHandle));
|
|
|
|
|
|
InitBobbiesMouseRegion(BOBBIES_NUMBER_SIGNS, usMouseRegionPosArray, gSelectedBobbiesSignMenuRegion);
|
|
|
|
|
|
if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
// load the Handle graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\UnderConstruction.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiUnderConstructionImage));
|
|
|
|
for(i=0; i<BOBBIES_NUMBER_SIGNS; i++)
|
|
{
|
|
MSYS_DisableRegion( &gSelectedBobbiesSignMenuRegion[i] );
|
|
}
|
|
|
|
LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction = BOBBYR_BEEN_TO_SITE_ONCE;
|
|
}
|
|
|
|
|
|
SetBookMark(BOBBYR_BOOKMARK);
|
|
HandleBobbyRUnderConstructionAni( TRUE );
|
|
|
|
RenderBobbyR();
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
void ExitBobbyR()
|
|
{
|
|
|
|
DeleteVideoObjectFromIndex(guiBobbyName);
|
|
DeleteVideoObjectFromIndex(guiPlaque);
|
|
DeleteVideoObjectFromIndex(guiTopHinge);
|
|
DeleteVideoObjectFromIndex(guiBottomHinge);
|
|
DeleteVideoObjectFromIndex(guiStorePlaque);
|
|
DeleteVideoObjectFromIndex(guiHandle);
|
|
|
|
if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
DeleteVideoObjectFromIndex(guiUnderConstructionImage);
|
|
}
|
|
|
|
|
|
DeleteBobbyRWoodBackground();
|
|
|
|
RemoveBobbiesMouseRegion(BOBBIES_NUMBER_SIGNS, gSelectedBobbiesSignMenuRegion);
|
|
|
|
guiLastBobbyRayPage = LAPTOP_MODE_BOBBY_R;
|
|
}
|
|
|
|
void HandleBobbyR()
|
|
{
|
|
HandleBobbyRUnderConstructionAni( FALSE );
|
|
}
|
|
|
|
void RenderBobbyR()
|
|
{
|
|
HVOBJECT hPixHandle;
|
|
HVOBJECT hStorePlaqueHandle;
|
|
|
|
DrawBobbyRWoodBackground();
|
|
|
|
// Bobby's Name
|
|
GetVideoObject(&hPixHandle, guiBobbyName);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBY_RAYS_NAME_X, BOBBY_RAYS_NAME_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// Plaque
|
|
GetVideoObject(&hPixHandle, guiPlaque);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBYS_PLAQUES_X, BOBBYS_PLAQUES_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// Top Hinge
|
|
GetVideoObject(&hPixHandle, guiTopHinge);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBIES_TOPHINGE_X, BOBBIES_TOPHINGE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// Bottom Hinge
|
|
GetVideoObject(&hPixHandle, guiBottomHinge);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBIES_BOTTOMHINGE_X, BOBBIES_BOTTOMHINGE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// StorePlaque
|
|
GetVideoObject(&hStorePlaqueHandle, guiStorePlaque);
|
|
BltVideoObject(FRAME_BUFFER, hStorePlaqueHandle, 0,BOBBIES_STORE_PLAQUE_X, BOBBIES_STORE_PLAQUE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// Handle
|
|
GetVideoObject(&hPixHandle, guiHandle);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBIES_HANDLE_X, BOBBIES_HANDLE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
/*
|
|
if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
// The undercontsruction graphic
|
|
GetVideoObject(&hPixHandle, guiUnderConstructionImage );
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBIES_FIRST_SENTENCE_X, BOBBIES_FIRST_SENTENCE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,BOBBIES_3RD_SENTENCE_X, BOBBIES_3RD_SENTENCE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
}
|
|
*/
|
|
|
|
SetFontShadow(BOBBIES_SENTENCE_BACKGROUNDCOLOR);
|
|
|
|
|
|
if( LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
//Bobbys first sentence
|
|
// ShadowText( FRAME_BUFFER, BobbyRaysFrontText[BOBBYR_ADVERTISMENT_1], BOBBIES_SENTENCE_FONT, BOBBIES_FIRST_SENTENCE_X, BOBBIES_FIRST_SENTENCE_Y );
|
|
DrawTextToScreen(BobbyRaysFrontText[BOBBYR_ADVERTISMENT_1], BOBBIES_FIRST_SENTENCE_X, BOBBIES_FIRST_SENTENCE_Y, BOBBIES_FIRST_SENTENCE_WIDTH, BOBBIES_SENTENCE_FONT, BOBBIES_SENTENCE_COLOR, BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED | TEXT_SHADOWED );
|
|
|
|
//Bobbys second sentence
|
|
DrawTextToScreen(BobbyRaysFrontText[BOBBYR_ADVERTISMENT_2], BOBBIES_2ND_SENTENCE_X, BOBBIES_2ND_SENTENCE_Y, BOBBIES_2ND_SENTENCE_WIDTH, BOBBIES_SENTENCE_FONT, BOBBIES_SENTENCE_COLOR, BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED | TEXT_SHADOWED );
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
|
|
SetFontShadow(BOBBIES_SIGN_BACKGROUNDCOLOR);
|
|
//Text on the Used Sign
|
|
DisplayWrappedString(BOBBIES_USED_SIGN_X, BOBBIES_USED_SIGN_TEXT_OFFSET, BOBBIES_USED_SIGN_WIDTH-5, 2, BOBBIES_SIGN_FONT, BOBBIES_SIGN_COLOR, BobbyRaysFrontText[BOBBYR_USED], BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED);
|
|
//Text on the Misc Sign
|
|
DisplayWrappedString(BOBBIES_MISC_SIGN_X, BOBBIES_MISC_SIGN_TEXT_OFFSET, BOBBIES_MISC_SIGN_WIDTH, 2, BOBBIES_SIGN_FONT, BOBBIES_SIGN_COLOR, BobbyRaysFrontText[BOBBYR_MISC], BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED);
|
|
//Text on the Guns Sign
|
|
DisplayWrappedString(BOBBIES_GUNS_SIGN_X, BOBBIES_GUNS_SIGN_TEXT_OFFSET, BOBBIES_GUNS_SIGN_WIDTH, 2, BOBBIES_SIGN_FONT, BOBBIES_SIGN_COLOR, BobbyRaysFrontText[BOBBYR_GUNS], BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED);
|
|
//Text on the Ammo Sign
|
|
DisplayWrappedString(BOBBIES_AMMO_SIGN_X, BOBBIES_AMMO_SIGN_TEXT_OFFSET, BOBBIES_AMMO_SIGN_WIDTH, 2, BOBBIES_SIGN_FONT, BOBBIES_SIGN_COLOR, BobbyRaysFrontText[BOBBYR_AMMO], BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED);
|
|
//Text on the Armour Sign
|
|
DisplayWrappedString(BOBBIES_ARMOUR_SIGN_X, BOBBIES_ARMOUR_SIGN_TEXT_OFFSET, BOBBIES_ARMOUR_SIGN_WIDTH, 2, BOBBIES_SIGN_FONT, BOBBIES_SIGN_COLOR, BobbyRaysFrontText[BOBBYR_ARMOR], BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED);
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
|
|
|
|
if( LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
//Bobbys Third sentence
|
|
SetFontShadow(BOBBIES_SENTENCE_BACKGROUNDCOLOR);
|
|
DrawTextToScreen(BobbyRaysFrontText[BOBBYR_ADVERTISMENT_3], BOBBIES_3RD_SENTENCE_X, BOBBIES_3RD_SENTENCE_Y, BOBBIES_3RD_SENTENCE_WIDTH, BOBBIES_SENTENCE_FONT, BOBBIES_SENTENCE_COLOR, BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED | TEXT_SHADOWED );
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
//if we cant go to any sub pages, darken the page out
|
|
if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
{
|
|
ShadowVideoSurfaceRect( FRAME_BUFFER, LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y );
|
|
}
|
|
|
|
RenderWWWProgramTitleBar( );
|
|
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOLEAN InitBobbyRWoodBackground()
|
|
{
|
|
VOBJECT_DESC VObjectDesc;
|
|
|
|
// load the Wood bacground graphic and add it
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\BobbyWood.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiWoodBackground));
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOLEAN DeleteBobbyRWoodBackground()
|
|
{
|
|
DeleteVideoObjectFromIndex(guiWoodBackground);
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN DrawBobbyRWoodBackground()
|
|
{
|
|
HVOBJECT hWoodBackGroundHandle;
|
|
UINT16 x,y, uiPosX, uiPosY;
|
|
|
|
// Blt the Wood background
|
|
GetVideoObject(&hWoodBackGroundHandle, guiWoodBackground);
|
|
|
|
uiPosY = BOBBY_WOOD_BACKGROUND_Y;
|
|
for(y=0; y<4; y++)
|
|
{
|
|
uiPosX = BOBBY_WOOD_BACKGROUND_X;
|
|
for(x=0; x<4; x++)
|
|
{
|
|
BltVideoObject(FRAME_BUFFER, hWoodBackGroundHandle, 0,uiPosX, uiPosY, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
uiPosX += BOBBY_WOOD_BACKGROUND_WIDTH;
|
|
}
|
|
uiPosY += BOBBY_WOOD_BACKGROUND_HEIGHT;
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN InitBobbiesMouseRegion(UINT8 ubNumerRegions, UINT16 *usMouseRegionPosArray, MOUSE_REGION *MouseRegion)
|
|
{
|
|
UINT8 i,ubCount=0;
|
|
|
|
for(i=0; i<ubNumerRegions; i++)
|
|
{
|
|
//Mouse region for the toc buttons
|
|
MSYS_DefineRegion( &MouseRegion[i], usMouseRegionPosArray[ubCount], usMouseRegionPosArray[ubCount+1], usMouseRegionPosArray[ubCount+2], usMouseRegionPosArray[ubCount+3], MSYS_PRIORITY_HIGH,
|
|
CURSOR_WWW, MSYS_NO_CALLBACK, SelectBobbiesSignMenuRegionCallBack);
|
|
MSYS_AddRegion(&MouseRegion[i]);
|
|
MSYS_SetRegionUserData( &MouseRegion[i], 0, gubBobbyRPages[i]);
|
|
|
|
ubCount +=4;
|
|
}
|
|
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN RemoveBobbiesMouseRegion(UINT8 ubNumberRegions, MOUSE_REGION *Mouse_Region)
|
|
{
|
|
UINT8 i;
|
|
|
|
for(i=0; i<ubNumberRegions; i++)
|
|
MSYS_RemoveRegion( &Mouse_Region[i]);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
|
|
void SelectBobbiesSignMenuRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
|
|
}
|
|
else if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
UINT8 ubNewPage = (UINT8)MSYS_GetRegionUserData( pRegion, 0 );
|
|
guiCurrentLaptopMode = ubNewPage;
|
|
// FindLastItemIndex(ubNewPage);
|
|
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
BOOLEAN WebPageTileBackground(UINT8 ubNumX, UINT8 ubNumY, UINT16 usWidth, UINT16 usHeight, UINT32 uiBackground)
|
|
{
|
|
HVOBJECT hBackGroundHandle;
|
|
UINT16 x,y, uiPosX, uiPosY;
|
|
|
|
// Blt the Wood background
|
|
GetVideoObject(&hBackGroundHandle, uiBackground);
|
|
|
|
uiPosY = LAPTOP_SCREEN_WEB_UL_Y;
|
|
for(y=0; y<ubNumY; y++)
|
|
{
|
|
uiPosX = LAPTOP_SCREEN_UL_X;
|
|
for(x=0; x<ubNumX; x++)
|
|
{
|
|
BltVideoObject(FRAME_BUFFER, hBackGroundHandle, 0,uiPosX, uiPosY, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
uiPosX += usWidth;
|
|
}
|
|
uiPosY += usHeight;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
*/
|
|
|
|
|
|
void HandleBobbyRUnderConstructionAni( BOOLEAN fReset )
|
|
{
|
|
HVOBJECT hPixHandle;
|
|
static UINT32 uiLastTime=1;
|
|
static UINT16 usCount=0;
|
|
UINT32 uiCurTime=GetJA2Clock();
|
|
|
|
|
|
if( LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
|
|
return;
|
|
|
|
if( fReset )
|
|
usCount =1;
|
|
|
|
if( fShowBookmarkInfo )
|
|
{
|
|
fReDrawBookMarkInfo = TRUE;
|
|
}
|
|
|
|
if( ( ( uiCurTime - uiLastTime ) > BOBBYR_UNDERCONSTRUCTION_ANI_DELAY )||( fReDrawScreenFlag ) )
|
|
{
|
|
// The undercontsruction graphic
|
|
GetVideoObject(&hPixHandle, guiUnderConstructionImage );
|
|
BltVideoObject(FRAME_BUFFER, hPixHandle, usCount, BOBBYR_UNDERCONSTRUCTION_X, BOBBYR_UNDERCONSTRUCTION_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
BltVideoObject( FRAME_BUFFER, hPixHandle, usCount, BOBBYR_UNDERCONSTRUCTION_X, BOBBYR_UNDERCONSTRUCTION1_Y, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
DrawTextToScreen( BobbyRaysFrontText[ BOBBYR_UNDER_CONSTRUCTION ], BOBBYR_UNDER_CONSTRUCTION_TEXT_X, BOBBYR_UNDER_CONSTRUCTION_TEXT_Y, BOBBYR_UNDER_CONSTRUCTION_TEXT_WIDTH, FONT16ARIAL, BOBBIES_SENTENCE_COLOR, BOBBIES_SIGN_BACKCOLOR, FALSE, CENTER_JUSTIFIED | INVALIDATE_TEXT );
|
|
|
|
InvalidateRegion( BOBBYR_UNDERCONSTRUCTION_X, BOBBYR_UNDERCONSTRUCTION_Y, BOBBYR_UNDERCONSTRUCTION_X+BOBBYR_UNDERCONSTRUCTION_WIDTH, BOBBYR_UNDERCONSTRUCTION_Y+BOBBYR_UNDERCONSTRUCTION_HEIGHT );
|
|
InvalidateRegion( BOBBYR_UNDERCONSTRUCTION_X, BOBBYR_UNDERCONSTRUCTION1_Y, BOBBYR_UNDERCONSTRUCTION_X+BOBBYR_UNDERCONSTRUCTION_WIDTH, BOBBYR_UNDERCONSTRUCTION1_Y+BOBBYR_UNDERCONSTRUCTION_HEIGHT );
|
|
|
|
uiLastTime = GetJA2Clock();
|
|
|
|
usCount++;
|
|
|
|
if( usCount >= BOBBYR_UNDERCONSTRUCTION_NUM_FRAMES )
|
|
usCount = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void InitBobbyRayInventory()
|
|
{
|
|
//Initializes which NEW items can be bought at Bobby Rays
|
|
InitBobbyRayNewInventory();
|
|
|
|
//Initializes the starting values for Bobby Rays NEW Inventory
|
|
SetupStoreInventory( LaptopSaveInfo.BobbyRayInventory, FALSE );
|
|
|
|
//Initializes which USED items can be bought at Bobby Rays
|
|
InitBobbyRayUsedInventory();
|
|
|
|
//Initializes the starting values for Bobby Rays USED Inventory
|
|
SetupStoreInventory( LaptopSaveInfo.BobbyRayUsedInventory, TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN InitBobbyRayNewInventory()
|
|
{
|
|
UINT16 i;
|
|
UINT16 usBobbyrIndex = 0;
|
|
|
|
|
|
memset( LaptopSaveInfo.BobbyRayInventory, 0, sizeof(STORE_INVENTORY) * MAXITEMS);
|
|
|
|
// add all the NEW items he can ever sell into his possible inventory list, for now in order by item #
|
|
for( i = 0; i < MAXITEMS; i++ )
|
|
{
|
|
//if Bobby Ray sells this, it can be sold, and it's allowed into this game (some depend on e.g. gun-nut option)
|
|
// if( ( StoreInventory[ i ][ BOBBY_RAY_NEW ] != 0) && !( Item[ i ].fFlags & ITEM_NOT_BUYABLE ) && ItemIsLegal( i ) )
|
|
LaptopSaveInfo.BobbyRayInventory[ usBobbyrIndex ].usItemIndex = i;
|
|
usBobbyrIndex++;
|
|
}
|
|
|
|
if ( usBobbyrIndex > 1 )
|
|
{
|
|
// sort this list by object category, and by ascending price within each category
|
|
qsort( LaptopSaveInfo.BobbyRayInventory, usBobbyrIndex, sizeof( STORE_INVENTORY ), BobbyRayItemQsortCompare );
|
|
}
|
|
|
|
|
|
// remember how many entries in the list are valid
|
|
LaptopSaveInfo.usInventoryListLength[ BOBBY_RAY_NEW ] = usBobbyrIndex;
|
|
// also mark the end of the list of valid item entries
|
|
LaptopSaveInfo.BobbyRayInventory[ usBobbyrIndex ].usItemIndex = BOBBYR_NO_ITEMS;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOLEAN InitBobbyRayUsedInventory()
|
|
{
|
|
UINT16 i;
|
|
UINT16 usBobbyrIndex = 0;
|
|
|
|
|
|
memset( LaptopSaveInfo.BobbyRayUsedInventory, 0, sizeof(STORE_INVENTORY) * MAXITEMS);
|
|
|
|
// add all the NEW items he can ever sell into his possible inventory list, for now in order by item #
|
|
for( i = 0; i < MAXITEMS; i++ )
|
|
{
|
|
//if Bobby Ray sells this, it can be sold, and it's allowed into this game (some depend on e.g. gun-nut option)
|
|
// if( ( StoreInventory[ i ][ BOBBY_RAY_USED ] != 0) && !( Item[ i ].fFlags & ITEM_NOT_BUYABLE ) && ItemIsLegal( i ) )
|
|
// in case his store inventory list is wrong, make sure this category of item can be sold used
|
|
if ( CanDealerItemBeSoldUsed( i ) )
|
|
{
|
|
LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyrIndex ].usItemIndex = i;
|
|
usBobbyrIndex++;
|
|
}
|
|
}
|
|
|
|
if ( usBobbyrIndex > 1 )
|
|
{
|
|
// sort this list by object category, and by ascending price within each category
|
|
qsort( LaptopSaveInfo.BobbyRayUsedInventory, usBobbyrIndex, sizeof( STORE_INVENTORY ), BobbyRayItemQsortCompare );
|
|
}
|
|
|
|
// remember how many entries in the list are valid
|
|
LaptopSaveInfo.usInventoryListLength[BOBBY_RAY_USED] = usBobbyrIndex;
|
|
// also mark the end of the list of valid item entries
|
|
LaptopSaveInfo.BobbyRayUsedInventory[ usBobbyrIndex ].usItemIndex = BOBBYR_NO_ITEMS;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
void DailyUpdateOfBobbyRaysNewInventory()
|
|
{
|
|
INT32 i;
|
|
UINT16 usItemIndex;
|
|
BOOLEAN fPrevElig;
|
|
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("DailyUpdateOfBobbyRaysNewInventory: list length = %d", LaptopSaveInfo.usInventoryListLength[BOBBY_RAY_NEW]));
|
|
|
|
//simulate other buyers by reducing the current quantity on hand
|
|
SimulateBobbyRayCustomer(LaptopSaveInfo.BobbyRayInventory, BOBBY_RAY_NEW);
|
|
|
|
//loop through all items BR can stock to see what needs reordering
|
|
for(i = 0; i < LaptopSaveInfo.usInventoryListLength[BOBBY_RAY_NEW]; i++)
|
|
{
|
|
// the index is NOT the item #, get that from the table
|
|
usItemIndex = LaptopSaveInfo.BobbyRayInventory[ i ].usItemIndex;
|
|
|
|
Assert(usItemIndex < MAXITEMS);
|
|
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("DailyUpdateOfBobbyRaysNewInventory: checking item = %d, qty on order = %d",usItemIndex,LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder));
|
|
// make sure this item is still sellable in the latest version of the store inventory
|
|
if ( StoreInventory[ usItemIndex ][ BOBBY_RAY_NEW ] == 0 )
|
|
{
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("DailyUpdateOfBobbyRaysNewInventory: skipping item = %d",usItemIndex));
|
|
continue;
|
|
}
|
|
|
|
//if the item isn't already on order
|
|
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder == 0 || gGameOptions.ubBobbyRay == BR_AWESOME )
|
|
{
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("DailyUpdateOfBobbyRaysNewInventory: item = %d, qty on hand = %d, half desired amount = %d",usItemIndex,LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand,(StoreInventory[ usItemIndex ][ BOBBY_RAY_NEW ] * gGameOptions.ubBobbyRay )/2));
|
|
//if the qty on hand is half the desired amount or fewer
|
|
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand <= (StoreInventory[ usItemIndex ][ BOBBY_RAY_NEW ] * gGameOptions.ubBobbyRay )/2 )
|
|
{
|
|
// remember value of the "previously eligible" flag
|
|
fPrevElig = LaptopSaveInfo.BobbyRayInventory[ i ].fPreviouslyEligible;
|
|
|
|
//determine if any can/should be ordered, and how many
|
|
LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder = HowManyBRItemsToOrder( usItemIndex, LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand, BOBBY_RAY_NEW);
|
|
|
|
//if he found some to buy
|
|
if( LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder > 0 )
|
|
{
|
|
// if this is the first day the player is eligible to have access to this thing
|
|
if ( !fPrevElig || gGameOptions.ubBobbyRay == BR_AWESOME )
|
|
{
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("DailyUpdateOfBobbyRaysNewInventory: item = %d, add fresh inventory",usItemIndex));
|
|
// eliminate the ordering delay and stock the items instantly!
|
|
// This is just a way to reward the player right away for making progress without the reordering lag...
|
|
AddFreshBobbyRayInventory( usItemIndex );
|
|
}
|
|
else
|
|
{
|
|
OrderBobbyRItem(usItemIndex);
|
|
|
|
#ifdef BR_INVENTORY_TURNOVER_DEBUG
|
|
if ( usItemIndex == ROCKET_LAUNCHER )
|
|
MapScreenMessage( 0, MSG_DEBUG, L"%s: BR Ordered %d, Has %d", WORLDTIMESTR, LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder, LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnHand );
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void DailyUpdateOfBobbyRaysUsedInventory()
|
|
{
|
|
INT16 i;
|
|
UINT16 usItemIndex;
|
|
BOOLEAN fPrevElig;
|
|
|
|
//simulate other buyers by reducing the current quantity on hand
|
|
SimulateBobbyRayCustomer(LaptopSaveInfo.BobbyRayUsedInventory, BOBBY_RAY_USED);
|
|
|
|
for(i = 0; i < LaptopSaveInfo.usInventoryListLength[BOBBY_RAY_USED]; i++)
|
|
{
|
|
//if the used item isn't already on order
|
|
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnOrder == 0 || gGameOptions.ubBobbyRay == BR_AWESOME )
|
|
{
|
|
//if we don't have ANY
|
|
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnHand == 0 )
|
|
{
|
|
// the index is NOT the item #, get that from the table
|
|
usItemIndex = LaptopSaveInfo.BobbyRayUsedInventory[ i ].usItemIndex;
|
|
Assert(usItemIndex < MAXITEMS);
|
|
|
|
// make sure this item is still sellable in the latest version of the store inventory
|
|
if ( StoreInventory[ usItemIndex ][ BOBBY_RAY_USED ] == 0 )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// remember value of the "previously eligible" flag
|
|
fPrevElig = LaptopSaveInfo.BobbyRayUsedInventory[ i ].fPreviouslyEligible;
|
|
|
|
//determine if any can/should be ordered, and how many
|
|
LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnOrder = HowManyBRItemsToOrder(usItemIndex, LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnHand, BOBBY_RAY_USED);
|
|
|
|
//if he found some to buy
|
|
if( LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnOrder > 0 )
|
|
{
|
|
// if this is the first day the player is eligible to have access to this thing
|
|
if ( !fPrevElig || gGameOptions.ubBobbyRay == BR_AWESOME )
|
|
{
|
|
// eliminate the ordering delay and stock the items instantly!
|
|
// This is just a way to reward the player right away for making progress without the reordering lag...
|
|
AddFreshBobbyRayInventory( usItemIndex );
|
|
}
|
|
else
|
|
{
|
|
OrderBobbyRItem((INT16) (usItemIndex + BOBBY_R_USED_PURCHASE_OFFSET));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//returns the number of items to order
|
|
UINT8 HowManyBRItemsToOrder(UINT16 usItemIndex, UINT8 ubCurrentlyOnHand, UINT8 ubBobbyRayNewUsed )
|
|
{
|
|
UINT8 ubItemsOrdered = 0;
|
|
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("HowManyBRItemsToOrder: item = %d",usItemIndex));
|
|
|
|
Assert(usItemIndex < MAXITEMS);
|
|
// formulas below will fail if there are more items already in stock than optimal
|
|
//Assert(ubCurrentlyOnHand <= StoreInventory[ usItemIndex ][ ubBobbyRayNewUsed ] * gGameOptions.ubBobbyRay) ;
|
|
Assert(ubBobbyRayNewUsed < BOBBY_RAY_LISTS);
|
|
|
|
|
|
// decide if he can get stock for this item (items are reordered an entire batch at a time)
|
|
if (ItemTransactionOccurs( -1, usItemIndex, DEALER_BUYING, ubBobbyRayNewUsed ))
|
|
{
|
|
if (ubBobbyRayNewUsed == BOBBY_RAY_NEW)
|
|
{
|
|
ubItemsOrdered = HowManyItemsToReorder(StoreInventory[ usItemIndex ][ ubBobbyRayNewUsed ] * gGameOptions.ubBobbyRay, ubCurrentlyOnHand);
|
|
}
|
|
else
|
|
{
|
|
//Since these are used items we only should order 1 of each type
|
|
ubItemsOrdered = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// can't obtain this item from suppliers
|
|
ubItemsOrdered = 0;
|
|
}
|
|
|
|
|
|
return(ubItemsOrdered);
|
|
}
|
|
|
|
|
|
void OrderBobbyRItem(UINT16 usItemIndex)
|
|
{
|
|
UINT32 uiArrivalTime;
|
|
|
|
//add the new item to the queue. The new item will arrive in 'uiArrivalTime' minutes.
|
|
uiArrivalTime = BOBBY_R_NEW_PURCHASE_ARRIVAL_TIME + Random( BOBBY_R_NEW_PURCHASE_ARRIVAL_TIME / 2 );
|
|
uiArrivalTime += GetWorldTotalMin();
|
|
AddStrategicEvent( EVENT_UPDATE_BOBBY_RAY_INVENTORY, uiArrivalTime, usItemIndex);
|
|
}
|
|
|
|
|
|
void AddFreshBobbyRayInventory( UINT16 usItemIndex )
|
|
{
|
|
INT16 sInventorySlot;
|
|
STORE_INVENTORY *pInventoryArray;
|
|
BOOLEAN fUsed;
|
|
UINT8 ubItemQuality;
|
|
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("AddFreshBobbyRayInventory: item = %d", usItemIndex ));
|
|
|
|
if( usItemIndex >= BOBBY_R_USED_PURCHASE_OFFSET )
|
|
{
|
|
usItemIndex -= BOBBY_R_USED_PURCHASE_OFFSET;
|
|
pInventoryArray = LaptopSaveInfo.BobbyRayUsedInventory;
|
|
fUsed = BOBBY_RAY_USED;
|
|
ubItemQuality = 20 + (UINT8) Random( 60 );
|
|
}
|
|
else
|
|
{
|
|
pInventoryArray = LaptopSaveInfo.BobbyRayInventory;
|
|
fUsed = BOBBY_RAY_NEW;
|
|
ubItemQuality = 100;
|
|
}
|
|
|
|
|
|
// find out which inventory slot that item is stored in
|
|
sInventorySlot = GetInventorySlotForItem(pInventoryArray, usItemIndex, fUsed);
|
|
if (sInventorySlot == -1)
|
|
{
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("AddFreshBobbyRayInventory: item not found! = %d", usItemIndex ));
|
|
AssertMsg( FALSE, String( "AddFreshBobbyRayInventory(), Item %d not found. AM-0.", usItemIndex ) );
|
|
return;
|
|
}
|
|
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("AddFreshBobbyRayInventory: item = %d, qty on hand = %d, qty on order = %d", usItemIndex,pInventoryArray[ sInventorySlot ].ubQtyOnHand, pInventoryArray[ sInventorySlot ].ubQtyOnOrder ));
|
|
|
|
pInventoryArray[ sInventorySlot ].ubQtyOnHand += pInventoryArray[ sInventorySlot ].ubQtyOnOrder;
|
|
pInventoryArray[ sInventorySlot ].ubItemQuality = ubItemQuality;
|
|
|
|
#ifdef BR_INVENTORY_TURNOVER_DEBUG
|
|
if ( usItemIndex == ROCKET_LAUNCHER && !fUsed )
|
|
MapScreenMessage( 0, MSG_DEBUG, L"%s: BR Bought %d, Has %d", WORLDTIMESTR, pInventoryArray[ sInventorySlot ].ubQtyOnOrder, pInventoryArray[ sInventorySlot ].ubQtyOnHand );
|
|
#endif
|
|
|
|
// cancel order
|
|
pInventoryArray[ sInventorySlot ].ubQtyOnOrder = 0;
|
|
}
|
|
|
|
|
|
INT16 GetInventorySlotForItem(STORE_INVENTORY *pInventoryArray, UINT16 usItemIndex, BOOLEAN fUsed)
|
|
{
|
|
INT16 i;
|
|
|
|
for(i = 0; i < LaptopSaveInfo.usInventoryListLength[fUsed]; i++)
|
|
{
|
|
//if we have some of this item in stock
|
|
if( pInventoryArray[ i ].usItemIndex == usItemIndex)
|
|
{
|
|
return(i);
|
|
}
|
|
}
|
|
|
|
// not found!
|
|
return(-1);
|
|
}
|
|
|
|
|
|
void SimulateBobbyRayCustomer(STORE_INVENTORY *pInventoryArray, BOOLEAN fUsed)
|
|
{
|
|
INT16 i;
|
|
UINT8 ubItemsSold;
|
|
|
|
//loop through all items BR can stock to see what gets sold
|
|
for(i = 0; i < LaptopSaveInfo.usInventoryListLength[fUsed]; i++)
|
|
{
|
|
//if we have some of this item in stock
|
|
if( pInventoryArray[ i ].ubQtyOnHand > 0)
|
|
{
|
|
ubItemsSold = HowManyItemsAreSold( -1, pInventoryArray[ i ].usItemIndex, pInventoryArray[ i ].ubQtyOnHand, fUsed);
|
|
pInventoryArray[ i ].ubQtyOnHand -= ubItemsSold;
|
|
|
|
#ifdef BR_INVENTORY_TURNOVER_DEBUG
|
|
if (ubItemsSold > 0 )
|
|
{
|
|
if ( i == ROCKET_LAUNCHER && !fUsed )
|
|
MapScreenMessage( 0, MSG_DEBUG, L"%s: BR Sold %d, Has %d", WORLDTIMESTR, ubItemsSold, pInventoryArray[ i ].ubQtyOnHand );
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CancelAllPendingBRPurchaseOrders(void)
|
|
{
|
|
INT16 i;
|
|
|
|
// remove all the BR-Order events off the event queue
|
|
DeleteAllStrategicEventsOfType( EVENT_UPDATE_BOBBY_RAY_INVENTORY );
|
|
|
|
// zero out all the quantities on order
|
|
for(i = 0; i < MAXITEMS; i++)
|
|
{
|
|
LaptopSaveInfo.BobbyRayInventory[ i ].ubQtyOnOrder = 0;
|
|
LaptopSaveInfo.BobbyRayUsedInventory[ i ].ubQtyOnOrder = 0;
|
|
}
|
|
|
|
// do an extra daily update immediately to create new reorders ASAP
|
|
DailyUpdateOfBobbyRaysNewInventory();
|
|
DailyUpdateOfBobbyRaysUsedInventory();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|