サイバーパンク2077向けスクリプトフレームワーク「Cyber Engine Tweaks」のアーキテクチャと逆向工学的手法

アーキテクチャとモジュール構成

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);
}

タグ: CyberEngineTweaks Cyberpunk2077 Lua5.4 ImGui DirectX12

8月24日 22:09 投稿