Skip to content

SRCDataLinter: シナリオルート指定時に data/system を優先探索しつつシナリオ固有データも含める#785

Draft
Copilot wants to merge 3 commits intomasterfrom
copilot/fix-data-system-file-search
Draft

SRCDataLinter: シナリオルート指定時に data/system を優先探索しつつシナリオ固有データも含める#785
Copilot wants to merge 3 commits intomasterfrom
copilot/fix-data-system-file-search

Conversation

Copy link
Contributor

Copilot AI commented Feb 22, 2026

シナリオルートを引数に渡した場合、<arg>/data/system が存在しても全体再帰探索のみのため sp.txt / alias.txt 等が必ずしも読み込まれる保証がなかった。

Changes

  • data/system 優先列挙 + 全体探索: ディレクトリ引数に対し <arg>/data/system の存在を確認し、存在すればそのファイルを先頭に列挙(システムデータ優先)した上で、引数ディレクトリ全体も再帰探索してシナリオ固有データ(alias.txtunit.txt 等)を含める。SRCCore の LoadIni()(システムデータ先読み)→ LoadDataDirectory()(シナリオ固有データ)という実際のゲームの読み込み順に対応。
  • 後方互換フォールバック: data/system が存在しない場合は従来どおり <arg> 全体を再帰探索
  • 重複排除: Distinct(StringComparer.OrdinalIgnoreCase).ToList() を追加し、data/system 配下ファイルの二重処理と遅延評価の繰り返し実行を防止
  • 探索ルートのログ出力: どのパスを探索対象としたかを stdout に出力
var systemDir = Path.Combine(x, "data", "system");
if (Directory.Exists(systemDir))
{
    // data/system のファイルを先頭に、その後全体を再帰探索
    Console.WriteLine($"Using data/system directory first: [{systemDir}]");
    return Directory.EnumerateFiles(systemDir, "*.txt", SearchOption.AllDirectories)
        .Concat(Directory.EnumerateFiles(systemDir, "*.eve", SearchOption.AllDirectories))
        .Concat(Directory.EnumerateFiles(x, "*.txt", SearchOption.AllDirectories))
        .Concat(Directory.EnumerateFiles(x, "*.eve", SearchOption.AllDirectories));
}
Console.WriteLine($"Searching all files in: [{x}]");
return Directory.EnumerateFiles(x, "*.txt", SearchOption.AllDirectories)
    .Concat(Directory.EnumerateFiles(x, "*.eve", SearchOption.AllDirectories));
Original prompt

背景

SRCDataLinter は、引数で指定したディレクトリを再帰探索して *.txt / *.eve を見つけ、ファイル名パターンに応じて各種データリストをロードして lint します。

ユーザーは シナリオルート(scenario root)を引数に指定した場合に、data/system 配下にある sp.txtalias.txt などの system データが読まれることを期待しています。

しかし現状の Program.cs は「指定ディレクトリ配下を総なめする」挙動のみで、data/system を明示的に優先・保証して探索していないため、運用/ディレクトリ構成差異によっては data/system/sp.txtdata/system/alias.txt が探索対象にならず、読み込まれないように見える問題が発生します。

対象ファイル:

目的

シナリオルートを引数に指定した場合に、<scenarioRoot>/data/system 配下の *.txt / *.eve確実に探索対象に含めてsp.txt / alias.txt 等が確実にロードされるように修正する。

要件

  1. args にディレクトリが渡された場合、まず <arg>/data/system の存在をチェックする。
  2. <arg>/data/system が存在する場合は、そこを探索対象として *.txt / *.eve を列挙する。
    • 方針: data/system が存在する場合は そこを優先し、全探索を避ける(誤検出/時間増大防止)。
  3. <arg>/data/system が存在しない場合は、従来どおり <arg> 全体を再帰探索する(後方互換)。
  4. args にファイルが渡された場合の挙動(そのファイルのみ lint 対象)は維持する。
  5. 同一ファイルの重複処理を避けるため、列挙結果は Distinct(StringComparer.OrdinalIgnoreCase) 等で重複排除する。
  6. 変更により lint 対象の挙動がわかるよう、必要ならログ出力(例: どの探索ルートを使ったか)を最小限追加してよい。
  7. ビルドが通ること。

受け入れ基準

  • シナリオルートを引数に実行した際、<scenarioRoot>/data/system/sp.txt<scenarioRoot>/data/system/alias.txt が存在すれば、それらが列挙され SPDList.Load / ALDList.Load が呼ばれ、出力に Checked [<fullpath>] が表示される。
  • data/system が存在しない既存ケースでは従来同様に動作する。

補足

ユーザーの期待は「シナリオルート指定で data/system を読む」方針です。

This pull request was created from Copilot chat.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Co-authored-by: 7474 <4744735+7474@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix data/system file search in SRCDataLinter SRCDataLinter: シナリオルート指定時に data/system を優先探索 Feb 22, 2026
Copilot AI requested a review from 7474 February 22, 2026 07:36
@7474
Copy link
Owner

7474 commented Feb 22, 2026

@copilot この構成が実際のシナリオプレイのユースケースに合っているか評価してください。
通常、ゲームはsystemディレクトリ内の基本データを読み込んだ上で、シナリオ固有のデータを読み込みます。
SRCCoreの初期化処理も参考にしてください。

Co-authored-by: 7474 <4744735+7474@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Feb 22, 2026

@copilot この構成が実際のシナリオプレイのユースケースに合っているか評価してください。
通常、ゲームはsystemディレクトリ内の基本データを読み...

SRCCore の初期化処理を確認しました。

LoadIni() でシステムデータ(data/system/sp.txt など)を先に読み込み、その後 LoadDataDirectory() でシナリオ固有データ(data/<scenario_name>/alias.txt, unit.txt など)を読み込む二段階構成になっています。

前回の実装は data/system が存在する場合にそこだけを探索しており、シナリオ固有データが完全に無視される問題がありました。

commit 7b82e7b で修正しました。data/system が存在する場合はそのファイルを先頭に列挙(システムデータ優先)した上で、引数ディレクトリ全体も再帰探索してシナリオ固有データを含めるようにしています。Distinct() により data/system 配下の重複は除去されます。

実際の動作:

Using data/system directory first: [/tmp/scenario_root_test/data/system]
Checked [/tmp/scenario_root_test/data/system/sp.txt]      ← システムデータ先頭
Checked [/tmp/scenario_root_test/data/scenario1/alias.txt] ← シナリオ固有データも含む

Copilot AI changed the title SRCDataLinter: シナリオルート指定時に data/system を優先探索 SRCDataLinter: シナリオルート指定時に data/system を優先探索しつつシナリオ固有データも含める Feb 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants