diff --git a/Init.cpp b/Init.cpp index 207884248..605a13a7b 100644 --- a/Init.cpp +++ b/Init.cpp @@ -1514,12 +1514,6 @@ UINT32 InitializeJA2(void) // INit intensity tables BuildIntensityTable( ); - // Init Event Manager - if ( !InitializeEventManager( ) ) - { - return( ERROR_SCREEN ); - } - // Initailize World if ( !InitializeWorld( ) ) { @@ -1698,8 +1692,6 @@ void ShutdownJA2(void) ShutdownJA2Sound( ); - ShutdownEventManager( ); - ShutdownBaseDirtyRectQueue( ); // Unload any text box images! diff --git a/Standard Gaming Platform/vobject.cpp b/Standard Gaming Platform/vobject.cpp index d8ade50c9..c784a3833 100644 --- a/Standard Gaming Platform/vobject.cpp +++ b/Standard Gaming Platform/vobject.cpp @@ -51,7 +51,6 @@ -HLIST ghVideoObjects = NULL; BOOLEAN gfVideoObjectsInit=FALSE; #ifndef SGP_VIDEO_DEBUGGING diff --git a/Standard Gaming Platform/vobject.h b/Standard Gaming Platform/vobject.h index 0cdd55533..c49648990 100644 --- a/Standard Gaming Platform/vobject.h +++ b/Standard Gaming Platform/vobject.h @@ -225,7 +225,6 @@ BOOLEAN GetETRLEPixelValue( UINT8 * pDest, HVOBJECT hVObject, UINT16 usETLREInde // Globals // // **************************************************************************** -extern HLIST ghVideoObjects; // **************************************************************************** // diff --git a/Standard Gaming Platform/vsurface.cpp b/Standard Gaming Platform/vsurface.cpp index 8636b2c0e..0df8bab77 100644 --- a/Standard Gaming Platform/vsurface.cpp +++ b/Standard Gaming Platform/vsurface.cpp @@ -98,18 +98,13 @@ void CheckValidVSurfaceIndex( UINT32 uiIndex ); INT32 giMemUsedInSurfaces; - -//OBSOLETE!!!!!!!!! -HLIST ghVideoSurfaces = NULL; -//OBSOLETE!!!!!!!!! - - HVSURFACE ghPrimary = NULL; HVSURFACE ghBackBuffer = NULL; HVSURFACE ghFrameBuffer = NULL; HVSURFACE ghMouseBuffer = NULL; #include +#include extern std::map g_SurfaceRectangle; @@ -1161,11 +1156,7 @@ HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc ) // // Allocate memory for Video Surface data and initialize // - - hVSurface = (HVSURFACE) MemAlloc( sizeof( SGPVSurface ) ); - memset( hVSurface, 0, sizeof( SGPVSurface ) ); - CHECKF( hVSurface != NULL ); - + hVSurface = new SGPVSurface{}; hVSurface->usHeight = usHeight; hVSurface->usWidth = usWidth; // BF : since we use a 16bpp framebuffer and images are converted to that format, @@ -1178,7 +1169,6 @@ HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc ) hVSurface->pPalette = NULL; hVSurface->p16BPPPalette = NULL; hVSurface->TransparentColor = FROMRGB( 0, 0, 0 ); - hVSurface->RegionList = CreateList( DEFAULT_NUM_REGIONS, sizeof( VSURFACE_REGION ) ); hVSurface->fFlags = 0; hVSurface->pClipper = NULL; @@ -1647,12 +1637,6 @@ BOOLEAN DeleteVideoSurface( HVSURFACE hVSurface ) hVSurface->pPalette = NULL; } - //if ( hVSurface->pClipper != NULL ) - //{ - // Release Clipper - // DDReleaseClipper( (LPDIRECTDRAWCLIPPER)hVSurface->pClipper ); - //} - // Get surface pointer lpDDSurface = (LPDIRECTDRAWSURFACE2)hVSurface->pSurfaceData; @@ -1670,7 +1654,7 @@ BOOLEAN DeleteVideoSurface( HVSURFACE hVSurface ) } // Release region data - DeleteList( hVSurface->RegionList ); + hVSurface->RegionList.clear(); //If there is a 16bpp palette, free it if( hVSurface->p16BPPPalette != NULL ) @@ -1682,8 +1666,7 @@ BOOLEAN DeleteVideoSurface( HVSURFACE hVSurface ) giMemUsedInSurfaces -= ( hVSurface->usHeight * hVSurface->usWidth * ( hVSurface->ubBitDepth / 8 ) ); // Release object - MemFree( hVSurface ); - + delete hVSurface; return( TRUE ); } @@ -1768,7 +1751,7 @@ BOOLEAN GetNumRegions( HVSURFACE hVSurface , UINT32 *puiNumRegions ) { Assert( hVSurface ); - *puiNumRegions = ListSize( hVSurface->RegionList ); + *puiNumRegions = hVSurface->RegionList.size(); return( TRUE ); @@ -1780,7 +1763,7 @@ BOOLEAN AddVSurfaceRegion( HVSURFACE hVSurface, VSURFACE_REGION *pNewRegion ) Assert( pNewRegion != NULL ); // Add new region to list - hVSurface->RegionList = AddtoList( hVSurface->RegionList, pNewRegion, ListSize( hVSurface->RegionList ) ); + hVSurface->RegionList.push_back(*pNewRegion); return( TRUE ); } @@ -1801,29 +1784,10 @@ BOOLEAN AddVSurfaceRegions( HVSURFACE hVSurface, VSURFACE_REGION **ppNewRegions, return( TRUE ); } -BOOLEAN RemoveVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex ) -{ - VSURFACE_REGION aRegion; - - Assert( hVSurface != NULL ); - - return( RemfromList( hVSurface->RegionList, &aRegion, usIndex ) ); - -} - BOOLEAN ClearAllVSurfaceRegions( HVSURFACE hVSurface ) { - UINT32 uiListSize; - Assert( hVSurface != NULL ); - - uiListSize = ListSize( hVSurface->RegionList ); - - for ( INT32 cnt = uiListSize - 1; cnt >= 0; cnt-- ) - { - RemoveVSurfaceRegion( hVSurface, (UINT16)cnt ); - } - + hVSurface->RegionList.clear(); return( TRUE ); } @@ -1831,11 +1795,12 @@ BOOLEAN GetVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_REGION { Assert( hVSurface != NULL ); - if ( !PeekList( hVSurface->RegionList, aRegion, usIndex ) ) + if (usIndex >= hVSurface->RegionList.size()) { return( FALSE ); } + *aRegion = hVSurface->RegionList[usIndex]; return( TRUE ); } @@ -1858,15 +1823,12 @@ BOOLEAN ReplaceVSurfaceRegion( HVSURFACE hVSurface , UINT16 usIndex, VSURFACE_RE Assert( hVSurface != NULL ); - // Validate index given - if ( !PeekList( hVSurface->RegionList, &OldRegion, usIndex ) ) + if (usIndex >= hVSurface->RegionList.size()) { return( FALSE ); } - // Replace information - hVSurface->RegionList = AddtoList( hVSurface->RegionList, aRegion, usIndex ); - + hVSurface->RegionList[usIndex] = *aRegion; return( TRUE ); } @@ -1875,11 +1837,14 @@ BOOLEAN AddVSurfaceRegionAtIndex( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_ Assert( hVSurface != NULL ); Assert( pNewRegion != NULL ); - // Add new region to list - hVSurface->RegionList = AddtoList( hVSurface->RegionList, pNewRegion, usIndex ); - - return( TRUE ); + if (usIndex >= hVSurface->RegionList.size()) + { + return(FALSE); + } + auto pos = hVSurface->RegionList.begin() + usIndex; + hVSurface->RegionList.insert(pos, *pNewRegion); + return(TRUE); } // ******************************************************************* @@ -2161,7 +2126,7 @@ HVSURFACE CreateVideoSurfaceFromDDSurface( LPDIRECTDRAWSURFACE2 lpDDSurface ) // Allocate Video Surface struct - hVSurface = (HVSURFACE) MemAlloc( sizeof( SGPVSurface ) ); + hVSurface = new SGPVSurface{}; // Set values based on DD Surface given DDGetSurfaceDescription ( lpDDSurface, &DDSurfaceDesc ); @@ -2173,7 +2138,6 @@ HVSURFACE CreateVideoSurfaceFromDDSurface( LPDIRECTDRAWSURFACE2 lpDDSurface ) hVSurface->pSurfaceData = (PTR)lpDDSurface; hVSurface->pSurfaceData1 = NULL; hVSurface->pSavedSurfaceData = NULL; - hVSurface->RegionList = CreateList( DEFAULT_NUM_REGIONS, sizeof( VSURFACE_REGION ) ); hVSurface->fFlags = 0; // Get and Set palette, if attached, allow to fail diff --git a/Standard Gaming Platform/vsurface.h b/Standard Gaming Platform/vsurface.h index 579574235..8564aab5f 100644 --- a/Standard Gaming Platform/vsurface.h +++ b/Standard Gaming Platform/vsurface.h @@ -5,6 +5,7 @@ #include "container.h" #include "himage.h" #include "vobject.h" +#include /////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -105,7 +106,7 @@ typedef struct UINT16 *p16BPPPalette; // A 16BPP palette used for 8->16 blits COLORVAL TransparentColor; // Defaults to 0,0,0 PTR pClipper; // A void pointer encapsolated as a clipper Surface - HLIST RegionList; // A List of regions within the video Surface + std::vector RegionList; // A List of regions within the video Surface } SGPVSurface, *HVSURFACE; @@ -240,7 +241,6 @@ BOOLEAN DeleteVideoSurfaceFromIndex( UINT32 uiIndex ); BOOLEAN AddVSurfaceRegion( HVSURFACE hVSurface, VSURFACE_REGION *pNewRegion ); BOOLEAN AddVSurfaceRegionAtIndex( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_REGION *pNewRegion ); BOOLEAN AddVSurfaceRegions( HVSURFACE hVSurface, VSURFACE_REGION **ppNewRegions, UINT16 uiNumRegions ); -BOOLEAN RemoveVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex ); BOOLEAN ClearAllVSurfaceRegions( HVSURFACE hVSurface ); BOOLEAN GetVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_REGION *aRegion ); BOOLEAN GetNumRegions( HVSURFACE hVSurface , UINT32 *puiNumRegions ); @@ -286,4 +286,4 @@ BOOLEAN ShadowVideoSurfaceRectUsingLowPercentTable( UINT32 uiDestVSurface, INT32 #endif */ -#endif \ No newline at end of file +#endif diff --git a/Tactical/Dialogue Control.cpp b/Tactical/Dialogue Control.cpp index 16653ffa9..cb646341e 100644 --- a/Tactical/Dialogue Control.cpp +++ b/Tactical/Dialogue Control.cpp @@ -52,6 +52,7 @@ #include "qarray.h" #include "Soldier Profile.h" #include +#include #include "Auto Resolve.h" #include "connect.h" @@ -168,8 +169,8 @@ UINT8 gubNumStopTimeQuotes = 2; // QUEUE UP DIALOG! -#define INITIAL_Q_SIZE 10 -HQUEUE ghDialogueQ = NULL; +std::queue ghDialogueQ; + FACETYPE *gpCurrentTalkingFace = NULL; UINT8 gubCurrentTalkingID = NO_PROFILE; INT8 gbUIHandlerID; @@ -283,40 +284,18 @@ BOOLEAN DialogueActive( ) BOOLEAN InitalizeDialogueControl() { - ghDialogueQ = CreateQueue( INITIAL_Q_SIZE, sizeof( DIALOGUE_Q_STRUCT_PTR ) ); - - // Initalize subtitle popup box - // - + EmptyDialogueQueue(); giNPCReferenceCount = 0; - - if ( ghDialogueQ == NULL ) - { - return( FALSE ); - } - else - { - return( TRUE ); - } + return( TRUE ); } void ShutdownDialogueControl() { - if( ghDialogueQ != NULL ) - { - // Empty - EmptyDialogueQueue( ); - - // Delete - DeleteQueue( ghDialogueQ ); - ghDialogueQ=NULL; - } - // shutdown external static NPC faces ShutdownStaticExternalNPCFaces( ); - // gte rid of portraits for cars + // get rid of portraits for cars UnLoadCarPortraits( ); // } @@ -373,30 +352,9 @@ void ShutdownStaticExternalNPCFaces( void ) void EmptyDialogueQueue( ) { // If we have anything left in the queue, remove! - if( ghDialogueQ != NULL ) + while( !ghDialogueQ.empty() ) { -/* -DEF: commented out because the Queue system ?? uses a contiguous memory block ??? for the queue - so you cant delete a single node. The DeleteQueue, below, will free the entire memory block - - numDialogueItems = QueueSize( ghDialogueQ ); - - for ( cnt = numDialogueItems-1; cnt >= 0; cnt-- ) - { - if ( PeekQueue( ghDialogueQ, &QItem ) ) - { - MemFree( QItem ); - } - } -*/ - - // Delete list - DeleteQueue( ghDialogueQ ); - ghDialogueQ=NULL; - - // Recreate list - ghDialogueQ = CreateQueue( INITIAL_Q_SIZE, sizeof( DIALOGUE_Q_STRUCT_PTR ) ); - + ghDialogueQ.pop(); } gfWaitingForTriggerTimer = FALSE; @@ -405,17 +363,20 @@ DEF: commented out because the Queue system ?? uses a contiguous memory block ?? BOOLEAN DialogueQueueIsEmpty( ) { - if( ghDialogueQ != NULL ) - { - INT32 numDialogueItems = QueueSize( ghDialogueQ ); + return( ghDialogueQ.empty() ); +} - if ( numDialogueItems == 0 ) - { - return( TRUE ); - } + +static bool PopFromDialogueQueue(DIALOGUE_Q_STRUCT_PTR pDialogue) +{ + if (!ghDialogueQ.empty()) + { + *pDialogue = ghDialogueQ.front(); + ghDialogueQ.pop(); + return (true); } - return( FALSE ); + return false; } @@ -434,6 +395,7 @@ BOOLEAN DialogueQueueIsEmptyOrSomebodyTalkingNow( ) return( TRUE ); } + void DialogueAdvanceSpeech( ) { // Shut them up! @@ -507,7 +469,6 @@ void HandleDialogueUIAdjustments( ) void HandleDialogue( ) { INT32 iQSize; - DIALOGUE_Q_STRUCT *QItem; static BOOLEAN fOldEngagedInConvFlagOn = FALSE; BOOLEAN fDoneTalking = FALSE; SOLDIERTYPE *pSoldier = NULL; @@ -520,7 +481,7 @@ void HandleDialogue( ) return; } - iQSize = QueueSize( ghDialogueQ ); + iQSize = ghDialogueQ.size(); if ( iQSize == 0 && gpCurrentTalkingFace == NULL ) { @@ -787,19 +748,18 @@ void HandleDialogue( ) // If here, pick current one from queue and play // Get new one - RemfromQueue( ghDialogueQ, &QItem ); - + DIALOGUE_Q_STRUCT QItem; + PopFromDialogueQueue(&QItem); + // If we are in auto bandage, ignore any quotes! if ( gTacticalStatus.fAutoBandageMode ) { - if( QItem->fPauseTime ) + if( QItem.fPauseTime ) { UnLockPauseState(); UnPauseGame(); } - // Delete memory - MemFree( QItem ); return; } @@ -807,30 +767,27 @@ void HandleDialogue( ) // Alrighty, check if this one is to be delayed until we gain control. // If so, place it back in! - if ( QItem->fDelayed ) + if ( QItem.fDelayed ) { // Are we not in our turn and not interrupted if ( gTacticalStatus.ubCurrentTeam != gbPlayerNum ) { //Place back in! - // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); - + ghDialogueQ.push(QItem); return; } } // ATE: OK: If a battle sound, and delay value was given, set time stamp // now... - if ( QItem->uiSpecialEventFlag == DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND ) + if ( QItem.uiSpecialEventFlag == DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND ) { - if ( QItem->uiSpecialEventData2 != 0 ) + if ( QItem.uiSpecialEventData2 != 0 ) { - if ( ( GetJA2Clock( ) - QItem->iTimeStamp ) < QItem->uiSpecialEventData2 ) + if ( ( GetJA2Clock( ) - QItem.iTimeStamp ) < QItem.uiSpecialEventData2 ) { //Place back in! - // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); return; } @@ -838,26 +795,25 @@ void HandleDialogue( ) } // Try to find soldier... - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, TRUE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, TRUE ); if ( pSoldier != NULL ) { if ( SoundIsPlaying( pSoldier->uiBattleSoundID ) ) { //Place back in! - // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); return; } } - if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) && ( QItem->uiSpecialEventFlag == 0 ) ) + if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) && ( QItem.uiSpecialEventFlag == 0 ) ) { - QItem->fPauseTime = TRUE; + QItem.fPauseTime = TRUE; } - if( QItem->fPauseTime ) + if( QItem.fPauseTime ) { if( GamePaused( ) == FALSE ) { @@ -869,7 +825,7 @@ void HandleDialogue( ) // Now play first item in queue // If it's not a 'special' dialogue event, continue - if ( QItem->uiSpecialEventFlag == 0 ) + if ( QItem.uiSpecialEventFlag == 0 ) { if( pSoldier ) { @@ -883,43 +839,43 @@ void HandleDialogue( ) fTeamPanelDirty = TRUE; // allow them to go back to sleep - TacticalCharacterDialogueWithSpecialEvent( pSoldier, QItem->usQuoteNum, DIALOGUE_SPECIAL_EVENT_SLEEP, 1,0 ); + TacticalCharacterDialogueWithSpecialEvent( pSoldier, QItem.usQuoteNum, DIALOGUE_SPECIAL_EVENT_SLEEP, 1,0 ); } } - gTacticalStatus.ubLastQuoteSaid = (UINT8)QItem->usQuoteNum; - gTacticalStatus.ubLastQuoteProfileNUm = (UINT8)QItem->ubCharacterNum; + gTacticalStatus.ubLastQuoteSaid = (UINT8)QItem.usQuoteNum; + gTacticalStatus.ubLastQuoteProfileNUm = (UINT8)QItem.ubCharacterNum; // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; #ifdef JA2UB //Ja25: test - if( QItem->ubCharacterNum == MORRIS_UB ) //MORRIS + if( QItem.ubCharacterNum == MORRIS_UB ) //MORRIS { - if( QItem->usQuoteNum == 0 ) + if( QItem.usQuoteNum == 0 ) { } } #endif - ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->fFromSoldier ); + ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.fFromSoldier ); } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SKIP_A_FRAME ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SKIP_A_FRAME ) { } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_LOCK_INTERFACE ) { // locking or unlocking? - if( QItem->uiSpecialEventData ) + if( QItem.uiSpecialEventData ) { - switch( QItem->uiSpecialEventData2 ) + switch( QItem.uiSpecialEventData2 ) { case( MAP_SCREEN ): fLockOutMapScreenInterface = TRUE; @@ -928,7 +884,7 @@ void HandleDialogue( ) } else { - switch( QItem->uiSpecialEventData2 ) + switch( QItem.uiSpecialEventData2 ) { case( MAP_SCREEN ): fLockOutMapScreenInterface = FALSE; @@ -936,61 +892,61 @@ void HandleDialogue( ) } } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_REMOVE_EPC ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_REMOVE_EPC ) { - gMercProfiles[ (UINT8) QItem->uiSpecialEventData ].ubMiscFlags &= ~PROFILE_MISC_FLAG_FORCENPCQUOTE; - UnRecruitEPC( (UINT8) QItem->uiSpecialEventData ); + gMercProfiles[ (UINT8) QItem.uiSpecialEventData ].ubMiscFlags &= ~PROFILE_MISC_FLAG_FORCENPCQUOTE; + UnRecruitEPC( (UINT8) QItem.uiSpecialEventData ); ReBuildCharactersList(); } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_WANTS_TO_RENEW ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_WANTS_TO_RENEW ) { - HandleMercIsWillingToRenew( (UINT8)QItem->uiSpecialEventData ); + HandleMercIsWillingToRenew( (UINT8)QItem.uiSpecialEventData ); } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_NOGO_TO_RENEW ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_NOGO_TO_RENEW ) { - HandleMercIsNotWillingToRenew( (UINT8)QItem->uiSpecialEventData ); + HandleMercIsNotWillingToRenew( (UINT8)QItem.uiSpecialEventData ); } else { - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_USE_ALTERNATE_FILES ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_USE_ALTERNATE_FILES ) { gfUseAlternateDialogueFile = TRUE; // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; - ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->fFromSoldier ); + ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.fFromSoldier ); gfUseAlternateDialogueFile = FALSE; } // We could have a special flag, but dialogue as well - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_PCTRIGGERNPC ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_PCTRIGGERNPC ) { // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; - ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->fFromSoldier ); + ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.fFromSoldier ); // Setup face with data! gpCurrentTalkingFace->uiFlags |= FACE_PCTRIGGER_NPC; - gpCurrentTalkingFace->uiUserData1 = QItem->uiSpecialEventData; - gpCurrentTalkingFace->uiUserData2 = QItem->uiSpecialEventData2; + gpCurrentTalkingFace->uiUserData1 = QItem.uiSpecialEventData; + gpCurrentTalkingFace->uiUserData2 = QItem.uiSpecialEventData2; } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOW_CONTRACT_MENU ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOW_CONTRACT_MENU ) { // Setup face pointer // ATE: THis is working with MARK'S STUFF :( @@ -1003,116 +959,116 @@ void HandleDialogue( ) pProcessingSoldier = pSoldier; fProcessingAMerc = TRUE; } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DO_BATTLE_SND ) { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, FALSE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, FALSE ); // Do battle snounds...... if ( pSoldier ) { - pSoldier->InternalDoMercBattleSound( (UINT8)QItem->uiSpecialEventData, 0 ); + pSoldier->InternalDoMercBattleSound( (UINT8)QItem.uiSpecialEventData, 0 ); } } - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SIGNAL_ITEM_LOCATOR_START ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SIGNAL_ITEM_LOCATOR_START ) { // Turn off item lock for locators... gTacticalStatus.fLockItemLocators = FALSE; // Slide to location! - SlideToLocation( 0, QItem->uiSpecialEventData ); + SlideToLocation( 0, QItem.uiSpecialEventData ); // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; - ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->fFromSoldier ); + ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.fFromSoldier ); } - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_ENABLE_AI ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_ENABLE_AI ) { //OK, allow AI to work now.... UnPauseAI(); } - if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_TRIGGERPREBATTLEINTERFACE ) + if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_TRIGGERPREBATTLEINTERFACE ) { UnLockPauseState(); // Flugente: what hideous idiocy is this? We cast a UINT32 as GROUP*? This is likely to return garbage. // Why the hell not use the id instead? - InitPreBattleInterface( (GROUP*)QItem->uiSpecialEventData, TRUE ); + InitPreBattleInterface( (GROUP*)QItem.uiSpecialEventData, TRUE ); - /*GROUP* pGroup = GetGroup( (UINT8)QItem->uiSpecialEventData ); + /*GROUP* pGroup = GetGroup( (UINT8)QItem.uiSpecialEventData ); if ( pGroup ) InitPreBattleInterface( pGroup, TRUE );*/ } - if( QItem->uiSpecialEventFlag & DIALOGUE_ADD_EVENT_FOR_SOLDIER_UPDATE_BOX ) + if( QItem.uiSpecialEventFlag & DIALOGUE_ADD_EVENT_FOR_SOLDIER_UPDATE_BOX ) { INT32 iReason = 0; SOLDIERTYPE *pUpdateSoldier = NULL; - iReason = QItem->uiSpecialEventData; + iReason = QItem.uiSpecialEventData; switch( iReason ) { case( UPDATE_BOX_REASON_ADDSOLDIER ): - pUpdateSoldier = &Menptr[ QItem->uiSpecialEventData2 ]; + pUpdateSoldier = &Menptr[ QItem.uiSpecialEventData2 ]; if( pUpdateSoldier->bActive == TRUE ) { AddSoldierToUpdateBox( pUpdateSoldier ); } break; case( UPDATE_BOX_REASON_SET_REASON ): - SetSoldierUpdateBoxReason( QItem->uiSpecialEventData2 ); + SetSoldierUpdateBoxReason( QItem.uiSpecialEventData2 ); break; case( UPDATE_BOX_REASON_SHOW_BOX ): ShowUpdateBox( ); break; } } - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_BEGINPREBATTLEINTERFACE ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_BEGINPREBATTLEINTERFACE ) { // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; - ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->fFromSoldier ); + ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.fFromSoldier ); // Setup face with data! gpCurrentTalkingFace->uiFlags |= FACE_TRIGGER_PREBATTLE_INT; - gpCurrentTalkingFace->uiUserData1 = QItem->uiSpecialEventData; - gpCurrentTalkingFace->uiUserData2 = QItem->uiSpecialEventData2; + gpCurrentTalkingFace->uiUserData1 = QItem.uiSpecialEventData; + gpCurrentTalkingFace->uiUserData2 = QItem.uiSpecialEventData2; } - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOPKEEPER ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOPKEEPER ) { - if( QItem->uiSpecialEventData < 3 ) + if( QItem.uiSpecialEventData < 3 ) { // post a notice if the player wants to withdraw money from thier account to cover the difference? - swprintf( zMoney, L"%d", QItem->uiSpecialEventData2 ); + swprintf( zMoney, L"%d", QItem.uiSpecialEventData2 ); InsertCommasForDollarFigure( zMoney ); InsertDollarSignInToString( zMoney ); } - else if ( QItem->uiSpecialEventData > 7 ) + else if ( QItem.uiSpecialEventData > 7 ) { // post a notice if the player wants to withdraw money from thier account to cover the difference? - swprintf( zMoney, L"%d", QItem->uiSpecialEventData2 ); + swprintf( zMoney, L"%d", QItem.uiSpecialEventData2 ); InsertCommasForDollarFigure( zMoney ); } - switch( QItem->uiSpecialEventData ) + switch( QItem.uiSpecialEventData ) { case( 0 ): swprintf( zText, SkiMessageBoxText[ SKI_SHORT_FUNDS_TEXT ], zMoney ); @@ -1136,7 +1092,7 @@ void HandleDialogue( ) break; case( 3 ): // this means a dialogue event is in progress - giShopKeepDialogueEventinProgress = QItem->uiSpecialEventData2; + giShopKeepDialogueEventinProgress = QItem.uiSpecialEventData2; break; case( 4 ): // this means a dialogue event has ended @@ -1179,107 +1135,107 @@ void HandleDialogue( ) } - if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_EXIT_MAP_SCREEN ) + if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_EXIT_MAP_SCREEN ) { // select sector - ChangeSelectedMapSector( ( INT16 )QItem->uiSpecialEventData, ( INT16 )QItem->uiSpecialEventData2, ( INT8 )QItem->uiSpecialEventData3 ); + ChangeSelectedMapSector( ( INT16 )QItem.uiSpecialEventData, ( INT16 )QItem.uiSpecialEventData2, ( INT8 )QItem.uiSpecialEventData3 ); RequestTriggerExitFromMapscreen( MAP_EXIT_TO_TACTICAL ); } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DISPLAY_STAT_CHANGE ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DISPLAY_STAT_CHANGE ) { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, FALSE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, FALSE ); if ( pSoldier ) { CHAR16 wTempString[ 128 ]; // tell player about stat increase - BuildStatChangeString( wTempString, pSoldier->name, ( BOOLEAN ) QItem->uiSpecialEventData, ( INT16 ) QItem->uiSpecialEventData2, ( UINT8 ) QItem->uiSpecialEventData3 ); + BuildStatChangeString( wTempString, pSoldier->name, ( BOOLEAN ) QItem.uiSpecialEventData, ( INT16 ) QItem.uiSpecialEventData2, ( UINT8 ) QItem.uiSpecialEventData3 ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, wTempString ); } } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_UNSET_ARRIVES_FLAG ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_UNSET_ARRIVES_FLAG ) { gTacticalStatus.bMercArrivingQuoteBeingUsed = FALSE; } /* - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DISPLAY_INVASION_MESSAGE ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DISPLAY_INVASION_MESSAGE ) { - HandlePlayerNotifyInvasionByEnemyForces( (INT16)(QItem->uiSpecialEventData % MAP_WORLD_X), (INT16)(QItem->uiSpecialEventData / MAP_WORLD_X), 0, NULL ); + HandlePlayerNotifyInvasionByEnemyForces( (INT16)(QItem.uiSpecialEventData % MAP_WORLD_X), (INT16)(QItem.uiSpecialEventData / MAP_WORLD_X), 0, NULL ); } */ - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SKYRIDERMAPSCREENEVENT ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SKYRIDERMAPSCREENEVENT ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; - gubCurrentTalkingID = QItem->ubCharacterNum; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; + gubCurrentTalkingID = QItem.ubCharacterNum; // handle the monologue event - HandleSkyRiderMonologueEvent( QItem->uiSpecialEventData, QItem->uiSpecialEventData2 ); + HandleSkyRiderMonologueEvent( QItem.uiSpecialEventData, QItem.uiSpecialEventData2 ); } - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_MINESECTOREVENT ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_MINESECTOREVENT ) { // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->ubCharacterNum; + gubCurrentTalkingID = QItem.ubCharacterNum; // set up the mine highlgith events - SetUpAnimationOfMineSectors( QItem->uiSpecialEventData ); + SetUpAnimationOfMineSectors( QItem.uiSpecialEventData ); } //Switch on our special events - if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_GIVE_ITEM ) + if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_GIVE_ITEM ) { - if ( QItem->bUIHandlerID == DIALOGUE_NPC_UI ) + if ( QItem.bUIHandlerID == DIALOGUE_NPC_UI ) { - HandleNPCItemGiven( (UINT8)QItem->uiSpecialEventData, (OBJECTTYPE*)QItem->uiSpecialEventData2, (INT8)QItem->uiSpecialEventData3 ); + HandleNPCItemGiven( (UINT8)QItem.uiSpecialEventData, (OBJECTTYPE*)QItem.uiSpecialEventData2, (INT8)QItem.uiSpecialEventData3 ); } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_TRIGGER_NPC ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_TRIGGER_NPC ) { - if ( QItem->bUIHandlerID == DIALOGUE_NPC_UI ) + if ( QItem.bUIHandlerID == DIALOGUE_NPC_UI ) { - HandleNPCTriggerNPC( (UINT8)QItem->uiSpecialEventData, (UINT8)QItem->uiSpecialEventData2, (BOOLEAN)QItem->uiSpecialEventData3, (UINT8)QItem->uiSpecialEventData4 ); + HandleNPCTriggerNPC( (UINT8)QItem.uiSpecialEventData, (UINT8)QItem.uiSpecialEventData2, (BOOLEAN)QItem.uiSpecialEventData3, (UINT8)QItem.uiSpecialEventData4 ); } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_GOTO_GRIDNO ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_GOTO_GRIDNO ) { - if ( QItem->bUIHandlerID == DIALOGUE_NPC_UI ) + if ( QItem.bUIHandlerID == DIALOGUE_NPC_UI ) { - HandleNPCGotoGridNo( (UINT8)QItem->uiSpecialEventData, (UINT16)QItem->uiSpecialEventData2, (UINT8)QItem->uiSpecialEventData3 );//dnl!!! + HandleNPCGotoGridNo( (UINT8)QItem.uiSpecialEventData, (UINT16)QItem.uiSpecialEventData2, (UINT8)QItem.uiSpecialEventData3 );//dnl!!! } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DO_ACTION ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_DO_ACTION ) { - if ( QItem->bUIHandlerID == DIALOGUE_NPC_UI ) + if ( QItem.bUIHandlerID == DIALOGUE_NPC_UI ) { - HandleNPCDoAction( (UINT8)QItem->uiSpecialEventData, (UINT16)QItem->uiSpecialEventData2, (UINT8)QItem->uiSpecialEventData3 ); + HandleNPCDoAction( (UINT8)QItem.uiSpecialEventData, (UINT16)QItem.uiSpecialEventData2, (UINT8)QItem.uiSpecialEventData3 ); } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CLOSE_PANEL ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CLOSE_PANEL ) { - if ( QItem->bUIHandlerID == DIALOGUE_NPC_UI ) + if ( QItem.bUIHandlerID == DIALOGUE_NPC_UI ) { HandleNPCClosePanel( ); } } - else if ( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOW_UPDATE_MENU ) + else if ( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SHOW_UPDATE_MENU ) { SetUpdateBoxFlag( TRUE ); } #ifdef JA2UB - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_JERRY_MILO ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_JERRY_MILO ) { //switch on the quote that is being spoken - switch( QItem->uiSpecialEventData ) + switch( QItem.uiSpecialEventData ) { case JM_SE__SHOW_RADIO_LOCATOR: HandleShowingRadioLocatorsInMorrisArea(); @@ -1301,10 +1257,10 @@ void HandleDialogue( ) } } #else //Ja25: removed the flag, no militia - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTINUE_TRAINING_MILITIA ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTINUE_TRAINING_MILITIA ) { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( ( UINT8 )( QItem->uiSpecialEventData ), FALSE ); + pSoldier = FindSoldierByProfileID( ( UINT8 )( QItem.uiSpecialEventData ), FALSE ); // if soldier valid... if( pSoldier != NULL ) @@ -1313,7 +1269,7 @@ void HandleDialogue( ) } } #endif - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_ENTER_MAPSCREEN ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_ENTER_MAPSCREEN ) { if( !(guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) ) { @@ -1321,22 +1277,22 @@ void HandleDialogue( ) fEnterMapDueToContract = TRUE; } } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING ) { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, FALSE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, FALSE ); // if soldier valid... if( pSoldier != NULL ) { // .. remove the fired soldier again - BeginStrategicRemoveMerc( pSoldier, (UINT8)QItem->uiSpecialEventData ); + BeginStrategicRemoveMerc( pSoldier, (UINT8)QItem.uiSpecialEventData ); } } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING_NO_ASK_EQUIP ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_CONTRACT_ENDING_NO_ASK_EQUIP ) { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, FALSE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, FALSE ); // if soldier valid... if( pSoldier != NULL ) @@ -1345,53 +1301,53 @@ void HandleDialogue( ) StrategicRemoveMerc( pSoldier ); } } - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_MULTIPURPOSE ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_MULTIPURPOSE ) { // anv: handle snitch event - if( QItem->uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_SNITCH_DIALOGUE ) + if( QItem.uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_SNITCH_DIALOGUE ) { - gTacticalStatus.ubLastQuoteSaid = (UINT8)QItem->usQuoteNum; - gTacticalStatus.ubLastQuoteProfileNUm = (UINT8)QItem->ubCharacterNum; + gTacticalStatus.ubLastQuoteSaid = (UINT8)QItem.usQuoteNum; + gTacticalStatus.ubLastQuoteProfileNUm = (UINT8)QItem.ubCharacterNum; // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[ QItem->iFaceIndex ]; + gpCurrentTalkingFace = &gFacesData[ QItem.iFaceIndex ]; } - gubCurrentTalkingID = QItem->iFaceIndex; + gubCurrentTalkingID = QItem.iFaceIndex; - //ExecuteCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE ); - ExecuteSnitchCharacterDialogue( QItem->ubCharacterNum, QItem->usQuoteNum, QItem->iFaceIndex, QItem->bUIHandlerID, QItem->uiSpecialEventData2, QItem->uiSpecialEventData3, QItem->uiSpecialEventData4 ); + //ExecuteCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE ); + ExecuteSnitchCharacterDialogue( QItem.ubCharacterNum, QItem.usQuoteNum, QItem.iFaceIndex, QItem.bUIHandlerID, QItem.uiSpecialEventData2, QItem.uiSpecialEventData3, QItem.uiSpecialEventData4 ); } // Flugente: additional dialogue - else if ( QItem->uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_ADDITIONAL_DIALOGUE ) + else if ( QItem.uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_ADDITIONAL_DIALOGUE ) { // Flugente: only set up face if we can access correctly - if ( QItem->iFaceIndex >= 0 ) + if ( QItem.iFaceIndex >= 0 ) { // Setup face pointer - gpCurrentTalkingFace = &gFacesData[QItem->iFaceIndex]; + gpCurrentTalkingFace = &gFacesData[QItem.iFaceIndex]; } - gubCurrentTalkingID = QItem->iFaceIndex; + gubCurrentTalkingID = QItem.iFaceIndex; extern BOOLEAN ExecuteAdditionalCharacterDialogue( UINT8 ubProfile, INT32 iFaceIndex, UINT16 usEventNr, UINT32 aData1, UINT32 aData2, UINT32 aData3 ); - ExecuteAdditionalCharacterDialogue( QItem->ubCharacterNum, QItem->iFaceIndex, QItem->usQuoteNum, QItem->uiSpecialEventData2, QItem->uiSpecialEventData3, QItem->uiSpecialEventData4 ); + ExecuteAdditionalCharacterDialogue( QItem.ubCharacterNum, QItem.iFaceIndex, QItem.usQuoteNum, QItem.uiSpecialEventData2, QItem.uiSpecialEventData3, QItem.uiSpecialEventData4 ); } #ifdef JA2UB //JA25 UB - if ( QItem->uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_TEAM_MEMBERS_DONE_TALKING ) + if ( QItem.uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_TEAM_MEMBERS_DONE_TALKING ) { HandleEveryoneDoneTheirEndGameQuotes(); } else { // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( (UINT8)QItem->uiSpecialEventData, FALSE ); + pSoldier = FindSoldierByProfileID( (UINT8)QItem.uiSpecialEventData, FALSE ); // FindSoldier was returning a lot of nullptrs which would crash the game very quickly after Jerry gets up. This check is here to circumvent that. if (pSoldier != nullptr) @@ -1429,17 +1385,17 @@ void HandleDialogue( ) } } #else //Ja25 No queen - if ( QItem->uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_DONE_KILLING_DEIDRANNA ) + if ( QItem.uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_DONE_KILLING_DEIDRANNA ) { HandleDoneLastKilledQueenQuote( ); } - else if ( QItem->uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_TEAM_MEMBERS_DONE_TALKING ) + else if ( QItem.uiSpecialEventData & MULTIPURPOSE_SPECIAL_EVENT_TEAM_MEMBERS_DONE_TALKING ) { HandleDoneLastEndGameQuote( ); } } #endif - else if( QItem->uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SLEEP ) + else if( QItem.uiSpecialEventFlag & DIALOGUE_SPECIAL_EVENT_SLEEP ) { // no soldier, leave now if( pSoldier == NULL ) @@ -1448,7 +1404,7 @@ void HandleDialogue( ) } // wake merc up or put them back down? - if( QItem->uiSpecialEventData == 1 ) + if( QItem.uiSpecialEventData == 1 ) { pSoldier->flags.fMercAsleep = TRUE; } @@ -1464,20 +1420,17 @@ void HandleDialogue( ) } // grab soldier ptr from profile ID - pSoldier = FindSoldierByProfileID( QItem->ubCharacterNum, FALSE ); + pSoldier = FindSoldierByProfileID( QItem.ubCharacterNum, FALSE ); if ( pSoldier && pSoldier->bTeam == gbPlayerNum ) { - CheckForStopTimeQuotes( QItem->usQuoteNum ); + CheckForStopTimeQuotes( QItem.usQuoteNum ); } - if( QItem->fPauseTime ) + if( QItem.fPauseTime ) { fWasPausedDuringDialogue = TRUE; } - - // Delete memory - MemFree( QItem ); } BOOLEAN GetDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, UINT32 iDataSize, STR16 zDialogueText, UINT32 *puiSoundID, CHAR8 *zSoundString ); @@ -1845,27 +1798,22 @@ void AdditionalTacticalCharacterDialogue_AllInSectorRadiusCall( UINT8 ausIgnoreP BOOLEAN CharacterDialogueWithSpecialEvent( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 iFaceIndex, UINT8 bUIHandlerID, BOOLEAN fFromSoldier, BOOLEAN fDelayed, UINT32 uiFlag, UINT32 uiData1, UINT32 uiData2 ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->ubCharacterNum = ubCharacterNum; - QItem->usQuoteNum = usQuoteNum; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); - QItem->fFromSoldier = fFromSoldier; - QItem->fDelayed = fDelayed; + DIALOGUE_Q_STRUCT QItem{}; + QItem.ubCharacterNum = ubCharacterNum; + QItem.usQuoteNum = usQuoteNum; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); + QItem.fFromSoldier = fFromSoldier; + QItem.fDelayed = fDelayed; // Set flag for special event - QItem->uiSpecialEventFlag = uiFlag; - QItem->uiSpecialEventData = uiData1; - QItem->uiSpecialEventData2 = uiData2; + QItem.uiSpecialEventFlag = uiFlag; + QItem.uiSpecialEventData = uiData1; + QItem.uiSpecialEventData2 = uiData2; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); // sevenfm: disable FF for dialogues if (IsFastForwardMode()) @@ -1884,28 +1832,23 @@ BOOLEAN CharacterDialogueWithSpecialEvent( UINT8 ubCharacterNum, UINT16 usQuoteN BOOLEAN CharacterDialogueWithSpecialEventEx( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 iFaceIndex, UINT8 bUIHandlerID, BOOLEAN fFromSoldier, BOOLEAN fDelayed, UINT32 uiFlag, UINT32 uiData1, UINT32 uiData2, UINT32 uiData3 ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->ubCharacterNum = ubCharacterNum; - QItem->usQuoteNum = usQuoteNum; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); - QItem->fFromSoldier = fFromSoldier; - QItem->fDelayed = fDelayed; + DIALOGUE_Q_STRUCT QItem{}; + QItem.ubCharacterNum = ubCharacterNum; + QItem.usQuoteNum = usQuoteNum; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); + QItem.fFromSoldier = fFromSoldier; + QItem.fDelayed = fDelayed; // Set flag for special event - QItem->uiSpecialEventFlag = uiFlag; - QItem->uiSpecialEventData = uiData1; - QItem->uiSpecialEventData2 = uiData2; - QItem->uiSpecialEventData3 = uiData3; + QItem.uiSpecialEventFlag = uiFlag; + QItem.uiSpecialEventData = uiData1; + QItem.uiSpecialEventData2 = uiData2; + QItem.uiSpecialEventData3 = uiData3; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); if ( uiFlag & DIALOGUE_SPECIAL_EVENT_PCTRIGGERNPC ) { @@ -1918,30 +1861,25 @@ BOOLEAN CharacterDialogueWithSpecialEventEx( UINT8 ubCharacterNum, UINT16 usQuot BOOLEAN CharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 iFaceIndex, UINT8 bUIHandlerID, BOOLEAN fFromSoldier, BOOLEAN fDelayed ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->ubCharacterNum = ubCharacterNum; - QItem->usQuoteNum = usQuoteNum; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); - QItem->fFromSoldier = fFromSoldier; - QItem->fDelayed = fDelayed; + DIALOGUE_Q_STRUCT QItem{}; + QItem.ubCharacterNum = ubCharacterNum; + QItem.usQuoteNum = usQuoteNum; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); + QItem.fFromSoldier = fFromSoldier; + QItem.fDelayed = fDelayed; // check if pause already locked, if so, then don't mess with it if( gfLockPauseState == FALSE ) { - QItem->fPauseTime = fPausedTimeDuringQuote; + QItem.fPauseTime = fPausedTimeDuringQuote; } fPausedTimeDuringQuote = FALSE; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); // Flugente: additional dialogue // in the dialogue screen, only the merc doing the talking may answer @@ -1973,35 +1911,30 @@ BOOLEAN SnitchCharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 UINT32 uiSpecialEventData3, UINT32 uiSpecialEventData4, UINT8 bUIHandlerID, BOOLEAN fFromSoldier, BOOLEAN fDelayed ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->ubCharacterNum = ubCharacterNum; - QItem->usQuoteNum = usQuoteNum; - QItem->uiSpecialEventFlag = uiSpecialEventFlag; - QItem->uiSpecialEventData = uiSpecialEventData1; - QItem->uiSpecialEventData2 = uiSpecialEventData2; - QItem->uiSpecialEventData3 = uiSpecialEventData3; - QItem->uiSpecialEventData4 = uiSpecialEventData4; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); - QItem->fFromSoldier = fFromSoldier; - QItem->fDelayed = fDelayed; + DIALOGUE_Q_STRUCT QItem{}; + QItem.ubCharacterNum = ubCharacterNum; + QItem.usQuoteNum = usQuoteNum; + QItem.uiSpecialEventFlag = uiSpecialEventFlag; + QItem.uiSpecialEventData = uiSpecialEventData1; + QItem.uiSpecialEventData2 = uiSpecialEventData2; + QItem.uiSpecialEventData3 = uiSpecialEventData3; + QItem.uiSpecialEventData4 = uiSpecialEventData4; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); + QItem.fFromSoldier = fFromSoldier; + QItem.fDelayed = fDelayed; // check if pause already locked, if so, then don't mess with it if( gfLockPauseState == FALSE ) { - QItem->fPauseTime = fPausedTimeDuringQuote; + QItem.fPauseTime = fPausedTimeDuringQuote; } fPausedTimeDuringQuote = FALSE; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); + ghDialogueQ.push(QItem); return( TRUE ); } @@ -2009,63 +1942,51 @@ BOOLEAN SnitchCharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 BOOLEAN SpecialCharacterDialogueEvent( UINT32 uiSpecialEventFlag, UINT32 uiSpecialEventData1, UINT32 uiSpecialEventData2, UINT32 uiSpecialEventData3, INT32 iFaceIndex, UINT8 bUIHandlerID ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->uiSpecialEventFlag = uiSpecialEventFlag; - QItem->uiSpecialEventData = uiSpecialEventData1; - QItem->uiSpecialEventData2 = uiSpecialEventData2; - QItem->uiSpecialEventData3 = uiSpecialEventData3; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); + DIALOGUE_Q_STRUCT QItem{}; + QItem.uiSpecialEventFlag = uiSpecialEventFlag; + QItem.uiSpecialEventData = uiSpecialEventData1; + QItem.uiSpecialEventData2 = uiSpecialEventData2; + QItem.uiSpecialEventData3 = uiSpecialEventData3; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); // if paused state not already locked if( gfLockPauseState == FALSE ) { - QItem->fPauseTime = fPausedTimeDuringQuote; + QItem.fPauseTime = fPausedTimeDuringQuote; } fPausedTimeDuringQuote = FALSE; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); - + ghDialogueQ.push(QItem); return( TRUE ); } BOOLEAN SpecialCharacterDialogueEventWithExtraParam( UINT32 uiSpecialEventFlag, UINT32 uiSpecialEventData1, UINT32 uiSpecialEventData2, UINT32 uiSpecialEventData3, UINT32 uiSpecialEventData4, INT32 iFaceIndex, UINT8 bUIHandlerID ) { - DIALOGUE_Q_STRUCT *QItem; - - // Allocate new item - QItem = (DIALOGUE_Q_STRUCT *) MemAlloc( sizeof( DIALOGUE_Q_STRUCT ) ); - memset( QItem, 0, sizeof( DIALOGUE_Q_STRUCT ) ); - - QItem->uiSpecialEventFlag = uiSpecialEventFlag; - QItem->uiSpecialEventData = uiSpecialEventData1; - QItem->uiSpecialEventData2 = uiSpecialEventData2; - QItem->uiSpecialEventData3 = uiSpecialEventData3; - QItem->uiSpecialEventData4 = uiSpecialEventData4; - QItem->iFaceIndex = iFaceIndex; - QItem->bUIHandlerID = bUIHandlerID; - QItem->iTimeStamp = GetJA2Clock( ); + DIALOGUE_Q_STRUCT QItem{}; + QItem.uiSpecialEventFlag = uiSpecialEventFlag; + QItem.uiSpecialEventData = uiSpecialEventData1; + QItem.uiSpecialEventData2 = uiSpecialEventData2; + QItem.uiSpecialEventData3 = uiSpecialEventData3; + QItem.uiSpecialEventData4 = uiSpecialEventData4; + QItem.iFaceIndex = iFaceIndex; + QItem.bUIHandlerID = bUIHandlerID; + QItem.iTimeStamp = GetJA2Clock( ); // if paused state not already locked if( gfLockPauseState == FALSE ) { - QItem->fPauseTime = fPausedTimeDuringQuote; + QItem.fPauseTime = fPausedTimeDuringQuote; } fPausedTimeDuringQuote = FALSE; // Add to queue - ghDialogueQ = AddtoQueue( ghDialogueQ, &QItem ); - + ghDialogueQ.push(QItem); return( TRUE ); } diff --git a/Utils/CMakeLists.txt b/Utils/CMakeLists.txt index 0a11b8bb2..688f95559 100644 --- a/Utils/CMakeLists.txt +++ b/Utils/CMakeLists.txt @@ -6,7 +6,6 @@ set(UtilsSrc "${CMAKE_CURRENT_SOURCE_DIR}/Debug Control.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/dsutil.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Encrypted File.cpp" -"${CMAKE_CURRENT_SOURCE_DIR}/Event Manager.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Event Pump.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ExportStrings.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Font Control.cpp" diff --git a/Utils/Event Manager.cpp b/Utils/Event Manager.cpp deleted file mode 100644 index edd39c59c..000000000 --- a/Utils/Event Manager.cpp +++ /dev/null @@ -1,234 +0,0 @@ - #include - #include - #include "sgp.h" - #include "container.h" - #include "wcheck.h" - #include "Event Manager.h" - #include "Timer Control.h" - -HLIST hEventQueue = NULL; -HLIST hDelayEventQueue = NULL; -HLIST hDemandEventQueue = NULL; - -#define QUEUE_RESIZE 20 - -// LOCAL FUNCTIONS -HLIST GetQueue( UINT8 ubQueueID ); -void SetQueue( UINT8 ubQueueID, HLIST hQueue ); - - -BOOLEAN InitializeEventManager( ) -{ - // Create Queue - hEventQueue = CreateList( QUEUE_RESIZE, sizeof( PTR ) ); - - if ( hEventQueue == NULL ) - { - return( FALSE ); - } - - // Create Delay Queue - hDelayEventQueue = CreateList( QUEUE_RESIZE, sizeof( PTR ) ); - - if ( hDelayEventQueue == NULL ) - { - return( FALSE ); - } - - // Create Demand Queue (events on this queue are only processed when specifically - // called for by code) - hDemandEventQueue = CreateList( QUEUE_RESIZE, sizeof( PTR ) ); - - if ( hDemandEventQueue == NULL ) - { - return( FALSE ); - } - - return( TRUE ); -} - -BOOLEAN ShutdownEventManager( ) -{ - if ( hEventQueue != NULL ) - { - DeleteList( hEventQueue ); - } - - if ( hDelayEventQueue != NULL ) - { - DeleteList( hDelayEventQueue ); - } - - if ( hDemandEventQueue != NULL ) - { - DeleteList( hDemandEventQueue ); - } - - return( TRUE ); -} - - - -BOOLEAN AddEvent( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT32 uiDataSize, UINT8 ubQueueID ) -{ - EVENT *pEvent; - UINT32 uiEventSize = sizeof( EVENT ); - HLIST hQueue; - - // Allocate new event - pEvent = (EVENT *) MemAlloc( uiEventSize + uiDataSize ); - - CHECKF( pEvent != NULL ); - - // Set values - pEvent->TimeStamp = GetJA2Clock( ); - pEvent->usDelay = usDelay; - pEvent->uiEvent = uiEvent; - pEvent->uiFlags = 0; - pEvent->uiDataSize = uiDataSize; - pEvent->pData = (BYTE*)pEvent; - pEvent->pData = pEvent->pData + uiEventSize; - - memcpy( pEvent->pData, pEventData, uiDataSize ); - - // Add event to queue - hQueue = GetQueue( ubQueueID ); - hQueue = AddtoList( hQueue, &pEvent, ListSize( hQueue ) ); - SetQueue( ubQueueID, hQueue ); - - return( TRUE ); - -} - - - -BOOLEAN RemoveEvent( EVENT **ppEvent, UINT32 uiIndex, UINT8 ubQueueID ) -{ - UINT32 uiQueueSize; - HLIST hQueue; - - // Get an event from queue, if one exists - // - - hQueue = GetQueue( ubQueueID ); - - - // Get Size - uiQueueSize = ListSize( hQueue ); - - if ( uiQueueSize > 0 ) - { - // Get - CHECKF( RemfromList( hQueue , ppEvent, uiIndex ) != FALSE ); - } - else - { - return( FALSE ); - } - - return( TRUE ); -} - - -BOOLEAN PeekEvent( EVENT **ppEvent, UINT32 uiIndex , UINT8 ubQueueID ) -{ - UINT32 uiQueueSize; - HLIST hQueue; - - // Get an event from queue, if one exists - // - - hQueue = GetQueue( ubQueueID ); - - - // Get Size - uiQueueSize = ListSize( hQueue ); - - if ( uiQueueSize > 0 ) - { - // Get - CHECKF( PeekList( hQueue, ppEvent, uiIndex ) != FALSE ); - } - else - { - return( FALSE ); - } - - return( TRUE ); -} - - - -BOOLEAN FreeEvent( EVENT *pEvent ) -{ - CHECKF( pEvent != NULL ); - - // Delete event - MemFree( pEvent ); - - return( TRUE ); -} - - -UINT32 EventQueueSize( UINT8 ubQueueID ) -{ - UINT32 uiQueueSize; - HLIST hQueue; - - // Get an event from queue, if one exists - // - - hQueue = GetQueue( ubQueueID ); - - // Get Size - uiQueueSize = ListSize( hQueue ); - - return( uiQueueSize ); -} - - -HLIST GetQueue( UINT8 ubQueueID ) -{ - switch( ubQueueID ) - { - case PRIMARY_EVENT_QUEUE: - return( hEventQueue ); - break; - - case SECONDARY_EVENT_QUEUE: - return( hDelayEventQueue ); - break; - - case DEMAND_EVENT_QUEUE: - return( hDemandEventQueue ); - break; - - default: - Assert( FALSE ); - return( 0 ); - break; - } - -} - -void SetQueue( UINT8 ubQueueID, HQUEUE hQueue ) -{ - switch( ubQueueID ) - { - case PRIMARY_EVENT_QUEUE: - hEventQueue = hQueue; - break; - - case SECONDARY_EVENT_QUEUE: - hDelayEventQueue = hQueue; - break; - - case DEMAND_EVENT_QUEUE: - hDemandEventQueue = hQueue; - break; - - default: - Assert( FALSE ); - break; - } -} diff --git a/Utils/Event Manager.h b/Utils/Event Manager.h deleted file mode 100644 index 1e24941ff..000000000 --- a/Utils/Event Manager.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __EVENT_MANAGER_H -#define __EVENT_MANAGER_H - -typedef struct -{ - TIMER TimeStamp; - UINT32 uiFlags; - UINT16 usDelay; - UINT32 uiEvent; - UINT32 uiDataSize; - BYTE *pData; - -} EVENT; - -#define PRIMARY_EVENT_QUEUE 0 -#define SECONDARY_EVENT_QUEUE 1 -#define DEMAND_EVENT_QUEUE 2 - -#define EVENT_EXPIRED 0x00000002 - -// Management fucntions -BOOLEAN InitializeEventManager( ); -BOOLEAN ShutdownEventManager( ); - -BOOLEAN AddEvent( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT32 uiDataSize, UINT8 ubQueueID ); -BOOLEAN RemoveEvent( EVENT **ppEvent, UINT32 uiIndex , UINT8 ubQueueID ); -BOOLEAN PeekEvent( EVENT **ppEvent, UINT32 uiIndex , UINT8 ubQueueID ); -BOOLEAN FreeEvent( EVENT *pEvent ); -UINT32 EventQueueSize( UINT8 ubQueueID ); - - -#endif - diff --git a/Utils/Event Pump.cpp b/Utils/Event Pump.cpp index da01372d4..c05677775 100644 --- a/Utils/Event Pump.cpp +++ b/Utils/Event Pump.cpp @@ -1,21 +1,26 @@ - #include - #include - #include "sgp.h" - #include "container.h" - #include "wcheck.h" - #include "Event Pump.h" - #include "Timer.h" - #include "Sound Control.h" - #include "Overhead.h" - #include "weapons.h" - #include "Animation Control.h" - #include "opplist.h" - #include "Tactical Save.h" +#include +#include +#include "sgp.h" +#include "container.h" +#include "wcheck.h" +#include "Event Pump.h" +#include "Timer.h" +#include "Sound Control.h" +#include "Overhead.h" +#include "weapons.h" +#include "Animation Control.h" +#include "opplist.h" +#include "Tactical Save.h" +#include +#include #ifdef NETWORKED #include "Networking.h" #include "NetworkEvent.h" #endif +#include "MemMan.h" +#include "Timer Control.h" +#include "DEBUG.H" UINT8 gubEncryptionArray4[ BASE_NUMBER_OF_ROTATION_ARRAYS * 3 ][ NEW_ROTATION_ARRAY_SIZE ] = { @@ -590,6 +595,44 @@ UINT8 gubEncryptionArray4[ BASE_NUMBER_OF_ROTATION_ARRAYS * 3 ][ NEW_ROTATION_AR }, }; +struct EVENT +{ + TIMER TimeStamp; + UINT32 uiFlags; + UINT16 usDelay; + UINT32 uiEvent; + UINT32 uiDataSize; + BYTE* pData; + + EVENT(UINT16 delay, UINT32 event, UINT32 dataSize, BYTE* eventData) : + TimeStamp(GetJA2Clock()), + uiFlags(0), + usDelay(delay), + uiEvent(event), + uiDataSize(dataSize), + pData{ eventData } + { + } + + EVENT() : + TimeStamp(GetJA2Clock()), + uiFlags(0), + usDelay(0), + uiEvent(0), + uiDataSize(0), + pData{ nullptr } + {} +}; + +#define PRIMARY_EVENT_QUEUE 0 +#define SECONDARY_EVENT_QUEUE 1 +#define DEMAND_EVENT_QUEUE 2 +#define EVENT_EXPIRED 0x00000002 + +std::queue hEventQueue; +std::vector hDelayEventQueue; +std::queue hDemandEventQueue; + // GLobals used here, for each event structure used, // Used as globals for stack reasons EV_E_PLAYSOUND EPlaySound; @@ -601,68 +644,144 @@ EV_S_GETNEWPATH SGetNewPath; EV_S_BEGINTURN SBeginTurn; EV_S_CHANGESTANCE SChangeStance; EV_S_SETDIRECTION SSetDirection; -EV_S_SETDESIREDDIRECTION SSetDesiredDirection; -EV_S_BEGINFIREWEAPON SBeginFireWeapon; +EV_S_SETDESIREDDIRECTION SSetDesiredDirection; +EV_S_BEGINFIREWEAPON SBeginFireWeapon; EV_S_FIREWEAPON SFireWeapon; EV_S_WEAPONHIT SWeaponHit; EV_S_STRUCTUREHIT SStructureHit; EV_S_WINDOWHIT SWindowHit; -EV_S_MISS SMiss; -EV_S_NOISE SNoise; +EV_S_MISS SMiss; +EV_S_NOISE SNoise; EV_S_STOP_MERC SStopMerc; -EV_S_SENDPATHTONETWORK SUpdateNetworkSoldier; +EV_S_SENDPATHTONETWORK SUpdateNetworkSoldier; extern BOOLEAN gfAmINetworked; -BOOLEAN AddGameEventToQueue( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT8 ubQueueID ); + BOOLEAN ExecuteGameEvent( EVENT *pEvent ); -BOOLEAN AddGameEvent( UINT32 uiEvent, UINT16 usDelay, PTR pEventData ) +BOOLEAN AddEvent(UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT32 uiDataSize, UINT8 ubQueueID) { - if (usDelay == DEMAND_EVENT_DELAY) - { - //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local and network #%d", uiEvent)); - #ifdef NETWORKED - if(gfAmINetworked) - SendEventToNetwork(uiEvent, usDelay, pEventData); - #endif - return( AddGameEventToQueue( uiEvent, 0, pEventData, DEMAND_EVENT_QUEUE ) ); - } - else if( uiEvent < EVENTS_LOCAL_AND_NETWORK) + BYTE* pData = (BYTE*)MemAlloc(uiDataSize); + Assert(pData); + memcpy(pData, pEventData, uiDataSize); + + // Add event to queue + switch (ubQueueID) { - //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local and network #%d", uiEvent)); - #ifdef NETWORKED - if(gfAmINetworked) - SendEventToNetwork(uiEvent, usDelay, pEventData); - #endif - return( AddGameEventToQueue( uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE ) ); + case PRIMARY_EVENT_QUEUE: + hEventQueue.emplace(usDelay, uiEvent, uiDataSize, pData); + break; + + case SECONDARY_EVENT_QUEUE: + hDelayEventQueue.emplace_back(usDelay, uiEvent, uiDataSize, pData); + break; + + case DEMAND_EVENT_QUEUE: + hDemandEventQueue.emplace(usDelay, uiEvent, uiDataSize, pData); + break; + + default: + Assert(FALSE); + break; } - else if( uiEvent < EVENTS_ONLY_USED_LOCALLY) + + return(TRUE); +} + + +static BOOLEAN RemoveEventFromSecondaryEventQueue(EVENT* ppEvent, UINT32 uiIndex) +{ + if (uiIndex >= hDelayEventQueue.size()) { - //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local #%d", uiEvent)); - return( AddGameEventToQueue( uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE ) ); + return(FALSE); } - else if( uiEvent < EVENTS_ONLY_SENT_OVER_NETWORK) + + *ppEvent = hDelayEventQueue[uiIndex]; + hDelayEventQueue.erase(hDelayEventQueue.begin() + uiIndex); + return(TRUE); +} + + +static BOOLEAN PopEvent(EVENT* ppEvent, UINT8 ubQueueID) +{ + // Get an event from queue, if one exists + // + switch (ubQueueID) { - //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending network #%d", uiEvent)); - #ifdef NETWORKED - if(gfAmINetworked) - SendEventToNetwork(uiEvent, usDelay, pEventData); - #endif - return(TRUE); + case PRIMARY_EVENT_QUEUE: + if (!hEventQueue.empty()) + { + *ppEvent = hEventQueue.front(); + hEventQueue.pop(); + return(TRUE); + } + break; + + case SECONDARY_EVENT_QUEUE: + if (!hDelayEventQueue.empty()) + { + *ppEvent = hDelayEventQueue.front(); + hDelayEventQueue.erase(hDelayEventQueue.begin()); + return(TRUE); + } + break; + + case DEMAND_EVENT_QUEUE: + if (!hDemandEventQueue.empty()) + { + *ppEvent = hDemandEventQueue.front(); + hDemandEventQueue.pop(); + return(TRUE); + } + break; + + default: + Assert(FALSE); + break; } - // There is an error with the event - else - return(FALSE); + + return(FALSE); } -BOOLEAN AddGameEventFromNetwork( UINT32 uiEvent, UINT16 usDelay, PTR pEventData ) + +static BOOLEAN FreeEventData(EVENT* pEvent) { - return( AddGameEventToQueue( uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE ) ); + CHECKF(pEvent != NULL); + + MemFree(pEvent->pData); + //MemFree(pEvent); + + return(TRUE); } -BOOLEAN AddGameEventToQueue( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT8 ubQueueID ) + +UINT32 EventQueueSize(UINT8 ubQueueID) +{ + switch (ubQueueID) + { + case PRIMARY_EVENT_QUEUE: + return(hEventQueue.size()); + break; + + case SECONDARY_EVENT_QUEUE: + return(hDelayEventQueue.size()); + break; + + case DEMAND_EVENT_QUEUE: + return(hDemandEventQueue.size()); + break; + + default: + Assert(FALSE); + return(-1); + break; + } +} + + +static BOOLEAN AddGameEventToQueue( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UINT8 ubQueueID ) { UINT32 uiDataSize; @@ -783,18 +902,65 @@ BOOLEAN AddGameEventToQueue( UINT32 uiEvent, UINT16 usDelay, PTR pEventData, UIN return( TRUE ); } + +BOOLEAN AddGameEvent(UINT32 uiEvent, UINT16 usDelay, PTR pEventData) +{ + if (usDelay == DEMAND_EVENT_DELAY) + { + //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local and network #%d", uiEvent)); +#ifdef NETWORKED + if (gfAmINetworked) + SendEventToNetwork(uiEvent, usDelay, pEventData); +#endif + return(AddGameEventToQueue(uiEvent, 0, pEventData, DEMAND_EVENT_QUEUE)); + } + else if (uiEvent < EVENTS_LOCAL_AND_NETWORK) + { + //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local and network #%d", uiEvent)); +#ifdef NETWORKED + if (gfAmINetworked) + SendEventToNetwork(uiEvent, usDelay, pEventData); +#endif + return(AddGameEventToQueue(uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE)); + } + else if (uiEvent < EVENTS_ONLY_USED_LOCALLY) + { + //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending Local #%d", uiEvent)); + return(AddGameEventToQueue(uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE)); + } + else if (uiEvent < EVENTS_ONLY_SENT_OVER_NETWORK) + { + //DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("AddGameEvent: Sending network #%d", uiEvent)); +#ifdef NETWORKED + if (gfAmINetworked) + SendEventToNetwork(uiEvent, usDelay, pEventData); +#endif + return(TRUE); + } + // There is an error with the event + else + return(FALSE); +} + + +BOOLEAN AddGameEventFromNetwork(UINT32 uiEvent, UINT16 usDelay, PTR pEventData) +{ + return(AddGameEventToQueue(uiEvent, usDelay, pEventData, PRIMARY_EVENT_QUEUE)); +} + + BOOLEAN DequeAllGameEvents( BOOLEAN fExecute ) { - EVENT *pEvent; - UINT32 uiQueueSize, cnt; - BOOLEAN fCompleteLoop = FALSE; - // First dequeue all primary events + EVENT pEvent; + UINT32 uiQueueSize, i; + BOOLEAN fCompleteLoop = FALSE; + // First dequeue all primary events while( EventQueueSize( PRIMARY_EVENT_QUEUE ) > 0 ) { // Get Event - if ( RemoveEvent( &pEvent, 0, PRIMARY_EVENT_QUEUE) == FALSE ) + if (PopEvent( &pEvent, PRIMARY_EVENT_QUEUE) == FALSE ) { return( FALSE ); } @@ -802,90 +968,66 @@ BOOLEAN DequeAllGameEvents( BOOLEAN fExecute ) if ( fExecute ) { // Check if event has a delay and add to secondary queue if so - if ( pEvent->usDelay > 0 ) + if ( pEvent.usDelay > 0 ) { - AddGameEventToQueue( pEvent->uiEvent, pEvent->usDelay, pEvent->pData, SECONDARY_EVENT_QUEUE ); + AddGameEventToQueue( pEvent.uiEvent, pEvent.usDelay, pEvent.pData, SECONDARY_EVENT_QUEUE ); } else { - ExecuteGameEvent( pEvent ); + ExecuteGameEvent( &pEvent ); } } // Delete event - FreeEvent( pEvent ); - + FreeEventData( &pEvent ); }; - // NOW CHECK SECONDARY QUEUE FOR ANY EXPRIED EVENTS - // Get size of queue + + // NOW CHECK SECONDARY QUEUE FOR EVENTS uiQueueSize = EventQueueSize( SECONDARY_EVENT_QUEUE ); - for ( cnt = 0; cnt < uiQueueSize; cnt++ ) + for ( i = 0; i < uiQueueSize; i++ ) { - if ( PeekEvent( &pEvent, cnt, SECONDARY_EVENT_QUEUE) == FALSE ) - { - return( FALSE ); - } - + EVENT& pEventRef = hDelayEventQueue[i]; // Check time - if ( ( GetJA2Clock() - pEvent->TimeStamp ) > pEvent->usDelay ) + if ( ( GetJA2Clock() - pEventRef.TimeStamp ) > pEventRef.usDelay ) { if ( fExecute ) { - ExecuteGameEvent( pEvent ); + ExecuteGameEvent( &pEventRef ); } // FLag as expired - pEvent->uiFlags = EVENT_EXPIRED; - + pEventRef.uiFlags = EVENT_EXPIRED; } - } - do + // Remove expired events from secondary event queue + uiQueueSize = EventQueueSize(SECONDARY_EVENT_QUEUE); + for (INT32 i = uiQueueSize-1; i >= 0; i--) { - uiQueueSize = EventQueueSize( SECONDARY_EVENT_QUEUE ); - - for ( cnt = 0; cnt < uiQueueSize; cnt++ ) + EVENT& pEventRef = hDelayEventQueue[i]; + if (pEventRef.uiFlags & EVENT_EXPIRED) { - if ( PeekEvent( &pEvent, cnt, SECONDARY_EVENT_QUEUE) == FALSE ) - { - return( FALSE ); - } - - // Check time - if ( pEvent->uiFlags & EVENT_EXPIRED ) - { - RemoveEvent( &pEvent, cnt, SECONDARY_EVENT_QUEUE ); - FreeEvent( pEvent ); - // Restart loop - break; - - } - + RemoveEventFromSecondaryEventQueue(&pEventRef, i); + FreeEventData(&pEventRef); } - - if ( cnt == uiQueueSize ) - { - fCompleteLoop = TRUE; - } - - } while( fCompleteLoop == FALSE ); + } return( TRUE ); } + BOOLEAN DequeueAllDemandGameEvents( BOOLEAN fExecute ) { - EVENT *pEvent; + EVENT pEvent; // Dequeue all events on the demand queue (only) while( EventQueueSize( DEMAND_EVENT_QUEUE ) > 0 ) { // Get Event - if ( RemoveEvent( &pEvent, 0, DEMAND_EVENT_QUEUE) == FALSE ) + if ( PopEvent( &pEvent, DEMAND_EVENT_QUEUE) == FALSE ) { return( FALSE ); } @@ -893,18 +1035,18 @@ BOOLEAN DequeueAllDemandGameEvents( BOOLEAN fExecute ) if ( fExecute ) { // Check if event has a delay and add to secondary queue if so - if ( pEvent->usDelay > 0 ) + if ( pEvent.usDelay > 0 ) { - AddGameEventToQueue( pEvent->uiEvent, pEvent->usDelay, pEvent->pData, SECONDARY_EVENT_QUEUE ); + AddGameEventToQueue( pEvent.uiEvent, pEvent.usDelay, pEvent.pData, SECONDARY_EVENT_QUEUE ); } else { - ExecuteGameEvent( pEvent ); + ExecuteGameEvent( &pEvent ); } } // Delete event - FreeEvent( pEvent ); + FreeEventData( &pEvent ); }; @@ -912,7 +1054,6 @@ BOOLEAN DequeueAllDemandGameEvents( BOOLEAN fExecute ) } - BOOLEAN ExecuteGameEvent( EVENT *pEvent ) { SOLDIERTYPE *pSoldier; @@ -1237,17 +1378,16 @@ BOOLEAN ExecuteGameEvent( EVENT *pEvent ) BOOLEAN ClearEventQueue( void ) { // clear out the event queue - EVENT *pEvent; + EVENT pEvent; while( EventQueueSize( PRIMARY_EVENT_QUEUE ) > 0 ) { // Get Event - if ( RemoveEvent( &pEvent, 0, PRIMARY_EVENT_QUEUE) == FALSE ) + if (PopEvent( &pEvent, PRIMARY_EVENT_QUEUE) == FALSE ) { return( FALSE ); } + FreeEventData(&pEvent); } return( TRUE ); } - - diff --git a/Utils/Event Pump.h b/Utils/Event Pump.h index 536d0ab52..b171bca7a 100644 --- a/Utils/Event Pump.h +++ b/Utils/Event Pump.h @@ -1,7 +1,6 @@ #ifndef EVENT_PROCESSOR_H #define EVENT_PROCESSOR_H -#include "Event Manager.h" #include "Overhead Types.h" @@ -271,8 +270,6 @@ BOOLEAN AddGameEventFromNetwork( UINT32 uiEvent, UINT16 usDelay, PTR pEventData BOOLEAN DequeAllGameEvents( BOOLEAN fExecute ); BOOLEAN DequeueAllDemandGameEvents( BOOLEAN fExecute ); -// clean out the evetn queue +// clean out the event queue BOOLEAN ClearEventQueue( void ); - - -#endif \ No newline at end of file +#endif