#include "builddefines.h" #include #include "sgp.h" #include "himage.h" #include "vobject.h" #include "sysutil.h" #include "Overhead.h" #include "mousesystem.h" #include "Button System.h" #include "Interface.h" #include "vsurface.h" #include "WCheck.h" #include "input.h" #include "Handle UI.h" #include "renderworld.h" #include "Cursors.h" #include "Radar Screen.h" #include "Font Control.h" #include "Render Dirty.h" #include "Utilities.h" #include "Sound Control.h" #include "Interface Panels.h" #include "Animation Control.h" #include "Soldier Control.h" #include "PATHAI.H" #include "Weapons.h" #include "faces.h" #include "mapscreen.h" #include "message.h" #include "Text.h" #include "Interface Items.h" #include "Interface Control.h" #include "Interface Utils.h" #include "Game Clock.h" #include "Soldier macros.h" #include "strategicmap.h" #include "Soldier Functions.h" #include "gamescreen.h" #include "Assignments.h" #include "Points.h" #include "Squads.h" #include "strategic.h" #include "Map Screen Interface Map.h" #include "overhead map.h" #include "Map Screen Interface.h" #include "Options Screen.h" #include "ShopKeeper Interface.h" #include "english.h" #include "Keys.h" #include "Vehicles.h" #include "GameSettings.h" #include "Dialogue Control.h" #include "Items.h" #include "Drugs And Alcohol.h" #include "LOS.h" #include "opplist.h" #include "vobject_blitters.h" #include "finances.h" #include "LaptopSave.h" #include "MessageBoxScreen.h" #include "WordWrap.h" #include "Boxing.h" #include "personnel.h" // HEADROCK HAM 3.6: This is required for Stat Progress Bars #include "Campaign.h" #include "Food.h" // added by Flugente #include //forward declarations of common classes to eliminate includes class OBJECTTYPE; class SOLDIERTYPE; extern int UI_CHARINV_REGION_X; extern int UI_CHARINV_REGION_Y; extern int UI_CHARINV_REGION_W; extern int UI_CHARINV_REGION_H; /* * * SINGLE MERC BAR COORDS * * * My opinion about this bars and GUI * i would be very happy if we had c++ classes then we could made somethis like modules * and peoples could very easly make their ow panels, button, labels and other * i have got some ideas but it will tak some time to implement then. * it will be hard and time consuming but maby i will show ya all direction how i would * do it and peoples will continue that path :) joker */ /* Ok so this array values had a constant initializer INV_INTERFACE_START_Y wich was constant * we need do load SCREEN_WIDTH _HEIGHT from file to make JA more customizable so if we * will make SCREEN_xxx viariable then xxx_INTERFACE_xxx will be also variable. * When we declare static array like here (below) we need constant initializer but we need dynamic * array so i declare only array and i will initielize it in run-time. * any questions? * joker */ // CHRISL: Change key value to use dynamically generated NUM_INV_SLOTS instead of static setting INV_REGION_DESC gSMInvPocketXY[NUM_INV_SLOTS]; // ARRAY FOR INV PANEL INTERFACE ITEM POSITIONS INV_REGION_DESC gSMCamoXY; // X, Y Location of cammo region /* So this coords buttons, bars etc. also ware declered here as constant and we also need them * more customizable in future so i just declare them and i will initialize them later * any questions? joker */ int SM_ITEMDESC_START_X; int SM_ITEMDESC_START_Y; int SM_ITEMDESC_HEIGHT; int SM_ITEMDESC_WIDTH; extern INT16 ITEMDESC_START_X; extern INT16 ITEMDESC_START_Y; int SM_SELMERC_AP_X; int SM_SELMERC_AP_Y; int SM_SELMERC_AP_HEIGHT; int SM_SELMERC_AP_WIDTH; int SM_SELMERC_HEALTH_X; int SM_SELMERC_HEALTH_Y; int SM_SELMERC_HEALTH_WIDTH; int SM_SELMERC_HEALTH_HEIGHT; int SM_SELMERC_BREATH_X; int SM_SELMERC_BREATH_Y; int SM_SELMERC_BREATH_WIDTH; int SM_SELMERC_BREATH_HEIGHT; int SM_SELMERC_MORALE_X; int SM_SELMERC_MORALE_Y; int SM_SELMERC_MORALE_WIDTH; int SM_SELMERC_MORALE_HEIGHT; int SM_SELMERC_BARS_TIP_X; int SM_SELMERC_BARS_TIP_Y; int SM_SELMERC_BARS_TIP_WIDTH; int SM_SELMERC_BARS_TIP_HEIGHT; int SM_SELMERCNAME_X; int SM_SELMERCNAME_Y; int SM_SELMERCNAME_WIDTH; int SM_SELMERCNAME_HEIGHT; int SM_SELMERC_FACE_X; int SM_SELMERC_FACE_Y; int SM_SELMERC_FACE_HEIGHT; int SM_SELMERC_FACE_WIDTH; int SM_SELMERC_PLATE_X; int SM_SELMERC_PLATE_Y; int SM_SELMERC_PLATE_HEIGHT; int SM_SELMERC_PLATE_WIDTH; int SM_BODYINV_X; int SM_BODYINV_Y; int STATS_TITLE_FONT_COLOR; int STATS_TEXT_FONT_COLOR; int SM_TALKB_X; int SM_TALKB_Y; int SM_MUTEB_X; int SM_MUTEB_Y; int SM_STANCEUPB_X; int SM_STANCEUPB_Y; int SM_UPDOWNB_X; int SM_UPDOWNB_Y; int SM_CLIMBB_X; int SM_CLIMBB_Y; int SM_STANCEDOWNB_X; int SM_STANCEDOWNB_Y; int SM_HANDCURSORB_X; int SM_HANDCURSORB_Y; int SM_PREVMERCB_X; int SM_PREVMERCB_Y; int SM_NEXTMERCB_X; int SM_NEXTMERCB_Y; int SM_OPTIONSB_X; int SM_OPTIONSB_Y; int SM_BURSTMODEB_X; int SM_BURSTMODEB_Y; int SM_LOOKB_X; int SM_LOOKB_Y; int SM_STEALTHMODE_X; int SM_STEALTHMODE_Y; int SM_DONE_X; int SM_DONE_Y; int SM_MAPSCREEN_X; int SM_MAPSCREEN_Y; // CHRISL: backpack buttons int SM_DROPPACK_X; int SM_DROPPACK_Y; int SM_ZIPPER_X; int SM_ZIPPER_Y; extern int INV_BDROP_X; extern int INV_BDROP_Y; int SM_POSITIONB_X; int SM_POSITIONB_Y; int SM_POSITIONB_WIDTH; int SM_POSITIONB_HEIGHT; int SM_PERCENT_WIDTH; int SM_PERCENT_HEIGHT; int SM_ARMOR_X; int SM_ARMOR_Y; int SM_ARMOR_LABEL_X; int SM_ARMOR_LABEL_Y; int SM_ARMOR_PERCENT_X; int SM_ARMOR_PERCENT_Y; int SM_WEIGHT_LABEL_X; int SM_WEIGHT_LABEL_Y; int SM_WEIGHT_PERCENT_X; int SM_WEIGHT_PERCENT_Y; int SM_WEIGHT_X; int SM_WEIGHT_Y; int SM_CAMMO_LABEL_X; int SM_CAMMO_LABEL_Y; int SM_CAMMO_PERCENT_X; int SM_CAMMO_PERCENT_Y; int SM_CAMMO_X; int SM_CAMMO_Y; int SM_STATS_WIDTH; int SM_STATS_HEIGHT; int SM_AGI_X; int SM_AGI_Y; int SM_DEX_X; int SM_DEX_Y; int SM_STR_X; int SM_STR_Y; int SM_CHAR_X; int SM_CHAR_Y; int SM_WIS_X; int SM_WIS_Y; int SM_EXPLVL_X; int SM_EXPLVL_Y; int SM_MRKM_X; int SM_MRKM_Y; int SM_MECH_X; int SM_MECH_Y; int SM_EXPL_X; int SM_EXPL_Y; int SM_MED_X; int SM_MED_Y; int MONEY_X; int MONEY_Y; int MONEY_WIDTH; int MONEY_HEIGHT; /* * * TEAM BAR COORDS * */ /* * Now we have only 6 mercs in team but maby we will make it CUSTOMIZABLE hehe i like that word * why we declare array with 12 items? coz we got 2 valuse x and y maby we can work it out * and change INT16 to INV_REGION_DESC for ex. */ const int TeamInterfaceMax = NUMBER_OF_SOLDIERS_PER_SQUAD * 2; // WDS INT16 sTEAMAPPanelXY[TeamInterfaceMax]; INT16 sTEAMFacesXY[TeamInterfaceMax]; INT16 sTEAMNamesXY[TeamInterfaceMax]; INT16 sTEAMFaceHighlXY[TeamInterfaceMax]; INT16 sTEAMLifeXY[TeamInterfaceMax]; INT16 sTEAMBreathXY[TeamInterfaceMax]; INT16 sTEAMMoraleXY[TeamInterfaceMax]; INT16 sTEAMApXY[TeamInterfaceMax]; INT16 sTEAMBarsXY[TeamInterfaceMax]; INT16 sTEAMHandInvXY[TeamInterfaceMax]; int TM_FACE_WIDTH; int TM_FACE_HEIGHT; int TM_APPANEL_HEIGHT; int TM_APPANEL_WIDTH; int TM_ENDTURN_X; int TM_ENDTURN_Y; int TM_ROSTERMODE_X; int TM_ROSTERMODE_Y; int TM_DISK_X; int TM_DISK_Y; int TM_NAME_WIDTH; int TM_NAME_HEIGHT; int TM_LIFEBAR_WIDTH; int TM_LIFEBAR_HEIGHT; int TM_FACEHIGHTL_WIDTH; int TM_FACEHIGHTL_HEIGHT; int TM_AP_HEIGHT; int TM_AP_WIDTH; int TM_INV_WIDTH; int TM_INV_HEIGHT; int TM_INV_HAND1STARTX; int TM_INV_HAND1STARTY; int TM_INV_HAND2STARTX; int TM_INV_HAND2STARTY; int TM_INV_HAND_SEP; int TM_INV_HAND_SEPY; int TM_BARS_REGION_HEIGHT; int TM_BARS_REGION_WIDTH; int INDICATOR_BOX_WIDTH; int INDICATOR_BOX_HEIGHT; MOUSE_REGION gSMPanelRegion; INT8 gbNewItem[ NUM_INV_SLOTS ]; TEAM_PANEL_SLOTS_TYPE gTeamPanel[ NUM_TEAM_SLOTS ]; /* * * VARIOUS PANELS COORDS * * now its only clock and location name we will also make them ??? * yes yes yes MORE CUSTOMIZABLE :P for moders * i will work with radar screen to allow moving it. or maby someone else will do it * any questions? joker */ int LOCATION_NAME_X; int LOCATION_NAME_Y; /* CHRISL: Added new "TM" variables to allow team and inventory screens to place the location name independantly of each other */ int LOCATION_NAME_TM_X; int LOCATION_NAME_TM_Y; // CHRISL: Keyring coords moved from Interface Items.cpp int KEYRING_X; int KEYRING_Y; extern UINT32 guiCurrentItemDescriptionScreen; extern UINT32 guiCurrentItemDescriptionScreen; enum { STANCEUP_IMAGES = 0, UPDOWN_IMAGES, CLIMB_IMAGES, STANCEDOWN_IMAGES, HANDCURSOR_IMAGES, PREVMERC_IMAGES, NEXTMERC_IMAGES, OPTIONS_IMAGES, // BURSTMODE_IMAGES, LOOK_IMAGES, TALK_IMAGES, MUTE_IMAGES, STANCE_IMAGES, DONE_IMAGES, MAPSCREEN_IMAGES, BACKPACK_IMAGES, //HOP_IMAGES, //legion by Jazz NUM_SM_BUTTON_IMAGES }; enum { ENDTURN_IMAGES = 0, ROSTERMODE_IMAGES, DISK_IMAGES, NUM_TEAM_BUTTON_IMAGES }; INT32 iSMPanelImages [ NUM_SM_BUTTON_IMAGES ]; INT32 iBurstButtonImages [ NUM_WEAPON_MODES ]; INT32 iTEAMPanelImages [ NUM_TEAM_BUTTON_IMAGES ]; INT32 giSMStealthImages = -1; INT32 giSMStealthButton = -1; // CHRISL: Backpack buttons INT32 giSMDropPackImages = -1; INT32 giSMDropPackButton = -1; INT32 giSMZipperImages = -1; INT32 giSMZipperButton = -1; BOOLEAN gfSwitchPanel = FALSE; UINT8 gbNewPanel = SM_PANEL; SoldierID gubNewPanelParam = NOBODY; BOOLEAN gfUIStanceDifferent = FALSE; BOOLEAN gfAllDisabled = FALSE; BOOLEAN gfSMDisableForItems = FALSE; BOOLEAN gfDisableTacticalPanelButtons = FALSE; BOOLEAN gfAddingMoneyToMercFromPlayersAccount = FALSE; BOOLEAN gfCheckForMouseOverItem = FALSE; UINT32 guiMouseOverItemTime = 0; INT8 gbCheckForMouseOverItemPos = 0; SoldierID gubSelectSMPanelToMerc = NOBODY; BOOLEAN gfReEvaluateDisabledINVPanelButtons = FALSE; UINT32 guiBrownBackgroundForTeamPanel; UINT32 guiGoldBackgroundForTeamPanel; extern BOOLEAN gfRerenderInterfaceFromHelpText; extern BOOLEAN gfInKeyRingPopup; extern UINT32 guiVEHINV; extern INT32 giMapInvDoneButton; extern BOOLEAN gfBeginEndTurn; extern SOLDIERTYPE *gpItemDescSoldier; extern BOOLEAN gfInItemPickupMenu; extern void HandleAnyMercInSquadHasCompatibleStuff( UINT8 ubSquad, OBJECTTYPE *pObject, BOOLEAN fReset ); extern void SetNewItem( SOLDIERTYPE *pSoldier, UINT8 ubInvPos, BOOLEAN fNewItem ); extern BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier, UINT8 ubPosition ); extern BOOLEAN InternalHandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, OBJECTTYPE *pTestObject, BOOLEAN fOn ); extern BOOLEAN CompatibleAmmoForGun( OBJECTTYPE *pTryObject, OBJECTTYPE *pTestObject );//dnl ch66 070913 BOOLEAN IsMouseInRegion( MOUSE_REGION *pRegion ); void HandleMouseOverSoldierFaceForContMove( SOLDIERTYPE *pSoldier, BOOLEAN fOn ); void HandlePlayerTeamMemberDeathAfterSkullAnimation( SOLDIERTYPE *pSoldier ); void EnableButtonsForInItemBox( BOOLEAN fDisable ); void ConfirmationToDepositMoneyToPlayersAccount( UINT8 ubExitValue ); void MergeMessageBoxCallBack( UINT8 ubExitValue ); UINT8 gubHandPos; UINT16 gusOldItemIndex; UINT16 gusNewItemIndex; BOOLEAN gfDeductPoints; // HEADROCK HAM 4: This variable tells the program what "page" of the description box we are currently looking at. // By saving this in memory, we tell the DescBox which background and values to draw, and make sure that we end up // on the same page every time we open the description box. UDB buttons allow switching between pages. UINT8 gubDescBoxPage; // silversurfer: Now we also have a secondary page on the general tab for weapons so we can look at their secondary attributes. UINT8 gubDescGenPage; // Record which line we're looking at. This only applied to the Advanced tab in description boxes. UINT8 gubDescBoxLine; // Record how many lines this item has to display. This only applies to the Advanced tab. UINT8 gubDescBoxTotalAdvLines; INT32 iSMPanelButtons[ NUM_SM_BUTTONS ]; INT32 iTEAMPanelButtons[ NUM_TEAM_BUTTONS ]; // Video Surface for Single Merc Panel UINT32 guiSMPanel; UINT32 guiSMObjects; UINT32 guiSMObjects2; UINT32 guiSecItemHiddenVO; UINT32 guiTEAMPanel; UINT32 guiTEAMObjects; // Globals for various mouse regions MOUSE_REGION gSM_SELMERCPanelRegion; MOUSE_REGION gSM_SELMERCBarsRegion; MOUSE_REGION gSM_SELMERCMoneyRegion; MOUSE_REGION gSM_SELMERCEnemyIndicatorRegion; MOUSE_REGION gTEAM_PanelRegion; MOUSE_REGION gTEAM_FaceRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gTEAM_BarsRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gTEAM_LeftBarsRegions[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gTEAM_FirstHandInv[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gTEAM_SecondHandInv[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gTEAM_EnemyIndicator[ NUMBER_OF_SOLDIERS_PER_SQUAD ]; MOUSE_REGION gSM_SELMERCWeightRegion; // Added by Flugente MOUSE_REGION gSM_SELMERCCamoRegion; // Added by Sandro BOOLEAN gfTEAM_HandInvDispText[ NUMBER_OF_SOLDIERS_PER_SQUAD ][ NUM_INV_SLOTS ]; BOOLEAN gfSM_HandInvDispText[ NUM_INV_SLOTS ]; void HelpTextDoneCallback( void ); // Globals - for one - the current merc here INT8 gbSMCurStanceObj; SoldierID gusSMCurrentMerc = NOBODY; SOLDIERTYPE *gpSMCurrentMerc = NULL; // CHRISL: extern INT8 gbCompatibleApplyItem; extern SOLDIERTYPE *gpItemPopupSoldier; INT8 gbStanceButPos[2][3][3] = { // NON-STEALTH 16, 14, 15, 10, 8, 9, 22, 20, 21, // STEALTH MODE 13, 11, 12, 7, 5, 6, 19, 17, 18 }; //CHRISL: New arrays to deal with backpack button positions INT8 gbDropPackButPos[2][2] = { 2, 3, 3, 2 }; INT8 gbZipperButPos[2][2] = { 0, 1, 1, 0 }; //Legion by Jazz //void BtnOknoCallback(GUI_BUTTON *btn,INT32 reason); //void BtnFenceCallback(GUI_BUTTON *btn,INT32 reason); // Mouse button and region callbacks //void BtnPositionCallback( GUI_BUTTON *btn, INT32 reason ); //void BtnMovementCallback( GUI_BUTTON *btn, INT32 reason ); void SelectedMercButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SelectedMercButtonMoveCallback( MOUSE_REGION *pRegion, INT32 iReason ); void SelectedMercEnemyIndicatorCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SMInvMoveCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SMInvClickCamoCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SMInvMoveCammoCallback( MOUSE_REGION * pRegion, INT32 iReason ); void SMInvMoneyButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ); // SINGLE MERC PANEL BUTTON CALLBACKS void BtnStealthModeCallback(GUI_BUTTON *btn,INT32 reason); void BtnStanceUpCallback(GUI_BUTTON *btn,INT32 reason); void BtnUpdownCallback(GUI_BUTTON *btn,INT32 reason); void BtnClimbCallback(GUI_BUTTON *btn,INT32 reason); void BtnStanceDownCallback(GUI_BUTTON *btn,INT32 reason); void BtnHandCursorCallback(GUI_BUTTON *btn,INT32 reason); void BtnTalkCallback(GUI_BUTTON *btn,INT32 reason); void BtnMuteCallback(GUI_BUTTON *btn,INT32 reason); void BtnSMDoneCallback(GUI_BUTTON *btn,INT32 reason); void BtnMapScreenCallback(GUI_BUTTON *btn,INT32 reason); // CHRISL: New callback functions for backpack buttons void BtnDropPackCallback(GUI_BUTTON *btn,INT32 reason); void BtnZipperCallback(GUI_BUTTON *btn,INT32 reason); BOOLEAN ChangeZipperStatus(SOLDIERTYPE *pSoldier, BOOLEAN newStatus); void BtnPrevMercCallback(GUI_BUTTON *btn,INT32 reason); void BtnNextMercCallback(GUI_BUTTON *btn,INT32 reason); void BtnOptionsCallback(GUI_BUTTON *btn,INT32 reason); void BtnBurstModeCallback(GUI_BUTTON *btn,INT32 reason); void BtnLookCallback(GUI_BUTTON *btn,INT32 reason); void BtnPositionShowCallback(GUI_BUTTON *btn,INT32 reason); void InvPanelButtonClickCallback( MOUSE_REGION * pRegion, INT32 iReason ); // TEAM PANEL BUTTON CALLBACKS void BtnEndTurnCallback(GUI_BUTTON *btn,INT32 reason); void BtnRostermodeCallback(GUI_BUTTON *btn,INT32 reason); void BtnSquadCallback(GUI_BUTTON *btn,INT32 reason); void MercFacePanelCallback( MOUSE_REGION * pRegion, INT32 iReason ); void MercFacePanelMoveCallback( MOUSE_REGION * pRegion, INT32 iReason ); void TMFirstHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ); void TMClickFirstHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ); void TMClickSecondHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ); void EnemyIndicatorClickCallback( MOUSE_REGION * pRegion, INT32 iReason ); void RenderSoldierTeamInv( SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY, UINT8 ubPanelNum, BOOLEAN fDirty ); // keyring stuff void KeyRingItemPanelButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ); void UpdateSelectedSoldier( UINT16 usSoldierID, BOOLEAN fSelect ); void CheckForFacePanelStartAnims( SOLDIERTYPE *pSoldier, INT16 sPanelX, INT16 sPanelY ); void HandleSoldierFaceFlash( SOLDIERTYPE *pSoldier, INT16 sFaceX, INT16 sFaceY ); BOOLEAN PlayerExistsInSlot( SoldierID ubID ); void UpdateStatColor( UINT32 uiTimer, BOOLEAN fIncrease, BOOLEAN fDamaged, BOOLEAN fAugmented ); // SANDRO - added argument // Flugente - me too extern void UpdateItemHatches(); extern SOLDIERTYPE *FindNextActiveSquad( SOLDIERTYPE *pSoldier ); extern BOOLEAN gfMouseLockedOnBorder; // Wraps up check for AP-s get from a different soldier for in a vehicle... INT16 GetUIApsToDisplay( SOLDIERTYPE *pSoldier ) { return ( pSoldier->bActionPoints ); } void CheckForDisabledForGiveItem( ) { INT16 sDist; INT32 sDestGridNo; INT8 bDestLevel; SoldierID cnt; SOLDIERTYPE *pSoldier; SoldierID ubSrcSoldier; // CHRISL: If Merc hasn't been set, default to first merc if(gpSMCurrentMerc==NULL) gpSMCurrentMerc = MercPtrs[ 0 ]; Assert( gpSMCurrentMerc != NULL); if ( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { gfSMDisableForItems = !CanMercInteractWithSelectedShopkeeper( gpSMCurrentMerc ); return; } // Default to true gfSMDisableForItems = TRUE; // ATE: Is the current merc unconscious..... if ( gpSMCurrentMerc->stats.bLife < OKLIFE && gpItemPointer != NULL ) { // Go through each merc and see if there is one closeby.... cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; for ( ; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ++cnt ) { pSoldier = cnt; if ( pSoldier->bActive && pSoldier->stats.bLife >= OKLIFE && !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !AM_A_ROBOT( pSoldier ) && pSoldier->bInSector && IsMercOnCurrentSquad( pSoldier ) ) { sDist = PythSpacesAway( gpSMCurrentMerc->sGridNo, pSoldier->sGridNo ); // Check LOS.... if ( SoldierTo3DLocationLineOfSightTest( pSoldier, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->pathing.bLevel, 3, TRUE, CALC_FROM_ALL_DIRS ) ) { if ( sDist <= PASSING_ITEM_DISTANCE_NOTOKLIFE ) { gfSMDisableForItems = FALSE; break; // found one, no need to keep looking } } } } } else { ubSrcSoldier = gusSelectedSoldier; if ( gpItemPointer != NULL ) { ubSrcSoldier = gpItemPointerSoldier->ubID; } // OK buddy, check our currently selected merc and disable/enable if not close enough... if ( ubSrcSoldier != NOBODY ) { if ( gusSMCurrentMerc != ubSrcSoldier ) { sDestGridNo = gusSMCurrentMerc->sGridNo; bDestLevel = gusSMCurrentMerc->pathing.bLevel; // Get distance.... sDist = PythSpacesAway( ubSrcSoldier->sGridNo, sDestGridNo ); // Check LOS.... if ( SoldierTo3DLocationLineOfSightTest( ubSrcSoldier, sDestGridNo, bDestLevel, 3, TRUE, CALC_FROM_ALL_DIRS ) ) { // UNCONSCIOUS GUYS ONLY 1 tile AWAY if ( gusSMCurrentMerc->stats.bLife < CONSCIOUSNESS ) { if ( sDist <= PASSING_ITEM_DISTANCE_NOTOKLIFE ) { gfSMDisableForItems = FALSE; } } else if ( sDist <= PASSING_ITEM_DISTANCE_OKLIFE ) { gfSMDisableForItems = FALSE; } } // anv: passengers in the same vehicle can pass items freely else if ( ubSrcSoldier->iVehicleId != -1 && ubSrcSoldier->iVehicleId == gusSMCurrentMerc->iVehicleId ) { gfSMDisableForItems = FALSE; } } else { gfSMDisableForItems = FALSE; } } else { gfSMDisableForItems = FALSE; } } } void SetSMPanelCurrentMerc( SoldierID ubNewID ) { gubSelectSMPanelToMerc = NOBODY; gusSMCurrentMerc = ubNewID; gpSMCurrentMerc = ubNewID; // Set to current guy's interface level //if ( gsInterfaceLevel != gpSMCurrentMerc->bUIInterfaceLevel ) //{ // SetRenderFlags(RENDER_FLAG_FULL); // ErasePath(FALSE); // gsInterfaceLevel = gpSMCurrentMerc->bUIInterfaceLevel; //} // Disable all faces SetAllAutoFacesInactive( ); // Turn off compat ammo.... HandleCompatibleAmmoUI(gpSMCurrentMerc, NO_SLOT, FALSE); if (gpItemPointer != NULL) { gfCheckForMouseOverItem = TRUE; } // Remove item desc panel if one up.... if ( gfInItemDescBox ) { DeleteItemDescriptionBox( ); } // Remove stack popup panel if one up.... if ( InItemStackPopup( ) || InSectorStackPopup( ) ) { DeleteItemStackPopup( ); } // Remove keyring popup panel if one up.... if ( InKeyRingPopup( ) ) { DeleteKeyRingPopup( ); } if ( gfInItemPickupMenu ) { gfSMDisableForItems = TRUE; } else { if ( ( gpItemPointer != NULL || guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE || gpSMCurrentMerc->stats.bLife < OKLIFE ) ) { CheckForDisabledForGiveItem( ); } else { gfSMDisableForItems = FALSE; } } if ( gpItemPointer != NULL ) { ReevaluateItemHatches( gpSMCurrentMerc, FALSE ); } DisableInvRegions( gfSMDisableForItems ); fInterfacePanelDirty = DIRTYLEVEL2; gfUIStanceDifferent = TRUE; UpdateSMPanel( ); } void UpdateForContOverPortrait( SOLDIERTYPE *pSoldier, BOOLEAN fOn ) { INT32 cnt; if ( gsCurInterfacePanel == SM_PANEL ) { if ( gpSMCurrentMerc != NULL ) { // Check if mouse is in region and if so, adjust... if ( IsMouseInRegion( &gSM_SELMERCPanelRegion ) ) { HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, fOn ); } } } else { for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ ) { if ( gTeamPanel[ cnt ].ubID == pSoldier->ubID ) { if ( IsMouseInRegion( &gTEAM_FaceRegions[ cnt ] ) ) { HandleMouseOverSoldierFaceForContMove( pSoldier, fOn ); } } } } } void UpdateSMPanel( ) { BOOLEAN fNearHeigherLevel; BOOLEAN fNearLowerLevel; INT8 bDirection; UINT8 ubStanceState; //jump window by Jazz //BOOLEAN fNearLowerLevelOkno; //BOOLEAN fNearHeigherLevelOkno; if (TileIsOutOfBounds(gpSMCurrentMerc->sGridNo)) { return; } // Stance ubStanceState = gpSMCurrentMerc->ubDesiredHeight; if ( ubStanceState == NO_DESIRED_HEIGHT ) { ubStanceState = gAnimControl[ gpSMCurrentMerc->usAnimState ].ubEndHeight; } switch( ubStanceState ) { case ANIM_STAND: gbSMCurStanceObj = 0; DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); EnableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); // Disable if we cannot do this! if ( !IsValidStance( gpSMCurrentMerc, ANIM_CROUCH ) ) { DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); } break; case ANIM_PRONE: gbSMCurStanceObj = 2; DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); EnableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); break; case ANIM_CROUCH: gbSMCurStanceObj = 1; EnableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); EnableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); // Disable if we cannot do this! if ( !IsValidStance( gpSMCurrentMerc, ANIM_PRONE ) ) { DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); } break; } // Stance button done wether we're disabled or not... if ( gfUIStanceDifferent ) { //Remove old if ( giSMStealthButton != -1 ) { RemoveButton( giSMStealthButton ); } if ( giSMStealthImages != -1 ) { UnloadButtonImage( giSMStealthImages ); } // Make new giSMStealthImages = UseLoadedButtonImage( iSMPanelImages[ STANCE_IMAGES ] ,gbStanceButPos[ gpSMCurrentMerc->bStealthMode ][gbSMCurStanceObj][0] ,gbStanceButPos[ gpSMCurrentMerc->bStealthMode ][gbSMCurStanceObj][1],-1,gbStanceButPos[ gpSMCurrentMerc->bStealthMode ][gbSMCurStanceObj][2],-1 ); giSMStealthButton = QuickCreateButton( giSMStealthImages, SM_STEALTHMODE_X, SM_STEALTHMODE_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnStealthModeCallback ); RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ SetButtonFastHelpText( giSMStealthButton, TacticalStr[ TOGGLE_STEALTH_MODE_POPUPTEXT ] ); gfUIStanceDifferent = FALSE; if ( gfAllDisabled ) { if ( giSMStealthButton != -1 ) { DisableButton( giSMStealthButton ); } RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ } } if ( gfAllDisabled ) { return; } CheckForReEvaluateDisabledINVPanelButtons( ); // Check for any newly added items we need..... if ( gpSMCurrentMerc->flags.fCheckForNewlyAddedItems ) { // Startup any newly added items.... CheckForAnyNewlyAddedItems( gpSMCurrentMerc ); gpSMCurrentMerc->flags.fCheckForNewlyAddedItems = FALSE; } // Set Disable /Enable UI based on buddy's stats if (ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->ImageNum != (UINT32) iBurstButtonImages[ gpSMCurrentMerc->bWeaponMode ] ) { ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->ImageNum = iBurstButtonImages[ gpSMCurrentMerc->bWeaponMode ]; ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags |= BUTTON_DIRTY; } /* if ( gpSMCurrentMerc->bDoBurst ) { if ( !ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags |= BUTTON_CLICKED_ON; } } else { if ( !ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } */ // Toggle MUTE button... if ( gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_MUTE ) { if ( !ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->uiFlags |= BUTTON_CLICKED_ON; } } else { if ( !ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); GetMercClimbDirection( gpSMCurrentMerc->ubID, &fNearLowerLevel, &fNearHeigherLevel ); if (fNearLowerLevel || fNearHeigherLevel) { if (IsValidStance(gpSMCurrentMerc, ANIM_CROUCH) && EnoughPoints(gpSMCurrentMerc, GetAPsToClimbRoof(gpSMCurrentMerc, fNearLowerLevel), GetBPsToClimbRoof(gpSMCurrentMerc, fNearLowerLevel), FALSE)) { EnableButton(iSMPanelButtons[CLIMB_BUTTON]); } } if (gGameExternalOptions.fCanClimbOnWalls == TRUE) { if (FindWallJumpDirection(gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection)) { if (IsValidStance(gpSMCurrentMerc, ANIM_CROUCH) && EnoughPoints(gpSMCurrentMerc, GetAPsToJumpWall(gpSMCurrentMerc, FALSE), GetBPsToJumpWall(gpSMCurrentMerc, FALSE), FALSE)) { EnableButton(iSMPanelButtons[CLIMB_BUTTON]); } } } if (FindFenceJumpDirection(gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection)) { if (IsValidStance(gpSMCurrentMerc, ANIM_CROUCH) && EnoughPoints(gpSMCurrentMerc, GetAPsToJumpFence(gpSMCurrentMerc, FALSE), GetBPsToJumpFence(gpSMCurrentMerc, FALSE), FALSE)) { EnableButton(iSMPanelButtons[CLIMB_BUTTON]); } } if ( (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || (gTacticalStatus.uiFlags & REALTIME ) || !(gTacticalStatus.uiFlags & INCOMBAT ) ) { DisableButton( iSMPanelButtons[ SM_DONE_BUTTON ] ); } else if ( !gfAllDisabled ) { EnableButton( iSMPanelButtons[ SM_DONE_BUTTON ] ); } // if ( gpSMCurrentMerc->bUIInterfaceLevel > 0 ) if ( gsInterfaceLevel > 0 ) { if ( !ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags |= (BUTTON_CLICKED_ON); } } else { if ( !ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } if ( gCurrentUIMode == HANDCURSOR_MODE ) { if ( !ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->uiFlags |= BUTTON_CLICKED_ON; } } else { if ( !ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } if ( gCurrentUIMode == TALKCURSOR_MODE ) { if ( !ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->uiFlags |= BUTTON_CLICKED_ON; } } else { if ( !ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } if ( gCurrentUIMode == LOOKCURSOR_MODE ) { if ( !ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->uiFlags |= BUTTON_CLICKED_ON; } } else { if ( !ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->ubToggleButtonActivated ) { ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->uiFlags &= ( ~BUTTON_CLICKED_ON ); } } // If not selected ( or dead ), disable/gray some buttons if ( gusSelectedSoldier != gpSMCurrentMerc->ubID || ( gpSMCurrentMerc->stats.bLife < OKLIFE ) || (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || gfSMDisableForItems ) { DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ LOOK_BUTTON ] ); DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); if ( giSMStealthButton != -1 ) { DisableButton( giSMStealthButton ); } RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ } else { // Enable some buttons! // Changed by ADB, rev 1513 //if ( ((IsGunAutofireCapable( gpSMCurrentMerc, HANDPOS ) || IsGunBurstCapable( gpSMCurrentMerc, HANDPOS , FALSE )) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) ) if ( ( ( IsGunAutofireCapable( &gpSMCurrentMerc->inv[HANDPOS] ) || IsGunBurstCapable( &gpSMCurrentMerc->inv[HANDPOS], FALSE, gpSMCurrentMerc ) ) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) || IsWeaponAttached( &(gpSMCurrentMerc->inv[HANDPOS]), IC_GUN ) || IsWeaponAttached( &( gpSMCurrentMerc->inv[HANDPOS] ), IC_BLADE ) || HasSeveralBarrelConfigurations( gpSMCurrentMerc->inv[HANDPOS].usItem ) ) { EnableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); } else { DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); } EnableButton( iSMPanelButtons[ LOOK_BUTTON ] ); EnableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); EnableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); if ( giSMStealthButton != -1 ) { EnableButton( giSMStealthButton ); } if(!gfInItemDescBox) RenderBackpackButtons(ENABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ } // CJC Dec 4 2002: or if item pickup menu is up if ( (gTacticalStatus.uiFlags & ENGAGED_IN_CONV) || gfInItemPickupMenu) { DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } else { EnableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } } extern INT8 gbInvalidPlacementSlot[ NUM_INV_SLOTS ]; void ReevaluateItemHatches( SOLDIERTYPE *pSoldier, BOOLEAN fAllValid ) { UINT32 cnt; // if there's an item in the cursor and we're not supposed to just make them all valid if ( ( gpItemPointer != NULL ) && !fAllValid ) { // check all inventory positions and mark the ones where cursor item won't fit as invalid UINT32 invsize = pSoldier->inv.size(); for ( cnt = 0; cnt < invsize; ++cnt ) { gbInvalidPlacementSlot[ cnt ] = !CanItemFitInPosition( pSoldier, gpItemPointer, (INT8)cnt, FALSE ); // !!! ATTACHING/MERGING ITEMS IN MAP SCREEN IS NOT SUPPORTED !!! // CJC: seems to be supported now... //if( guiCurrentScreen != MAP_SCREEN ) { // Check attachments, override to valid placement if valid merge... if ( ValidAttachment( gpItemPointer->usItem, &(pSoldier->inv[ cnt ]) ) ) { gbInvalidPlacementSlot[ cnt ] = FALSE; } if ( ValidMerge( gpItemPointer->usItem, pSoldier->inv[ cnt ].usItem ) ) { gbInvalidPlacementSlot[ cnt ] = FALSE; } } } } else { // mark all inventory positions as valid for ( cnt = 0; cnt < NUM_INV_SLOTS; ++cnt ) { gbInvalidPlacementSlot[ cnt ] = FALSE; } } fInterfacePanelDirty = DIRTYLEVEL2; } //CHRISL: Function to handle backpack button rendering void RenderBackpackButtons(int bpAction) { // Only run function if we're using new inventory system if((UsingNewInventorySystem() == false)) return; // Only run this if we're not on the strategic screen if(guiCurrentItemDescriptionScreen == MAP_SCREEN) return; // Only run if the Tactical Inventory Panel is open if(gsCurInterfacePanel != SM_PANEL) return; // Don't run if keyring is open if(gfInKeyRingPopup) return; // If Merc hasn't been set, default to first merc if(gpSMCurrentMerc==NULL) gpSMCurrentMerc = MercPtrs[ 0 ]; Assert(gpSMCurrentMerc!=NULL); // Deal with buttons depending on which screen is currently active switch (bpAction) { case ACTIVATE_BUTTON: // Activate buttons if(giSMZipperButton != -1) RemoveButton( giSMZipperButton ); if(giSMZipperImages != -1) UnloadButtonImage( giSMZipperImages ); if(giSMDropPackButton != -1) RemoveButton( giSMDropPackButton ); if(giSMDropPackImages != -1) UnloadButtonImage( giSMDropPackImages ); gpSMCurrentMerc->flags.DropPackFlag = FALSE; if(gpSMCurrentMerc->inv[BPACKPOCKPOS].exists() == FALSE) { for(unsigned int wi = 0; wi < guiNumWorldItems; wi++) { if(gWorldItems[wi].soldierID == gpSMCurrentMerc->ubID && gWorldItems[wi].object.exists() == true) { gpSMCurrentMerc->flags.DropPackFlag = TRUE; break; } } } giSMZipperImages = UseLoadedButtonImage( iSMPanelImages[ BACKPACK_IMAGES ] ,-1 ,gbZipperButPos[ gpSMCurrentMerc->flags.ZipperFlag ][0],-1,gbZipperButPos[ gpSMCurrentMerc->flags.ZipperFlag ][1],-1 ); giSMDropPackImages = UseLoadedButtonImage( iSMPanelImages[ BACKPACK_IMAGES ] ,-1 ,gbDropPackButPos[ gpSMCurrentMerc->flags.DropPackFlag ][0],-1,gbDropPackButPos[ gpSMCurrentMerc->flags.DropPackFlag ][1],-1 ); //giSMDropPackImages = UseLoadedButtonImage( iSMPanelImages[ BACKPACK_IMAGES ] ,gbDropPackButPos[ gpSMCurrentMerc->flags.DropPackFlag ][0] ,gbDropPackButPos[ gpSMCurrentMerc->flags.DropPackFlag ][0],-1,gbDropPackButPos[ gpSMCurrentMerc->flags.DropPackFlag ][1],-1 ); giSMZipperButton = QuickCreateButton( giSMZipperImages, SM_ZIPPER_X, SM_ZIPPER_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnZipperCallback ); giSMDropPackButton = QuickCreateButton( giSMDropPackImages, SM_DROPPACK_X, SM_DROPPACK_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnDropPackCallback ); //SetButtonFastHelpText( giSMZipperButton, TacticalStr[ ] ); //SetButtonFastHelpText( giSMDropPackButton, TacticalStr[ ] ); break; case DEACTIVATE_BUTTON: // Deactivate buttons if(giSMZipperButton != -1) RemoveButton( giSMZipperButton ); if(giSMDropPackButton != -1) RemoveButton( giSMDropPackButton ); RenderBackpackButtons(UNLOAD_BUTTON); giSMDropPackImages = -1; giSMDropPackButton = -1; giSMZipperImages = -1; giSMZipperButton = -1; break; case ENABLE_BUTTON: // Enable buttons if(giSMDropPackButton == -1 || giSMZipperButton == -1) { RenderBackpackButtons(DEACTIVATE_BUTTON); RenderBackpackButtons(ACTIVATE_BUTTON); } if(giSMDropPackButton != -1) EnableButton( giSMDropPackButton ); if(giSMZipperButton != -1) EnableButton( giSMZipperButton ); break; case DISABLE_BUTTON: // Disable buttons if(giSMDropPackButton != -1) DisableButton( giSMDropPackButton ); if(giSMZipperButton != -1) DisableButton( giSMZipperButton ); break; case UNLOAD_BUTTON: if(giSMZipperImages != -1) UnloadButtonImage( giSMZipperImages ); if(giSMDropPackImages != -1) UnloadButtonImage( giSMDropPackImages ); break; } } void EnableSMPanelButtons( BOOLEAN fEnable , BOOLEAN fFromItemPickup ) { if ( fFromItemPickup ) { // If we have the item pointer up... // CJC Dec 4 2002: or if item pickup menu is up //if ( gpItemPointer != NULL ) if ( gpItemPointer != NULL || gfInItemPickupMenu ) { DisableTacticalTeamPanelButtons( TRUE ); } else { DisableTacticalTeamPanelButtons( FALSE ); } fInterfacePanelDirty = DIRTYLEVEL2; } if ( gsCurInterfacePanel == SM_PANEL ) { if ( fFromItemPickup ) { // If we have the item pointer up... if ( gpItemPointer != NULL ) { ReevaluateItemHatches( gpSMCurrentMerc, fEnable ); // Turn it all false first.... InternalHandleCompatibleAmmoUI( gpSMCurrentMerc, gpItemPointer, FALSE ); InternalHandleCompatibleAmmoUI( gpSMCurrentMerc, gpItemPointer, TRUE ); gfCheckForMouseOverItem = FALSE; // Highlight guys .... HandleAnyMercInSquadHasCompatibleStuff( (INT8)CurrentSquad( ), gpItemPointer, FALSE ); } else { //InternalHandleCompatibleAmmoUI( gpSMCurrentMerc, gpItemPointer, FALSE ); gfCheckForMouseOverItem = FALSE; HandleAnyMercInSquadHasCompatibleStuff( (INT8) CurrentSquad( ), NULL, TRUE ); } if ( fEnable ) { ReevaluateItemHatches( gpSMCurrentMerc, fEnable ); } fInterfacePanelDirty = DIRTYLEVEL2; } if ( fEnable ) { // only enable the following if NOT in shopkeeper's interface if ( !(guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) ) { EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); EnableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); EnableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); EnableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); EnableButton( iSMPanelButtons[ LOOK_BUTTON ] ); EnableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); EnableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); if ( giSMStealthButton != -1 ) { EnableButton( giSMStealthButton ); } RenderBackpackButtons(ENABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ if ( gfDisableTacticalPanelButtons ) { DisableButton( iSMPanelButtons[ OPTIONS_BUTTON ] ); DisableButton( iSMPanelButtons[ SM_DONE_BUTTON ] ); DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } else { EnableButton( iSMPanelButtons[ OPTIONS_BUTTON ] ); EnableButton( iSMPanelButtons[ SM_DONE_BUTTON ] ); EnableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } //enable the radar map region MSYS_EnableRegion(&gRadarRegion); gfSMDisableForItems = FALSE; DisableInvRegions( gfSMDisableForItems ); } if ( !fFromItemPickup ) { EnableButton( iSMPanelButtons[ NEXTMERC_BUTTON ] ); EnableButton( iSMPanelButtons[ PREVMERC_BUTTON ] ); } } else { DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ LOOK_BUTTON ] ); DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); if ( giSMStealthButton != -1 ) { DisableButton( giSMStealthButton ); } RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ if ( !fFromItemPickup ) { DisableButton( iSMPanelButtons[ NEXTMERC_BUTTON ] ); DisableButton( iSMPanelButtons[ PREVMERC_BUTTON ] ); } DisableButton( iSMPanelButtons[ OPTIONS_BUTTON ] ); DisableButton( iSMPanelButtons[ SM_DONE_BUTTON ] ); DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); //disable the radar map MSYS_DisableRegion(&gRadarRegion); } gfAllDisabled = !fEnable; } } SoldierID GetSMPanelCurrentMerc( ) { return( gusSMCurrentMerc ); } // CHRISL: New functions to define initial settings for New Inventory system void InitNewInventorySystem( ) { if (iResolution >= _640x480 && iResolution < _800x600) INTERFACE_WIDTH = 640; else if (iResolution < _1024x768) INTERFACE_WIDTH = 800; else INTERFACE_WIDTH = 1024; INTERFACE_START_X = (SCREEN_WIDTH - INTERFACE_WIDTH)/2; INTERFACE_HEIGHT = 120; INV_INTERFACE_HEIGHT = 200; INTERFACE_START_Y = ( SCREEN_HEIGHT - INTERFACE_HEIGHT ); INV_INTERFACE_START_Y = ( SCREEN_HEIGHT - INV_INTERFACE_HEIGHT ); } // CHRISL: New functions to define initial settings for Old Inventory system void InitOldInventorySystem( ) { if (iResolution >= _640x480 && iResolution < _800x600) INTERFACE_WIDTH = 640; else if (iResolution < _1024x768) INTERFACE_WIDTH = 800; else INTERFACE_WIDTH = 1024; INTERFACE_START_X = (SCREEN_WIDTH - INTERFACE_WIDTH)/2; INTERFACE_HEIGHT = 120; INV_INTERFACE_HEIGHT = 140; INTERFACE_START_Y = ( SCREEN_HEIGHT - INTERFACE_HEIGHT ); INV_INTERFACE_START_Y = ( SCREEN_HEIGHT - INV_INTERFACE_HEIGHT ); } // CHRISL: These functions will setup inventory panel coords based on game options BOOLEAN InitializeSMPanelCoordsOld() { // int i; // unused (jonathanl) /* * now i use standard positions and i add to them starting coords of panel but * we can add here function that will read coord in panel from file * that will be phase2 of making GUI more customizable * any questions? joker */ // Inventory slots gSMInvPocketXY[HELMETPOS].sX = INTERFACE_START_X + 344; gSMInvPocketXY[HELMETPOS].sY = INV_INTERFACE_START_Y + 6; // HELMETPOS gSMInvPocketXY[VESTPOS].sX = INTERFACE_START_X + 344; gSMInvPocketXY[VESTPOS].sY = INV_INTERFACE_START_Y + 35; // VESTPOS gSMInvPocketXY[LEGPOS].sX = INTERFACE_START_X + 344; gSMInvPocketXY[LEGPOS].sY = INV_INTERFACE_START_Y + 95; // LEGPOS, gSMInvPocketXY[HEAD1POS].sX = INTERFACE_START_X + 226; gSMInvPocketXY[HEAD1POS].sY = INV_INTERFACE_START_Y + 6; // HEAD1POS gSMInvPocketXY[HEAD2POS].sX = INTERFACE_START_X + 226; gSMInvPocketXY[HEAD2POS].sY = INV_INTERFACE_START_Y + 30; // HEAD2POS gSMInvPocketXY[HANDPOS].sX = INTERFACE_START_X + 226; gSMInvPocketXY[HANDPOS].sY = INV_INTERFACE_START_Y + 84; // HANDPOS, gSMInvPocketXY[SECONDHANDPOS].sX = INTERFACE_START_X + 226; gSMInvPocketXY[SECONDHANDPOS].sY = INV_INTERFACE_START_Y + 108; // SECONDHANDPOS gSMInvPocketXY[BIGPOCK1POS].sX = INTERFACE_START_X + 468; gSMInvPocketXY[BIGPOCK1POS].sY = INV_INTERFACE_START_Y + 5; // BIGPOCK1 gSMInvPocketXY[BIGPOCK2POS].sX = INTERFACE_START_X + 468; gSMInvPocketXY[BIGPOCK2POS].sY = INV_INTERFACE_START_Y + 29; // BIGPOCK2 gSMInvPocketXY[BIGPOCK3POS].sX = INTERFACE_START_X + 468; gSMInvPocketXY[BIGPOCK3POS].sY = INV_INTERFACE_START_Y + 53; // BIGPOCK3 gSMInvPocketXY[BIGPOCK4POS].sX = INTERFACE_START_X + 468; gSMInvPocketXY[BIGPOCK4POS].sY = INV_INTERFACE_START_Y + 77; // BIGPOCK4 gSMInvPocketXY[SMALLPOCK1POS].sX = INTERFACE_START_X + 396; gSMInvPocketXY[SMALLPOCK1POS].sY = INV_INTERFACE_START_Y + 5; // SMALLPOCK1 gSMInvPocketXY[SMALLPOCK2POS].sX = INTERFACE_START_X + 396; gSMInvPocketXY[SMALLPOCK2POS].sY = INV_INTERFACE_START_Y + 29; // SMALLPOCK2 gSMInvPocketXY[SMALLPOCK3POS].sX = INTERFACE_START_X + 396; gSMInvPocketXY[SMALLPOCK3POS].sY = INV_INTERFACE_START_Y + 53; // SMALLPOCK3 gSMInvPocketXY[SMALLPOCK4POS].sX = INTERFACE_START_X + 396; gSMInvPocketXY[SMALLPOCK4POS].sY = INV_INTERFACE_START_Y + 77; // SMALLPOCK4 gSMInvPocketXY[SMALLPOCK5POS].sX = INTERFACE_START_X + 432; gSMInvPocketXY[SMALLPOCK5POS].sY = INV_INTERFACE_START_Y + 5; // SMALLPOCK5 gSMInvPocketXY[SMALLPOCK6POS].sX = INTERFACE_START_X + 432; gSMInvPocketXY[SMALLPOCK6POS].sY = INV_INTERFACE_START_Y + 29; // SMALLPOCK6 gSMInvPocketXY[SMALLPOCK7POS].sX = INTERFACE_START_X + 432; gSMInvPocketXY[SMALLPOCK7POS].sY = INV_INTERFACE_START_Y + 53; // SMALLPOCK7 gSMInvPocketXY[SMALLPOCK8POS].sX = INTERFACE_START_X + 432; gSMInvPocketXY[SMALLPOCK8POS].sY = INV_INTERFACE_START_Y + 77; // SMALLPOCK8 SM_ITEMDESC_START_X = ( 214 + INTERFACE_START_X ); SM_ITEMDESC_START_Y = ( 1 + INV_INTERFACE_START_Y ); SM_ITEMDESC_HEIGHT = 128; SM_ITEMDESC_WIDTH = 358; SM_SELMERC_AP_X = ( 70 + INTERFACE_START_X ); SM_SELMERC_AP_Y = ( 53 + INV_INTERFACE_START_Y ); SM_SELMERC_AP_HEIGHT = 12; SM_SELMERC_AP_WIDTH = 11; SM_SELMERC_HEALTH_X = ( 69 + INTERFACE_START_X ); SM_SELMERC_HEALTH_Y = ( 47 + INV_INTERFACE_START_Y ); SM_SELMERC_HEALTH_WIDTH = 3; SM_SELMERC_HEALTH_HEIGHT = 42; SM_SELMERC_BREATH_X = ( 75 + INTERFACE_START_X ); SM_SELMERC_BREATH_Y = ( 47 + INV_INTERFACE_START_Y ); SM_SELMERC_BREATH_WIDTH = 3; SM_SELMERC_BREATH_HEIGHT = 42; SM_SELMERC_MORALE_X = ( 81 + INTERFACE_START_X ); SM_SELMERC_MORALE_Y = ( 47 + INV_INTERFACE_START_Y ); SM_SELMERC_MORALE_WIDTH = 3; SM_SELMERC_MORALE_HEIGHT = 42; SM_SELMERC_BARS_TIP_X = ( SM_SELMERC_HEALTH_X - SM_SELMERC_HEALTH_WIDTH ); SM_SELMERC_BARS_TIP_Y = ( SM_SELMERC_HEALTH_Y - SM_SELMERC_HEALTH_HEIGHT ); SM_SELMERC_BARS_TIP_WIDTH = ((SM_SELMERC_BREATH_WIDTH + 4) *3); SM_SELMERC_BARS_TIP_HEIGHT= ( SM_SELMERC_HEALTH_HEIGHT ); SM_SELMERCNAME_X = ( 7 + INTERFACE_START_X ); SM_SELMERCNAME_Y = ( 55 + INV_INTERFACE_START_Y ); SM_SELMERCNAME_WIDTH = 53; SM_SELMERCNAME_HEIGHT = 9; SM_SELMERC_FACE_X = ( 13 + INTERFACE_START_X ); SM_SELMERC_FACE_Y = ( 6 + INV_INTERFACE_START_Y ); SM_SELMERC_FACE_HEIGHT = 42; SM_SELMERC_FACE_WIDTH = 48; SM_SELMERC_PLATE_X = ( 4 + INTERFACE_START_X ); SM_SELMERC_PLATE_Y = ( 2 + INV_INTERFACE_START_Y ); SM_SELMERC_PLATE_HEIGHT = 65; SM_SELMERC_PLATE_WIDTH = 83; SM_BODYINV_X = ( 244 + INTERFACE_START_X ); SM_BODYINV_Y = ( 6 + INV_INTERFACE_START_Y ); // Cammo gSMCamoXY.sX = SM_BODYINV_X; gSMCamoXY.sY = SM_BODYINV_Y; SM_TALKB_X = ( 155 + INTERFACE_START_X ); SM_TALKB_Y = ( 108 + INV_INTERFACE_START_Y ); SM_MUTEB_X = ( 91 + INTERFACE_START_X ); SM_MUTEB_Y = ( 108 + INV_INTERFACE_START_Y ); SM_STANCEUPB_X = ( 187 + INTERFACE_START_X ); SM_STANCEUPB_Y = ( 40 + INV_INTERFACE_START_Y ); SM_UPDOWNB_X = ( 91 + INTERFACE_START_X ); SM_UPDOWNB_Y = ( 73 + INV_INTERFACE_START_Y ); SM_CLIMBB_X = ( 187 + INTERFACE_START_X ); SM_CLIMBB_Y = ( 8 + INV_INTERFACE_START_Y ); SM_STANCEDOWNB_X = ( 187 + INTERFACE_START_X ); SM_STANCEDOWNB_Y = ( 108 + INV_INTERFACE_START_Y ); SM_HANDCURSORB_X = ( 123 + INTERFACE_START_X ); SM_HANDCURSORB_Y = ( 73 + INV_INTERFACE_START_Y ); SM_PREVMERCB_X = ( 9 + INTERFACE_START_X ); SM_PREVMERCB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_NEXTMERCB_X = ( 51 + INTERFACE_START_X ); SM_NEXTMERCB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_OPTIONSB_X = ( 9 + INTERFACE_START_X ); SM_OPTIONSB_Y = ( 105 + INV_INTERFACE_START_Y ); SM_BURSTMODEB_X = ( 155 + INTERFACE_START_X ); SM_BURSTMODEB_Y = ( 73 + INV_INTERFACE_START_Y ); SM_LOOKB_X = ( 123 + INTERFACE_START_X ); SM_LOOKB_Y = ( 108 + INV_INTERFACE_START_Y ); SM_STEALTHMODE_X = ( 187 + INTERFACE_START_X ); SM_STEALTHMODE_Y = ( 73 + INV_INTERFACE_START_Y ); SM_DONE_X = xResOffset + (xResSize - 97); SM_MAPSCREEN_X = xResOffset + (xResSize - 51); //dnl INTERFACE_CLOCK_X = xResOffset + (xResSize - 86); //dnl INTERFACE_CLOCK_Y = ( 119 + INV_INTERFACE_START_Y ); if (isWidescreenUI()) { INTERFACE_CLOCK_X = SCREEN_WIDTH - 86; } else { INTERFACE_CLOCK_X = SCREEN_WIDTH - xResOffset - 86; } INTERFACE_CLOCK_Y = SCREEN_HEIGHT - 24; LOCATION_NAME_X = xResOffset + (xResSize - 92); LOCATION_NAME_Y = ( 65 + INTERFACE_START_Y ); SM_DONE_Y = ( 4 + INV_INTERFACE_START_Y ); SM_MAPSCREEN_Y = ( 4 + INV_INTERFACE_START_Y ); SM_POSITIONB_X = ( 106 + INTERFACE_START_X ); SM_POSITIONB_Y = ( 34 + INV_INTERFACE_START_Y ); SM_POSITIONB_WIDTH = 19; SM_POSITIONB_HEIGHT = 24; SM_PERCENT_WIDTH = 20; SM_PERCENT_HEIGHT = 10; SM_ARMOR_X = ( 347 + INTERFACE_START_X ); SM_ARMOR_Y = ( 79 + INV_INTERFACE_START_Y ); SM_ARMOR_LABEL_X = ( 363 + INTERFACE_START_X ); SM_ARMOR_LABEL_Y = ( 69 + INV_INTERFACE_START_Y ); SM_ARMOR_PERCENT_X = ( 368 + INTERFACE_START_X ); SM_ARMOR_PERCENT_Y = ( 79 + INV_INTERFACE_START_Y ); SM_WEIGHT_LABEL_X = ( 430 + INTERFACE_START_X ); SM_WEIGHT_LABEL_Y = ( 107 + INV_INTERFACE_START_Y ); SM_WEIGHT_PERCENT_X = ( 449 + INTERFACE_START_X ); SM_WEIGHT_PERCENT_Y = ( 107 + INV_INTERFACE_START_Y ); SM_WEIGHT_X = ( 428 + INTERFACE_START_X ); SM_WEIGHT_Y = ( 106 + INV_INTERFACE_START_Y ); SM_CAMMO_LABEL_X = ( 430 + INTERFACE_START_X ); SM_CAMMO_LABEL_Y = ( 122 + INV_INTERFACE_START_Y ); SM_CAMMO_PERCENT_X = ( 449 + INTERFACE_START_X ); SM_CAMMO_PERCENT_Y = ( 121 + INV_INTERFACE_START_Y ); SM_CAMMO_X = ( 428 + INTERFACE_START_X ); SM_CAMMO_Y = ( 121 + INV_INTERFACE_START_Y ); SM_STATS_WIDTH = 16; SM_STATS_HEIGHT = 8 ; SM_AGI_X = ( 115 + INTERFACE_START_X ); SM_AGI_Y = ( 7 + INV_INTERFACE_START_Y ); SM_DEX_X = ( 115 + INTERFACE_START_X ); SM_DEX_Y = ( 17 + INV_INTERFACE_START_Y ); SM_STR_X = ( 115 + INTERFACE_START_X ); SM_STR_Y = ( 27 + INV_INTERFACE_START_Y ); SM_CHAR_X = ( 115 + INTERFACE_START_X ); SM_CHAR_Y = ( 37 + INV_INTERFACE_START_Y ); SM_WIS_X = ( 115 + INTERFACE_START_X ); SM_WIS_Y = ( 47 + INV_INTERFACE_START_Y ); SM_EXPLVL_X = ( 163 + INTERFACE_START_X ); SM_EXPLVL_Y = ( 7 + INV_INTERFACE_START_Y ); SM_MRKM_X = ( 163 + INTERFACE_START_X ); SM_MRKM_Y = ( 17 + INV_INTERFACE_START_Y ); SM_MECH_X = ( 163 + INTERFACE_START_X ); SM_MECH_Y = ( 27 + INV_INTERFACE_START_Y ); SM_EXPL_X = ( 163 + INTERFACE_START_X ); SM_EXPL_Y = ( 37 + INV_INTERFACE_START_Y ); SM_MED_X = ( 163 + INTERFACE_START_X ); SM_MED_Y = ( 47 + INV_INTERFACE_START_Y ); MONEY_X = ( 460 + INTERFACE_START_X ); MONEY_Y = ( 105 + INV_INTERFACE_START_Y ); MONEY_WIDTH = 30; MONEY_HEIGHT = 22; // ow ye font color they can also be customizable :P STATS_TITLE_FONT_COLOR = 6; STATS_TEXT_FONT_COLOR = 5; // Keyring 496/106 on Inventory_Bottom_Panel.sti KEYRING_X = xResOffset + 496; KEYRING_Y = (106 + INV_INTERFACE_START_Y); // so we got everything "dynamic" now we just return TRUE return ( TRUE ); } BOOLEAN InitializeSMPanelCoordsNew() { // int i; // unused (jonathanl) /* * now i use standard positions and i add to them starting coords of panel but * we can add here function that will read coord in panel from file * that will be phase2 of making GUI more customizable * any questions? joker */ /* CHRISL: Inventory slot information was completly altered to allow for new inventory pockets and to allow the new inventory interface to function properly. Also altered many of the interface coords so that the new interface would line up correctly.*/ // Inventory slots if (iResolution >= _640x480 && iResolution < _800x600) { gSMInvPocketXY[0].sX = INTERFACE_START_X + 239; gSMInvPocketXY[0].sY = INV_INTERFACE_START_Y + 68; // HELMETPOS gSMInvPocketXY[1].sX = INTERFACE_START_X + 239; gSMInvPocketXY[1].sY = INV_INTERFACE_START_Y + 96; // VESTPOS gSMInvPocketXY[2].sX = INTERFACE_START_X + 239; gSMInvPocketXY[2].sY = INV_INTERFACE_START_Y + 157; // LEGPOS gSMInvPocketXY[3].sX = INTERFACE_START_X + 124; gSMInvPocketXY[3].sY = INV_INTERFACE_START_Y + 68; // HEAD1POS gSMInvPocketXY[4].sX = INTERFACE_START_X + 124; gSMInvPocketXY[4].sY = INV_INTERFACE_START_Y + 92; // HEAD2POS gSMInvPocketXY[5].sX = INTERFACE_START_X + 124; gSMInvPocketXY[5].sY = INV_INTERFACE_START_Y + 146; // HANDPOS gSMInvPocketXY[6].sX = INTERFACE_START_X + 124; gSMInvPocketXY[6].sY = INV_INTERFACE_START_Y + 170; // SECONDHANDPOS gSMInvPocketXY[7].sX = INTERFACE_START_X + 274; gSMInvPocketXY[7].sY = INV_INTERFACE_START_Y + 13; // VESTPOCK gSMInvPocketXY[8].sX = INTERFACE_START_X + 292; gSMInvPocketXY[8].sY = INV_INTERFACE_START_Y + 79; // LTHIGHPOCK gSMInvPocketXY[9].sX = INTERFACE_START_X + 340; gSMInvPocketXY[9].sY = INV_INTERFACE_START_Y + 79; // RTHIGHPOCK gSMInvPocketXY[10].sX = INTERFACE_START_X + 443; gSMInvPocketXY[10].sY = INV_INTERFACE_START_Y + 79; // CPACKPOCK gSMInvPocketXY[11].sX = INTERFACE_START_X + 486; gSMInvPocketXY[11].sY = INV_INTERFACE_START_Y + 13; // BPACKPOCK gSMInvPocketXY[12].sX = INTERFACE_START_X + 383; gSMInvPocketXY[12].sY = INV_INTERFACE_START_Y + 79; // GUNSLINGPOCKPOS gSMInvPocketXY[13].sX = INTERFACE_START_X + 499; gSMInvPocketXY[13].sY = INV_INTERFACE_START_Y + 79; // KNIFEPOCKPOS gSMInvPocketXY[14].sX = INTERFACE_START_X + 433; gSMInvPocketXY[14].sY = INV_INTERFACE_START_Y + 116; // BIGPOCK1 gSMInvPocketXY[15].sX = INTERFACE_START_X + 433; gSMInvPocketXY[15].sY = INV_INTERFACE_START_Y + 140; // BIGPOCK2 gSMInvPocketXY[16].sX = INTERFACE_START_X + 433; gSMInvPocketXY[16].sY = INV_INTERFACE_START_Y + 164; // BIGPOCK3 gSMInvPocketXY[17].sX = INTERFACE_START_X + 582; gSMInvPocketXY[17].sY = INV_INTERFACE_START_Y + 10; // BIGPOCK4 gSMInvPocketXY[18].sX = INTERFACE_START_X + 582; gSMInvPocketXY[18].sY = INV_INTERFACE_START_Y + 34; // BIGPOCK5 gSMInvPocketXY[19].sX = INTERFACE_START_X + 582; gSMInvPocketXY[19].sY = INV_INTERFACE_START_Y + 58; // BIGPOCK6 gSMInvPocketXY[20].sX = INTERFACE_START_X + 582; gSMInvPocketXY[20].sY = INV_INTERFACE_START_Y + 82; // BIGPOCK7 gSMInvPocketXY[21].sX = INTERFACE_START_X + 439; gSMInvPocketXY[21].sY = INV_INTERFACE_START_Y + 10; // MEDPOCK1 gSMInvPocketXY[22].sX = INTERFACE_START_X + 439; gSMInvPocketXY[22].sY = INV_INTERFACE_START_Y + 34; // MEDPOCK2 gSMInvPocketXY[23].sX = INTERFACE_START_X + 295; gSMInvPocketXY[23].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK3 gSMInvPocketXY[24].sX = INTERFACE_START_X + 343; gSMInvPocketXY[24].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK4 gSMInvPocketXY[25].sX = INTERFACE_START_X + 324; gSMInvPocketXY[25].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK1 gSMInvPocketXY[26].sX = INTERFACE_START_X + 347; gSMInvPocketXY[26].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK2 gSMInvPocketXY[27].sX = INTERFACE_START_X + 370; gSMInvPocketXY[27].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK3 gSMInvPocketXY[28].sX = INTERFACE_START_X + 393; gSMInvPocketXY[28].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK4 gSMInvPocketXY[29].sX = INTERFACE_START_X + 416; gSMInvPocketXY[29].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK5 gSMInvPocketXY[30].sX = INTERFACE_START_X + 324; gSMInvPocketXY[30].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK6 gSMInvPocketXY[31].sX = INTERFACE_START_X + 347; gSMInvPocketXY[31].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK7 gSMInvPocketXY[32].sX = INTERFACE_START_X + 370; gSMInvPocketXY[32].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK8 gSMInvPocketXY[33].sX = INTERFACE_START_X + 393; gSMInvPocketXY[33].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK9 gSMInvPocketXY[34].sX = INTERFACE_START_X + 416; gSMInvPocketXY[34].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK10 gSMInvPocketXY[35].sX = INTERFACE_START_X + 291; gSMInvPocketXY[35].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK11 gSMInvPocketXY[36].sX = INTERFACE_START_X + 314; gSMInvPocketXY[36].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK12 gSMInvPocketXY[37].sX = INTERFACE_START_X + 291; gSMInvPocketXY[37].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK13 gSMInvPocketXY[38].sX = INTERFACE_START_X + 314; gSMInvPocketXY[38].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK14 gSMInvPocketXY[39].sX = INTERFACE_START_X + 339; gSMInvPocketXY[39].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK15 gSMInvPocketXY[40].sX = INTERFACE_START_X + 362; gSMInvPocketXY[40].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK16 gSMInvPocketXY[41].sX = INTERFACE_START_X + 339; gSMInvPocketXY[41].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK17 gSMInvPocketXY[42].sX = INTERFACE_START_X + 362; gSMInvPocketXY[42].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK18 gSMInvPocketXY[43].sX = INTERFACE_START_X + 387; gSMInvPocketXY[43].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK19 gSMInvPocketXY[44].sX = INTERFACE_START_X + 410; gSMInvPocketXY[44].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK20 gSMInvPocketXY[45].sX = INTERFACE_START_X + 387; gSMInvPocketXY[45].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK21 gSMInvPocketXY[46].sX = INTERFACE_START_X + 410; gSMInvPocketXY[46].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK22 gSMInvPocketXY[47].sX = INTERFACE_START_X + 536; gSMInvPocketXY[47].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK23 gSMInvPocketXY[48].sX = INTERFACE_START_X + 536; gSMInvPocketXY[48].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK24 gSMInvPocketXY[49].sX = INTERFACE_START_X + 536; gSMInvPocketXY[49].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK25 gSMInvPocketXY[50].sX = INTERFACE_START_X + 536; gSMInvPocketXY[50].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK26 gSMInvPocketXY[51].sX = INTERFACE_START_X + 559; gSMInvPocketXY[51].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK27 gSMInvPocketXY[52].sX = INTERFACE_START_X + 559; gSMInvPocketXY[52].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK28 gSMInvPocketXY[53].sX = INTERFACE_START_X + 559; gSMInvPocketXY[53].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK29 gSMInvPocketXY[54].sX = INTERFACE_START_X + 559; gSMInvPocketXY[54].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK30 } else if (iResolution < _1024x768) { gSMInvPocketXY[0].sX = INTERFACE_START_X + 258; gSMInvPocketXY[0].sY = INV_INTERFACE_START_Y + 68; // HELMETPOS gSMInvPocketXY[1].sX = INTERFACE_START_X + 258; gSMInvPocketXY[1].sY = INV_INTERFACE_START_Y + 97; // VESTPOS gSMInvPocketXY[2].sX = INTERFACE_START_X + 258; gSMInvPocketXY[2].sY = INV_INTERFACE_START_Y + 157; // LEGPOS gSMInvPocketXY[3].sX = INTERFACE_START_X + 124; gSMInvPocketXY[3].sY = INV_INTERFACE_START_Y + 68; // HEAD1POS gSMInvPocketXY[4].sX = INTERFACE_START_X + 124; gSMInvPocketXY[4].sY = INV_INTERFACE_START_Y + 92; // HEAD2POS gSMInvPocketXY[5].sX = INTERFACE_START_X + 124; gSMInvPocketXY[5].sY = INV_INTERFACE_START_Y + 146; // HANDPOS gSMInvPocketXY[6].sX = INTERFACE_START_X + 124; gSMInvPocketXY[6].sY = INV_INTERFACE_START_Y + 170; // SECONDHANDPOS gSMInvPocketXY[7].sX = INTERFACE_START_X + 284; gSMInvPocketXY[7].sY = INV_INTERFACE_START_Y + 13; // VESTPOCK gSMInvPocketXY[8].sX = INTERFACE_START_X + 323; gSMInvPocketXY[8].sY = INV_INTERFACE_START_Y + 79; // LTHIGHPOCK gSMInvPocketXY[9].sX = INTERFACE_START_X + 439; gSMInvPocketXY[9].sY = INV_INTERFACE_START_Y + 79; // RTHIGHPOCK gSMInvPocketXY[10].sX = INTERFACE_START_X + 586; gSMInvPocketXY[10].sY = INV_INTERFACE_START_Y + 79; // CPACKPOCK gSMInvPocketXY[11].sX = INTERFACE_START_X + 594; gSMInvPocketXY[11].sY = INV_INTERFACE_START_Y + 13; // BPACKPOCK gSMInvPocketXY[12].sX = INTERFACE_START_X + 505; gSMInvPocketXY[12].sY = INV_INTERFACE_START_Y + 79; // GUNSLINGPOCKPOS gSMInvPocketXY[13].sX = INTERFACE_START_X + 388; gSMInvPocketXY[13].sY = INV_INTERFACE_START_Y + 79; // KNIFEPOCKPOS gSMInvPocketXY[14].sX = INTERFACE_START_X + 565; gSMInvPocketXY[14].sY = INV_INTERFACE_START_Y + 116; // BIGPOCK1 gSMInvPocketXY[15].sX = INTERFACE_START_X + 565; gSMInvPocketXY[15].sY = INV_INTERFACE_START_Y + 140; // BIGPOCK2 gSMInvPocketXY[16].sX = INTERFACE_START_X + 565; gSMInvPocketXY[16].sY = INV_INTERFACE_START_Y + 164; // BIGPOCK3 gSMInvPocketXY[17].sX = INTERFACE_START_X + 729; gSMInvPocketXY[17].sY = INV_INTERFACE_START_Y + 10; // BIGPOCK4 gSMInvPocketXY[18].sX = INTERFACE_START_X + 729; gSMInvPocketXY[18].sY = INV_INTERFACE_START_Y + 34; // BIGPOCK5 gSMInvPocketXY[19].sX = INTERFACE_START_X + 729; gSMInvPocketXY[19].sY = INV_INTERFACE_START_Y + 58; // BIGPOCK6 gSMInvPocketXY[20].sX = INTERFACE_START_X + 729; gSMInvPocketXY[20].sY = INV_INTERFACE_START_Y + 82; // BIGPOCK7 gSMInvPocketXY[21].sX = INTERFACE_START_X + 527; gSMInvPocketXY[21].sY = INV_INTERFACE_START_Y + 10; // MEDPOCK1 gSMInvPocketXY[22].sX = INTERFACE_START_X + 527; gSMInvPocketXY[22].sY = INV_INTERFACE_START_Y + 34; // MEDPOCK2 gSMInvPocketXY[23].sX = INTERFACE_START_X + 333; gSMInvPocketXY[23].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK3 gSMInvPocketXY[24].sX = INTERFACE_START_X + 419; gSMInvPocketXY[24].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK4 gSMInvPocketXY[25].sX = INTERFACE_START_X + 347; gSMInvPocketXY[25].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK1 gSMInvPocketXY[26].sX = INTERFACE_START_X + 383; gSMInvPocketXY[26].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK2 gSMInvPocketXY[27].sX = INTERFACE_START_X + 419; gSMInvPocketXY[27].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK3 gSMInvPocketXY[28].sX = INTERFACE_START_X + 455; gSMInvPocketXY[28].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK4 gSMInvPocketXY[29].sX = INTERFACE_START_X + 491; gSMInvPocketXY[29].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK5 gSMInvPocketXY[30].sX = INTERFACE_START_X + 347; gSMInvPocketXY[30].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK6 gSMInvPocketXY[31].sX = INTERFACE_START_X + 383; gSMInvPocketXY[31].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK7 gSMInvPocketXY[32].sX = INTERFACE_START_X + 419; gSMInvPocketXY[32].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK8 gSMInvPocketXY[33].sX = INTERFACE_START_X + 455; gSMInvPocketXY[33].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK9 gSMInvPocketXY[34].sX = INTERFACE_START_X + 491; gSMInvPocketXY[34].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK10 gSMInvPocketXY[35].sX = INTERFACE_START_X + 321; gSMInvPocketXY[35].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK11 gSMInvPocketXY[36].sX = INTERFACE_START_X + 357; gSMInvPocketXY[36].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK12 gSMInvPocketXY[37].sX = INTERFACE_START_X + 321; gSMInvPocketXY[37].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK13 gSMInvPocketXY[38].sX = INTERFACE_START_X + 357; gSMInvPocketXY[38].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK14 gSMInvPocketXY[39].sX = INTERFACE_START_X + 407; gSMInvPocketXY[39].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK15 gSMInvPocketXY[40].sX = INTERFACE_START_X + 443; gSMInvPocketXY[40].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK16 gSMInvPocketXY[41].sX = INTERFACE_START_X + 407; gSMInvPocketXY[41].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK17 gSMInvPocketXY[42].sX = INTERFACE_START_X + 443; gSMInvPocketXY[42].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK18 gSMInvPocketXY[43].sX = INTERFACE_START_X + 493; gSMInvPocketXY[43].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK19 gSMInvPocketXY[44].sX = INTERFACE_START_X + 529; gSMInvPocketXY[44].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK20 gSMInvPocketXY[45].sX = INTERFACE_START_X + 493; gSMInvPocketXY[45].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK21 gSMInvPocketXY[46].sX = INTERFACE_START_X + 529; gSMInvPocketXY[46].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK22 gSMInvPocketXY[47].sX = INTERFACE_START_X + 657; gSMInvPocketXY[47].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK23 gSMInvPocketXY[48].sX = INTERFACE_START_X + 657; gSMInvPocketXY[48].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK24 gSMInvPocketXY[49].sX = INTERFACE_START_X + 657; gSMInvPocketXY[49].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK25 gSMInvPocketXY[50].sX = INTERFACE_START_X + 657; gSMInvPocketXY[50].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK26 gSMInvPocketXY[51].sX = INTERFACE_START_X + 693; gSMInvPocketXY[51].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK27 gSMInvPocketXY[52].sX = INTERFACE_START_X + 693; gSMInvPocketXY[52].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK28 gSMInvPocketXY[53].sX = INTERFACE_START_X + 693; gSMInvPocketXY[53].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK29 gSMInvPocketXY[54].sX = INTERFACE_START_X + 693; gSMInvPocketXY[54].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK30 } else { //1024x768 resolution gSMInvPocketXY[0].sX = INTERFACE_START_X + 258; gSMInvPocketXY[0].sY = INV_INTERFACE_START_Y + 68; // HELMETPOS gSMInvPocketXY[1].sX = INTERFACE_START_X + 258; gSMInvPocketXY[1].sY = INV_INTERFACE_START_Y + 97; // VESTPOS gSMInvPocketXY[2].sX = INTERFACE_START_X + 258; gSMInvPocketXY[2].sY = INV_INTERFACE_START_Y + 157; // LEGPOS gSMInvPocketXY[3].sX = INTERFACE_START_X + 124; gSMInvPocketXY[3].sY = INV_INTERFACE_START_Y + 68; // HEAD1POS gSMInvPocketXY[4].sX = INTERFACE_START_X + 124; gSMInvPocketXY[4].sY = INV_INTERFACE_START_Y + 92; // HEAD2POS gSMInvPocketXY[5].sX = INTERFACE_START_X + 124; gSMInvPocketXY[5].sY = INV_INTERFACE_START_Y + 146; // HANDPOS gSMInvPocketXY[6].sX = INTERFACE_START_X + 124; gSMInvPocketXY[6].sY = INV_INTERFACE_START_Y + 170; // SECONDHANDPOS gSMInvPocketXY[7].sX = INTERFACE_START_X + 284; gSMInvPocketXY[7].sY = INV_INTERFACE_START_Y + 13; // VESTPOCK gSMInvPocketXY[8].sX = INTERFACE_START_X + 358; gSMInvPocketXY[8].sY = INV_INTERFACE_START_Y + 79; // LTHIGHPOCK gSMInvPocketXY[9].sX = INTERFACE_START_X + 516; gSMInvPocketXY[9].sY = INV_INTERFACE_START_Y + 79; // RTHIGHPOCK gSMInvPocketXY[10].sX = INTERFACE_START_X + 594; gSMInvPocketXY[10].sY = INV_INTERFACE_START_Y + 128; // CPACKPOCK gSMInvPocketXY[11].sX = INTERFACE_START_X + 594; gSMInvPocketXY[11].sY = INV_INTERFACE_START_Y + 13; // BPACKPOCK gSMInvPocketXY[12].sX = INTERFACE_START_X + 429; gSMInvPocketXY[12].sY = INV_INTERFACE_START_Y + 79; // GUNSLINGPOCKPOS gSMInvPocketXY[13].sX = INTERFACE_START_X + 594; gSMInvPocketXY[13].sY = INV_INTERFACE_START_Y + 79; // KNIFEPOCKPOS gSMInvPocketXY[14].sX = INTERFACE_START_X + 729; gSMInvPocketXY[14].sY = INV_INTERFACE_START_Y + 116; // BIGPOCK1 gSMInvPocketXY[15].sX = INTERFACE_START_X + 729; gSMInvPocketXY[15].sY = INV_INTERFACE_START_Y + 140; // BIGPOCK2 gSMInvPocketXY[16].sX = INTERFACE_START_X + 729; gSMInvPocketXY[16].sY = INV_INTERFACE_START_Y + 164; // BIGPOCK3 gSMInvPocketXY[17].sX = INTERFACE_START_X + 729; gSMInvPocketXY[17].sY = INV_INTERFACE_START_Y + 10; // BIGPOCK4 gSMInvPocketXY[18].sX = INTERFACE_START_X + 729; gSMInvPocketXY[18].sY = INV_INTERFACE_START_Y + 34; // BIGPOCK5 gSMInvPocketXY[19].sX = INTERFACE_START_X + 729; gSMInvPocketXY[19].sY = INV_INTERFACE_START_Y + 58; // BIGPOCK6 gSMInvPocketXY[20].sX = INTERFACE_START_X + 729; gSMInvPocketXY[20].sY = INV_INTERFACE_START_Y + 82; // BIGPOCK7 gSMInvPocketXY[21].sX = INTERFACE_START_X + 527; gSMInvPocketXY[21].sY = INV_INTERFACE_START_Y + 10; // MEDPOCK1 gSMInvPocketXY[22].sX = INTERFACE_START_X + 527; gSMInvPocketXY[22].sY = INV_INTERFACE_START_Y + 34; // MEDPOCK2 gSMInvPocketXY[23].sX = INTERFACE_START_X + 359; gSMInvPocketXY[23].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK3 gSMInvPocketXY[24].sX = INTERFACE_START_X + 517; gSMInvPocketXY[24].sY = INV_INTERFACE_START_Y + 164; // MEDPOCK4 gSMInvPocketXY[25].sX = INTERFACE_START_X + 347; gSMInvPocketXY[25].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK1 gSMInvPocketXY[26].sX = INTERFACE_START_X + 383; gSMInvPocketXY[26].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK2 gSMInvPocketXY[27].sX = INTERFACE_START_X + 419; gSMInvPocketXY[27].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK3 gSMInvPocketXY[28].sX = INTERFACE_START_X + 455; gSMInvPocketXY[28].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK4 gSMInvPocketXY[29].sX = INTERFACE_START_X + 491; gSMInvPocketXY[29].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK5 gSMInvPocketXY[30].sX = INTERFACE_START_X + 347; gSMInvPocketXY[30].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK6 gSMInvPocketXY[31].sX = INTERFACE_START_X + 383; gSMInvPocketXY[31].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK7 gSMInvPocketXY[32].sX = INTERFACE_START_X + 419; gSMInvPocketXY[32].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK8 gSMInvPocketXY[33].sX = INTERFACE_START_X + 455; gSMInvPocketXY[33].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK9 gSMInvPocketXY[34].sX = INTERFACE_START_X + 491; gSMInvPocketXY[34].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK10 gSMInvPocketXY[35].sX = INTERFACE_START_X + 347; gSMInvPocketXY[35].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK11 gSMInvPocketXY[36].sX = INTERFACE_START_X + 383; gSMInvPocketXY[36].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK12 gSMInvPocketXY[37].sX = INTERFACE_START_X + 347; gSMInvPocketXY[37].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK13 gSMInvPocketXY[38].sX = INTERFACE_START_X + 383; gSMInvPocketXY[38].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK14 gSMInvPocketXY[39].sX = INTERFACE_START_X + 505; gSMInvPocketXY[39].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK15 gSMInvPocketXY[40].sX = INTERFACE_START_X + 541; gSMInvPocketXY[40].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK16 gSMInvPocketXY[41].sX = INTERFACE_START_X + 505; gSMInvPocketXY[41].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK17 gSMInvPocketXY[42].sX = INTERFACE_START_X + 541; gSMInvPocketXY[42].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK18 gSMInvPocketXY[43].sX = INTERFACE_START_X + 657; gSMInvPocketXY[43].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK19 gSMInvPocketXY[44].sX = INTERFACE_START_X + 693; gSMInvPocketXY[44].sY = INV_INTERFACE_START_Y + 116; // SMALLPOCK20 gSMInvPocketXY[45].sX = INTERFACE_START_X + 657; gSMInvPocketXY[45].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK21 gSMInvPocketXY[46].sX = INTERFACE_START_X + 693; gSMInvPocketXY[46].sY = INV_INTERFACE_START_Y + 140; // SMALLPOCK22 gSMInvPocketXY[47].sX = INTERFACE_START_X + 657; gSMInvPocketXY[47].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK23 gSMInvPocketXY[48].sX = INTERFACE_START_X + 657; gSMInvPocketXY[48].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK24 gSMInvPocketXY[49].sX = INTERFACE_START_X + 657; gSMInvPocketXY[49].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK25 gSMInvPocketXY[50].sX = INTERFACE_START_X + 657; gSMInvPocketXY[50].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK26 gSMInvPocketXY[51].sX = INTERFACE_START_X + 693; gSMInvPocketXY[51].sY = INV_INTERFACE_START_Y + 10; // SMALLPOCK27 gSMInvPocketXY[52].sX = INTERFACE_START_X + 693; gSMInvPocketXY[52].sY = INV_INTERFACE_START_Y + 34; // SMALLPOCK28 gSMInvPocketXY[53].sX = INTERFACE_START_X + 693; gSMInvPocketXY[53].sY = INV_INTERFACE_START_Y + 58; // SMALLPOCK29 gSMInvPocketXY[54].sX = INTERFACE_START_X + 693; gSMInvPocketXY[54].sY = INV_INTERFACE_START_Y + 82; // SMALLPOCK30 } SM_ITEMDESC_START_X = ( 114 + INTERFACE_START_X ); //115 SM_ITEMDESC_START_Y = ( 1 + INV_INTERFACE_START_Y ); SM_ITEMDESC_HEIGHT = 128; SM_ITEMDESC_WIDTH = 358; SM_SELMERC_AP_X = ( 71 + INTERFACE_START_X ); SM_SELMERC_AP_Y = ( 53 + INV_INTERFACE_START_Y ); SM_SELMERC_AP_HEIGHT = 12; SM_SELMERC_AP_WIDTH = 11; SM_SELMERC_HEALTH_X = ( 70 + INTERFACE_START_X ); SM_SELMERC_HEALTH_Y = ( 48 + INV_INTERFACE_START_Y ); SM_SELMERC_HEALTH_WIDTH = 3; SM_SELMERC_HEALTH_HEIGHT = 42; SM_SELMERC_BREATH_X = ( 76 + INTERFACE_START_X ); SM_SELMERC_BREATH_Y = ( 48 + INV_INTERFACE_START_Y ); SM_SELMERC_BREATH_WIDTH = 3; SM_SELMERC_BREATH_HEIGHT = 42; SM_SELMERC_MORALE_X = ( 82 + INTERFACE_START_X ); SM_SELMERC_MORALE_Y = ( 48 + INV_INTERFACE_START_Y ); SM_SELMERC_MORALE_WIDTH = 3; SM_SELMERC_MORALE_HEIGHT = 42; SM_SELMERC_BARS_TIP_X = ( SM_SELMERC_HEALTH_X - SM_SELMERC_HEALTH_WIDTH ); SM_SELMERC_BARS_TIP_Y = ( SM_SELMERC_HEALTH_Y - SM_SELMERC_HEALTH_HEIGHT ); SM_SELMERC_BARS_TIP_WIDTH = ((SM_SELMERC_BREATH_WIDTH + 4) *3); SM_SELMERC_BARS_TIP_HEIGHT= ( SM_SELMERC_HEALTH_HEIGHT ); SM_SELMERCNAME_X = ( 12 + INTERFACE_START_X ); SM_SELMERCNAME_Y = ( 55 + INV_INTERFACE_START_Y ); SM_SELMERCNAME_WIDTH = 53; SM_SELMERCNAME_HEIGHT = 11; SM_SELMERC_FACE_X = ( 14 + INTERFACE_START_X ); SM_SELMERC_FACE_Y = ( 5 + INV_INTERFACE_START_Y ); SM_SELMERC_FACE_HEIGHT = 42; SM_SELMERC_FACE_WIDTH = 48; SM_SELMERC_PLATE_X = ( 5 + INTERFACE_START_X ); SM_SELMERC_PLATE_Y = ( 2 + INV_INTERFACE_START_Y ); SM_SELMERC_PLATE_HEIGHT = 65; SM_SELMERC_PLATE_WIDTH = 83; if (iResolution >= _640x480 && iResolution < _800x600) { SM_BODYINV_X = ( 141 + INTERFACE_START_X ); SM_BODYINV_Y = ( 68 + INV_INTERFACE_START_Y ); } else { SM_BODYINV_X = ( 151 + INTERFACE_START_X ); SM_BODYINV_Y = ( 68 + INV_INTERFACE_START_Y ); } // Cammo gSMCamoXY.sX = SM_BODYINV_X; gSMCamoXY.sY = SM_BODYINV_Y; SM_UPDOWNB_X = ( 8 + INTERFACE_START_X ); SM_UPDOWNB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_HANDCURSORB_X = ( 33 + INTERFACE_START_X ); SM_HANDCURSORB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_CLIMBB_X = ( 58 + INTERFACE_START_X ); SM_CLIMBB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_MUTEB_X = ( 8 + INTERFACE_START_X ); SM_MUTEB_Y = ( 98 + INV_INTERFACE_START_Y ); SM_LOOKB_X = ( 33 + INTERFACE_START_X ); SM_LOOKB_Y = ( 98 + INV_INTERFACE_START_Y ); SM_TALKB_X = ( 58 + INTERFACE_START_X ); SM_TALKB_Y = ( 98 + INV_INTERFACE_START_Y ); SM_STANCEUPB_X = ( 88 + INTERFACE_START_X ); SM_STANCEUPB_Y = ( 70 + INV_INTERFACE_START_Y ); SM_STEALTHMODE_X = ( 88 + INTERFACE_START_X ); SM_STEALTHMODE_Y = ( 98 + INV_INTERFACE_START_Y ); SM_STANCEDOWNB_X = ( 88 + INTERFACE_START_X ); SM_STANCEDOWNB_Y = ( 126 + INV_INTERFACE_START_Y ); SM_BURSTMODEB_X = ( 88 + INTERFACE_START_X ); SM_BURSTMODEB_Y = ( 167 + INV_INTERFACE_START_Y ); SM_PREVMERCB_X = ( 10 + INTERFACE_START_X ); SM_PREVMERCB_Y = ( 130 + INV_INTERFACE_START_Y ); SM_NEXTMERCB_X = ( 52 + INTERFACE_START_X ); SM_NEXTMERCB_Y = ( 130 + INV_INTERFACE_START_Y ); SM_OPTIONSB_X = ( 10 + INTERFACE_START_X ); SM_OPTIONSB_Y = ( 165 + INV_INTERFACE_START_Y ); // CHRISL: Backpack buttons SM_DROPPACK_X = ( 612 + INTERFACE_START_X ); SM_DROPPACK_Y = ( 39 + INV_INTERFACE_START_Y ); SM_ZIPPER_X = ( 590 + INTERFACE_START_X ); SM_ZIPPER_Y = ( 39 + INV_INTERFACE_START_Y ); SM_MAPSCREEN_X = xResOffset + (xResSize - 146); // 152 SM_DONE_X = xResOffset + (xResSize - 146); // 152 //dnl INTERFACE_CLOCK_X = xResOffset + (xResSize - 86); //dnl INTERFACE_CLOCK_Y = ( 119 + INV_INTERFACE_START_Y ); if (isWidescreenUI()) { INTERFACE_CLOCK_X = SCREEN_WIDTH - 86; } else { INTERFACE_CLOCK_X = SCREEN_WIDTH - xResOffset - 86; } INTERFACE_CLOCK_Y = SCREEN_HEIGHT - 24; LOCATION_NAME_X = xResOffset + (xResSize - 92); LOCATION_NAME_Y = ( 89 + INTERFACE_START_Y ); SM_DONE_Y = ( 118 + INV_INTERFACE_START_Y ); SM_MAPSCREEN_Y = ( 140 + INV_INTERFACE_START_Y ); SM_POSITIONB_X = ( 106 + INTERFACE_START_X ); SM_POSITIONB_Y = ( 34 + INV_INTERFACE_START_Y ); SM_POSITIONB_WIDTH = 19; SM_POSITIONB_HEIGHT = 24; SM_PERCENT_WIDTH = 20; SM_PERCENT_HEIGHT = 10; if (iResolution >= _640x480 && iResolution < _800x600) { SM_ARMOR_X = ( 245 + INTERFACE_START_X ); SM_ARMOR_Y = ( 141 + INV_INTERFACE_START_Y ); SM_ARMOR_LABEL_X = ( 260 + INTERFACE_START_X ); SM_ARMOR_LABEL_Y = ( 131 + INV_INTERFACE_START_Y ); SM_ARMOR_PERCENT_X = ( 265 + INTERFACE_START_X ); SM_ARMOR_PERCENT_Y = ( 141 + INV_INTERFACE_START_Y ); } else { SM_ARMOR_X = ( 264 + INTERFACE_START_X ); SM_ARMOR_Y = ( 141 + INV_INTERFACE_START_Y ); SM_ARMOR_LABEL_X = ( 279 + INTERFACE_START_X ); SM_ARMOR_LABEL_Y = ( 131 + INV_INTERFACE_START_Y ); SM_ARMOR_PERCENT_X = ( 284 + INTERFACE_START_X ); SM_ARMOR_PERCENT_Y = ( 141 + INV_INTERFACE_START_Y ); } SM_WEIGHT_LABEL_X = ( 220 + INTERFACE_START_X ); SM_WEIGHT_LABEL_Y = ( 34 + INV_INTERFACE_START_Y ); SM_WEIGHT_PERCENT_X = ( 239 + INTERFACE_START_X ); SM_WEIGHT_PERCENT_Y = ( 34 + INV_INTERFACE_START_Y ); SM_WEIGHT_X = ( 218 + INTERFACE_START_X ); SM_WEIGHT_Y = ( 33 + INV_INTERFACE_START_Y ); SM_CAMMO_LABEL_X = ( 220 + INTERFACE_START_X ); SM_CAMMO_LABEL_Y = ( 50 + INV_INTERFACE_START_Y ); SM_CAMMO_PERCENT_X = ( 239 + INTERFACE_START_X ); SM_CAMMO_PERCENT_Y = ( 49 + INV_INTERFACE_START_Y ); SM_CAMMO_X = ( 218 + INTERFACE_START_X ); SM_CAMMO_Y = ( 49 + INV_INTERFACE_START_Y ); SM_STATS_WIDTH = 16; SM_STATS_HEIGHT = 8 ; SM_AGI_X = ( 115 + INTERFACE_START_X ); SM_AGI_Y = ( 7 + INV_INTERFACE_START_Y ); SM_DEX_X = ( 115 + INTERFACE_START_X ); SM_DEX_Y = ( 17 + INV_INTERFACE_START_Y ); SM_STR_X = ( 115 + INTERFACE_START_X ); SM_STR_Y = ( 27 + INV_INTERFACE_START_Y ); SM_CHAR_X = ( 115 + INTERFACE_START_X ); SM_CHAR_Y = ( 37 + INV_INTERFACE_START_Y ); SM_WIS_X = ( 115 + INTERFACE_START_X ); SM_WIS_Y = ( 47 + INV_INTERFACE_START_Y ); SM_EXPLVL_X = ( 163 + INTERFACE_START_X ); SM_EXPLVL_Y = ( 7 + INV_INTERFACE_START_Y ); SM_MRKM_X = ( 163 + INTERFACE_START_X ); SM_MRKM_Y = ( 17 + INV_INTERFACE_START_Y ); SM_MECH_X = ( 163 + INTERFACE_START_X ); SM_MECH_Y = ( 27 + INV_INTERFACE_START_Y ); SM_EXPL_X = ( 163 + INTERFACE_START_X ); SM_EXPL_Y = ( 37 + INV_INTERFACE_START_Y ); SM_MED_X = ( 163 + INTERFACE_START_X ); SM_MED_Y = ( 47 + INV_INTERFACE_START_Y ); MONEY_X = ( 185 + INTERFACE_START_X ); MONEY_Y = ( 5 + INV_INTERFACE_START_Y ); MONEY_WIDTH = 30; MONEY_HEIGHT = 22; // ow ye font color they can also be customizable :P STATS_TITLE_FONT_COLOR = 6; STATS_TEXT_FONT_COLOR = 5; //Keyring 218/5 on Inventory_Bottom_Panel.sti KEYRING_X = xResOffset + 219; //209; KEYRING_Y = (5 + INV_INTERFACE_START_Y); // so we got everything "dynamic" now we just return TRUE return ( TRUE ); } BOOLEAN InitializeSMPanel( ) { VOBJECT_DESC VObjectDesc; /* OK i need to initialize coords here * Isnt it cool * any questions? joker */ // InitializeSMPanelCoords( ); fDisplayOverheadMap = TRUE; // failing the CHECKF after this will cause you to lose your mouse VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; if (iResolution >= _640x480 && iResolution < _800x600) { strcpy( VObjectDesc.ImageFile, "INTERFACE\\inventory_bottom_panel.STI" ); } else if (iResolution < _1024x768) { strcpy( VObjectDesc.ImageFile, "INTERFACE\\inventory_bottom_panel_800x600.STI" ); } else { strcpy( VObjectDesc.ImageFile, "INTERFACE\\inventory_bottom_panel_1024x768.STI" ); } CHECKF( AddVideoObject( &VObjectDesc, &guiSMPanel) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\inventory_gold_front.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiSMObjects ) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\inv_frn.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiSMObjects2 ) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\secondary_gun_hidden.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiSecItemHiddenVO ) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\Bars.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiBrownBackgroundForTeamPanel ) ); // Clear inv display stuff memset( gfSM_HandInvDispText, 0, sizeof( gfSM_HandInvDispText ) ); // INIT viewport region // Set global mouse regions for SM panel // Define region for viewport MSYS_DefineRegion( &gViewportRegion, 0, 0 ,gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y, MSYS_PRIORITY_NORMAL, VIDEO_NO_CURSOR, MSYS_NO_CALLBACK, MSYS_NO_CALLBACK ); MSYS_AddRegion( &gViewportRegion ); // Create buttons CHECKF( CreateSMPanelButtons( ) ); // Set viewports // Define region for panel MSYS_DefineRegion( &gSMPanelRegion, 0, INV_INTERFACE_START_Y ,SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_NORMAL, CURSOR_NORMAL, MSYS_NO_CALLBACK, InvPanelButtonClickCallback ); // Add region MSYS_AddRegion( &gSMPanelRegion); //DEfine region for selected guy panel MSYS_DefineRegion( &gSM_SELMERCPanelRegion, SM_SELMERC_FACE_X, SM_SELMERC_FACE_Y, SM_SELMERC_FACE_X + SM_SELMERC_FACE_WIDTH, SM_SELMERC_FACE_Y + SM_SELMERC_FACE_HEIGHT, MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, SelectedMercButtonMoveCallback, SelectedMercButtonCallback ); // Add region MSYS_AddRegion( &gSM_SELMERCPanelRegion ); //DEfine region for selected guy panel MSYS_DefineRegion( &gSM_SELMERCEnemyIndicatorRegion, SM_SELMERC_FACE_X + 1, SM_SELMERC_FACE_Y + 1, SM_SELMERC_FACE_X + INDICATOR_BOX_WIDTH, SM_SELMERC_FACE_Y + INDICATOR_BOX_HEIGHT, MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, SelectedMercEnemyIndicatorCallback ); // Add region MSYS_AddRegion( &gSM_SELMERCEnemyIndicatorRegion ); //DEfine region for money button MSYS_DefineRegion( &gSM_SELMERCMoneyRegion, MONEY_X, MONEY_Y, MONEY_X + MONEY_WIDTH, MONEY_Y + MONEY_HEIGHT, MSYS_PRIORITY_HIGH, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, SMInvMoneyButtonCallback ); // Add region MSYS_AddRegion( &gSM_SELMERCMoneyRegion ); SetRegionFastHelpText( &(gSM_SELMERCMoneyRegion), TacticalStr[ MONEY_BUTTON_HELP_TEXT ] ); // Check if mouse is in region and if so, adjust... if ( IsMouseInRegion( &gSM_SELMERCPanelRegion ) ) { HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, TRUE ); } //DEfine region for selected guy panel // THIS IS A REGION OF BAR TIPS MSYS_DefineRegion( &gSM_SELMERCBarsRegion, SM_SELMERC_BARS_TIP_X, SM_SELMERC_BARS_TIP_Y, SM_SELMERC_BARS_TIP_X + SM_SELMERC_BARS_TIP_WIDTH, SM_SELMERC_BARS_TIP_Y + SM_SELMERC_BARS_TIP_HEIGHT, MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, SelectedMercButtonCallback ); MSYS_AddRegion( &gSM_SELMERCBarsRegion ); MSYS_DefineRegion( &gSM_SELMERCWeightRegion, (SM_WEIGHT_X + 2), (SM_WEIGHT_Y), (SM_WEIGHT_X + 28), (SM_WEIGHT_Y + 10), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, SelectedMercButtonCallback ); MSYS_AddRegion( &gSM_SELMERCWeightRegion ); // Added by SANDRO - define region for camo tooltip window MSYS_DefineRegion( &gSM_SELMERCCamoRegion, ( SM_CAMMO_X + 2), ( SM_CAMMO_Y ), (SM_CAMMO_X + 28), (SM_CAMMO_Y + 10), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, SelectedMercButtonCallback ); MSYS_AddRegion( &gSM_SELMERCCamoRegion ); // CHRISL: Setup default coords if((UsingNewInventorySystem() == true)) InitInventoryNew(); else InitInventoryOld(); InitInvSlotInterface( gSMInvPocketXY, &gSMCamoXY, SMInvMoveCallback, SMInvClickCallback, SMInvMoveCammoCallback, SMInvClickCamoCallback, FALSE ); InitKeyRingInterface( KeyRingItemPanelButtonCallback ); // this is important! It will disable buttons like SM_MAP_SCREEN_BUTTON when they're supposed to be disabled - the previous // disabled state is lost everytime panel is reinitialized, because all the buttons are created from scratch! if ( gpItemPointer == NULL ) { // empty cursor - enable, not from item pickup EnableSMPanelButtons( TRUE, FALSE ); } else { // full cursor - disable, from item pickup EnableSMPanelButtons( FALSE, TRUE ); } if( INTERFACE_START_X > 0 ) { ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, INV_INTERFACE_START_Y, SCREEN_WIDTH, SCREEN_HEIGHT, 0 ); ColorFillVideoSurfaceArea( guiSAVEBUFFER, 0, INV_INTERFACE_START_Y, SCREEN_WIDTH, SCREEN_HEIGHT, 0 ); } return( TRUE ); } BOOLEAN CreateSMPanelButtons( ) { CHAR8 ubString[48]; //CHAR8 ubString2[48]; //legion DisableButton //CHAR8 ubString3[48]; //legion // CHRISL: Reset backpack buttons as well giSMStealthImages = giSMZipperImages = giSMDropPackImages = -1; giSMStealthButton = giSMZipperButton = giSMDropPackButton = -1; gfUIStanceDifferent = TRUE; gfAllDisabled = FALSE; FilenameForBPP("INTERFACE\\inventory_buttons.sti", ubString); //----------------------- // Load button Graphics iSMPanelImages[ STANCEUP_IMAGES ] = LoadButtonImage(ubString,-1,0,-1,10,-1 ); iSMPanelImages[ UPDOWN_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,9,-1,19,-1 ); iSMPanelImages[ CLIMB_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,3,-1,13,-1 ); iSMPanelImages[ STANCEDOWN_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,8,-1,18,-1 ); iSMPanelImages[ HANDCURSOR_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,1,-1,11,-1 ); iSMPanelImages[ PREVMERC_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,20,-1,22,-1 ); iSMPanelImages[ NEXTMERC_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,21,-1,23,-1 ); //iSMPanelImages[ BURSTMODE_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,7,-1,17,-1 ); iSMPanelImages[ LOOK_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,2,-1,12,-1 ); iSMPanelImages[ TALK_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,6,-1,16,-1 ); iSMPanelImages[ MUTE_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,5,-1,15,-1 ); iSMPanelImages[ OPTIONS_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ] ,-1,24,-1,25,-1 ); iBurstButtonImages[ WM_NORMAL ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 7, -1, -1, -1 ); iBurstButtonImages[ WM_BURST ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_AUTOFIRE ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_GL ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 26, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_GL_BURST ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_GL_AUTO ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_UB ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 7, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_UB_BURST ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_UB_AUTO ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_BAYONET ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); FilenameForBPP("INTERFACE\\invadd-ons.sti", ubString); // Load button Graphics iSMPanelImages[ STANCE_IMAGES ] = LoadButtonImage(ubString,0,0,-1,2,-1 ); FilenameForBPP("INTERFACE\\inventory_buttons_2.sti", ubString); // Load button Graphics iSMPanelImages[ DONE_IMAGES ] = LoadButtonImage(ubString,-1,1,-1,3,-1 ); iSMPanelImages[ MAPSCREEN_IMAGES ] = UseLoadedButtonImage( iSMPanelImages[ DONE_IMAGES ] ,-1,0,-1,2,-1 ); // CHRISL: Needed for new inventory backpack buttons FilenameForBPP("INTERFACE\\backpack_buttons.sti", ubString); iSMPanelImages[ BACKPACK_IMAGES ] = LoadButtonImage(ubString,0,0,-1,2,-1 ); // Create buttons // SET BUTTONS TO -1 memset( iSMPanelButtons, -1, sizeof( iSMPanelButtons ) ); iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] = QuickCreateButton( iSMPanelImages[ MAPSCREEN_IMAGES ], SM_MAPSCREEN_X, SM_MAPSCREEN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnMapScreenCallback ); SetButtonFastHelpText( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ], TacticalStr[ MAPSCREEN_POPUPTEXT ]); SetBtnHelpEndCallback( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ SM_DONE_BUTTON ] = CreateIconAndTextButton( iSMPanelImages[ DONE_IMAGES ], L"", FONT12ARIAL, FONT_MCOLOR_WHITE, DEFAULT_SHADOW , FONT_MCOLOR_WHITE, DEFAULT_SHADOW , TEXT_CJUSTIFIED, SM_DONE_X, SM_DONE_Y, BUTTON_TOGGLE ,MSYS_PRIORITY_HIGH-1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnSMDoneCallback ); SetButtonFastHelpText( iSMPanelButtons[ SM_DONE_BUTTON ], TacticalStr[ END_TURN_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ SM_DONE_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ TALK_BUTTON ] = QuickCreateButton( iSMPanelImages[ TALK_IMAGES ], SM_TALKB_X, SM_TALKB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnTalkCallback ); SetButtonFastHelpText( iSMPanelButtons[ TALK_BUTTON ], TacticalStr[ TALK_CURSOR_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ TALK_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ MUTE_BUTTON ] = QuickCreateButton( iSMPanelImages[ MUTE_IMAGES ], SM_MUTEB_X, SM_MUTEB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnMuteCallback ); SetButtonFastHelpText( iSMPanelButtons[ MUTE_BUTTON ], TacticalStr[ TOGGLE_MUTE_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ MUTE_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ STANCEUP_BUTTON ] = QuickCreateButton( iSMPanelImages[ STANCEUP_IMAGES ], SM_STANCEUPB_X, SM_STANCEUPB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnStanceUpCallback ); if ( iSMPanelButtons[ STANCEUP_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iSMPanelButtons[ STANCEUP_BUTTON ], TacticalStr[ CHANGE_STANCE_UP_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ STANCEUP_BUTTON ], HelpTextDoneCallback ); //SetButtonFastHelpText( iSMPanelButtons[ STANCEUP_BUTTON ],L"Change Stance Up"); iSMPanelButtons[ UPDOWN_BUTTON ] = QuickCreateButton( iSMPanelImages[ UPDOWN_IMAGES ], SM_UPDOWNB_X, SM_UPDOWNB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnUpdownCallback ); if ( iSMPanelButtons[ UPDOWN_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ UPDOWN_BUTTON ],L"Whatever"); SetButtonFastHelpText( iSMPanelButtons[ UPDOWN_BUTTON ], TacticalStr[ CURSOR_LEVEL_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ UPDOWN_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ CLIMB_BUTTON ] = QuickCreateButton( iSMPanelImages[ CLIMB_IMAGES ], SM_CLIMBB_X, SM_CLIMBB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnClimbCallback ); if ( iSMPanelButtons[ CLIMB_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ CLIMB_BUTTON ],L"Climb"); SetButtonFastHelpText( iSMPanelButtons[ CLIMB_BUTTON ], TacticalStr[ JUMPCLIMB_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ CLIMB_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ STANCEDOWN_BUTTON ] = QuickCreateButton( iSMPanelImages[ STANCEDOWN_IMAGES ], SM_STANCEDOWNB_X, SM_STANCEDOWNB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnStanceDownCallback ); if ( iSMPanelButtons[ STANCEDOWN_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ STANCEDOWN_BUTTON ],L"Change Stance Down"); SetButtonFastHelpText( iSMPanelButtons[ STANCEDOWN_BUTTON ], TacticalStr[ CHANGE_STANCE_DOWN_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ STANCEDOWN_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ HANDCURSOR_BUTTON ] = QuickCreateButton( iSMPanelImages[ HANDCURSOR_IMAGES ], SM_HANDCURSORB_X, SM_HANDCURSORB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnHandCursorCallback ); if ( iSMPanelButtons[ HANDCURSOR_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ HANDCURSOR_BUTTON ],L"Change Stance Down"); SetButtonFastHelpText( iSMPanelButtons[ HANDCURSOR_BUTTON ], TacticalStr[ EXAMINE_CURSOR_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ HANDCURSOR_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ PREVMERC_BUTTON ] = QuickCreateButton( iSMPanelImages[ PREVMERC_IMAGES ], SM_PREVMERCB_X, SM_PREVMERCB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnPrevMercCallback ); if ( iSMPanelButtons[ PREVMERC_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ PREVMERC_BUTTON ],L"Change Stance Down"); SetButtonFastHelpText( iSMPanelButtons[ PREVMERC_BUTTON ], TacticalStr[ PREV_MERC_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ PREVMERC_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ NEXTMERC_BUTTON ] = QuickCreateButton( iSMPanelImages[ NEXTMERC_IMAGES ], SM_NEXTMERCB_X, SM_NEXTMERCB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnNextMercCallback ); if ( iSMPanelButtons[ NEXTMERC_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iSMPanelButtons[ NEXTMERC_BUTTON ], TacticalStr[ NEXT_MERC_POPUPTEXT ] ); //SetButtonFastHelpText( iSMPanelButtons[ NEXTMERC_BUTTON ],L"Change Stance Down"); SetBtnHelpEndCallback( iSMPanelButtons[ NEXTMERC_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ OPTIONS_BUTTON ] = QuickCreateButton( iSMPanelImages[ OPTIONS_IMAGES ], SM_OPTIONSB_X, SM_OPTIONSB_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnOptionsCallback ); if ( iSMPanelButtons[ OPTIONS_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ OPTIONS_BUTTON ],L"Change Stance Down"); SetButtonFastHelpText( iSMPanelButtons[ OPTIONS_BUTTON ], TacticalStr[ CHANGE_OPTIONS_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ OPTIONS_BUTTON ], HelpTextDoneCallback ); /*iSMPanelButtons[ BURSTMODE_BUTTON ] = QuickCreateButton( iSMPanelImages[ BURSTMODE_IMAGES ], SM_BURSTMODEB_X, SM_BURSTMODEB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnBurstModeCallback );*/ iSMPanelButtons[ BURSTMODE_BUTTON ] = QuickCreateButton( iBurstButtonImages[ WM_NORMAL ], SM_BURSTMODEB_X, SM_BURSTMODEB_Y, BUTTON_NO_TOGGLE, MSYS_PRIORITY_HIGH, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnBurstModeCallback ); if ( iSMPanelButtons[ BURSTMODE_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iSMPanelButtons[ BURSTMODE_BUTTON ], TacticalStr[ TOGGLE_BURSTMODE_POPUPTEXT ] ); //SetButtonFastHelpText( iSMPanelButtons[ BURSTMODE_BUTTON ],L"Change Stance Down"); SetBtnHelpEndCallback( iSMPanelButtons[ BURSTMODE_BUTTON ], HelpTextDoneCallback ); iSMPanelButtons[ LOOK_BUTTON ] = QuickCreateButton( iSMPanelImages[ LOOK_IMAGES ], SM_LOOKB_X, SM_LOOKB_Y, BUTTON_NEWTOGGLE, MSYS_PRIORITY_HIGH - 1, MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnLookCallback ); if ( iSMPanelButtons[ LOOK_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } //SetButtonFastHelpText( iSMPanelButtons[ LOOK_BUTTON ],L"Change Stance Down"); SetButtonFastHelpText( iSMPanelButtons[ LOOK_BUTTON ], TacticalStr[ LOOK_CURSOR_POPUPTEXT ] ); SetBtnHelpEndCallback( iSMPanelButtons[ LOOK_BUTTON ], HelpTextDoneCallback ); return( TRUE ); } void RemoveSMPanelButtons( ) { UINT32 cnt; for ( cnt = 0; cnt < NUM_SM_BUTTONS; cnt++ ) { if ( iSMPanelButtons[ cnt ] != -1 ) { RemoveButton( iSMPanelButtons[ cnt ] ); } } for ( cnt = 0; cnt < NUM_SM_BUTTON_IMAGES; cnt++ ) { if(iSMPanelImages[ cnt ] != -1) { UnloadButtonImage( iSMPanelImages[ cnt ] ); } } if ( giSMStealthButton != -1 ) { RemoveButton( giSMStealthButton ); } RenderBackpackButtons(DEACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ if ( giSMStealthImages != -1 ) { UnloadButtonImage( giSMStealthImages ); } RenderBackpackButtons(UNLOAD_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ for (int i = 0; i < NUM_WEAPON_MODES; ++i) { if ( iBurstButtonImages[i] != -1) { UnloadButtonImage(iBurstButtonImages[i]); } } } BOOLEAN ShutdownSMPanel( ) { // All buttons and regions and video objects and video surfaces will be deleted at shutddown of SGM // We may want to delete them at the interm as well, to free up room for other panels DeleteVideoObjectFromIndex( guiSMPanel ); DeleteVideoObjectFromIndex( guiSMObjects ); DeleteVideoObjectFromIndex( guiSMObjects2 ); DeleteVideoObjectFromIndex( guiSecItemHiddenVO ); DeleteVideoObjectFromIndex( guiBrownBackgroundForTeamPanel ); gubSelectSMPanelToMerc = NOBODY; // CJC: delete key ring if open DeleteKeyRingPopup(); // function will abort if key ring is not up // ATE: Delete desc panel if it was open.... if ( gfInItemDescBox ) { DeleteItemDescriptionBox( ); } // Shotdown item slot interface ShutdownInvSlotInterface( ); // shutdown keyring interface ShutdownKeyRingInterface( ); ShutdownInventoryInterface(); MSYS_RemoveRegion( &gSMPanelRegion ); MSYS_RemoveRegion( &gSM_SELMERCPanelRegion ); MSYS_RemoveRegion( &gSM_SELMERCBarsRegion ); MSYS_RemoveRegion( &gSM_SELMERCMoneyRegion ); MSYS_RemoveRegion( &gSM_SELMERCEnemyIndicatorRegion ); MSYS_RemoveRegion( &gSM_SELMERCWeightRegion ); MSYS_RemoveRegion( &gSM_SELMERCCamoRegion ); // added - SANDRO HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, FALSE ); MSYS_RemoveRegion( &gViewportRegion ); RemoveSMPanelButtons( ); //CHRISL: Following line is to make sure that team panel buttons activate DisableTacticalTeamPanelButtons( FALSE ); return( TRUE ); } void RenderSMPanel( BOOLEAN *pfDirty ) { INT16 sFontX, sFontY; INT16 usX, usY; CHAR16 sString[9]; UINT32 cnt; static CHAR16 pStr[ 200 ], pMoraleStr[ 20 ], sTemp[ 20 ]; if ( gubSelectSMPanelToMerc != NOBODY ) { // Give him the panel! SetSMPanelCurrentMerc( gubSelectSMPanelToMerc ); } // ATE: Don't do anything if we are in stack popup and are refreshing stuff.... if ( ( InItemStackPopup( ) || ( InKeyRingPopup( ) ) ) && (*pfDirty) == DIRTYLEVEL1 ) { return; } if ( gfCheckForMouseOverItem ) { if ( ( GetJA2Clock( ) - guiMouseOverItemTime ) > 100 ) { if ( HandleCompatibleAmmoUI( gpSMCurrentMerc, (INT8)gbCheckForMouseOverItemPos, TRUE ) ) { (*pfDirty) = DIRTYLEVEL2; } gfCheckForMouseOverItem = FALSE; } } HandleNewlyAddedItems( gpSMCurrentMerc, pfDirty ); if ( InItemDescriptionBox( ) ) { HandleItemDescriptionBox( pfDirty ); } if ( *pfDirty == DIRTYLEVEL2 ) { //if ( InItemStackPopup( ) ) //{ //} if ( InItemDescriptionBox( ) ) { // CHRISL: Changed 3rd parameter so we can display graphic based on inventory system used BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMPanel, UsingNewInventorySystem(), INTERFACE_START_X, INV_INTERFACE_START_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RenderSoldierFace( gpSMCurrentMerc, SM_SELMERC_FACE_X, SM_SELMERC_FACE_Y, TRUE ); // ATE: Need these lines here to fix flash bug with face selection box if ( gfSMDisableForItems ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects2, 0, SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, SM_SELMERC_PLATE_WIDTH , SM_SELMERC_PLATE_HEIGHT ); } else { if ( gusSelectedSoldier == gpSMCurrentMerc->ubID && gTacticalStatus.ubCurrentTeam == OUR_TEAM && OK_INTERRUPT_MERC( gpSMCurrentMerc ) ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects, 0, SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, SM_SELMERC_PLATE_WIDTH , SM_SELMERC_PLATE_HEIGHT ); } } // HEADROCK HAM 5: Test for active Transform Popup if (gfItemDescTransformPopupVisible) { gItemDescTransformPopup->show(); } else { RenderItemDescriptionBox( ); } } else { // CHRISL: Changed 3rd parameter so we can display graphic based on inventory system used BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMPanel, UsingNewInventorySystem(), INTERFACE_START_X, INV_INTERFACE_START_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RenderInvBodyPanel( gpSMCurrentMerc, SM_BODYINV_X, SM_BODYINV_Y ); // CHECK FOR PANEL STUFF / DEATHS / CLOSURES CheckForFacePanelStartAnims( gpSMCurrentMerc, SM_SELMERC_FACE_X, SM_SELMERC_FACE_Y ); // Hitlight if ( gfSMDisableForItems ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects2, 0, SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, SM_SELMERC_PLATE_WIDTH , SM_SELMERC_PLATE_HEIGHT ); } else { if ( gusSelectedSoldier == gpSMCurrentMerc->ubID && gTacticalStatus.ubCurrentTeam == OUR_TEAM && OK_INTERRUPT_MERC( gpSMCurrentMerc ) ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects, 0, SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( SM_SELMERC_PLATE_X, SM_SELMERC_PLATE_Y, SM_SELMERC_PLATE_WIDTH , SM_SELMERC_PLATE_HEIGHT ); } } // HEADROCK HAM 3.6: "progress" bars showing how near the character is to "leveling up" in any stat. The bar // is displayed behind the current stat value, as see on the character's info panel. // This section draws TACTICAL info pages. Another section is in mapscreen.cpp and draws STRATEGIC info pages. // The feature is toggled by Options-Menu switch, and its color is determined in the INI files. { UINT8 *pDestBuf; UINT32 uiDestPitchBYTES = 0; SGPRect ClipRect; UINT8 ubBarWidth; UINT16 usColor = Get16BPPColor( FROMRGB( gGameExternalOptions.ubStatProgressBarsRed, gGameExternalOptions.ubStatProgressBarsGreen, gGameExternalOptions.ubStatProgressBarsBlue ) ); //pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); pDestBuf = LockVideoSurface( guiSAVEBUFFER, &uiDestPitchBYTES ); // AGI if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sAgilityGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sAgilityGain+1)) / SubpointsPerPoint(AGILAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_AGI_Y-1); ClipRect.iBottom = (SM_AGI_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_AGI_X; ClipRect.iRight = SM_AGI_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // DEX if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sDexterityGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sDexterityGain+1)) / SubpointsPerPoint(DEXTAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_DEX_Y-1); ClipRect.iBottom = (SM_DEX_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_DEX_X; ClipRect.iRight = SM_DEX_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // STR if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sStrengthGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sStrengthGain+1)) / SubpointsPerPoint(STRAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_STR_Y-1); ClipRect.iBottom = (SM_STR_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_STR_X; ClipRect.iRight = SM_STR_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // WIS if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sWisdomGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sWisdomGain+1)) / SubpointsPerPoint(WISDOMAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_WIS_Y-1); ClipRect.iBottom = (SM_WIS_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_WIS_X; ClipRect.iRight = SM_WIS_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // MRK if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMarksmanshipGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMarksmanshipGain+1)) / SubpointsPerPoint(MARKAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_MRKM_Y-1); ClipRect.iBottom = (SM_MRKM_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_MRKM_X; ClipRect.iRight = SM_MRKM_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // LDR if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sLeadershipGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sLeadershipGain+1)) / SubpointsPerPoint(LDRAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_CHAR_Y-1); ClipRect.iBottom = (SM_CHAR_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_CHAR_X; ClipRect.iRight = SM_CHAR_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // MECH if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMechanicGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMechanicGain+1)) / SubpointsPerPoint(MECHANAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_MECH_Y-1); ClipRect.iBottom = (SM_MECH_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_MECH_X; ClipRect.iRight = SM_MECH_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // EXPLO if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sExplosivesGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sExplosivesGain+1)) / SubpointsPerPoint(EXPLODEAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_EXPL_Y-1); ClipRect.iBottom = (SM_EXPL_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_EXPL_X; ClipRect.iRight = SM_EXPL_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // MED if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMedicalGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sMedicalGain+1)) / SubpointsPerPoint(MEDICALAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_MED_Y-1); ClipRect.iBottom = (SM_MED_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_MED_X; ClipRect.iRight = SM_MED_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } // EXPLEVEL if (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sExpLevelGain) { ubBarWidth = (SM_STATS_WIDTH * (gMercProfiles[ gpSMCurrentMerc->ubProfile ].sExpLevelGain+1)) / SubpointsPerPoint(EXPERAMT, &gMercProfiles[gpSMCurrentMerc->ubProfile]); ubBarWidth = __max(0, __min(ubBarWidth, SM_STATS_WIDTH)); ClipRect.iTop = (SM_EXPLVL_Y-1); ClipRect.iBottom = (SM_EXPLVL_Y-1) + SM_STATS_HEIGHT; ClipRect.iLeft = SM_EXPLVL_X; ClipRect.iRight = SM_EXPLVL_X + ubBarWidth; Blt16BPPBufferHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect, usColor ); } UnLockVideoSurface( guiSAVEBUFFER ); } // Render faceplate //BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects2, 1, SM_SELMERC_NAMEPLATE_X, SM_SELMERC_NAMEPLATE_Y, VO_BLT_SRCTRANSPARENCY, NULL ); //RestoreExternBackgroundRect( SM_SELMERC_NAMEPLATE_X, SM_SELMERC_NAMEPLATE_Y, SM_SELMERC_NAMEPLATE_WIDTH, SM_SELMERC_NAMEPLATE_HEIGHT ); // Blit position //if(gbPixelDepth==16) //{ //BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMObjects, gbSMCurStanceObj, SM_POSITIONB_X, SM_POSITIONB_Y, VO_BLT_SRCTRANSPARENCY, NULL ); //} //RestoreExternBackgroundRect( SM_POSITIONB_X, SM_POSITIONB_Y, SM_POSITIONB_WIDTH , SM_POSITIONB_HEIGHT ); SetFont( BLOCKFONT2 ); // Render Values for stats! // Set font drawing to saved buffer SetFontDestBuffer( guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( STATS_TITLE_FONT_COLOR ); for( cnt = 0; cnt < 5; cnt++ ) { mprintf( INTERFACE_START_X + 92, ( INT16 )( INV_INTERFACE_START_Y + 7 + cnt * 10 ), pShortAttributeStrings[ cnt ] ); mprintf( INTERFACE_START_X + 137, ( INT16 )( INV_INTERFACE_START_Y + 7 + cnt * 10 ), pShortAttributeStrings[ cnt + 5 ] ); } mprintf( SM_ARMOR_LABEL_X - StringPixLength( pInvPanelTitleStrings[0], BLOCKFONT2 ) / 2, SM_ARMOR_LABEL_Y, pInvPanelTitleStrings[ 0 ] ); if( g_lang == i18n::Lang::zh ) { mprintf( SM_ARMOR_PERCENT_X, SM_ARMOR_PERCENT_Y, ChineseSpecString1 ); } else { mprintf( SM_ARMOR_PERCENT_X, SM_ARMOR_PERCENT_Y, L"%%" ); } mprintf( SM_WEIGHT_LABEL_X - StringPixLength( pInvPanelTitleStrings[1], BLOCKFONT2 ), SM_WEIGHT_LABEL_Y, pInvPanelTitleStrings[ 1 ] ); if( g_lang == i18n::Lang::zh ) { mprintf( SM_WEIGHT_PERCENT_X, SM_WEIGHT_PERCENT_Y, ChineseSpecString1 ); } else { mprintf( SM_WEIGHT_PERCENT_X, SM_WEIGHT_PERCENT_Y, L"%%" ); } mprintf( SM_CAMMO_LABEL_X - StringPixLength( pInvPanelTitleStrings[2], BLOCKFONT2 ), SM_CAMMO_LABEL_Y, pInvPanelTitleStrings[ 2 ] ); if( g_lang == i18n::Lang::zh ) { mprintf( SM_CAMMO_PERCENT_X, SM_CAMMO_PERCENT_Y, ChineseSpecString1 ); } else { mprintf( SM_CAMMO_PERCENT_X, SM_CAMMO_PERCENT_Y, L"%%" ); } UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeAgilityTime, (BOOLEAN)(gpSMCurrentMerc->usValueGoneUp & AGIL_INCREASE ? TRUE : FALSE), (BOOLEAN)((gGameOptions.fNewTraitSystem && (gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_AGILITY] > 0)) ? TRUE : FALSE), gpSMCurrentMerc->bExtraAgility != 0 ); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bAgility + gpSMCurrentMerc->bExtraAgility ); FindFontRightCoordinates(SM_AGI_X, SM_AGI_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeDexterityTime, (BOOLEAN)(gpSMCurrentMerc->usValueGoneUp & DEX_INCREASE ? TRUE : FALSE), (BOOLEAN)((gGameOptions.fNewTraitSystem && (gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_DEXTERITY] > 0)) ? TRUE : FALSE), gpSMCurrentMerc->bExtraDexterity != 0 ); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bDexterity + gpSMCurrentMerc->bExtraDexterity ); FindFontRightCoordinates(SM_DEX_X, SM_DEX_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeStrengthTime, (BOOLEAN)(gpSMCurrentMerc->usValueGoneUp & STRENGTH_INCREASE ? TRUE : FALSE), (BOOLEAN)(((gGameOptions.fNewTraitSystem && (gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_STRENGTH] > 0)) || ( UsingFoodSystem() && gpSMCurrentMerc->usStarveDamageStrength > 0)) ? TRUE : FALSE), gpSMCurrentMerc->bExtraStrength != 0 ); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bStrength + gpSMCurrentMerc->bExtraStrength ); FindFontRightCoordinates(SM_STR_X, SM_STR_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeLeadershipTime, ( BOOLEAN )( gpSMCurrentMerc->usValueGoneUp & LDR_INCREASE? TRUE: FALSE ), ( BOOLEAN ) ( ( gGameOptions.fNewTraitSystem && ( gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_LEADERSHIP] > 0 )) ? TRUE : FALSE), FALSE); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bLeadership ); FindFontRightCoordinates(SM_CHAR_X, SM_CHAR_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeWisdomTime, (BOOLEAN)(gpSMCurrentMerc->usValueGoneUp & WIS_INCREASE ? TRUE : FALSE), (BOOLEAN)((gGameOptions.fNewTraitSystem && (gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_WISDOM] > 0)) ? TRUE : FALSE), gpSMCurrentMerc->bExtraWisdom != 0 ); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bWisdom + gpSMCurrentMerc->bExtraWisdom ); FindFontRightCoordinates(SM_WIS_X, SM_WIS_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeLevelTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & LVL_INCREASE? TRUE: FALSE ), FALSE , FALSE); swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bExpLevel + gpSMCurrentMerc->bExtraExpLevel ); FindFontRightCoordinates(SM_EXPLVL_X, SM_EXPLVL_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeMarksmanshipTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MRK_INCREASE? TRUE: FALSE ), ( BOOLEAN ) ( ( gGameOptions.fNewTraitSystem && ( gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_MARKSMANSHIP] > 0 )) ? TRUE : FALSE), FALSE); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bMarksmanship ); FindFontRightCoordinates(SM_MRKM_X, SM_MRKM_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeMechanicalTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MECH_INCREASE ? TRUE: FALSE ), ( BOOLEAN ) ( ( gGameOptions.fNewTraitSystem && ( gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_MECHANICAL] > 0 )) ? TRUE : FALSE), FALSE); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bMechanical ); FindFontRightCoordinates(SM_MECH_X, SM_MECH_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeExplosivesTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & EXP_INCREASE? TRUE: FALSE ), ( BOOLEAN ) ( ( gGameOptions.fNewTraitSystem && ( gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_EXPLOSIVES] > 0 )) ? TRUE : FALSE), FALSE); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bExplosive ); FindFontRightCoordinates(SM_EXPL_X, SM_EXPL_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc->timeChanges.uiChangeMedicalTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MED_INCREASE? TRUE: FALSE ), ( BOOLEAN ) ( ( gGameOptions.fNewTraitSystem && ( gpSMCurrentMerc->ubCriticalStatDamage[DAMAGED_STAT_MEDICAL] > 0 )) ? TRUE : FALSE), FALSE); // SANDRO swprintf( sString, L"%2d", gpSMCurrentMerc->stats.bMedical ); FindFontRightCoordinates(SM_MED_X, SM_MED_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); if ( gpSMCurrentMerc->stats.bLife >= OKLIFE ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( STATS_TEXT_FONT_COLOR ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKGRAY ); } // Display armour value! swprintf( sString, L"%3d", ArmourPercent( gpSMCurrentMerc ) ); FindFontRightCoordinates(SM_ARMOR_X, SM_ARMOR_Y ,SM_PERCENT_WIDTH ,SM_PERCENT_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); // Display wieght value! swprintf( sString, L"%3d", CalculateCarriedWeight( gpSMCurrentMerc ) ); FindFontRightCoordinates(SM_WEIGHT_X, SM_WEIGHT_Y ,SM_PERCENT_WIDTH ,SM_PERCENT_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); ApplyEquipmentBonuses(gpSMCurrentMerc); // Display cammo value! swprintf( sString, L"%3d", max(0, min(max((gpSMCurrentMerc->bCamo + gpSMCurrentMerc->wornCamo), max((gpSMCurrentMerc->urbanCamo+gpSMCurrentMerc->wornUrbanCamo), max((gpSMCurrentMerc->desertCamo+gpSMCurrentMerc->wornDesertCamo), (gpSMCurrentMerc->snowCamo+gpSMCurrentMerc->wornSnowCamo)))),100)) ); FindFontRightCoordinates(SM_CAMMO_X, SM_CAMMO_Y ,SM_PERCENT_WIDTH ,SM_PERCENT_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); // reset to frame buffer! SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); RestoreExternBackgroundRect( INTERFACE_START_X, INV_INTERFACE_START_Y, SCREEN_WIDTH - INTERFACE_START_X , INV_INTERFACE_HEIGHT ); RenderSoldierFace( gpSMCurrentMerc, SM_SELMERC_FACE_X, SM_SELMERC_FACE_Y, TRUE ); } // Render Name! SetFont( BLOCKFONT2 ); if ( gpSMCurrentMerc->bStealthMode ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTYELLOW ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTGRAY ); } RestoreExternBackgroundRect( SM_SELMERCNAME_X, SM_SELMERCNAME_Y, SM_SELMERCNAME_WIDTH, SM_SELMERCNAME_HEIGHT ); VarFindFontCenterCoordinates( SM_SELMERCNAME_X, SM_SELMERCNAME_Y, SM_SELMERCNAME_WIDTH, SM_SELMERCNAME_HEIGHT, SMALLFONT1, &sFontX, &sFontY, L"%s", gpSMCurrentMerc->name ); mprintf( sFontX + 5, sFontY, L"%s", gpSMCurrentMerc->name ); } if ( *pfDirty != DIRTYLEVEL0 ) { /////////////////////////////////////////////////////////////////////// // SANDRO - added a tooltip window showing exact camo percentage for every type // ******************************************************************* CHAR16 pStrCamo[400]; swprintf( pStrCamo, L"" ); swprintf( pStr, L""); if ((gpSMCurrentMerc->bCamo + gpSMCurrentMerc->wornCamo) > 0 ) { swprintf( pStrCamo, L"\n%d/%d%s %s", gpSMCurrentMerc->bCamo, gpSMCurrentMerc->wornCamo, L"%", gzMiscItemStatsFasthelp[ 21 ]); wcscat( pStr, pStrCamo); swprintf( pStrCamo, L"" ); } if ((gpSMCurrentMerc->urbanCamo + gpSMCurrentMerc->wornUrbanCamo) > 0 ) { swprintf( pStrCamo, L"\n%d/%d%s %s", gpSMCurrentMerc->urbanCamo, gpSMCurrentMerc->wornUrbanCamo, L"%", gzMiscItemStatsFasthelp[ 22 ]); wcscat( pStr, pStrCamo); swprintf( pStrCamo, L"" ); } if ((gpSMCurrentMerc->desertCamo + gpSMCurrentMerc->wornDesertCamo) > 0 ) { swprintf( pStrCamo, L"\n%d/%d%s %s", gpSMCurrentMerc->desertCamo, gpSMCurrentMerc->wornDesertCamo, L"%", gzMiscItemStatsFasthelp[ 23 ]); wcscat( pStr, pStrCamo); swprintf( pStrCamo, L"" ); } if ((gpSMCurrentMerc->snowCamo + gpSMCurrentMerc->wornSnowCamo) > 0 ) { swprintf( pStrCamo, L"\n%d/%d%s %s", gpSMCurrentMerc->snowCamo, gpSMCurrentMerc->wornSnowCamo, L"%", gzMiscItemStatsFasthelp[ 24 ] ); wcscat( pStr, pStrCamo); swprintf( pStrCamo, L"" ); } // anv: display stealth together with camo INT16 wornstealth = GetWornStealth(gpSMCurrentMerc) - gpSMCurrentMerc->GetBackgroundValue(BG_PERC_STEALTH); INT16 bonusstealth = gpSMCurrentMerc->GetBackgroundValue(BG_PERC_STEALTH); if ( gpSMCurrentMerc->ubBodyType == BLOODCAT ) { bonusstealth += 50; } // SANDRO - new/old traits else if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( gpSMCurrentMerc, STEALTHY_NT )) { bonusstealth += gSkillTraitValues.ubSTBonusToMoveQuietly; } else if ( !gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( gpSMCurrentMerc, STEALTHY_OT )) { bonusstealth += 25 * NUM_SKILL_TRAITS( gpSMCurrentMerc, STEALTHY_OT ); } if ( bonusstealth != 0 || wornstealth!= 0 ) { CHAR16 pStrBonusStealth[400]; CHAR16 pStrWornStealth[400]; if( bonusstealth < 0 ) swprintf( pStrBonusStealth, L"%d", bonusstealth ); else swprintf( pStrBonusStealth, L"+%d", bonusstealth ); if( wornstealth < 0 ) swprintf( pStrWornStealth, L"%d", wornstealth ); else swprintf( pStrWornStealth, L"+%d", wornstealth ); swprintf( pStrCamo, L"\n%s/%s %s", pStrBonusStealth, pStrWornStealth, gzMiscItemStatsFasthelp[ 25 ] ); wcscat( pStr, pStrCamo); swprintf( pStrCamo, L"" ); } SetRegionFastHelpText( &(gSM_SELMERCCamoRegion), pStr ); SetRegionHelpEndCallback( &gSM_SELMERCCamoRegion, SkiHelpTextDoneCallBack ); // Flugente: weight help text FLOAT totalweight = (FLOAT)GetTotalWeight( gpSMCurrentMerc ); swprintf( pStr, gzMiscItemStatsFasthelp[35], totalweight / 10.0 ); SetRegionFastHelpText( &(gSM_SELMERCWeightRegion), pStr ); ///////////////////////////////////////////////////////////////////////////////////////// // UPdate stats! if ( gpSMCurrentMerc->stats.bLife != 0 ) { if ( gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_VEHICLE ) { swprintf( pStr, TacticalStr[ VEHICLE_VITAL_STATS_POPUPTEXT ], gpSMCurrentMerc->stats.bLife, gpSMCurrentMerc->stats.bLifeMax, gpSMCurrentMerc->bBreath, gpSMCurrentMerc->bBreathMax ); SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), pStr ); } else if ( gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_ROBOT ) { swprintf( pStr, gzLateLocalizedString[ 16 ], gpSMCurrentMerc->stats.bLife, gpSMCurrentMerc->stats.bLifeMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else { GetMoraleString( gpSMCurrentMerc, pMoraleStr ); // Flugente: food info if food system is active if ( UsingFoodSystem() && gpSMCurrentMerc->ubProfile != ROBOT && !IsVehicle(gpSMCurrentMerc) ) { swprintf( pStr, TacticalStr[ MERC_VITAL_STATS_WITH_FOOD_POPUPTEXT ], gpSMCurrentMerc->stats.bLife, gpSMCurrentMerc->stats.bLifeMax, gpSMCurrentMerc->bBreath, gpSMCurrentMerc->bBreathMax, pMoraleStr, (INT32)(100*(gpSMCurrentMerc->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), L"%", (INT32)(100*(gpSMCurrentMerc->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), L"%" ); } else { swprintf( pStr, TacticalStr[ MERC_VITAL_STATS_POPUPTEXT ], gpSMCurrentMerc->stats.bLife, gpSMCurrentMerc->stats.bLifeMax, gpSMCurrentMerc->bBreath, gpSMCurrentMerc->bBreathMax, pMoraleStr ); } { CHAR16 atStr[500]; swprintf( atStr, L"" ); gpSMCurrentMerc->PrintDiseaseDesc( atStr ); wcscat( pStr, atStr ); } SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), pStr ); // Buggler: skills/traits tooltip on merc portrait // clear pStr value swprintf( pStr, L""); if (gGameOptions.fNewTraitSystem) // SANDRO - old/new traits check { UINT8 ubTempSkillArray[30]; INT8 bNumSkillTraits = 0; // lets rearrange our skills to a temp array // we also get the number of lines (skills) to be displayed for ( UINT8 ubCnt = 1; ubCnt < NUM_SKILLTRAITS_NT; ++ubCnt ) { if ( ProfileHasSkillTrait( gpSMCurrentMerc->ubProfile, ubCnt ) == 2 ) { ubTempSkillArray[bNumSkillTraits] = (ubCnt + NEWTRAIT_MERCSKILL_EXPERTOFFSET); bNumSkillTraits++; } else if ( ProfileHasSkillTrait( gpSMCurrentMerc->ubProfile, ubCnt ) == 1 ) { ubTempSkillArray[bNumSkillTraits] = ubCnt; bNumSkillTraits++; } } if ( bNumSkillTraits == 0 ) { swprintf( pStr, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] ); } else { for ( UINT8 ubCnt = 0; ubCnt < bNumSkillTraits; ++ubCnt ) { swprintf( sTemp, L"%s\n", gzMercSkillTextNew[ ubTempSkillArray[ubCnt] ] ); wcscat( pStr, sTemp ); } } } else { INT8 bSkill1 = 0, bSkill2 = 0; bSkill1 = gMercProfiles[ gpSMCurrentMerc->ubProfile ].bSkillTraits[0]; bSkill2 = gMercProfiles[ gpSMCurrentMerc->ubProfile ].bSkillTraits[1]; if ( bSkill1 == 0 && bSkill2 == 0 ) { swprintf( pStr, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] ); } else { //if the 2 skills are the same, add the '(expert)' at the end if( bSkill1 == bSkill2 ) { swprintf( pStr, L"%s %s", gzMercSkillText[bSkill1], gzMercSkillText[EXPERT] ); } else { //Display the first skill if( bSkill1 != 0 ) { swprintf( pStr, L"%s\n", gzMercSkillText[bSkill1] ); } if( bSkill2 != 0 ) { swprintf( sTemp, L"%s", gzMercSkillText[bSkill2] ); wcscat( pStr, sTemp ); } } } } SetRegionFastHelpText( &gSM_SELMERCPanelRegion, pStr ); } } else { SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), L"" ); SetRegionFastHelpText( &gSM_SELMERCPanelRegion, L"" ); } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) SetRegionHelpEndCallback( &gSM_SELMERCBarsRegion, SkiHelpTextDoneCallBack ); // display AP if ( !( gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_DEAD ) ) { if ( gTacticalStatus.uiFlags & TURNBASED && (gTacticalStatus.uiFlags & INCOMBAT ) && gpSMCurrentMerc->stats.bLife >= OKLIFE ) { SetFont( TINYFONT1 ); //if ( gpSMCurrentMerc->sLastTarget != NOWHERE && !EnoughPoints( gpSMCurrentMerc, MinAPsToAttack( gpSMCurrentMerc, gpSMCurrentMerc->sLastTarget, FALSE ), 0, FALSE ) || GetUIApsToDisplay( gpSMCurrentMerc ) < 0 ) if ( !EnoughPoints( gpSMCurrentMerc, MinAPsToAttack( gpSMCurrentMerc, gpSMCurrentMerc->sLastTarget, FALSE, 0 ), 0, FALSE ) || GetUIApsToDisplay( gpSMCurrentMerc ) < 0 ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKRED ); } else { if ( MercDruggedOrDrunk( gpSMCurrentMerc ) ) { SetFontBackground( FONT_MCOLOR_BLACK ); //SetFontForeground( FONT_MCOLOR_LTBLUE ); // Flugente: new colour for being drugged, as blue on black was hard to see SetRGBFontForeground( 250, 5, 250 ); } else if ( gpSMCurrentMerc->bStealthMode ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTYELLOW ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTGRAY ); } } gprintfRestore( SM_SELMERC_AP_X, SM_SELMERC_AP_Y, L"%3d", GetUIApsToDisplay( gpSMCurrentMerc ) ); VarFindFontCenterCoordinates( SM_SELMERC_AP_X, SM_SELMERC_AP_Y, SM_SELMERC_AP_WIDTH, SM_SELMERC_AP_HEIGHT, TINYFONT1, &sFontX, &sFontY, L"%d", GetUIApsToDisplay( gpSMCurrentMerc ) ); mprintf( sFontX, SM_SELMERC_AP_Y, L"%d", GetUIApsToDisplay( gpSMCurrentMerc ) ); } // Display bars DrawLifeUIBarEx( gpSMCurrentMerc, SM_SELMERC_HEALTH_X, SM_SELMERC_HEALTH_Y, SM_SELMERC_HEALTH_WIDTH, SM_SELMERC_HEALTH_HEIGHT, TRUE , FRAME_BUFFER ); if ( !(gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_ROBOT ) ) { DrawBreathUIBarEx( gpSMCurrentMerc, SM_SELMERC_BREATH_X, SM_SELMERC_BREATH_Y, SM_SELMERC_HEALTH_WIDTH, SM_SELMERC_HEALTH_HEIGHT, TRUE, FRAME_BUFFER ); DrawMoraleUIBarEx( gpSMCurrentMerc, SM_SELMERC_MORALE_X, SM_SELMERC_MORALE_Y, SM_SELMERC_MORALE_WIDTH, SM_SELMERC_MORALE_HEIGHT, TRUE, FRAME_BUFFER ); } } } /* I added this * any questions? joker */ if( fRenderRadarScreen == TRUE ) { // Render clock // CHRISL: If we're in NIV mode, don't render the clock on the SM panel if(UsingNewInventorySystem() == false) { RenderClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); } else { RemoveMouseRegionForPauseOfClock(); } // CHRISL: Change function call to include X,Y coordinates. RenderTownIDString( LOCATION_NAME_X, LOCATION_NAME_Y ); }//XXXj in tactical bug is: NIV pushes town name +Y and boom else { RemoveMouseRegionForPauseOfClock( ); } UpdateSMPanel( ); //HandlePanelFaceAnimations( gpSMCurrentMerc ); HandleSoldierFaceFlash( gpSMCurrentMerc, SM_SELMERC_FACE_X, SM_SELMERC_FACE_Y ); // Render items in guy's hand! HandleRenderInvSlots( gpSMCurrentMerc, *pfDirty ); if ( gfSMDisableForItems && (*pfDirty) != DIRTYLEVEL0 ) { UINT8 *pDestBuf; UINT32 uiDestPitchBYTES; SGPRect ClipRect; // CHRISL: Change hatching area based on inventory system ClipRect.iLeft = ((UsingNewInventorySystem() == true)) ? 0 : 87; ClipRect.iRight = ((UsingNewInventorySystem() == true)) ? SCREEN_WIDTH : 536; //ClipRect.iLeft = 87; //ClipRect.iRight = 536; ClipRect.iTop = INV_INTERFACE_START_Y; ClipRect.iBottom = SCREEN_HEIGHT; pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); Blt16BPPBufferHatchRect( (UINT16*)pDestBuf, uiDestPitchBYTES, &ClipRect ); UnLockVideoSurface( FRAME_BUFFER ); } } void UpdateStatColor( UINT32 uiTimer, BOOLEAN fIncrease, BOOLEAN fDamaged, BOOLEAN fAugmented ) // SANDRO - added argument // Flugente - me too { if ( gpSMCurrentMerc->stats.bLife >= OKLIFE ) { // SANDRO - if damaged stat we could regain, show in red until repaired if( fDamaged ) { SetFontForeground( FONT_RED ); } else if( ( GetJA2Clock() < CHANGE_STAT_RECENTLY_DURATION + uiTimer) && ( uiTimer != 0 ) ) { if( fIncrease ) { SetFontForeground( FONT_LTGREEN ); } else { SetFontForeground( FONT_RED ); } } else if ( fAugmented ) { SetRGBFontForeground( 250, 5, 250 ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( STATS_TEXT_FONT_COLOR ); } } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKGRAY ); } } void SMInvMoveCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } UINT32 uiHandPos = MSYS_GetRegionUserData( pRegion, 0 ); if ( gpSMCurrentMerc->inv[ uiHandPos ].exists() == false ) return; if (iReason == MSYS_CALLBACK_REASON_MOVE) { } else if (iReason == MSYS_CALLBACK_REASON_GAIN_MOUSE ) { if ( gpItemPointer == NULL ) { // Setup a timer.... guiMouseOverItemTime = GetJA2Clock( ); gfCheckForMouseOverItem = TRUE; gbCheckForMouseOverItemPos = (INT8)uiHandPos; } } if (iReason == MSYS_CALLBACK_REASON_LOST_MOUSE ) { //gfSM_HandInvDispText[ uiHandPos ] = 1; if ( gpItemPointer == NULL ) { HandleCompatibleAmmoUI( gpSMCurrentMerc, (INT8)uiHandPos, FALSE ); gfCheckForMouseOverItem = FALSE; fInterfacePanelDirty = DIRTYLEVEL2; gbCheckForMouseOverItemPos = NO_SLOT; } } } void InvPanelButtonClickCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { } } void SMInvMoveCammoCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } else if (iReason == MSYS_CALLBACK_REASON_GAIN_MOUSE ) { if (gpItemPointer == NULL) { // Setup a timer.... guiMouseOverItemTime = GetJA2Clock(); gfCheckForMouseOverItem = TRUE; gbCheckForMouseOverItemPos = NO_SLOT; } } if (iReason == MSYS_CALLBACK_REASON_LOST_MOUSE ) { if (gpItemPointer == NULL) { //gfSM_HandInvDispText[ uiHandPos ] = 1; HandleCompatibleAmmoUI(gpSMCurrentMerc, (INT8)NO_SLOT, FALSE); gfCheckForMouseOverItem = FALSE; } } } void SMInvClickCamoCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { // Apply camo ( if we have something in cursor... ) // If we do not have an item in hand, start moving it if ( gpItemPointer ) { // We are doing this ourselve, continue if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { if ( ApplyConsumable( gpSMCurrentMerc, gpItemPointer, FALSE, TRUE ) ) { } else { // Send message //Heinz: 23.02.09 BUGFIX: Don't send message when SKI is on if( !( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ CANNOT_DO_INV_STUFF_STR ] ); } // Check if it's the same now! if ( !gpItemPointer->exists( ) ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } } } } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { } } BOOLEAN HandleNailsVestFetish( SOLDIERTYPE *pSoldier, UINT32 uiHandPos, UINT16 usReplaceItem ) { BOOLEAN fRefuse = FALSE; // OK are we nails? if ( pSoldier->ubProfile == 34 ) { // if this the VEST POS? if ( uiHandPos == VESTPOS ) { // Are we trying to pick it up? if ( usReplaceItem == NOTHING ) { fRefuse = TRUE; } else { // Do we have nothing or the leather vest or kevlar leather vest? if (ItemIsLeatherJacket(usReplaceItem) || usReplaceItem == COMPOUND18 || usReplaceItem == JAR_QUEEN_CREATURE_BLOOD ) { // This is good.... fRefuse = FALSE; } else { fRefuse = TRUE; } } if ( fRefuse ) { // Say quote! TacticalCharacterDialogue( pSoldier, 61 ); return( TRUE ); } } } return( FALSE ); } BOOLEAN UIHandleItemPlacement( UINT8 ubHandPos, UINT16 usOldItemIndex, UINT16 usNewItemIndex, BOOLEAN fDeductPoints ) { // Try to place here if ( PlaceObject( gpSMCurrentMerc, ubHandPos, gpItemPointer ) ) { if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0, UNTRIGGERED_INTERRUPT ); } if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0, UNTRIGGERED_INTERRUPT ); } } HandleTacticalEffectsOfEquipmentChange( gpSMCurrentMerc, ubHandPos, usOldItemIndex, usNewItemIndex ); // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if cursor is empty now if ( gpItemPointer->exists() == false ) { EndItemPointer( ); } if ( gpItemPointerSoldier != gpSMCurrentMerc ) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_ITEM_PASSED_TO_MERC ], ShortItemNames[ usNewItemIndex ], gpSMCurrentMerc->name ); } // UPDATE ITEM POINTER..... gpItemPointerSoldier = gpSMCurrentMerc; if ( gpItemPointer != NULL ) { ReevaluateItemHatches( gpSMCurrentMerc, FALSE ); } // Set cursor back to normal mode... guiPendingOverrideEvent = A_CHANGE_TO_MOVE; return( TRUE ); } else { return( FALSE ); } } //Jenilee INT32 iLastHandPos = -1; #define SLOT_NONE 0 #define SLOT_HANDS 1 #define SLOT_EQUIPMENT 2 #define SLOT_VEST 3 #define SLOT_RIG 4 #define SLOT_CPACK 5 #define SLOT_BPACK 6 #define SLOT_SLING 7 #define SLOT_KNIFE 8 #define SLOT_FACE 9 STR16 uiSlotTypeName[] = { L"", //0 L"Hands", //1 L"Equipment", //2 L"Vest", //3 L"Leg Rig", //4 L"Combat Pack", //5 L"Backpack", //6 L"Sling", //7 L"Knife", //8 L"Face", //9 L"Large Pocket", //10 L"Small Pocket" //11 }; INT16 uiNIVSlotType[NUM_INV_SLOTS] = { 2, 2, 2, //0-2 9, 9, //3-4 1, 1, //5-6 2, 2, 2, 2, 2, //7-11 7, //12 8, //13 5, 5, 5, //14-16 6, 6, 6, 6, //17-20 3, 3, //21-22 4, 4, //23-24 3, 3, 3, 3, 3, //25-29 3, 3, 3, 3, 3, //30-34 4, 4, 4, 4, //35-38 4, 4, 4, 4, //39-42 5, 5, 5, 5, //43-46 6, 6, 6, 6, //47-50 6, 6, 6, 6 //51-54 }; UINT16 uiOIVSlotType[NUM_INV_SLOTS] = { 2, 2, 2, //0-2 9, 9, //3-4 1, 1, //5-6 0, 0, 0, 0, 0, 0, 0, //7-13 10, 10, 10, 10, //14-17 0, 0, 0, 0, 0, 0, 0, //18-24 11, 11, 11, 11, 11, 11, 11, 11, //25-32 0, 0, 0, 0, 0, 0, 0, 0, //33-40 0, 0, 0, 0, 0, 0, 0, 0, //41-48 0, 0, 0, 0, 0, 0 //49-54 }; UINT16 GetInvMovementCost(OBJECTTYPE* pObj, INT16 old_pos, INT16 new_pos) { if (!(gTacticalStatus.uiFlags & INCOMBAT) || //Not in combat (old_pos == -1 || new_pos == -1)|| //Either position is invalid (old_pos == new_pos)) //Old position same as new position return 0; INT16 src_type; INT16 dst_type; if (UsingNewInventorySystem() == TRUE) { src_type = uiNIVSlotType[old_pos]; dst_type = uiNIVSlotType[new_pos]; } else { src_type = uiOIVSlotType[old_pos]; dst_type = uiOIVSlotType[new_pos]; } if (src_type == dst_type) //Moving to same lbe type return 0; //If these 2 arrays are initiated outside the function, APBPConstants will not have been initialized, and all values will be 0 INT16 uiAPCostFromSlot[12] = { APBPConstants[AP_INV_FROM_NONE], APBPConstants[AP_INV_FROM_HANDS], APBPConstants[AP_INV_FROM_EQUIPMENT], APBPConstants[AP_INV_FROM_VEST], APBPConstants[AP_INV_FROM_RIG], APBPConstants[AP_INV_FROM_CPACK], APBPConstants[AP_INV_FROM_BPACK], APBPConstants[AP_INV_FROM_SLING], APBPConstants[AP_INV_FROM_KNIFE], APBPConstants[AP_INV_FROM_FACE], APBPConstants[AP_INV_FROM_BIG_POCKET], APBPConstants[AP_INV_FROM_SMALL_POCKET] }; INT16 uiAPCostToSlot[12] = { APBPConstants[AP_INV_TO_NONE], APBPConstants[AP_INV_TO_HANDS], APBPConstants[AP_INV_TO_EQUIPMENT], APBPConstants[AP_INV_TO_VEST], APBPConstants[AP_INV_TO_RIG], APBPConstants[AP_INV_TO_CPACK], APBPConstants[AP_INV_TO_BPACK], APBPConstants[AP_INV_TO_SLING], APBPConstants[AP_INV_TO_KNIFE], APBPConstants[AP_INV_TO_FACE], APBPConstants[AP_INV_TO_BIG_POCKET], APBPConstants[AP_INV_TO_SMALL_POCKET] }; FLOAT Weight_Divisor = gGameExternalOptions.uWeightDivisor; UINT16 weight_modifier; if (Weight_Divisor != 0) weight_modifier = DynamicAdjustAPConstants((int)((Item[pObj->usItem].ubWeight) / Weight_Divisor),(int)((Item[pObj->usItem].ubWeight) / Weight_Divisor)); else weight_modifier = 0; INT32 cost = 0; cost += uiAPCostFromSlot[src_type]; cost += uiAPCostToSlot[dst_type]; cost += weight_modifier; // Flugente if we move an item from our hands to the sling, and item has a weapon sling, don't charge any APs if ( 1 == src_type && 7 == dst_type ) { // if item has a weapon sling attached if ( HasAttachmentOfClass(pObj, AC_SLING) ) // we simply let go of the item, we can do that because the sling will catch it cost = 0; } if (cost > APBPConstants[AP_INV_MAX_COST]) cost = APBPConstants[AP_INV_MAX_COST]; #ifdef _DEBUG CHAR16 szTemp[255]; swprintf(szTemp, L"Moving item from %s to %s (costs: %d/%d/%d/%d)", uiSlotTypeName[src_type], uiSlotTypeName[dst_type], uiAPCostFromSlot[src_type], uiAPCostToSlot[dst_type], weight_modifier, cost); ScreenMsg(FONT_MCOLOR_LTGREEN, MSG_CHAT, szTemp); #endif return cost; } void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT32 uiHandPos; // Copies of values UINT16 usOldItemIndex, usNewItemIndex; UINT16 usItemPrevInItemPointer; UINT16 usCostToMoveItem = 0; //Jenilee BOOLEAN fNewItem = FALSE; static BOOLEAN fRightDown = FALSE; static BOOLEAN fLeftDown = FALSE; BOOLEAN INV_AP_COST = UsingInventoryCostsAPSystem(); uiHandPos = MSYS_GetRegionUserData( pRegion, 0 ); if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { return; } if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { // and this inventory slot is hatched out if( ShouldSoldierDisplayHatchOnItem( gpSMCurrentMerc->ubProfile, (INT16)uiHandPos ) ) { // it means that item is a copy of one in the player's offer area, so we treat it as if the slot was empty (ignore) // if the cursor has an item in it, we still ignore the click, because handling swaps in this situation would be // ugly, we'd have to the the swap, then make the bOwnerSlot of the item just picked up a -1 in its offer area spot. return; } } //if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) //{ // fLeftDown = TRUE; //} //else if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP && fLeftDown ) // CHRISL: Are we in combat, wearing a backpack with the zipper closed? Don't allow access to backpack items if((UsingNewInventorySystem() == true)) if(icLBE[uiHandPos] == BPACKPOCKPOS && (!(gpSMCurrentMerc->flags.ZipperFlag) || (gpSMCurrentMerc->flags.ZipperFlag && gAnimControl[gpSMCurrentMerc->usAnimState].ubEndHeight == ANIM_STAND)) && (gTacticalStatus.uiFlags & INCOMBAT) && (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN )) iReason = MSYS_CALLBACK_REASON_NONE; if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { fLeftDown = FALSE; // If we do not have an item in hand, start moving it if ( gpItemPointer == NULL ) { // Return if empty if ( gpSMCurrentMerc->inv[ uiHandPos ].exists() == false ) return; if ( gpSMCurrentMerc->ubID != gusSelectedSoldier ) { SelectSoldier( gpSMCurrentMerc->ubID, FALSE, FALSE ); } // OK, check if this is Nails, and we're in the vest position , don't allow it to come off.... if ( HandleNailsVestFetish( gpSMCurrentMerc, uiHandPos, NOTHING ) ) { return; } if ( _KeyDown(CTRL) ) { CleanUpStack( &( gpSMCurrentMerc->inv[ uiHandPos ] ), NULL ); return; } if((UsingNewInventorySystem() == true)) { /*if we pick up a backpack without reactivating the drop pack button, and we have a dropkey, reactivate the button*/ if(uiHandPos == BPACKPOCKPOS) { // Deal with the zipper before we do anything if(gpSMCurrentMerc->flags.ZipperFlag) if(!ChangeZipperStatus(gpSMCurrentMerc, FALSE)) return; // Do we still have a linked backpack? If so, reset droppackflag for(unsigned int wi = 0; wi < guiNumWorldItems; wi++) { if(gWorldItems[wi].soldierID == gpSMCurrentMerc->ubID && gWorldItems[wi].object.exists() == true) { gpSMCurrentMerc->flags.DropPackFlag = TRUE; break; } } RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ } } // Turn off new item glow! gpSMCurrentMerc->inv.bNewItemCount[ uiHandPos ] = 0; usOldItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; //Jenilee: remember our last selected slot iLastHandPos = uiHandPos; // move item into the mouse cursor BeginItemPointer( gpSMCurrentMerc, (UINT8)uiHandPos ); //if we are in the shopkeeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { // pick up item from regular inventory slot into cursor OR try to sell it ( unless CTRL is held down ) BeginSkiItemPointer( PLAYERS_INVENTORY, ( INT8 ) uiHandPos, ( BOOLEAN )!gfKeyState[ CTRL ] ); } HandleTacticalEffectsOfEquipmentChange( gpSMCurrentMerc, uiHandPos, usOldItemIndex, NOTHING ); // HandleCompatibleAmmoUI( gpSMCurrentMerc, (INT8)uiHandPos, FALSE ); } else // item in cursor { SoldierID ubSrcID, ubDestID; BOOLEAN fOKToGo = FALSE; BOOLEAN fDeductPoints = FALSE; // ATE: OK, get source, dest guy if different... check for and then charge appropriate APs ubSrcID = gpSMCurrentMerc->ubID; ubDestID = gpItemPointerSoldier->ubID; if ( ubSrcID == ubDestID ) { if(!CanItemFitInPosition(gpSMCurrentMerc, gpItemPointer, (INT8)uiHandPos, FALSE))//dnl ch66 070913 return; if (INV_AP_COST) //Jenilee: determine the cost of moving this item around in our inventory usCostToMoveItem = GetInvMovementCost(gpItemPointer, iLastHandPos, uiHandPos); // Flugente: backgrounds usCostToMoveItem = (usCostToMoveItem * (100 + gpSMCurrentMerc->GetBackgroundValue(BG_INVENTORY))) / 100; if ( ( usCostToMoveItem == 0 ) || ( gpSMCurrentMerc->bActionPoints >= usCostToMoveItem ) ) { fOKToGo = TRUE; //iLastHandPos = uiHandPos;//dnl ch66 070913 this should be set after we move item } else //we dont have enough APs to move it to this slot, show a warning message { // silversurfer: What if our old slot is occupied now (could happen when we swap items)? // We will be stuck with an item at the hand cursor and nowhere to put it -> bad. :-( // So let's check if our old slot is empty and if it is not allow item placement anyway. if ( gpSMCurrentMerc->inv[ iLastHandPos ].usItem == NULL ) { ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[NOT_ENOUGH_APS_STR]); fOKToGo = FALSE; } else fOKToGo = TRUE; } // We are doing this ourselve, continue // fOKToGo = TRUE; } else { // These guys are different.... fDeductPoints = TRUE; // First check points for src guy if ( gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpItemPointerSoldier, 3, 0, TRUE ) ) { fOKToGo = TRUE; } } else { fOKToGo = TRUE; } // Should we go on? if ( fOKToGo ) { if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpSMCurrentMerc, 3, 0, TRUE ) ) { fOKToGo = TRUE; } else { fOKToGo = FALSE; } } } } if ( fOKToGo ) { usOldItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; usNewItemIndex = gpItemPointer->usItem; // OK, check if this is Nails, and we're in the vest position , don't allow it to come off.... if ( HandleNailsVestFetish( gpSMCurrentMerc, uiHandPos, usNewItemIndex ) ) { return; } if ( _KeyDown(CTRL) ) { if ( gpItemPointer->exists() && gpSMCurrentMerc->inv[ uiHandPos ].exists() ) { if ( gpItemPointer->usItem == gpSMCurrentMerc->inv[ uiHandPos ].usItem ) CleanUpStack( &( gpSMCurrentMerc->inv[ uiHandPos ] ), gpItemPointer ); else // Madd: attach / merge object, merge only works on single objects for now { UINT8 cnt = gpSMCurrentMerc->inv[ uiHandPos ].ubNumberOfObjects; if ( gpItemPointer->ubNumberOfObjects < cnt ) cnt = gpItemPointer->ubNumberOfObjects; for (UINT8 i = 0; iusItem, gpSMCurrentMerc->inv[uiHandPos].usItem, gpSMCurrentMerc); // Flugente: backgrounds usCostToMoveItem = (usCostToMoveItem * (100 + gpSMCurrentMerc->GetBackgroundValue(BG_INVENTORY))) / 100; // do we have enough AP? if (!EnoughPoints(gpSMCurrentMerc, usCostToMoveItem, 0, TRUE)) return; gpSMCurrentMerc->bActionPoints -= usCostToMoveItem; } gpSMCurrentMerc->inv[uiHandPos].AttachObject(gpSMCurrentMerc, gpItemPointer, TRUE, i); } } } if ( gpItemPointer->exists() == false ) { EndItemPointer( ); } return; } // hold ALT key to swap valid attachment item instead if ( _KeyDown(ALT) ) { // do nothing } // we allow attaching on items in any slot else if ( ValidAttachment( usNewItemIndex, &(gpSMCurrentMerc->inv[uiHandPos]) ) ) { // it's an attempt to attach; bring up the inventory panel if ( !InItemDescriptionBox( ) ) { InitItemDescriptionBox( gpSMCurrentMerc, (UINT8)uiHandPos, ITEMDESC_START_X, ITEMDESC_START_Y, 0 ); } return; } if ( uiHandPos == HANDPOS || uiHandPos == SECONDHANDPOS || uiHandPos == HELMETPOS || uiHandPos == VESTPOS || uiHandPos == LEGPOS ) { if ( ValidMerge( usNewItemIndex, usOldItemIndex ) ) { // bring up merge requestor gubHandPos = (UINT8) uiHandPos; gusOldItemIndex = usOldItemIndex; gusNewItemIndex = usNewItemIndex; gfDeductPoints = fDeductPoints; if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { //the only way to merge items is to pick them up. In SKI when you pick up an item, the cursor is //locked in a region, free it up. FreeMouseCursor( TRUE ); DoMessageBox( MSG_BOX_BASIC_STYLE, Message[ STR_MERGE_ITEMS ], SHOPKEEPER_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, MergeMessageBoxCallBack, NULL ); } else DoMessageBox( MSG_BOX_BASIC_STYLE, Message[ STR_MERGE_ITEMS ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, MergeMessageBoxCallBack, NULL ); return; } // else handle normally } /* CHRISL: For New Inventory system. Are we swapping LBE Items? We'll need to move any items in the associated IC group pockets into a new LBENODE. We'll have to check whether we already have an LBENODE for this type of LBE item and, if so, remove the items from it, place them in the LBE Items current sector, and delete the existing LBENODE. Then we need to know if the LBE Item in the cursor is an LBENODE or just a normal OBJECTTYPE. If it's an LBENODE, we need to move it's items into the appropriate pockets for the soldier and then delete the LBENODE.*/ if((UsingNewInventorySystem() == true)) { //If we put a new pack in the backpack pocket, turn off the droppack button if(uiHandPos == BPACKPOCKPOS && CanItemFitInPosition(gpSMCurrentMerc, gpItemPointer, uiHandPos, FALSE)) { // First, deal with the zipper if(gpSMCurrentMerc->flags.ZipperFlag) if(!ChangeZipperStatus(gpSMCurrentMerc, FALSE)) return; if(gpSMCurrentMerc->flags.DropPackFlag) gpSMCurrentMerc->flags.DropPackFlag = FALSE; RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ } } // remember the item type currently in the item pointer usItemPrevInItemPointer = gpItemPointer->usItem; if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { // If it's just been purchased or repaired, mark it as a "new item" fNewItem = ( BOOLEAN ) ( gMoveingItem.uiFlags & ( ARMS_INV_JUST_PURCHASED | ARMS_INV_ITEM_REPAIRED ) ); } // try to place the item in the cursor into this inventory slot if ( UIHandleItemPlacement( (UINT8) uiHandPos, usOldItemIndex, usNewItemIndex, fDeductPoints ) ) { iLastHandPos = uiHandPos;//dnl ch66 070913 //Jenilee: pay the price //just make sure to handle that if we are putting it back in the SAME slot, the cost should be 0!!! gpSMCurrentMerc->bActionPoints -= usCostToMoveItem; RenderBackpackButtons(ACTIVATE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ // it worked! if we're in the SKI... if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { SetNewItem( gpSMCurrentMerc, ( UINT8 ) uiHandPos, fNewItem ); // and the cursor is now empty if( gpItemPointer == NULL ) { // clean up gMoveingItem.initialize(); SetSkiCursor( CURSOR_NORMAL ); } else { // if we're holding something else in the pointer now if ( usItemPrevInItemPointer != gpItemPointer->usItem ) { // pick up item swapped out of inventory slot into cursor (don't try to sell) BeginSkiItemPointer( PLAYERS_INVENTORY, -1, FALSE ); } else { // otherwise, leave the cursor as is, means more items were picked up at once than can be placed in this slot // we deal with this by leaving the remainder in the cursor, to be put down elsewhere using subsequent clicks } } } // Setup a timer.... //guiMouseOverItemTime = GetJA2Clock( ); //gfCheckForMouseOverItem = TRUE; //gbCheckForMouseOverItemPos = (INT8)uiHandPos; } /* // Try to place here if ( PlaceObject( gpSMCurrentMerc, (UINT8)uiHandPos, gpItemPointer ) ) { if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0 ); } if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0 ); } } HandleTacticalEffectsOfEquipmentChange( gpSMCurrentMerc, uiHandPos, usOldItemIndex, usNewItemIndex ); // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->exists() == false ) { EndItemPointer( ); } // Setup a timer.... guiMouseOverItemTime = GetJA2Clock( ); gfCheckForMouseOverItem = TRUE; gbCheckForMouseOverItemPos = (INT8)uiHandPos; } */ } } // Flugente: we have to recheck our flashlights, as we changed items //gpSMCurrentMerc->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT; gpSMCurrentMerc->HandleFlashLights(); // sevenfm: update morale, as we could add/remove walkman RefreshSoldierMorale(gpSMCurrentMerc); } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { fRightDown = TRUE; } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP && fRightDown ) { fRightDown = FALSE; // Return if empty if ( gpSMCurrentMerc->inv[ uiHandPos ].exists() == false ) return; // CJC: OK, get source, dest guy if different, don't allow panels to be brought up /* if ( gpItemPointer && gpSMCurrentMerc->ubID != gpItemPointerSoldier->ubID ) { return; } */ // Turn off new item glow! gpSMCurrentMerc->inv.bNewItemCount[ uiHandPos ] = 0; // Some global stuff here - for esc, etc // Check for # of slots in item // CHRISL: Use new ItemSlotLimit function if we're using the new inventory system UINT8 isLimit = ItemSlotLimit( &gpSMCurrentMerc->inv[ uiHandPos ], uiHandPos, gpSMCurrentMerc ); // access description box directly if CTRL is pressed for stack items if( !( ( gpSMCurrentMerc->inv[ uiHandPos ].ubNumberOfObjects > 1 && isLimit > 0 ) && ( guiCurrentScreen != MAP_SCREEN ) ) || _KeyDown( CTRL ) ) { if ( !InItemDescriptionBox( ) ) { if ( _KeyDown(SHIFT) && gpItemPointer == NULL && Item[gpSMCurrentMerc->inv[ uiHandPos ].usItem].usItemClass == IC_GUN && (gpSMCurrentMerc->inv[ uiHandPos ])[uiHandPos]->data.gun.ubGunShotsLeft > 0 && !ItemIsSingleShotRocketLauncher(gpSMCurrentMerc->inv[ uiHandPos ].usItem) && !( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) ) { EmptyWeaponMagazine( &(gpSMCurrentMerc->inv[ uiHandPos ]), &gItemPointer, uiHandPos ); gpItemPointer = &gItemPointer; gpItemPointerSoldier = gpSMCurrentMerc; } else InitItemDescriptionBox( gpSMCurrentMerc, (UINT8)uiHandPos, ITEMDESC_START_X, ITEMDESC_START_Y, 0 ); } } else { if ( !InItemStackPopup( ) ) { //CHRISL: Set popup width based on pocket size INT16 invWidth; if(uiHandPos >= (UINT32)BIGPOCKSTART && uiHandPos < (UINT32)BIGPOCKFINAL) invWidth = 531; else if(uiHandPos >= (UINT32)MEDPOCKSTART && uiHandPos < (UINT32)MEDPOCKFINAL) invWidth = 412; else invWidth = 314; //InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, SM_ITEMDESC_WIDTH, SM_ITEMDESC_HEIGHT ); //CHRISL: In OIV mode, we don't want to offset the keyring popup. UINT8 inv_interface_start_x; if(UsingNewInventorySystem() == false) inv_interface_start_x = 213; else inv_interface_start_x = 248; InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, inv_interface_start_x + xResOffset, INV_INTERFACE_START_Y, invWidth, ( SCREEN_HEIGHT - INV_INTERFACE_START_Y ) ); } } } else if (iReason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { fRightDown = FALSE; fLeftDown = FALSE; } } // CHRISL: Function to adjust zipper backpack button status BOOLEAN ChangeZipperStatus(SOLDIERTYPE *pSoldier, BOOLEAN newStatus) { INT16 sAPCost; INT32 iBPCost = APBPConstants[BP_WORK_ZIPPER]; INT8 bNewStance; //Set AP cost based on what we're doing sAPCost = (newStatus) ? APBPConstants[AP_CLOSE_ZIPPER] : APBPConstants[AP_OPEN_ZIPPER]; // SANDRO - ambidextrous bonus to handle things faster if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) sAPCost = (INT16)(sAPCost * (100 - gSkillTraitValues.ubAMWorkBackpackAPsReduction) / 100.0f + 0.5f); //Are we currently in combat? if(gTacticalStatus.uiFlags & INCOMBAT) { // If we have fewer base points then the default cost to unzip a pack, use all remaining points instead if(pSoldier->bInitialActionPoints < sAPCost) sAPCost = pSoldier->bInitialActionPoints; if(EnoughPoints(pSoldier, sAPCost, iBPCost, TRUE)) DeductPoints(pSoldier, sAPCost, iBPCost); else return FALSE; } //Opening a pack? if(newStatus) { // Are we standing? bNewStance = gAnimControl[ pSoldier->usAnimState ].ubEndHeight; if(bNewStance == ANIM_STAND) { bNewStance = ANIM_CROUCH; UIHandleSoldierStanceChange( pSoldier->ubID, bNewStance ); } pSoldier->flags.ZipperFlag = newStatus; gfUIStanceDifferent = TRUE; } // Closing a pack? else { pSoldier->flags.ZipperFlag = newStatus; gfUIStanceDifferent = TRUE; } fCharacterInfoPanelDirty = TRUE; fInterfacePanelDirty = DIRTYLEVEL2; return TRUE; } // CHRISL: Function to adjust droppack packpack button status BOOLEAN ChangeDropPackStatus(SOLDIERTYPE *pSoldier, BOOLEAN newStatus) { INT16 sAPCost = APBPConstants[AP_BACK_PACK]; INT32 iBPCost = APBPConstants[BP_BACK_PACK]; INT32 worldKey=1, iRange=0; // Are we dropping a pack that has the zipper open? if(newStatus && pSoldier->flags.ZipperFlag) { sAPCost = 0; if(!ChangeZipperStatus(pSoldier, FALSE)) return FALSE; } // Are we currently in combat? if((gTacticalStatus.uiFlags & INCOMBAT) || (gTacticalStatus.fEnemyInSector)) { // If we're standing over the backpack that we're trying to pick up, reset the ap cost to 0 if(!newStatus) { for(unsigned int wi = 0; wi < guiNumWorldItems; wi++) { if(gWorldItems[wi].soldierID == pSoldier->ubID && gWorldItems[wi].object.exists() == true) { for (unsigned int x = 0; x < gWorldItems[wi].object.ubNumberOfObjects; ++x) { // Failsafe in case our LBEArray data ever goes missing. if(x >= LBEArray.size()){ break; } if(gWorldItems[wi].object.IsActiveLBE(x)) { LBENODE* pLBE = gWorldItems[wi].object.GetLBEPointer(x); if(pLBE && pLBE->lbeIndex != NONE) { // Found an associated backpack so figure out how far that pack is from us iRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, gWorldItems[wi].sGridNo ); if(gWorldItems[wi].sGridNo == pSoldier->sGridNo) // standing on pack - pickup regardless { // Buggler: pickup should cost the same as manually picking it up //sAPCost = 0; break; } else if(iRange < 26 && !(gTacticalStatus.uiFlags & INCOMBAT)) // should mean anything within 2 diagonal tiles while not in combat { // just break because we want to allow this with no changes break; } // If not, we can't pick up the item else { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_CAN_NOT_PICKUP] ); return FALSE; } } } } break; } } } // Do we have enough APs to complete this action? if(EnoughPoints(pSoldier, sAPCost, iBPCost, TRUE)) DeductPoints(pSoldier, sAPCost, iBPCost); else return FALSE; } // Dropping a pack? if(newStatus) { // We need to clear any existing WorldItems that are linked with this soldier for(unsigned int wi = 0; wi < guiNumWorldItems; wi++) { if(gWorldItems[wi].soldierID == pSoldier->ubID) { gWorldItems[wi].soldierID = NOBODY; } } MoveItemToLBEItem( pSoldier, BPACKPOCKPOS ); AddItemToPoolAndGetIndex(pSoldier->sGridNo, &pSoldier->inv[BPACKPOCKPOS], 1, pSoldier->pathing.bLevel, 0, -1, pSoldier->ubID, &worldKey ); // Item successfully added to world if(worldKey != ITEM_NOT_FOUND) { NotifySoldiersToLookforItems( ); DeleteObj(&pSoldier->inv[BPACKPOCKPOS]); pSoldier->flags.DropPackFlag = newStatus; gfUIStanceDifferent = TRUE; } } // Picking up a pack? else { for(unsigned int wi = 0; wi < guiNumWorldItems; wi++) { //CHRISL: There's the remote chance that a non-LBE item might get associated with a merc. If that happens, we can // have a CTD, so lets resolve that here. if(Item[gWorldItems[wi].object.usItem].usItemClass != IC_LBEGEAR) gWorldItems[wi].soldierID = NOBODY; if(gWorldItems[wi].soldierID == pSoldier->ubID && gWorldItems[wi].fExists == TRUE && Item[gWorldItems[wi].object.usItem].usItemClass == IC_LBEGEAR && LoadBearingEquipment[Item[gWorldItems[wi].object.usItem].ubClassIndex].lbeClass == BACKPACK) { for (int x = 0; x < gWorldItems[wi].object.ubNumberOfObjects; ++x) { // Is the item we dropped in this sector and does it have an active LBENODE flag? //if(gWorldItems[wi].object.IsActiveLBE(x)) { // Is the LBENODE we're trying to pick up actually in use? //if(gWorldItems[wi].object.GetLBEPointer(x)->lbeIndex != NONE) { // Try to pickup the LBENODE if(AutoPlaceObject(pSoldier, &(gWorldItems[wi].object ), TRUE )) { RemoveItemFromPool(gWorldItems[wi].sGridNo, wi, gWorldItems[wi].ubLevel); pSoldier->flags.DropPackFlag = newStatus; gfUIStanceDifferent = TRUE; return TRUE; } else { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_DROP] ); return TRUE; } } //} } ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_PACK] ); break; } } //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_PACK] ); } return TRUE; } void MergeMessageBoxCallBack( UINT8 ubExitValue ) { if ( ubExitValue == MSG_BOX_RETURN_YES ) { //ADB see what happens here DebugBreakpoint(); gpSMCurrentMerc->inv[ gubHandPos ].AttachObject( gpItemPointerSoldier, gpItemPointer, FALSE ); // re-evaluate repairs gfReEvaluateEveryonesNothingToDo = TRUE; if (gpItemPointer->exists() == false) { // merge item consumed EndItemPointer(); fInterfacePanelDirty = DIRTYLEVEL2; } } else { UIHandleItemPlacement( gubHandPos, gusOldItemIndex, gusNewItemIndex, gfDeductPoints ); } } void HandleMouseOverSoldierFaceForContMove( SOLDIERTYPE *pSoldier, BOOLEAN fOn ) { FACETYPE *pFace; INT32 sGridNo = NOWHERE; if ( pSoldier == NULL ) { return; } if ( fOn ) { // Check if we are waiting to continue move... if ( CheckForMercContMove( pSoldier ) ) { // Display 'cont' on face.... // Get face pFace = &gFacesData[ pSoldier->iFaceIndex ]; pFace->fDisplayTextOver = FACE_DRAW_TEXT_OVER; wcscpy( pFace->zDisplayText, TacticalStr[ CONTINUE_OVER_FACE_STR ] ); sGridNo = pSoldier->pathing.sFinalDestination; if ( pSoldier->bGoodContPath ) { sGridNo = pSoldier->sContPathLocation; } // While our mouse is here, draw a path! PlotPath( pSoldier, sGridNo, NO_COPYROUTE, PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); } } else { // Remove 'cont' on face.... // Get face pFace = &gFacesData[ pSoldier->iFaceIndex ]; pFace->fDisplayTextOver = FACE_ERASE_TEXT_OVER; // Erase path! ErasePath( TRUE ); } fInterfacePanelDirty = DIRTYLEVEL2; } void SelectedMercButtonMoveCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if ( gpSMCurrentMerc == NULL ) { return; } if (iReason & MSYS_CALLBACK_REASON_MOVE ) { HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, TRUE ); } else if ( iReason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, FALSE ); } } void SelectedMercButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if ( gpSMCurrentMerc == NULL ) { return; } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) return; if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP) { // ATE: Don't if this guy can't.... if ( !gfSMDisableForItems ) { if ( CheckForMercContMove( gpSMCurrentMerc ) ) { // Continue ContinueMercMovement( gpSMCurrentMerc ); ErasePath( TRUE ); } else { HandleLocateSelectMerc( gpSMCurrentMerc->ubID, 0 ); } } } //CHRISL: Change this to UP so that we don't inadvertantly switch to action mode when closing Inv panel //else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP) { // ATE: Cannot get out by right clicking... //if ( gpItemPointer == NULL ) { //if ( !gfSMDisableForItems || ( gfSMDisableForItems && gpItemPointer == NULL ) ) { // Delete desc if ( InItemDescriptionBox( ) ) { DeleteItemDescriptionBox( ); } gfSwitchPanel = TRUE; gbNewPanel = TEAM_PANEL; } } } } void SelectedMercEnemyIndicatorCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if ( gpSMCurrentMerc == NULL ) { return; } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) return; if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP) { // ATE: Don't if this guy can't.... if ( !gfSMDisableForItems ) { //if ( gpSMCurrentMerc->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) //{ //} //else { if ( gpSMCurrentMerc->aiData.bOppCnt > 0 ) { CycleVisibleEnemies( gpSMCurrentMerc ); } else { SelectedMercButtonCallback( pRegion, iReason ); } } } } } void BtnStanceUpCallback(GUI_BUTTON *btn,INT32 reason) { INT8 bNewStance; if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); bNewStance = gAnimControl[ gpSMCurrentMerc->usAnimState ].ubEndHeight; if ( bNewStance == ANIM_CROUCH ) { bNewStance = ANIM_STAND; } else if ( bNewStance == ANIM_PRONE ) { bNewStance = ANIM_CROUCH; } UIHandleSoldierStanceChange( gpSMCurrentMerc->ubID, bNewStance ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } // CHRISL: Callback functions for backpack buttons void BtnDropPackCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); //CHRISL: Added "SHIFT-LMB" option to drop packs for all members of current squad if ( _KeyDown( SHIFT ) ) { INT8 bAssignment = gpSMCurrentMerc->bAssignment; for( SoldierID x = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; x <= gTacticalStatus.Team[ OUR_TEAM ].bLastID; ++x ) { SOLDIERTYPE *pSoldier = x; /* Is DropPackFlag currently false and is there something in the backpack pocket? If so, we haven't dropped a pack yet and apparently want to*/ if(pSoldier->bAssignment == bAssignment && pSoldier->inv[BPACKPOCKPOS].exists() == true && !pSoldier->flags.DropPackFlag) { ChangeDropPackStatus(pSoldier, TRUE); } /* Is DropPackFlag currently true, is nothing in the backpack pocket and have we dropped a pack? If so, we must want to retreive a backpack we previously dropped.*/ else if(pSoldier->bAssignment == bAssignment && pSoldier->inv[BPACKPOCKPOS].exists() == false && pSoldier->flags.DropPackFlag) { ChangeDropPackStatus(pSoldier, FALSE); } } } else { /* Is DropPackFlag currently false and is there something in the backpack pocket? If so, we haven't dropped a pack yet and apparently want to*/ if(gpSMCurrentMerc->inv[BPACKPOCKPOS].exists() == true && !gpSMCurrentMerc->flags.DropPackFlag) { ChangeDropPackStatus(gpSMCurrentMerc, TRUE); } /* Is DropPackFlag currently true, is nothing in the backpack pocket and have we dropped a pack? If so, we must want to retreive a backpack we previously dropped.*/ else if(gpSMCurrentMerc->inv[BPACKPOCKPOS].exists() == false && gpSMCurrentMerc->flags.DropPackFlag) { ChangeDropPackStatus(gpSMCurrentMerc, FALSE); } } } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnZipperCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); //Are we in combat, do we have a backpack on and is the pack closed? Open it if((gTacticalStatus.uiFlags & INCOMBAT) && gpSMCurrentMerc->inv[BPACKPOCKPOS].exists() == true && !gpSMCurrentMerc->flags.ZipperFlag) { ChangeZipperStatus(gpSMCurrentMerc, TRUE); } //Is the pack open? else if(gpSMCurrentMerc->flags.ZipperFlag) { ChangeZipperStatus(gpSMCurrentMerc, FALSE); } //Are we not in combat? else if(!(gTacticalStatus.uiFlags & INCOMBAT)) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_ZIPPER_COMBAT] ); } } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnUpdownCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); //gsInterfaceLevel = gpSMCurrentMerc->bUIInterfaceLevel; // Change interface level via HandleUI handler UIHandleChangeLevel( NULL ); // Remember soldier's new value gpSMCurrentMerc->bUIInterfaceLevel = (INT8)gsInterfaceLevel; } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnClimbCallback(GUI_BUTTON *btn,INT32 reason) { BOOLEAN fNearHeigherLevel; BOOLEAN fNearLowerLevel; INT8 bDirection; if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); GetMercClimbDirection( gpSMCurrentMerc->ubID, &fNearLowerLevel, &fNearHeigherLevel ); if ( fNearLowerLevel ) { if (!gpSMCurrentMerc->CanClimbWithCurrentBackpack()) { ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB]); return; } gpSMCurrentMerc->BeginSoldierClimbDownRoof(); } if ( fNearHeigherLevel ) { if (!gpSMCurrentMerc->CanClimbWithCurrentBackpack()) { ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB]); return; } gpSMCurrentMerc->BeginSoldierClimbUpRoof(); } //---------------Legion by JAzz----------- if (gGameExternalOptions.fCanClimbOnWalls == TRUE) { if (!gpSMCurrentMerc->CanClimbWithCurrentBackpack()) { ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB]); return; } if ( FindWallJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) ) { gpSMCurrentMerc->BeginSoldierClimbWall(); } } //------------------------------------------ if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) ) { if (!gpSMCurrentMerc->CanClimbWithCurrentBackpack()) { ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB]); return; } gpSMCurrentMerc->BeginSoldierClimbFence(); } } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnStanceDownCallback(GUI_BUTTON *btn,INT32 reason) { INT8 bNewStance; if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); bNewStance = gAnimControl[ gpSMCurrentMerc->usAnimState ].ubEndHeight; if ( bNewStance == ANIM_STAND ) { bNewStance = ANIM_CROUCH; } else if ( bNewStance == ANIM_CROUCH ) { bNewStance = ANIM_PRONE; } UIHandleSoldierStanceChange( gpSMCurrentMerc->ubID, bNewStance ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnStealthModeCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); gpSMCurrentMerc->bStealthMode = ! gpSMCurrentMerc->bStealthMode; gfUIStanceDifferent = TRUE; gfPlotNewMovement = TRUE; fInterfacePanelDirty = DIRTYLEVEL2; } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnHandCursorCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if (reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { ToggleHandCursorMode( &guiCurrentEvent ); } } void BtnTalkCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if (reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { ToggleTalkCursorMode( &guiCurrentEvent ); } } void BtnMuteCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if (reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { if ( gpSMCurrentMerc->flags.uiStatusFlags & SOLDIER_MUTE ) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ MUTE_OFF_STR ], gpSMCurrentMerc->name ); gpSMCurrentMerc->flags.uiStatusFlags &= ( ~SOLDIER_MUTE ); } else { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ MUTE_ON_STR ], gpSMCurrentMerc->name ); gpSMCurrentMerc->flags.uiStatusFlags |= ( SOLDIER_MUTE ); } } } void BtnPrevMercCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); SoldierID sID = FindPrevActiveAndAliveMerc( gpSMCurrentMerc, TRUE, TRUE ); gubSelectSMPanelToMerc = sID; if ( !gfInItemPickupMenu ) { //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { LocateSoldier( sID, DONTSETLOCATOR ); // refresh background for player slots (in case item values change due to Flo's discount) gubSkiDirtyLevel = SKI_DIRTY_LEVEL2; } else LocateSoldier( sID, SETLOCATOR ); } //if the user is in the shop keeper interface and is in the item desc if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { if ( InItemDescriptionBox( ) ) { DeleteItemDescriptionBox( ); } } } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnNextMercCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); SoldierID sID = FindNextActiveAndAliveMerc( gpSMCurrentMerc, TRUE, TRUE ); // Give him the panel! gubSelectSMPanelToMerc = sID; if ( !gfInItemPickupMenu ) { //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { LocateSoldier( sID, DONTSETLOCATOR ); // refresh background for player slots (in case item values change due to Flo's discount) gubSkiDirtyLevel = SKI_DIRTY_LEVEL2; } else LocateSoldier( sID, SETLOCATOR ); } //if the user is in the shop keeper interface and is in the item desc if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { if ( InItemDescriptionBox( ) ) { DeleteItemDescriptionBox( ); } } } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnOptionsCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); SetOptionsPreviousScreen(guiCurrentScreen); LeaveTacticalScreen( OPTIONS_SCREEN ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnSMDoneCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); gfBeginEndTurn = TRUE; } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnMapScreenCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); // Enter mapscreen... //gfEnteringMapScreen = TRUE; GoToMapScreenFromTactical(); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } /* uiTempVObject[0] = LoadButtonImage( "Interface\\InventoryButtons.sti", -1, 7, -1, -1, -1 ); uiTempVObject[1] = UseLoadedButtonImage( uiTempVObject[0], -1, 17, -1, -1, -1 ); uiTempVObject[2] = UseLoadedButtonImage( uiTempVObject[0], -1, 26, -1, -1, -1 ); iButtonID = QuickCreateButton( uiTempVObject[0], 0, 0, BUTTON_NO_TOGGLE, MSYS_PRIORITY_HIGH, MSYS_NO_CALLBACK, CycleCallback ); void CycleCallback( GUI_BUTTON *btn, INT32 reason ) { static INT32 buttonValue = 0; if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { buttonValue += buttonValue < 2 ? 1 : -2; btn->ImageNum = uiTempVObject[ buttonValue ]; btn->uiFlags |= BUTTON_DIRTY; } } */ void BtnBurstModeCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { ChangeWeaponMode( gpSMCurrentMerc ); // btn->ImageNum = iBurstButtonImages[ gpSMCurrentMerc->bWeaponMode ]; // btn->uiFlags |= BUTTON_DIRTY; } } void BtnLookCallback(GUI_BUTTON *btn,INT32 reason) { if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); ToggleLookCursorMode( NULL ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnPositionShowCallback(GUI_BUTTON *btn,INT32 reason) { } BOOLEAN InitializeTEAMPanelCoords( ) { TM_FACE_WIDTH = 48; TM_FACE_HEIGHT = 43; TM_APPANEL_HEIGHT = 56; TM_APPANEL_WIDTH = 16; TM_ENDTURN_X = xResOffset + (xResSize - 131); TM_ROSTERMODE_X = xResOffset + (xResSize - 131); TM_DISK_X = xResOffset + (xResSize - 131); // CHRISL: New definitions for the team panel clock and location coordinates INTERFACE_CLOCK_TM_X = xResOffset + (xResSize - 86 ); INTERFACE_CLOCK_TM_Y = ( 96 + INTERFACE_START_Y ); LOCATION_NAME_TM_X = xResOffset + (xResSize - 92 ); LOCATION_NAME_TM_Y = ( 65 + INTERFACE_START_Y ); TM_ENDTURN_Y = ( 9 + INTERFACE_START_Y ); TM_ROSTERMODE_Y = ( 45 + INTERFACE_START_Y ); TM_DISK_Y = ( 81 + INTERFACE_START_Y ); TM_NAME_WIDTH = 60; TM_NAME_HEIGHT = 9; TM_LIFEBAR_WIDTH = 3; TM_LIFEBAR_HEIGHT = 42; TM_FACEHIGHTL_WIDTH = 84; TM_FACEHIGHTL_HEIGHT = 114; TM_AP_HEIGHT = 10; TM_AP_WIDTH = 15; TM_INV_WIDTH = 58; TM_INV_HEIGHT = 23; TM_INV_HAND1STARTX = ( 8 + INTERFACE_START_X ); TM_INV_HAND1STARTY = ( 67 + INTERFACE_START_Y ); TM_INV_HAND2STARTX = ( 8 + INTERFACE_START_X ); TM_INV_HAND2STARTY = ( 93 + INTERFACE_START_Y ); TM_INV_HAND_SEP = 83; TM_INV_HAND_SEPY = 24; TM_BARS_REGION_HEIGHT = 47; TM_BARS_REGION_WIDTH = 26; INDICATOR_BOX_WIDTH = 12; INDICATOR_BOX_HEIGHT = 10; for (int idx = 0; idx < TeamInterfaceMax/2; idx+=1) { const int evenIdx = idx * 2; Assert(evenIdx < TeamInterfaceMax); const int oddIdx = idx*2+1; Assert(oddIdx < TeamInterfaceMax); sTEAMAPPanelXY[evenIdx] = ( 69+idx*83 + INTERFACE_START_X ); sTEAMAPPanelXY[oddIdx] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[evenIdx] = ( 13+idx*83+(idx>0) + INTERFACE_START_X ); sTEAMFacesXY[oddIdx] = ( 6 + INTERFACE_START_Y ); sTEAMNamesXY[evenIdx] = ( 7+idx*83 + INTERFACE_START_X ); sTEAMNamesXY[oddIdx] = ( 55 + INTERFACE_START_Y ); sTEAMFaceHighlXY[evenIdx] = ( 4+idx*83 + INTERFACE_START_X ); sTEAMFaceHighlXY[oddIdx] = ( 2 + INTERFACE_START_Y ); sTEAMLifeXY[evenIdx] = ( 69+idx*83 + INTERFACE_START_X ); sTEAMLifeXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[evenIdx] = ( 75+idx*83 + INTERFACE_START_X ); sTEAMBreathXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[evenIdx] = ( 81+idx*83 + INTERFACE_START_X ); sTEAMMoraleXY[oddIdx] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMApXY[evenIdx] = ( 68+idx*83 + INTERFACE_START_X ); sTEAMApXY[oddIdx] = ( 52 + INTERFACE_START_Y ); sTEAMBarsXY[evenIdx] = ( 61+idx*83+(idx>0) + INTERFACE_START_X ); sTEAMBarsXY[oddIdx] = ( 3 + INTERFACE_START_Y ); sTEAMHandInvXY[evenIdx] = ( TM_INV_HAND1STARTX + ( idx * TM_INV_HAND_SEP )); sTEAMHandInvXY[oddIdx] = TM_INV_HAND1STARTY; } /* sTEAMAPPanelXY[0] = ( 69 + INTERFACE_START_X ); sTEAMAPPanelXY[1] = ( 6 + INTERFACE_START_Y ); sTEAMAPPanelXY[2] = ( 151 + INTERFACE_START_X ); sTEAMAPPanelXY[3] = ( 6 + INTERFACE_START_Y ); sTEAMAPPanelXY[4] = ( 234 + INTERFACE_START_X ); sTEAMAPPanelXY[5] = ( 6 + INTERFACE_START_Y ); sTEAMAPPanelXY[6] = ( 317 + INTERFACE_START_X ); sTEAMAPPanelXY[7] = ( 6 + INTERFACE_START_Y ); sTEAMAPPanelXY[8] = ( 401 + INTERFACE_START_X ); sTEAMAPPanelXY[9] = ( 6 + INTERFACE_START_Y ); sTEAMAPPanelXY[10] = ( 484 + INTERFACE_START_X ); sTEAMAPPanelXY[11] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[0] = ( 13 + INTERFACE_START_X ); sTEAMFacesXY[1] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[2] = ( 97 + INTERFACE_START_X ); sTEAMFacesXY[3] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[4] = ( 180 + INTERFACE_START_X ); sTEAMFacesXY[5] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[6] = ( 263 + INTERFACE_START_X ); sTEAMFacesXY[7] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[8] = ( 346 + INTERFACE_START_X ); sTEAMFacesXY[9] = ( 6 + INTERFACE_START_Y ); sTEAMFacesXY[10] = ( 429 + INTERFACE_START_X ); sTEAMFacesXY[11] = ( 6 + INTERFACE_START_Y ); sTEAMNamesXY[0] = ( 7 + INTERFACE_START_X ); sTEAMNamesXY[1] = ( 55 + INTERFACE_START_Y ); sTEAMNamesXY[2] = ( 90 + INTERFACE_START_X ); sTEAMNamesXY[3] = ( 55 + INTERFACE_START_Y ); sTEAMNamesXY[4] = ( 173 + INTERFACE_START_X ); sTEAMNamesXY[5] = ( 55 + INTERFACE_START_Y ); sTEAMNamesXY[6] = ( 256 + INTERFACE_START_X ); sTEAMNamesXY[7] = ( 55 + INTERFACE_START_Y ); sTEAMNamesXY[8] = ( 339 + INTERFACE_START_X ); sTEAMNamesXY[9] = ( 55 + INTERFACE_START_Y ); sTEAMNamesXY[10] = ( 422 + INTERFACE_START_X ); sTEAMNamesXY[11] = ( 55 + INTERFACE_START_Y ); sTEAMFaceHighlXY[0] = ( 4 + INTERFACE_START_X ); sTEAMFaceHighlXY[1] = ( 2 + INTERFACE_START_Y ); sTEAMFaceHighlXY[2] = ( 87 + INTERFACE_START_X ); sTEAMFaceHighlXY[3] = ( 2 + INTERFACE_START_Y ); sTEAMFaceHighlXY[4] = ( 170 + INTERFACE_START_X ); sTEAMFaceHighlXY[5] = ( 2 + INTERFACE_START_Y ); sTEAMFaceHighlXY[6] = ( 253 + INTERFACE_START_X ); sTEAMFaceHighlXY[7] = ( 2 + INTERFACE_START_Y ); sTEAMFaceHighlXY[8] = ( 336 + INTERFACE_START_X ); sTEAMFaceHighlXY[9] = ( 2 + INTERFACE_START_Y ); sTEAMFaceHighlXY[10] = ( 419 + INTERFACE_START_X ); sTEAMFaceHighlXY[11] = ( 2 + INTERFACE_START_Y ); sTEAMLifeXY[0] = ( 69 + INTERFACE_START_X ); sTEAMLifeXY[1] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMLifeXY[2] = ( 152 + INTERFACE_START_X ); sTEAMLifeXY[3] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMLifeXY[4] = ( 235 + INTERFACE_START_X ); sTEAMLifeXY[5] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMLifeXY[6] = ( 318 + INTERFACE_START_X ); sTEAMLifeXY[7] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMLifeXY[8] = ( 401 + INTERFACE_START_X ); sTEAMLifeXY[9] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMLifeXY[10] = ( 484 + INTERFACE_START_X ); sTEAMLifeXY[11] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[0] = ( 75 + INTERFACE_START_X ); sTEAMBreathXY[1] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[2] = ( 158 + INTERFACE_START_X ); sTEAMBreathXY[3] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[4] = ( 241 + INTERFACE_START_X ); sTEAMBreathXY[5] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[6] = ( 324 + INTERFACE_START_X ); sTEAMBreathXY[7] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[8] = ( 407 + INTERFACE_START_X ); sTEAMBreathXY[9] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMBreathXY[10] = ( 490 + INTERFACE_START_X );sTEAMBreathXY[11] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[0] = ( 81 + INTERFACE_START_X ); sTEAMMoraleXY[1] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[2] = ( 164 + INTERFACE_START_X ); sTEAMMoraleXY[3] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[4] = ( 247 + INTERFACE_START_X ); sTEAMMoraleXY[5] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[6] = ( 330 + INTERFACE_START_X ); sTEAMMoraleXY[7] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[8] = ( 413 + INTERFACE_START_X ); sTEAMMoraleXY[9] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMMoraleXY[10] = ( 496 + INTERFACE_START_X );sTEAMMoraleXY[11] = ( ( 5 + INTERFACE_START_Y ) + TM_LIFEBAR_HEIGHT ); sTEAMApXY[0] = ( 68 + INTERFACE_START_X ); sTEAMApXY[1] = ( 52 + INTERFACE_START_Y ); sTEAMApXY[2] = ( 152 + INTERFACE_START_X ); sTEAMApXY[3] = ( 52 + INTERFACE_START_Y ); sTEAMApXY[4] = ( 233 + INTERFACE_START_X ); sTEAMApXY[5] = ( 52 + INTERFACE_START_Y ); sTEAMApXY[6] = ( 317 + INTERFACE_START_X ); sTEAMApXY[7] = ( 52 + INTERFACE_START_Y ); sTEAMApXY[8] = ( 400 + INTERFACE_START_X ); sTEAMApXY[9] = ( 52 + INTERFACE_START_Y ); sTEAMApXY[10] = ( 483 + INTERFACE_START_X );sTEAMApXY[11] = ( 52 + INTERFACE_START_Y ); sTEAMBarsXY[0] = ( 61 + INTERFACE_START_X ); sTEAMBarsXY[1] = ( 3 + INTERFACE_START_Y ); sTEAMBarsXY[2] = ( 145 + INTERFACE_START_X ); sTEAMBarsXY[3] = ( 3 + INTERFACE_START_Y ); sTEAMBarsXY[4] = ( 228 + INTERFACE_START_X ); sTEAMBarsXY[5] = ( 3 + INTERFACE_START_Y ); sTEAMBarsXY[6] = ( 311 + INTERFACE_START_X ); sTEAMBarsXY[7] = ( 3 + INTERFACE_START_Y ); sTEAMBarsXY[8] = ( 394 + INTERFACE_START_X ); sTEAMBarsXY[9] = ( 3 + INTERFACE_START_Y ); sTEAMBarsXY[10] = ( 477 + INTERFACE_START_X ); sTEAMBarsXY[11] = ( 3 + INTERFACE_START_Y ); sTEAMHandInvXY[0] = ( TM_INV_HAND1STARTX + ( 0 * TM_INV_HAND_SEP )); sTEAMHandInvXY[1] = TM_INV_HAND1STARTY; sTEAMHandInvXY[2] = ( TM_INV_HAND1STARTX + ( 1 * TM_INV_HAND_SEP )); sTEAMHandInvXY[3] = TM_INV_HAND1STARTY; sTEAMHandInvXY[4] = ( TM_INV_HAND1STARTX + ( 2 * TM_INV_HAND_SEP )); sTEAMHandInvXY[5] = TM_INV_HAND1STARTY; sTEAMHandInvXY[6] = ( TM_INV_HAND1STARTX + ( 3 * TM_INV_HAND_SEP )); sTEAMHandInvXY[7] = TM_INV_HAND1STARTY; sTEAMHandInvXY[8] = ( TM_INV_HAND1STARTX + ( 4 * TM_INV_HAND_SEP )); sTEAMHandInvXY[9] = TM_INV_HAND1STARTY; sTEAMHandInvXY[10] = ( TM_INV_HAND1STARTX + ( 5 * TM_INV_HAND_SEP )); sTEAMHandInvXY[11] = TM_INV_HAND1STARTY; // ufff to much copy&paste :D */ return ( TRUE ); } // TEAM PANEL!!!!!!!!!!!!!! BOOLEAN InitializeTEAMPanel( ) { VSURFACE_DESC vs_desc; VOBJECT_DESC VObjectDesc; UINT32 cnt, posIndex; static BOOLEAN fFirstTime = TRUE; /* CHRISL: Add something here to reset the cursor to a pointer so we don't inadvertantly activate context sensitive cursor when closing the inventory panel*/ fDisplayOverheadMap = TRUE; // WANNE: Make a black background color for the whole screen ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) ); /* OK i need to initialize coords here * Isnt it cool * any questions? joker * i moved itrk */ // InitializeTEAMPanelCoords( ); // INit viewport region // Set global mouse regions // Define region for viewport MSYS_DefineRegion( &gViewportRegion, 0, 0 ,gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y, MSYS_PRIORITY_NORMAL, VIDEO_NO_CURSOR, MSYS_NO_CALLBACK, MSYS_NO_CALLBACK ); MSYS_AddRegion( &gViewportRegion ); // Load interface panels vs_desc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE; VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; //SQUAD10 FIX: Use panels with more slots if SquadSize at current resolution is > 6 if (iResolution >= _640x480 && iResolution < _800x600) FilenameForBPP("INTERFACE\\bottom_bar.sti", VObjectDesc.ImageFile); else if (iResolution < _1280x720) { if (gGameOptions.ubSquadSize > 6) { FilenameForBPP("INTERFACE\\bottom_bar_8_800x600.sti", VObjectDesc.ImageFile); } else { FilenameForBPP("INTERFACE\\bottom_bar_800x600.sti", VObjectDesc.ImageFile); } } else { if (gGameOptions.ubSquadSize > 8) { FilenameForBPP("INTERFACE\\bottom_bar_10_1024x768.sti", VObjectDesc.ImageFile); } else if (gGameOptions.ubSquadSize > 6) { FilenameForBPP("INTERFACE\\bottom_bar_8_1024x768.sti", VObjectDesc.ImageFile); } else { FilenameForBPP("INTERFACE\\bottom_bar_1024x768.sti", VObjectDesc.ImageFile); } } CHECKF( AddVideoObject( &VObjectDesc, &guiTEAMPanel ) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\gold_front.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiTEAMObjects ) ); VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; FilenameForBPP("INTERFACE\\Bars.sti", VObjectDesc.ImageFile); CHECKF( AddVideoObject( &VObjectDesc, &guiBrownBackgroundForTeamPanel ) ); // Clear inv display stuff memset( gfTEAM_HandInvDispText, 0, sizeof( gfTEAM_HandInvDispText ) ); // Offset button coordinates to correct positions if squadsize is 10 if (iResolution == _1280x720) { UINT16 offset = 223; TM_ENDTURN_X = xResOffset + (xResSize - 131) + offset; TM_ROSTERMODE_X = xResOffset + (xResSize - 131) + offset; TM_DISK_X = xResOffset + (xResSize - 131) + offset; INTERFACE_CLOCK_TM_X = xResOffset + (xResSize - 86) + offset; LOCATION_NAME_TM_X = xResOffset + (xResSize - 92) + offset; } // Create buttons CHECKF( CreateTEAMPanelButtons( ) ); // Set viewports // Define region for panel MSYS_DefineRegion( &gTEAM_PanelRegion, 0, gsVIEWPORT_END_Y ,SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_NORMAL, CURSOR_NORMAL, MSYS_NO_CALLBACK, MSYS_NO_CALLBACK ); // Add region MSYS_AddRegion( &gTEAM_PanelRegion); for ( posIndex = 0, cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++, posIndex +=2 ) { MSYS_DefineRegion( &gTEAM_FaceRegions[ cnt ], sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ] ,(INT16)(sTEAMFacesXY[ posIndex ] + TM_FACE_WIDTH ), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + TM_FACE_HEIGHT), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MercFacePanelMoveCallback, MercFacePanelCallback ); // Add region MSYS_AddRegion( &gTEAM_FaceRegions[ cnt ] ); MSYS_SetRegionUserData( &gTEAM_FaceRegions[ cnt ], 0, cnt ); MSYS_DefineRegion( &gTEAM_EnemyIndicator[ cnt ], (INT16)(sTEAMFacesXY[ posIndex ] + 1), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + 1 ) ,(INT16)(sTEAMFacesXY[ posIndex ] + INDICATOR_BOX_WIDTH ), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + INDICATOR_BOX_HEIGHT), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, EnemyIndicatorClickCallback ); // Add region MSYS_AddRegion( &gTEAM_EnemyIndicator[ cnt ] ); MSYS_SetRegionUserData( &gTEAM_EnemyIndicator[ cnt ], 0, cnt ); if ( IsMouseInRegion( &gTEAM_FaceRegions[ cnt ] ) ) { if ( gTeamPanel[ cnt ].ubID != NOBODY ) { HandleMouseOverSoldierFaceForContMove( gTeamPanel[ cnt ].ubID, TRUE ); } } MSYS_DefineRegion( &gTEAM_BarsRegions[ cnt ], sTEAMBarsXY[ posIndex ], sTEAMBarsXY[ posIndex + 1 ] ,(INT16)(sTEAMBarsXY[ posIndex ] + TM_BARS_REGION_WIDTH ), (INT16)(sTEAMBarsXY[ posIndex + 1 ] + TM_BARS_REGION_HEIGHT ), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, MercFacePanelCallback ); // Add region MSYS_AddRegion( &gTEAM_BarsRegions[ cnt ] ); MSYS_SetRegionUserData( &gTEAM_BarsRegions[ cnt ], 0, cnt ); MSYS_DefineRegion( &gTEAM_LeftBarsRegions[ cnt ], (INT16)(sTEAMFacesXY[ posIndex ] - 8 ), sTEAMFacesXY[ posIndex + 1 ] ,(INT16)(sTEAMFacesXY[ posIndex ] ), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + TM_BARS_REGION_HEIGHT ), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, MercFacePanelCallback ); // Add region MSYS_AddRegion( &gTEAM_LeftBarsRegions[ cnt ] ); MSYS_SetRegionUserData( &gTEAM_LeftBarsRegions[ cnt ], 0, cnt ); MSYS_DefineRegion( &gTEAM_FirstHandInv[ cnt ], sTEAMHandInvXY[ posIndex ], sTEAMHandInvXY[ posIndex + 1 ], (INT16)(sTEAMHandInvXY[ posIndex ] + TM_INV_WIDTH ) ,(INT16)(sTEAMHandInvXY[ posIndex + 1 ] + TM_INV_HEIGHT ), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, TMClickFirstHandInvCallback ); // Add region MSYS_AddRegion( &gTEAM_FirstHandInv[ cnt ] ); // Add user data MSYS_SetRegionUserData( &gTEAM_FirstHandInv[ cnt ], 0, cnt ); MSYS_DefineRegion( &gTEAM_SecondHandInv[ cnt ], sTEAMHandInvXY[ posIndex ], (INT16)( sTEAMHandInvXY[ posIndex + 1 ] + 24 ), (INT16)(sTEAMHandInvXY[ posIndex ] + TM_INV_WIDTH) ,(INT16)(sTEAMHandInvXY[ posIndex + 1 ] + TM_INV_HEIGHT + 24 ), MSYS_PRIORITY_NORMAL, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, TMClickSecondHandInvCallback ); // Add region MSYS_AddRegion( &gTEAM_SecondHandInv[ cnt ] ); // Add user data MSYS_SetRegionUserData( &gTEAM_SecondHandInv[ cnt ], 0, cnt ); } // sevenfm: clear panel area if (INTERFACE_START_X > 0) { ColorFillVideoSurfaceArea(guiSAVEBUFFER, 0, INV_INTERFACE_START_Y, SCREEN_WIDTH, SCREEN_HEIGHT, 0); } return( TRUE ); } BOOLEAN ShutdownTEAMPanel( ) { UINT32 cnt; // All buttons and regions and video objects and video surfaces will be deleted at shutddown of SGM // We may want to delete them at the interm as well, to free up room for other panels // Delete video objects! DeleteVideoObjectFromIndex( guiTEAMPanel ); DeleteVideoObjectFromIndex( guiTEAMObjects ); DeleteVideoObjectFromIndex( guiBrownBackgroundForTeamPanel ); MSYS_RemoveRegion( &gTEAM_PanelRegion); // Remove viewport MSYS_RemoveRegion( &gViewportRegion ); for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ ) { MSYS_RemoveRegion( &gTEAM_EnemyIndicator[ cnt ] ); MSYS_RemoveRegion( &gTEAM_FaceRegions[ cnt ] ); MSYS_RemoveRegion( &gTEAM_BarsRegions[ cnt ] ); MSYS_RemoveRegion( &gTEAM_LeftBarsRegions[ cnt ] ); MSYS_RemoveRegion( &gTEAM_FirstHandInv[ cnt ] ); MSYS_RemoveRegion( &gTEAM_SecondHandInv[ cnt ] ); if ( gTeamPanel[ cnt ].ubID != NOBODY ) { HandleMouseOverSoldierFaceForContMove( gTeamPanel[ cnt ].ubID, FALSE ); } } // Remove buttons RemoveTEAMPanelButtons( ); // turn off the display of the squad list if( fRenderRadarScreen == FALSE ) { // start rendering radar region again, fRenderRadarScreen = TRUE; // remove squad panel CreateDestroyMouseRegionsForSquadList( ); } return( TRUE ); } void RenderTEAMPanel( BOOLEAN fDirty ) { INT16 sFontX, sFontY; UINT32 cnt, posIndex; SOLDIERTYPE *pSoldier; static CHAR16 pStr[ 512 ], pMoraleStr[ 20 ], sTemp[ 20 ]; if ( fDirty == DIRTYLEVEL2 ) { MarkAButtonDirty( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); MarkAButtonDirty( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); MarkAButtonDirty( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ); // Blit video surface BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMPanel, 0, INTERFACE_START_X, INTERFACE_START_Y, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( INTERFACE_START_X, INTERFACE_START_Y, SCREEN_WIDTH - INTERFACE_START_X , INTERFACE_HEIGHT ); // LOOP THROUGH ALL MERCS ON TEAM PANEL for ( cnt = 0, posIndex = 0; cnt < gGameOptions.ubSquadSize; cnt++, posIndex+= 2 ) { // GET SOLDIER if ( !gTeamPanel[ cnt ].fOccupied ) { //BLIT CLOSE PANEL BltVideoObjectFromIndex( guiSAVEBUFFER, guiCLOSE, 5, sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ], TM_FACE_WIDTH, TM_FACE_HEIGHT ); // BLIT AP CLOSE PANEL //BltVideoObjectFromIndex( FRAME_BUFFER, guiTEAMObjects, 3, sTEAMAPPanelXY[ posIndex ], sTEAMAPPanelXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); //RestoreExternBackgroundRect( (INT16)(sTEAMAPPanelXY[ posIndex ]), (INT16)(sTEAMAPPanelXY[ posIndex + 1 ]), TM_APPANEL_WIDTH, TM_APPANEL_HEIGHT ); //InvalidateRegion( (INT16)(sTEAMAPPanelXY[ posIndex ]), (INT16)(sTEAMAPPanelXY[ posIndex + 1 ]), (INT16)(sTEAMAPPanelXY[ posIndex ] + TM_APPANEL_WIDTH), (INT16)(sTEAMAPPanelXY[ posIndex + 1 ] + TM_APPANEL_HEIGHT ) ); if ( gTacticalStatus.ubCurrentTeam != OUR_TEAM || INTERRUPT_QUEUED ) { // Hatch out... BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 1, sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], TM_FACEHIGHTL_WIDTH, TM_FACEHIGHTL_HEIGHT ); } } else { pSoldier = gTeamPanel[ cnt ].ubID; if ( pSoldier->flags.uiStatusFlags & ( SOLDIER_DRIVER ) ) { // Get soldier pointer for vehicle..... SOLDIERTYPE *pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId ); // WDS 07/02/3008 - Fix bug of getting into vehicle you don't control Assert (pVehicle != 0); //OK, for each item, set dirty text if applicable! swprintf( pStr, TacticalStr[ DRIVER_POPUPTEXT ], pVehicle->stats.bLife, pVehicle->stats.bLifeMax, pVehicle->bBreath, pVehicle->bBreathMax ); SetRegionFastHelpText( &(gTEAM_FirstHandInv[ cnt ]), pStr ); } // Add text for first hand popup else { GetHelpTextForItem( pStr, &( pSoldier->inv[ HANDPOS ] ), pSoldier ); //OK, for each item, set dirty text if applicable! SetRegionFastHelpText( &(gTEAM_FirstHandInv[ cnt ]), pStr ); } // Add text for seonc hand popup if ( pSoldier->flags.uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { //OK, for each item, set dirty text if applicable! SetRegionFastHelpText( &(gTEAM_SecondHandInv[ cnt ]), TacticalStr[ EXIT_VEHICLE_POPUPTEXT ] ); } else { GetHelpTextForItem( pStr, &( pSoldier->inv[ SECONDHANDPOS ] ), pSoldier ); //OK, for each item, set dirty text if applicable! SetRegionFastHelpText( &(gTEAM_SecondHandInv[ cnt ]), pStr ); } // Render Selected guy if selected if ( gusSelectedSoldier == pSoldier->ubID && gTacticalStatus.ubCurrentTeam == OUR_TEAM && OK_INTERRUPT_MERC( pSoldier ) ) { //if(gbPixelDepth==16) //{ BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 0, sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], TM_FACEHIGHTL_WIDTH, TM_FACEHIGHTL_HEIGHT ); // Render faceplate //BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 1, sTEAMFacesXY[ posIndex ] + TM_FACEPLATE_OFFSET_X, sTEAMFacesXY[ posIndex + 1 ] + TM_FACEPLATE_OFFSET_Y, VO_BLT_SRCTRANSPARENCY, NULL ); //RestoreExternBackgroundRect( (INT16)(sTEAMFacesXY[ posIndex ] + TM_FACEPLATE_OFFSET_X), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + TM_FACEPLATE_OFFSET_Y ), TM_FACEPLATE_WIDTH, TM_FACEPLATE_HEIGHT ); //} } else if ( gTacticalStatus.ubCurrentTeam != OUR_TEAM || !OK_INTERRUPT_MERC( pSoldier ) ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 1, sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], TM_FACEHIGHTL_WIDTH, TM_FACEHIGHTL_HEIGHT ); // Render non-selection //BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 4, sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], VO_BLT_SRCTRANSPARENCY, NULL ); //RestoreExternBackgroundRect( sTEAMFaceHighlXY[ posIndex ], sTEAMFaceHighlXY[ posIndex + 1 ], TM_FACEHIGHTL_WIDTH, TM_FACEHIGHTL_HEIGHT ); // Render faceplate //BltVideoObjectFromIndex( guiSAVEBUFFER, guiTEAMObjects, 1, sTEAMFacesXY[ posIndex ] + TM_FACEPLATE_OFFSET_X, sTEAMFacesXY[ posIndex + 1 ] + TM_FACEPLATE_OFFSET_Y, VO_BLT_SRCTRANSPARENCY, NULL ); //RestoreExternBackgroundRect( (INT16)(sTEAMFacesXY[ posIndex ] + TM_FACEPLATE_OFFSET_X), (INT16)(sTEAMFacesXY[ posIndex + 1 ] + TM_FACEPLATE_OFFSET_Y ), TM_FACEPLATE_WIDTH, TM_FACEPLATE_HEIGHT ); } CheckForFacePanelStartAnims( pSoldier, sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ] ); RenderSoldierFace( pSoldier, sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ], TRUE ); // Restore AP/LIFE POSIITONS // Render name! SetFont( BLOCKFONT2 ); if ( pSoldier->bStealthMode ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTYELLOW ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTGRAY ); } // RENDER ON SAVE BUFFER! SetFontDestBuffer( guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); VarFindFontCenterCoordinates( (INT16)(sTEAMNamesXY[ posIndex ] + 2 ), (INT16)(sTEAMNamesXY[ posIndex + 1 ] ), TM_NAME_WIDTH, TM_NAME_HEIGHT, BLOCKFONT2, &sFontX, &sFontY, L"%s", pSoldier->name ); mprintf( sFontX, sFontY, L"%s", pSoldier->name ); gprintfRestore( sFontX, sFontY, L"%s", pSoldier->name ); // reset to frame buffer! SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); } } } // Loop through all mercs and make go for ( cnt = 0, posIndex = 0; cnt < gGameOptions.ubSquadSize; cnt++, posIndex+= 2 ) { // GET SOLDIER if ( gTeamPanel[ cnt ].fOccupied ) { pSoldier = gTeamPanel[ cnt ].ubID; // Update animations.... if ( pSoldier->flags.fClosePanel || pSoldier->flags.fClosePanelToDie ) { pSoldier->sPanelFaceX = gFacesData[ pSoldier->iFaceIndex ].usFaceX; pSoldier->sPanelFaceY = gFacesData[ pSoldier->iFaceIndex ].usFaceY; } if ( fDirty != DIRTYLEVEL0 ) { // UPdate stats! if ( fDirty == DIRTYLEVEL2 ) { if ( pSoldier->stats.bLife != 0 ) { if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { swprintf( pStr, TacticalStr[ VEHICLE_VITAL_STATS_POPUPTEXT ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, pSoldier->bBreath, pSoldier->bBreathMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else if ( pSoldier->flags.uiStatusFlags & SOLDIER_ROBOT ) { swprintf( pStr, gzLateLocalizedString[ 16 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else { GetMoraleString( pSoldier, pMoraleStr ); if ( UsingFoodSystem() && pSoldier->ubProfile != ROBOT && !IsVehicle(pSoldier) ) { swprintf( pStr, TacticalStr[ MERC_VITAL_STATS_WITH_FOOD_POPUPTEXT ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, pSoldier->bBreath, pSoldier->bBreathMax, pMoraleStr, (INT32)(100*(pSoldier->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), L"%", (INT32)(100*(pSoldier->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), L"%" ); } else { swprintf( pStr, TacticalStr[ MERC_VITAL_STATS_POPUPTEXT ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, pSoldier->bBreath, pSoldier->bBreathMax, pMoraleStr ); } { CHAR16 atStr[500]; swprintf( atStr, L"" ); pSoldier->PrintDiseaseDesc( atStr ); wcscat( pStr, atStr ); } SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); // Buggler: skills/traits tooltip on merc portrait // clear pStr value swprintf( pStr, L""); INT8 bSeatIndex = GetSeatIndexFromSoldier( pSoldier ); if( bSeatIndex != (-1) ) { swprintf( sTemp, L"%s\n", gNewVehicle[ pVehicleList[ pSoldier->iVehicleId ].ubVehicleType ].VehicleSeats[ bSeatIndex ].zSeatName ); wcscat( pStr, sTemp ); } if (gGameOptions.fNewTraitSystem) // SANDRO - old/new traits check { UINT8 ubTempSkillArray[30]; int bNumSkillTraits = 0; // lets rearrange our skills to a temp array // we also get the number of lines (skills) to be displayed for ( UINT8 ubCnt = 1; ubCnt < NUM_SKILLTRAITS_NT; ++ubCnt ) { if ( ProfileHasSkillTrait( pSoldier->ubProfile, ubCnt ) == 2 ) { ubTempSkillArray[bNumSkillTraits] = (ubCnt + NEWTRAIT_MERCSKILL_EXPERTOFFSET); ++bNumSkillTraits; } else if ( ProfileHasSkillTrait( pSoldier->ubProfile, ubCnt ) == 1 ) { ubTempSkillArray[bNumSkillTraits] = ubCnt; ++bNumSkillTraits; } } if ( bNumSkillTraits == 0 ) { swprintf( sTemp, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] ); wcscat( pStr, sTemp ); } else { for ( int ubCnt = 0; ubCnt < bNumSkillTraits; ++ubCnt ) { swprintf( sTemp, L"%s\n", gzMercSkillTextNew[ ubTempSkillArray[ubCnt] ] ); wcscat( pStr, sTemp ); } } } else { INT8 bSkill1 = 0, bSkill2 = 0; bSkill1 = gMercProfiles[ pSoldier->ubProfile ].bSkillTraits[0]; bSkill2 = gMercProfiles[ pSoldier->ubProfile ].bSkillTraits[1]; if ( bSkill1 == 0 && bSkill2 == 0 ) { swprintf( pStr, L"%s", pPersonnelScreenStrings[ PRSNL_TXT_NOSKILLS ] ); } else { //if the 2 skills are the same, add the '(expert)' at the end if( bSkill1 == bSkill2 ) { swprintf( pStr, L"%s %s", gzMercSkillText[bSkill1], gzMercSkillText[EXPERT] ); } else { //Display the first skill if( bSkill1 != 0 ) { swprintf( pStr, L"%s\n", gzMercSkillText[bSkill1] ); } if( bSkill2 != 0 ) { swprintf( sTemp, L"%s", gzMercSkillText[bSkill2] ); wcscat( pStr, sTemp ); } } } } SetRegionFastHelpText( &(gTEAM_FaceRegions[ cnt ]), pStr ); } } else { SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), L"" ); SetRegionFastHelpText( &(gTEAM_FaceRegions[ cnt ]), L"" ); } } if ( !( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) { DrawLifeUIBarEx( pSoldier, sTEAMLifeXY[ posIndex ], sTEAMLifeXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, TRUE, FRAME_BUFFER ); if ( !( pSoldier->flags.uiStatusFlags & SOLDIER_ROBOT ) ) { DrawBreathUIBarEx( pSoldier, sTEAMBreathXY[ posIndex ], sTEAMBreathXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, TRUE, FRAME_BUFFER ); DrawMoraleUIBarEx( pSoldier, sTEAMMoraleXY[ posIndex ], sTEAMMoraleXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, TRUE, FRAME_BUFFER ); } if ( gTacticalStatus.uiFlags & TURNBASED && pSoldier->stats.bLife >= OKLIFE ) { // Render APs SetFont( TINYFONT1 ); //if ( pSoldier->sLastTarget != NOWHERE && !EnoughPoints( pSoldier, MinAPsToAttack( pSoldier, pSoldier->sLastTarget, TRUE ), 0, FALSE ) || GetUIApsToDisplay( pSoldier ) < 0 ) if ( !EnoughPoints( pSoldier, MinAPsToAttack( pSoldier, pSoldier->sLastTarget, TRUE, 0 ), 0, FALSE ) || GetUIApsToDisplay( pSoldier ) < 0 ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKRED ); } else { if ( MercDruggedOrDrunk( pSoldier ) ) { SetFontBackground( FONT_MCOLOR_BLACK ); //SetFontForeground( FONT_MCOLOR_LTBLUE ); // Flugente: new colour for being drugged, as blue on black was hard to see SetRGBFontForeground( 250, 5, 250 ); } else if ( pSoldier->bStealthMode ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTYELLOW ); } else { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTGRAY ); } } RestoreExternBackgroundRect( sTEAMApXY[ posIndex ], sTEAMApXY[ posIndex + 1 ], TM_AP_WIDTH+1, TM_AP_HEIGHT ); if (gTacticalStatus.uiFlags & INCOMBAT ) { VarFindFontCenterCoordinates( sTEAMApXY[ posIndex ], sTEAMApXY[ posIndex + 1], TM_AP_WIDTH, TM_AP_HEIGHT, TINYFONT1, &sFontX, &sFontY, L"%d", GetUIApsToDisplay( pSoldier ) ); mprintf( sFontX, sTEAMApXY[ posIndex + 1], L"%d", GetUIApsToDisplay( pSoldier ) ); } } } else { //Erase! //DrawUIBar( pSoldier->bBreath, sTEAMBreathXY[ posIndex ], sTEAMBreathXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, DRAW_ERASE_BAR ); //DrawUIBar( pSoldier->stats.bLife, sTEAMLifeXY[ posIndex ], sTEAMLifeXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, DRAW_ERASE_BAR ); // Erase APs RestoreExternBackgroundRect( sTEAMApXY[ posIndex ], sTEAMApXY[ posIndex + 1 ], TM_AP_WIDTH+1, TM_AP_HEIGHT ); } } RenderSoldierTeamInv( pSoldier, sTEAMHandInvXY[ posIndex ], sTEAMHandInvXY[ posIndex + 1 ], (UINT8)cnt, fDirty ); HandleSoldierFaceFlash( pSoldier, sTEAMFacesXY[ posIndex ], sTEAMFacesXY[ posIndex + 1 ] ); if ( !(guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { //HandlePanelFaceAnimations( pSoldier ); } } else { // anv: for unoccupied slots clear tooltips SetRegionFastHelpText( &(gTEAM_FaceRegions[ cnt ]), L"" ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), L"" ); } } UpdateTEAMPanel( ); if( fRenderRadarScreen == TRUE ) { // Render clock // CHRISL: Change coords to base off of right side of screen and use new paramters in RenderTownIDString RenderClock( INTERFACE_CLOCK_TM_X, INTERFACE_CLOCK_TM_Y ); CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_TM_X, INTERFACE_CLOCK_TM_Y ); RenderTownIDString( LOCATION_NAME_TM_X, LOCATION_NAME_TM_Y); } else { RemoveMouseRegionForPauseOfClock( ); } } BOOLEAN CreateTEAMPanelButtons( ) { CHAR8 ubString[48]; FilenameForBPP("INTERFACE\\bottom_bar_buttons.sti", ubString); // Load button Graphics iTEAMPanelImages[ ENDTURN_IMAGES ] = LoadButtonImage(ubString,-1,0,-1, 3,-1 ); iTEAMPanelImages[ ROSTERMODE_IMAGES ] = UseLoadedButtonImage( iTEAMPanelImages[ ENDTURN_IMAGES ] ,-1, 1,-1, 4,-1 ); iTEAMPanelImages[ DISK_IMAGES ] = UseLoadedButtonImage( iTEAMPanelImages[ ENDTURN_IMAGES ] ,-1, 2,-1, 5, -1 ); // Create buttons iTEAMPanelButtons[ TEAM_DONE_BUTTON ] = QuickCreateButton( iTEAMPanelImages[ ENDTURN_IMAGES ], TM_ENDTURN_X, TM_ENDTURN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnEndTurnCallback ); if ( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iTEAMPanelButtons[ TEAM_DONE_BUTTON ], TacticalStr[ END_TURN_POPUPTEXT ] ); iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] = QuickCreateButton( iTEAMPanelImages[ ROSTERMODE_IMAGES ], TM_ROSTERMODE_X, TM_ROSTERMODE_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnRostermodeCallback ); if ( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ], TacticalStr[ MAPSCREEN_POPUPTEXT ] ); iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] = QuickCreateButton( iTEAMPanelImages[ DISK_IMAGES ], TM_DISK_X, TM_DISK_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH - 1, DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)BtnSquadCallback ); if ( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Cannot create Interface button" ); return( FALSE ); } SetButtonFastHelpText( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ], TacticalStr[ CHANGE_SQUAD_POPUPTEXT ] ); return( TRUE ); } void RemoveTEAMPanelButtons( ) { UINT32 cnt; for ( cnt = 0; cnt < NUM_TEAM_BUTTONS; cnt++ ) { RemoveButton( iTEAMPanelButtons[ cnt ] ); } for ( cnt = 0; cnt < NUM_TEAM_BUTTON_IMAGES; cnt++ ) { UnloadButtonImage( iTEAMPanelImages[ cnt ] ); } } void BtnEndTurnCallback(GUI_BUTTON *btn,INT32 reason) { if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); // END TURN UIHandleEndTurn( NULL ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void BtnRostermodeCallback(GUI_BUTTON *btn,INT32 reason) { if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); if ( guiCurrentScreen == GAME_SCREEN ) { GoToMapScreenFromTactical(); EnableRadarScreenRender( ); } } } // callback to handle squad switching callback void BtnSquadCallback(GUI_BUTTON *btn,INT32 reason) { if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { btn->uiFlags |= BUTTON_CLICKED_ON; } else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Not Implemented Yet" ); ToggleRadarScreenRender( ); } else if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { btn->uiFlags &= (~BUTTON_CLICKED_ON ); } } void SetTEAMPanelCurrentMerc( UINT16 ubNewID ) { // Ignore ther ID given! // ALWYAS USE CURRENT MERC! fInterfacePanelDirty = DIRTYLEVEL2; UpdateTEAMPanel( ); } void UpdateTEAMPanel( ) { INT32 cnt; // WANNE: In editor mode, always disable the Done button, because we dont have any merc! #ifdef JA2EDITOR DisableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); #else if ( (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || (gTacticalStatus.uiFlags & REALTIME ) || !(gTacticalStatus.uiFlags & INCOMBAT ) ) { DisableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); } else { EnableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); } #endif // WANNE: In editor mode, always disable the strategy map button, because we dont have any merc! #ifdef JA2EDITOR DisableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); #else if ( gTacticalStatus.uiFlags & ENGAGED_IN_CONV ) { DisableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); } else { EnableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); } #endif if ( gfDisableTacticalPanelButtons ) { DisableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); DisableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); DisableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ); // OK, disable item regions....... for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ ) { MSYS_DisableRegion( &gTEAM_EnemyIndicator[ cnt ] ); MSYS_DisableRegion( &gTEAM_FirstHandInv[ cnt ] ); MSYS_DisableRegion( &gTEAM_SecondHandInv[ cnt ] ); } //disable the radar map region // If NOT in overhead map if ( !InOverheadMap( ) ) { MSYS_DisableRegion(&gRadarRegion); } } else { // WANNE: In editor mode, always disable the squad button, because we dont have any merc! #ifdef JA2EDITOR DisableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ); #else EnableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ); #endif for ( cnt = 0; cnt < NUMBER_OF_SOLDIERS_PER_SQUAD; cnt++ ) { MSYS_EnableRegion( &gTEAM_EnemyIndicator[ cnt ] ); MSYS_EnableRegion( &gTEAM_FirstHandInv[ cnt ] ); MSYS_EnableRegion( &gTEAM_SecondHandInv[ cnt ] ); } //Enable the radar map region MSYS_EnableRegion(&gRadarRegion); } } void HandleMouseOverTeamFaceForContMove( BOOLEAN fOn ) { FACETYPE *pFace; if ( fOn ) { // Check if we are waiting to continue move... if ( CheckForMercContMove( gpSMCurrentMerc ) ) { // Display 'cont' on face.... // Get face pFace = &gFacesData[ gpSMCurrentMerc->iFaceIndex ]; pFace->fDisplayTextOver = FACE_DRAW_TEXT_OVER; wcscpy( pFace->zDisplayText, TacticalStr[ CONTINUE_OVER_FACE_STR ] ); // While our mouse is here, draw a path! PlotPath( gpSMCurrentMerc, gpSMCurrentMerc->pathing.sFinalDestination, NO_COPYROUTE, PLOT, TEMPORARY, (UINT16)gpSMCurrentMerc->usUIMovementMode, NOT_STEALTH, FORWARD, gpSMCurrentMerc->bActionPoints ); } } else { // Remove 'cont' on face.... // Get face pFace = &gFacesData[ gpSMCurrentMerc->iFaceIndex ]; pFace->fDisplayTextOver = FACE_ERASE_TEXT_OVER; // Erase path! ErasePath( TRUE ); } } void MercFacePanelMoveCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; SOLDIERTYPE *pSoldier; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); // If our flags are set to do this, gofoit! if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { return; } if ( ubID == NOBODY ) { return; } // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) { return; } pSoldier = ubSoldierID; if ( !pSoldier->bActive ) { return; } if (iReason & MSYS_CALLBACK_REASON_MOVE ) { HandleMouseOverSoldierFaceForContMove( pSoldier, TRUE ); } else if ( iReason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { HandleMouseOverSoldierFaceForContMove( pSoldier, FALSE ); } } void EnemyIndicatorClickCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); if ( ubID == NOBODY ) { return; } // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) { return; } if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if ( !ubSoldierID->bActive ) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { //if ( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) //{ //} //else { SOLDIERTYPE *pSoldier; pSoldier = ubSoldierID; if ( pSoldier->aiData.bOppCnt > 0 ) { // Cycle.... CycleVisibleEnemies( pSoldier ); } else { MercFacePanelCallback( pRegion, iReason ); } } } } void MercFacePanelCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); // If our flags are set to do this, gofoit! if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { SetInfoChar( ubID ); } return; } if ( ubID == NOBODY ) { return; } // anv: did we click on empty panel? if ( !gTeamPanel[ ubID ].fOccupied ) { return; } // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) { return; } if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if ( !ubSoldierID->bActive ) { return; } if (!OK_INTERRUPT_MERC(ubSoldierID)) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { if ( !gfInItemPickupMenu && gpItemPointer == NULL ) { //if ( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) //if ( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_DRIVER ) ) //{ // pVehicle = GetSoldierStructureForVehicle( ubSoldierID->iVehicleId ); // HandleLocateSelectMerc( pVehicle->ubID, 0 ); //} //else { if ( !InOverheadMap( ) ) { // If we can continue a move, do so! if ( CheckForMercContMove( ubSoldierID ) ) { // Continue ContinueMercMovement( ubSoldierID ); ErasePath( TRUE ); } else { // HEADROCK HAM 3.5: Shift-Click a merc's face will add him to the current selection. if (!(gTacticalStatus.uiFlags & INCOMBAT) && _KeyDown( SHIFT ) ) { if ( ! (ubSoldierID->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED ) ) { if ( OK_CONTROLLABLE_MERC( ubSoldierID ) && !( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_VEHICLE | SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) ) { //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s added", ubSoldierID->name ); gusSelectedSoldier->flags.uiStatusFlags |= SOLDIER_MULTI_SELECTED; ubSoldierID->flags.uiStatusFlags |= SOLDIER_MULTI_SELECTED; EndMultiSoldierSelection( TRUE ); } } // A shift-click on a selected character will remove that character from the current selection. else { //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s removed", ubSoldierID->name ); ubSoldierID->flags.uiStatusFlags &= (~SOLDIER_MULTI_SELECTED ); if (ubSoldierID != gusSelectedSoldier) { gusSelectedSoldier->flags.uiStatusFlags |= SOLDIER_MULTI_SELECTED; } EndMultiSoldierSelection( TRUE ); } } else { //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s selected", ubSoldierID->name ); HandleLocateSelectMerc( ubSoldierID, 0 ); } } } else { SelectSoldier( ubSoldierID, TRUE, FALSE ); } } } } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP) { if ( !InOverheadMap( ) ) { // Only if guy is not dead! //if ( !( ubSoldierID->flags.uiStatusFlags & SOLDIER_DEAD ) && !AM_AN_EPC( ubSoldierID ) && !( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) ) if ( !( ubSoldierID->flags.uiStatusFlags & SOLDIER_DEAD ) && !AM_AN_EPC( ubSoldierID ) ) { gfSwitchPanel = TRUE; gbNewPanel = SM_PANEL; gubNewPanelParam = ubSoldierID; // silversurfer: This needs to be reset to TRUE because inventory view only allows radar screen to be displayed and not the squad list. fRenderRadarScreen = TRUE; } } } } extern void InternalSelectSoldier( SoldierID usSoldierID, BOOLEAN fAcknowledge, BOOLEAN fForceReselect, BOOLEAN fFromUI ); void HandleLocateSelectMerc( SoldierID ubID, INT8 bFlag ) { BOOLEAN fSelect = FALSE; if( !ubID->bActive ) { return; } if ( gpItemPointer != NULL ) { // ATE: Disable for feel purposes.... //return; } // ATE: No matter what we do... if below OKLIFE, just locate.... if ( ubID->stats.bLife < OKLIFE ) { LocateSoldier( ubID, SETLOCATOR ); return; } // Flugente: frozen soldiers can't be selected if ( ubID->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) { LocateSoldier( ubID, SETLOCATOR ); return; } if ( _KeyDown( ALT ) ) { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) { // Select merc InternalSelectSoldier( ubID, TRUE, FALSE, TRUE); ubID->flags.fFlashLocator = FALSE; ResetMultiSelection( ); } else { // Just locate.... LocateSoldier( ubID, SETLOCATOR ); } } else { if ( ubID->flags.fFlashLocator == FALSE ) { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) { // If we are currently selected, slide to location if ( ubID == gusSelectedSoldier ) { SlideTo(gusSelectedSoldier, SETLOCATOR); } else { LocateSoldier( ubID, SETLOCATOR ); } } else { if ( ubID == gusSelectedSoldier ) { SlideTo(gusSelectedSoldier, SETLOCATOR ); } else { fSelect = TRUE; //ShowRadioLocator( ubID, SHOW_LOCATOR_NORMAL ); } } } else { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) { // If we are currently selected, slide to location if ( ubID == gusSelectedSoldier ) { SlideTo(gusSelectedSoldier, DONTSETLOCATOR); } else { LocateSoldier( ubID, DONTSETLOCATOR ); } fSelect = TRUE; } else { if ( ubID == gusSelectedSoldier ) { LocateSoldier( ubID, DONTSETLOCATOR ); } else { fSelect = TRUE; } } } if ( bFlag == LOCATEANDSELECT_MERC ) { fSelect = TRUE; } if ( fSelect ) { // Select merc, only if alive! if ( !( ubID->flags.uiStatusFlags & SOLDIER_DEAD ) ) { InternalSelectSoldier( ubID, TRUE, FALSE, TRUE ); } } } ResetMultiSelection( ); // Handle locate select merc.... HandleMouseOverSoldierFaceForContMove( ubID, TRUE ); } void ShowRadioLocator( SoldierID ubID, UINT8 ubLocatorSpeed ) { RESETTIMECOUNTER( ubID->timeCounters.FlashSelCounter, FLASH_SELECTOR_DELAY ); //LocateSoldier( ubID, FALSE ); // IC - this is already being done outside of this function :) ubID->flags.fFlashLocator = TRUE; //gbPanelSelectedGuy = ubID; IC - had to move this outside to make this function versatile ubID->sLocatorFrame = 0; if ( ubLocatorSpeed == SHOW_LOCATOR_NORMAL ) { // If we are an AI guy, and we have the baton, make lower... // ( ubID->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL && ubID->bTeam != gbPlayerNum ) // //ercPtrs[ ubID ]->ubNumLocateCycles = 3; // //se // ubID->ubNumLocateCycles = 5; // } else { ubID->ubNumLocateCycles = 3; } } void EndRadioLocator( SoldierID ubID ) { ubID->flags.fFlashLocator = FALSE; ubID->flags.fShowLocator = FALSE; } void CheckForFacePanelStartAnims( SOLDIERTYPE *pSoldier, INT16 sPanelX, INT16 sPanelY ) { if ( !pSoldier->bActive ) { return; } if ( pSoldier->flags.fUIdeadMerc ) { // pSoldier->sPanelFaceX = sPanelX; // pSoldier->sPanelFaceY = sPanelY; } } void FinishAnySkullPanelAnimations( ) { SOLDIERTYPE *pTeamSoldier; SoldierID cnt2 = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; // run through list for ( ; cnt2 <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ++cnt2 ) { pTeamSoldier = cnt2; if ( pTeamSoldier->bActive && pTeamSoldier->stats.bLife == 0 ) { if ( pTeamSoldier->flags.fUIdeadMerc || pTeamSoldier->flags.fClosePanelToDie ) { HandlePlayerTeamMemberDeathAfterSkullAnimation( pTeamSoldier ); pTeamSoldier->flags.fUIdeadMerc = FALSE; pTeamSoldier->flags.fClosePanelToDie = FALSE; } } } } void HandlePanelFaceAnimations( SOLDIERTYPE *pSoldier ) { if ( pSoldier->bTeam != gbPlayerNum ) { return; } if ( !pSoldier->bActive ) { return; } if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { // Don't do this for a vehice. return; } // If this is the first time we are active, open panel! if ( pSoldier->flags.fUInewMerc ) { pSoldier->flags.fUInewMerc = FALSE; } if ( pSoldier->flags.fUICloseMerc ) { pSoldier->flags.fUICloseMerc = FALSE; } if ( pSoldier->flags.fUIdeadMerc ) { pSoldier->sPanelFaceX = gFacesData[ pSoldier->iFaceIndex ].usFaceX; pSoldier->sPanelFaceY = gFacesData[ pSoldier->iFaceIndex ].usFaceY; pSoldier->flags.fUIdeadMerc = FALSE; pSoldier->flags.fClosePanel = TRUE; pSoldier->flags.fClosePanelToDie = TRUE; pSoldier->ubClosePanelFrame = 0; pSoldier->ubDeadPanelFrame = 0; RESETTIMECOUNTER( pSoldier->timeCounters.PanelAnimateCounter, 160 ); } if ( pSoldier->flags.fClosePanel ) { if ( TIMECOUNTERDONE( pSoldier->timeCounters.PanelAnimateCounter, 160 ) ) { pSoldier->ubClosePanelFrame++; if ( pSoldier->ubClosePanelFrame > 5 ) { pSoldier->flags.fClosePanel = FALSE; pSoldier->ubClosePanelFrame = 5; if ( pSoldier->flags.fClosePanelToDie ) { pSoldier->flags.fDeadPanel = TRUE; //PlayJA2Sample( (UINT8)HEADCR_1, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN ); } else { if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); } } } RESETTIMECOUNTER( pSoldier->timeCounters.PanelAnimateCounter, 160 ); } } if ( pSoldier->flags.fClosePanel ) { // Render panel! //if(gbPixelDepth==16) //{ if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); BltVideoObjectFromIndex( FRAME_BUFFER, guiCLOSE, pSoldier->ubClosePanelFrame, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); InvalidateRegion( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, pSoldier->sPanelFaceX + TM_FACE_WIDTH, pSoldier->sPanelFaceY + TM_FACE_HEIGHT ); } //} } if ( pSoldier->flags.fDeadPanel ) { if ( TIMECOUNTERDONE( pSoldier->timeCounters.PanelAnimateCounter, 160 ) ) { pSoldier->ubDeadPanelFrame++; if ( pSoldier->ubDeadPanelFrame == 4 ) { ScreenMsg( FONT_RED, MSG_SKULL_UI_FEEDBACK, pMercDeadString[ 0 ], pSoldier->name ); PlayJA2Sample( (UINT8)DOORCR_1, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN ); PlayJA2Sample( (UINT8)HEADCR_1, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN ); } if ( pSoldier->ubDeadPanelFrame > 5 ) { pSoldier->flags.fDeadPanel = FALSE; pSoldier->ubDeadPanelFrame = 5; pSoldier->flags.fClosePanelToDie = FALSE; // Finish! if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiDEAD, pSoldier->ubDeadPanelFrame, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); // Blit hatch! BltVideoObjectFromIndex( guiSAVEBUFFER, guiHATCH, 0, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); } HandlePlayerTeamMemberDeathAfterSkullAnimation( pSoldier ); } RESETTIMECOUNTER( pSoldier->timeCounters.PanelAnimateCounter, 160 ); } } if ( pSoldier->flags.fDeadPanel ) { // Render panel! //if(gbPixelDepth==16) //{ if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { BltVideoObjectFromIndex( FRAME_BUFFER, guiDEAD, pSoldier->ubDeadPanelFrame, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); // Blit hatch! BltVideoObjectFromIndex( guiSAVEBUFFER, guiHATCH, 0, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); InvalidateRegion( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, pSoldier->sPanelFaceX + TM_FACE_WIDTH, pSoldier->sPanelFaceY + TM_FACE_HEIGHT ); } //} } if ( pSoldier->flags.fOpenPanel ) { if ( TIMECOUNTERDONE( pSoldier->timeCounters.PanelAnimateCounter, 160 ) ) { pSoldier->bOpenPanelFrame--; if ( pSoldier->bOpenPanelFrame < 0 ) { pSoldier->flags.fOpenPanel = FALSE; pSoldier->bOpenPanelFrame = 0; if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); } } RESETTIMECOUNTER( pSoldier->timeCounters.PanelAnimateCounter, 160 ); } } if ( pSoldier->flags.fOpenPanel ) { // Render panel! //if(gbPixelDepth==16) //{ if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); BltVideoObjectFromIndex( FRAME_BUFFER, guiCLOSE, pSoldier->bOpenPanelFrame, pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); //InvalidateRegion( sTEAMFacesXY[ ubOpenPanelID ], sTEAMFacesXY[ ubOpenPanelID + 1 ], sTEAMFacesXY[ ubOpenPanelID ] + TM_FACE_WIDTH, sTEAMFacesXY[ ubOpenPanelID + 1 ] + TM_FACE_HEIGHT ); } //} } } void HandleSoldierFaceFlash( SOLDIERTYPE *pSoldier, INT16 sFaceX, INT16 sFaceY ) { } void RenderSoldierTeamInv( SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY, UINT8 ubPanelNum, BOOLEAN fDirty ) { if ( pSoldier->bActive && !(pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) { if ( pSoldier->flags.uiStatusFlags & SOLDIER_DRIVER ) { INVRenderSteeringWheel( guiSAVEBUFFER, guiVEHINV, pSoldier, sX, sY, TM_INV_WIDTH, TM_INV_HEIGHT, fDirty ); } else { // Look in primary hand INVRenderItem( guiSAVEBUFFER, pSoldier, &(pSoldier->inv[ HANDPOS ]), sX, sY, TM_INV_WIDTH, TM_INV_HEIGHT, fDirty, &(gfTEAM_HandInvDispText[ ubPanelNum ][ HANDPOS ] ), 0 , FALSE, 0); } if ( pSoldier->flags.uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiVEHINV, 1, sX, (INT16)(sY + TM_INV_HAND_SEPY), VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sX, (INT16)(sY + TM_INV_HAND_SEPY), (INT16)(TM_INV_WIDTH ) , (INT16)( TM_INV_HEIGHT ) ); } else { // Do secondary hand INVRenderItem( guiSAVEBUFFER, pSoldier, &(pSoldier->inv[ SECONDHANDPOS ]), sX, (INT16)(sY + TM_INV_HAND_SEPY), TM_INV_WIDTH, TM_INV_HEIGHT, fDirty, &(gfTEAM_HandInvDispText[ ubPanelNum ][ SECONDHANDPOS ] ), 0 , FALSE, 0); } } } void TMFirstHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); // If our flags are set to do this, gofoit! if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { return; } if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if ( ubID == NOBODY ) return; // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( !ubSoldierID->bActive ) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { //OK FOR NOW, DROP ITEM WHERE BUDDY IS { // SOLDIERTYPE *pSoldier; // if( GetSoldier( &pSoldier, ubSoldierID ) ) // { // } } } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { } } void TMClickFirstHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; UINT16 usOldHandItem; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); if ( ubID == NOBODY ) return; // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) return; if (iReason == MSYS_CALLBACK_REASON_LBUTTON_UP ) { // anv: select vehicle by clicking on the steering wheel //if ( ubSoldierID->flags.uiStatusFlags & SOLDIER_DRIVER ) //{ // SOLDIERTYPE *pVehicle = GetSoldierStructureForVehicle( ubSoldierID->iVehicleId ); // HandleLocateSelectMerc( pVehicle->ubID, 0 ); //} //else { // Change to use cursor mode... guiPendingOverrideEvent = A_ON_TERRAIN; } } if (iReason == MSYS_CALLBACK_REASON_RBUTTON_UP ) { if ( !AM_A_ROBOT( ubSoldierID ) ) { usOldHandItem = ubSoldierID->inv[HANDPOS].usItem; //SwapOutHandItem( ubSoldierID ); SwapHandItems( ubSoldierID ); ubSoldierID->ReLoadSoldierAnimationDueToHandItemChange( usOldHandItem, ubSoldierID->inv[HANDPOS].usItem ); fInterfacePanelDirty = DIRTYLEVEL2; } } } void TMClickSecondHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT16 ubID; SoldierID ubSoldierID; UINT16 usOldHandItem; ubID = (UINT16) MSYS_GetRegionUserData( pRegion, 0 ); if ( ubID == NOBODY ) return; // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) return; if (iReason == MSYS_CALLBACK_REASON_LBUTTON_UP ) { if ( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { ExitVehicle( ubSoldierID ); } else if (UsingNewInventorySystem() && !AM_A_ROBOT(ubSoldierID)) { ubSoldierID->SwitchWeapons(); } } if (iReason == MSYS_CALLBACK_REASON_RBUTTON_UP ) { if ( ubSoldierID->flags.uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { } else { if ( !AM_A_ROBOT( ubSoldierID ) ) { usOldHandItem = ubSoldierID->inv[HANDPOS].usItem; SwapHandItems( ubSoldierID ); ubSoldierID->ReLoadSoldierAnimationDueToHandItemChange( usOldHandItem, ubSoldierID->inv[HANDPOS].usItem ); fInterfacePanelDirty = DIRTYLEVEL2; } } } } BOOLEAN PlayerExistsInSlot( SoldierID ubID ) { INT32 cnt; for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubID ) { return( TRUE ); } } } return( FALSE ); } INT8 GetTeamSlotFromPlayerID( SoldierID ubID ) { INT8 cnt; for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubID ) { return( cnt ); } } } return( -1 ); } BOOLEAN RemovePlayerFromTeamSlotGivenMercID( SoldierID ubMercID ) { INT32 cnt; for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubMercID ) { RemovePlayerFromInterfaceTeamSlot( (UINT8)cnt ); return( TRUE ); } } } return( FALSE ); } void AddPlayerToInterfaceTeamSlot( SoldierID ubID ) { INT32 cnt; // If we are a vehicle don't ever add..... if ( ubID->flags.uiStatusFlags & SOLDIER_VEHICLE ) { return; } if ( !( ubID->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) ) { if ( !PlayerExistsInSlot( ubID ) ) { // Find a free slot for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { if ( !gTeamPanel[ cnt ].fOccupied ) { gTeamPanel[ cnt ].fOccupied = TRUE; gTeamPanel[ cnt ].ubID = ubID; MSYS_SetRegionUserData( &gTEAM_FirstHandInv[ cnt ], 0, cnt ); MSYS_SetRegionUserData( &gTEAM_FaceRegions[ cnt ], 0, cnt ); // DIRTY INTERFACE fInterfacePanelDirty = DIRTYLEVEL2; // Set ID to do open anim ubID->flags.fUInewMerc = TRUE; break; } } } } else { // anv: for passengers, position on team panel will be linked with seat in vehicle if ( ubID->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) { SOLDIERTYPE *pVehicle = GetSoldierStructureForVehicle( ubID->iVehicleId ); if( pVehicle != NULL ) { for( UINT8 iCounter = 0; iCounter < gNewVehicle[ pVehicleList[ ubID->iVehicleId ].ubVehicleType ].iNewSeatingCapacities; iCounter++ ) { SOLDIERTYPE *pPassenger = pVehicleList[ ubID->iVehicleId ].pPassengers[ iCounter ]; if( pPassenger != NULL && pPassenger->ubID == ubID ) { gTeamPanel[ iCounter ].fOccupied = TRUE; gTeamPanel[ iCounter ].ubID = ubID; MSYS_SetRegionUserData( &gTEAM_FirstHandInv[ iCounter ], 0, iCounter ); MSYS_SetRegionUserData( &gTEAM_FaceRegions[ iCounter ], 0, iCounter ); // DIRTY INTERFACE fInterfacePanelDirty = DIRTYLEVEL2; // Set ID to do open anim ubID->flags.fUInewMerc = TRUE; return; } } } } } } BOOLEAN InitTEAMSlots( ) { INT32 cnt; for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { gTeamPanel[ cnt ].fOccupied = FALSE; gTeamPanel[ cnt ].ubID = NOBODY; } return( TRUE ); } BOOLEAN GetPlayerIDFromInterfaceTeamSlot( UINT8 ubPanelSlot, SoldierID * pubID ) { if ( ubPanelSlot >= gGameOptions.ubSquadSize ) { return( FALSE ); } if ( gTeamPanel[ ubPanelSlot ].fOccupied ) { *pubID = gTeamPanel[ ubPanelSlot ].ubID; return( TRUE ); } else { return( FALSE ); } } void RemoveAllPlayersFromSlot( ) { int cnt; for ( cnt = 0; cnt < gGameOptions.ubSquadSize; cnt++ ) { RemovePlayerFromInterfaceTeamSlot( (UINT8)cnt ); } } BOOLEAN RemovePlayerFromInterfaceTeamSlot( UINT8 ubPanelSlot ) { if ( ubPanelSlot >= gGameOptions.ubSquadSize ) { return( FALSE ); } if ( gTeamPanel[ ubPanelSlot ].fOccupied ) { if ( !( gTeamPanel[ ubPanelSlot ].ubID->flags.uiStatusFlags & SOLDIER_DEAD ) ) { // Set Id to close gTeamPanel[ ubPanelSlot ].ubID->flags.fUICloseMerc = TRUE; } // Set face to inactive... SetAutoFaceInActive( gTeamPanel[ ubPanelSlot ].ubID->iFaceIndex ); gTeamPanel[ ubPanelSlot ].fOccupied = FALSE; gTeamPanel[ ubPanelSlot ].ubID = NOBODY; MSYS_SetRegionUserData( &gTEAM_FirstHandInv[ ubPanelSlot ], 0, NOBODY ); MSYS_SetRegionUserData( &gTEAM_FaceRegions[ ubPanelSlot ], 0, NOBODY ); // DIRTY INTERFACE fInterfacePanelDirty = DIRTYLEVEL2; return( TRUE ); } else { return( FALSE ); } } /* CHRISL: Adjust function to allow X,Y coordinates to be passed so that we can render the TownID string seperately between the team and inventory windows. */ void RenderTownIDString( INT16 sX, INT16 sY ) { CHAR16 zTownIDString[80]; INT16 sFontX, sFontY; // when NIV is open in tactical if (sY+GetFontHeight(COMPFONT) >= SCREEN_HEIGHT) return; // Render town, position SetFont( COMPFONT ); SetFontForeground( 183 ); SetFontBackground( FONT_BLACK ); GetSectorIDString( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, zTownIDString, TRUE ); ReduceStringLength( zTownIDString, 80, COMPFONT ); VarFindFontCenterCoordinates( sX , sY, 80, 16, COMPFONT, &sFontX, &sFontY, zTownIDString ); mprintf( sFontX, sFontY, L"%s", zTownIDString ); } void CheckForAndAddMercToTeamPanel( SOLDIERTYPE *pSoldier ) { if ( pSoldier->bActive ) { // Add to interface if the are ours if ( pSoldier->bTeam == gbPlayerNum ) { // Are we in the loaded sector? if ( pSoldier->sSectorX == gWorldSectorX && pSoldier->sSectorY == gWorldSectorY && pSoldier->bSectorZ == gbWorldSectorZ && !pSoldier->flags.fBetweenSectors && pSoldier->bInSector ) { // IF on duty.... if( ( pSoldier->bAssignment == CurrentSquad( ) )|| ( SoldierIsDeadAndWasOnSquad( pSoldier, ( INT8 )( CurrentSquad( ) ) ) ) ) { if( pSoldier->bAssignment == ASSIGNMENT_DEAD ) { pSoldier->flags.fUICloseMerc = FALSE; } // ATE: ALrighty, if we have the insertion code of helicopter..... don't add just yet! /// ( will add in heli code ) if ( pSoldier->ubStrategicInsertionCode != INSERTION_CODE_CHOPPER ) { AddPlayerToInterfaceTeamSlot( pSoldier->ubID ); } // ARE WE A VEHICLE..... if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { AddPassangersToTeamPanel( pSoldier->bVehicleID ); } } } else { // Make sure we are NOT in this world! // Set gridno to one that's not visib;l pSoldier->RemoveSoldierFromGridNo( ); // Remove slot from tactical RemoveMercSlot( pSoldier ); } } } } void CleanUpStack( OBJECTTYPE * pObj, OBJECTTYPE * pCursorObj ) { INT16 bMaxPoints; UINT16 usItem = pObj->usItem; if ( !(Item[usItem].usItemClass & IC_AMMO || Item[usItem].usItemClass & IC_KIT || Item[usItem].usItemClass & IC_MEDKIT || ItemIsCanteen(usItem) || ItemIsGascan(usItem) || Item[usItem].alcohol > 0.0f) ) { return; } if ( Item[ usItem ].usItemClass & IC_AMMO ) { bMaxPoints = Magazine[ Item[ usItem ].ubClassIndex ].ubMagSize; } else { bMaxPoints = 100; } if ( pCursorObj && pCursorObj->usItem == usItem ) { DistributeStatus(pCursorObj, pObj, bMaxPoints); } DistributeStatus(pObj, pObj, bMaxPoints); // Flugente: one of the items on the stack might not be full. Make sure it is the first one, so the player can see what is missing at a glance if ( pObj->ubNumberOfObjects > 1 ) { if ( Item[usItem].usItemClass & IC_AMMO ) { UINT16 shots_first = (*pObj)[0]->data.ubShotsLeft; (*pObj)[0]->data.ubShotsLeft = (*pObj)[pObj->ubNumberOfObjects - 1]->data.ubShotsLeft; (*pObj)[pObj->ubNumberOfObjects - 1]->data.ubShotsLeft = shots_first; } else if ( Item[usItem].usItemClass & IC_MAPFILTER_KIT ) { INT16 status_first = (*pObj)[0]->data.objectStatus; (*pObj)[0]->data.objectStatus = (*pObj)[pObj->ubNumberOfObjects - 1]->data.objectStatus; (*pObj)[pObj->ubNumberOfObjects - 1]->data.objectStatus = status_first; } } } SoldierID FindNextMercInTeamPanel( SOLDIERTYPE *pSoldier, BOOLEAN fGoodForLessOKLife, BOOLEAN fOnlyRegularMercs ) { INT32 cnt; INT32 bFirstID; SOLDIERTYPE *pTeamSoldier; bFirstID = GetTeamSlotFromPlayerID( pSoldier->ubID ); if ( bFirstID == -1 ) { return( pSoldier->ubID ); } for ( cnt = ( bFirstID + 1 ); cnt < gGameOptions.ubSquadSize; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { // Set Id to close pTeamSoldier = gTeamPanel[ cnt ].ubID; if ( fOnlyRegularMercs ) { if ( pTeamSoldier->bActive && ( AM_AN_EPC( pTeamSoldier ) || AM_A_ROBOT( pTeamSoldier ) ) ) { continue; } } if ( fGoodForLessOKLife ) { if ( pTeamSoldier->stats.bLife > 0 && pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == gbPlayerNum && pTeamSoldier->bAssignment < ON_DUTY && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( gTeamPanel[ cnt ].ubID ); } } else { if ( OK_CONTROLLABLE_MERC( pTeamSoldier) && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( gTeamPanel[ cnt ].ubID ); } } } } if ( ( gusSelectedSoldier != NOBODY ) && ( gGameSettings.fOptions[ TOPTION_SPACE_SELECTS_NEXT_SQUAD ] ) ) { // only allow if nothing in hand and if in SM panel, the Change Squad button must be enabled if ( ( ( gsCurInterfacePanel != TEAM_PANEL ) || ( ButtonList[ iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) ) ) { SOLDIERTYPE *pNewSoldier; INT32 iCurrentSquad; //Select next squad iCurrentSquad = CurrentSquad( ); pNewSoldier = FindNextActiveSquad( gusSelectedSoldier ); if ( pNewSoldier->bAssignment != iCurrentSquad ) { if ( gGameExternalOptions.fUseXMLSquadNames && pNewSoldier->bAssignment < min(ON_DUTY, (INT8)gSquadNameVector.size()) ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[MSG_SQUAD_ACTIVE_STRING], gSquadNameVector[pNewSoldier->bAssignment].c_str() ); else //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( pNewSoldier->bAssignment + 1 ) ); return( pNewSoldier->ubID ); } } } // none found, // Now loop back for ( cnt = 0; cnt < bFirstID; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { pTeamSoldier = gTeamPanel[ cnt ].ubID; if ( fOnlyRegularMercs ) { if ( pTeamSoldier->bActive && ( AM_AN_EPC( pTeamSoldier ) || AM_A_ROBOT( pTeamSoldier ) ) ) { continue; } } if ( fGoodForLessOKLife ) { if ( pTeamSoldier->stats.bLife > 0 && pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == gbPlayerNum && pTeamSoldier->bAssignment < ON_DUTY && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( gTeamPanel[ cnt ].ubID ); } } else { if ( OK_CONTROLLABLE_MERC( pTeamSoldier) && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( gTeamPanel[ cnt ].ubID ); } } } } // IF we are here, keep as we always were! return( pSoldier->ubID ); } void HelpTextDoneCallback( void ) { gfRerenderInterfaceFromHelpText = TRUE; //To redraw the Store Keeper Interface gubSkiDirtyLevel = SKI_DIRTY_LEVEL2; } void DisableTacticalTeamPanelButtons( BOOLEAN fDisable ) { gfDisableTacticalPanelButtons = fDisable; } void BeginKeyPanelFromKeyShortcut( ) { SOLDIERTYPE *pSoldier = NULL; INT16 sStartYPosition = 0; INT16 sWidth = 0, sHeight = 0; if ( gsCurInterfacePanel != SM_PANEL ) { return; } if ( gpSMCurrentMerc == NULL ) { return; } if ( gfInKeyRingPopup ) { return; } sStartYPosition = INV_INTERFACE_START_Y; sWidth = SCREEN_WIDTH; sHeight = ( SCREEN_HEIGHT - ( INV_INTERFACE_START_Y ) ); pSoldier = gpSMCurrentMerc; //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) return; //CHRISL: In OIV mode, we don't want to offset the keyring popup. if(UsingNewInventorySystem() == false) InitKeyRingPopup( pSoldier, 0, sStartYPosition, sWidth, sHeight ); else InitKeyRingPopup( pSoldier, 35, sStartYPosition, sWidth, sHeight ); } void KeyRingItemPanelButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ) { SOLDIERTYPE *pSoldier = NULL; INT16 sStartYPosition = 0; INT16 sWidth = 0, sHeight = 0; if( guiCurrentScreen == MAP_SCREEN ) { if( bSelectedInfoChar == -1 ) { return; } if( gCharactersList[ bSelectedInfoChar ].fValid == FALSE ) { return; } pSoldier = gCharactersList[ bSelectedInfoChar ].usSolID; sStartYPosition = MAP_START_KEYRING_Y; sWidth = 261; sHeight = ( 359 - 107 ); } else { if ( gpSMCurrentMerc == NULL ) { return; } sStartYPosition = INV_INTERFACE_START_Y; sWidth = SCREEN_WIDTH; sHeight = ( SCREEN_HEIGHT - ( INV_INTERFACE_START_Y ) ); pSoldier = gpSMCurrentMerc; } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) return; if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP) { if( guiCurrentScreen == MAP_SCREEN ) { // want the inv done button shutdown and the region behind the keyring shaded //ForceButtonUnDirty( giMapInvDoneButton ); // shade the background ShadowVideoSurfaceRect( FRAME_BUFFER, UI_CHARINV_REGION_X, UI_CHARINV_REGION_Y, UI_CHARINV_REGION_X + UI_CHARINV_REGION_W, UI_CHARINV_REGION_Y + UI_CHARINV_REGION_H); InvalidateRegion(UI_CHARINV_REGION_X, UI_CHARINV_REGION_Y, UI_CHARINV_REGION_X + UI_CHARINV_REGION_W, UI_CHARINV_REGION_Y + UI_CHARINV_REGION_H); } //CHRISL: In OIV mode, we don't want to offset the keyring popup. if(UsingNewInventorySystem() == false) InitKeyRingPopup( pSoldier, 0, sStartYPosition, sWidth, sHeight ); else InitKeyRingPopup( pSoldier, 35, sStartYPosition, sWidth, sHeight ); } } void KeyRingSlotInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT32 uiKeyRing; // Copyies of values UINT16 usOldItemIndex; static BOOLEAN fRightDown = FALSE; static BOOLEAN fLeftDown = FALSE; INT32 iNumberOfKeysTaken = 0; uiKeyRing = MSYS_GetRegionUserData( pRegion, 0 ); if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } //if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) //{ // fLeftDown = TRUE; //} //else if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP && fLeftDown ) if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { fLeftDown = FALSE; //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { INVENTORY_IN_SLOT InvSlot; if( gMoveingItem.sItemIndex == 0 ) { //Delete the contents of the item cursor gMoveingItem.initialize(); } else { // Return if empty //if ( gpSMCurrentMerc->inv[ uiHandPos ].exists() == false ) // return; // Fill out the inv slot for the item //InvSlot.sItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; // InvSlot.ubNumberOfItems = gpSMCurrentMerc->inv[ uiHandPos ].ubNumberOfObjects; // InvSlot.ubItemQuality = gpSMCurrentMerc->inv[ uiHandPos ].gun.bGunStatus; //InvSlot.ItemObject = gpSMCurrentMerc->inv[ uiHandPos ]; //InvSlot.ubLocationOfObject = PLAYERS_INVENTORY; //InvSlot.ubIdOfMercWhoOwnsTheItem = gpSMCurrentMerc->ubProfile; //Add the item to the Players Offer Area //AddItemToPlayersOfferArea( gpSMCurrentMerc->ubProfile, &InvSlot, (UINT8)uiHandPos ); // Dirty fInterfacePanelDirty = DIRTYLEVEL2; } return; } // If we do not have an item in hand, start moving it if ( gpItemPointer == NULL ) { // Return if empty if( ( gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubKeyID == INVALID_KEY_NUMBER ) || ( gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubNumber == 0 ) ) return; // If our flags are set to do this, gofoit! if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { } else { if ( gpItemPopupSoldier->ubID != gusSelectedSoldier ) { SelectSoldier( gpItemPopupSoldier->ubID, FALSE, FALSE ); } } usOldItemIndex = ( UINT16 )uiKeyRing ; BeginKeyRingItemPointer( gpItemPopupSoldier, (UINT8)usOldItemIndex ); //BeginItemPointer( gpSMCurrentMerc, (UINT8)uiHandPos ); } else { SoldierID ubSrcID, ubDestID; BOOLEAN fOKToGo = FALSE; BOOLEAN fDeductPoints = FALSE; // WANNE: Instead of checking the item number for a key, check the itemclass!!! if (Item[gpItemPointer->usItem].usItemClass != IC_KEY) { return; } // ATE: OK, get source, dest guy if different... check for and then charge appropriate APs ubSrcID = gCharactersList[ bSelectedInfoChar ].usSolID; if ( gpItemPointerSoldier ) { ubDestID = gpItemPointerSoldier->ubID; } else { ubDestID = ubSrcID; } if ( ubSrcID == ubDestID ) { // We are doing this ourselve, continue fOKToGo = TRUE; } else { // These guys are different.... fDeductPoints = TRUE; // First check points for src guy if ( gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpItemPointerSoldier, 2, 0, TRUE ) ) { fOKToGo = TRUE; } } else { fOKToGo = TRUE; } // Should we go on? if ( fOKToGo ) { if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpSMCurrentMerc, 2, 0, TRUE ) ) { fOKToGo = TRUE; } else { fOKToGo = FALSE; } } } } if ( fOKToGo ) { //usOldItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; //usNewItemIndex = gpItemPointer->usItem; if ( gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubKeyID == INVALID_KEY_NUMBER || gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubKeyID == (*gpItemPointer)[0]->data.key.ubKeyID) { // Try to place here if ( ( iNumberOfKeysTaken = AddKeysToSlot( gpItemPopupSoldier, ( INT8 )uiKeyRing, gpItemPointer ) ) ) { if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0, UNTRIGGERED_INTERRUPT ); } if ( gpItemPopupSoldier->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPopupSoldier, 2, 0, UNTRIGGERED_INTERRUPT ); } } // Dirty fInterfacePanelDirty = DIRTYLEVEL2; gpItemPointer->ubNumberOfObjects -= ( UINT8 )iNumberOfKeysTaken; // Check if it's the same now! if ( gpItemPointer->exists() == false ) { if ( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) { MAPEndItemPointer(); } else { EndItemPointer(); } } // Setup a timer.... //guiMouseOverItemTime = GetJA2Clock( ); //gfCheckForMouseOverItem = TRUE; //gbCheckForMouseOverItemPos = (INT8)uiHandPos; } } else { // Swap! SwapKeysToSlot( gpItemPopupSoldier, (INT8) uiKeyRing, gpItemPointer ); if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier && gpItemPointerSoldier->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0, UNTRIGGERED_INTERRUPT ); } if ( gpSMCurrentMerc->stats.bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0, UNTRIGGERED_INTERRUPT ); } } // Dirty fInterfacePanelDirty = DIRTYLEVEL2; } } } UpdateItemHatches(); } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { fRightDown = TRUE; } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP && fRightDown ) { fRightDown = FALSE; // Return if empty if( ( gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubKeyID == INVALID_KEY_NUMBER ) || ( gpItemPopupSoldier->pKeyRing[ uiKeyRing ].ubNumber == 0 ) ) { DeleteKeyRingPopup( ); fTeamPanelDirty = TRUE; return; } // Some global stuff here - for esc, etc // Check for # of slots in item if ( !InItemDescriptionBox( ) ) { if ( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) { //InitKeyItemDescriptionBox( gpItemPopupSoldier, (UINT8)uiKeyRing, MAP_ITEMDESC_START_X, MAP_ITEMDESC_START_Y, 0 ); } else { InitKeyItemDescriptionBox( gpItemPopupSoldier, (UINT8)uiKeyRing, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, 0 ); } } } else if (iReason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { fRightDown = FALSE; fLeftDown = FALSE; } } void DisableSMPpanelButtonsWhenInShopKeeperInterface( BOOLEAN fDontDrawButtons ) { //Go through the buttons that will be under the ShopKeepers ATM panel and disable them DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); DisableButton( iSMPanelButtons[ LOOK_BUTTON ] ); DisableButton( iSMPanelButtons[ TALK_BUTTON ] ); DisableButton( iSMPanelButtons[ MUTE_BUTTON ] ); DisableButton( giSMStealthButton ); //Make sure the options button is disabled DisableButton( iSMPanelButtons[ OPTIONS_BUTTON ] ); //Make sure the mapscreen button is disabled DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); //DisableButton DisableButton( iSMPanelButtons[ STANCEUP_BUTTON ] ); DisableButton( iSMPanelButtons[ UPDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); DisableButton( iSMPanelButtons[ STANCEDOWN_BUTTON ] ); DisableButton( iSMPanelButtons[ HANDCURSOR_BUTTON ] ); DisableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); DisableButton( iSMPanelButtons[ LOOK_BUTTON ] ); DisableButton( iSMPanelButtons[ TALK_BUTTON ] ); DisableButton( iSMPanelButtons[ MUTE_BUTTON ] ); DisableButton( giSMStealthButton ); RenderBackpackButtons(DISABLE_BUTTON); /* CHRISL: Needed for new inventory backpack buttons */ if( fDontDrawButtons ) { //ATM: //Go through the buttons that will be under the ShopKeepers ATM panel and disable them //DisableButton ButtonList[ iSMPanelButtons[ STANCEUP_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ CLIMB_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ STANCEDOWN_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ giSMStealthButton ]->uiFlags &= ~BUTTON_DIRTY; // CHRISL: Backpack buttons for new inventory system if((UsingNewInventorySystem() == true)) { ButtonList[ giSMZipperButton ]->uiFlags &= ~BUTTON_DIRTY; ButtonList[ giSMDropPackButton ]->uiFlags &= ~BUTTON_DIRTY; } //Make sure the options button is disabled ButtonList[ iSMPanelButtons[ OPTIONS_BUTTON ] ]->uiFlags &= ~BUTTON_ENABLED; //Make sure the mapscreen button is disabled ButtonList[ iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ]->uiFlags &= ~BUTTON_ENABLED; //DisableButton ButtonList[ iSMPanelButtons[ STANCEUP_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ UPDOWN_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ CLIMB_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ STANCEDOWN_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ HANDCURSOR_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ LOOK_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ TALK_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ iSMPanelButtons[ MUTE_BUTTON ] ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ giSMStealthButton ]->uiFlags |= BUTTON_FORCE_UNDIRTY; // CHRISL: Backpack buttons for new inventory system if((UsingNewInventorySystem() == true)) { ButtonList[ giSMZipperButton ]->uiFlags |= BUTTON_FORCE_UNDIRTY; ButtonList[ giSMDropPackButton ]->uiFlags |= BUTTON_FORCE_UNDIRTY; } } } BOOLEAN IsMouseInRegion( MOUSE_REGION *pRegion ) { if ( (gusMouseXPos >= pRegion->RegionTopLeftX ) && (gusMouseXPos <= pRegion->RegionBottomRightX ) && (gusMouseYPos >= pRegion->RegionTopLeftY ) && (gusMouseYPos <= pRegion->RegionBottomRightY ) ) { return( TRUE ); } else { return( FALSE ); } } void EnableButtonsForInItemBox( BOOLEAN fEnable ) { if ( !fEnable ) { DisableButton( iSMPanelButtons[ NEXTMERC_BUTTON ] ); DisableButton( iSMPanelButtons[ PREVMERC_BUTTON ] ); DisableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } else { EnableButton( iSMPanelButtons[ NEXTMERC_BUTTON ] ); EnableButton( iSMPanelButtons[ PREVMERC_BUTTON ] ); if ( !gfDisableTacticalPanelButtons ) { EnableButton( iSMPanelButtons[ SM_MAP_SCREEN_BUTTON ] ); } } } void SMInvMoneyButtonCallback( MOUSE_REGION * pRegion, INT32 iReason ) { if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } else if (iReason == MSYS_CALLBACK_REASON_LBUTTON_DWN ) { //If the current merc is to far away, dont allow anything to be done if( gfSMDisableForItems ) return; //if the player has an item in his hand, if( gpItemPointer != NULL ) { //and the item is money if( Item[ gpItemPointer->usItem ].usItemClass == IC_MONEY ) { CHAR16 zText[512]; CHAR16 zMoney[64]; // Make sure we go back to movement mode... guiPendingOverrideEvent = A_CHANGE_TO_MOVE; HandleTacticalUI( ); swprintf( zMoney, L"%s", FormatMoney((*gpItemPointer)[0]->data.money.uiMoneyAmount ).data()); //ask the user if they are sure they want to deposit the money swprintf( zText, gzMoneyWithdrawMessageText[ CONFIRMATION_TO_DEPOSIT_MONEY_TO_ACCOUNT ], zMoney ); if( guiCurrentScreen == SHOPKEEPER_SCREEN ) { //if we are in the shop keeper interface, free the cursor if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) { FreeMouseCursor( TRUE ); } DoMessageBox( MSG_BOX_BASIC_STYLE, zText, SHOPKEEPER_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, ConfirmationToDepositMoneyToPlayersAccount, NULL ); } else DoMessageBox( MSG_BOX_BASIC_STYLE, zText, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, ConfirmationToDepositMoneyToPlayersAccount, NULL ); } } //else bring up the money item description box to remove money from the players account else { //set the flag indicating we are removing money from the players account gfAddingMoneyToMercFromPlayersAccount = TRUE; //create the temp object from the players account balance // if( LaptopSaveInfo.iCurrentBalance > MAX_MONEY_PER_SLOT ) // CreateMoney( MAX_MONEY_PER_SLOT, &gItemPointer ); // else CreateMoney( LaptopSaveInfo.iCurrentBalance, &gItemPointer ); InternalInitItemDescriptionBox( &gItemPointer, ITEMDESC_START_X, ITEMDESC_START_Y, 0, gpSMCurrentMerc ); } } } void ConfirmationToDepositMoneyToPlayersAccount( UINT8 ubExitValue ) { if ( ubExitValue == MSG_BOX_RETURN_YES ) { //add the money to the players account AddTransactionToPlayersBook( MERC_DEPOSITED_MONEY_TO_PLAYER_ACCOUNT, gpSMCurrentMerc->ubProfile, GetWorldTotalMin(), (*gpItemPointer)[0]->data.money.uiMoneyAmount); // dirty shopkeeper gubSkiDirtyLevel = SKI_DIRTY_LEVEL2; EndItemPointer( ); } } void ReEvaluateDisabledINVPanelButtons( ) { gfReEvaluateDisabledINVPanelButtons = TRUE; } void CheckForReEvaluateDisabledINVPanelButtons( ) { // OK, if we currently have an item pointer up.... if ( gfReEvaluateDisabledINVPanelButtons ) { if ( gpItemPointer || gfInItemPickupMenu ) { EnableSMPanelButtons( FALSE, TRUE ); } else { EnableSMPanelButtons( TRUE, TRUE ); } gfReEvaluateDisabledINVPanelButtons = FALSE; } } void AbandonBoxingCallback( UINT8 ubExitValue ) { if ( ubExitValue == MSG_BOX_RETURN_YES ) { // ok, proceed! SetBoxingState( NOT_BOXING ); gfEnteringMapScreen = TRUE; } // otherwise do nothing } void GoToMapScreenFromTactical( void ) { if ( gTacticalStatus.bBoxingState != NOT_BOXING ) { // pop up dialogue asking whether the player wants to abandon the fight DoMessageBox( MSG_BOX_BASIC_STYLE, Message[ STR_ABANDON_FIGHT ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, AbandonBoxingCallback, NULL ); return; } // ok, proceed! gfMouseLockedOnBorder = FALSE; gfEnteringMapScreen = TRUE; } //----LEGION 2--------- BOOLEAN HandleKlerykPistolet( SOLDIERTYPE *pSoldier, UINT32 uiHandPos, UINT16 usReplaceItem ) { BOOLEAN fRefuse = FALSE; if ( pSoldier->ubProfile == 57 ) { if ( uiHandPos == HANDPOS || uiHandPos == SECONDHANDPOS ) { if ( usReplaceItem == NOTHING ) { fRefuse = TRUE; } else { //legion // Do we have nothing or the leather vest or kevlar leather vest? if ( usReplaceItem == 4520 ) //złoty pistolet items.xml { // This is good.... fRefuse = FALSE; } else { fRefuse = TRUE; } } if ( fRefuse ) { // Say quote! TacticalCharacterDialogue( pSoldier, 85 ); return( TRUE ); } } } return( FALSE ); } //----------- //--------------------------------------------- // Moved to Weapons.cpp by ADB, rev 1513 /*void HandleTacticalEffectsOfEquipmentChange( SOLDIERTYPE *pSoldier, UINT32 uiInvPos, UINT16 usOldItem, UINT16 usNewItem ) { // if in attached weapon mode and don't have weapon with GL attached in hand, reset weapon mode if ( (pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO )&& !IsGrenadeLauncherAttached( &(pSoldier->inv[ HANDPOS ]) ) ) { if ( !Weapon[pSoldier->inv[ HANDPOS ].usItem].NoSemiAuto ) { pSoldier->bWeaponMode = WM_NORMAL; pSoldier->bDoBurst = FALSE; pSoldier->bDoAutofire = 0; } else { pSoldier->bWeaponMode = WM_AUTOFIRE; pSoldier->bDoBurst = TRUE; pSoldier->bDoAutofire = 1; } } // if he is loaded tactically if ( pSoldier->bInSector ) { // If this is our main hand if ( uiInvPos == HANDPOS || uiInvPos == SECONDHANDPOS ) { // check if we need to change animation! pSoldier->ReLoadSoldierAnimationDueToHandItemChange( usOldItem, usNewItem ); } // if this is head gear if ( uiInvPos == HEAD1POS || uiInvPos == HEAD2POS ) { // Could be because of GOGGLES change... Re-create light... pSoldier->DeleteSoldierLight( ); pSoldier->PositionSoldierLight( ); } } else { // as a minimum if ( (Item[ pSoldier->inv[ HANDPOS ].usItem ].usItemClass & IC_WEAPON) && GetShotsPerBurst(&pSoldier->inv[ HANDPOS ]) == 0 ) { if ( !Weapon[pSoldier->inv[ HANDPOS ].usItem].NoSemiAuto ) { pSoldier->bWeaponMode = WM_NORMAL; pSoldier->bDoBurst = FALSE; pSoldier->bDoAutofire = 0; } else { pSoldier->bWeaponMode = WM_AUTOFIRE; pSoldier->bDoAutofire = 1; pSoldier->bDoBurst = TRUE; } } } }*/