Files
lab1/platforms/red/ssm_cmdr.txt
2025-12-03 10:49:15 +08:00

150 lines
4.1 KiB
Plaintext

# File generated by Wizard 2.9.0 on Oct 23, 2025.
include_once signatures/vehicle_signature.txt
processor SSM_CMDR_TASK_MGR WSF_TASK_PROCESSOR
number_of_servers 5
track_update_interval 5.0 sec
#script_debug_writes true
#show_state_transitions
#show_task_messages
script_variables
int MAX_SAMS_PER_TARGET = 2;
int MAX_ASSIGNMENTS_PER_SAM = 4;
string WEAPON_NAME = "";
string IS_MOVE = "true";
end_script_variables
// determine if TRACK is assignable
script bool IsAssignable()
#writeln(TRACK);
if ((! TRACK.IFF_Friend()) &&
(TRACK.TimeSinceUpdated() < 30.0))
{
#writeln("find enermy");
return true;
}
return false;
end_script
// determine if the subordinate and/or his subordinates have weapons remaining
script bool WeaponsAvailable(WsfPlatform aAssignee)
bool weaponsAvailable = false;
int quantity = 0;
string weapon_name=aAssignee->weapon_name;
WsfWeapon weapon = aAssignee.Weapon(weapon_name);
if (weapon.IsTurnedOn())
{
quantity = quantity + weapon.QuantityRemaining();
}
if (quantity > 0)
{
weaponsAvailable = true;
}
return weaponsAvailable;
end_script
# -------------------------------------------------------------------------
script void sendMessage()
writeln("sendMessage");
Array<WsfPlatform> firer = Array<WsfPlatform>();
Array<WsfPlatform> mover = Array<WsfPlatform>();
Array<WsfPlatform> waiter = Array<WsfPlatform>();
Array<WsfPlatform> net_mover = Array<WsfPlatform>();
foreach (WsfPlatform sub in PLATFORM.Subordinates())
{
if (sub.Type() == "MORTAR")
{
#writeln("is LARGE_SAM_LAUNCHER");
if (WeaponsAvailable(sub) &&
(TasksAssignedTo(sub) < MAX_ASSIGNMENTS_PER_SAM) &&
(TasksAssignedTo(sub, TRACK.TrackId()) < 1) &&
(TRACK.WithinZoneOf(sub, "battalion_sector"))&&
(TRACK.Altitude()<500))
{
#writeln("can fire");
writeln("*** Adding ", sub.Name(), " to firer");
firer.PushBack(sub);
}
}
if(sub.Type() == "NET_DETECT_GROUP")
{
writeln("is NET_DETECT_GROUP");
if(IS_MOVE=="true")
{
IS_MOVE="false";
writeln("*** Adding ", sub.Name(), " to net_mover");
net_mover.PushBack(sub);
}
}
}
int i;
int numAssignments = (int)MATH.Min(firer.Size(), MAX_SAMS_PER_TARGET);
int num=(int)net_mover.Size();
for (int i=0; i < numAssignments; i = i + 1)
{
writeln("assign fire");
WsfControlMessage msg = WsfControlMessage();
msg.SetAuxData("track",TRACK);
msg.SetAuxData("task","FIRE");
PLATFORM.Comm("sub_net").SendMessage(msg,firer[i].Name(),"cmdr_net");
AssignTask(TRACK, "FIRE", firer[i]);
}
for(int i=0;i<num;i=i+1)
{
writeln("assign net_move");
WsfControlMessage msg = WsfControlMessage();
msg.SetAuxData("task","MOVE");
PLATFORM.Comm("sub_net").SendMessage(msg,net_mover[i].Name(),"cmdr_net");
}
end_script
# -------------------------------------------------------------------------
update_interval 10 s
on_update
sendMessage();
end_on_update
end_processor
platform_type SSM_CMDR WSF_PLATFORM
icon C4I
infrared_signature VEHICLE_INFRARED_SIGNATURE
optical_signature VEHICLE_OPTICAL_SIGNATURE
radar_signature VEHICLE_RADAR_SIGNATURE
mover WSF_GROUND_MOVER
end_mover
comm sub_net DATALINK
network_name <local:master>
internal_link data_mgr
internal_link task_mgr
end_comm
processor data_mgr WSF_TRACK_PROCESSOR
purge_interval 60 sec
end_processor
processor task_mgr SSM_CMDR_TASK_MGR
end_processor
end_platform_type