void FScenarioDefinition::DeserializeFromJson()

in Ambit/Source/Ambit/Mode/ScenarioDefinition.cpp [43:158]


void FScenarioDefinition::DeserializeFromJson(TSharedPtr<FJsonObject> JsonObject)
{
    FString Warnings;

    if (JsonObject->HasField(JsonConstants::KVersionKey))
    {
        const FString Version = JsonObject->GetStringField(JsonConstants::KVersionKey);
        // TODO: Support a list of approved/backwards compatible versions?
        if (!Version.Equals(KCurrentVersion))
        {
            const FString InvalidVersion = FString::Printf(
                TEXT("The version in the file (%s) is not supported"), *Version);
            FMenuHelpers::LogErrorAndPopup(InvalidVersion);

            return;
        }
    }

    if (JsonObject->HasField(JsonConstants::KScenarioNameKey))
    {
        this->ScenarioName = JsonObject->GetStringField(JsonConstants::KScenarioNameKey);
    }

    if (JsonObject->HasField(JsonConstants::KTimeOfDayKey))
    {
        FString TempMessage;

        const float IncomingTime = JsonObject->GetNumberField(JsonConstants::KTimeOfDayKey);
        this->TimeOfDay = FMathHelpers::ClampBoundary(IncomingTime, 0.f, 23.99999f, TEXT("time of day"), TempMessage);

        if (!TempMessage.IsEmpty())
        {
            Warnings.Append(TempMessage + LINE_TERMINATOR);
        }
    }

    if (JsonObject->HasField(JsonConstants::KWeatherParametersKey))
    {
        FJsonObjectConverter::JsonObjectToUStruct(
            JsonObject->GetObjectField(JsonConstants::KWeatherParametersKey).ToSharedRef(),
            FAmbitWeatherParameters::StaticStruct(), &this->AmbitWeatherParameters, 0, 0);

        FString CloudinessTempMessage;
        this->AmbitWeatherParameters.Cloudiness = FMathHelpers::ClampBoundary(
            this->AmbitWeatherParameters.Cloudiness, 0.f, 100.f, TEXT("cloudiness"), CloudinessTempMessage);
        if (!CloudinessTempMessage.IsEmpty())
        {
            Warnings.Append(CloudinessTempMessage + LINE_TERMINATOR);
        }

        FString PrecipitationTempMessage;
        this->AmbitWeatherParameters.Precipitation = FMathHelpers::ClampBoundary(
            this->AmbitWeatherParameters.Precipitation, 0.f, 100.f, TEXT("precipitation"), PrecipitationTempMessage);
        if (!PrecipitationTempMessage.IsEmpty())
        {
            Warnings.Append(PrecipitationTempMessage + LINE_TERMINATOR);
        }

        FString PuddlesTempMessage;
        this->AmbitWeatherParameters.Puddles = FMathHelpers::ClampBoundary(
            this->AmbitWeatherParameters.Puddles, 0.f, 100.f, TEXT("puddles"), PuddlesTempMessage);
        if (!PuddlesTempMessage.IsEmpty())
        {
            Warnings.Append(PuddlesTempMessage + LINE_TERMINATOR);
        }

        FString WetnessTempMessage;
        this->AmbitWeatherParameters.Wetness = FMathHelpers::ClampBoundary(
            this->AmbitWeatherParameters.Wetness, 0.f, 100.f, TEXT("cloudiness"), WetnessTempMessage);
        if (!WetnessTempMessage.IsEmpty())
        {
            Warnings.Append(WetnessTempMessage + LINE_TERMINATOR);
        }

        FString FogDensityTempMessage;
        this->AmbitWeatherParameters.FogDensity = FMathHelpers::ClampBoundary(
            this->AmbitWeatherParameters.FogDensity, 0.f, 100.f, TEXT("fog density"), FogDensityTempMessage);
        if (!FogDensityTempMessage.IsEmpty())
        {
            Warnings.Append(FogDensityTempMessage + LINE_TERMINATOR);
        }
    }

    if (JsonObject->HasField(JsonConstants::KPedestrianDensityKey))
    {
        FString TempMessage;

        const float IncomingDensity = JsonObject->GetNumberField(JsonConstants::KPedestrianDensityKey);
        this->PedestrianDensity = FMathHelpers::ClampBoundary(IncomingDensity, 0.f, 1.f, TEXT("pedestrian density"),
                                                              TempMessage);

        if (!TempMessage.IsEmpty())
        {
            Warnings.Append(TempMessage + LINE_TERMINATOR);
        }
    }

    if (JsonObject->HasField(JsonConstants::KTrafficDensityKey))
    {
        FString TempMessage;

        const float IncomingDensity = JsonObject->GetNumberField(JsonConstants::KTrafficDensityKey);
        this->VehicleDensity = FMathHelpers::ClampBoundary(IncomingDensity, 0.f, 1.f, TEXT("vehicle density"),
                                                           TempMessage);

        if (!TempMessage.IsEmpty())
        {
            Warnings.Append(TempMessage + LINE_TERMINATOR);
        }
    }

    if (!Warnings.IsEmpty())
    {
        FMenuHelpers::LogErrorAndPopup(Warnings);
    }
}