Nasal scripting language: Difference between revisions

Jump to navigation Jump to search
Line 58: Line 58:


Also, note that as of 05/2009, Nasal in FlightGear does not yet support any form of dependency resolution. In other words, there's no "import", "require" or "include" directive - this is also why most code in FlightGear is wrapped inside a _setlistener() call instead, which in turn waits for a FlightGear signal before executing the code (see below for details).
Also, note that as of 05/2009, Nasal in FlightGear does not yet support any form of dependency resolution. In other words, there's no "import", "require" or "include" directive - this is also why most code in FlightGear is wrapped inside a _setlistener() call instead, which in turn waits for a FlightGear signal before executing the code (see below for details).
== Initializing data structures ==
There are some more possibilities to increase the density of your code, such as by removing redundant code or by generalizing and refactoring existing code so that it can be reused in different places (i.e. avoiding duplicate code):
For example see weather_tile_management.nas #1000 (create_neighbours function):
    1008 x = -40000.0; y = 40000.0;
    1009 setprop(lw~"tiles/tile[0]/latitude-deg",blat + get_lat(x,y,phi));
    1010 setprop(lw~"tiles/tile[0]/longitude-deg",blon + get_lon(x,y,phi));
    1011 setprop(lw~"tiles/tile[0]/generated-flag",0);
    1012 setprop(lw~"tiles/tile[0]/tile-index",-1);
    1013 setprop(lw~"tiles/tile[0]/code","");
    1014 setprop(lw~"tiles/tile[0]/timestamp-sec",weather_dynamics.time_lw);
    1015 setprop(lw~"tiles/tile[0]/orientation-deg",alpha);
    1016
    1017 x = 0.0; y = 40000.0;
    1018 setprop(lw~"tiles/tile[1]/latitude-deg",blat + get_lat(x,y,phi));
    1019 setprop(lw~"tiles/tile[1]/longitude-deg",blon + get_lon(x,y,phi));
    1020 setprop(lw~"tiles/tile[1]/generated-flag",0);
    1021 setprop(lw~"tiles/tile[1]/tile-index",-1);
    1022 setprop(lw~"tiles/tile[1]/code","");
    1023 setprop(lw~"tiles/tile[1]/timestamp-sec",weather_dynamics.time_lw);
    1024 setprop(lw~"tiles/tile[1]/orientation-deg",alpha);
    1025
    1026 x = 40000.0; y = 40000.0;
    1027 setprop(lw~"tiles/tile[2]/latitude-deg",blat + get_lat(x,y,phi));
    1028 setprop(lw~"tiles/tile[2]/longitude-deg",blon + get_lon(x,y,phi));
    1029 setprop(lw~"tiles/tile[2]/generated-flag",0);
    1030 setprop(lw~"tiles/tile[2]/tile-index",-1);
    1031 setprop(lw~"tiles/tile[2]/code","");
    1032 setprop(lw~"tiles/tile[2]/timestamp-sec",weather_dynamics.time_lw);
    1033 setprop(lw~"tiles/tile[2]/orientation-deg",alpha);
    1034
    1035 x = -40000.0; y = 0.0;
    1036 setprop(lw~"tiles/tile[3]/latitude-deg",blat + get_lat(x,y,phi));
    1037 setprop(lw~"tiles/tile[3]/longitude-deg",blon + get_lon(x,y,phi));
    1038 setprop(lw~"tiles/tile[3]/generated-flag",0);
    1039 setprop(lw~"tiles/tile[3]/tile-index",-1);
    1040 setprop(lw~"tiles/tile[3]/code","");
    1041 setprop(lw~"tiles/tile[3]/timestamp-sec",weather_dynamics.time_lw);
    1042 setprop(lw~"tiles/tile[3]/orientation-deg",alpha);
    1043
    1044 # this is the current tile
    1045 x = 0.0; y = 0.0;
    1046 setprop(lw~"tiles/tile[4]/latitude-deg",blat + get_lat(x,y,phi));
    1047 setprop(lw~"tiles/tile[4]/longitude-deg",blon + get_lon(x,y,phi));
    1048 setprop(lw~"tiles/tile[4]/generated-flag",1);
    1049 setprop(lw~"tiles/tile[4]/tile-index",1);
    1050 setprop(lw~"tiles/tile[4]/code","");
    1051 setprop(lw~"tiles/tile[4]/timestamp-sec",weather_dynamics.time_lw);
    1052 setprop(lw~"tiles/tile[4]/orientation-deg",getprop(lw~"tmp/tile-orientation-deg"));
    1053
    1054
    1055 x = 40000.0; y = 0.0;
    1056 setprop(lw~"tiles/tile[5]/latitude-deg",blat + get_lat(x,y,phi));
    1057 setprop(lw~"tiles/tile[5]/longitude-deg",blon + get_lon(x,y,phi));
    1058 setprop(lw~"tiles/tile[5]/generated-flag",0);
    1059 setprop(lw~"tiles/tile[5]/tile-index",-1);
    1060 setprop(lw~"tiles/tile[5]/code","");
    1061 setprop(lw~"tiles/tile[5]/timestamp-sec",weather_dynamics.time_lw);
    1062 setprop(lw~"tiles/tile[5]/orientation-deg",alpha);
    1063
    1064 x = -40000.0; y = -40000.0;
    1065 setprop(lw~"tiles/tile[6]/latitude-deg",blat + get_lat(x,y,phi));
    1066 setprop(lw~"tiles/tile[6]/longitude-deg",blon + get_lon(x,y,phi));
    1067 setprop(lw~"tiles/tile[6]/generated-flag",0);
    1068 setprop(lw~"tiles/tile[6]/tile-index",-1);
    1069 setprop(lw~"tiles/tile[6]/code","");
    1070 setprop(lw~"tiles/tile[6]/timestamp-sec",weather_dynamics.time_lw);
    1071 setprop(lw~"tiles/tile[6]/orientation-deg",alpha);
    1072
    1073 x = 0.0; y = -40000.0;
    1074 setprop(lw~"tiles/tile[7]/latitude-deg",blat + get_lat(x,y,phi));
    1075 setprop(lw~"tiles/tile[7]/longitude-deg",blon + get_lon(x,y,phi));
    1076 setprop(lw~"tiles/tile[7]/generated-flag",0);
    1077 setprop(lw~"tiles/tile[7]/tile-index",-1);
    1078 setprop(lw~"tiles/tile[7]/code","");
    1079 setprop(lw~"tiles/tile[7]/timestamp-sec",weather_dynamics.time_lw);
    1080 setprop(lw~"tiles/tile[7]/orientation-deg",alpha);
    1081
    1082 x = 40000.0; y = -40000.0;
    1083 setprop(lw~"tiles/tile[8]/latitude-deg",blat + get_lat(x,y,phi));
    1084 setprop(lw~"tiles/tile[8]/longitude-deg",blon + get_lon(x,y,phi));
    1085 setprop(lw~"tiles/tile[8]/generated-flag",0);
    1086 setprop(lw~"tiles/tile[8]/tile-index",-1);
    1087 setprop(lw~"tiles/tile[8]/code","");
    1088 setprop(lw~"tiles/tile[8]/timestamp-sec",weather_dynamics.time_lw);
    1089 setprop(lw~"tiles/tile[8]/orientation-deg",alpha);
    1090 }
At first glance, this seems like a fairly repetitive and redundant block of code, so it could probably be simplified easily:
    var create_neighbours = func (blat, blon, alpha)        {
    var phi = alpha * math.pi/180.0;
    calc_geo(blat);
    var index=0;
    var pos = [  [-40000.0,40000.0], [0.0, 40.000], [40000.0, 40000.0], [-40000, 0],  [0,0], [40000,0], [-40000,-40000], [0,-40000], [40000,-40000] ];
    foreach (var p;pos) {
    x=p[0]; y=p[1];
    setprop(lw~"tiles/tile["~index~"]/latitude-deg",blat + get_lat(x,y,phi));
    setprop(lw~"tiles/tile["~index~"]/longitude-deg",blon + get_lon(x,y,phi));
    setprop(lw~"tiles/tile["~index~"]/generated-flag",0);
    setprop(lw~"tiles/tile["~index~"]/tile-index",-1);
    setprop(lw~"tiles/tile["~index~"]/code","");
    setprop(lw~"tiles/tile["~index~"]/timestamp-sec",weather_dynamics.time_lw);
    setprop(lw~"tiles/tile["~index~"]/orientation-deg",alpha);
    index=index+1;
      }
    }


==Built-in functions==
==Built-in functions==

Navigation menu