アーキテクチャとモジュール構成
Cyber Engine Tweaks (CET) は、ゲームエンジンへの深い介入を可能にするモジュール型アーキテクチャを採用しています。主要なソースコードは以下のディレクトリ構造で管理されており、各コンポーネントが疎結合に設計されています。
src/scripting: Luaランタイムとネイティブバインディングsrc/overlay: ImGuiベースの描画オーバーレイとウィジェットsrc/patches: メモリパターン検索と実行時パッチ適用src/reverse: 逆アセンブリ支援ユーティリティと型定義
ビルドシステムにはxmakeが採用されており、依存関係の解決とクロスコンパイルが自動化されています。
-- xmake.lua におけるビルドターゲット定義
target("CET_Core")
set_kind("shared")
add_files("src/core/**.cpp")
add_includedirs("src/core", "vendor/include")
add_deps("sol2", "lua54", "imgui_docking")
Luaランタイムとサンドボックス環境
ゲーム内でのスクリプト実行を安全に行うため、カスタマイズされたLua 5.4環境が構築されています。ホストプロセスの安定性を損なわないよう、厳格なサンドボックス制約が適用されます。
bool ScriptEngine::Boot()
{
m_state = luaL_newstate();
luaL_openlibs(m_state);
// ネイティブAPIとオーバーレイAPIのバインド
BindNativeAPI();
BindOverlayAPI();
BindDatabaseAPI();
// サンドボックス制約の適用
ApplySandboxRestrictions();
return m_state != nullptr;
}
関数フッキングとメモリパッチ
ゲームのネイティブ関数をインターセプトするため、インラインフッキングが実装されています。また、特定のアセンブリ命令を書き換えることでゲームの挙動を直接的に変更します。
void InterceptorManager::Attach()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
// レンダリングパイプラインと更新ループへのフック
DetourAttach(&(PVOID&)m_pfnOriginalRender, HookedPresent);
DetourAttach(&(PVOID&)m_pfnOriginalTick, HookedUpdate);
DetourTransactionCommit();
}
マップの境界制限を解除するパッチの適用例を以下に示します。メモリ上の条件分岐命令をNOPスレッドで埋めることで、チェックを無効化しています。
void RemoveMapLimits::Execute()
{
auto pAddr = Memory::Scan("48 8B 05 ? ? ? ? 48 85 C0 74 0A");
if (pAddr)
{
// 境界チェックの条件ジャンプをNOPで overwrite
Memory::Patch(pAddr + 0x12, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
}
}
TweakDBとの連携とUIオーバーレイ
ゲームのデータテーブルであるTweakDBへのアクセスは、Luaレイヤーから透過的に行えるようにラップされています。これにより、アイテムのステータスやNPCのパラメータを動的に改変可能です。
local db = GetDatabase()
local itemRecord = db:GetRecord("Items.Preset_Mantis_Blades")
if itemRecord then
local stats = itemRecord:GetStats()
-- ダメージと攻撃速度の倍率を変更
stats:SetValue("Damage", stats:GetValue("Damage") * 2.5)
stats:SetValue("AttackSpeed", stats:GetValue("AttackSpeed") * 1.2)
db:CommitRecord(itemRecord)
end
デバッグ用のUIオーバーレイはImGuiのドッキングブランチを利用して構築されており、コンソール、設定パネル、ログビューアなどのウィジェットが src/overlay/widgets/ に配置されています。
ビルドと環境構築
開発環境のセットアップとコンパイルは以下の手順で実行します。
git clone --recursive https://github.com/example/CyberEngineTweaks.git
cd CyberEngineTweaks
xmake f -p windows -a x64 -m release
xmake build CET_Core
ビルドされたDLLは、ASIローダー経由でゲームプロセスに注入されます。ロード時には version.dll などのプロキシDLLとして配置し、global.ini でロードパスを指定します。
イベント駆動と非同期処理
Luaスクリプトにおけるイベントハンドラは、ゲームの更新ループや状態遷移にフックする形で登録されます。
RegisterHook("GameUpdate", function(dt)
if Input:IsDown("F3") then
Player:TeleportToMarker()
end
end)
RegisterHook("SessionStarted", function()
Log:Info("Session initialized. Loading modules...")
UI:BuildCustomMenus()
end)
重いリソースの読み込みは、コルーチンスケジューラを用いた非同期タスクとして実装し、メインスレッドのブロックを防ぎます。
function FetchAssetAsync(uri, onComplete)
CoroutineScheduler:Spawn(function()
local asset = AssetManager:Load(uri)
if asset then
MainThread:Queue(function()
onComplete(asset)
end)
end
end)
end
FetchAssetAsync("ui/textures/hud_overlay.png", function(tex)
WidgetFactory:CreateImage(tex)
end)
メモリ管理とレンダリングパイプラインの最適化
C++レイヤーでのメモリリーク検出とDirectX 12のパフォーマンスチューニングは、フレームワークの安定性に直結します。カスタムアロケータを用いてヒープの追跡を行います。
class HeapMonitor {
public:
static void LogAlloc(void* address, size_t bytes, const char* source, int line);
static void LogFree(void* address);
static void ReportLeaks();
};
void* operator new(size_t bytes, const char* source, int line) {
void* ptr = std::malloc(bytes);
HeapMonitor::LogAlloc(ptr, bytes, source, line);
return ptr;
}
D3D12のレンダリングパイプラインに対しては、不要なポストプロセス効果を無効化し、テクスチャストリーミングの帯域を制限することでGPU負荷を軽減します。
void RenderPipeline::Tune()
{
DisableEffect(PostProcess::TemporalAA);
DisableEffect(PostProcess::MotionBlur);
ResourceManager::SetPoolSize(4096);
Streamer::SetBandwidthLimit(2048);
}