TSharedRef<FJsonObject> UFlareSaveWriter::SaveFactory(FFlareFactorySave* Data) { TSharedRef<FJsonObject> JsonObject = MakeShareable(new FJsonObject()); JsonObject->SetBoolField("Active", Data->Active); JsonObject->SetStringField("CostReserved", FormatInt32(Data->CostReserved)); JsonObject->SetStringField("ProductedDuration", FormatInt64(Data->ProductedDuration)); JsonObject->SetBoolField("InfiniteCycle", Data->InfiniteCycle); JsonObject->SetStringField("CycleCount", FormatInt32(Data->CycleCount)); JsonObject->SetStringField("TargetShipClass", Data->TargetShipClass.ToString()); JsonObject->SetStringField("TargetShipCompany", Data->TargetShipCompany.ToString()); JsonObject->SetStringField("OrderShipClass", Data->OrderShipClass.ToString()); JsonObject->SetStringField("OrderShipCompany", Data->OrderShipCompany.ToString()); JsonObject->SetStringField("OrderShipAdvancePayment", FormatInt32(Data->OrderShipAdvancePayment)); TArray< TSharedPtr<FJsonValue> > ResourceReserved; for(int i = 0; i < Data->ResourceReserved.Num(); i++) { ResourceReserved.Add(MakeShareable(new FJsonValueObject(SaveCargo(&Data->ResourceReserved[i])))); } JsonObject->SetArrayField("ResourceReserved", ResourceReserved); TArray< TSharedPtr<FJsonValue> > OutputCargoLimit; for(int i = 0; i < Data->OutputCargoLimit.Num(); i++) { OutputCargoLimit.Add(MakeShareable(new FJsonValueObject(SaveCargo(&Data->OutputCargoLimit[i])))); } JsonObject->SetArrayField("OutputCargoLimit", OutputCargoLimit); return JsonObject; }
TSharedRef<FJsonObject> UFlareSaveWriter::SaveWorld(FFlareWorldSave* Data) { TSharedRef<FJsonObject> JsonObject = MakeShareable(new FJsonObject()); JsonObject->SetStringField("Date", FormatInt64(Data->Date)); TArray< TSharedPtr<FJsonValue> > Companies; for(int i = 0; i < Data->CompanyData.Num(); i++) { Companies.Add(MakeShareable(new FJsonValueObject(SaveCompany(&Data->CompanyData[i])))); } JsonObject->SetArrayField("Companies", Companies); TArray< TSharedPtr<FJsonValue> > Sectors; for(int i = 0; i < Data->SectorData.Num(); i++) { Sectors.Add(MakeShareable(new FJsonValueObject(SaveSector(&Data->SectorData[i])))); } JsonObject->SetArrayField("Sectors", Sectors); TArray< TSharedPtr<FJsonValue> > Travels; for(int i = 0; i < Data->TravelData.Num(); i++) { Travels.Add(MakeShareable(new FJsonValueObject(SaveTravel(&Data->TravelData[i])))); } JsonObject->SetArrayField("Travels", Travels); return JsonObject; }
TSharedRef<FJsonObject> UFlareSaveWriter::SaveTravel(FFlareTravelSave* Data) { TSharedRef<FJsonObject> JsonObject = MakeShareable(new FJsonObject()); JsonObject->SetStringField("FleetIdentifier", Data->FleetIdentifier.ToString()); JsonObject->SetStringField("OriginSectorIdentifier", Data->OriginSectorIdentifier.ToString()); JsonObject->SetStringField("DestinationSectorIdentifier", Data->DestinationSectorIdentifier.ToString()); JsonObject->SetStringField("DepartureDate", FormatInt64(Data->DepartureDate)); JsonObject->SetObjectField("SectorData", SaveSector(&Data->SectorData)); return JsonObject; }
TSharedRef<FJsonObject> UFlareSaveWriter::SaveSector(FFlareSectorSave* Data) { TSharedRef<FJsonObject> JsonObject = MakeShareable(new FJsonObject()); JsonObject->SetStringField("GivenName", Data->GivenName.ToString()); JsonObject->SetStringField("Identifier", Data->Identifier.ToString()); JsonObject->SetStringField("LocalTime", FormatInt64(Data->LocalTime)); JsonObject->SetObjectField("People", SavePeople(&Data->PeopleData)); TArray< TSharedPtr<FJsonValue> > Bombs; for(int i = 0; i < Data->BombData.Num(); i++) { Bombs.Add(MakeShareable(new FJsonValueObject(SaveBomb(&Data->BombData[i])))); } JsonObject->SetArrayField("Bombs", Bombs); TArray< TSharedPtr<FJsonValue> > Asteroids; for(int i = 0; i < Data->AsteroidData.Num(); i++) { Asteroids.Add(MakeShareable(new FJsonValueObject(SaveAsteroid(&Data->AsteroidData[i])))); } JsonObject->SetArrayField("Asteroids", Asteroids); TArray< TSharedPtr<FJsonValue> > FleetIdentifiers; for(int i = 0; i < Data->FleetIdentifiers.Num(); i++) { FleetIdentifiers.Add(MakeShareable(new FJsonValueString(Data->FleetIdentifiers[i].ToString()))); } JsonObject->SetArrayField("FleetIdentifiers", FleetIdentifiers); TArray< TSharedPtr<FJsonValue> > SpacecraftIdentifiers; for(int i = 0; i < Data->SpacecraftIdentifiers.Num(); i++) { SpacecraftIdentifiers.Add(MakeShareable(new FJsonValueString(Data->SpacecraftIdentifiers[i].ToString()))); } JsonObject->SetArrayField("SpacecraftIdentifiers", SpacecraftIdentifiers); TArray< TSharedPtr<FJsonValue> > ResourcePrices; for(int i = 0; i < Data->ResourcePrices.Num(); i++) { ResourcePrices.Add(MakeShareable(new FJsonValueObject(SaveResourcePrice(&Data->ResourcePrices[i])))); } JsonObject->SetArrayField("ResourcePrices", ResourcePrices); JsonObject->SetBoolField("IsTravelSector", Data->IsTravelSector); return JsonObject; }
static Bool check_signed_number_format_test(long int number) { char string[21]; char expected[21]; sprintf(expected, "%ld", number); FormatInt64(number, string); if(strncmp(string, expected, 21) != 0) { fprintf(stderr, "Failed to convert %jd to decimal string (expected %s but got %s)\n", (intmax_t) number, expected, string); return FALSE; } return TRUE; }
TSharedRef<FJsonObject> UFlareSaveWriter::SaveCompany(FFlareCompanySave* Data) { TSharedRef<FJsonObject> JsonObject = MakeShareable(new FJsonObject()); JsonObject->SetStringField("Identifier", Data->Identifier.ToString()); JsonObject->SetStringField("CatalogIdentifier", FormatInt32(Data->CatalogIdentifier)); JsonObject->SetStringField("Money", FormatInt64(Data->Money)); JsonObject->SetStringField("CompanyValue", FormatInt64(Data->CompanyValue)); JsonObject->SetStringField("FleetImmatriculationIndex", FormatInt32(Data->FleetImmatriculationIndex)); JsonObject->SetStringField("TradeRouteImmatriculationIndex", FormatInt32(Data->TradeRouteImmatriculationIndex)); JsonObject->SetObjectField("AI", SaveCompanyAI(&Data->AI)); TArray< TSharedPtr<FJsonValue> > HostileCompanies; for(int i = 0; i < Data->HostileCompanies.Num(); i++) { HostileCompanies.Add(MakeShareable(new FJsonValueString(Data->HostileCompanies[i].ToString()))); } JsonObject->SetArrayField("HostileCompanies", HostileCompanies); TArray< TSharedPtr<FJsonValue> > Ships; for(int i = 0; i < Data->ShipData.Num(); i++) { Ships.Add(MakeShareable(new FJsonValueObject(SaveSpacecraft(&Data->ShipData[i])))); } JsonObject->SetArrayField("Ships", Ships); TArray< TSharedPtr<FJsonValue> > Stations; for(int i = 0; i < Data->StationData.Num(); i++) { Stations.Add(MakeShareable(new FJsonValueObject(SaveSpacecraft(&Data->StationData[i])))); } JsonObject->SetArrayField("Stations", Stations); TArray< TSharedPtr<FJsonValue> > Fleets; for(int i = 0; i < Data->Fleets.Num(); i++) { Fleets.Add(MakeShareable(new FJsonValueObject(SaveFleet(&Data->Fleets[i])))); } JsonObject->SetArrayField("Fleets", Fleets); TArray< TSharedPtr<FJsonValue> > TradeRoutes; for(int i = 0; i < Data->TradeRoutes.Num(); i++) { TradeRoutes.Add(MakeShareable(new FJsonValueObject(SaveTradeRoute(&Data->TradeRoutes[i])))); } JsonObject->SetArrayField("TradeRoutes", TradeRoutes); TArray< TSharedPtr<FJsonValue> > SectorsKnowledge; for(int i = 0; i < Data->SectorsKnowledge.Num(); i++) { SectorsKnowledge.Add(MakeShareable(new FJsonValueObject(SaveSectorKnowledge(&Data->SectorsKnowledge[i])))); } JsonObject->SetArrayField("SectorsKnowledge", SectorsKnowledge); TArray< TSharedPtr<FJsonValue> > CompaniesReputation; for(int i = 0; i < Data->CompaniesReputation.Num(); i++) { CompaniesReputation.Add(MakeShareable(new FJsonValueObject(SaveCompanyReputation(&Data->CompaniesReputation[i])))); } JsonObject->SetArrayField("CompaniesReputation", CompaniesReputation); return JsonObject; }
static int UppValueSimplify(VarItem &varItem, int step) { enum { SMALL = 0, MEDIUM = 31 }; // SMALL has to be 0 because of GetSpecial and because is it ending zero enum { KIND = 14, SLEN = 15, LLEN = 2, SPECIAL = 13 }; enum { STRING = 0, REF = 255, VOIDV = 3 }; // get the embedded 'data' string 'chr' member // it contains info about value type union { char chr[16]; char *ptr; dword *wptr; qword *qptr; word v[8]; dword w[4]; qword q[2]; int iData; int64 i64Data; double dData; bool bData; struct { byte day; byte month; int16 year; byte hour; byte minute; byte second; }; } u; // see Upp::String code for how it works.... MIValue val = varItem.EvaluateExpression("(" + varItem.evaluableExpression + ").data.chr"); if(!val.IsString()) return 0; String chrs = val.ToString(); memcpy(u.chr, ~chrs, 16); // get value type, among the fixed ones // we could try later to decode registered types.... dword type; bool isSpecial = !u.v[7] && u.v[6]; if(!isSpecial) type = STRING_V; else { byte st = u.chr[SPECIAL]; if(st == REF) { // ptr()->GetType() // by now, just mark as ref... type = REF; } else if(st == VOIDV) type = VOID_V; else type = st; } // by now, treat all types beyond VALUEMAP_V as unknown if(type > VALUEMAP_V) type = UNKNOWN_V; // now, based on type, we can decode it varItem.kind = VarItem::SIMPLE; switch(type) { case VOID_V: { varItem.value = "<VOID>"; return 0; } case INT_V: { varItem.value = FormatInt(u.iData); return 0; } case DOUBLE_V: { varItem.value = FormatDouble(u.dData); return 0; } case STRING_V: { // we simply replace the VarItem with the string VarItem vItem(&varItem.Debugger(), "(" + varItem.evaluableExpression + ").data"); vItem.evaluableExpression = varItem.evaluableExpression; vItem.shortExpression = varItem.shortExpression; varItem = vItem; return 0; } case DATE_V: { varItem.value = Format("Upp::Date = %02d/%02d/%04d", u.day, u.month, u.year); return 0; } case TIME_V: { varItem.value = Format("Upp::Time = %02d/%02d/%04d - %02d:%02d:%02d", u.day, u.month, u.year, u.hour, u.minute, u.second); return 0; } break; case ERROR_V: { varItem.value = "<ERROR_V>"; return 0; } case VALUE_V: { varItem.value = "<VALUE_V>"; return 0; } case WSTRING_V: { varItem.value = "<WSTRING_V>"; return 0; } case VALUEARRAY_V: { varItem.value = "<VALUEARRAY_V>"; return 0; } case INT64_V: { varItem.value = FormatInt64(u.i64Data); return 0; } case BOOL_V: { varItem.value = (u.bData ? "TRUE" : "FALSE"); return 0; } case VALUEMAP_V: { varItem.value = "<VALUEMAP_V>"; return 0; } case UNKNOWN_V: default: { varItem.value = "<UNKNOWN_V>"; return 0; } } }