MCPcopy Create free account
hub / github.com/OpenLoco/OpenLoco / loadTemporaryObject

Function loadTemporaryObject

src/OpenLoco/src/Objects/ObjectManager.cpp:487–536  ·  view source on GitHub ↗

0x0047176D TODO: Return a std::unique_ptr and a ObjectHeader3 & ObjectHeader2 for the metadata

Source from the content-addressed store, hash-verified

485 // 0x0047176D
486 // TODO: Return a std::unique_ptr and a ObjectHeader3 & ObjectHeader2 for the metadata
487 std::optional<TempLoadMetaData> loadTemporaryObject(const ObjectHeader& header)
488 {
489 auto preLoadObj = findAndPreLoadObject(header);
490 if (!preLoadObj.has_value())
491 {
492 return std::nullopt;
493 }
494
495 const uint32_t oldNumImages = getTotalNumImages();
496 setTotalNumImages(Gfx::G1ExpectedCount::kDisc);
497
498 _temporaryObject = preLoadObj->object;
499 _isTemporaryObject = true;
500
501 DependentObjects dependencies;
502 try
503 {
504 callObjectLoad({ preLoadObj->header.getType(), 0 }, *preLoadObj->object, preLoadObj->objectData, &dependencies);
505 }
506 catch (Exception::OutOfRange&) // catches the ImageTable incorrectly sized which can cause bad crashes
507 {
508 freeTemporaryObject();
509 _isTemporaryObject = false;
510 return std::nullopt;
511 }
512 _isTemporaryObject = false;
513
514 const auto numImages = getTotalNumImages() - Gfx::G1ExpectedCount::kDisc;
515 setTotalNumImages(oldNumImages);
516
517 TempLoadMetaData result{};
518 result.fileSizeHeader.decodedFileSize = static_cast<uint32_t>(preLoadObj->objectData.size());
519 result.displayData.numImages = numImages;
520 result.dependentObjects = dependencies;
521
522 if (header.getType() == ObjectType::competitor)
523 {
524 auto* competitor = reinterpret_cast<CompetitorObject*>(preLoadObj->object);
525 result.displayData.aggressiveness = competitor->aggressiveness;
526 result.displayData.competitiveness = competitor->competitiveness;
527 result.displayData.intelligence = competitor->intelligence;
528 }
529 else if (header.getType() == ObjectType::vehicle)
530 {
531 auto* vehicle = reinterpret_cast<VehicleObject*>(preLoadObj->object);
532 result.displayData.vehicleSubType = enumValue(vehicle->type);
533 }
534
535 return result;
536 }
537
538 Object* getTemporaryObject()
539 {

Callers 10

internalOpenFunction · 0.85
tryCloseWindowFunction · 0.85
switchPrimaryTabFunction · 0.85
onScrollMouseOverFunction · 0.85
loadPreferredFaceFunction · 0.85
scrollMouseOverFunction · 0.85
loadScenarioDetailsFunction · 0.85
loadScenarioProgressFunction · 0.85
addObjectToIndexFunction · 0.85
validateObjectSelectionFunction · 0.85

Calls 8

findAndPreLoadObjectFunction · 0.85
getTotalNumImagesFunction · 0.85
setTotalNumImagesFunction · 0.85
callObjectLoadFunction · 0.85
freeTemporaryObjectFunction · 0.85
enumValueFunction · 0.85
getTypeMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected