| 457 | } |
| 458 | |
| 459 | int EXEReader::FileInfo::GetEngineType(bool& is_maniac_patch) const { |
| 460 | is_maniac_patch = false; |
| 461 | |
| 462 | if (is_easyrpg_player || machine_type == MachineType::Unknown) { |
| 463 | return Player::EngineNone; |
| 464 | } |
| 465 | |
| 466 | if (version_str.empty()) { |
| 467 | // RPG2k and Rpg2k3 < 1.0.2.1 has no VERSIONINFO |
| 468 | if (logos == 3) { |
| 469 | // three logos only appear in old RPG2k |
| 470 | return Player::EngineRpg2k; |
| 471 | } else if (logos == 1) { |
| 472 | // VALUE! or Rpg2k3 < 1.0.2.1 |
| 473 | // Check CODE segment size to be sure |
| 474 | if (code_size > 0xB0000) { |
| 475 | if (code_size >= 0xC7400) { |
| 476 | // Code segment size for >= 1.0.5.0 |
| 477 | // In theory this check is unnecessary because this version has a VERSIONINFO. |
| 478 | // However the modified exe shipped with Ahriman's Prophecy is a 1.0.8.0 without a VERSIONINFO. |
| 479 | return Player::EngineRpg2k3 | Player::EngineMajorUpdated; |
| 480 | } else { |
| 481 | return Player::EngineRpg2k3; |
| 482 | } |
| 483 | } |
| 484 | |
| 485 | return Player::EngineRpg2k | Player::EngineMajorUpdated; |
| 486 | } |
| 487 | |
| 488 | return Player::EngineNone; |
| 489 | } |
| 490 | |
| 491 | std::array<decltype(version), 4> ver = { |
| 492 | (version >> 48) & 0xFF, |
| 493 | (version >> 32) & 0xFF, |
| 494 | (version >> 16) & 0xFF, |
| 495 | (version & 0xFF)}; |
| 496 | |
| 497 | if (logos == 0) { |
| 498 | // New version of Maniac Patch is version 1.1.2.1 and is an rewrite of the engine |
| 499 | // Has no logos, no CODE segment and no CHERRY segment |
| 500 | if (ver[0] == 1 && ver[1] == 1 && ver[2] == 2 && ver[3] == 1 && code_size == 0 && cherry_size == 0) { |
| 501 | is_maniac_patch = true; |
| 502 | return Player::EngineRpg2k3 | Player::EngineMajorUpdated | Player::EngineEnglish; |
| 503 | } |
| 504 | |
| 505 | return Player::EngineNone; |
| 506 | } |
| 507 | |
| 508 | // Everything else with a VERSIONINFO must have one logo |
| 509 | if (logos != 1) { |
| 510 | return Player::EngineNone; |
| 511 | } |
| 512 | |
| 513 | if (ver[0] == 1) { |
| 514 | if (ver[1] == 6) { |
| 515 | // English release of RPG Maker 2000 has a version info (thanks Cherry!) |
| 516 | return Player::EngineRpg2k | Player::EngineMajorUpdated | Player::EngineEnglish; |
no test coverage detected