mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-11-23 05:12:05 +00:00
V1 release of custom map code
This commit is contained in:
@@ -4,6 +4,8 @@
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "ScriptCompileT6.h"
|
||||
|
||||
using namespace T6;
|
||||
|
||||
namespace
|
||||
@@ -17,23 +19,40 @@ namespace
|
||||
{
|
||||
}
|
||||
|
||||
const unsigned char T6GSCMagic[8] = {0x80, 0x47, 0x53, 0x43, 0x0D, 0x0A, 0x00, 0x06 };
|
||||
|
||||
AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override
|
||||
{
|
||||
const auto file = m_search_path.Open(assetName);
|
||||
if (!file.IsOpen())
|
||||
return AssetCreationResult::NoAction();
|
||||
|
||||
auto* scriptParseTree = m_memory.Alloc<ScriptParseTree>();
|
||||
scriptParseTree->name = m_memory.Dup(assetName.c_str());
|
||||
scriptParseTree->len = static_cast<int>(file.m_length);
|
||||
|
||||
|
||||
auto* fileBuffer = m_memory.Alloc<char>(static_cast<size_t>(file.m_length + 1));
|
||||
file.m_stream->read(fileBuffer, file.m_length);
|
||||
if (file.m_stream->gcount() != file.m_length)
|
||||
if (file.m_stream->gcount() != file.m_length || file.m_length < 0x10)
|
||||
return AssetCreationResult::Failure();
|
||||
fileBuffer[scriptParseTree->len] = '\0';
|
||||
fileBuffer[file.m_length] = '\0';
|
||||
|
||||
scriptParseTree->buffer = static_cast<char16*>(fileBuffer);
|
||||
auto* scriptParseTree = m_memory.Alloc<ScriptParseTree>();
|
||||
scriptParseTree->name = m_memory.Dup(assetName.c_str());
|
||||
|
||||
if (memcmp(fileBuffer, T6GSCMagic, 8) == 0)
|
||||
{
|
||||
scriptParseTree->len = static_cast<int>(file.m_length);
|
||||
scriptParseTree->buffer = static_cast<char16*>(fileBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t compiledSize;
|
||||
char* result = compileScriptT6(assetName, fileBuffer, static_cast<size_t>(file.m_length), &compiledSize);
|
||||
if (result == NULL)
|
||||
return AssetCreationResult::Failure();
|
||||
|
||||
scriptParseTree->buffer = result;
|
||||
scriptParseTree->len = static_cast<int>(compiledSize);
|
||||
}
|
||||
|
||||
return AssetCreationResult::Success(context.AddAsset<AssetScript>(assetName, scriptParseTree));
|
||||
}
|
||||
|
||||
31
src/ObjLoading/Game/T6/Script/ScriptCompileT6.cpp
Normal file
31
src/ObjLoading/Game/T6/Script/ScriptCompileT6.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include "ScriptCompileT6.h"
|
||||
|
||||
#include <xsk/arc/engine/t6_pc.hpp>
|
||||
|
||||
|
||||
char* compileScriptT6(const std::string& gscName, char* gscCode, size_t gscCodeSize, size_t* out_CompiledSize)
|
||||
{
|
||||
try
|
||||
{
|
||||
xsk::arc::t6::pc::context context = xsk::arc::t6::pc::context(xsk::arc::instance::server);
|
||||
|
||||
std::vector<xsk::u8> scriptBuffer;
|
||||
scriptBuffer.resize(gscCodeSize);
|
||||
memcpy(&scriptBuffer[0], gscCode, gscCodeSize);
|
||||
|
||||
auto outasm = context.compiler().compile(gscName, scriptBuffer);
|
||||
auto outbin = context.assembler().assemble(*outasm);
|
||||
|
||||
char* compiledBuffer = new char[outbin.first.size];
|
||||
memcpy(compiledBuffer, outbin.first.data, outbin.first.size);
|
||||
|
||||
*out_CompiledSize = outbin.first.size;
|
||||
return compiledBuffer;
|
||||
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
printf(std::format("GSC Compile failed: {}\n", e.what()).c_str());
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
3
src/ObjLoading/Game/T6/Script/ScriptCompileT6.h
Normal file
3
src/ObjLoading/Game/T6/Script/ScriptCompileT6.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <string>
|
||||
|
||||
char* compileScriptT6(const std::string& gscName, char* gscCode, size_t gscCodeSize, size_t* out_CompiledSize);
|
||||
Reference in New Issue
Block a user