When you need to set up a scenario and precisely define the behavior of each participant, you need a software that allows such freedom. Most of the tools on the market provide predefined tasks and doctrines that cannot be changed. You can tune some aspects but the hood is dead locked. It can still be very sexy, with stunning 3D output, but beyond the game aspect, you won’t get what you needed.
With vsTASKER, you have the ability to build your scenario the way you want. You define graphically your own doctrines based on state-machine like logics. You attach behaviors and sensors to your entities. You populate the gaming area. You specify what to do upon communications, detection assessments, signals, whatever events which can occur during the simulation, and you quickly get a realistic virtual battlefield up an running.
Taiwan Strait
Taiwan Strait Combat demo video
Ships
Three fleets of ships are defined. Two for the red force and one for the white. In the white fleet, only one ship (Kunming) has a logic, a radar and a sonar.
Kunming frigate logic
The two most important items of this logic are Send_UAV and Send2Pos which directs the drone to the computed position. Send_UAV consider an area and not individual detections.
Send_UAV code
Array<Vt_Entity>* list = (Array<Vt_Entity>*) edata();
if (vt_rtc->getCurrentTime() < 15) return RESTART; // radar warmup
if (list) { // in case of detection
for (int i=0; i<list->count(); i++) { // for each of them
Vt_Entity* dtc = list->get(i);
float dist = ent()->pos.distanceTo2D(dtc->pos);
if (dtc->getStatus()->isCategory(_Surface)) { // only for detected vessels
if (logk()->trySendDroneTo(dtc, dist)) {
printf("%s send drone to %s\n", ent()->getName(), dtc->getName());
vt_rtc->gui_map.drawLine(ent()->pos, dtc->pos, clRed, 1);
break;
}
}
}
}
int Maritime_Blue_Lgk::trySendDroneTo(Vt_Entity* dtc, float d)
{
// determine the position according to the speed and
// heading of the target, considering the time for the
// UAV to get there, at 800 km/h
float dt = d / convert(800, _km_h, _m_s);
float tdist = dt * dtc->getSpeed() * 2;
WCoord* new_area = new WCoord(dtc->pos.getNewPosAt(dtc->getHeading(), 0, tdist));
for (int i=0; i<checked_areas.count(); i++) {
WCoord* pos = checked_areas[i];
if (pos->distanceTo2D(*new_area) < region_size*1000) {
delete new_area;
return 0; // already checked
}
}
// let's add the zone
checked_areas.addElem(new_area);
// let's create a drone
new_UAV = new Entity("UAV_Blue", ent()->pos, "GJ-11-1");
if (new_UAV->isValid()) {
new_UAV->getDyn()->resetHeading(ent()->getHeading());
new_UAV->owner = ent();
new_UAV->area = new_area; // where to go
return 1;
}
else new_UAV = NULL;
return 0;
}
Jet fighters
White and red jet fighters are created by air force bases upon reception of a threat by Kunming frigate (for white forces) or Yaoshan radar. All airports share the same logic.
White jets have their prime mission to destroyed a given red ship. The red jets have for mission to fight and kill a specific white jet. Dogfight will be triggered when both are in visual range.
Array<Vt_Entity>* dlist = (Array<Vt_Entity>*)edata();
// if the target is detected, let's shoot it
if (dlist->exist(logk()->attacker)) {
// compute the bearing angle with the target
float b = fabs(ent()->getDyn()->getBearingTo(logk()->attacker->pos));
// if target in a 5° window, roll a dice: 1,2,3,4 = miss; 5,6 = hit
if (R2D(b) < 5 && DICE() > 4) { // target hit
logk()->attacker->getStatus()->setWreck();
return DONE;
}
}
else return RESTART;
Drones
UAV are sent by white frigate Kunming upon detection of red vessels on an area not covered by another UAV. Once launched, the drone will head towards the area and start randomly patrolling over the region. Whatever is detected by its sensor is forwarded to ship Kunming. As soon as fuel is low, the drone will return to its ship.
Drone main logic
Surveillance Radar
One radar has been put at the top of a mountain range, to cover the strait without shadow. The Yaoshan logic is fairly simple:
Record: extract from all detections any new valid threats
CallAF: select air bases and forward all new threats
Radar logic
Submarines
Two submarines are stationned on coastal harbors and can receive the AttackBlue event from Yaoshan radar (see image above). When requested, they will navigate in the strait and rely on their sonar to detect enemy ships. Use of torpedoes to destroy targeted ships.
Submarine logic
Visual Attack code
Array<Vt_Entity>* dlist = (Array<Vt_Entity>*)edata();
Vt_Entity* e = dlist->getRandom();
// if the target is detected, let's shoot it
if (!L:targeted.hasElem(e) &&
!e->getStatus()->isWreck())
{
E:setHeading(e->pos);
float d = E:pos.distanceTo2D(e->pos);
if (d < 5000) { // km
MultiBarrel* mb = E:findMultiBarrel();
Torpedo* homing = (Torpedo*) mb->fire("MK48_1");
homing->guide(this->entity, e);
L:targeted.addElem(e);
}
}