// WANNE 2 #ifdef PRECOMPILEDHEADERS #include "Tactical All.h" #else #include #include #include #include "sgp.h" #include "gameloop.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 "sys globals.h" #include "cursors.h" #include "radar screen.h" #include "worldman.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 "lighting.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 "mapscreen.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 "Soldier Add.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 "Cursor Control.h" #include "MessageBoxScreen.h" #endif /* * * 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 */ INV_REGION_DESC gSMInvPocketXY[19]; // 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; 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; 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_EXPL_X; int SM_EXPL_Y; int SM_MECH_X; int SM_MECH_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. */ INT16 sTEAMAPPanelXY[12]; INT16 sTEAMFacesXY[12]; INT16 sTEAMNamesXY[12]; INT16 sTEAMFaceHighlXY[12]; INT16 sTEAMLifeXY[12]; INT16 sTEAMBreathXY[12]; INT16 sTEAMMoraleXY[12]; INT16 sTEAMApXY[12]; INT16 sTEAMBarsXY[12]; INT16 sTEAMHandInvXY[12]; 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 INTERFACE_CLOCK_X; int INTERFACE_CLOCK_Y; int LOCATION_NAME_X; int LOCATION_NAME_Y; typedef 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, NUM_SM_BUTTON_IMAGES }; typedef 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; BOOLEAN gfSwitchPanel = FALSE; UINT8 gbNewPanel = SM_PANEL; UINT8 gubNewPanelParam = 0; BOOLEAN gfUIStanceDifferent = FALSE; BOOLEAN gfAllDisabled = FALSE; BOOLEAN gfSMDisableForItems = FALSE; BOOLEAN gfDisableTacticalPanelButtons = FALSE; BOOLEAN gfAddingMoneyToMercFromPlayersAccount = FALSE; BOOLEAN gfCheckForMouseOverItem = FALSE; UINT32 guiMouseOverItemTime = 0; INT8 gbCheckForMouseOverItemPos = 0; UINT8 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 void CleanUpStack( OBJECTTYPE * pObj, OBJECTTYPE * pCursorObj ); extern BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier ); extern BOOLEAN InternalHandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, OBJECTTYPE *pTestObject, BOOLEAN fOn ); 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; 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[ 6 ]; MOUSE_REGION gTEAM_BarsRegions[ 6 ]; MOUSE_REGION gTEAM_LeftBarsRegions[ 6 ]; MOUSE_REGION gTEAM_FirstHandInv[ 6 ]; MOUSE_REGION gTEAM_SecondHandInv[ 6 ]; MOUSE_REGION gTEAM_EnemyIndicator[ 6 ]; BOOLEAN gfTEAM_HandInvDispText[ 6 ][ NUM_INV_SLOTS ]; BOOLEAN gfSM_HandInvDispText[ NUM_INV_SLOTS ]; void HelpTextDoneCallback( void ); // Globals - for one - the current merc here INT8 gbSMCurStanceObj; UINT16 gusSMCurrentMerc = 0; SOLDIERTYPE *gpSMCurrentMerc = NULL; 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 }; // 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); 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( UINT8 ubID ); void UpdateStatColor( UINT32 uiTimer, BOOLEAN fUpdate ); extern void UpdateItemHatches(); extern SOLDIERTYPE *FindNextActiveSquad( SOLDIERTYPE *pSoldier ); // Wraps up check for AP-s get from a different soldier for in a vehicle... INT8 GetUIApsToDisplay( SOLDIERTYPE *pSoldier ) { SOLDIERTYPE *pVehicle; if ( pSoldier->uiStatusFlags & SOLDIER_DRIVER ) { pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId ); if ( pVehicle != NULL ) { return( pVehicle->bActionPoints ); } else { return( 0 ); } } else { return ( pSoldier->bActionPoints ); } } void CheckForDisabledForGiveItem( ) { INT16 sDist; INT16 sDistVisible; INT16 sDestGridNo; INT8 bDestLevel; INT32 cnt; SOLDIERTYPE *pSoldier; UINT8 ubSrcSoldier; 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->bLife < OKLIFE && gpItemPointer != NULL ) { // Go through each merc and see if there is one closeby.... cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pSoldier++) { if ( pSoldier->bActive && pSoldier->bLife >= OKLIFE && !( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) && !AM_A_ROBOT( pSoldier ) && pSoldier->bInSector && IsMercOnCurrentSquad( pSoldier ) ) { sDist = PythSpacesAway( gpSMCurrentMerc->sGridNo, pSoldier->sGridNo ); sDistVisible = DistanceVisible( pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bLevel, gpSMCurrentMerc ); // Check LOS.... if ( SoldierTo3DLocationLineOfSightTest( pSoldier, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bLevel, 3, (UINT8) sDistVisible, TRUE ) ) { if ( sDist <= PASSING_ITEM_DISTANCE_NOTOKLIFE ) { gfSMDisableForItems = FALSE; break; // found one, no need to keep looking } } } } } else { ubSrcSoldier = (UINT8)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 = MercPtrs[ gusSMCurrentMerc ]->sGridNo; bDestLevel = MercPtrs[ gusSMCurrentMerc ]->bLevel; // Get distance.... sDist = PythSpacesAway( MercPtrs[ ubSrcSoldier ]->sGridNo, sDestGridNo ); // is he close enough to see that gridno if he turns his head? sDistVisible = DistanceVisible( MercPtrs[ ubSrcSoldier ], DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sDestGridNo, bDestLevel, MercPtrs[ ubSrcSoldier ] ); // Check LOS.... if ( SoldierTo3DLocationLineOfSightTest( MercPtrs[ ubSrcSoldier ], sDestGridNo, bDestLevel, 3, (UINT8) sDistVisible, TRUE ) ) { // UNCONSCIOUS GUYS ONLY 1 tile AWAY if ( MercPtrs[ gusSMCurrentMerc ]->bLife < CONSCIOUSNESS ) { if ( sDist <= PASSING_ITEM_DISTANCE_NOTOKLIFE ) { gfSMDisableForItems = FALSE; } } else if ( sDist <= PASSING_ITEM_DISTANCE_OKLIFE ) { gfSMDisableForItems = FALSE; } } } else { gfSMDisableForItems = FALSE; } } else { gfSMDisableForItems = FALSE; } } } void SetSMPanelCurrentMerc( UINT8 ubNewID ) { gubSelectSMPanelToMerc = NOBODY; gusSMCurrentMerc = ubNewID; gpSMCurrentMerc = MercPtrs[ 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.... if ( gpItemPointer == NULL ) { HandleCompatibleAmmoUI( gpSMCurrentMerc, (INT8)HANDPOS, FALSE ); gfCheckForMouseOverItem = FALSE; } else { // Turn it all false first.... InternalHandleCompatibleAmmoUI( gpSMCurrentMerc, gpItemPointer, FALSE ); InternalHandleCompatibleAmmoUI( gpSMCurrentMerc, gpItemPointer, TRUE ); } // Remove item desc panel if one up.... if ( gfInItemDescBox ) { DeleteItemDescriptionBox( ); } if ( gfInItemPickupMenu ) { gfSMDisableForItems = TRUE; } else { if ( ( gpItemPointer != NULL || guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE || gpSMCurrentMerc->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 < 6; 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; if ( gpSMCurrentMerc->sGridNo == NOWHERE ) { 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 ); SetButtonFastHelpText( giSMStealthButton, TacticalStr[ TOGGLE_STEALTH_MODE_POPUPTEXT ] ); gfUIStanceDifferent = FALSE; if ( gfAllDisabled ) { if ( giSMStealthButton != -1 ) { DisableButton( giSMStealthButton ); } } } if ( gfAllDisabled ) { return; } CheckForReEvaluateDisabledINVPanelButtons( ); // Check for any newly added items we need..... if ( gpSMCurrentMerc->fCheckForNewlyAddedItems ) { // Startup any newly added items.... CheckForAnyNewlyAddedItems( gpSMCurrentMerc ); gpSMCurrentMerc->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->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 ( fNearLowerLevel ) { if ( EnoughPoints( gpSMCurrentMerc, GetAPsToClimbRoof( gpSMCurrentMerc, TRUE ), 0, FALSE ) ) { EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); } } if ( fNearHeigherLevel ) { if ( EnoughPoints( gpSMCurrentMerc, GetAPsToClimbRoof( gpSMCurrentMerc, FALSE ), 0, FALSE ) ) { EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); } } } if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bDirection, &bDirection ) ) { 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->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 ); } } else { // Enable some buttons! if ( ((IsGunAutofireCapable( gpSMCurrentMerc, HANDPOS ) || IsGunBurstCapable( gpSMCurrentMerc, HANDPOS , FALSE )) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) ) { 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 ); } } // 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 BOOLEAN CanItemFitInPosition( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 bPos, BOOLEAN fDoingPlacement ); extern INT8 gbInvalidPlacementSlot[ NUM_INV_SLOTS ]; void ReevaluateItemHatches( SOLDIERTYPE *pSoldier, BOOLEAN fAllValid ) { INT32 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 for ( cnt = 0; cnt < NUM_INV_SLOTS; 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 ].usItem ) ) { 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; } 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 ); } 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 ); } 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; } } UINT16 GetSMPanelCurrentMerc( ) { return( gusSMCurrentMerc ); } BOOLEAN InitializeSMPanelCoords( ) { // 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[0].sX = INTERFACE_START_X + 344; gSMInvPocketXY[0].sY = INV_INTERFACE_START_Y + 7; // HELMETPOS gSMInvPocketXY[1].sX = INTERFACE_START_X + 344; gSMInvPocketXY[1].sY = INV_INTERFACE_START_Y + 36; // VESTPOS gSMInvPocketXY[2].sX = INTERFACE_START_X + 344; gSMInvPocketXY[2].sY = INV_INTERFACE_START_Y + 96; // LEGPOS, gSMInvPocketXY[3].sX = INTERFACE_START_X + 226; gSMInvPocketXY[3].sY = INV_INTERFACE_START_Y + 7; // HEAD1POS gSMInvPocketXY[4].sX = INTERFACE_START_X + 226; gSMInvPocketXY[4].sY = INV_INTERFACE_START_Y + 31; // HEAD2POS gSMInvPocketXY[5].sX = INTERFACE_START_X + 226; gSMInvPocketXY[5].sY = INV_INTERFACE_START_Y + 84; // HANDPOS, gSMInvPocketXY[6].sX = INTERFACE_START_X + 226; gSMInvPocketXY[6].sY = INV_INTERFACE_START_Y + 108; // SECONDHANDPOS gSMInvPocketXY[7].sX = INTERFACE_START_X + 468; gSMInvPocketXY[7].sY = INV_INTERFACE_START_Y + 6; // BIGPOCK1 gSMInvPocketXY[8].sX = INTERFACE_START_X + 468; gSMInvPocketXY[8].sY = INV_INTERFACE_START_Y + 30; // BIGPOCK2 gSMInvPocketXY[9].sX = INTERFACE_START_X + 468; gSMInvPocketXY[9].sY = INV_INTERFACE_START_Y + 54; // BIGPOCK3 gSMInvPocketXY[10].sX = INTERFACE_START_X + 468; gSMInvPocketXY[10].sY = INV_INTERFACE_START_Y + 78; // BIGPOCK4 gSMInvPocketXY[11].sX = INTERFACE_START_X + 396; gSMInvPocketXY[11].sY = INV_INTERFACE_START_Y + 6; // SMALLPOCK1 gSMInvPocketXY[12].sX = INTERFACE_START_X + 396; gSMInvPocketXY[12].sY = INV_INTERFACE_START_Y + 30; // SMALLPOCK2 gSMInvPocketXY[13].sX = INTERFACE_START_X + 396; gSMInvPocketXY[13].sY = INV_INTERFACE_START_Y + 54; // SMALLPOCK3 gSMInvPocketXY[14].sX = INTERFACE_START_X + 396; gSMInvPocketXY[14].sY = INV_INTERFACE_START_Y + 78; // SMALLPOCK4 gSMInvPocketXY[15].sX = INTERFACE_START_X + 432; gSMInvPocketXY[15].sY = INV_INTERFACE_START_Y + 6; // SMALLPOCK5 gSMInvPocketXY[16].sX = INTERFACE_START_X + 432; gSMInvPocketXY[16].sY = INV_INTERFACE_START_Y + 30; // SMALLPOCK6 gSMInvPocketXY[17].sX = INTERFACE_START_X + 432; gSMInvPocketXY[17].sY = INV_INTERFACE_START_Y + 54; // SMALLPOCK7 gSMInvPocketXY[18].sX = INTERFACE_START_X + 432; gSMInvPocketXY[18].sY = INV_INTERFACE_START_Y + 78; // 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 ); // WANNE 2 SM_DONE_X = (SCREEN_WIDTH - 97);//( 543 + INTERFACE_START_X ); SM_DONE_Y = ( 4 + INV_INTERFACE_START_Y ); SM_MAPSCREEN_X = (SCREEN_WIDTH - 51);//( 589 + INTERFACE_START_X ); 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 = 30; SM_STATS_HEIGHT = 8 ; SM_AGI_X = ( 99 + INTERFACE_START_X ); SM_AGI_Y = ( 7 + INV_INTERFACE_START_Y ); SM_DEX_X = ( 99 + INTERFACE_START_X ); SM_DEX_Y = ( 17 + INV_INTERFACE_START_Y ); SM_STR_X = ( 99 + INTERFACE_START_X ); SM_STR_Y = ( 27 + INV_INTERFACE_START_Y ); SM_CHAR_X = ( 99 + INTERFACE_START_X ); SM_CHAR_Y = ( 37 + INV_INTERFACE_START_Y ); SM_WIS_X = ( 99 + INTERFACE_START_X ); SM_WIS_Y = ( 47 + INV_INTERFACE_START_Y ); SM_EXPLVL_X = ( 148 + INTERFACE_START_X ); SM_EXPLVL_Y = ( 7 + INV_INTERFACE_START_Y ); SM_MRKM_X = ( 148 + INTERFACE_START_X ); SM_MRKM_Y = ( 17 + INV_INTERFACE_START_Y ); SM_EXPL_X = ( 148 + INTERFACE_START_X ); SM_EXPL_Y = ( 27 + INV_INTERFACE_START_Y ); SM_MECH_X = ( 148 + INTERFACE_START_X ); SM_MECH_Y = ( 37 + INV_INTERFACE_START_Y ); SM_MED_X = ( 148 + 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; // ow and te clock and location i will put it here INTERFACE_CLOCK_X = (SCREEN_WIDTH - 86); //( 554 + INTERFACE_START_X ); INTERFACE_CLOCK_Y = ( 119 + INV_INTERFACE_START_Y ); LOCATION_NAME_X = (SCREEN_WIDTH - 92); //( 548 + INTERFACE_START_X ); LOCATION_NAME_Y = ( 65 + 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( ); // failing the CHECKF after this will cause you to lose your mouse VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; if (iResolution == 0) { strcpy( VObjectDesc.ImageFile, "INTERFACE\\inventory_bottom_panel.STI" ); } else if (iResolution == 1) { strcpy( VObjectDesc.ImageFile, "INTERFACE\\inventory_bottom_panel_800x600.STI" ); } else if (iResolution == 2) { 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 ); 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 ); } return( TRUE ); } BOOLEAN CreateSMPanelButtons( ) { UINT8 ubString[48]; giSMStealthImages = -1; giSMStealthButton = -1; gfUIStanceDifferent = TRUE; gfAllDisabled = FALSE; FilenameForBPP("INTERFACE\\inventory_buttons.sti", (STR)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 ); FilenameForBPP("INTERFACE\\invadd-ons.sti", (STR)ubString); // Load button Graphics iSMPanelImages[ STANCE_IMAGES ] = LoadButtonImage(ubString,0,0,-1,2,-1 ); FilenameForBPP("INTERFACE\\inventory_buttons_2.sti", (STR)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 ); // 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++ ) { UnloadButtonImage( iSMPanelImages[ cnt ] ); } if ( giSMStealthButton != -1 ) { RemoveButton( giSMStealthButton ); } if ( giSMStealthImages != -1 ) { UnloadButtonImage( giSMStealthImages ); } UnloadButtonImage( iBurstButtonImages[ WM_NORMAL ] ); UnloadButtonImage( iBurstButtonImages[ WM_BURST ] ); UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_GL ] ); UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_GL_BURST ] ); UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_GL_AUTO ] ); } 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( ); MSYS_RemoveRegion( &gSMPanelRegion ); MSYS_RemoveRegion( &gSM_SELMERCPanelRegion ); MSYS_RemoveRegion( &gSM_SELMERCBarsRegion ); MSYS_RemoveRegion( &gSM_SELMERCMoneyRegion ); MSYS_RemoveRegion( &gSM_SELMERCEnemyIndicatorRegion ); HandleMouseOverSoldierFaceForContMove( gpSMCurrentMerc, FALSE ); MSYS_RemoveRegion( &gViewportRegion ); RemoveSMPanelButtons( ); return( TRUE ); } void RenderSMPanel( BOOLEAN *pfDirty ) { INT16 sFontX, sFontY; UINT16 usX, usY; wchar_t sString[9]; UINT32 cnt; static INT16 pStr[ 200 ], pMoraleStr[ 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( ) ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMPanel, 0, 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 ); } } RenderItemDescriptionBox( ); } else { BltVideoObjectFromIndex( guiSAVEBUFFER, guiSMPanel, 0, 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 ); } } // 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 ] ); 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 ] ); 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 ] ); mprintf( SM_CAMMO_PERCENT_X, SM_CAMMO_PERCENT_Y, L"%%" ); UpdateStatColor( gpSMCurrentMerc-> uiChangeAgilityTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & AGIL_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bAgility ); FindFontRightCoordinates(SM_AGI_X, SM_AGI_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeDexterityTime,( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & DEX_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bDexterity ); FindFontRightCoordinates(SM_DEX_X, SM_DEX_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeStrengthTime, ( BOOLEAN )( gpSMCurrentMerc->usValueGoneUp & STRENGTH_INCREASE?TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bStrength ); FindFontRightCoordinates(SM_STR_X, SM_STR_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeLeadershipTime, ( BOOLEAN )( gpSMCurrentMerc->usValueGoneUp & LDR_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bLeadership ); FindFontRightCoordinates(SM_CHAR_X, SM_CHAR_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeWisdomTime,( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & WIS_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bWisdom ); FindFontRightCoordinates(SM_WIS_X, SM_WIS_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeLevelTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & LVL_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bExpLevel ); FindFontRightCoordinates(SM_EXPLVL_X, SM_EXPLVL_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeMarksmanshipTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MRK_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bMarksmanship ); FindFontRightCoordinates(SM_MRKM_X, SM_MRKM_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeExplosivesTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & EXP_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bExplosive ); FindFontRightCoordinates(SM_EXPL_X, SM_EXPL_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeMechanicalTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MECH_INCREASE ? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bMechanical ); FindFontRightCoordinates(SM_MECH_X, SM_MECH_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); UpdateStatColor( gpSMCurrentMerc-> uiChangeMedicalTime, ( BOOLEAN ) ( gpSMCurrentMerc->usValueGoneUp & MED_INCREASE? TRUE: FALSE ) ); swprintf( sString, L"%2d", gpSMCurrentMerc->bMedical ); FindFontRightCoordinates(SM_MED_X, SM_MED_Y ,SM_STATS_WIDTH ,SM_STATS_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); if ( gpSMCurrentMerc->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 ); // Display cammo value! swprintf( sString, L"%3d", max(0, min( (gpSMCurrentMerc->bCamo + gpSMCurrentMerc->wornCamo),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 ) { // UPdate stats! if ( gpSMCurrentMerc->bLife != 0 ) { if ( gpSMCurrentMerc->uiStatusFlags & SOLDIER_VEHICLE ) { swprintf( (wchar_t *)pStr, TacticalStr[ VEHICLE_VITAL_STATS_POPUPTEXT ], gpSMCurrentMerc->bLife, gpSMCurrentMerc->bLifeMax, gpSMCurrentMerc->bBreath, gpSMCurrentMerc->bBreathMax ); SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), pStr ); } else if ( gpSMCurrentMerc->uiStatusFlags & SOLDIER_ROBOT ) { swprintf( (wchar_t *)pStr, gzLateLocalizedString[ 16 ], gpSMCurrentMerc->bLife, gpSMCurrentMerc->bLifeMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else { GetMoraleString( gpSMCurrentMerc, (STR16)pMoraleStr ); swprintf( (wchar_t *)pStr, TacticalStr[ MERC_VITAL_STATS_POPUPTEXT ], gpSMCurrentMerc->bLife, gpSMCurrentMerc->bLifeMax, gpSMCurrentMerc->bBreath, gpSMCurrentMerc->bBreathMax, pMoraleStr ); SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), pStr ); } } else { SetRegionFastHelpText( &(gSM_SELMERCBarsRegion), L"" ); } //if we are in the shop keeper interface if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE ) SetRegionHelpEndCallback( &gSM_SELMERCBarsRegion, SkiHelpTextDoneCallBack ); // display AP if ( !( gpSMCurrentMerc->uiStatusFlags & SOLDIER_DEAD ) ) { if ( gTacticalStatus.uiFlags & TURNBASED && (gTacticalStatus.uiFlags & INCOMBAT ) && gpSMCurrentMerc->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, FALSE ) || GetUIApsToDisplay( gpSMCurrentMerc ) < 0 ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKRED ); } else { if ( MercUnderTheInfluence( gpSMCurrentMerc ) ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTBLUE ); } 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"%2d", 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->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 RenderClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); RenderTownIDString( ); } 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; 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 ) { if ( gpSMCurrentMerc->bLife >= OKLIFE ) { if( ( GetJA2Clock() < CHANGE_STAT_RECENTLY_DURATION + uiTimer) && ( uiTimer != 0 ) ) { if( fIncrease ) { SetFontForeground( FONT_LTGREEN ); } else { SetFontForeground( FONT_RED ); } } 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 ) { UINT32 uiHandPos; uiHandPos = MSYS_GetRegionUserData( pRegion, 0 ); if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if ( gpSMCurrentMerc->inv[ uiHandPos ].usItem == NOTHING ) 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; } } } 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 ) { // Setup a timer.... guiMouseOverItemTime = GetJA2Clock( ); gfCheckForMouseOverItem = TRUE; gbCheckForMouseOverItemPos = NO_SLOT; } if (iReason == MSYS_CALLBACK_REASON_LOST_MOUSE ) { //gfSM_HandInvDispText[ uiHandPos ] = 1; HandleCompatibleAmmoUI( gpSMCurrentMerc, (INT8)NO_SLOT, FALSE ); gfCheckForMouseOverItem = FALSE; } } void SMInvClickCamoCallback( MOUSE_REGION * pRegion, INT32 iReason ) { //UINT16 usNewItemIndex; UINT8 ubSrcID, ubDestID; BOOLEAN fGoodAPs; 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 != NULL ) { // ATE: OK, get source, dest guy if different... check for and then charge appropriate APs ubSrcID = gpSMCurrentMerc->ubID; ubDestID = gpItemPointerSoldier->ubID; //if ( ubSrcID == ubDestID ) { // We are doing this ourselve, continue if ( gpSMCurrentMerc->bLife >= CONSCIOUSNESS ) { //usNewItemIndex = gpItemPointer->usItem; // Try to apply camo.... if ( ApplyCammo( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) ) { if ( fGoodAPs ) { // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } // Say OK acknowledge.... DoMercBattleSound( gpSMCurrentMerc, BATTLE_SOUND_COOL1 ); } } else if ( ApplyCanteen( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) ) { // Dirty if ( fGoodAPs ) { fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } } } else if ( ApplyElixir( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) ) { if ( fGoodAPs ) { // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } // Say OK acknowledge.... DoMercBattleSound( gpSMCurrentMerc, BATTLE_SOUND_COOL1 ); } } else if ( ApplyDrugs( gpSMCurrentMerc, gpItemPointer ) ) { // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } /* // COMMENTED OUT DUE TO POTENTIAL SERIOUS PROBLEMS WITH STRATEGIC EVENT SYSTEM if ( gpSMCurrentMerc->ubProfile == LARRY_NORMAL ) { // Larry's taken something! gpSMCurrentMerc = SwapLarrysProfiles( gpSMCurrentMerc ); } */ // Say OK acknowledge.... DoMercBattleSound( gpSMCurrentMerc, BATTLE_SOUND_COOL1 ); } else { // Send message ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ CANNOT_DO_INV_STUFF_STR ] ); } } } } } 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 ( Item[usReplaceItem].leatherjacket || 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 ) { if ( _KeyDown(CTRL) ) { CleanUpStack( &( gpSMCurrentMerc->inv[ ubHandPos ] ), gpItemPointer ); if ( gpItemPointer->ubNumberOfObjects == 0 ) { EndItemPointer( ); } return( TRUE ); } // Try to place here if ( PlaceObject( gpSMCurrentMerc, ubHandPos, gpItemPointer ) ) { if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier->bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0 ); } if ( gpSMCurrentMerc->bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0 ); } } HandleTacticalEffectsOfEquipmentChange( gpSMCurrentMerc, ubHandPos, usOldItemIndex, usNewItemIndex ); // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if cursor is empty now if ( gpItemPointer->ubNumberOfObjects == 0 ) { 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 ); } } void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT32 uiHandPos; // Copyies of values UINT16 usOldItemIndex, usNewItemIndex; UINT16 usItemPrevInItemPointer; BOOLEAN fNewItem = FALSE; static BOOLEAN fRightDown = FALSE; static BOOLEAN fLeftDown = FALSE; 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 ) 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 ].usItem == NOTHING ) 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; } // Turn off new item glow! gpSMCurrentMerc->bNewItemCount[ uiHandPos ] = 0; usOldItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; // 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 { UINT8 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 ) { // We are doing this ourselve, continue fOKToGo = TRUE; } else { // These guys are different.... fDeductPoints = TRUE; // First check points for src guy if ( gpItemPointerSoldier->bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpItemPointerSoldier, 3, 0, TRUE ) ) { fOKToGo = TRUE; } } else { fOKToGo = TRUE; } // Should we go on? if ( fOKToGo ) { if ( gpSMCurrentMerc->bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpSMCurrentMerc, 3, 0, TRUE ) ) { fOKToGo = TRUE; } else { fOKToGo = FALSE; } } } } if ( fOKToGo ) { // OK, check if this is Nails, and we're in the vest position , don't allow it to come off.... if ( HandleNailsVestFetish( gpSMCurrentMerc, uiHandPos, gpItemPointer->usItem ) ) { return; } usOldItemIndex = gpSMCurrentMerc->inv[ uiHandPos ].usItem; usNewItemIndex = gpItemPointer->usItem; if ( uiHandPos == HANDPOS || uiHandPos == SECONDHANDPOS || uiHandPos == HELMETPOS || uiHandPos == VESTPOS || uiHandPos == LEGPOS ) { //if ( ValidAttachmentClass( usNewItemIndex, usOldItemIndex ) ) if ( ValidAttachment( usNewItemIndex, usOldItemIndex ) ) { // it's an attempt to attach; bring up the inventory panel if ( !InItemDescriptionBox( ) ) { InitItemDescriptionBox( gpSMCurrentMerc, (UINT8)uiHandPos, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, 0 ); } return; } else 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(); 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 } // 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 ) ) { // 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 memset( &gMoveingItem, 0, sizeof( INVENTORY_IN_SLOT ) ); 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->bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0 ); } if ( gpSMCurrentMerc->bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0 ); } } HandleTacticalEffectsOfEquipmentChange( gpSMCurrentMerc, uiHandPos, usOldItemIndex, usNewItemIndex ); // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { EndItemPointer( ); } // Setup a timer.... guiMouseOverItemTime = GetJA2Clock( ); gfCheckForMouseOverItem = TRUE; gbCheckForMouseOverItemPos = (INT8)uiHandPos; } */ } } } 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 ].usItem == NOTHING ) 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->bNewItemCount[ uiHandPos ] = 0; // Some global stuff here - for esc, etc // Check for # of slots in item if( ( gpSMCurrentMerc->inv[ uiHandPos ].ubNumberOfObjects > 1 && ItemSlotLimit( gpSMCurrentMerc->inv[ uiHandPos ].usItem, (UINT8)uiHandPos ) > 0 ) && ( guiCurrentScreen != MAP_SCREEN ) ) { if ( !InItemStackPopup( ) ) { //InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, SM_ITEMDESC_WIDTH, SM_ITEMDESC_HEIGHT ); InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, 216, INV_INTERFACE_START_Y, 314, ( SCREEN_HEIGHT - INV_INTERFACE_START_Y ) ); } } else { if ( !InItemDescriptionBox( ) ) { InitItemDescriptionBox( gpSMCurrentMerc, (UINT8)uiHandPos, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, 0 ); } } } else if (iReason & MSYS_CALLBACK_REASON_LOST_MOUSE ) { fRightDown = FALSE; fLeftDown = FALSE; } } void MergeMessageBoxCallBack( UINT8 ubExitValue ) { if ( ubExitValue == MSG_BOX_RETURN_YES ) { AttachObject( gpItemPointerSoldier, &( gpSMCurrentMerc->inv[ gubHandPos ] ), gpItemPointer ); // re-evaluate repairs gfReEvaluateEveryonesNothingToDo = TRUE; if (gpItemPointer->usItem == NOTHING) { // merge item consumed EndItemPointer(); fInterfacePanelDirty = DIRTYLEVEL2; } } else { UIHandleItemPlacement( gubHandPos, gusOldItemIndex, gusNewItemIndex, gfDeductPoints ); } } void HandleMouseOverSoldierFaceForContMove( SOLDIERTYPE *pSoldier, BOOLEAN fOn ) { FACETYPE *pFace; INT16 sGridNo; 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->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 ) { SOLDIERTYPE *pVehicle; 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->uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) { pVehicle = GetSoldierStructureForVehicle( gpSMCurrentMerc->iVehicleId ); HandleLocateSelectMerc( pVehicle->ubID, 0 ); } else { if ( CheckForMercContMove( gpSMCurrentMerc ) ) { // Continue ContinueMercMovement( gpSMCurrentMerc ); ErasePath( TRUE ); } else { HandleLocateSelectMerc( gpSMCurrentMerc->ubID, 0 ); } } } } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { // 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->uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) { } else { if ( gpSMCurrentMerc->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 ); } } 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 ) { BeginSoldierClimbDownRoof( gpSMCurrentMerc ); } if ( fNearHeigherLevel ) { BeginSoldierClimbUpRoof( gpSMCurrentMerc ); } if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bDirection, &bDirection ) ) { BeginSoldierClimbFence( gpSMCurrentMerc ); } } 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->uiStatusFlags & SOLDIER_MUTE ) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ MUTE_OFF_STR ], gpSMCurrentMerc->name ); gpSMCurrentMerc->uiStatusFlags &= ( ~SOLDIER_MUTE ); } else { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ MUTE_ON_STR ], gpSMCurrentMerc->name ); gpSMCurrentMerc->uiStatusFlags |= ( SOLDIER_MUTE ); } } } void BtnPrevMercCallback(GUI_BUTTON *btn,INT32 reason) { INT16 sID; 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 ); sID = FindPrevActiveAndAliveMerc( gpSMCurrentMerc, TRUE, TRUE ); gubSelectSMPanelToMerc = (UINT8)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) { INT16 sID; 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 ); sID = FindNextActiveAndAliveMerc( gpSMCurrentMerc, TRUE, TRUE ); // Give him the panel! gubSelectSMPanelToMerc = (UINT8)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 ); guiPreviousOptionScreen = 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) { } // WANNE 2 BOOLEAN InitializeTEAMPanelCoords( ) { TM_FACE_WIDTH = 48; TM_FACE_HEIGHT = 43; TM_APPANEL_HEIGHT = 56; TM_APPANEL_WIDTH = 16; // WANNE 2 TM_ENDTURN_X = (SCREEN_WIDTH - 133); //( 507 + INTERFACE_START_X ); TM_ENDTURN_Y = ( 9 + INTERFACE_START_Y ); TM_ROSTERMODE_X = (SCREEN_WIDTH - 133); //( 507 + INTERFACE_START_X ); TM_ROSTERMODE_Y = ( 45 + INTERFACE_START_Y ); TM_DISK_X = (SCREEN_WIDTH - 133); //( 507 + INTERFACE_START_X ); 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; 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; // WANNE 2 fDisplayOverheadMap = TRUE; /* OK i need to initialize coords here * Isnt it cool * any questions? joker * i moved it */ // 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; if (iResolution == 0) { FilenameForBPP("INTERFACE\\bottom_bar.sti", VObjectDesc.ImageFile); } else if (iResolution == 1) { FilenameForBPP("INTERFACE\\bottom_bar_800x600.sti", VObjectDesc.ImageFile); } else if (iResolution == 2) { 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 ) ); // 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 < 6; 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( MercPtrs[ 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 ); } //DEfine region for selected guy panel //MSYS_DefineRegion( &gSM_SELMERCPanalRegion, 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, // CURSOR_NORMAL, MSYS_NO_CALLBACK, SelectedMercButtonCallback ); // Add region //MSYS_AddRegion( &gSM_SELMERCPanalRegion ); 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 < 6; 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( MercPtrs[ 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 INT16 pStr[ 200 ], pMoraleStr[ 20 ]; // WANNE 2 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 ); // WANNE 2 // LOOP THROUGH ALL MERCS ON TEAM PANEL for ( cnt = 0, posIndex = 0; cnt < NUM_TEAM_SLOTS; 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 = MercPtrs[ gTeamPanel[ cnt ].ubID ]; if ( pSoldier->uiStatusFlags & ( SOLDIER_DRIVER ) ) { // Get soldier pointer for vehicle..... SOLDIERTYPE *pVehicle; pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId ); //OK, for each item, set dirty text if applicable! swprintf( (wchar_t *)pStr, TacticalStr[ DRIVER_POPUPTEXT ], pVehicle->bLife, pVehicle->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->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 < NUM_TEAM_SLOTS; cnt++, posIndex+= 2 ) { // GET SOLDIER if ( gTeamPanel[ cnt ].fOccupied ) { pSoldier = MercPtrs[ gTeamPanel[ cnt ].ubID ]; // Update animations.... if ( pSoldier->fClosePanel || pSoldier->fClosePanelToDie ) { pSoldier->sPanelFaceX = gFacesData[ pSoldier->iFaceIndex ].usFaceX; pSoldier->sPanelFaceY = gFacesData[ pSoldier->iFaceIndex ].usFaceY; } if ( fDirty != DIRTYLEVEL0 ) { // UPdate stats! if ( fDirty == DIRTYLEVEL2 ) { if ( pSoldier->bLife != 0 ) { if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) { swprintf( (wchar_t *)pStr, TacticalStr[ VEHICLE_VITAL_STATS_POPUPTEXT ], pSoldier->bLife, pSoldier->bLifeMax, pSoldier->bBreath, pSoldier->bBreathMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else if ( pSoldier->uiStatusFlags & SOLDIER_ROBOT ) { swprintf( (wchar_t *)pStr, gzLateLocalizedString[ 16 ], pSoldier->bLife, pSoldier->bLifeMax ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } else { GetMoraleString( pSoldier, (STR16)pMoraleStr ); swprintf( (wchar_t *)pStr, TacticalStr[ MERC_VITAL_STATS_POPUPTEXT ], pSoldier->bLife, pSoldier->bLifeMax, pSoldier->bBreath, pSoldier->bBreathMax, pMoraleStr ); SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), pStr ); } } else { SetRegionFastHelpText( &(gTEAM_BarsRegions[ cnt ]), L"" ); } } if ( !( pSoldier->uiStatusFlags & SOLDIER_DEAD ) ) { DrawLifeUIBarEx( pSoldier, sTEAMLifeXY[ posIndex ], sTEAMLifeXY[ posIndex + 1 ], TM_LIFEBAR_WIDTH, TM_LIFEBAR_HEIGHT, TRUE, FRAME_BUFFER ); if ( !( pSoldier->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->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, FALSE ) || GetUIApsToDisplay( pSoldier ) < 0 ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_DKRED ); } else { if ( MercUnderTheInfluence( pSoldier ) ) { SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_MCOLOR_LTBLUE ); } 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, 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->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, 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 ); } } } UpdateTEAMPanel( ); if( fRenderRadarScreen == TRUE ) { // Render clock RenderClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); RenderTownIDString( ); } else { RemoveMouseRegionForPauseOfClock( ); } } BOOLEAN CreateTEAMPanelButtons( ) { UINT8 ubString[48]; FilenameForBPP("INTERFACE\\bottom_bar_buttons.sti", (STR)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( UINT8 ubNewID ) { // Ignore ther ID given! // ALWYAS USE CURRENT MERC! fInterfacePanelDirty = DIRTYLEVEL2; UpdateTEAMPanel( ); } void UpdateTEAMPanel( ) { INT32 cnt; if ( (gTacticalStatus.ubCurrentTeam != gbPlayerNum) || (gTacticalStatus.uiFlags & REALTIME ) || !(gTacticalStatus.uiFlags & INCOMBAT ) ) { DisableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); } else { EnableButton( iTEAMPanelButtons[ TEAM_DONE_BUTTON ] ); } if ( gTacticalStatus.uiFlags & ENGAGED_IN_CONV ) { DisableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); } else { EnableButton( iTEAMPanelButtons[ TEAM_MAP_SCREEN_BUTTON ] ); } 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 < 6; 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 { EnableButton( iTEAMPanelButtons[ CHANGE_SQUAD_BUTTON ] ); for ( cnt = 0; cnt < 6; 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->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 ) { UINT8 ubID, ubSoldierID; SOLDIERTYPE *pSoldier; ubID = (UINT8) 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 = MercPtrs[ 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 ) { UINT8 ubID, ubSoldierID; ubID = (UINT8) 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 ( !MercPtrs[ ubSoldierID ]->bActive ) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { if ( MercPtrs[ ubSoldierID ]->uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) { } else { SOLDIERTYPE *pSoldier; pSoldier = MercPtrs[ ubSoldierID ]; if ( pSoldier->bOppCnt > 0 ) { // Cycle.... CycleVisibleEnemies( pSoldier ); } else { MercFacePanelCallback( pRegion, iReason ); } } } } void MercFacePanelCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT8 ubID, ubSoldierID; SOLDIERTYPE *pVehicle; ubID = (UINT8) 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; } // Now use soldier ID values ubSoldierID = gTeamPanel[ ubID ].ubID; if ( ubSoldierID == NOBODY ) { return; } if (iReason & MSYS_CALLBACK_REASON_INIT) { return; } if ( !MercPtrs[ ubSoldierID ]->bActive ) { return; } if (iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN) { if ( !gfInItemPickupMenu && gpItemPointer == NULL ) { if ( MercPtrs[ ubSoldierID ]->uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) { pVehicle = GetSoldierStructureForVehicle( MercPtrs[ ubSoldierID ]->iVehicleId ); HandleLocateSelectMerc( pVehicle->ubID, 0 ); } else { if ( !InOverheadMap( ) ) { // If we can continue a move, do so! if ( CheckForMercContMove( MercPtrs[ ubSoldierID ] ) ) { // Continue ContinueMercMovement( MercPtrs[ ubSoldierID ] ); ErasePath( TRUE ); } else { HandleLocateSelectMerc( ubSoldierID, 0 ); } } else { SelectSoldier( ubSoldierID, TRUE, FALSE ); } } } } else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) { if ( !InOverheadMap( ) ) { // Only if guy is not dead! if ( !( MercPtrs[ ubSoldierID ]->uiStatusFlags & SOLDIER_DEAD ) && !AM_AN_EPC( MercPtrs[ ubSoldierID ] ) && !( MercPtrs[ ubSoldierID ]->uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) ) { gfSwitchPanel = TRUE; gbNewPanel = SM_PANEL; gubNewPanelParam = (UINT8)ubSoldierID; } } } } extern void InternalSelectSoldier( UINT16 usSoldierID, BOOLEAN fAcknowledge, BOOLEAN fForceReselect, BOOLEAN fFromUI ); void HandleLocateSelectMerc( UINT8 ubID, INT8 bFlag ) { BOOLEAN fSelect = FALSE; if( !MercPtrs[ ubID ]->bActive ) { return; } if ( gpItemPointer != NULL ) { // ATE: Disable for feel purposes.... //return; } // ATE: No matter what we do... if below OKLIFE, just locate.... if ( MercPtrs[ ubID ]->bLife < OKLIFE ) { LocateSoldier( ubID, SETLOCATOR ); return; } if ( _KeyDown( ALT ) ) { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) { // Select merc InternalSelectSoldier( ubID, TRUE, FALSE, TRUE); MercPtrs[ ubID ]->fFlashLocator = FALSE; ResetMultiSelection( ); } else { // Just locate.... LocateSoldier( ubID, SETLOCATOR ); } } else { if ( MercPtrs[ ubID ]->fFlashLocator == FALSE ) { if ( gGameSettings.fOptions[ TOPTION_OLD_SELECTION_METHOD ] ) { // If we are currently selected, slide to location if ( ubID == gusSelectedSoldier ) { SlideTo( NOWHERE, gusSelectedSoldier, NOBODY ,SETLOCATOR); } else { LocateSoldier( ubID, SETLOCATOR ); } } else { if ( ubID == gusSelectedSoldier ) { SlideTo( NOWHERE, gusSelectedSoldier, NOBODY ,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( NOWHERE, gusSelectedSoldier, NOBODY ,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 ( !( MercPtrs[ ubID ]->uiStatusFlags & SOLDIER_DEAD ) ) { InternalSelectSoldier( ubID, TRUE, FALSE, TRUE ); } } } ResetMultiSelection( ); // Handle locate select merc.... HandleMouseOverSoldierFaceForContMove( MercPtrs[ ubID ], TRUE ); } void ShowRadioLocator( UINT8 ubID, UINT8 ubLocatorSpeed ) { RESETTIMECOUNTER( MercPtrs[ ubID ]->FlashSelCounter, FLASH_SELECTOR_DELAY ); //LocateSoldier( ubID, FALSE ); // IC - this is already being done outside of this function :) MercPtrs[ ubID ]->fFlashLocator = TRUE; //gbPanelSelectedGuy = ubID; IC - had to move this outside to make this function versatile MercPtrs[ ubID ]->sLocatorFrame = 0; if ( ubLocatorSpeed == SHOW_LOCATOR_NORMAL ) { // If we are an AI guy, and we have the baton, make lower... // ( MercPtrs[ ubID ]->uiStatusFlags & SOLDIER_UNDERAICONTROL && MercPtrs[ ubID ]->bTeam != gbPlayerNum ) // //ercPtrs[ ubID ]->ubNumLocateCycles = 3; // //se // MercPtrs[ ubID ]->ubNumLocateCycles = 5; // } else { MercPtrs[ ubID ]->ubNumLocateCycles = 3; } } void EndRadioLocator( UINT8 ubID ) { MercPtrs[ ubID ]->fFlashLocator = FALSE; MercPtrs[ ubID ]->fShowLocator = FALSE; } void CheckForFacePanelStartAnims( SOLDIERTYPE *pSoldier, INT16 sPanelX, INT16 sPanelY ) { if ( !pSoldier->bActive ) { return; } if ( pSoldier->fUIdeadMerc ) { // pSoldier->sPanelFaceX = sPanelX; // pSoldier->sPanelFaceY = sPanelY; } } void FinishAnySkullPanelAnimations( ) { SOLDIERTYPE *pTeamSoldier; INT32 cnt2; cnt2 = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; // run through list for ( pTeamSoldier = MercPtrs[ cnt2 ]; cnt2 <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt2++,pTeamSoldier++ ) { if ( pTeamSoldier->bActive && pTeamSoldier->bLife == 0 ) { if ( pTeamSoldier->fUIdeadMerc || pTeamSoldier->fClosePanelToDie ) { HandlePlayerTeamMemberDeathAfterSkullAnimation( pTeamSoldier ); pTeamSoldier->fUIdeadMerc = FALSE; pTeamSoldier->fClosePanelToDie = FALSE; } } } } void HandlePanelFaceAnimations( SOLDIERTYPE *pSoldier ) { if ( pSoldier->bTeam != gbPlayerNum ) { return; } if ( !pSoldier->bActive ) { return; } if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) { // Don't do this for a vehice. return; } // If this is the first time we are active, open panel! if ( pSoldier->fUInewMerc ) { pSoldier->fUInewMerc = FALSE; } if ( pSoldier->fUICloseMerc ) { pSoldier->fUICloseMerc = FALSE; } if ( pSoldier->fUIdeadMerc ) { pSoldier->sPanelFaceX = gFacesData[ pSoldier->iFaceIndex ].usFaceX; pSoldier->sPanelFaceY = gFacesData[ pSoldier->iFaceIndex ].usFaceY; pSoldier->fUIdeadMerc = FALSE; pSoldier->fClosePanel = TRUE; pSoldier->fClosePanelToDie = TRUE; pSoldier->ubClosePanelFrame = 0; pSoldier->ubDeadPanelFrame = 0; RESETTIMECOUNTER( pSoldier->PanelAnimateCounter, 160 ); } if ( pSoldier->fClosePanel ) { if ( TIMECOUNTERDONE( pSoldier->PanelAnimateCounter, 160 ) ) { pSoldier->ubClosePanelFrame++; if ( pSoldier->ubClosePanelFrame > 5 ) { pSoldier->fClosePanel = FALSE; pSoldier->ubClosePanelFrame = 5; if ( pSoldier->fClosePanelToDie ) { pSoldier->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->PanelAnimateCounter, 160 ); } } if ( pSoldier->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->fDeadPanel ) { if ( TIMECOUNTERDONE( pSoldier->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->fDeadPanel = FALSE; pSoldier->ubDeadPanelFrame = 5; pSoldier->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->PanelAnimateCounter, 160 ); } } if ( pSoldier->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->fOpenPanel ) { if ( TIMECOUNTERDONE( pSoldier->PanelAnimateCounter, 160 ) ) { pSoldier->bOpenPanelFrame--; if ( pSoldier->bOpenPanelFrame < 0 ) { pSoldier->fOpenPanel = FALSE; pSoldier->bOpenPanelFrame = 0; if ( !gFacesData[ pSoldier->iFaceIndex ].fDisabled ) { RestoreExternBackgroundRect( pSoldier->sPanelFaceX, pSoldier->sPanelFaceY, TM_FACE_WIDTH, TM_FACE_HEIGHT ); } } RESETTIMECOUNTER( pSoldier->PanelAnimateCounter, 160 ); } } if ( pSoldier->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->uiStatusFlags & SOLDIER_DEAD ) ) { if ( pSoldier->uiStatusFlags & SOLDIER_DRIVER ) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiVEHINV, 0, sX, sY, VO_BLT_SRCTRANSPARENCY, NULL ); RestoreExternBackgroundRect( sX, sY, (INT16)( TM_INV_WIDTH ) , (INT16)( TM_INV_HEIGHT ) ); } 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->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 ) { UINT8 ubID, ubSoldierID; ubID = (UINT8) 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 ( !MercPtrs[ 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 ) { UINT8 ubID, ubSoldierID; UINT16 usOldHandItem; ubID = (UINT8) 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 ) { // Change to use cursor mode... guiPendingOverrideEvent = A_ON_TERRAIN; } if (iReason == MSYS_CALLBACK_REASON_RBUTTON_UP ) { if ( !AM_A_ROBOT( MercPtrs[ ubSoldierID ] ) ) { usOldHandItem = MercPtrs[ ubSoldierID ]->inv[HANDPOS].usItem; //SwapOutHandItem( MercPtrs[ ubSoldierID ] ); SwapHandItems( MercPtrs[ ubSoldierID ] ); ReLoadSoldierAnimationDueToHandItemChange( MercPtrs[ ubSoldierID ], usOldHandItem, MercPtrs[ ubSoldierID ]->inv[HANDPOS].usItem ); fInterfacePanelDirty = DIRTYLEVEL2; } } } void TMClickSecondHandInvCallback( MOUSE_REGION * pRegion, INT32 iReason ) { UINT8 ubID, ubSoldierID; UINT16 usOldHandItem; ubID = (UINT8) 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 ( MercPtrs[ ubSoldierID ]->uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { ExitVehicle( MercPtrs[ ubSoldierID ] ); } } if (iReason == MSYS_CALLBACK_REASON_RBUTTON_UP ) { if ( MercPtrs[ ubSoldierID ]->uiStatusFlags & ( SOLDIER_PASSENGER | SOLDIER_DRIVER ) ) { } else { if ( !AM_A_ROBOT( MercPtrs[ ubSoldierID ] ) ) { usOldHandItem = MercPtrs[ ubSoldierID ]->inv[HANDPOS].usItem; SwapHandItems( MercPtrs[ ubSoldierID ] ); ReLoadSoldierAnimationDueToHandItemChange( MercPtrs[ ubSoldierID ], usOldHandItem, MercPtrs[ ubSoldierID ]->inv[HANDPOS].usItem ); fInterfacePanelDirty = DIRTYLEVEL2; } } } } BOOLEAN PlayerExistsInSlot( UINT8 ubID ) { INT32 cnt; for ( cnt = 0; cnt < NUM_TEAM_SLOTS; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubID ) { return( TRUE ); } } } return( FALSE ); } INT8 GetTeamSlotFromPlayerID( UINT8 ubID ) { INT8 cnt; for ( cnt = 0; cnt < NUM_TEAM_SLOTS; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubID ) { return( cnt ); } } } return( -1 ); } BOOLEAN RemovePlayerFromTeamSlotGivenMercID( UINT8 ubMercID ) { INT32 cnt; for ( cnt = 0; cnt < NUM_TEAM_SLOTS; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { if ( gTeamPanel[ cnt ].ubID == ubMercID ) { RemovePlayerFromInterfaceTeamSlot( (UINT8)cnt ); return( TRUE ); } } } return( FALSE ); } void AddPlayerToInterfaceTeamSlot( UINT8 ubID ) { INT32 cnt; // If we are a vehicle don't ever add..... if ( MercPtrs[ ubID ]->uiStatusFlags & SOLDIER_VEHICLE ) { return; } if ( !PlayerExistsInSlot( ubID ) ) { // Find a free slot for ( cnt = 0; cnt < NUM_TEAM_SLOTS; 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 MercPtrs[ ubID ]->fUInewMerc = TRUE; break; } } } } BOOLEAN InitTEAMSlots( ) { INT32 cnt; for ( cnt = 0; cnt < NUM_TEAM_SLOTS; cnt++ ) { gTeamPanel[ cnt ].fOccupied = FALSE; gTeamPanel[ cnt ].ubID = NOBODY; } return( TRUE ); } BOOLEAN GetPlayerIDFromInterfaceTeamSlot( UINT8 ubPanelSlot, UINT8 *pubID ) { if ( ubPanelSlot >= NUM_TEAM_SLOTS ) { return( FALSE ); } if ( gTeamPanel[ ubPanelSlot ].fOccupied ) { *pubID = gTeamPanel[ ubPanelSlot ].ubID; return( TRUE ); } else { return( FALSE ); } } void RemoveAllPlayersFromSlot( ) { int cnt; for ( cnt = 0; cnt < NUM_TEAM_SLOTS; cnt++ ) { RemovePlayerFromInterfaceTeamSlot( (UINT8)cnt ); } } BOOLEAN RemovePlayerFromInterfaceTeamSlot( UINT8 ubPanelSlot ) { if ( ubPanelSlot >= NUM_TEAM_SLOTS ) { return( FALSE ); } if ( gTeamPanel[ ubPanelSlot ].fOccupied ) { if ( !( MercPtrs[ gTeamPanel[ ubPanelSlot ].ubID ]->uiStatusFlags & SOLDIER_DEAD ) ) { // Set Id to close MercPtrs[ gTeamPanel[ ubPanelSlot ].ubID ]->fUICloseMerc = TRUE; } // Set face to inactive... SetAutoFaceInActive( MercPtrs[ 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 ); } } void RenderTownIDString( ) { CHAR16 zTownIDString[80]; INT16 sFontX, sFontY; // Render town, position SetFont( COMPFONT ); SetFontForeground( 183 ); SetFontBackground( FONT_BLACK ); GetSectorIDString( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, zTownIDString, TRUE ); ReduceStringLength( zTownIDString, 80, COMPFONT ); VarFindFontCenterCoordinates( LOCATION_NAME_X , LOCATION_NAME_Y, 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->fBetweenSectors && pSoldier->bInSector ) { // IF on duty.... if( ( pSoldier->bAssignment == CurrentSquad( ) )|| ( SoldierIsDeadAndWasOnSquad( pSoldier, ( INT8 )( CurrentSquad( ) ) ) ) ) { if( pSoldier->bAssignment == ASSIGNMENT_DEAD ) { pSoldier->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->uiStatusFlags & SOLDIER_VEHICLE ) { AddPassangersToTeamPanel( pSoldier->bVehicleID ); } } } else { // Make sure we are NOT in this world! // Set gridno to one that's not visib;l RemoveSoldierFromGridNo( pSoldier ); // Remove slot from tactical RemoveMercSlot( pSoldier ); } } } } UINT8 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 < NUM_TEAM_SLOTS; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { // Set Id to close pTeamSoldier = MercPtrs[ gTeamPanel[ cnt ].ubID ]; if ( fOnlyRegularMercs ) { if ( pTeamSoldier->bActive && ( AM_AN_EPC( pTeamSoldier ) || AM_A_ROBOT( pTeamSoldier ) ) ) { continue; } } if ( fGoodForLessOKLife ) { if ( pTeamSoldier->bLife > 0 && pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == gbPlayerNum && pTeamSoldier->bAssignment < ON_DUTY && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( (UINT8)gTeamPanel[ cnt ].ubID ); } } else { if ( OK_CONTROLLABLE_MERC( pTeamSoldier) && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( (UINT8)gTeamPanel[ cnt ].ubID ); } } } } if ( ( gusSelectedSoldier != NO_SOLDIER ) && ( 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( MercPtrs[ gusSelectedSoldier ] ); if ( pNewSoldier->bAssignment != iCurrentSquad ) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) ); return( pNewSoldier->ubID ); } } } // none found, // Now loop back for ( cnt = 0; cnt < bFirstID; cnt++ ) { if ( gTeamPanel[ cnt ].fOccupied ) { pTeamSoldier = MercPtrs[ gTeamPanel[ cnt ].ubID ]; if ( fOnlyRegularMercs ) { if ( pTeamSoldier->bActive && ( AM_AN_EPC( pTeamSoldier ) || AM_A_ROBOT( pTeamSoldier ) ) ) { continue; } } if ( fGoodForLessOKLife ) { if ( pTeamSoldier->bLife > 0 && pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == gbPlayerNum && pTeamSoldier->bAssignment < ON_DUTY && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( (UINT8)gTeamPanel[ cnt ].ubID ); } } else { if ( OK_CONTROLLABLE_MERC( pTeamSoldier) && OK_INTERRUPT_MERC( pTeamSoldier ) && pSoldier->bAssignment == pTeamSoldier->bAssignment ) { return( (UINT8)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; InitKeyRingPopup( pSoldier, 0, 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 = &( Menptr[ 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 , 0, 107, 261, 359 ); InvalidateRegion( 0, 107, 261, 359 ); } InitKeyRingPopup( pSoldier, 0, 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 memset( &gMoveingItem, 0, sizeof( INVENTORY_IN_SLOT ) ); } else { memset( &InvSlot, 0, sizeof( INVENTORY_IN_SLOT ) ); // Return if empty //if ( gpSMCurrentMerc->inv[ uiHandPos ].usItem == NOTHING ) // 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 ].bGunStatus; //memcpy( &InvSlot.ItemObject, &gpSMCurrentMerc->inv[ uiHandPos ], sizeof( OBJECTTYPE ) ); //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 { UINT8 ubSrcID, ubDestID; BOOLEAN fOKToGo = FALSE; BOOLEAN fDeductPoints = FALSE; if( ( gpItemPointer ->usItem < FIRST_KEY ) || ( gpItemPointer ->usItem > KEY_32 ) ) { return; } // ATE: OK, get source, dest guy if different... check for and then charge appropriate APs ubSrcID = ( UINT8 )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->bLife >= CONSCIOUSNESS ) { if ( EnoughPoints( gpItemPointerSoldier, 2, 0, TRUE ) ) { fOKToGo = TRUE; } } else { fOKToGo = TRUE; } // Should we go on? if ( fOKToGo ) { if ( gpSMCurrentMerc->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->ubKeyID) { // Try to place here if ( ( iNumberOfKeysTaken = AddKeysToSlot( gpItemPopupSoldier, ( INT8 )uiKeyRing, gpItemPointer ) ) ) { if ( fDeductPoints ) { // Deduct points if ( gpItemPointerSoldier->bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0 ); } if ( gpItemPopupSoldier->bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPopupSoldier, 2, 0 ); } } // Dirty fInterfacePanelDirty = DIRTYLEVEL2; gpItemPointer->ubNumberOfObjects -= ( UINT8 )iNumberOfKeysTaken; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { 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->bLife >= CONSCIOUSNESS ) { DeductPoints( gpItemPointerSoldier, 2, 0 ); } if ( gpSMCurrentMerc->bLife >= CONSCIOUSNESS ) { DeductPoints( gpSMCurrentMerc, 2, 0 ); } } // 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( 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 ); if( fDontDrawButtons ) { //ATM: //Go through the buttons that will be under the ShopKeepers ATM panel and disable them 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; //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; 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; } } 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"%d", gpItemPointer->uiMoneyAmount ); InsertCommasForDollarFigure( zMoney ); InsertDollarSignInToString( zMoney ); //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(); } 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, SM_ITEMDESC_START_X, SM_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->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! gfEnteringMapScreen = TRUE; } 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! ReLoadSoldierAnimationDueToHandItemChange( pSoldier, usOldItem, usNewItem ); } // if this is head gear if ( uiInvPos == HEAD1POS || uiInvPos == HEAD2POS ) { // Could be because of GOGGLES change... Re-create light... DeleteSoldierLight( pSoldier ); PositionSoldierLight( pSoldier ); } } 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; } } } }