diff --git a/Missions/Generic/Models/Redbull/RedbullBlueGate.xml b/Missions/Generic/Models/Redbull/RedbullBlueGate.xml
index cbdf8d1..6a7dbea 100644
--- a/Missions/Generic/Models/Redbull/RedbullBlueGate.xml
+++ b/Missions/Generic/Models/Redbull/RedbullBlueGate.xml
@@ -10,4 +10,7 @@
8000
+
+ false
+
diff --git a/Missions/Generic/Models/Redbull/RedbullBluePylon.xml b/Missions/Generic/Models/Redbull/RedbullBluePylon.xml
index 4a1e95a..0a1815d 100644
--- a/Missions/Generic/Models/Redbull/RedbullBluePylon.xml
+++ b/Missions/Generic/Models/Redbull/RedbullBluePylon.xml
@@ -10,4 +10,8 @@
8000
+
+ false
+
+
diff --git a/Missions/Generic/Models/Redbull/RedbullBlueQuadro.xml b/Missions/Generic/Models/Redbull/RedbullBlueQuadro.xml
index caf9686..73659f1 100644
--- a/Missions/Generic/Models/Redbull/RedbullBlueQuadro.xml
+++ b/Missions/Generic/Models/Redbull/RedbullBlueQuadro.xml
@@ -10,4 +10,8 @@
8000
+
+ false
+
+
diff --git a/Missions/Generic/Models/Redbull/RedbullRedPylon.xml b/Missions/Generic/Models/Redbull/RedbullRedPylon.xml
index 829c33d..f8ab76f 100644
--- a/Missions/Generic/Models/Redbull/RedbullRedPylon.xml
+++ b/Missions/Generic/Models/Redbull/RedbullRedPylon.xml
@@ -10,4 +10,8 @@
8000
+
+ false
+
+
diff --git a/Missions/Generic/Models/Redbull/RedbullRedQuadro.xml b/Missions/Generic/Models/Redbull/RedbullRedQuadro.xml
index 7110a6c..4c50d22 100644
--- a/Missions/Generic/Models/Redbull/RedbullRedQuadro.xml
+++ b/Missions/Generic/Models/Redbull/RedbullRedQuadro.xml
@@ -10,4 +10,8 @@
8000
+
+ false
+
+
diff --git a/Missions/Generic/Models/Redbull/RedbullStartGate.xml b/Missions/Generic/Models/Redbull/RedbullStartGate.xml
index 2468587..59cefd4 100644
--- a/Missions/Generic/Models/Redbull/RedbullStartGate.xml
+++ b/Missions/Generic/Models/Redbull/RedbullStartGate.xml
@@ -10,4 +10,8 @@
8000
+
+ false
+
+
diff --git a/Missions/Races/Race-1/Models/Hangar_70x15.ac b/Missions/Races/Race-1/Models/Hangar_70x15.ac
new file mode 100644
index 0000000..595fba2
--- /dev/null
+++ b/Missions/Races/Race-1/Models/Hangar_70x15.ac
@@ -0,0 +1,485 @@
+AC3Db
+MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 0.0000
+MATERIAL "Material" rgb 1.0000 1.0000 1.0000 amb 1.0000 1.0000 1.0000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 12 trans 0.0000
+OBJECT world
+name "Blender_export__Hangar_70x15.ac"
+kids 1
+OBJECT poly
+name "Cube"
+crease 35.0
+texture "Hangar_70x15.png"
+texrep 1 1
+numvert 60
+-35.0000000 0.0000000 7.5000000
+-35.0000000 5.0000000 7.5000000
+-35.0000000 0.0000000 -7.5000000
+-35.0000000 5.0000000 -7.5000000
+35.0000000 0.0000000 7.5000000
+35.0000000 5.0000000 7.5000000
+35.0000000 0.0000000 -7.5000000
+35.0000000 5.0000000 -7.5000000
+-35.0000000 7.0000000 0.0000000
+35.0000000 7.0000000 0.0000000
+-28.6363640 5.0000000 -7.5000000
+-22.2727280 5.0000000 -7.5000000
+-15.9090919 5.0000000 -7.5000000
+-9.5454559 5.0000000 -7.5000000
+-3.1818190 5.0000000 -7.5000000
+3.1818180 5.0000000 -7.5000000
+9.5454540 5.0000000 -7.5000000
+15.9090900 5.0000000 -7.5000000
+22.2727280 5.0000000 -7.5000000
+28.6363640 5.0000000 -7.5000000
+28.6363640 0.0000000 -7.5000000
+22.2727280 0.0000000 -7.5000000
+15.9090919 0.0000000 -7.5000000
+9.5454559 0.0000000 -7.5000000
+3.1818190 0.0000000 -7.5000000
+-3.1818180 0.0000000 -7.5000000
+-9.5454540 0.0000000 -7.5000000
+-15.9090900 0.0000000 -7.5000000
+-22.2727280 0.0000000 -7.5000000
+-28.6363640 0.0000000 -7.5000000
+28.6363640 5.0000000 7.5000000
+22.2727280 5.0000000 7.5000000
+15.9090919 5.0000000 7.5000000
+9.5454559 5.0000000 7.5000000
+3.1818190 5.0000000 7.5000000
+-3.1818180 5.0000000 7.5000000
+-9.5454540 5.0000000 7.5000000
+-15.9090900 5.0000000 7.5000000
+-22.2727280 5.0000000 7.5000000
+-28.6363640 5.0000000 7.5000000
+-28.6363640 0.0000000 7.5000000
+-22.2727280 0.0000000 7.5000000
+-15.9090919 0.0000000 7.5000000
+-9.5454559 0.0000000 7.5000000
+-3.1818190 0.0000000 7.5000000
+3.1818180 0.0000000 7.5000000
+9.5454540 0.0000000 7.5000000
+15.9090900 0.0000000 7.5000000
+22.2727280 0.0000000 7.5000000
+28.6363640 0.0000000 7.5000000
+-28.6363640 7.0000000 0.0000000
+-22.2727280 7.0000000 0.0000000
+-15.9090919 7.0000000 0.0000000
+-9.5454559 7.0000000 0.0000000
+-3.1818190 7.0000000 0.0000000
+3.1818180 7.0000000 0.0000000
+9.5454540 7.0000000 0.0000000
+15.9090900 7.0000000 0.0000000
+22.2727280 7.0000000 0.0000000
+28.6363640 7.0000000 0.0000000
+numsurf 59
+SURF 0X0
+mat 1
+refs 4
+1 0.897031 0.232842
+3 0.060587 0.232842
+2 0.060587 0.030714
+0 0.897031 0.030714
+SURF 0X0
+mat 1
+refs 4
+19 0.277402 0.063859
+7 0.613808 0.063859
+6 0.613808 0.259657
+20 0.277402 0.259657
+SURF 0X0
+mat 1
+refs 4
+7 0.897031 0.232842
+5 0.060587 0.232842
+4 0.060587 0.030714
+6 0.897031 0.030714
+SURF 0X0
+mat 1
+refs 4
+39 0.277402 0.063859
+1 0.613808 0.063859
+0 0.613808 0.259657
+40 0.277402 0.259657
+SURF 0X0
+mat 1
+refs 3
+5 0.060587 0.232842
+7 0.897031 0.232842
+9 0.479744 0.314855
+SURF 0X0
+mat 1
+refs 3
+3 0.060587 0.232842
+1 0.897031 0.232842
+8 0.479744 0.314855
+SURF 0X0
+mat 1
+refs 4
+30 0.521576 0.619038
+5 0.948646 0.619038
+9 0.948646 0.932239
+59 0.521576 0.932239
+SURF 0X0
+mat 1
+refs 4
+10 0.284495 0.619038
+3 0.731946 0.619038
+8 0.731946 0.932239
+50 0.284495 0.932239
+SURF 0X0
+mat 1
+refs 4
+20 0.256749 0.991291
+6 0.203391 0.991291
+4 0.203391 0.974157
+49 0.256749 0.974157
+SURF 0X0
+mat 1
+refs 4
+2 0.790337 0.991291
+29 0.736979 0.991291
+40 0.736979 0.974157
+0 0.790337 0.974157
+SURF 0X0
+mat 1
+refs 4
+29 0.736979 0.991291
+28 0.683620 0.991291
+41 0.683620 0.974157
+40 0.736979 0.974157
+SURF 0X0
+mat 1
+refs 4
+28 0.683620 0.991291
+27 0.630261 0.991291
+42 0.630261 0.974157
+41 0.683620 0.974157
+SURF 0X0
+mat 1
+refs 4
+27 0.630261 0.991291
+26 0.576902 0.991291
+43 0.576902 0.974157
+42 0.630261 0.974157
+SURF 0X0
+mat 1
+refs 4
+26 0.576902 0.991291
+25 0.523543 0.991291
+44 0.523543 0.974157
+43 0.576902 0.974157
+SURF 0X0
+mat 1
+refs 4
+25 0.523543 0.991291
+24 0.470185 0.991291
+45 0.470185 0.974157
+44 0.523543 0.974157
+SURF 0X0
+mat 1
+refs 4
+24 0.470185 0.991291
+23 0.416826 0.991291
+46 0.416826 0.974157
+45 0.470185 0.974157
+SURF 0X0
+mat 1
+refs 4
+23 0.416826 0.991291
+22 0.363467 0.991291
+47 0.363467 0.974157
+46 0.416826 0.974157
+SURF 0X0
+mat 1
+refs 4
+22 0.363467 0.991291
+21 0.310108 0.991291
+48 0.310108 0.974157
+47 0.363467 0.974157
+SURF 0X0
+mat 1
+refs 4
+21 0.310108 0.991291
+20 0.256749 0.991291
+49 0.256749 0.974157
+48 0.310108 0.974157
+SURF 0X0
+mat 1
+refs 4
+7 0.083704 0.619038
+19 0.510774 0.619038
+59 0.510774 0.932239
+9 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+19 0.510774 0.619038
+18 0.948646 0.619038
+58 0.948646 0.932239
+59 0.510774 0.932239
+SURF 0X0
+mat 1
+refs 4
+18 0.083704 0.619038
+17 0.510774 0.619038
+57 0.510774 0.932239
+58 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+17 0.510774 0.619038
+16 0.948646 0.619038
+56 0.948646 0.932239
+57 0.510774 0.932239
+SURF 0X0
+mat 1
+refs 4
+16 0.083704 0.619038
+15 0.510774 0.619038
+55 0.510774 0.932239
+56 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+15 0.510774 0.619038
+14 0.948646 0.619038
+54 0.948646 0.932239
+55 0.510774 0.932239
+SURF 0X0
+mat 1
+refs 4
+14 0.083704 0.619038
+13 0.510774 0.619038
+53 0.510774 0.932239
+54 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+13 0.510774 0.619038
+12 0.948646 0.619038
+52 0.948646 0.932239
+53 0.510774 0.932239
+SURF 0X0
+mat 1
+refs 4
+12 0.083704 0.619038
+11 0.521576 0.619038
+51 0.521576 0.932239
+52 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+11 0.521576 0.619038
+10 0.948646 0.619038
+50 0.948646 0.932239
+51 0.521576 0.932239
+SURF 0X0
+mat 1
+refs 4
+1 0.284495 0.619038
+39 0.731946 0.619038
+50 0.731946 0.932239
+8 0.284495 0.932239
+SURF 0X0
+mat 1
+refs 4
+39 0.083704 0.619038
+38 0.510774 0.619038
+51 0.510774 0.932239
+50 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+38 0.510774 0.619038
+37 0.948646 0.619038
+52 0.948646 0.932239
+51 0.510774 0.932239
+SURF 0X0
+mat 1
+refs 4
+37 0.083704 0.619038
+36 0.521576 0.619038
+53 0.521576 0.932239
+52 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+36 0.521576 0.619038
+35 0.948646 0.619038
+54 0.948646 0.932239
+53 0.521576 0.932239
+SURF 0X0
+mat 1
+refs 4
+35 0.083704 0.619038
+34 0.521576 0.619038
+55 0.521576 0.932239
+54 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+34 0.521576 0.619038
+33 0.948646 0.619038
+56 0.948646 0.932239
+55 0.521576 0.932239
+SURF 0X0
+mat 1
+refs 4
+33 0.083704 0.619038
+32 0.521576 0.619038
+57 0.521576 0.932239
+56 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+32 0.521576 0.619038
+31 0.948646 0.619038
+58 0.948646 0.932239
+57 0.521576 0.932239
+SURF 0X0
+mat 1
+refs 4
+31 0.083704 0.619038
+30 0.521576 0.619038
+59 0.521576 0.932239
+58 0.083704 0.932239
+SURF 0X0
+mat 1
+refs 4
+5 0.874007 0.572981
+30 0.534809 0.572981
+49 0.534809 0.370077
+4 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+30 0.534809 0.572981
+31 0.195611 0.572981
+48 0.195611 0.370077
+49 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+31 0.874007 0.572981
+32 0.534809 0.572981
+47 0.534809 0.370077
+48 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+32 0.534809 0.572981
+33 0.195612 0.572981
+46 0.195612 0.370077
+47 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+33 0.874007 0.572981
+34 0.534809 0.572981
+45 0.534809 0.370077
+46 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+34 0.534809 0.572981
+35 0.195612 0.572981
+44 0.195612 0.370077
+45 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+35 0.874007 0.572981
+36 0.534809 0.572981
+43 0.534809 0.370077
+44 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+36 0.534809 0.572981
+37 0.195612 0.572981
+42 0.195612 0.370077
+43 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+37 0.874007 0.572981
+38 0.534809 0.572981
+41 0.534809 0.370077
+42 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+38 0.534809 0.572981
+39 0.195612 0.572981
+40 0.195612 0.370077
+41 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+3 0.874007 0.572981
+10 0.534809 0.572981
+29 0.534809 0.370077
+2 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+10 0.534809 0.572981
+11 0.195612 0.572981
+28 0.195612 0.370077
+29 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+11 0.874007 0.572981
+12 0.534809 0.572981
+27 0.534809 0.370077
+28 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+12 0.534809 0.572981
+13 0.195612 0.572981
+26 0.195612 0.370077
+27 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+13 0.874007 0.572981
+14 0.534809 0.572981
+25 0.534809 0.370077
+26 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+14 0.534809 0.572981
+15 0.195611 0.572981
+24 0.195611 0.370077
+25 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+15 0.874007 0.572981
+16 0.534809 0.572981
+23 0.534809 0.370077
+24 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+16 0.534809 0.572981
+17 0.195612 0.572981
+22 0.195612 0.370077
+23 0.534809 0.370077
+SURF 0X0
+mat 1
+refs 4
+17 0.874007 0.572981
+18 0.534809 0.572981
+21 0.534809 0.370077
+22 0.874007 0.370077
+SURF 0X0
+mat 1
+refs 4
+18 0.534809 0.572981
+19 0.195611 0.572981
+20 0.195611 0.370077
+21 0.534809 0.370077
+kids 0
diff --git a/Missions/Races/Race-1/Models/Hangar_70x15.png b/Missions/Races/Race-1/Models/Hangar_70x15.png
new file mode 100644
index 0000000..ef96e54
Binary files /dev/null and b/Missions/Races/Race-1/Models/Hangar_70x15.png differ
diff --git a/Missions/Races/Race-1/Sounds/glassbell.wav b/Missions/Races/Race-1/Sounds/glassbell.wav
new file mode 100644
index 0000000..bf77b34
Binary files /dev/null and b/Missions/Races/Race-1/Sounds/glassbell.wav differ
diff --git a/Missions/Races/Race-1/image.png b/Missions/Races/Race-1/image.png
new file mode 100644
index 0000000..b7a6c76
Binary files /dev/null and b/Missions/Races/Race-1/image.png differ
diff --git a/Missions/Races/Race-1/metadata.xml b/Missions/Races/Race-1/metadata.xml
new file mode 100644
index 0000000..09b7eb3
--- /dev/null
+++ b/Missions/Races/Race-1/metadata.xml
@@ -0,0 +1,12 @@
+
+
+
+ EYKS
+
+ 2
+
+
+Race example. You must start at EYKS.
+
+
+
diff --git a/Missions/Races/Race-1/mission.xml b/Missions/Races/Race-1/mission.xml
new file mode 100644
index 0000000..43bd2f8
--- /dev/null
+++ b/Missions/Races/Race-1/mission.xml
@@ -0,0 +1,736 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Nasal/extensions/gate_race_point.nas b/Nasal/extensions/gate_race_point.nas
new file mode 100644
index 0000000..985dc5b
--- /dev/null
+++ b/Nasal/extensions/gate_race_point.nas
@@ -0,0 +1,88 @@
+
+
+mission.extension_add("MissionObject", {
+
+ type: "gate-race-point",
+
+ new: func(n) {
+ var m = {
+ parents : [me],
+ name : n.getValue("name"),
+ activated : mission.get(n, "activated", 0),
+ heading : mission.get(n, "orientation/heading-deg", 0),
+ ignore_dist : mission.get(n, "ignore-distance-m", 100),
+ enter_actions : n.getNode("on-enter-actions"),
+ penalty_actions : n.getNode("on-penalty-actions"),
+ height : mission.get(n, "height-m", 20.0),
+ width : mission.get(n, "width-m", 20.0),
+ coord : mission.get_coord(n.getNode("world-position")),
+ _direct_dist : nil,
+ _norm_dist : 0,
+ _h_dist : nil,
+ _v_dist : nil,
+ _prev_norm_dist : nil,
+ };
+
+
+ m.timer = maketimer(0.5, func m._loop());
+
+ return m;
+ },
+
+# init: func {
+# if (me.activated)
+# me.start();
+# },
+
+
+ start: func {
+ me.timer.start();
+ },
+
+ stop: func {
+ me.timer.stop();
+ },
+
+ del: func {
+ me.stop();
+ },
+
+
+ _loop: func {
+ me._update();
+ },
+
+ _update: func {
+ var ac_coord = geo.aircraft_position();
+ me._direct_dist = me.coord.direct_distance_to(ac_coord);
+ var hdg = me.heading * D2R;
+ var crs = me.coord.course_to(ac_coord) * D2R;
+
+ me._v_dist = ac_coord.alt() - me.coord.alt();
+
+ var d = math.sqrt(me._direct_dist * me._direct_dist - me._v_dist * me._v_dist);
+ me._prev_norm_dist = me._norm_dist;
+ me._norm_dist = math.cos(hdg - crs) * d;
+
+ if (me._prev_norm_dist >= 0)
+ return;
+
+ if (me._norm_dist < 0)
+ return;
+
+ me._h_dist = math.sin(hdg - crs) * d;
+ if (math.abs(me._h_dist) > me.width/2)
+ return;
+ if (math.abs(me._v_dist) > me.height)
+ return;
+
+ if (me.enter_actions != nil)
+ mission.activate_object_group(me.enter_actions);
+
+ me.stop();
+ setprop("/sim/mission/race/signals/next-race-point", 1);
+
+ },
+
+
+}); #extension_add
diff --git a/Nasal/extensions/point_of_interest_handler.nas b/Nasal/extensions/point_of_interest_handler.nas
index 69ddd52..83e119c 100644
--- a/Nasal/extensions/point_of_interest_handler.nas
+++ b/Nasal/extensions/point_of_interest_handler.nas
@@ -35,6 +35,8 @@ var update = func {
}
var check_POI = func {
+ if (!mission.mission_started)
+ return;
poi("count", var count = 0);
setsize(active_POI, 0);
foreach (var p; node.getChildren("point-of-interest"))
diff --git a/Nasal/extensions/pylon_race_point.nas b/Nasal/extensions/pylon_race_point.nas
new file mode 100644
index 0000000..30d494f
--- /dev/null
+++ b/Nasal/extensions/pylon_race_point.nas
@@ -0,0 +1,96 @@
+
+
+mission.extension_add("MissionObject", {
+
+ type: "pylon-race-point",
+
+ new: func(n) {
+ var m = {
+ parents : [me],
+ name : n.getValue("name"),
+ activated : mission.get(n, "activated", 0),
+ heading : mission.get(n, "orientation/heading-deg", 0),
+ ignore_dist : mission.get(n, "ignore-distance-m", 100),
+ enter_actions : n.getNode("on-enter-actions"),
+ penalty_actions : n.getNode("on-penalty-actions"),
+ inside_dir : mission.get(n, "inside-direction", 0),
+ coord : mission.get_coord(n.getNode("world-position")),
+ _direct_dist : nil,
+ _norm_dist : 0,
+ _h_dist : nil,
+ _v_dist : nil,
+ _prev_norm_dist : nil,
+ };
+
+ if (m.inside_dir == "right")
+ m.inside_dir = -1;
+ elsif (m.inside_dir == "left")
+ m.inside_dir = 1;
+ else m.inside_dir = 0;
+
+ m.timer = maketimer(0.5, func m._loop());
+
+ return m;
+ },
+
+# init: func {
+# if (me.activated)
+# me.start();
+# },
+
+
+ start: func {
+ me.timer.start();
+ },
+
+ stop: func {
+ me.timer.stop();
+ },
+
+ del: func {
+ me.stop();
+ },
+
+
+ _loop: func {
+ me._update();
+ },
+
+ _update: func {
+ var ac_coord = geo.aircraft_position();
+
+ me._direct_dist = me.coord.direct_distance_to(ac_coord);
+ if (me._direct_dist >= me.ignore_dist)
+ return;
+
+ var hdg = me.heading * D2R;
+ var crs = me.coord.course_to(ac_coord) * D2R;
+
+
+ me._v_dist = ac_coord.alt() - me.coord.alt();
+
+ var d = math.sqrt(me._direct_dist * me._direct_dist - me._v_dist * me._v_dist);
+ me._prev_norm_dist = me._norm_dist;
+ me._norm_dist = math.cos(hdg - crs) * d;
+
+ if (me._prev_norm_dist >= 0)
+ return;
+
+ if (me._norm_dist < 0)
+ return;
+
+ me._h_dist = math.sin(hdg - crs) * d;
+
+ #if (math.sgn(me._h_dist) != me.inside_dir) {
+ if (me.enter_actions != nil)
+ mission.activate_object_group(me.enter_actions);
+ #}
+
+
+ me.stop();
+ setprop("/sim/mission/race/signals/next-race-point", 1);
+
+ },
+
+
+}); #extension_add
diff --git a/Nasal/extensions/race.nas b/Nasal/extensions/race.nas
new file mode 100644
index 0000000..67323af
--- /dev/null
+++ b/Nasal/extensions/race.nas
@@ -0,0 +1,201 @@
+
+
+
+var w = 400;
+var h = 80;
+var bg_color = [0.2, 0.4, 0.7, 0.9];
+var line_color = [1, 1, 1, 0.8];
+var txt_h = h / 10;
+var txt2_h = txt_h * 0.8;
+var font = "LiberationFonts/LiberationSans-Italic.ttf";
+var font2 = "LiberationFonts/LiberationMono-Italic.ttf";
+var offset = 5;
+var th = h - offset * 2; # table height
+var x_left = offset; # table corners
+var x_right = w - x_left; #
+var y_top = x_left; #
+var y_bottom = th + x_left; # /table corners
+var margin = 10;
+
+var window = canvas.Window.new([w,h]);
+
+var scr_x = func getprop("/sim/startup/xsize");
+var scr_y = func getprop("/sim/startup/ysize");
+
+window.set("tf/t[0]", scr_x() - w - 20);
+window.set("tf/t[1]", scr_y() / 20);
+
+var mycanvas = window.createCanvas();
+mycanvas.setColorBackground(0,0,0,0);
+
+var table = mycanvas.createGroup();
+var cfg = {
+ "border-top-radius": h/2.1,
+ "border-bottom-radius": h/2.1,
+};
+table.createChild("path")
+ .rect(offset, offset, w - 2*offset, h - 2*offset, cfg)
+ .setColor(line_color)
+ .setColorFill(bg_color)
+ .setStrokeLineWidth(2);
+
+
+var _data = [
+ # 0 , 1 , 2 , 3 , 4 , 5 , 6 ,
+ # , x , y , Alignment , Size , Font , Text ,
+ ["Lap" , h/2 , h/2 + offset/2 , "left-center" , h/4 , font , "Lap" ],
+ ["_Lap" , w/4 , h/2 , "left-center" , h/3 , font2 , "-/-" ],
+ ["TotalTime" , w/1.5 , (h - 2*offset)/3 , "right-bottom" , h/6 , font , "Total Time" ],
+ ["_TotalTime" , w/1.5 + offset , (h - 2*offset)/3 , "left-bottom" , h/4 , font2 , "00:00.0" ],
+ ["CurrentLap" , w/1.5 , (h - 2*offset)/3*2 , "right-bottom" , h/6 , font , "Current Lap"],
+ ["_CurrentLap" , w/1.5 + offset , (h - 2*offset)/3*2 , "left-bottom" , h/4 , font2 , "00:00.0" ],
+ ["LastLap" , w/1.5 , (h - 2*offset)/3*3 , "right-bottom" , h/6 , font , "Last Lap" ],
+ ["_LastLap" , w/1.5 + offset , (h - 2*offset)/3*3 , "left-bottom" , h/4 , font2 , "00:00.0" ],
+];
+
+var txt = {};
+foreach (var a; _data) {
+ txt[a[0]] = table.createChild("text");
+ txt[a[0]]
+ .setTranslation(a[1], a[2])
+ .setText(a[6])
+ .setAlignment(a[3])
+ .setFontSize(a[4])
+ .setFont(a[5])
+ .setColor(1,1,1);
+}
+
+
+var time_str = func(t) {
+ var t1 = int(math.mod(t / 60, 60));
+ var t2 = int(math.mod(t, 60));
+ var t3 = int(math.mod(t * 10, 10));
+ sprintf("%02d:%02d.%d", t1, t2, t3);
+}
+
+var timer = {
+ _tN : props.getNode("/sim/time/elapsed-sec"),
+ _timer : maketimer(0.1, func timer._loop()),
+ _time : 0,
+ _penalty : 0,
+ _total : 0,
+ _current : 0,
+ _last : 0,
+
+
+ start: func {
+ me._start_time = me._tN.getValue();
+ me._timer.start();
+ },
+
+ stop: func {
+ me._timer.stop();
+ },
+
+ add_time: func(t) {
+ me._penalty += t;
+ },
+
+ reset: func {
+ me._total += me._time + me._penalty;
+ me._last = me._time;
+ me._start_time = me._tN.getValue();
+ txt._LastLap.setText(time_str(me._last));
+ },
+
+ _loop: func {
+ me._time = me._tN.getValue() - me._start_time;
+ txt._TotalTime.setText(time_str(me._total + me._time + me._penalty));
+ txt._CurrentLap.setText(time_str(me._time));
+ },
+};
+
+
+var race = {
+ type: "race",
+
+ new: func(n) {
+ var m = {
+ parents : [race],
+ name : n.getValue("name"),
+ _num_of_laps : mission.get(n, "number-of-laps", 1),
+ _clock_start : mission.get(n, "clock-start", "immediate"), #on-action, on-first-race-point, immediate
+ _course : n.getNode("race-course", 0),
+ _race_points : [],
+ _current_point : 0,
+ _lap : 1,
+ _next_lap : 0,
+ };
+ return m;
+ },
+
+ init: func {
+ me._listeners = [
+ setlistener("/sim/mission/race/signals/next-race-point", func me._next_point()),
+ ];
+
+ if (me._clock_start == "on-action")
+ me._clock_start = 0;
+ elsif (me._clock_start == "on-first-race-point")
+ me._clock_start = 1;
+ else me._clock_start = 2;
+
+
+ if ( me._course != nil )
+ foreach(var ref; me._course.getChildren("object-reference"))
+ foreach(var obj; mission.mission_objects)
+ if (ref.getValue() == obj.name)
+ append(me._race_points, obj);
+
+ me._points_count = size(me._race_points);
+ txt._Lap.setText(1 ~ "/" ~ me._num_of_laps);
+ me.start();
+ },
+
+ start: func {
+ me._race_points[me._current_point].start();
+ },
+
+ stop: func {
+ timer.stop();
+ foreach(var a; me._race_points)
+ a.stop();
+ },
+
+ del: func {
+ window.del();
+ me.stop();
+ foreach(var l; me._listeners)
+ removelistener(l);
+ setsize(me._listeners, 0);
+ },
+
+ _next_point: func {
+ if ((me._clock_start == 1) and (me._current_point == 0) and me._lap == 1)
+ timer.start();
+
+ if (me._next_lap) {
+ me._next_lap = 0;
+ me._lap += 1;
+ if (me._lap > me._num_of_laps) {
+ timer.reset();
+ timer.stop();
+ me.stop();
+ txt._CurrentLap.setText("00:00.0");
+ return;
+ }
+ timer.reset();
+ txt._Lap.setText(me._lap ~ "/" ~ me._num_of_laps);
+ }
+
+ me._current_point += 1;
+ if ( (me._current_point + 1) > me._points_count ) {
+ me._current_point = 0;
+ me._next_lap = 1;
+ }
+
+ me._race_points[me._current_point].start();
+ },
+};
+
+mission.extension_add("MissionObject", race);
\ No newline at end of file