Munition AutoPatcher VC
No description available
Install / Use
/learn @shkond/Munition AutoPatcher VCREADME
Munition AutoPatcher vC
Fallout 4武器自動パッチツール - WPF MVVM実装
概要
このツールは、Fallout 4の武器MODに対して、弾薬マッピングの設定を自動生成するためのWPFアプリケーションです。Mutagenを使用してプラグインから武器データを抽出し、弾薬とのマッピングを行い、2つの出力形式をサポートします:
- ESPパッチモード(デフォルト): ESL-flagged ESPパッチを生成し、武器レコード(WEAP)に直接弾薬マッピングを適用
- INIモード: RobCo Patcherの設定ファイル(INI)を生成
機能
- 設定画面: ゲームデータパスの設定、出力パスの設定、マッピング戦略の設定
- 武器データ抽出: Mutagenを使用したプラグインからの武器データ抽出(実装済み)
- 自動的にゲームのインストールを検出
- ロードオーダーを考慮した武器レコードの読み込み
- WinningOverridesを使用した競合解決
- 武器の名前、ダメージ、発射速度、デフォルト弾薬などを抽出
- マッピング画面: 武器と弾薬のマッピング管理、マッピング生成
- 出力生成: 2つの出力モードをサポート(実装済み)
- ESPパッチモード(デフォルト): ESL-flagged ESPパッチファイル生成
- MunitionAutoPatcher_Patch.esp として出力
- 確認済みの武器→弾薬マッピングを直接WEAPレコードに適用
- 必要なマスター参照を自動的に含める
- INIモード: RobCo Patcher用の設定ファイル生成
- タイムスタンプ付きINIファイル生成
- 手動マッピングフラグのサポート
- ディレクトリの自動作成
- ESPパッチモード(デフォルト): ESL-flagged ESPパッチファイル生成
- ログ/ステータス: リアルタイムログ表示とステータス表示
技術スタック
- .NET 8.0
- WPF (Windows Presentation Foundation)
- MVVM (Model-View-ViewModel) パターン
- Microsoft.Extensions.DependencyInjection (DI)
- Microsoft.Extensions.Hosting
- Mutagen.Bethesda.Fallout4 (0.51.5) - プラグイン読み込みとデータ抽出
プロジェクト構造
MunitionAutoPatcher/
├── Models/ # データモデル (9ファイル)
│ ├── AmmoCategory.cs
│ ├── AmmoData.cs
│ ├── ConfirmationContext.cs # 確認コンテキスト
│ ├── ExtractionContext.cs # 抽出コンテキスト
│ ├── FormKey.cs
│ ├── OmodCandidate.cs
│ ├── StrategyConfig.cs
│ ├── WeaponData.cs
│ └── WeaponMapping.cs
├── ViewModels/ # ビューモデル
│ ├── AmmoViewModel.cs
│ ├── MainViewModel.cs
│ ├── MapperViewModel.cs
│ ├── SettingsViewModel.cs
│ ├── ViewModelBase.cs
│ └── WeaponMappingViewModel.cs
├── Views/ # ビュー (XAML + Code-behind)
│ ├── InputDialog.xaml
│ ├── MainWindow.xaml
│ ├── MapperView.xaml
│ └── SettingsView.xaml
├── Services/ # サービス層
│ ├── Helpers/ # レガシーヘルパー (※段階的廃止予定)
│ │ ├── CandidateEnumerator.cs
│ │ ├── DiagnosticWriter.cs # static版 (Implementations版へ移行推奨)
│ │ └── ReverseMapBuilder.cs
│ ├── Interfaces/ # サービスインターフェース (17ファイル)
│ │ ├── IAmmunitionChangeDetector.cs
│ │ ├── ICandidateConfirmer.cs # 候補確認戦略
│ │ ├── ICandidateProvider.cs # 候補提供戦略
│ │ ├── IConfigService.cs
│ │ ├── IDiagnosticWriter.cs # 診断出力サービス
│ │ ├── IEspPatchService.cs # ESPパッチ生成
│ │ ├── ILinkResolver.cs # リンク解決
│ │ ├── ILoadOrderService.cs
│ │ ├── IMutagenAccessor.cs # Mutagen境界API
│ │ ├── IOmodPropertyAdapter.cs # OMODプロパティアダプタ
│ │ ├── IOrchestrator.cs
│ │ ├── IPathService.cs # パス解決サービス
│ │ ├── IRobCoIniGenerator.cs
│ │ ├── ITypedAmmunitionChangeDetector.cs
│ │ ├── IWeaponDataExtractor.cs # 武器データ抽出
│ │ ├── IWeaponOmodExtractor.cs
│ │ └── IWeaponsService.cs
│ └── Implementations/ # サービス実装 (30ファイル)
│ ├── AttachPointConfirmer.cs # アタッチポイント確認
│ ├── CobjCandidateProvider.cs # COBJ候補提供
│ ├── ConfigService.cs
│ ├── DiagnosticWriter.cs # DI対応版診断出力
│ ├── EspPatchService.cs # ESPパッチ生成実装
│ ├── FormKeyNormalizer.cs # FormKey正規化
│ ├── IMutagenEnvironment.cs
│ ├── IMutagenEnvironmentFactory.cs
│ ├── IResourcedMutagenEnvironment.cs
│ ├── LinkCacheHelper.cs
│ ├── LinkResolver.cs # リンク解決実装
│ ├── LoadOrderService.cs
│ ├── MutagenAccessor.cs # Mutagen境界API実装
│ ├── MutagenEnvironmentFactory.cs
│ ├── MutagenV51Detector.cs
│ ├── MutagenV51EnvironmentAdapter.cs
│ ├── MutagenV51OmodPropertyAdapter.cs
│ ├── NoOpMutagenEnvironment.cs
│ ├── OmodResolutionDiagnostics.cs
│ ├── OrchestratorService.cs
│ ├── PathService.cs # パス解決実装
│ ├── ReflectionFallbackDetector.cs
│ ├── ResourcedMutagenEnvironment.cs
│ ├── ReverseMapBuilder.cs
│ ├── ReverseMapConfirmer.cs # 逆参照確認
│ ├── ReverseReferenceCandidateProvider.cs # 逆参照候補提供
│ ├── RobCoIniGenerator.cs
│ ├── WeaponDataExtractor.cs # 武器データ抽出実装
│ ├── WeaponOmodExtractor.cs # オーケストレータ
│ └── WeaponsService.cs
├── Commands/ # コマンドハンドラ
│ ├── AsyncRelayCommand.cs
│ └── RelayCommand.cs
├── Converters/ # 値変換
│ ├── BoolToVisibilityConverter.cs
│ └── InverseBoolConverter.cs
├── Utilities/ # ユーティリティ
│ └── RepoUtils.cs
├── App.xaml.cs # アプリケーションエントリポイント + DI設定
├── AppLogger.cs # ロギング
└── DebugConsole.cs # デバッグコンソール
tests/ # テストプロジェクト (4プロジェクト)
├── ConfirmerTests/ # 確認ロジックテスト
├── IntegrationTests/ # E2E統合テスト
├── LinkCacheHelperTests/ # LinkCacheヘルパーテスト
└── WeaponDataExtractorTests/ # 武器データ抽出テスト
ビルド方法
前提条件
- .NET 8.0 SDK以降
- Windows 10/11
- Visual Studio 2022 または Visual Studio Code(推奨)
ビルドコマンド
# ソリューションディレクトリで
dotnet restore
dotnet build
実行方法
# ソリューションディレクトリで
dotnet run --project MunitionAutoPatcher/MunitionAutoPatcher.csproj
または Visual Studio で F5 キーを押して実行します。
CI / Continuous Integration
このリポジトリを CI パイプライン(例: GitHub Actions)で扱う際の推奨コマンドと注意点を示します。
- 推奨コマンド(ビルド / テスト / 公開):
# 依存復元
dotnet restore
# ソリューションを Release ビルド
dotnet build MunitionAutoPatcher.sln -c Release
# テスト(全テストプロジェクトを実行)
dotnet test -c Release --no-build --verbosity normal
# または個別のテストプロジェクトを実行する場合
dotnet test tests/IntegrationTests/IntegrationTests.csproj -c Release --verbosity normal
dotnet test tests/LinkCacheHelperTests/LinkCacheHelperTests.csproj -c Release --verbosity normal
dotnet test tests/WeaponDataExtractorTests/WeaponDataExtractorTests.csproj -c Release --verbosity normal
# 形式整形(任意)
dotnet format
# 発行(パッケージ化が必要な場合)
dotnet publish MunitionAutoPatcher/MunitionAutoPatcher.csproj -c Release -r win-x64 --self-contained false
注意: 本プロジェクトは WPF (.NET on Windows) を使っているため、GUI に依存するテストや実行は Linux ランナー上で失敗する可能性があります。フルテストを CI 上で実行する場合は runs-on: windows-latest を使うことを推奨します。
簡単な GitHub Actions の例:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Restore
run: dotnet restore
- name: Build
run: dotnet build MunitionAutoPatcher.sln -c Release --no-restore
- name: Test
run: dotnet test -c Release --no-build --verbosity normal
ポイント:
- WPF やプラットフォーム固有ライブラリ(Mutagen 等)を使うため、Windows ランナーでのテスト実行が最も互換性が高いです。
- ヘッドレス環境で GUI に依存するテストを実行する必要がある場合は、該当テストをカテゴリーやタグで分離し、CI ではスキップするか専用ジョブを用意してください。
使用方法
-
設定画面:
- ゲームデータパス(Fallout4の Data フォルダ)を設定
- 出力パスを設定(オプション)
- マッピング戦略を選択
- 「武器データ抽出を開始」ボタンをクリック
-
マッピング画面:
- メニューから「マッピング」を選択
- 「マッピング生成」ボタンをクリックして武器と弾薬のマッピングを生成
- マッピングテーブルで確認・編集
- 「INI生成」ボタンをクリックして設定ファイルを生成(INIモードの場合)
-
出力モードの設定:
出力モードは設定ファイル
config/config.jsonで制御されます:{ "output": { "mode": "esp", "directory": "artifacts" } }-
output.mode: 出力形式を指定"esp"(デフォルト): ESL-flagged ESPパッチを生成"ini": RobCo Patcher INIファイルを生成
-
output.directory: 出力先ディレクトリ- デフォルト:
"artifacts"(リポジトリルート相対) - 絶対パスまたは相対パスを指定可能
- デフォルト:
確認:
output.modeが"esp"に設定されていること、output.directoryが実行ユーザーから書き込み可能なディレクトリ(絶対パスまたはリポジトリルート相対)に設定されていることを確認してください。例:"output": { "mode": "esp", "directory": "artifacts" }。ESPモード(デフォルト)の動作:
- 確認済みの武器→弾薬マッピングから
MunitionAutoPatcher_Patch.espを生成 - パッチは ESL-flagged(ESPFE)として出力され、ロードオーダーの負荷を最小化
- 参照される全てのFormKey(武器と弾薬)のマスター参照を自動的に含める
- デフォルト出力先:
artifacts/MunitionAutoPatcher_Patch.esp
INIモードへの切り替え:
config/config.jsonで"mode": "ini"に設定- 従来のRobCo Patcher INI出力を使用する場合に選択
-
-
ログ確認 / 統合ログ出力:
- UIログ: 画面下部のログパネルで処理状況を確認できます(
AppLoggerのイベント購読により表示)。 - ファイル出力: すべての UI ログは非同期で
artifacts/munition_autopatcher_ui.logに追記されます(起動時に新規ヘッダで上書きして開始します)。 - ILogger → AppLogger の転送: アプリは
ILogger出力をAppLoggerに転送するAppLoggerProviderをホストに登録しています。これにより、ILogger<T>を使って出力されたDebug/Information/Error等のメッセージは UI パネルとartifacts/munition_autopatcher_ui.logに統合されます。 - デバッグ/コンソール: Debug ビルド時は
DebugConsoleによりコンソールが割り当てられ、コンソールにもログが表示されます。LogDebugレベルのメッセージを常に確認したい場合はホストのロギング設定で最小ログレベルをDebugにしてください。 - ログの確認 (PowerShell):
- リアルタイム追跡:
Get-Content -Path .\artifacts\munition_autopatcher_ui.log -Wait -Tail 200 - TEMP の per-run ログを探す:
Get-ChildItem $env:TEMP -Filter "munition_autopatcher_ui_*.log" | Select-Object -Last 5
- リアルタイム追跡:
- UIログ: 画面下部のログパネルで処理状況を確認できます(
今後の実装予定 (TODOs)
次のPRで実装予定の機能(状態更新)
以下はコードベースの現状に合わせて状態を更新しています。
-
[ ] PR #23 — Configure repository for GitHub Copilot Coding Agent
- 概要: リポジトリの Copilot 用ドキュメント・テンプレート・CI ワークフローを追加(
.github/copilot-instructions.md, CI workflow, issue/PR テンプレート、CONTRIBUTING.md等)。 - アクション:
- 変更ファイルをレビュー(
.github/以下、CONTRIBUTING.md,CODE_OF_CONDUCT.md,SECURITY.md,CHANGELOG.md,config/等) - Windows 環境でビルド & テストを実行して CI 設定を検証(WPF のため Windows ランナー推奨)
- マージ後に
DECISIONS.mdに要約を追加してオンボーディング手順を明確化
- 変更ファイルをレビュー(
- 推奨担当: @shkond
- リンク: https://github.com/shkond/Munition_AutoPatcher_vC/pull/23
- 概要: リポジトリの Copilot 用ドキュメント・テンプレート・CI ワークフローを追加(
-
[x] Mutagen統合: 実際のプラグイン読み込みと武器データ抽出 ✓ (実装済み:
WeaponsServiceが Mutagen のGameEnvironmentを使用しています) -
[x] INI生成の実装: 実際のRobCo Patcher INIファイル生成 ✓ (実装済み:
RobCoIniGenerator) -
[x] ロードオーダー検証: 実際のプラグインロードオーダーの読み込みと検証 ✓
-
[x] 弾薬データ抽出: プラグインからの弾薬データ抽出 ✓ (部分実装/実用的:
WeaponsServiceが_ammoを構築しGetAllAmmo()で利用可能) -
[~] 自動マッピングロジック: 名前ベース、タイプベースの自動マッピング (部分実装 — UI 側に簡易ロジックと Orchestrator のスタブが存在。高度なルールは要改善)
-
[~] マニュアルマッピング編集: UIでの手動マッピング編集機能 (実装済みの UI があるが UX/機能強化の余地あり)
-
[x] 設定の永続化: アプリケーション設定のJSON保存/読み込み ✓ (実装済み:
ConfigServiceが設定の読み書きを行います
Related Skills
node-connect
347.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
