0x0047176D TODO: Return a std::unique_ptr and a ObjectHeader3 & ObjectHeader2 for the metadata
| 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 | { |
no test coverage detected