- using System.Collections.Generic;
- using System.IO;
- using System.Text.Json;
- using System.Text.Json.Serialization;
- using Godot;
- /// <summary>
- /// 房间配置文件相关信息, 将会在 RoomConfig.json 中汇总
- /// </summary>
- public class DungeonRoomSplit
- {
- /// <summary>
- /// 房间异常类型
- /// </summary>
- [JsonInclude]
- public RoomErrorType ErrorType;
- /// <summary>
- /// 该房间的文件夹路径
- /// </summary>
- [JsonInclude]
- public string Path;
- /// <summary>
- /// 房间配置路径
- /// </summary>
- [JsonIgnore]
- public string RoomPath => Path + "/RoomInfo.json";
- /// <summary>
- /// 房间地块配置数据
- /// </summary>
- [JsonIgnore]
- public string TilePath => Path + "/TileInfo.json";
- /// <summary>
- /// 房间预设配置数据
- /// </summary>
- [JsonIgnore]
- public string PreinstallPath => Path + "/Preinstall.json";
- /// <summary>
- /// 预览图路径
- /// </summary>
- [JsonIgnore]
- public string PreviewPath => Path + "/Preview.png";
- /// <summary>
- /// 房间配置数据, 第一次获取会在资源中加载数据
- /// </summary>
- [JsonIgnore]
- public DungeonRoomInfo RoomInfo
- {
- get
- {
- if (_roomInfo == null && RoomPath != null)
- {
- ReloadRoomInfo();
- }
- return _roomInfo;
- }
- set => _roomInfo = value;
- }
- private DungeonRoomInfo _roomInfo;
- /// <summary>
- /// 房间地块配置数据
- /// </summary>
- [JsonIgnore]
- public DungeonTileInfo TileInfo
- {
- get
- {
- if (_tileInfo == null && TilePath != null)
- {
- ReloadTileInfo();
- }
- return _tileInfo;
- }
- set => _tileInfo = value;
- }
- private DungeonTileInfo _tileInfo;
- /// <summary>
- /// 房间预设数据
- /// </summary>
- [JsonIgnore]
- public List<RoomPreinstallInfo> Preinstall
- {
- get
- {
- if (_preinstall == null && PreinstallPath != null)
- {
- ReloadPreinstall();
- }
- return _preinstall;
- }
- set => _preinstall = value;
- }
- private List<RoomPreinstallInfo> _preinstall;
- /// <summary>
- /// 预览图
- /// </summary>
- [JsonIgnore]
- public Texture2D PreviewImage
- {
- get
- {
- if (_previewImage == null)
- {
- ReloadPreviewImage();
- }
- return _previewImage;
- }
- set
- {
- if (_previewImage != null)
- {
- _previewImage.Dispose();
- }
- _previewImage = value;
- }
- }
- private Texture2D _previewImage;
- /// <summary>
- /// 重新加载房间数据
- /// </summary>
- public void ReloadRoomInfo()
- {
- var asText = ResourceManager.LoadText("res://" + RoomPath);
- _roomInfo = JsonSerializer.Deserialize<DungeonRoomInfo>(asText);
- }
- /// <summary>
- /// 重新加载房间地块配置数据
- /// </summary>
- public void ReloadTileInfo()
- {
- var asText = ResourceManager.LoadText("res://" + TilePath);
- _tileInfo = JsonSerializer.Deserialize<DungeonTileInfo>(asText);
- }
- /// <summary>
- /// 重新加载房间预设数据
- /// </summary>
- public void ReloadPreinstall()
- {
- var asText = ResourceManager.LoadText("res://" + PreinstallPath);
- _preinstall = JsonSerializer.Deserialize<List<RoomPreinstallInfo>>(asText);
- }
- /// <summary>
- /// 重新加载预览图片
- /// </summary>
- public void ReloadPreviewImage()
- {
- if (_previewImage != null)
- {
- _previewImage.Dispose();
- }
- if (File.Exists(PreviewPath))
- {
- var bytes = File.ReadAllBytes(PreviewPath);
- var image = Image.Create(GameConfig.PreviewImageSize, GameConfig.PreviewImageSize, false, Image.Format.Rgb8);
- image.LoadPngFromBuffer(bytes);
- _previewImage = ImageTexture.CreateFromImage(image);
- }
- }
- public override bool Equals(object obj)
- {
- if (obj == null)
- {
- return false;
- }
- if (obj is DungeonRoomSplit roomSplit)
- {
- return roomSplit.Path == Path;
- }
- return this == obj;
- }
- public override int GetHashCode()
- {
- return Path.GetHashCode();
- }
- }