2,734
edits
m (→Implementation) |
Red Leader (talk | contribs) (Progess) |
||
| Line 61: | Line 61: | ||
: like I said, this is trivial to do using sub-classing, so need to touch geo.nas at all - just create your own geo.Coord sub-class and add helpers for getting the corresponding properties via props.nas --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 17:55, 29 October 2014 (UTC) | : like I said, this is trivial to do using sub-classing, so need to touch geo.nas at all - just create your own geo.Coord sub-class and add helpers for getting the corresponding properties via props.nas --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 17:55, 29 October 2014 (UTC) | ||
Progress for tonight as follows. I've created missile.nas and ai.nas, both in $FGDATA/Nasal, with the code as follows. | |||
ai.nas: | |||
<syntaxhighlight lang="nasal"> | |||
# This module enables generic AI objects to be created and updated | |||
var Obj = { | |||
new: func(type = nil, model_path = "Models/Geometry/null.ac"){ | |||
if(type == nil){ | |||
die("ai.nas: Error! 'type' is not defined"); | |||
} | |||
var m = { parents: [Obj] }; | |||
var n = props.globals.getNode("models", 1); | |||
for(var i = 0; 1; i += 1){ | |||
if(n.getChild("model", i, 0) == nil){ | |||
break; | |||
} | |||
} | |||
m.model_node = n.getChild("model", i, 1); | |||
var n = props.globals.getNode("ai/models", 1); | |||
for(var i = 0; 1; i += 1){ | |||
if(n.getChild(type, i, 0) == nil){ | |||
break; | |||
} | |||
} | |||
m.ai_node = n.getChild(type, i, 1); | |||
m.ai_node.getNode("valid", 1).setBoolValue(1); | |||
m.latN = m.ai_node.getNode("position/latitude-deg", 1); | |||
m.lonN = m.ai_node.getNode("position/longitude-deg", 1); | |||
m.altN = m.ai_node.getNode("position/altitude-ft", 1); | |||
m.hdgN = m.ai_node.getNode("orientation/true-heading-deg", 1); | |||
m.pitchN = m.ai_node.getNode("orientation/pitch-deg", 1); | |||
m.rollN = m.ai_node.getNode("orientation/roll-deg", 1); | |||
m.latN.setDoubleValue(0); | |||
m.lonN.setDoubleValue(0); | |||
m.altN.setDoubleValue(0); | |||
m.hdgN.setDoubleValue(0); | |||
m.pitchN.setDoubleValue(0); | |||
m.rollN.setDoubleValue(0); | |||
m.model_node.getNode("path", 1).setValue(model_path); | |||
m.model_node.getNode("latitude-deg-prop", 1).setValue(m.latN.getPath()); | |||
m.model_node.getNode("longitude-deg-prop", 1).setValue(m.lonN.getPath()); | |||
m.model_node.getNode("elevation-ft-prop", 1).setValue(m.altN.getPath()); | |||
m.model_node.getNode("heading-deg-prop", 1).setValue(m.hdgN.getPath()); | |||
m.model_node.getNode("pitch-deg-prop", 1).setValue(m.pitchN.getPath()); | |||
m.model_node.getNode("roll-deg-prop", 1).setValue(m.rollN.getPath()); | |||
m.model_node.getNode("load", 1).remove(); | |||
return m; | |||
}, | |||
del: func(){ | |||
me.model_node.remove(); | |||
me.ai_node.remove(); | |||
}, | |||
reload_model: func(model_path = "Models/Geometry/null.ac"){ | |||
me.model_node.remove(); | |||
var n = props.globals.getNode("models", 1); | |||
for(var i = 0; 1; i += 1){ | |||
if(n.getChild("model", i, 0) == nil){ | |||
break; | |||
} | |||
} | |||
me.model_node = n.getChild("model", i, 1); | |||
me.model_node.getNode("path", 1).setValue(model_path); | |||
me.model_node.getNode("latitude-deg-prop", 1).setValue(me.latN.getPath()); | |||
me.model_node.getNode("longitude-deg-prop", 1).setValue(me.lonN.getPath()); | |||
me.model_node.getNode("elevation-ft-prop", 1).setValue(me.altN.getPath()); | |||
me.model_node.getNode("heading-deg-prop", 1).setValue(me.hdgN.getPath()); | |||
me.model_node.getNode("pitch-deg-prop", 1).setValue(me.pitchN.getPath()); | |||
me.model_node.getNode("roll-deg-prop", 1).setValue(me.rollN.getPath()); | |||
}, | |||
set_pos: func(lat, lon, alt = 0, roll = 0, ptch = 0, hdg = 0){ | |||
me.latN.setDoubleValue(lat); | |||
me.lonN.setDoubleValue(lon); | |||
me.altN.setDoubleValue(alt); | |||
me.hdgN.setDoubleValue(hdg); | |||
me.pitchN.setDoubleValue(ptch); | |||
me.rollN.setDoubleValue(roll); | |||
} | |||
}; | |||
</syntaxhighlight> | |||
missile.nas: | |||
<syntaxhighlight lang="nasal"> | |||
var Missile = { | |||
new: func(tgt = "none", src = "none", type = "none"){ | |||
if(tgt == "none" or src == "none" or type == "none"){ | |||
die("missile.nas: Error! Arguments not defined."); | |||
} | |||
if(isa(tgt, geo.Coord) == 0 or isa(src, geo.Coord) == 0){ | |||
die("missile.nas: Error! Arguments not correct."); | |||
} | |||
var m = { parents: [Missile] }; | |||
m.tgt = tgt; | |||
m.src = src; | |||
m.type = check_lib(type); | |||
if(m.type == 0){ | |||
die("missile.nas: Error! Unsupported missile type."); | |||
} | |||
return m; | |||
}, | |||
launch: func(off_x = 0, off_y = 0, off_z = 0){ | |||
me.model = ai.Obj.new("missile", "Aircraft/Generic/Stores/AIM-9/AIM-9.xml"); | |||
me.update(); | |||
}, | |||
update: func(){ | |||
settimer(func{ | |||
me.update(); | |||
}, 0); | |||
} | |||
}; | |||
var check_lib = func(type){ | |||
return type; | |||
} | |||
</syntaxhighlight> | |||
PS Hooary, how do you sub-class an existing Nasal class? | |||
[[User:Red_Leader|Red Leader]] ([[User_talk:Red_Leader|Talk]] | [[Special:Contributions/Red_Leader|contribs]]) 20:15, 29 October 2014 (UTC) | |||