801 lines
34 KiB
XML
Executable File
801 lines
34 KiB
XML
Executable File
//╒═════════════════════════════════════════════════════════════════════════════╕
|
|
//│ Load Queue Private Header │
|
|
//╞═════════════════════════════════════════════════════════════════════════════╡
|
|
//│ │
|
|
//│ AUTHOR: Ben Rollinson │
|
|
//│ DATE: 23/06/14 │
|
|
//│ DESCRIPTION: The private commands for queuing up load │
|
|
//│ requests to be scheduled over multiple frames. │
|
|
//│ │
|
|
//╘═════════════════════════════════════════════════════════════════════════════╛
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_audio.sch"
|
|
USING "commands_script.sch"
|
|
|
|
// Queue sizes.
|
|
CONST_INT LOAD_QUEUE_SIZE_SMALL 5
|
|
CONST_INT LOAD_QUEUE_SIZE_MEDIUM 8
|
|
CONST_INT LOAD_QUEUE_SIZE_LARGE 15
|
|
CONST_INT LOAD_QUEUE_SIZE_LIGHT 15
|
|
|
|
// LoadQueueData struct state bitflags.
|
|
// Count down from 30 as the first X bits are used to store the load type.
|
|
CONST_INT BIT_LQD_USED 30
|
|
CONST_INT BIT_LQD_REQUESTED 29
|
|
CONST_INT BIT_LQD_PRIORITY_TD 28 // Priority texture dictionary.
|
|
CONST_INT BIT_LQD_OVER_NETWORK 27 // Load audio bank over network.
|
|
CONST_INT BIT_LQD_CLEAR_BRIEF 26 // Clear brief when releasing additional text.
|
|
|
|
|
|
// Different types of items that can exist in the load queue.
|
|
ENUM LoadQueueType
|
|
LQT_INVALID = -1,
|
|
|
|
LQT_MODEL, // 0
|
|
LQT_ANIM_DICT, // 1
|
|
LQT_CLIP_SET, // 2
|
|
LQT_TEXT_DICT, // 3
|
|
LQT_VEH_REC, // 4
|
|
LQT_WAYPOINT_REC, // 5
|
|
LQT_AUDIO_BANK, // 6
|
|
LQT_SCRIPT, // 7
|
|
LQT_ADDIT_TEXT, // 8
|
|
LQT_PTFX_ASSET, // 9
|
|
//Note: The values of these musn't extend into the BIT_LQD_ bit range!
|
|
|
|
MAX_LQT_PTFX
|
|
ENDENUM
|
|
|
|
|
|
// Struct definiton for a single load request in a load queue with a text field.
|
|
STRUCT LoadQueueData
|
|
INT iState
|
|
INT iData
|
|
TEXT_LABEL_63 txtData
|
|
ENDSTRUCT
|
|
|
|
// Struct definiton for a single load request in a load queue without a text field to save on stack sizes.
|
|
STRUCT LoadQueueDataLight
|
|
INT iState
|
|
INT iData
|
|
ENDSTRUCT
|
|
|
|
|
|
// Load queue data struct definitions. To be instantiated
|
|
// by scripts that require load queue support.
|
|
STRUCT LoadQueueSmall
|
|
LoadQueueData sQueue[LOAD_QUEUE_SIZE_SMALL]
|
|
BOOL bLoading
|
|
INT iLastFrame
|
|
INT iFrameDelay = 1
|
|
ENDSTRUCT
|
|
|
|
STRUCT LoadQueueMedium
|
|
LoadQueueData sQueue[LOAD_QUEUE_SIZE_MEDIUM]
|
|
BOOL bLoading
|
|
INT iLastFrame
|
|
INT iFrameDelay = 1
|
|
ENDSTRUCT
|
|
|
|
STRUCT LoadQueueLarge
|
|
LoadQueueData sQueue[LOAD_QUEUE_SIZE_LARGE]
|
|
BOOL bLoading
|
|
INT iLastFrame
|
|
INT iFrameDelay = 1
|
|
ENDSTRUCT
|
|
|
|
STRUCT LoadQueueLight
|
|
LoadQueueDataLight sQueue[LOAD_QUEUE_SIZE_LIGHT]
|
|
BOOL bLoading
|
|
INT iLastFrame
|
|
INT iFrameDelay = 1
|
|
ENDSTRUCT
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
FUNC STRING PRIVATE_Get_Load_Queue_Type_Debug_String(LoadQueueType paramType)
|
|
SWITCH paramType
|
|
CASE LQT_INVALID RETURN "INVALID" BREAK
|
|
CASE LQT_MODEL RETURN "MODEL" BREAK
|
|
CASE LQT_ANIM_DICT RETURN "ANIM_DICT" BREAK
|
|
CASE LQT_CLIP_SET RETURN "CLIP_SET" BREAK
|
|
CASE LQT_TEXT_DICT RETURN "TEXT_DICT" BREAK
|
|
CASE LQT_VEH_REC RETURN "VEH_REC" BREAK
|
|
CASE LQT_WAYPOINT_REC RETURN "WAYPOINT_REC" BREAK
|
|
CASE LQT_AUDIO_BANK RETURN "AUDIO_BANK" BREAK
|
|
CASE LQT_SCRIPT RETURN "SCRIPT" BREAK
|
|
CASE LQT_ADDIT_TEXT RETURN "ADDIT_TEXT" BREAK
|
|
CASE LQT_PTFX_ASSET RETURN "PTFX_ASSET" BREAK
|
|
ENDSWITCH
|
|
|
|
SCRIPT_ASSERT("PRIVATE_Get_Load_Queue_Type_Debug_String: Missing debug string for load queue type. Bug BenR.")
|
|
RETURN "ERROR!"
|
|
ENDFUNC
|
|
#ENDIF
|
|
|
|
FUNC BOOL PRIVATE_Is_Load_Queue_Type_Supported_In_Light_Queue(LoadQueueType paramType)
|
|
SWITCH paramType
|
|
CASE LQT_INVALID RETURN FALSE BREAK
|
|
CASE LQT_MODEL RETURN TRUE BREAK
|
|
CASE LQT_ANIM_DICT RETURN FALSE BREAK
|
|
CASE LQT_CLIP_SET RETURN FALSE BREAK
|
|
CASE LQT_TEXT_DICT RETURN FALSE BREAK
|
|
CASE LQT_VEH_REC RETURN FALSE BREAK
|
|
CASE LQT_WAYPOINT_REC RETURN FALSE BREAK
|
|
CASE LQT_AUDIO_BANK RETURN FALSE BREAK
|
|
CASE LQT_SCRIPT RETURN TRUE BREAK
|
|
CASE LQT_ADDIT_TEXT RETURN FALSE BREAK
|
|
CASE LQT_PTFX_ASSET RETURN TRUE BREAK
|
|
ENDSWITCH
|
|
|
|
SCRIPT_ASSERT("PRIVATE_Is_Load_Queue_Type_Supported_In_Light_Queue: Missing type definition in function. Bug BenR.")
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
FUNC LoadQueueType PRIVATE_Get_Type_From_Bitset(INT paramStateBitset)
|
|
INT i
|
|
REPEAT MAX_LQT_PTFX i
|
|
IF IS_BIT_SET(paramStateBitset, i)
|
|
RETURN INT_TO_ENUM(LoadQueueType, i)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SCRIPT_ASSERT("PRIVATE_Get_Type_From_Bitset: No type bits were set for the load queue data passed. Bug BenR.")
|
|
RETURN LQT_INVALID
|
|
ENDFUNC
|
|
|
|
|
|
PROC PRIVATE_Clean_Up_Load_Queue_Data(LoadQueueData ¶mData)
|
|
paramData.iState = 0
|
|
paramData.iData = -1
|
|
paramData.txtData = "NULL"
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Clean_Up_Load_Queue_Data_Light(LoadQueueDataLight ¶mData)
|
|
paramData.iState = 0
|
|
paramData.iData = -1
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Copy_Load_Queue_Data(LoadQueueData ¶mFrom, LoadQueueData ¶mTo)
|
|
paramTo.iState = paramFrom.iState
|
|
paramTo.iData = paramFrom.iData
|
|
paramTo.txtData = paramFrom.txtData
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Copy_Load_Queue_Data_Light(LoadQueueDataLight ¶mFrom, LoadQueueDataLight ¶mTo)
|
|
paramTo.iState = paramFrom.iState
|
|
paramTo.iData = paramFrom.iData
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Make_Queued_Load_Generic(INT ¶mState, STRING paramTextData, INT paramIntData)
|
|
IF IS_BIT_SET(paramState, BIT_LQD_USED)
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Making queued load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(PRIVATE_Get_Type_From_Bitset(paramState)), "|", paramIntData, "|", paramTextData, "] on frame ", GET_FRAME_COUNT(), ".")
|
|
|
|
SWITCH PRIVATE_Get_Type_From_Bitset(paramState)
|
|
CASE LQT_MODEL REQUEST_MODEL(INT_TO_ENUM(MODEL_NAMES, paramIntData)) BREAK
|
|
CASE LQT_ANIM_DICT REQUEST_ANIM_DICT(paramTextData) BREAK
|
|
CASE LQT_CLIP_SET REQUEST_CLIP_SET(paramTextData) BREAK
|
|
CASE LQT_TEXT_DICT REQUEST_STREAMED_TEXTURE_DICT(paramTextData, IS_BIT_SET(paramState, BIT_LQD_PRIORITY_TD)) BREAK
|
|
CASE LQT_VEH_REC REQUEST_VEHICLE_RECORDING(paramIntData, paramTextData) BREAK
|
|
CASE LQT_WAYPOINT_REC REQUEST_WAYPOINT_RECORDING(paramTextData) BREAK
|
|
CASE LQT_AUDIO_BANK REQUEST_SCRIPT_AUDIO_BANK(paramTextData, IS_BIT_SET(paramState, BIT_LQD_OVER_NETWORK)) BREAK
|
|
CASE LQT_SCRIPT REQUEST_SCRIPT_WITH_NAME_HASH(paramIntData) BREAK
|
|
CASE LQT_ADDIT_TEXT REQUEST_ADDITIONAL_TEXT(paramTextData, INT_TO_ENUM(TEXT_BLOCK_SLOTS, paramIntData)) BREAK
|
|
CASE LQT_PTFX_ASSET REQUEST_PTFX_ASSET() BREAK
|
|
|
|
DEFAULT SCRIPT_ASSERT("PRIVATE_Make_Queued_Load: Unrecognised request type. Bug BenR.") BREAK
|
|
ENDSWITCH
|
|
SET_BIT(paramState, BIT_LQD_REQUESTED)
|
|
ELSE
|
|
SCRIPT_ASSERT("PRIVATE_Make_Queued_Load: Tried to make a request from a queue slot that is not in use. Bug BenR.")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Make_Queued_Load(LoadQueueData ¶mData)
|
|
PRIVATE_Make_Queued_Load_Generic(paramData.iState, paramData.txtData, paramData.iData)
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Make_Queued_Load_Light(LoadQueueDataLight ¶mData)
|
|
PRIVATE_Make_Queued_Load_Generic(paramData.iState, "NULL", paramData.iData)
|
|
ENDPROC
|
|
|
|
|
|
FUNC BOOL PRIVATE_Has_Queued_Load_Loaded_Generic(INT paramState, STRING paramTextData, INT paramIntData)
|
|
IF IS_BIT_SET(paramState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramState, BIT_LQD_REQUESTED)
|
|
SWITCH PRIVATE_Get_Type_From_Bitset(paramState)
|
|
CASE LQT_MODEL RETURN HAS_MODEL_LOADED(INT_TO_ENUM(MODEL_NAMES, paramIntData)) BREAK
|
|
CASE LQT_ANIM_DICT RETURN HAS_ANIM_DICT_LOADED(paramTextData) BREAK
|
|
CASE LQT_CLIP_SET RETURN HAS_CLIP_SET_LOADED(paramTextData) BREAK
|
|
CASE LQT_TEXT_DICT RETURN HAS_STREAMED_TEXTURE_DICT_LOADED(paramTextData) BREAK
|
|
CASE LQT_VEH_REC RETURN HAS_VEHICLE_RECORDING_BEEN_LOADED(paramIntData, paramTextData) BREAK
|
|
CASE LQT_WAYPOINT_REC RETURN GET_IS_WAYPOINT_RECORDING_LOADED(paramTextData) BREAK
|
|
CASE LQT_AUDIO_BANK RETURN REQUEST_SCRIPT_AUDIO_BANK(paramTextData, IS_BIT_SET(paramState, BIT_LQD_OVER_NETWORK)) BREAK
|
|
CASE LQT_SCRIPT RETURN HAS_SCRIPT_WITH_NAME_HASH_LOADED(paramIntData) BREAK
|
|
CASE LQT_ADDIT_TEXT RETURN HAS_ADDITIONAL_TEXT_LOADED(INT_TO_ENUM(TEXT_BLOCK_SLOTS, paramIntData)) BREAK
|
|
CASE LQT_PTFX_ASSET RETURN HAS_PTFX_ASSET_LOADED() BREAK
|
|
|
|
DEFAULT SCRIPT_ASSERT("PRIVATE_Has_Queued_Load_Loaded: Unrecognised request type. Bug BenR.") BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
SCRIPT_ASSERT("PRIVATE_Has_Queued_Load_Loaded: Tried to check if an empty queue index has loaded. Bug BenR.")
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL PRIVATE_Has_Queued_Load_Loaded(LoadQueueData ¶mData)
|
|
RETURN PRIVATE_Has_Queued_Load_Loaded_Generic(paramData.iState, paramData.txtData, paramData.iData)
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL PRIVATE_Has_Queued_Load_Loaded_Light(LoadQueueDataLight ¶mData)
|
|
RETURN PRIVATE_Has_Queued_Load_Loaded_Generic(paramData.iState, "NULL", paramData.iData)
|
|
ENDFUNC
|
|
|
|
|
|
PROC PRIVATE_Set_Queued_Load_As_No_Longer_Needed_Generic(INT paramState, STRING paramTextData, INT paramIntData)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Setting queued load as no longer needed [", PRIVATE_Get_Load_Queue_Type_Debug_String(PRIVATE_Get_Type_From_Bitset(paramState)), "|", paramIntData, "|", paramTextData, "].")
|
|
|
|
IF IS_BIT_SET(paramState, BIT_LQD_USED)
|
|
SWITCH PRIVATE_Get_Type_From_Bitset(paramState)
|
|
CASE LQT_MODEL SET_MODEL_AS_NO_LONGER_NEEDED(INT_TO_ENUM(MODEL_NAMES, paramIntData)) BREAK
|
|
CASE LQT_ANIM_DICT REMOVE_ANIM_DICT(paramTextData) BREAK
|
|
CASE LQT_CLIP_SET REMOVE_CLIP_SET(paramTextData) BREAK
|
|
CASE LQT_TEXT_DICT SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(paramTextData) BREAK
|
|
CASE LQT_VEH_REC REMOVE_VEHICLE_RECORDING(paramIntData, paramTextData) BREAK
|
|
CASE LQT_WAYPOINT_REC REMOVE_WAYPOINT_RECORDING(paramTextData) BREAK
|
|
CASE LQT_AUDIO_BANK RELEASE_SCRIPT_AUDIO_BANK() BREAK
|
|
CASE LQT_SCRIPT SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(paramIntData) BREAK
|
|
CASE LQT_ADDIT_TEXT CLEAR_ADDITIONAL_TEXT( INT_TO_ENUM(TEXT_BLOCK_SLOTS, paramIntData),
|
|
IS_BIT_SET(paramState, BIT_LQD_CLEAR_BRIEF)) BREAK
|
|
CASE LQT_PTFX_ASSET REMOVE_PTFX_ASSET() BREAK
|
|
|
|
DEFAULT SCRIPT_ASSERT("PRIVATE_Set_Queued_Load_As_No_Longer_Needed: Unrecognised request type. Bug BenR.") BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
SCRIPT_ASSERT("PRIVATE_Set_Queued_Load_As_No_Longer_Needed: Tried to set an empty queue index as no longer needed. Bug BenR.")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Set_Queued_Load_As_No_Longer_Needed(LoadQueueData ¶mData)
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed_Generic(paramData.iState, paramData.txtData, paramData.iData)
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Set_Queued_Load_As_No_Longer_Needed_Light(LoadQueueDataLight ¶mData)
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed_Generic(paramData.iState, "NULL", paramData.iData)
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Small_Add_Data(LoadQueueSmall ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, INT paramBitSettings = 0)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to queue load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in small queue.")
|
|
|
|
//First check this item isn't already queued.
|
|
INT i
|
|
REPEAT LOAD_QUEUE_SIZE_SMALL i
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[i].iData = paramIntData
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[i].txtData, paramStringData)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag the queue as loading if it isn't already.
|
|
IF NOT paramQueue.bLoading
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Flagged queue as loading.")
|
|
paramQueue.bLoading = TRUE
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queuing load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in small queue.")
|
|
|
|
//Find a free slot in the queue and add the load request.
|
|
REPEAT LOAD_QUEUE_SIZE_SMALL i
|
|
IF NOT IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found slot ", i, " as free.")
|
|
paramQueue.sQueue[i].txtData = paramStringData
|
|
paramQueue.sQueue[i].iData = paramIntData
|
|
paramQueue.sQueue[i].iState = paramBitSettings
|
|
SET_BIT(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
SET_BIT(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
EXIT
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//No free slots.
|
|
SCRIPT_ASSERT("PRIVATE_Request_Queue_Small_Add_Data: The queue was full. Use a larger queue size?")
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Medium_Add_Data(LoadQueueMedium ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, INT paramBitSettings = 0)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to queue load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in medium queue.")
|
|
|
|
//First check this item isn't already queued.
|
|
INT i
|
|
REPEAT LOAD_QUEUE_SIZE_MEDIUM i
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[i].iData = paramIntData
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[i].txtData, paramStringData)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag the queue as loading if it isn't already.
|
|
IF NOT paramQueue.bLoading
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Flagged queue as loading.")
|
|
paramQueue.bLoading = TRUE
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queuing load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in medium queue.")
|
|
|
|
//Find a free slot in the queue and add the load request.
|
|
REPEAT LOAD_QUEUE_SIZE_MEDIUM i
|
|
IF NOT IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found slot ", i, " as free.")
|
|
paramQueue.sQueue[i].txtData = paramStringData
|
|
paramQueue.sQueue[i].iData = paramIntData
|
|
paramQueue.sQueue[i].iState = paramBitSettings
|
|
SET_BIT(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
SET_BIT(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
EXIT
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//No free slots.
|
|
SCRIPT_ASSERT("PRIVATE_Request_Queue_Medium_Add_Data: The queue was full. Use a larger queue size?")
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Large_Add_Data(LoadQueueLarge ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, INT paramBitSettings = 0)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to queue load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in large queue.")
|
|
|
|
//First check this item isn't already queued.
|
|
INT i
|
|
REPEAT LOAD_QUEUE_SIZE_LARGE i
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[i].iData = paramIntData
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[i].txtData, paramStringData)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag the queue as loading if it isn't already.
|
|
IF NOT paramQueue.bLoading
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Flagged queue as loading.")
|
|
paramQueue.bLoading = TRUE
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queuing load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] in large queue.")
|
|
|
|
//Find a free slot in the queue and add the load request.
|
|
REPEAT LOAD_QUEUE_SIZE_LARGE i
|
|
IF NOT IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found slot ", i, " as free.")
|
|
paramQueue.sQueue[i].txtData = paramStringData
|
|
paramQueue.sQueue[i].iData = paramIntData
|
|
paramQueue.sQueue[i].iState = paramBitSettings
|
|
SET_BIT(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
SET_BIT(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
EXIT
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//No free slots.
|
|
SCRIPT_ASSERT("PRIVATE_Request_Queue_Large_Add_Data: The queue was full. Do we need to create a larger queue size?")
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Light_Add_Data(LoadQueueLight ¶mQueue, LoadQueueType paramType, INT paramIntData, INT paramBitSettings = 0)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to queue load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "] in light queue.")
|
|
|
|
IF NOT PRIVATE_Is_Load_Queue_Type_Supported_In_Light_Queue(paramType)
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Type ", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), " is not supported in light load queues. Please use LoadQueueSmall/LoadQueueMedium/LoadQueueLarge for loads requiring text data.")
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_63 tlError = "No support for "
|
|
tlError += PRIVATE_Get_Load_Queue_Type_Debug_String(paramType)
|
|
tlError += " in light queues. Ask BenR"
|
|
SCRIPT_ASSERT(tlError)
|
|
#ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
//First check this item isn't already queued.
|
|
INT i
|
|
REPEAT LOAD_QUEUE_SIZE_LIGHT i
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[i].iData = paramIntData
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Already in queue.")
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag the queue as loading if it isn't already.
|
|
IF NOT paramQueue.bLoading
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Flagged queue as loading.")
|
|
paramQueue.bLoading = TRUE
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queuing load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "] in light queue.")
|
|
|
|
//Find a free slot in the queue and add the load request.
|
|
REPEAT LOAD_QUEUE_SIZE_LIGHT i
|
|
IF NOT IS_BIT_SET(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found slot ", i, " as free.")
|
|
paramQueue.sQueue[i].iData = paramIntData
|
|
paramQueue.sQueue[i].iState = paramBitSettings
|
|
SET_BIT(paramQueue.sQueue[i].iState, ENUM_TO_INT(paramType))
|
|
SET_BIT(paramQueue.sQueue[i].iState, BIT_LQD_USED)
|
|
EXIT
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//No free slots.
|
|
SCRIPT_ASSERT("PRIVATE_Request_Queue_Light_Add_Data: The queue was full. Do we need to create a larger queue size?")
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Small_Remove_Data(LoadQueueSmall ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, BOOL paramSetAsNoLongerNeeded = FALSE)
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to remove load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] from small queue.")
|
|
|
|
//Find the array index this item is at.
|
|
INT iSearchIndex = 0
|
|
BOOL bFoundItem = FALSE
|
|
WHILE NOT bFoundItem AND iSearchIndex < LOAD_QUEUE_SIZE_SMALL
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[iSearchIndex].iData = paramIntData
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[iSearchIndex].txtData, paramStringData)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
iSearchIndex++
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundItem
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> The item was not found in the queue. Nothing to remove.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Remove the item from memory if requested.
|
|
IF paramSetAsNoLongerNeeded
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Unloading item from memory as we remove it.")
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
|
|
//Iterate through items at higher indexes in the queue and move them up one space.
|
|
BOOL bFoundQueueEnd = FALSE
|
|
WHILE NOT bFoundQueueEnd AND iSearchIndex < (LOAD_QUEUE_SIZE_SMALL - 1)
|
|
iSearchIndex++
|
|
|
|
//Is the next queue item in use?
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
//Yes, copy it down one space.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Copying queue index ", iSearchIndex, " over index ", iSearchIndex - 1, ".")
|
|
PRIVATE_Copy_Load_Queue_Data(paramQueue.sQueue[iSearchIndex], paramQueue.sQueue[iSearchIndex-1])
|
|
ELSE
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was not in use. Clearing index ", iSearchIndex -1, ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex-1])
|
|
bFoundQueueEnd = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundQueueEnd
|
|
// clear the index we just removed at the queue end
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was the last index in queue. Clearing index ", iSearchIndex , ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Medium_Remove_Data(LoadQueueMedium ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, BOOL paramSetAsNoLongerNeeded = FALSE)
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to remove load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] from medium queue.")
|
|
|
|
//Find the array index this item is at.
|
|
INT iSearchIndex = 0
|
|
BOOL bFoundItem = FALSE
|
|
WHILE NOT bFoundItem AND iSearchIndex < LOAD_QUEUE_SIZE_MEDIUM
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[iSearchIndex].iData = paramIntData
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[iSearchIndex].txtData, paramStringData)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
iSearchIndex++
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundItem
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> The item was not found in the queue. Nothing to remove.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Remove the item from memory if requested.
|
|
IF paramSetAsNoLongerNeeded
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Unloading item from memory as we remove it.")
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
|
|
//Iterate through items at higher indexes in the queue and move them up one space.
|
|
BOOL bFoundQueueEnd = FALSE
|
|
WHILE NOT bFoundQueueEnd AND iSearchIndex < (LOAD_QUEUE_SIZE_MEDIUM - 1)
|
|
iSearchIndex++
|
|
|
|
//Is the next queue item in use?
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
//Yes, copy it down one space.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Copying queue index ", iSearchIndex, " over index ", iSearchIndex - 1, ".")
|
|
PRIVATE_Copy_Load_Queue_Data(paramQueue.sQueue[iSearchIndex], paramQueue.sQueue[iSearchIndex-1])
|
|
ELSE
|
|
//No, we've found the end of the used queue.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was not in use. Clearing index ", iSearchIndex -1, ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex-1])
|
|
bFoundQueueEnd = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundQueueEnd
|
|
// clear the index we just removed at the queue end
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was the last index in queue. Clearing index ", iSearchIndex , ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Large_Remove_Data(LoadQueueLarge ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, BOOL paramSetAsNoLongerNeeded = FALSE)
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to remove load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] from large queue.")
|
|
|
|
//Find the array index this item is at.
|
|
INT iSearchIndex = 0
|
|
BOOL bFoundItem = FALSE
|
|
WHILE NOT bFoundItem AND iSearchIndex < LOAD_QUEUE_SIZE_LARGE
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[iSearchIndex].iData = paramIntData
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType <> LQT_VEH_REC // vehicle recs for the same mission will often have the same stringdata
|
|
IF NOT ARE_STRINGS_EQUAL(paramStringData, "NULL")
|
|
IF ARE_STRINGS_EQUAL(paramQueue.sQueue[iSearchIndex].txtData, paramStringData)
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
iSearchIndex++
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundItem
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> The item was not found in the queue. Nothing to remove.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Remove the item from memory if requested.
|
|
IF paramSetAsNoLongerNeeded
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Unloading item from memory as we remove it.")
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
|
|
//Iterate through items at higher indexes in the queue and move them up one space.
|
|
BOOL bFoundQueueEnd = FALSE
|
|
WHILE NOT bFoundQueueEnd AND iSearchIndex < (LOAD_QUEUE_SIZE_LARGE - 1)
|
|
iSearchIndex++
|
|
|
|
//Is the next queue item in use?
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
//Yes, copy it down one space.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Copying queue index ", iSearchIndex, " over index ", iSearchIndex - 1, ".")
|
|
PRIVATE_Copy_Load_Queue_Data(paramQueue.sQueue[iSearchIndex], paramQueue.sQueue[iSearchIndex-1])
|
|
ELSE
|
|
//No, we've found the end of the used queue.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was not in use. Clearing index ", iSearchIndex -1, ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex-1])
|
|
bFoundQueueEnd = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundQueueEnd
|
|
// clear the index we just removed at the queue end
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was the last index in queue. Clearing index ", iSearchIndex , ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC PRIVATE_Load_Queue_Light_Remove_Data(LoadQueueLight ¶mQueue, LoadQueueType paramType, INT paramIntData, STRING paramStringData, BOOL paramSetAsNoLongerNeeded = FALSE)
|
|
CPRINTLN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Attempting to remove load request [", PRIVATE_Get_Load_Queue_Type_Debug_String(paramType), "|", paramIntData, "|", paramStringData, "] from light queue.")
|
|
paramIntData = paramIntData
|
|
paramStringData = paramStringData
|
|
|
|
//Find the array index this item is at.
|
|
INT iSearchIndex = 0
|
|
BOOL bFoundItem = FALSE
|
|
WHILE NOT bFoundItem AND iSearchIndex < LOAD_QUEUE_SIZE_LIGHT
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, ENUM_TO_INT(paramType))
|
|
IF paramIntData != -1
|
|
IF paramQueue.sQueue[iSearchIndex].iData = paramIntData
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
IF paramType = LQT_PTFX_ASSET
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Found item at queue index ", iSearchIndex, ".")
|
|
bFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bFoundItem
|
|
iSearchIndex++
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundItem
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> The item was not found in the queue. Nothing to remove.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Remove the item from memory if requested.
|
|
IF paramSetAsNoLongerNeeded
|
|
CDEBUG1LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Unloading item from memory as we remove it.")
|
|
PRIVATE_Set_Queued_Load_As_No_Longer_Needed(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
|
|
//Iterate through items at higher indexes in the queue and move them up one space.
|
|
BOOL bFoundQueueEnd = FALSE
|
|
WHILE NOT bFoundQueueEnd AND iSearchIndex < (LOAD_QUEUE_SIZE_LIGHT - 1)
|
|
iSearchIndex++
|
|
|
|
//Is the next queue item in use?
|
|
IF IS_BIT_SET(paramQueue.sQueue[iSearchIndex].iState, BIT_LQD_USED)
|
|
//Yes, copy it down one space.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Copying queue index ", iSearchIndex, " over index ", iSearchIndex - 1, ".")
|
|
PRIVATE_Copy_Load_Queue_Data_Light(paramQueue.sQueue[iSearchIndex], paramQueue.sQueue[iSearchIndex-1])
|
|
ELSE
|
|
//No, we've found the end of the used queue.
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was not in use. Clearing index ", iSearchIndex -1, ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data_Light(paramQueue.sQueue[iSearchIndex-1])
|
|
bFoundQueueEnd = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF NOT bFoundQueueEnd
|
|
// clear the index we just removed at the queue end
|
|
CDEBUG3LN(DEBUG_LOAD_QUEUE, "<", GET_THIS_SCRIPT_NAME(), "> Queue index ", iSearchIndex, " was the last index in queue. Clearing index ", iSearchIndex , ".")
|
|
PRIVATE_Clean_Up_Load_Queue_Data_Light(paramQueue.sQueue[iSearchIndex])
|
|
ENDIF
|
|
ENDPROC
|