-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathLevelVersion.cpp
48 lines (45 loc) · 1.78 KB
/
LevelVersion.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "LevelVersion.h"
#include <trview.common/Algorithms.h>
namespace trlevel
{
// Converts the level version number into a level version enumeration.
// This will never return tomb5 as more information is required in order to
// make that determination.
// version: The version to convert.
// Returns: The level version.
PlatformAndVersion convert_level_version(uint32_t version)
{
if (version == 0x34585254)
{
return { .platform = Platform::PC, .version = LevelVersion::Tomb4, .remastered = true };
}
else if (version == 0x35585254)
{
return { .platform = Platform::PC, .version = LevelVersion::Tomb5, .remastered = true };
}
switch (version & 0xff)
{
case 0x20:
if (is_tr2_beta(version))
{
return { .platform = Platform::PSX, .version = LevelVersion::Tomb2 };
}
return { .platform = (version & 0xff00) ? Platform::PSX : Platform::PC, .version = LevelVersion::Tomb1 };
case 0x2D:
return { .platform = Platform::PC, .version = LevelVersion::Tomb2 };
case 0x34:
case 0x38:
return { .platform = Platform::PC, .version = LevelVersion::Tomb3 };
case 0xc8:
case 0xcb: //TR3 PSX ECTS Demos
return { .platform = Platform::PSX, .version = LevelVersion::Tomb3 };
case 0x54:
return { .platform = Platform::PC, .version = LevelVersion::Tomb4 };
}
return { .platform = Platform::Unknown, .version = LevelVersion::Unknown };
}
constexpr bool is_tr2_beta(uint32_t version)
{
return ((version & 0xff) == 0x20) && (version & 0xff0000 || trview::equals_any(version, 0xf820u, 0xd620u, 0x1220u, 0x1a20u));
}
}