using System;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace ServiceSim.EditorTools
{
///
/// 地図の上で道を引く確かめ(依頼 v9 の 7 章 A)。
///
/// 店も人も建てず、回さない。サイトの JSON と地図だけで、
/// 受け渡し口から全卓へ道を引いて、サイトの routes と突き合わせる。
/// 中身は ServiceSim.MapPlanCheck(Unity の外からも同じものを呼べる)。
///
public static class ServiceSimMapPlanner
{
const string P1Path = "Assets/ServiceSim/Store/StoreLayout_p1_efficient_corner.asset";
const string P5Path = "Assets/ServiceSim/Store/StoreLayout_p5_crammed.asset";
[MenuItem("ServiceSim/Map Planner/③⑦ 確かめ A(地図で道を引く・回さない)", false, 34)]
public static void CheckBoth()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("# 確かめ A:人のいない店で、受け渡し口から全卓へ道を引く(依頼 v9 の 7 章 A)");
sb.AppendLine("作った日時: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
sb.AppendLine("店も人も建てていない(JSON と地図だけで引いた)");
sb.AppendLine();
RobotSpec spec = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.RobotSpecPath);
if (spec == null)
sb.AppendLine("※ RobotSpec が見つからないので、道の引き方は既定の値で引きました");
bool ok = true;
ok &= One(sb, P1Path, "③ 効率重視型・入口が左下の角", spec);
sb.AppendLine();
ok &= One(sb, P5Path, "⑦ ぎっしり型", spec);
sb.AppendLine();
sb.AppendLine(ok ? "→ ③⑦ ともに確かめ A は通った" : "→ 通っていないものがある(上の × を見てください)");
ExperimentPlan plan = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.ExperimentPlanPath);
string outDir = plan != null ? plan.screenshotDir : null;
if (!string.IsNullOrEmpty(outDir))
{
try
{
Directory.CreateDirectory(outDir);
string txt = Path.Combine(outDir,
DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_planner_checkA.txt");
File.WriteAllText(txt, sb.ToString(), new UTF8Encoding(false));
sb.AppendLine("書き出し: " + txt);
}
catch (Exception e) { sb.AppendLine("書き出せません: " + e.Message); }
}
if (ok) Debug.Log("[ServiceSim] " + sb.ToString());
else Debug.LogError("[ServiceSim] " + sb.ToString());
}
static bool One(StringBuilder sb, string assetPath, string label, RobotSpec spec)
{
JsonStoreLayout layout = AssetDatabase.LoadAssetAtPath(assetPath);
if (layout == null)
{
sb.AppendLine("## " + label + "\n 店の形が見つかりません: " + assetPath);
return false;
}
if (layout.layoutJson == null || layout.mapJson == null)
{
sb.AppendLine("## " + label + "(" + layout.layoutFileName + ")");
sb.AppendLine(" " + (layout.layoutJson == null ? "layoutJson" : "mapJson") +
" が入っていません(依頼 v9 の 0 章を確かめてください)");
return false;
}
MapPlanCheck.Result res = MapPlanCheck.Run(
label + "(" + layout.layoutFileName + ")",
layout.layoutJson.text, layout.mapJson.text, spec);
sb.AppendLine(res.report);
ExperimentPlan plan = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.ExperimentPlanPath);
string outDir = plan != null ? plan.screenshotDir : null;
if (!string.IsNullOrEmpty(outDir) && res.rows.Count > 0)
{
try
{
Directory.CreateDirectory(outDir);
string csv = Path.Combine(outDir,
DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_plan_" +
layout.layoutFileName + ".csv");
File.WriteAllText(csv, res.Csv(), new UTF8Encoding(false));
sb.AppendLine(" CSV: " + csv);
}
catch (Exception e) { sb.AppendLine(" CSV を書けません: " + e.Message); }
}
return res.ok;
}
}
}