using Godot; using System; using System.Collections.Generic; using System.Linq; public partial class GameData : Node { // 物品分类枚举 public enum ItemCategory { RawMaterial, // 原材料 ProcessedMaterial, // 冶炼成品 Building, // 建筑 Component, // 组件 Product // 产品 } // 物品数据结构 public class ItemData { public string Id { get; set; } // 物品ID public string Name { get; set; } // 物品名称 public ItemCategory Category { get; set; } // 物品分类 public string Description { get; set; } // 物品描述 public Dictionary Recipe { get; set; } // 合成配方 public float CraftTime { get; set; } // 合成时间 public float PowerConsumption { get; set; } // 耗电量 public string IconPath { get; set; } // 图标路径 } // 单例实例 private static GameData instance; public static GameData Instance { get { return instance; } } // 物品数据字典 private Dictionary items = new Dictionary(); public override void _Ready() { instance = this; // 设置单例实例 LoadItemsFromCSV(); } // 从CSV文件加载物品数据 private void LoadItemsFromCSV() { try { // 读取CSV文件 string csvPath = "res://data/config/items.csv"; if (!Godot.FileAccess.FileExists(csvPath)) { GD.PrintErr("物品数据文件不存在: " + csvPath); return; } var file = Godot.FileAccess.Open(csvPath, Godot.FileAccess.ModeFlags.Read); if (file == null) { GD.PrintErr("无法打开物品数据文件: " + csvPath); return; } // 读取标题行 string header = file.GetLine(); string[] headers = header.Split(','); // 读取数据行 while (!file.EofReached()) { string line = file.GetLine(); if (string.IsNullOrEmpty(line)) continue; string[] values = line.Split(','); if (values.Length != headers.Length) continue; // 创建物品数据 var item = new ItemData { Id = values[0], Name = values[1], Category = (ItemCategory)Enum.Parse(typeof(ItemCategory), values[2]), Description = values[3], Recipe = ParseRecipe(values[4]), CraftTime = float.Parse(values[5]), PowerConsumption = float.Parse(values[6]), IconPath = values[7] }; AddItem(item); } file.Close(); GD.Print("成功加载物品数据"); } catch (Exception e) { GD.PrintErr("加载物品数据时出错: " + e.Message); } } // 解析配方字符串 private Dictionary ParseRecipe(string recipeStr) { if (string.IsNullOrEmpty(recipeStr) || recipeStr == "null") return null; var recipe = new Dictionary(); string[] pairs = recipeStr.Split(';'); foreach (string pair in pairs) { string[] parts = pair.Split(':'); if (parts.Length == 2) { string itemId = parts[0]; int amount = int.Parse(parts[1]); recipe[itemId] = amount; } } return recipe; } // 添加物品 private void AddItem(ItemData item) { items[item.Id] = item; } // 获取物品数据 public ItemData GetItem(string id) { if (items.ContainsKey(id)) { return items[id]; } return null; } // 获取所有物品 public Dictionary GetAllItems() { return items; } // 获取指定分类的所有物品 public Dictionary GetItemsByCategory(ItemCategory category) { var result = new Dictionary(); foreach (var item in items) { if (item.Value.Category == category) { result[item.Key] = item.Value; } } return result; } // 检查是否有足够的材料进行合成 public bool HasEnoughMaterials(string itemId, Dictionary inventory) { var item = GetItem(itemId); if (item == null || item.Recipe == null) return false; foreach (var requirement in item.Recipe) { if (!inventory.ContainsKey(requirement.Key) || inventory[requirement.Key] < requirement.Value) { return false; } } return true; } // 计算合成所需时间 public float GetCraftTime(string itemId) { var item = GetItem(itemId); return item?.CraftTime ?? 0f; } // 计算合成所需电力 public float GetPowerConsumption(string itemId) { var item = GetItem(itemId); return item?.PowerConsumption ?? 0f; } }