Files
gtav-src/script/dev_ng/Code/cover_test.sc
T
2025-09-29 00:52:08 +02:00

581 lines
18 KiB
Python
Executable File

// Do nothing in release mode
#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
// Only include in debug mode
#IF IS_DEBUG_BUILD
////////////////////////////////////////////////////////////////////////////////
// Notes: This is script is to allow easy setup of test scenarios for the code department.
// It works in conjunction with test_tools.sch
// It is a data driven system
////////////////////////////////////////////////////////////////////////////////
// Includes
USING "rage_builtins.sch"
USING "script_xml.sch"
USING "commands_ped.sch"
USING "commands_task.sch"
USING "commands_streaming.sch"
USING "commands_graphics.sch"
USING "commands_debug.sch"
USING "test_tools.sch"
USING "commands_vehicle.sch"
USING "commands_camera.sch"
USING "commands_player.sch"
USING "commands_physics.sch"
USING "script_DEBUG.sch"
USING "commands_event.sch"
USING "commands_script.sch"
USING "commands_entity.sch"
USING "commands_itemsets.sch"
////////////////////////////////////////////////////////////////////////////////
// Definitions
// These enums must match with those in /build/dev/common/data/script/xml/Testbed/TestCoverMenu.xml
ENUM TESTS
TEST_TASK_EXIT_COVER = 0
ENDENUM
// Common states which can be reused across tests
ENUM GENERIC_TEST_STATE_ENUM
STATE_INIT,
STATE_1,
STATE_2,
STATE_3,
STATE_4
ENDENUM
// Exit Cover Mode
ENUM EXIT_COVER_MODE
IDLE_EXIT,
AIMING_EXIT,
CORNER_EXIT
ENDENUM
// Move Blend Values
ENUM MOVE_BLEND_VALUE
STILL,
WALK,
RUN,
SPRINT
ENDENUM
////////////////////////////////////////////////////////////////////////////////
// Constants
CONST_INT MAX_NUMBER_OF_PEDS 10
CONST_INT MAX_NUMBER_OF_VEHICLES 10
CONST_INT MAX_NUMBER_OF_NODES 7
CONST_INT MAX_NUMBER_OF_CAMERAS 2
CONST_INT MAX_NUMBER_OF_OBJECTS 1
CONST_INT MAX_NUMBER_OF_COVER_POINTS 10
CONST_INT FixedCamera 0
CONST_INT TrackingCamera 1
////////////////////////////////////////////////////////////////////////////////
// Defaults values when the test is reset to factory the standard values are used
STRING XMLMenu = "Testbed/TestCoverMenu"
VECTOR gvMapOffset //offset all coords from the origin by the psoition of the mapin world coords
// Arrays of actors
peds_struct TestPeds[MAX_NUMBER_OF_PEDS]
vehicle_struct TestVehicles[MAX_NUMBER_OF_VEHICLES]
RouteStruct Route[MAX_NUMBER_OF_NODES]
StCameraData TestCams[MAX_NUMBER_OF_CAMERAS]
Object_struct TestObjects[MAX_NUMBER_OF_OBJECTS]
coverpoint_index CoverPoints[MAX_NUMBER_OF_COVER_POINTS]
// Stores the state of the test
GENERIC_TEST_STATE_ENUM TEST_STATE = STATE_INIT
INT EXIT_COVER_TYPE = ENUM_TO_INT(IDLE_EXIT)
INT MOVE_BLEND_TYPE = ENUM_TO_INT(WALK)
BOOL bUseGoToPointAimingTask = FALSE
BOOL bTestLeftCoverPoint = FALSE
VECTOR vGoToAndAimCoords
SEQUENCE_INDEX TEST_SEQUENCE
////////////////////////////////////////////////////////////////////////////////
// Create Debug Rag Widgets
PROC CREATE_TEST_WIDGET ()
START_WIDGET_GROUP("Cover Test")
SETUP_WIDGET ()
START_WIDGET_GROUP("TEST_EXIT_COVER")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("IDLE_EXIT")
ADD_TO_WIDGET_COMBO("AIMING_EXIT")
ADD_TO_WIDGET_COMBO("CORNER_EXIT")
STOP_WIDGET_COMBO("EXIT_COVER_TYPE", EXIT_COVER_TYPE)
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("STILL")
ADD_TO_WIDGET_COMBO("WALK")
ADD_TO_WIDGET_COMBO("RUN")
ADD_TO_WIDGET_COMBO("SPRINT")
STOP_WIDGET_COMBO("MOVE_BLEND_TYPE", MOVE_BLEND_TYPE)
ADD_WIDGET_BOOL ("USE GO TO POINT AIMING", bUseGoToPointAimingTask)
ADD_WIDGET_BOOL ("TEST LEFT COVER POINT", bTestLeftCoverPoint)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
////////////////////////////////////////////////////////////////////////////////
//Mission flow House keeping
//PUPROSE: Removes all the scenarios and resets all the relationships
PROC Cleanup_Scenario_Entities ()
int index = 0
for index = 0 to MAX_NUMBER_OF_PEDS -1
CLEAN_UP_PED_ENTITIES (TestPeds[index].ped)
ENDFOR
for index = 0 to MAX_NUMBER_OF_VEHICLES -1
CLEAN_UP_VEHICLE_ENTITIES (TestVehicles[index].Vehicle )
ENDFOR
for index = 0 to MAX_NUMBER_OF_OBJECTS -1
CLEAN_UP_OBJECT_ENTITIES (TestObjects[index].Object)
ENDFOR
Set_Gang_Relationships (FALSE)
ENDPROC
PROC Terminate_test_script ()
if IS_KEYBOARD_KEY_JUST_PRESSED (KEY_S)
CLEAR_PRINTS ()
CLEAR_HELP ()
Cleanup_Scenario_Entities ()
Temp_cleanup_scenario_cams ()
SET_PLAYER_COLISION(scplayer, true)
IF NOT IS_PED_INJURED (scplayer)
SET_PED_COORDS_KEEP_VEHICLE(scplayer, GET_PLAYER_START_POS () + gvMapOffset)
ENDIF
TERMINATE_THIS_THREAD ()
ENDIF
ENDPROC
PROC INITALISE_TEST_STATE()
//reset each test
SingleTaskStatus = startSingleTask
TEST_STATE = STATE_INIT
//end reset
ENDPROC
//END: Mission flow House keeping
////////////////////////////////////////////////////////////////////////////////
// Individual test setup
FUNC COVER_EXIT_TYPE GET_COVER_EXIT_TYPE_FROM_WIDGETS()
COVER_EXIT_TYPE RETURN_VALUE
SWITCH INT_TO_ENUM(EXIT_COVER_MODE, EXIT_COVER_TYPE)
CASE IDLE_EXIT
RETURN_VALUE = IDLE_COVER_EXIT
BREAK
CASE AIMING_EXIT
RETURN_VALUE = AIMING_COVER_EXIT
BREAK
CASE CORNER_EXIT
RETURN_VALUE = CORNER_COVER_EXIT
BREAK
ENDSWITCH
RETURN RETURN_VALUE
ENDFUNC
FUNC FLOAT GET_MOVE_BLEND_RATIO_FROM_WIDGETS()
FLOAT RETURN_VALUE
SWITCH INT_TO_ENUM(MOVE_BLEND_VALUE, MOVE_BLEND_TYPE)
CASE STILL
RETURN_VALUE = PEDMOVEBLENDRATIO_STILL
BREAK
CASE WALK
RETURN_VALUE = PEDMOVEBLENDRATIO_WALK
BREAK
CASE RUN
RETURN_VALUE = PEDMOVEBLENDRATIO_RUN
BREAK
CASE SPRINT
RETURN_VALUE = PEDMOVEBLENDRATIO_SPRINT
BREAK
ENDSWITCH
RETURN RETURN_VALUE
ENDFUNC
////////////////////////////////////////////////////////////////////////////////
PROC SETUP_EXIT_COVER_TEST()
TestPeds[0].PedsCoords = <<16.39, 180.50, 6.35>>
TestPeds[0].PedHeading = 0
TestPeds[0].Pedrelgrp = 1
TestPeds[0].PedModel = S_M_M_MARINE_01
TestPeds[0].PedsWeapon = WEAPONTYPE_SMG
TestPeds[0].PedcombatMove = 0
TestPeds[0].pedcombatrange = 2
TestPeds[0].combatcover = CA_USE_COVER
TestPeds[0].bcombatcover = TRUE
TestCams[FixedCamera].cam_pos = <<11.491119,180.890244,9.094440>>
TestCams[FixedCamera].cam_rot = <<-15.693443,-0.000000,-84.970634>>
TestCams[FixedCamera].cam_fov = 65.0
TestCams[FixedCamera].bActivateCam = TRUE
ENDPROC
PROC INIT_EXIT_COVER_TEST()
VECTOR vCoverCoords
IF bTestLeftCoverPoint
vCoverCoords = <<16.35316, 183.15704, 6.35078>>
vGoToAndAimCoords = <<25.97518, 180.19562, 6.35078>>
CoverPoints[0] = ADD_COVER_POINT(vCoverCoords, 270.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
ELSE
vCoverCoords = <<16.39, 180.50, 6.35>>
vGoToAndAimCoords = <<23.50147, 183.79396, 6.35078>>
CoverPoints[0] = ADD_COVER_POINT(vCoverCoords, 270.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180)
ENDIF
SET_ENTITY_COORDS(TestPeds[0].Ped, vCoverCoords)
ENDPROC
PROC RUN_EXIT_COVER_TEST()
PED_INDEX MainPedIndex = TestPeds[0].Ped
COVERPOINT_INDEX CoverIndex = CoverPoints[0]
IF NOT IS_ENTITY_DEAD(MainPedIndex)
SWITCH TEST_STATE
CASE STATE_INIT
TASK_PUT_PED_DIRECTLY_INTO_COVER(MainPedIndex, <<0.0,0.0,0.0>>, -1, FALSE, 0, FALSE, FALSE, CoverIndex)
SETTIMERA(0)
TEST_STATE = STATE_1
BREAK
CASE STATE_1
IF TIMERA() > 1000
FLOAT fMoveBlendRatio
fMoveBlendRatio = GET_MOVE_BLEND_RATIO_FROM_WIDGETS()
ENAV_SCRIPT_FLAGS iFlags
IF fMoveBlendRatio > PEDMOVE_WALK
iFlags = ENAV_NO_STOPPING
ENDIF
OPEN_SEQUENCE_TASK (TEST_SEQUENCE)
TASK_EXIT_COVER(NULL, GET_COVER_EXIT_TYPE_FROM_WIDGETS(), vGoToAndAimCoords)
IF bUseGoToPointAimingTask
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vGoToAndAimCoords, vGoToAndAimCoords, fMoveBlendRatio, FALSE, 0.25, 4.0, FALSE, iFlags)
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD (NULL, vGoToAndAimCoords, fMoveBlendRatio, -1, 0.25, iFlags)
ENDIF
CLOSE_SEQUENCE_TASK (TEST_SEQUENCE)
TASK_PERFORM_SEQUENCE (MainPedIndex, TEST_SEQUENCE)
CLEAR_SEQUENCE_TASK(TEST_SEQUENCE)
TEST_STATE = STATE_2
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC CLEANUP_EXIT_COVER_TEST()
INT index
FOR index = 0 to MAX_NUMBER_OF_COVER_POINTS - 1
IF CoverPoints[index] != NULL
REMOVE_COVER_POINT(CoverPoints[index])
CoverPoints[index] = NULL
ENDIF
ENDFOR
ENDPROC
////////////////////////////////////////////////////////////////////////////////
// Main setup, run once when the test is started
PROC SETUP_TEST_DATA()
SWITCH INT_TO_ENUM(TESTS, gcurrentselection) // the ENUM corresponds to the values from the XML file
CASE TEST_TASK_EXIT_COVER
SETUP_EXIT_COVER_TEST()
BREAK
// CASE TEST_TASK_PUT_PED_DIRECTLY_INTO_COVER
// SETUP_PUT_PED_DIRECTLY_INTO_COVER_TEST())
// BREAK
ENDSWITCH
ENDPROC
// Main init, run each time test is restarted
PROC INIT_TEST()
SWITCH INT_TO_ENUM(TESTS, gcurrentselection) // the ENUM corresponds to the values from the XML file
CASE TEST_TASK_EXIT_COVER
INIT_EXIT_COVER_TEST()
BREAK
// CASE TEST_TASK_PUT_PED_DIRECTLY_INTO_COVER
// INIT_PUT_PED_DIRECTLY_INTO_COVER_TEST())
// BREAK
ENDSWITCH
ENDPROC
// Main run
PROC RUN_TEST()
SWITCH INT_TO_ENUM (TESTS, gcurrentselection) // the ENUM corresponds to the values from the XML file
CASE TEST_TASK_EXIT_COVER
RUN_EXIT_COVER_TEST()
BREAK
// CASE TEST_TASK_PUT_PED_DIRECTLY_INTO_COVER
// RUN_PUT_PED_DIRECTLY_INTO_COVER_TEST())
// BREAK
ENDSWITCH
ENDPROC
// Main cleanup
PROC CLEANUP_TEST()
SWITCH INT_TO_ENUM (TESTS, gcurrentselection) // the ENUM corresponds to the values from the XML file
CASE TEST_TASK_EXIT_COVER
CLEANUP_EXIT_COVER_TEST()
BREAK
// CASE TEST_TASK_PUT_PED_DIRECTLY_INTO_COVER
// CLEANUP_PUT_PED_DIRECTLY_INTO_COVER_TEST())
// BREAK
ENDSWITCH
ENDPROC
////////////////////////////////////////////////////////////////////////////////
//Purpose: Runs the main scenarios
PROC Run_Test_Scenario ()
int index = 0
SWITCH TestScenarioAStatus
//setps up all the data for the sceanrio, this is only called once or if selected in widget
CASE InitialiseScenarioData
PlayerStartPos = GET_PLAYER_START_POS() //sets the players start coords at the default
Bscenario_running = FALSE
INITIALISE_PED_DATA (Testpeds)
INITIALISE_VEHICLE_DATA (TestVehicles)
INITIALISE_CAM_DATA(TestCams )
INITIALISE_OBJECT_DATA(TestObjects)
SETUP_TEST_DATA()
HELP_TEXT_STATE = HTF_SCENARIO_SELECTED_NOT_STARTED
TestScenarioAStatus = CreateScenarioEntities
Temp_Update_Player_With_Scenario(TestCams, scplayer, FALSE, PlayerStartPos) //sets the
BREAK
// Creates all the scenario data
CASE CreateScenarioEntities
Bscenario_running = FALSE
Set_Gang_Relationships (TRUE)
Temp_Update_Player_With_Scenario(TestCams, scplayer, true, PlayerStartPos)
//peds
FOR index = 0 to MAX_NUMBER_OF_PEDS - 1
CREATE_PED_ENTITY(Testpeds[index])
GiveBlipsToPedsGrps (Testpeds[index])
ALTER_COMBAT_STATS (Testpeds[index] )
SWAP_PED_WEAPONS (Testpeds[index])
Block_Peds_Temp_Events (Testpeds[index], TRUE)
SET_PED_DEFENSIVE_AREAS(Testpeds[index] )
ENDFOR
//TestVehicles
FOR Index = 0 to MAX_NUMBER_OF_VEHICLES -1
CREATE_VEHICLE_ENTITY (TestVehicles[index] )
ENDFOR
//TestCams
for index = 0 to MAX_NUMBER_OF_CAMERAS -1
CREATE_CAM_ENTITY (TestCams[index])
ENDFOR
//TestObjects
FOR Index = 0 to MAX_NUMBER_OF_OBJECTS -1
CREATE_OBJECT_ENTITY (TestObjects[index])
ENDFOR
TestScenarioAStatus = SetScenarioEntities
BREAK
CASE SetScenarioEntities
Temp_Update_Player_With_Scenario(TestCams, scplayer, true, PlayerStartPos)
Start_And_Reset_Test ()
IF gBeginCombatScenario
TestScenarioAStatus = RunScenario
gBeginCombatScenario = FALSE
gRun_debuggig = FALSE
Bscenario_running = TRUE
INITALISE_TEST_STATE()
INIT_TEST()
TEMP_ACTIVATE_CAMS (TestCams[FixedCamera].cam )
IF DOES_CAM_EXIST (TestCams[FixedCamera].cam )
HELP_TEXT_STATE = HTF_SCENARIO_RUNNING_FIXED_CAM
ELSE
HELP_TEXT_STATE = HTF_STARTED_RUNNING_NO_CAMS
ENDIF
ENDIF
BREAK
//Runs the actual selected scenario
CASE RunScenario
Temp_Run_Scenario_Tracking_Cam (TestPeds, MAX_NUMBER_OF_PEDS, TestCams[TrackingCamera].cam)
Temp_Update_Player_With_Scenario(TestCams, scplayer, true, PlayerStartPos)
Start_And_Reset_Test ()
Check_For_Scenario_Reset ()
IF DOES_CAM_EXIST (TestCams[TrackingCamera].cam)
if IS_CAM_RENDERING (TestCams[TrackingCamera].cam)
HELP_TEXT_STATE = HTF_SCENARIO_RUNNING_TRACKING_CAM
ELSE
HELP_TEXT_STATE = HTF_SCENARIO_RUNNING_FIXED_CAM
ENDIF
ENDIF
RUN_TEST() //run the main tests
BREAK
CASE CleanupScenario
HELP_TEXT_STATE = HTF_SCENARIO_SELECTED_NOT_STARTED
CLEANUP_TEST()
Cleanup_Scenario_Entities ()
IF gResetToDefault
Temp_cleanup_scenario_cams () //here we are changing scenarios so we need to reset cams
TestScenarioAStatus = InitialiseScenarioData
gResetToDefault = FALSE
ENDIF
IF gResetCombatScenario
Temp_Update_Player_With_Scenario(TestCams, scplayer, FALSE, PlayerStartPos)
gcurrentselection = gSelection
IF DOES_CAM_EXIST (TestCams[FixedCamera].cam)
ACTIVATE_CAM (TestCams[FixedCamera].cam)
ELSE
Temp_cleanup_scenario_cams ()
ENDIF
TestScenarioAStatus = CreateScenarioEntities
gResetCombatScenario = FALSE
ENDIF
BREAK
ENDSWITCH
ENDPROC
SCRIPT
// This allows debug lines to be rendered around peds, vehicles and objects for locate commands.
SET_DEBUG_ACTIVE (TRUE)
gvMapOffset = GET_PLAYER_START_POS ()
SETUP_MISSION_XML_MENU(XMLMenu, KEY_Q)
// Create Debug Rag Widgets
CREATE_TEST_WIDGET()
// Clear the area
SETUP_AREA_FOR_MISSION(<<0.0, 0.0, 0.0>>)
//Gets a reference to the player
GET_THE_PLAYER()
// Set the player ready for the script
SET_PLAYER_COLISION(scplayer, true)
WHILE TRUE
// Controls the help text hides if xml menu is active
TEXT_CONTROLLER()
// Can set all scenario peds invincible from the widget
Set_Scenario_Peds_Invincible (TestPeds, MAX_NUMBER_OF_PEDS, gsetpedsinvincible )
// User can create a debug cam for setting sceanrios
Temp_Create_Debug_Cam (TestCams[FixedCamera])
//Runs the selected option from the XML menu
Run_Selection_From_XML_input ()
//Checks that a valid selection has been input and runs the scenario
IF (gcurrentselection <> InvalidSelection)
Draw_Debug_Info ()
//Sets the test scenario into debug mode
Set_To_Debug ()
if (gRun_debuggig)
Temp_Debug_Scenario (TestPeds, TestVehicles, Route, TestCams[FixedCamera].cam, S_M_Y_COP_01) //Allows the entities in the scneario to be adjusted
Print_Scenario_Data (TestPeds, TestVehicles, Route, TestCams)
ENDIF
Run_Test_Scenario ()
SWITCH_BETWEEN_FIXED_AND_TRACKING (TestCams[FixedCamera].cam)
PRINT_ACTIVE_TEST (Bscenario_running,gRun_debuggig)
ENDIF
Terminate_test_script ()
WAIT (0)
ENDWHILE
ENDSCRIPT
#ENDIF // IS_DEBUG_BUILD