1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Merge pull request #12999 from Gymnasiast/feature/sea-files-in-scenario-list

Add .sea support to New Scenario list and extension handling
This commit is contained in:
Michael Steenbeek
2020-09-28 22:09:35 +02:00
committed by GitHub
6 changed files with 31 additions and 7 deletions

View File

@@ -1,7 +1,8 @@
0.3.1+ (in development)
------------------------------------------------------------------------
- Feature: [#13000] objective_options command for console
- Fix: [#3200] Close Construction window upon selecting vehicle page
- Feature: [#12999] .sea (RCT Classic) scenarios are now listed in the “New Scenario” dialog.
- Feature: [#13000] objective_options command for console.
- Fix: [#3200] Close Construction window upon selecting vehicle page.
- Improved: [#13023] Made add_news_item console command last argument, assoc, optional.
0.3.1 (2020-09-27)

View File

@@ -49,6 +49,7 @@
<comment xml:lang="zh-TW">OpenRCT2 劇情檔案</comment>
<glob weight="60" pattern="*.sc6"/>
<glob weight="60" pattern="*.sc4"/>
<glob weight="60" pattern="*.sea"/>
</mime-type>
</mime-info>

View File

@@ -175,6 +175,8 @@ uint32_t get_file_extension_type(const utf8* path)
return FILE_EXTENSION_TD4;
if (String::Equals(extension, ".sc6", true))
return FILE_EXTENSION_SC6;
if (String::Equals(extension, ".sea", true))
return FILE_EXTENSION_SC6;
if (String::Equals(extension, ".sv6", true))
return FILE_EXTENSION_SV6;
if (String::Equals(extension, ".sv7", true))

View File

@@ -42,6 +42,7 @@ namespace ParkImporter
bool ExtensionIsScenario(const std::string& extension)
{
return String::Equals(extension, ".sc4", true) || String::Equals(extension, ".sc6", true);
return String::Equals(extension, ".sc4", true) || String::Equals(extension, ".sc6", true)
|| String::Equals(extension, ".sea", true);
}
} // namespace ParkImporter

View File

@@ -363,6 +363,7 @@ namespace Platform
SetUpFileAssociation(".sv4", "RCT1 Saved Game (.sc4)", "Play", "\"%1\"", 0);
SetUpFileAssociation(".sv6", "RCT2 Saved Game (.sv6)", "Play", "\"%1\"", 0);
SetUpFileAssociation(".sv7", "RCT Modified Saved Game (.sv7)", "Play", "\"%1\"", 0);
SetUpFileAssociation(".sea", "RCTC Saved Game (.sea)", "Play", "\"%1\"", 0);
SetUpFileAssociation(".td4", "RCT1 Track Design (.td4)", "Install", "\"%1\"", 0);
SetUpFileAssociation(".td6", "RCT2 Track Design (.td6)", "Install", "\"%1\"", 0);
@@ -507,6 +508,7 @@ namespace Platform
RemoveFileAssociation(".sv4");
RemoveFileAssociation(".sv6");
RemoveFileAssociation(".sv7");
RemoveFileAssociation(".sea");
RemoveFileAssociation(".td4");
RemoveFileAssociation(".td6");

View File

@@ -18,6 +18,7 @@
#include "../core/File.h"
#include "../core/FileIndex.hpp"
#include "../core/FileStream.hpp"
#include "../core/MemoryStream.h"
#include "../core/Path.hpp"
#include "../core/String.hpp"
#include "../localisation/Language.h"
@@ -128,7 +129,7 @@ class ScenarioFileIndex final : public FileIndex<scenario_index_entry>
private:
static constexpr uint32_t MAGIC_NUMBER = 0x58444953; // SIDX
static constexpr uint16_t VERSION = 3;
static constexpr auto PATTERN = "*.sc4;*.sc6";
static constexpr auto PATTERN = "*.sc4;*.sc6;*.sea";
public:
explicit ScenarioFileIndex(const IPlatformEnvironment& env)
@@ -203,6 +204,22 @@ protected:
}
private:
static std::unique_ptr<IStream> GetStreamFromRCT2Scenario(const std::string& path)
{
if (String::Equals(Path::GetExtension(path), ".sea", true))
{
auto data = DecryptSea(fs::u8path(path));
auto ms = std::make_unique<MemoryStream>();
// Need to copy the data into MemoryStream as the overload will borrow instead of copy.
ms->Write(data.data(), data.size());
ms->SetPosition(0);
return ms;
}
auto fs = std::make_unique<FileStream>(path, FILE_MODE_OPEN);
return fs;
}
/**
* Reads basic information from a scenario file.
*/
@@ -234,9 +251,9 @@ private:
}
else
{
// RCT2 scenario
auto fs = FileStream(path, FILE_MODE_OPEN);
auto chunkReader = SawyerChunkReader(&fs);
// RCT2 or RCTC scenario
auto stream = GetStreamFromRCT2Scenario(path);
auto chunkReader = SawyerChunkReader(stream.get());
rct_s6_header header = chunkReader.ReadChunkAs<rct_s6_header>();
if (header.type == S6_TYPE_SCENARIO)