X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalPositioned.cxx;h=1f10e5baf73bd213c5a1740d1a1189b863cfd838;hb=ee1c8a8d662a0398711ee17c53dd64d249d2e030;hp=a01bf0c863c25963ca106af3ed8d4df41c9beba6;hpb=1eb8ae1fbf43359eec09b99885a9280f529c86fb;p=flightgear.git diff --git a/src/Scripting/NasalPositioned.cxx b/src/Scripting/NasalPositioned.cxx index a01bf0c86..1f10e5baf 100644 --- a/src/Scripting/NasalPositioned.cxx +++ b/src/Scripting/NasalPositioned.cxx @@ -73,6 +73,7 @@ naGhostType NavaidGhostType = { positionedGhostDestroy, "navaid", navaidGhostGet static const char* runwayGhostGetMember(naContext c, void* g, naRef field, naRef* out); naGhostType RunwayGhostType = { positionedGhostDestroy, "runway", runwayGhostGetMember, 0 }; +naGhostType HelipadGhostType = { positionedGhostDestroy, "helipad", runwayGhostGetMember, 0 }; naGhostType TaxiwayGhostType = { positionedGhostDestroy, "taxiway", runwayGhostGetMember, 0 }; static const char* fixGhostGetMember(naContext c, void* g, naRef field, naRef* out); @@ -289,6 +290,16 @@ naRef ghostForRunway(naContext c, const FGRunway* r) return naNewGhost2(c, &RunwayGhostType, (void*) r); } +naRef ghostForHelipad(naContext c, const FGHelipad* r) +{ + if (!r) { + return naNil(); + } + + FGPositioned::get(r); // take a ref + return naNewGhost2(c, &HelipadGhostType, (void*) r); +} + naRef ghostForTaxiway(naContext c, const FGTaxiway* r) { if (!r) { @@ -368,16 +379,24 @@ static const char* airportGhostGetMember(naContext c, void* g, naRef field, naRe double minLengthFt = fgGetDouble("/sim/navdb/min-runway-length-ft"); for(unsigned int r=0; rnumRunways(); ++r) { FGRunway* rwy(apt->getRunwayByIndex(r)); - - // ignore unusably short runways + // ignore unusably short runways if (rwy->lengthFt() < minLengthFt) { continue; } - naRef rwyid = stringToNasal(c, rwy->ident()); naRef rwydata = ghostForRunway(c, rwy); naHash_set(*out, rwyid, rwydata); } + } else if (!strcmp(fieldName, "helipads")) { + *out = naNewHash(c); + + for(unsigned int r=0; rnumHelipads(); ++r) { + FGHelipad* hp(apt->getHelipadByIndex(r)); + + naRef rwyid = stringToNasal(c, hp->ident()); + naRef rwydata = ghostForHelipad(c, hp); + naHash_set(*out, rwyid, rwydata); + } } else if (!strcmp(fieldName, "taxiways")) { *out = naNewVector(c); @@ -735,7 +754,9 @@ static const char* runwayGhostGetMember(naContext c, void* g, naRef field, naRef FGRunway* rwy = (FGRunway*) g; if (!strcmp(fieldName, "threshold")) *out = naNum(rwy->displacedThresholdM()); else if (!strcmp(fieldName, "stopway")) *out = naNum(rwy->stopwayM()); - else if (!strcmp(fieldName, "ils_frequency_mhz")) { + else if (!strcmp(fieldName, "reciprocal")) { + *out = ghostForRunway(c, rwy->reciprocalRunway()); + } else if (!strcmp(fieldName, "ils_frequency_mhz")) { *out = rwy->ILS() ? naNum(rwy->ILS()->get_freq() / 100.0) : naNil(); } else if (!strcmp(fieldName, "ils")) { *out = ghostForNavaid(c, rwy->ILS()); @@ -1160,18 +1181,36 @@ static naRef f_airport_runway(naContext c, naRef me, int argc, naRef* args) if (!apt) { naRuntimeError(c, "airport.runway called on non-airport object"); } - + if ((argc < 1) || !naIsString(args[0])) { naRuntimeError(c, "airport.runway expects a runway ident argument"); } - + std::string ident(naStr_data(args[0])); boost::to_upper(ident); - if (!apt->hasRunwayWithIdent(ident)) { - return naNil(); + + if (apt->hasRunwayWithIdent(ident)) { + return ghostForRunway(c, apt->getRunwayByIdent(ident)); + } else if (apt->hasHelipadWithIdent(ident)) { + return ghostForHelipad(c, apt->getHelipadByIdent(ident)); } - - return ghostForRunway(c, apt->getRunwayByIdent(ident)); + return naNil(); +} + +static naRef f_airport_runwaysWithoutReciprocals(naContext c, naRef me, int argc, naRef* args) +{ + FGAirport* apt = airportGhost(me); + if (!apt) { + naRuntimeError(c, "airport.runwaysWithoutReciprocals called on non-airport object"); + } + + FGRunwayList rwylist(apt->getRunwaysWithoutReciprocals()); + naRef runways = naNewVector(c); + for (unsigned int r=0; rgetRunwayByIdent(rwy->ident()))); + } + return runways; } static naRef f_airport_taxiway(naContext c, naRef me, int argc, naRef* args) @@ -2389,6 +2428,8 @@ naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave) hashset(c, gcSave, "airportProto", airportPrototype); hashset(c, airportPrototype, "runway", naNewFunc(c, naNewCCode(c, f_airport_runway))); + hashset(c, airportPrototype, "runwaysWithoutReciprocals", naNewFunc(c, naNewCCode(c, f_airport_runwaysWithoutReciprocals))); + hashset(c, airportPrototype, "helipad", naNewFunc(c, naNewCCode(c, f_airport_runway))); hashset(c, airportPrototype, "taxiway", naNewFunc(c, naNewCCode(c, f_airport_taxiway))); hashset(c, airportPrototype, "tower", naNewFunc(c, naNewCCode(c, f_airport_tower))); hashset(c, airportPrototype, "comms", naNewFunc(c, naNewCCode(c, f_airport_comms)));