Fill out TrackSegment API (#18478)

* add fields to track segment api

* add getTrackSegments to API

* change element to segment for continuity

* improve documentation

* continue tweaking documentation

* implement segment suggestions

* clarify purpose of isSteepUp flag

* add rest of track element flags

* remove extraneous information from comment

* continue tweaking API

* implement basssiiie suggestion

* rename angle to slope

* reorder items in the documentation

* bump plugin api
This commit is contained in:
spacek531 2023-01-25 14:05:18 -08:00 committed by GitHub
parent c437a9f0cc
commit b1bb24aefb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 286 additions and 40 deletions

View File

@ -234,6 +234,8 @@ declare global {
*/
getTrackSegment(type: number): TrackSegment | null;
getAllTrackSegments(): TrackSegment[];
/**
* Gets the image number for the given icon.
* @param iconName The name of the icon.
@ -1953,62 +1955,58 @@ declare global {
readonly description: string;
/**
* The relative starting Z position.
* The relative starting Z position from the base of the first track sequence block.
*/
readonly beginZ: number;
/**
* The relative ending Z position from the base of the first track sequence block.
*/
readonly endZ: number;
/**
* The relative ending X position. BeginX is always 0.
*/
readonly endX: number;
/**
* The relative ending Y position. BeginY is always 0.
*/
readonly endY: number;
/**
* The relative starting direction. Usually 0, but will be 4
* for diagonal segments.
*/
readonly beginDirection: Direction8;
/**
* The relative ending direction.
*/
readonly endDirection: Direction8;
/**
* The slope angle the segment starts with.
*/
readonly beginAngle: TrackSlope;
readonly beginSlope: TrackSlope;
/**
* The slope angle the segment ends with.
*/
readonly endSlope: TrackSlope;
/**
* The kind of banking the segment starts with.
*/
readonly beginBank: TrackBanking;
/**
* The relative ending X position.
*/
readonly endX: number;
/**
* The relative ending Y position.
*/
readonly endY: number;
/**
* The relative ending Z position. Negative numbers indicate
* that the track ends upside down.
*/
readonly endZ: number;
/**
* The relative ending direction.
*/
readonly endDirection: Direction8;
/**
* The slope angle the segment ends with.
*/
readonly endAngle: TrackSlope;
/**
* The kind of banking the segment ends with.
*/
readonly endBank: TrackBanking;
/**
* The length of the segment in RCT track length units.
*
* *1 metre = 1 / (2 ^ 16)*
* The rough length of the segment.
*/
readonly length: number;
@ -2017,6 +2015,97 @@ declare global {
*/
readonly elements: TrackSegmentElement[];
/**
* The curve direction of the suggested following piece, or track segment if it is specified.
*/
readonly nextSuggestedSegment: TrackCurveType | number;
/**
* The curve direction of the suggested preceding piece, or track segment if it is specified.
*/
readonly previousSuggestedSegment: TrackCurveType | number;
/**
* The base price of the track segment.
*/
readonly priceModifier: number;
/**
* Track segment representing the mirror image of the track segment.
*/
readonly mirrorSegment: number | null;
/**
* Track segment representing the covered/flume variant of the track segment.
*/
readonly alternateTypeSegment: number | null;
/**
* The group the track element belongs to. Ride types allow or disallow track groups to limit the
* buildable track segments.
*/
readonly trackGroup: number;
/**
* Which direction the track curves towards.
*/
readonly turnDirection: TrackCurveType;
/**
* Which direction the track slopes towards.
*/
readonly slopeDirection: TrackSlopeType;
readonly onlyAllowedUnderwater: boolean;
readonly onlyAllowedAboveGround: boolean;
readonly allowsChainLift: boolean;
/**
* The track segment counts as banked for vehicles with "no banked track" behaviour.
*/
readonly isBanked: boolean;
/**
* The track segment counts as an inversion for vehicles with "no inversions" behaviour.
*/
readonly isInversion: boolean;
/**
* Pevents steep forward chainlifts but allows steep reverse chainlifts for reverse incline
* shuttle mode for ride types which do not normally allow steep chainlifts.
*/
readonly isSteepUp: boolean;
/**
* The track segment begins one height unit above normal track height units.
*/
readonly startsHalfHeightUp: boolean;
/**
* The track segment adds to golf hole counter.
*/
readonly countsAsGolfHole: boolean;
/**
* The track segment adds to banked turn counter.
*/
readonly isBankedTurn: boolean;
/**
* The track segment adds to sloped turn counter.
*/
readonly isSlopedTurn: boolean;
/**
* The track segment adds to helix counter.
*/
readonly isHelix: boolean;
/**
* The track segment adds to inversion counter. Usually applied to the first half of inversions.
*/
readonly countsAsInversion: boolean;
/**
* Gets a length of the subpositions list for this track segment.
*/
@ -2046,6 +2135,9 @@ declare global {
UpsideDown = 15
}
type TrackCurveType = "straight" | "left" | "right";
type TrackSlopeType = "flat" | "up" | "down";
interface TrackSegmentElement extends Readonly<CoordsXYZ> {
}

View File

@ -47,7 +47,7 @@ namespace OpenRCT2
namespace OpenRCT2::Scripting
{
static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 69;
static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 70;
// Versions marking breaking changes.
static constexpr int32_t API_VERSION_33_PEEP_DEPRECATION = 33;

View File

@ -233,6 +233,22 @@ namespace OpenRCT2::Scripting
}
}
std::vector<DukValue> getAllTrackSegments()
{
auto ctx = GetContext()->GetScriptEngine().GetContext();
std::vector<DukValue> result;
for (track_type_t type = 0; type < TrackElemType::Count; type++)
{
auto obj = std::make_shared<ScTrackSegment>(type);
if (obj != nullptr)
{
result.push_back(GetObjectAsDukValue(ctx, obj));
}
}
return result;
}
int32_t getRandom(int32_t min, int32_t max)
{
ThrowIfGameStateNotMutable();
@ -455,6 +471,7 @@ namespace OpenRCT2::Scripting
dukglue_register_method(ctx, &ScContext::getObject, "getObject");
dukglue_register_method(ctx, &ScContext::getAllObjects, "getAllObjects");
dukglue_register_method(ctx, &ScContext::getTrackSegment, "getTrackSegment");
dukglue_register_method(ctx, &ScContext::getAllTrackSegments, "getAllTrackSegments");
dukglue_register_method(ctx, &ScContext::getRandom, "getRandom");
dukglue_register_method_varargs(ctx, &ScContext::formatString, "formatString");
dukglue_register_method(ctx, &ScContext::subscribe, "subscribe");

View File

@ -29,13 +29,43 @@ void ScTrackSegment::Register(duk_context* ctx)
dukglue_register_property(ctx, &ScTrackSegment::type_get, nullptr, "type");
dukglue_register_property(ctx, &ScTrackSegment::description_get, nullptr, "description");
dukglue_register_property(ctx, &ScTrackSegment::elements_get, nullptr, "elements");
dukglue_register_property(ctx, &ScTrackSegment::beginZ_get, nullptr, "beginZ");
dukglue_register_property(ctx, &ScTrackSegment::beginDirection_get, nullptr, "beginDirection");
dukglue_register_property(ctx, &ScTrackSegment::endDirection_get, nullptr, "endDirection");
dukglue_register_property(ctx, &ScTrackSegment::beginSlope_get, nullptr, "beginSlope");
dukglue_register_property(ctx, &ScTrackSegment::endSlope_get, nullptr, "endSlope");
dukglue_register_property(ctx, &ScTrackSegment::beginBank_get, nullptr, "beginBank");
dukglue_register_property(ctx, &ScTrackSegment::endBank_get, nullptr, "endBank");
dukglue_register_property(ctx, &ScTrackSegment::beginZ_get, nullptr, "beginZ");
dukglue_register_property(ctx, &ScTrackSegment::endZ_get, nullptr, "endZ");
dukglue_register_property(ctx, &ScTrackSegment::endX_get, nullptr, "endX");
dukglue_register_property(ctx, &ScTrackSegment::endY_get, nullptr, "endY");
dukglue_register_property(ctx, &ScTrackSegment::endZ_get, nullptr, "endZ");
dukglue_register_property(ctx, &ScTrackSegment::endDirection_get, nullptr, "endDirection");
dukglue_register_property(ctx, &ScTrackSegment::length_get, nullptr, "length");
dukglue_register_property(ctx, &ScTrackSegment::nextCurveElement_get, nullptr, "nextSuggestedSegment");
dukglue_register_property(ctx, &ScTrackSegment::previousCurveElement_get, nullptr, "previousSuggestedSegment");
dukglue_register_property(ctx, &ScTrackSegment::getMirrorElement, nullptr, "mirrorSegment");
dukglue_register_property(ctx, &ScTrackSegment::getAlternativeElement, nullptr, "alternateTypeSegment");
dukglue_register_property(ctx, &ScTrackSegment::getPriceModifier, nullptr, "priceModifier");
dukglue_register_property(ctx, &ScTrackSegment::getTrackGroup, nullptr, "trackGroup");
dukglue_register_property(ctx, &ScTrackSegment::getTrackCurvature, nullptr, "turnDirection");
dukglue_register_property(ctx, &ScTrackSegment::getTrackSlopeDirection, nullptr, "slopeDirection");
dukglue_register_property(
ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_ONLY_UNDERWATER>, nullptr, "onlyAllowedUnderwater");
dukglue_register_property(
ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND>, nullptr, "onlyAllowedAboveGround");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_ALLOW_LIFT_HILL>, nullptr, "allowsChainLift");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_BANKED>, nullptr, "isBanked");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_INVERSION_TO_NORMAL>, nullptr, "isInversion");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_IS_STEEP_UP>, nullptr, "isSteepUp");
dukglue_register_property(
ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT>, nullptr, "startsHalfHeightUp");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_IS_GOLF_HOLE>, nullptr, "countsAsInversion");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_TURN_BANKED>, nullptr, "isBankedTurn");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_TURN_SLOPED>, nullptr, "isSlopedTurn");
dukglue_register_property(ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_HELIX>, nullptr, "isHelix");
dukglue_register_property(
ctx, &ScTrackSegment::getTrackFlag<TRACK_ELEM_FLAG_NORMAL_TO_INVERSION>, nullptr, "countsAsInversion");
dukglue_register_method(ctx, &ScTrackSegment::getSubpositionLength, "getSubpositionLength");
dukglue_register_method(ctx, &ScTrackSegment::getSubpositions, "getSubpositions");
}
@ -63,7 +93,7 @@ int32_t ScTrackSegment::beginDirection_get() const
return ted.Coordinates.rotation_begin;
}
int32_t ScTrackSegment::beginAngle_get() const
int32_t ScTrackSegment::beginSlope_get() const
{
const auto& ted = GetTrackElementDescriptor(_type);
return ted.Definition.vangle_start;
@ -99,7 +129,7 @@ int32_t ScTrackSegment::endDirection_get() const
return ted.Coordinates.rotation_end;
}
int32_t ScTrackSegment::endAngle_get() const
int32_t ScTrackSegment::endSlope_get() const
{
const auto& ted = GetTrackElementDescriptor(_type);
return ted.Definition.vangle_end;
@ -165,4 +195,101 @@ std::vector<DukValue> ScTrackSegment::getSubpositions(uint8_t trackSubposition,
return result;
}
DukValue ScTrackSegment::nextCurveElement_get() const
{
const auto ctx = GetContext()->GetScriptEngine().GetContext();
const auto& ted = GetTrackElementDescriptor(_type);
int32_t curve = ted.CurveChain.next;
if (curve & RideConstructionSpecialPieceSelected)
return ToDuk<int32_t>(ctx, curve & (~RideConstructionSpecialPieceSelected));
switch (curve)
{
case 1:
return ToDuk<std::string>(ctx, "left");
case 2:
return ToDuk<std::string>(ctx, "right");
default:
return ToDuk<std::string>(ctx, "straight");
}
}
DukValue ScTrackSegment::previousCurveElement_get() const
{
const auto ctx = GetContext()->GetScriptEngine().GetContext();
const auto& ted = GetTrackElementDescriptor(_type);
int32_t curve = ted.CurveChain.previous;
if (curve & RideConstructionSpecialPieceSelected)
return ToDuk<int32_t>(ctx, curve & (~RideConstructionSpecialPieceSelected));
switch (curve)
{
case 1:
return ToDuk<std::string>(ctx, "left");
case 2:
return ToDuk<std::string>(ctx, "right");
default:
return ToDuk<std::string>(ctx, "straight");
}
}
DukValue ScTrackSegment::getMirrorElement() const
{
const auto ctx = GetContext()->GetScriptEngine().GetContext();
const auto& ted = GetTrackElementDescriptor(_type);
if (ted.MirrorElement == TrackElemType::None)
return ToDuk(ctx, nullptr);
return ToDuk<int32_t>(ctx, ted.MirrorElement);
}
DukValue ScTrackSegment::getAlternativeElement() const
{
const auto ctx = GetContext()->GetScriptEngine().GetContext();
const auto& ted = GetTrackElementDescriptor(_type);
if (ted.AlternativeType == TrackElemType::None)
return ToDuk(ctx, nullptr);
return ToDuk<int32_t>(ctx, ted.AlternativeType);
}
int32_t ScTrackSegment::getPriceModifier() const
{
const auto& ted = GetTrackElementDescriptor(_type);
return ted.PriceModifier;
}
template<uint16_t flag> bool ScTrackSegment::getTrackFlag() const
{
const auto& ted = GetTrackElementDescriptor(_type);
return ted.Flags & flag;
}
int32_t ScTrackSegment::getTrackGroup() const
{
const auto& ted = GetTrackElementDescriptor(_type);
return ted.Definition.type;
}
std::string ScTrackSegment::getTrackCurvature() const
{
const auto& ted = GetTrackElementDescriptor(_type);
if (ted.Flags & TRACK_ELEM_FLAG_TURN_LEFT)
return "left";
if (ted.Flags & TRACK_ELEM_FLAG_TURN_RIGHT)
return "right";
return "straight";
}
std::string ScTrackSegment::getTrackSlopeDirection() const
{
const auto& ted = GetTrackElementDescriptor(_type);
if (ted.Flags & TRACK_ELEM_FLAG_UP)
return "up";
if (ted.Flags & TRACK_ELEM_FLAG_DOWN)
return "down";
return "flat";
}
#endif

View File

@ -46,18 +46,28 @@ namespace OpenRCT2::Scripting
std::string description_get() const;
int32_t beginZ_get() const;
int32_t beginDirection_get() const;
int32_t beginAngle_get() const;
int32_t beginSlope_get() const;
int32_t beginBank_get() const;
int32_t endX_get() const;
int32_t endY_get() const;
int32_t endZ_get() const;
int32_t endDirection_get() const;
int32_t endAngle_get() const;
int32_t endSlope_get() const;
int32_t endBank_get() const;
int32_t length_get() const;
DukValue elements_get() const;
uint16_t getSubpositionLength(uint8_t trackSubposition, uint8_t direction) const;
std::vector<DukValue> getSubpositions(uint8_t trackSubposition, uint8_t direction) const;
DukValue nextCurveElement_get() const;
DukValue previousCurveElement_get() const;
DukValue getMirrorElement() const;
DukValue getAlternativeElement() const;
int32_t getPriceModifier() const;
int32_t getPreviewZOffset() const;
int32_t getTrackGroup() const;
template<uint16_t flag> bool getTrackFlag() const;
std::string getTrackCurvature() const;
std::string getTrackSlopeDirection() const;
};
} // namespace OpenRCT2::Scripting