using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using BaseGames.Core.Events;
namespace BaseGames.World.Map
{
///
/// 单个房间的地图数据 SO(架构 15_MapShopModule §1.1)。
/// 资产路径: Assets/ScriptableObjects/Map/Room_{RoomId}.asset
///
[CreateAssetMenu(menuName = "BaseGames/World/Map/RoomData")]
public class MapRoomDataSO : ScriptableObject
{
[Header("基础信息")]
public string RoomId; // 与场景名一致,如 "Room_Forest_01"
public string RegionId; // 所属区域,如 "Forest"
public string DisplayName; // 可选,地图 Tooltip
[Header("地图布局(格子坐标,单位:格)")]
public Vector2Int GridPosition; // 左下角坐标
public Vector2Int GridSize; // 宽×高(格)
[Header("房间轮廓纹理")]
public Texture2D RoomOutlineTex; // 用于地图 UI 显示房间形状(可空,回退到矩形格子)
[Header("出口信息")]
public RoomExitData[] Exits; // 该房间所有出口定义
[Header("特殊标记")]
public bool IsBossRoom;
public bool IsSavePoint;
public bool IsShop;
public Sprite MapIconOverride; // null = 按 isXxx 自动选择图标
[Header("流式加载")]
[Tooltip("此房间场景资产的预估内存(KB)。\n" +
"在 Profiler 中测量场景实际内存后填入,供流式管理器执行内存预算检查使用。\n" +
"建议在关卡内容基本定型后更新此值。0 = 未填写,将跳过内存预算检查。")]
[Min(0)]
public int EstimatedMemoryKB;
}
[Serializable]
public struct RoomExitData
{
public string TargetRoomId; // 连接的目标房间 ID
public Vector2Int ExitGridPos; // 出口在格子地图上的位置
public ExitDirection Direction; // 出口方向
[Tooltip("此出口触发的过渡类型。\n" +
"Seamless:无缝切换(同区域相邻房间首选);\n" +
"AtmosphericFade:短暂淡出 + 区域名提示(跨大区域边界首选)。")]
public TransitionType PreferredTransitionType;
}
public enum ExitDirection { Up, Down, Left, Right }
// ─── 全局地图数据库 ──────────────────────────────────────────────────────────
///
/// 全局地图数据库 SO(编辑器配置一次;架构 15_MapShopModule §1.1)。
/// 资产路径: Assets/ScriptableObjects/Map/MapDatabase.asset
///
[CreateAssetMenu(menuName = "BaseGames/World/Map/MapDatabase")]
public class MapDatabaseSO : ScriptableObject
{
public MapRoomDataSO[] AllRooms;
private Dictionary _index;
/// 运行时快速查找(首次调用时建立索引)。
public MapRoomDataSO GetRoom(string roomId)
{
if (_index == null)
{
if (AllRooms == null) return null;
_index = AllRooms.Where(r => r != null)
.ToDictionary(r => r.RoomId);
}
_index.TryGetValue(roomId, out var r);
return r;
}
private void OnDisable() => _index = null; // SO 卸载时清理缓存
}
}