diff --git a/comm/teamdatalink.txt b/comm/teamdatalink.txt new file mode 100644 index 0000000..5ff2354 --- /dev/null +++ b/comm/teamdatalink.txt @@ -0,0 +1,94 @@ +# File generated by Wizard 2.9.0 on Feb 8, 2026. +# File generated by Wizard 2.9.0 on Jan 25, 2026. +# File generated by Wizard 2.9.0 on Dec 23, 2024. +# File generated by Wizard 2.9.0 on Jun 6, 2024. +# -------------------------------------------------------------- +# Vehicle Signatures +# -------------------------------------------------------------- +include_once sensors/radar/acq_radar.txt +infrared_signature VEHICLE_INFRARED_SIGNATURE + constant 10 watts/steradian +end_infrared_signature + +optical_signature VEHICLE_OPTICAL_SIGNATURE + constant 10 m^2 +end_optical_signature + +radar_signature VEHICLE_RADAR_SIGNATURE + constant 1 m^2 +end_radar_signature + +# -------------------------------------------------------------- +# Red datalink +# -------------------------------------------------------------- + +comm TEAM_DATALINK WSF_COMM_TRANSCEIVER + transfer_rate 100 mbits/sec +end_comm +# +comm CC_DATALINK WSF_RADIO_TRANSCEIVER + transmitter + antenna_pattern ACQ_RADAR_ANTENNA + power 1000.0 kw + frequency 3000 mhz + internal_loss 2 db + bandwidth 237 mhz + end_transmitter + + receiver + antenna_pattern ACQ_RADAR_ANTENNA + bandwidth 2.0 mhz + noise_power -160 dbw // will be calibrated for 1 m^2 + internal_loss 7 db + bandwidth 237 mhz + end_receiver +end_comm + +network red_net WSF_COMM_NETWORK_MESH +end_network + +# -------------------------------------------------------------- +# Filter tactics +# -------------------------------------------------------------- + +filter FILTER_TACTICS WSF_KALMAN_FILTER + range_measurement_sigma 50. m + bearing_measurement_sigma 0.1 deg + elevation_measurement_sigma 0.1 deg + + // values for maneuvering targets (per Erik) + process_noise_sigmas_XYZ 50 50 30 +end_filter + + + +// +//the new DATALINK +// +antenna_pattern DATALINK_ANTENNA + uniform_pattern + peak_gain 10 dB + end_uniform_pattern +end_antenna_pattern +comm DATALINK WSF_RADIO_TRANSCEIVER + maximum_range 50 km + transfer_rate 100 mbits/sec + transmit_mode continuous + + transmitter + power 100 w + frequency 1.5 GHz //the matter + bandwidth 10 MHz + antenna_pattern DATALINK_ANTENNA + end_transmitter + + receiver + frequency 1.5 GHz + bandwidth 10 MHz + antenna_pattern DATALINK_ANTENNA + end_receiver + + jamming_perception_threshold 3 db + jamming_perception_timeout 60 sec +end_comm + diff --git a/mission.log b/mission.log index e69de29..506ecef 100644 --- a/mission.log +++ b/mission.log @@ -0,0 +1,37 @@ +2026-02-09 02:26:37 file setup.txt +2026-02-09 02:26:37 file scenarios/red/airDomin.txt +2026-02-09 02:26:37 file platforms/F-16.txt +2026-02-09 02:26:37 file signatures/F-16_sig.txt +2026-02-09 02:26:37 file signatures/F-16_infrared_sig.txt +2026-02-09 02:26:37 file signatures/F-16_optical_sig.txt +2026-02-09 02:26:37 file signatures/F-16_radar_sig.txt +2026-02-09 02:26:37 file processors/scripts/randomPatrol.txt +2026-02-09 02:26:37 file processors/airControl.txt +2026-02-09 02:26:37 file sensors/radar/generic_file_control_radar.txt +2026-02-09 02:26:37 file processors/randomCirclePatrol.txt +2026-02-09 02:26:37 file processors/pathPatrol.txt +2026-02-09 02:26:37 file processors/flyZone.txt +2026-02-09 02:26:37 file processors/boundsAreaPatrol.txt +2026-02-09 02:26:37 file scenarios/blue/airDomin.txt +2026-02-09 02:26:37 file weapons/aam/aa_mrm.txt +2026-02-09 02:26:37 file sensors/radar/aa_mrm_radar.txt +2026-02-09 02:26:37 file processors/aa_intercept.txt +2026-02-09 02:26:37 file scenarios/blue/bomber_formation_01.txt +2026-02-09 02:26:37 file weapons\ssm\blue_cruise_missile.txt +2026-02-09 02:26:37 file platforms/B-1B.txt +2026-02-09 02:26:37 file processors/addfuelstate.txt +2026-02-09 02:26:37 file sensors/geosensor/geo_sensor.txt +2026-02-09 02:26:37 file comm/teamdatalink.txt +2026-02-09 02:26:37 file sensors/radar/acq_radar.txt +2026-02-09 02:26:37 file weapons/ssm/medium_range_radar_missile.txt +2026-02-09 02:26:37 file processors/ucavFire.txt +2026-02-09 02:26:37 file platforms/KC-135.txt +2026-02-09 02:26:37 file processors/patrol_fuel.txt +2026-02-09 02:26:37 file platforms/BSHIP.txt +2026-02-09 02:26:37 file scenarios/red/hangmu.txt +2026-02-09 02:26:37 version wsf 2.9.0 +2026-02-09 02:26:37 file setup.txt +2026-02-09 02:26:37 AER output file: output/vPure.aer +2026-02-09 02:26:37 Event output file: output/vPure.evt +2026-02-09 02:26:37 start 1 +2026-02-09 02:26:40 complete 28800.001 2.207 2.266 diff --git a/output/vPure.aer b/output/vPure.aer index e9a2ba6..805a0a7 100644 Binary files a/output/vPure.aer and b/output/vPure.aer differ diff --git a/output/vPure.log b/output/vPure.log index 7918e93..bf51778 100644 --- a/output/vPure.log +++ b/output/vPure.log @@ -1,6 +1,6 @@ -2025-01-31 11:28:27 version wsf 2.9.0 -2025-01-31 11:28:27 file C:\Users\27173\Desktop\xd1\xd1_vPure\setup.txt -2025-01-31 11:28:27 AER output file: output/vPure.aer -2025-01-31 11:28:27 Event output file: output/vPure.evt -2025-01-31 11:28:27 start 1 -2025-01-31 11:29:07 terminated 2674.579 40.148 31.125 +2026-02-09 02:26:37 version wsf 2.9.0 +2026-02-09 02:26:37 file setup.txt +2026-02-09 02:26:37 AER output file: output/vPure.aer +2026-02-09 02:26:37 Event output file: output/vPure.evt +2026-02-09 02:26:37 start 1 +2026-02-09 02:26:40 complete 28800.001 2.207 2.266 diff --git a/platforms/B-1B.txt b/platforms/B-1B.txt new file mode 100644 index 0000000..a073381 --- /dev/null +++ b/platforms/B-1B.txt @@ -0,0 +1,98 @@ +include_once processors/addfuelstate.txt +include_once sensors/geosensor/geo_sensor.txt +include_once comm/teamdatalink.txt + +include_once weapons/ssm/medium_range_radar_missile.txt + +include_once processors/ucavFire.txt + +platform_type B-1B WSF_PLATFORM +# infrared_signature VEHICLE_INFRARED_SIGNATURE +# optical_signature VEHICLE_OPTICAL_SIGNATURE +# radar_signature VEHICLE_RADAR_SIGNATURE + category airplane + icon f16 + side blue + script_variables + WsfTrack targetTrack; + double startaTime = 0; + double endaTime; + double lastTime = 10; + end_script_variables + + script_variables + string sojZoneName = ""; + + string plat1Name = ""; + string plat2Name = ""; + + double orbitLength = 20000000; + string state = ""; + end_script_variables + processor data_mgr WSF_TRACK_PROCESSOR + purge_interval 60 sec + update_interval 1 sec + end_processor + commander shipblue + //! comm + comm sub_net TEAM_DATALINK + network_name red_net + internal_link track_manager + internal_link data_mgr + internal_link task_mgr + end_comm + processor task_mgr ucavFire + script_variables + SENSOR_NAME = "sensor1"; + WEAPON_NAME = "agm"; + end_script_variables + operating_level ENGAGE 0 + end_processor + processor track_manager WSF_TRACK_PROCESSOR + purge_interval 60 sec + report_interval 5 sec + report_method batch + report_to commander via sub_net + end_processor + mover WSF_AIR_MOVER + update_interval 1 seconds + maximum_impact_speed 300 m/s + altitude_offset 20 meters + at_end_of_path stop + turn_failure_threshold 0.01 + bank_angle_limit 5 degrees + heading_pursuit_gain 5 + maximum_flight_path_angle 70 degrees + maximum_linear_acceleration 6 g + maximum_radial_acceleration 6 g + maximum_altitude 50000 ft + minimum_altitude 10000 ft + maximum_speed 900 m/s + minimum_speed 300 m/s + speed_variance_percent 0.0 + roll_rate_limit 1 rad/sec + maximum_climb_rate 365 m/s + default_linear_acceleration 1 g + default_radial_acceleration 9 g + default_climb_rate 122 m/s + end_mover + + fuel WSF_VARIABLE_RATE_FUEL + rate 0.5 kg/s + maximum_quantity 3160 kg + initial_quantity 3160 kg + end_fuel + + sensor sensor1 common_geo_radar + on + maximum_range 150 km + ignore_same_side + internal_link data_mgr + internal_link track_manager + internal_link task_mgr + end_sensor + weapon agm MEDIUM_RANGE_RADAR_MISSILE_B-1B + quantity 2 + internal_link task_mgr + end_weapon +end_platform_type diff --git a/platforms/BSHIP.txt b/platforms/BSHIP.txt new file mode 100644 index 0000000..2d64641 --- /dev/null +++ b/platforms/BSHIP.txt @@ -0,0 +1,35 @@ +# File generated by Wizard 2.9.0 on Feb 9, 2026. +include_once processors/ucavFire.txt + +platform_type BSHIP WSF_PLATFORM + icon ship + + infrared_signature VEHICLE_INFRARED_SIGNATURE + optical_signature VEHICLE_OPTICAL_SIGNATURE + radar_signature VEHICLE_RADAR_SIGNATURE + commander SELF + processor data_mgr WSF_TRACK_PROCESSOR + purge_interval 60 sec + update_interval 1 sec + end_processor + + processor track_manager WSF_TRACK_PROCESSOR + purge_interval 60 sec + report_interval 5 sec + report_method batch + report_to commander via sub_net + end_processor + + comm sub_net TEAM_DATALINK + network_name red_net + internal_link track_manager + internal_link data_mgr + end_comm + + processor task_mgr ucavFire + script_variables + SENSOR_NAME = "sensor1"; + WEAPON_NAME = "agm"; + end_script_variables + end_processor +end_platform_type diff --git a/platforms/KC-135.txt b/platforms/KC-135.txt new file mode 100644 index 0000000..c25be28 --- /dev/null +++ b/platforms/KC-135.txt @@ -0,0 +1,61 @@ +# File generated by Wizard 2.9.0 on Feb 3, 2026. +platform_type YY20 WSF_PLATFORM + icon tanker + side red + infrared_signature VEHICLE_INFRARED_SIGNATURE + optical_signature VEHICLE_OPTICAL_SIGNATURE + radar_signature VEHICLE_RADAR_SIGNATURE + + mover WSF_AIR_MOVER + update_interval 1 seconds + maximum_impact_speed 300 m/s + altitude_offset 20 meters + at_end_of_path stop + turn_failure_threshold 0.01 + bank_angle_limit 5 degrees + heading_pursuit_gain 5 + maximum_flight_path_angle 70 degrees + maximum_linear_acceleration 6 g + maximum_radial_acceleration 6 g + maximum_altitude 50000 ft + minimum_altitude 50 ft + maximum_speed 450 m/s + minimum_speed 300 m/s + speed_variance_percent 0.0 + roll_rate_limit 1 rad/sec + maximum_climb_rate 365 m/s + default_linear_acceleration 1 g + default_radial_acceleration 6.5 g + default_climb_rate 122 m/s + end_mover + + sensor eo_ir_sensor common_geo_radar + on + internal_link track_manager + internal_link data_mgr + ignore_same_side + end_sensor + + comm sub_net TEAM_DATALINK + network_name red_net + internal_link track_manager + internal_link data_mgr + end_comm + processor track_manager WSF_TRACK_PROCESSOR + purge_interval 60 sec + report_interval 5 sec + report_method batch + report_to commander via sub_net + end_processor + fuel WSF_VARIABLE_RATE_FUEL + rate 0.5 kg/s + maximum_quantity 99999 kg + initial_quantity 99999 kg + bingo_quantity 2000 kg + end_fuel + + processor data_mgr WSF_TRACK_PROCESSOR + purge_interval 60 sec + update_interval 1 sec + end_processor +end_platform_type \ No newline at end of file diff --git a/processors/addfuelstate.txt b/processors/addfuelstate.txt new file mode 100644 index 0000000..5f71cc9 --- /dev/null +++ b/processors/addfuelstate.txt @@ -0,0 +1,364 @@ +# File generated by Wizard 2.9.0 on Feb 8, 2026. +# File generated by Wizard 2.9.0 on Feb 3, 2026. +# File generated by Wizard 2.9.0 on Dec 26, 2024. + processor sta WSF_SCRIPT_PROCESSOR + update_interval 10 s + + script_variables + double orbitLength = 20000000; + string state = ""; + // + string PointOrName1 = "XL04"; + string zoneType1 = "polygon"; + double Radius = 50000; + bool iscrea = false; + bool isaddfuel = false; + WsfGeoPoint p1 = WsfGeoPoint.Construct("16:16:24.77n 146:53:27.50e"); + end_script_variables + + + script bool RecvTask() + bool rev = false; + string sojna = PLATFORM->plat1Name; + if(sojna.Contains("j")) + { + rev = true; + } + return rev; + end_script + + + // + //@ flyZone to a point + // + script void flyZone(string PointOrName,string zoneType) + if(zoneType == "circle") + { + WsfGeoPoint p = p.Construct(PointOrName); + PLATFORM.GoToSpeed(1000,999,true); + PLATFORM.GoToLocation(p); + } + else if(zoneType == "polygon") + { + WsfZone zone = zone.FindZone(PointOrName); + PLATFORM.GoToSpeed(1000,999,true); + PLATFORM.GoToLocation(zone.Location()); + } + end_script + + // + //@ bool + script bool isInZone(string PointOrName,string zoneType) + if(zoneType == "circle") + { + WsfGeoPoint p = p.Construct(PointOrName); + return(PLATFORM.Location().GroundRangeTo(p) <= 10); + } + else if(zoneType == "polygon") + { + WsfZone zone = zone.FindZone(PointOrName); + return(PLATFORM.Location().GroundRangeTo(zone.Location()) <= 10000); + } + return false; + end_script + + + // + // @ generateCirclePoints + // + script Array generateCirclePoints(string Center , double radius) + WsfGeoPoint center = WsfGeoPoint.Construct(Center); + Array circlePoints = {}; + double earthRadius = 6371000.0; + double angularDistance = radius / earthRadius; + Array angles = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360}; + foreach(double angle in angles) + { + double latCenter = center.Latitude() * MATH.PI() / 180.0; + double lonCenter = center.Longitude() * MATH.PI() / 180.0; + + double lat = MATH.ASin(MATH.Sin(latCenter) + * MATH.Cos(angularDistance) + + MATH.Cos(latCenter) + * MATH.Sin(angularDistance) + * MATH.Cos(angle)); + double lon = lonCenter + MATH.ATan2(MATH.Sin(angle) + * MATH.Sin(angularDistance) + * MATH.Cos(latCenter) + ,MATH.Cos(angularDistance) + - MATH.Sin(latCenter) + * MATH.Sin(lat)); + + circlePoints.PushBack(WsfGeoPoint.Construct(lat*180.0/MATH.PI(),lon * 180.0 / MATH.PI(),5000)); + } + return circlePoints; + end_script + + + // + //@ circle execute + // + script void executecircularPatrol() + Array circlePoints = generateCirclePoints(PointOrName1,Radius); + WsfRoute route; + WsfRoute r1 = route.Create("lx"); + foreach(WsfGeoPoint vertex in circlePoints) + { + vertex.SetAltitudeHAE(10000); + r1.Append(vertex,1500); + } + r1.Waypoint(0).SetLabel("start"); + r1.Waypoint(r1.Size() - 1).SetGoToLabel("start"); + PLATFORM.FollowRoute(r1); + r1.Print(); + end_script + + + // + // @ bounds execute + // + script void executeBoundsAreaPatrol() + WsfZone zone = zone.FindZone(PointOrName1); + Array boundsPoints = zone.PolyPoints(); + WsfRoute route; + WsfRoute r1 = route.Create("lx"); + foreach(WsfGeoPoint vertex in boundsPoints) + { + vertex.SetAltitudeHAE(10000); + r1.Append(vertex,1500); + } + r1.Waypoint(0).SetLabel("start"); + r1.Waypoint(r1.Size() - 1).SetGoToLabel("start"); + PLATFORM.FollowRoute(r1); + + end_script + + // + //execute once patrol + // + script void executeOncePatrol() + if(zoneType1 == "circle") + { + executecircularPatrol(); + } + else if( zoneType1 == "polygon") + { + executeBoundsAreaPatrol(); + } + end_script + // + + // + script void TurnOnJam() + WsfProcessor pro = (WsfProcessor)PLATFORM.Processor("jamming"); + if(pro.IsTurnedOff()) + { + pro.TurnOn(); + } + end_script + // + script void TurnOffJam() + WsfProcessor proc = (WsfProcessor)PLATFORM.Processor("jamming"); + if(proc.IsTurnedOn()) + { + proc.TurnOff(); + } + end_script + + + + script bool isontime() + return true; + end_script +//////////////////////////////////////////////////////////////////// + + script_variables + string tankerName = "yy20_1"; + bool isrecvMessage = false; + string proName = "task_mgr"; + end_script_variables + + script bool isRefuelRequired() + WsfFuel fuel = PLATFORM.Fuel(); + if(fuel.IsValid()) + { + double i = fuel.MaximumQuantity(); + double j = i * 0.45; + if(fuel.QuantityRemaining() <= j) + { + return true; + } + } + return false; + end_script + + script void sendRefuelMessage(string tankname) + if(WsfSimulation.FindPlatform(tankname).IsValid()) + { + WsfComm trackComm = WsfSimulation.FindPlatform(tankname).Comm("sub_net"); + WsfMessage warningMessage = WsfMessage(); + warningMessage.SetType("FUELING"); + warningMessage.SetSubType(PLATFORM.Name()); + PLATFORM.Comm("sub_net").SendMessage(warningMessage,trackComm); + } + else + { + writeln(PLATFORM.Name()," is inVaild"); + } + end_script + + on_message + type CANFUEL + script + WsfMessage warningMessage = (WsfMessage)MESSAGE; + isrecvMessage = true; + end_script + + type default + script + writeln(PLATFORM.Name()," Report: Message received"); + end_script + end_on_message + + script bool isRecvMessage() + return isrecvMessage; + end_script + + script void gotoTanker() + WsfPlatform p = WsfSimulation.FindPlatform(tankerName); + if(p.IsValid()) + { + PLATFORM.GoToSpeed(p.Speed() * 1.5,999); + PLATFORM.GoToLocation(p.Location()); + } + end_script + + script bool isShift() + WsfPlatform p = WsfSimulation.FindPlatform(tankerName); + if(p.IsValid()) + { + if(PLATFORM.GroundRangeTo(p) <= 10000) + { + return true; + } + } + return false; + end_script + + script void shift() + WsfPlatform p = WsfSimulation.FindPlatform(tankerName); + if(p.IsValid()) + { + PLATFORM.GoToSpeed(p.Speed() * 1.1,999); + PLATFORM.GoToLocation(p.Location()); + } + end_script + + script bool isRefuelOk() + WsfFuel fuel = PLATFORM.Fuel(); + if(fuel.IsValid()) + { + if(fuel.QuantityRemaining() >= fuel.MaximumQuantity() - 300) + { + + isrecvMessage = false; + isaddfuel = true; + return true; + } + return false; + } + return true; + end_script + +////////////////////////////////////////////////////////////////////////////////// + execute at_time 1 s relative + SetState("STARTJA"); + end_execute + + +state STARTJA + next_state DETECTEDJA + return isontime(); + end_next_state +end_state + + +state DETECTEDJA + on_entry + flyZone(PointOrName1,zoneType1); + end_on_entry + + next_state AREAPATROLJA + return (isInZone(PointOrName1,zoneType1)); + end_next_state + + // +end_state + +state AREAPATROLJA + on_entry + executeOncePatrol(); + end_on_entry + next_state SENDMESSAGE + return isRefuelRequired(); + end_next_state +end_state + +state Jamming + on_entry + TurnOnJam(); + end_on_entry + + next_state SENDMESSAGE + return isRefuelRequired(); + end_next_state + + on_exit + TurnOffJam(); + end_on_exit +end_state + + + state SENDMESSAGE + on_entry + sendRefuelMessage(tankerName); + end_on_entry + + next_state GOTOTANKER + return isRecvMessage() && !isaddfuel; + end_next_state + + on_exit + end_on_exit + end_state + + state GOTOTANKER + on_entry + + end_on_entry + + next_state SHIFTFLY + gotoTanker(); + return isShift(); + end_next_state + + on_exit + end_on_exit + end_state + + state SHIFTFLY + on_entry + end_on_entry + + next_state STARTJA + shift(); + return isRefuelOk(); + end_next_state + + on_exit + PLATFORM.GoToLocation(p1); + PROCESSOR.TurnOff(); + end_on_exit + end_state + +end_processor diff --git a/processors/patrol_fuel.txt b/processors/patrol_fuel.txt new file mode 100644 index 0000000..7006648 --- /dev/null +++ b/processors/patrol_fuel.txt @@ -0,0 +1,272 @@ +# File generated by Wizard 2.9.0 on Feb 3, 2026. +processor bs_fueling WSF_SCRIPT_PROCESSOR + update_interval 10 s + script_variables + double fuelRate = 50.0; + Array mplatforms = Array (); + bool isFuel = false; + double addFuelRange = 30000; + WsfGeoPoint p1 = WsfGeoPoint.Construct("32:04:34.53n 130:51:05.36e"); + string CenterPoint = "23:49:20.14n 121:01:08.01e"; + double Radius = 50000; + bool isOver = false; + string zoneName = "JY01"; + string shape = "polygon"; //polygon circle + bool aendflag = false; + end_script_variables + + + + // + // @ generateCirclePoints + // + script Array generateCirclePoints(string Center , double radius) + WsfGeoPoint center = WsfGeoPoint.Construct(Center); + Array circlePoints = {}; + double earthRadius = 6371000.0; + double angularDistance = radius / earthRadius; + Array angles = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360}; + foreach(double angle in angles) + { + double latCenter = center.Latitude() * MATH.PI() / 180.0; + double lonCenter = center.Longitude() * MATH.PI() / 180.0; + + double lat = MATH.ASin(MATH.Sin(latCenter) + * MATH.Cos(angularDistance) + + MATH.Cos(latCenter) + * MATH.Sin(angularDistance) + * MATH.Cos(angle)); + double lon = lonCenter + MATH.ATan2(MATH.Sin(angle) + * MATH.Sin(angularDistance) + * MATH.Cos(latCenter) + ,MATH.Cos(angularDistance) + - MATH.Sin(latCenter) + * MATH.Sin(lat)); + + circlePoints.PushBack(WsfGeoPoint.Construct(lat*180.0/MATH.PI(),lon * 180.0 / MATH.PI(),5000)); + } + return circlePoints; + end_script + + + // + //@ circle execute + // + script void executecircularPatrol() + Array circlePoints = generateCirclePoints(CenterPoint,Radius); + WsfRoute route; + WsfRoute r1 = route.Create("lx"); + foreach(WsfGeoPoint vertex in circlePoints) + { + vertex.SetAltitudeHAE(10000); + r1.Append(vertex,1500); + } + r1.Waypoint(0).SetLabel("start"); + r1.Waypoint(r1.Size() - 1).SetGoToLabel("start"); + PLATFORM.FollowRoute(r1); + r1.Print(); + isOver = true; + end_script + + // + // @ bounds execute + // + script void executeBoundsAreaPatrol() + WsfZone zone = WsfZone.FindZone(zoneName); + Array boundsPoints = zone.PolyPoints(); + WsfRoute route; + WsfRoute r1 = route.Create("lx"); + foreach(WsfGeoPoint vertex in boundsPoints) + { + vertex.SetAltitudeHAE(10000); + r1.Append(vertex,1500); + } + r1.Waypoint(0).SetLabel("start"); + r1.Waypoint(r1.Size() - 1).SetGoToLabel("start"); + PLATFORM.FollowRoute(r1); + + isOver = true; + end_script +///////////////////////////////////////////////////////////// + + script bool isAlreadyInQueue(string name) + for(int i = 0; i < mplatforms.Size(); i = i + 1) + { + if(mplatforms.Get(i) == name) + { + return true; + } + } + return false; + end_script + + script int sendMessage() + if(!mplatforms.Size() == 0) + { + if(WsfSimulation.FindPlatform(mplatforms.Front()).IsValid()) + { + WsfPlatform p = WsfSimulation.FindPlatform(mplatforms.Front()); +# if(p.FuelRemaining() < p.FuelBingoQuantity()) +# { + WsfComm trackComm = WsfSimulation.FindPlatform(mplatforms.Front()).Comm("sub_net"); + WsfMessage warningMessage = WsfMessage(); + warningMessage.SetType("CANFUEL"); + warningMessage.SetSubType(PLATFORM.Name()); + PLATFORM.Comm("sub_net").SendMessage(warningMessage,trackComm); + return 0; +# } + } + else + { + return 0; + } + } + return 0; + end_script + + script bool isRange() + if(mplatforms.Size() != 0) + { + WsfPlatform p = WsfSimulation.FindPlatform(mplatforms.Front()); + if(p.IsValid()) + { + if(PLATFORM.GroundRangeTo(p) <= addFuelRange) + { + return true; + } + } + else + { + mplatforms.Reverse(); + mplatforms.PopBack(); + mplatforms.Reverse(); + return false; + } + } + return false; + end_script + + script bool gotoFuel(double fuelRange,double fuelRate) + WsfPlatform p = WsfSimulation.FindPlatform(mplatforms.Front()); + if(p.IsValid()) + { + WsfFuel reciveFuel = p.Fuel(); + WsfPlatform tank = PLATFORM; + + WsfFuel tankFuel = tank.Fuel(); + if(!tankFuel.IsValid()) + { + writeln("This Platform : ",p.Name()," no fuel!!!!"); + return true; + } + if(PLATFORM.SlantRangeTo(p) < fuelRange) + { + reciveFuel.SetQuantityRemaining(reciveFuel.QuantityRemaining() + (fuelRate * 1)); + tankFuel.SetQuantityRemaining(tankFuel.QuantityRemaining() - (fuelRate * 1)); + writeln("zhengziagei ; ",p.Name()); + } + if(reciveFuel.QuantityRemaining() >= reciveFuel.MaximumQuantity()-300) + { + isFuel = true; + } + } + else + { + isFuel = true; + } + return isFuel; + end_script + +// +////////////////////////////on_message/////////////////////////////// +// + on_message + type FUELING + script + WsfMessage warningMessage = (WsfMessage)MESSAGE; + string originator = warningMessage.Originator(); + if(!isAlreadyInQueue(originator)) + { + mplatforms.Insert(mplatforms.Size(), originator); + } + writeln(PLATFORM.Name()," Report: FUELING from ", originator); + end_script + + type default + script + writeln(PLATFORM.Name(),"Report: Message received"); + end_script + end_on_message + + script bool isArrayNull() + return mplatforms.Size() > 0; + end_script + + script void updateArray() + if(mplatforms.Size() != 0) + { + mplatforms.Reverse(); + mplatforms.PopBack(); + mplatforms.Reverse(); + isFuel = false; + } + end_script + +/////////////////////////////////////////////////////////////////// +execute at_time 1 s absolute + PROCESSOR.SetState("start"); +end_execute +/////////////////////////////////////////////////////////////////// +state start + next_state DETECTED + return true; + end_next_state +end_state + +state DETECTED + on_entry + if(!aendflag) + { + executeBoundsAreaPatrol(); + } + end_on_entry + + next_state gotoTarget + return isArrayNull(); + end_next_state + + on_exit + end_on_exit +end_state + + state gotoTarget + on_entry + writeln("--------------------- :",mplatforms.ToString()); +# sendMessage(); + end_on_entry + + next_state FUEL + sendMessage(); + return isRange(); + end_next_state + + on_exit + + end_on_exit + end_state + + state FUEL + on_entry + end_on_entry + + next_state DETECTED + return gotoFuel(addFuelRange,fuelRate); + end_next_state + + on_exit + updateArray(); + PLATFORM.GoToLocation(p1); + aendflag = true; + end_on_exit + end_state +end_processor \ No newline at end of file diff --git a/processors/scripts/randomPatrol.txt b/processors/scripts/randomPatrol.txt index b30756b..505f8b1 100644 --- a/processors/scripts/randomPatrol.txt +++ b/processors/scripts/randomPatrol.txt @@ -3,13 +3,13 @@ zone tw polygonal lat_lon maximum_altitude 20 km - point 25:39:39.36n 120:30:25.18e - point 25:06:17.31n 122:29:29.13e - point 21:32:49.50n 121:05:56.86e - point 22:19:43.20n 119:36:49.51e + point 30:03:45.52n 126:02:30.89e + point 30:53:53.49n 126:31:12.66e + point 30:29:11.10n 127:04:22.94e + point 29:36:19.04n 126:22:36.55e - fill_color red - line_color red + fill_color blue + line_color blue end_zone processor randomPatrol WSF_SCRIPT_PROCESSOR diff --git a/processors/ucavFire.txt b/processors/ucavFire.txt new file mode 100644 index 0000000..cc994f9 --- /dev/null +++ b/processors/ucavFire.txt @@ -0,0 +1,164 @@ + +processor ucavFire WSF_TASK_PROCESSOR + track_update_interval 5.0 sec + + script_variables + string SENSOR_NAME; + string WEAPON_NAME; + int SALVO_SIZE = 2; + string mTrackTaskStr = "Track"; + string mShootTaskStr = "Shoot"; + end_script_variables + + script bool FiringNow() + return (WeaponsActiveFor(TRACK.TrackId()) > 0); + end_script + + script bool InInterceptEnvelopeOf(WsfPlatform shooter) + if (shooter.IsNull() || !shooter.IsValid()) return false; + WsfWeapon w = shooter.Weapon(WEAPON_NAME); + if (!w.IsValid()) return false; + if (w.LaunchComputer().IsValid()) + return w.CanIntercept(TRACK); + return (shooter.GroundRangeTo(TRACK) <= 150000.0); + end_script + + script bool InInterceptEnvelopeOfAnySub() + foreach (WsfPlatform sub in PLATFORM.Subordinates()) + { + if (InInterceptEnvelopeOf(sub)) return true; + } + return false; + end_script + + script bool TrackingNow() + return (TasksAssignedFor(TRACK.TrackId(), mTrackTaskStr) > 0); + end_script + + script void ReleaseResources() + CancelTask(TRACK.TrackId()); + end_script + + script bool LaunchWeapon() + WsfWeapon weapon; + WsfPlatform platform; + foreach (WsfPlatform sub in PLATFORM.Subordinates()) + { + weapon = sub.Weapon(WEAPON_NAME); + if (weapon.IsTurnedOn() && + (weapon.QuantityRemaining() >= SALVO_SIZE) && + (TasksAssignedTo(sub, "", weapon.Name()) < 1) && + InInterceptEnvelopeOf(sub)) + { + platform = sub; + break; + } + } + bool launched = false; + if (weapon.IsValid() && !platform.IsNull()) + launched = Fire(TRACK, mShootTaskStr, weapon.Name(), SALVO_SIZE, platform); + return launched; + end_script + + script bool IsAssignable() + return ((PLATFORM == PLATFORM.Commander()) || + (TasksReceivedFor(TRACK.TrackId()) > 0) || + (OperatingLevelFor("ENGAGE") > 0)); + end_script + + script int WeaponsAvailable(WsfPlatform aAssignee) + WsfWeapon weapon = aAssignee.Weapon(WEAPON_NAME); + if (!weapon.IsTurnedOn()) return 0; + return weapon.QuantityRemaining(); + end_script + + script int TotalWeaponsAvailable() + int quantity = 0; + foreach (WsfPlatform sub in PLATFORM.Subordinates()) + quantity = quantity + WeaponsAvailable(sub); + return quantity; + end_script + + script bool Engage() + if (TotalWeaponsAvailable() < 1) + { + writeln("Engage: no weapons available"); + return false; + } + foreach (WsfPlatform sub in PLATFORM.Subordinates()) + { + if (TasksAssignedTo(sub, TRACK.TrackId(), mTrackTaskStr) > 0) continue; + WsfSensor sensor = sub.Sensor(SENSOR_NAME); + if (!sensor.IsValid()) + { + writeln("Engage: sub ", sub.Name(), " sensor ", SENSOR_NAME, " invalid"); + continue; + } + int maxTrack = sensor.MaximumRequestCount("TRACK"); + if (maxTrack > 0 && sensor.ActiveRequestCount("TRACK") >= maxTrack) + { + writeln("Engage: sub ", sub.Name(), " TRACK slots full"); + continue; + } + if (TRACK.BelievedAlive() && InInterceptEnvelopeOf(sub)) + { + bool ok = StartTracking(TRACK, mTrackTaskStr, sensor.Name(), "default", sub); + writeln("Engage: StartTracking ", sub.Name(), " -> ", ok); + if (ok) return true; + } + } + writeln("Engage: no sub assigned for ", TRACK.TargetName()); + return false; + end_script + + evaluation_interval DETECTED 2.0 sec + state DETECTED + next_state DETECTED + if (TRACK.IFF_Friend()) { CancelTask(TRACK.TrackId()); return true; } + return false; + end_next_state + next_state ENGAGEABLE + return (TRACK.BelievedAlive() && !TRACK.IFF_Friend() && IsAssignable()); + end_next_state + end_state + + evaluation_interval ENGAGEABLE 2.0 sec + state ENGAGEABLE + next_state DETECTED + if (TRACK.BelievedDead() || TRACK.IFF_Friend() || + ((TasksAssignedFor(TRACK.TrackId(), "ENGAGE") < 1) && !IsAssignable())) + { ReleaseResources(); return true; } + return false; + end_next_state + next_state ENGAGE + bool didEngage = Engage(); + bool trackNow = TrackingNow(); + int assigned = TasksAssignedFor(TRACK.TrackId(), mTrackTaskStr); + writeln("ENGAGEABLE->ENGAGE: didEngage=", didEngage, " trackNow=", trackNow, " assigned=", assigned, " target=", TRACK.TargetName()); + return (trackNow && (assigned > 0)); + end_next_state + end_state + + evaluation_interval ENGAGE 2.0 sec + state ENGAGE + next_state ENGAGEABLE + if (TRACK.BelievedDead() || !TrackingNow() || !IsAssignable()) + { ReleaseResources(); return true; } + return false; + end_next_state + next_state FIRING + if (TRACK.BelievedAlive() && TrackingNow() && !FiringNow() && InInterceptEnvelopeOfAnySub()) + return LaunchWeapon(); + return false; + end_next_state + end_state + + evaluation_interval FIRING 2.0 sec + state FIRING + next_state ENGAGE + return (TRACK.BelievedDead() || !InInterceptEnvelopeOfAnySub() || + (!FiringNow() && (TasksAssignedFor(TRACK.TrackId(), mShootTaskStr) < 1)) || + (TotalWeaponsAvailable() < 1) || !TrackingNow()); + end_next_state + end_state +end_processor diff --git a/scenarios/blue/bomber_formation_01.txt b/scenarios/blue/bomber_formation_01.txt new file mode 100644 index 0000000..22ce3ed --- /dev/null +++ b/scenarios/blue/bomber_formation_01.txt @@ -0,0 +1,175 @@ +include_once weapons\ssm\blue_cruise_missile.txt +execute at_time .001 sec absolute + for(int i = 0; i < WsfSimulation.PlatformCount();i+=1) + { + for(int j = 0;j 16 sec + end_phase + + phase CRUISE + commanded_altitude 500 ft agl + commanded_speed 910 fps + maximum_commanded_g 2 g + next_phase TERMINAL if target_slant_range < 1 miles + end_phase + + phase TERMINAL + commanded_speed 800 fps + proportional_navigation_gain 40 + maximum_pitch_angle 90 deg + maximum_commanded_g 10 g + end_phase + end_processor + + processor fuse WSF_GROUND_TARGET_FUSE + end_processor + + comm uplink WSF_COMM_TRANSCEIVER + internal_link data_mgr + end_comm + + processor task_mgr WSF_TASK_PROCESSOR + end_processor + + processor data_mgr WSF_TRACK_PROCESSOR + purge_interval 4000 seconds + end_processor + +end_platform_type + + +weapon BLUE_CRUISE_MISSILE WSF_EXPLICIT_WEAPON + launched_platform_type BLUE_CRUISE_MISSILE + weapon_effects BLUE_CRUISE_MISSILE_LETHALITY + quantity 1 + firing_delay 0.0 sec + salvo_interval 2 sec + slew_mode azimuth + azimuth_slew_limits -180 deg 180 deg + tilt 88.9 deg +end_weapon diff --git a/weapons/ssm/medium_range_radar_missile.txt b/weapons/ssm/medium_range_radar_missile.txt new file mode 100644 index 0000000..ab6bb31 --- /dev/null +++ b/weapons/ssm/medium_range_radar_missile.txt @@ -0,0 +1,189 @@ +# **************************************************************************** +# CUI +# +# The Advanced Framework for Simulation, Integration, and Modeling (AFSIM) +# +# The use, dissemination or disclosure of data in this file is subject to +# limitation or restriction. See accompanying README and LICENSE for details. +# **************************************************************************** + + + +############################################################################## +### signatures +############################################################################## +infrared_signature SIMPLE_INFRARED_SIGNATURE + constant 1 watts/steradian +end_infrared_signature +optical_signature SIMPLE_OPTICAL_SIGNATURE + constant 1 m^2 +end_optical_signature +radar_signature SIMPLE_RADAR_SIGNATURE + constant 1 m^2 +end_radar_signature +weapon_effects SIMPLE_EFFECT WSF_GRADUATED_LETHALITY + radius_and_pk 100.0 m 0.75 +end_weapon_effects + + +############################################################################## +### antenna patterns +############################################################################## +antenna_pattern SEEKER_ANTENNA_B-1B + circular_pattern + beamwidth 6.0 deg + peak_gain 30.0 dB + minimum_gain -10.0 dB + end_circular_pattern +end_antenna_pattern +antenna_pattern RADAR_ANTENNA_B-1B + circular_pattern + beamwidth 3.0 deg + peak_gain 30.0 dB + minimum_gain -10.0 dB + end_circular_pattern +end_antenna_pattern + + +############################################################################## +### normal radar sensor; weapon's radar seeker +############################################################################## +sensor RADAR_SEEKER_B-1B WSF_RADAR_SENSOR + off + ignore_domain land + ignore_domain subsurface + selection_mode single #multiple + initial_mode SEARCH + slew_mode azimuth_and_elevation + azimuth_slew_limits -45 deg 45 deg + elevation_slew_limits -45 deg 45 deg + mode_template + scan_mode azimuth_and_elevation + azimuth_scan_limits -90 deg 90 deg + elevation_scan_limits -90 deg 90 deg + frame_time 1.0 sec + transmitter + antenna_pattern SEEKER_ANTENNA_B-1B + power 1.0 kW + frequency 10.0 GHz + pulse_repetition_interval 3.3 usec #HPRF 300 kHz + pulse_width 1.0 usec #30% duty factor + end_transmitter + receiver + bandwidth 1 MHz + end_receiver + one_m2_detect_range 50.0 km + hits_to_establish_track 1 2 + hits_to_maintain_track 1 3 + reports_location + reports_velocity + reports_iff + track_quality 1.0 + end_mode_template + mode SEARCH + frame_time 0.1 sec + end_mode +end_sensor + + +############################################################################## +### weapon platform that requires an uplink, and will go active +############################################################################## +platform_type MEDIUM_RANGE_RADAR_MISSILE_B-1B WSF_PLATFORM + + script_variables + bool mDrawTarget = true; + WsfDraw draw = WsfDraw(); + end_script_variables + + execute at_interval_of 1 sec + if (mDrawTarget) + { + WsfTrack tgt = PLATFORM.CurrentTargetTrack(); + if (tgt.IsValid()) + { + draw.SetDuration(1.0); //same as execute interval + draw.SetColor(1, 0, 1); //purple + draw.SetLineSize(2); //double thick + draw.BeginLines(); + draw.Vertex(PLATFORM.Location()); + draw.Vertex(tgt.CurrentLocation()); + draw.End(); + } + } + end_execute + + weapon_effects SIMPLE_EFFECT + icon Scud_Missile + infrared_signature SIMPLE_INFRARED_SIGNATURE + optical_signature SIMPLE_OPTICAL_SIGNATURE + radar_signature SIMPLE_RADAR_SIGNATURE + + ########################################################################### + ### straight line movers guide themselves, towards the platform's target + ########################################################################### + mover WSF_STRAIGHT_LINE_MOVER + average_speed 3221.5 kts # mach 5 + update_interval 0.006 sec + update_time_tolerance 0.0006 sec # this mover travels 1 meter in 0.00060339 seconds + maximum_lateral_acceleration 15.0 g # average turner + guidance_mode lead_pursuit # or pure_pursuit + guide_to_truth false # guide to perception + end_mover + + ########################################################################### + ### simple fuse + ########################################################################### + processor fuse WSF_AIR_TARGET_FUSE + max_time_of_flight_to_detonate 100.0 sec + end_processor + + ########################################################################### + ### perfect trackers provide target truth data for the missile + ### no uplink or tracking required for this missile + ########################################################################### + #processor seeker WSF_PERFECT_TRACKER + # update_interval 0.5 s + #end_processor + + ########################################################################### + ### imperfect radar provide target data for the missile + ########################################################################### + sensor seeker RADAR_SEEKER_B-1B + off + internal_link track_mgr + internal_link weapon_manager + end_sensor + + ########################################################################### + ### simple track manager. make sure comm & sensor feed it + ########################################################################### + processor track_mgr WSF_TRACK_PROCESSOR + master_track_processor + end_processor + + ########################################################################### + ### turns on the weapon radar at the right time + ########################################################################### + processor weapon_manager WSF_WEAPON_TRACK_PROCESSOR + turn_on_sensor seeker at_time 30 s before_intercept + #turn_on_sensor seeker at_range 3500 m before_intercept + coast_time 100 s + uplink_required false #this version is active missile only (no no command guidance uplink) + end_processor +end_platform_type + + +############################################################################## +### simple missile to use, requires uplink +############################################################################## +weapon MEDIUM_RANGE_RADAR_MISSILE_B-1B WSF_EXPLICIT_WEAPON + launched_platform_type MEDIUM_RANGE_RADAR_MISSILE_B-1B + weapon_effects SIMPLE_EFFECT + quantity 4 + firing_delay 0.5 sec + salvo_interval 5.0 sec + slew_mode azimuth_and_elevation + azimuth_slew_limits -180.0 deg 180.0 deg +end_weapon +