Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / DungeonRoomSplit.cs
  1.  
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text.Json;
  5. using System.Text.Json.Serialization;
  6. using Godot;
  7.  
  8. /// <summary>
  9. /// 房间配置文件相关信息, 将会在 RoomConfig.json 中汇总
  10. /// </summary>
  11. public class DungeonRoomSplit
  12. {
  13. /// <summary>
  14. /// 房间异常类型
  15. /// </summary>
  16. [JsonInclude]
  17. public RoomErrorType ErrorType;
  18.  
  19. /// <summary>
  20. /// 该房间的文件夹路径
  21. /// </summary>
  22. [JsonInclude]
  23. public string Path;
  24.  
  25. /// <summary>
  26. /// 房间配置路径
  27. /// </summary>
  28. [JsonIgnore]
  29. public string RoomPath => Path + "/RoomInfo.json";
  30.  
  31. /// <summary>
  32. /// 房间地块配置数据
  33. /// </summary>
  34. [JsonIgnore]
  35. public string TilePath => Path + "/TileInfo.json";
  36.  
  37. /// <summary>
  38. /// 房间预设配置数据
  39. /// </summary>
  40. [JsonIgnore]
  41. public string PreinstallPath => Path + "/Preinstall.json";
  42.  
  43. /// <summary>
  44. /// 预览图路径
  45. /// </summary>
  46. [JsonIgnore]
  47. public string PreviewPath => Path + "/Preview.png";
  48.  
  49. /// <summary>
  50. /// 房间配置数据, 第一次获取会在资源中加载数据
  51. /// </summary>
  52. [JsonIgnore]
  53. public DungeonRoomInfo RoomInfo
  54. {
  55. get
  56. {
  57. if (_roomInfo == null && RoomPath != null)
  58. {
  59. ReloadRoomInfo();
  60. }
  61.  
  62. return _roomInfo;
  63. }
  64. set => _roomInfo = value;
  65. }
  66.  
  67. private DungeonRoomInfo _roomInfo;
  68.  
  69. /// <summary>
  70. /// 房间地块配置数据
  71. /// </summary>
  72. [JsonIgnore]
  73. public DungeonTileInfo TileInfo
  74. {
  75. get
  76. {
  77. if (_tileInfo == null && TilePath != null)
  78. {
  79. ReloadTileInfo();
  80. }
  81.  
  82. return _tileInfo;
  83. }
  84. set => _tileInfo = value;
  85. }
  86.  
  87. private DungeonTileInfo _tileInfo;
  88. /// <summary>
  89. /// 房间预设数据
  90. /// </summary>
  91. [JsonIgnore]
  92. public List<RoomPreinstallInfo> Preinstall
  93. {
  94. get
  95. {
  96. if (_preinstall == null && PreinstallPath != null)
  97. {
  98. ReloadPreinstall();
  99. }
  100.  
  101. return _preinstall;
  102. }
  103. set => _preinstall = value;
  104. }
  105.  
  106. private List<RoomPreinstallInfo> _preinstall;
  107.  
  108. /// <summary>
  109. /// 预览图
  110. /// </summary>
  111. [JsonIgnore]
  112. public Texture2D PreviewImage
  113. {
  114. get
  115. {
  116. if (_previewImage == null)
  117. {
  118. ReloadPreviewImage();
  119. }
  120.  
  121. return _previewImage;
  122. }
  123. set
  124. {
  125. if (_previewImage != null)
  126. {
  127. _previewImage.Dispose();
  128. }
  129.  
  130. _previewImage = value;
  131. }
  132. }
  133. private Texture2D _previewImage;
  134. /// <summary>
  135. /// 重新加载房间数据
  136. /// </summary>
  137. public void ReloadRoomInfo()
  138. {
  139. var asText = ResourceManager.LoadText("res://" + RoomPath);
  140. _roomInfo = JsonSerializer.Deserialize<DungeonRoomInfo>(asText);
  141. }
  142.  
  143. /// <summary>
  144. /// 重新加载房间地块配置数据
  145. /// </summary>
  146. public void ReloadTileInfo()
  147. {
  148. var asText = ResourceManager.LoadText("res://" + TilePath);
  149. _tileInfo = JsonSerializer.Deserialize<DungeonTileInfo>(asText);
  150. }
  151.  
  152. /// <summary>
  153. /// 重新加载房间预设数据
  154. /// </summary>
  155. public void ReloadPreinstall()
  156. {
  157. var asText = ResourceManager.LoadText("res://" + PreinstallPath);
  158. _preinstall = JsonSerializer.Deserialize<List<RoomPreinstallInfo>>(asText);
  159. }
  160.  
  161. /// <summary>
  162. /// 重新加载预览图片
  163. /// </summary>
  164. public void ReloadPreviewImage()
  165. {
  166. if (_previewImage != null)
  167. {
  168. _previewImage.Dispose();
  169. }
  170. if (File.Exists(PreviewPath))
  171. {
  172. var bytes = File.ReadAllBytes(PreviewPath);
  173. var image = Image.Create(GameConfig.PreviewImageSize, GameConfig.PreviewImageSize, false, Image.Format.Rgb8);
  174. image.LoadPngFromBuffer(bytes);
  175. _previewImage = ImageTexture.CreateFromImage(image);
  176. }
  177. }
  178.  
  179. public override bool Equals(object obj)
  180. {
  181. if (obj == null)
  182. {
  183. return false;
  184. }
  185. if (obj is DungeonRoomSplit roomSplit)
  186. {
  187. return roomSplit.Path == Path;
  188. }
  189.  
  190. return this == obj;
  191. }
  192.  
  193. public override int GetHashCode()
  194. {
  195. return Path.GetHashCode();
  196. }
  197. }