diff --git a/Client/Assets/Scripts/Configs/ConfigProcessor.cs b/Client/Assets/Scripts/Configs/ConfigProcessor.cs index 3cafbd3..9dc772a 100644 --- a/Client/Assets/Scripts/Configs/ConfigProcessor.cs +++ b/Client/Assets/Scripts/Configs/ConfigProcessor.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading; +using System.Threading.Tasks; using System.Xml.Linq; using Newtonsoft.Json; using UnityEngine; +using UnityEngine.Networking; using Formatting = Newtonsoft.Json.Formatting; namespace Configs @@ -284,5 +287,57 @@ namespace Configs return resourceDict; } + + /// + /// 从外部指定文件中加载图片 + /// + /// 图片文件的完整路径 + /// 加载成功的 Texture2D 对象,或加载失败时返回 null + public static Texture2D LoadTextureByIO(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + { + Debug.LogError("文件路径为空,请检查输入!"); + return null; + } + + // 检查文件是否存在 + if (!System.IO.File.Exists(filePath)) + { + Debug.LogError($"文件不存在: {filePath}"); + return null; + } + + byte[] bytes = null; + + try + { + // 使用 using 自动管理 FileStream 的生命周期 + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + { + fs.Seek(0, SeekOrigin.Begin); // 将游标移动到文件开头(可选) + bytes = new byte[fs.Length]; // 创建一个字节数组来存储文件内容 + fs.Read(bytes, 0, bytes.Length); // 读取文件内容到字节数组 + } + } + catch (Exception e) + { + Debug.LogError($"读取文件时发生错误: {e.Message}"); + return null; + } + + // 创建一个默认大小的 Texture2D 对象 + Texture2D texture = new Texture2D(2, 2); // 初始大小为 2x2,LoadImage 会自动调整大小 + + if (texture.LoadImage(bytes)) // 加载图片数据 + { + return texture; // 返回加载成功的 Texture2D 对象 + } + else + { + Debug.LogError("图片加载失败,请检查文件格式是否正确!"); + return null; + } + } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/Define.cs b/Client/Assets/Scripts/Data/Define.cs index db15281..11940b5 100644 --- a/Client/Assets/Scripts/Data/Define.cs +++ b/Client/Assets/Scripts/Data/Define.cs @@ -8,13 +8,15 @@ using System.Xml.Linq; namespace Data { - public abstract class Define + public class Define { public string defName; public string description; public string label; public string packID; + public bool isReferene=false; + /// /// 初始化方法,根据传入的 XML 元素 () 进行处理。 /// @@ -112,18 +114,5 @@ namespace Data return string.Join(Environment.NewLine, text.Split('\n').Select(line => prefix + line)); } } - - public class DefineReference : Define - { - public Define def; - public string className; - public string fieldName; - - public DefineReference(string className, string defName, string fieldName) - { - this.defName = defName; - this.className = className; - this.fieldName = fieldName; - } - } + } \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/DefinePack.cs b/Client/Assets/Scripts/Data/DefinePack.cs index b729adf..74968a1 100644 --- a/Client/Assets/Scripts/Data/DefinePack.cs +++ b/Client/Assets/Scripts/Data/DefinePack.cs @@ -107,10 +107,19 @@ namespace Data public PackAbout packAbout; public string packID; + public string packRootPath; + public string Name + { + get + { + return packAbout.name; + } + } public bool LoadPack(string packPath) { + packRootPath=System.IO.Path.GetFullPath(packPath);; var packDatas = ConfigProcessor.LoadXmlFromPath(packPath); var aboutXmls = FindDocumentsWithRootName(packDatas, "About"); if (aboutXmls == null || aboutXmls.Count < 1) @@ -262,8 +271,12 @@ namespace Data } else { - value = new DefineReference(field.FieldType.Name, element.Value, field.Name); - + var reference = (Define)Activator.CreateInstance(field.FieldType); + reference.isReferene = true; + reference.description=field.FieldType.Name; + reference.label = field.Name; + reference.defName = element.Value; + value = reference; } } else diff --git a/Client/Assets/Scripts/Data/MapDefine.cs b/Client/Assets/Scripts/Data/MapDefine.cs index 2cedc51..aaac497 100644 --- a/Client/Assets/Scripts/Data/MapDefine.cs +++ b/Client/Assets/Scripts/Data/MapDefine.cs @@ -8,7 +8,7 @@ namespace Data { public class TileDef : Define { - public string texturePath = ""; + public ImageDef texture; public string name = ""; public override bool Init(XElement xmlDef) @@ -45,6 +45,7 @@ namespace Data return true; } } - + + } \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/ResourcesDefine.cs b/Client/Assets/Scripts/Data/ResourcesDefine.cs new file mode 100644 index 0000000..72ab58c --- /dev/null +++ b/Client/Assets/Scripts/Data/ResourcesDefine.cs @@ -0,0 +1,20 @@ +using System.Xml.Linq; + +namespace Data +{ + public class ImageDef : Define + { + public string name; + public string path; + public int wCount; + public int hCount; + public int pixelsPerUnit = 16; + + public override bool Init(XElement xmlDef) + { + base.Init(xmlDef); + name = defName; + return false; + } + } +} \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/ResourcesDefine.cs.meta b/Client/Assets/Scripts/Data/ResourcesDefine.cs.meta new file mode 100644 index 0000000..370a88b --- /dev/null +++ b/Client/Assets/Scripts/Data/ResourcesDefine.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8988509c3c0f4525871f5ccd7ef28363 +timeCreated: 1752672894 \ No newline at end of file diff --git a/Client/Assets/Scripts/Entity/Monster.cs b/Client/Assets/Scripts/Entity/Monster.cs index 33af0b8..59be189 100644 --- a/Client/Assets/Scripts/Entity/Monster.cs +++ b/Client/Assets/Scripts/Entity/Monster.cs @@ -2,7 +2,11 @@ namespace Entity { public class Monster { - + public Protocol.MonsterPack ToPack() + { + var pack= new Protocol.MonsterPack(); + return pack; + } } public class MonsterAttributes diff --git a/Client/Assets/Scripts/Managers/DefineManager.cs b/Client/Assets/Scripts/Managers/DefineManager.cs index 7af89ce..0c521c6 100644 --- a/Client/Assets/Scripts/Managers/DefineManager.cs +++ b/Client/Assets/Scripts/Managers/DefineManager.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Reflection; using Data; using UnityEngine; using Utils; @@ -30,52 +32,53 @@ namespace Managers var pack = new DefinePack(); if (pack.LoadPack(folder)) packs.Add(pack.packID, pack); } - List> defineRefs = new(); + + Dictionary fieldCache = new(); + //不优化到循环里面是因为要先建立索引再链接 + List> defineCache = new(); + foreach (var pack in packs) { foreach (var define in pack.Value.defines) { - var typeName=define.Key; - var defList=define.Value; + var typeName = define.Key; + var defList = define.Value; + if (!defines.ContainsKey(typeName)) defines[typeName] = new Dictionary(); + foreach (var def in defList) { defines[typeName][def.defName] = def; - if (def is DefineReference reference) + + // 如果字段信息已经缓存,则直接使用缓存 + if (!fieldCache.TryGetValue(def.GetType(), out var defineFields)) { - defineRefs.Add(new(def,reference)); + // 获取所有字段类型为 Define 或其派生类型的字段 + defineFields = def.GetType() + .GetFields(BindingFlags.Public | BindingFlags.Instance) + .Where(field => typeof(Define).IsAssignableFrom(field.FieldType)) + .ToArray(); + // 缓存字段信息 + fieldCache[def.GetType()] = defineFields; + } + + foreach (var defineField in defineFields) + { + var defRef=(Define)defineField.GetValue(def); + if (defRef==null || !defRef.isReferene) + continue; + defineCache.Add(new(def, defineField, defRef)); } } } } - foreach (var defineRef in defineRefs) + foreach (var defRef in defineCache) { - var define = defineRef.Item1; - var reference = defineRef.Item2; - var referenceDef=FindDefine(reference.className,define.defName); - - var property = define.GetType().GetProperty(reference.fieldName); - if (property != null && property.CanWrite) - { - property.SetValue(define, referenceDef); - } - else - { - // 如果是字段而不是属性 - var field = define.GetType().GetField(reference.fieldName); - if (field != null) - { - field.SetValue(define, referenceDef); - } - else - { - // 处理找不到成员的情况 - Debug.LogError($"Could not find field or property '{reference.fieldName}' in type {define.GetType().Name}"); - } - } + defRef.Item2.SetValue(defRef.Item1, FindDefine(defRef.Item3.description, defRef.Item3.defName)); } + } /// /// 查找指定定义类型的定义名对应的 Define 对象。 @@ -94,6 +97,133 @@ namespace Managers } return null; } + + public DefinePack GetDefinePackage(Define define) + { + if (define == null || define.packID == null) + return null; + packs.TryGetValue(define.packID, out var pack); + return pack; + } + + public string GetDefinePackageName(Define define) + { + return GetDefinePackage(define)?.Name; + } + public string GetPackagePath(string packID) + { + if (packs.TryGetValue(packID, out var pack)) + { + return pack.packRootPath; + } + return null; + } + + public Define[] GetAllDefine() + { + List defineList = new(); + foreach (var define in defines.Values) + { + defineList.AddRange(define.Values); + } + return defineList.ToArray(); + } + + /// + /// 查询 Define 对象。 + /// + /// 定义类型(外层字典的键)。 + /// 定义名(内层字典的键)。 + /// 如果找到,则返回 Define 对象;否则返回 null。 + public Define QueryDefine(string defineType, string defineName) + { + if (string.IsNullOrEmpty(defineType)) + { + Debug.LogError("查询失败:定义类型参数不能为空!"); + return null; + } + if (string.IsNullOrEmpty(defineName)) + { + Debug.LogError("查询失败:定义名参数不能为空!"); + return null; + } + if (!defines.TryGetValue(defineType, out var typeDefinitions)) + { + Debug.LogWarning($"查询失败:未找到定义类型 '{defineType}'"); + return null; + } + if (!typeDefinitions.TryGetValue(defineName, out var targetDefine)) + { + Debug.LogWarning($"查询失败:定义类型 '{defineType}' 中未找到定义名 '{defineName}'"); + return null; + } + return targetDefine; + } + /// + /// 查询指定类型下的所有 Define 对象。 + /// + /// 定义类型(外层字典的键)。 + /// 该类型下的 Define 数组,如果未找到则返回 null。 + public Define[] QueryDefinesByType(string defineType) + { + if (string.IsNullOrEmpty(defineType)) + { + Debug.LogError("查询失败:定义类型参数不能为空!"); + return null; + } + + if (!defines.TryGetValue(defineType, out var typeDefinitions)) + { + Debug.LogWarning($"查询失败:未找到定义类型 '{defineType}'"); + return null; + } + + return typeDefinitions.Values.ToArray(); + } + /// + /// 查询指定类型下的所有 Define 对象,并尝试转换为目标类型。 + /// + /// 目标类型。 + /// 转换后的目标类型数组,如果未找到或转换失败则返回 null。 + public T[] QueryDefinesByType() + { + var defineType = typeof(T).Name; + if (string.IsNullOrEmpty(defineType)) + { + Debug.LogError("查询失败:定义类型参数不能为空!"); + return null; + } + + if (!defines.TryGetValue(defineType, out var typeDefinitions)) + { + Debug.LogWarning($"查询失败:未找到定义类型 '{defineType}'"); + return null; + } + + try + { + // 获取所有值并尝试转换为目标类型 + var result = new List(); + foreach (var item in typeDefinitions.Values) + { + if (item is T converted) + { + result.Add(converted); + } + else + { + Debug.LogError($"类型转换失败:无法将 {item.GetType().Name} 转换为 {typeof(T).Name}"); + return null; + } + } + return result.ToArray(); + } + catch (Exception ex) + { + Debug.LogError($"类型转换失败:从 Define 转换为 {typeof(T).Name} 时出错。错误信息:{ex.Message}"); + return null; + } + } public override string ToString() { if (packs == null || packs.Count == 0) diff --git a/Client/Assets/Scripts/Managers/PackagesImageManager.cs b/Client/Assets/Scripts/Managers/PackagesImageManager.cs new file mode 100644 index 0000000..b645994 --- /dev/null +++ b/Client/Assets/Scripts/Managers/PackagesImageManager.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using System.IO; +using Data; +using UnityEngine; + +namespace Managers +{ + public class PackagesImageManager : Utils.Singleton + { + public Dictionary packagesImages = new(); + public Dictionary sprites = new(); + + public void Init() + { + if (packagesImages.Count > 0) + return; + var imageDef = Managers.DefineManager.Instance.QueryDefinesByType(); + foreach (var ima in imageDef) + { + if (ima.path == null) + continue; + var pack = Managers.DefineManager.Instance.GetDefinePackage(ima); + var path = Path.Combine(pack.packRootPath, ima.path); + var texture = Configs.ConfigProcessor.LoadTextureByIO(path); + if (texture == null) + continue; + packagesImages.Add(ima.name, texture); + SplitTextureIntoSprites(ima.name, texture, ima.hCount, ima.wCount, ima.pixelsPerUnit); + } + } + + void SplitTextureIntoSprites(string name, Texture2D texture, int rows, int cols, int pixelsPerUnit) + { + if (texture == null || rows <= 0 || cols <= 0) + { + Debug.LogError("Invalid parameters for splitting texture."); + return; + } + + var textureWidth = texture.width; + var textureHeight = texture.height; + + var tileWidth = textureWidth / cols; + var tileHeight = textureHeight / rows; + + // 确保纹理可以被整除 + if (tileWidth * cols != textureWidth || tileHeight * rows != textureHeight) + { + Debug.LogError("Texture dimensions are not divisible by the specified rows and columns."); + return; + } + + // 遍历每一行和每一列 + for (var row = 0; row < rows; row++) + { + for (var col = 0; col < cols; col++) + { + // 计算当前小块的矩形区域 + var spriteRect = new Rect(col * tileWidth, row * tileHeight, tileWidth, tileHeight); + + // 创建Sprite + var sprite = Sprite.Create(texture, (Rect)spriteRect, new Vector2(0.5f, 0.5f), pixelsPerUnit); + + var index = row * cols + col; + sprites[name + $"_{index}"] = sprite; + } + } + } + + public void Reload() + { + packagesImages.Clear(); + Init(); + } + + public Sprite GetSprite(string name) + { + return sprites.GetValueOrDefault(name, null); + } + + public Sprite GetSprite(string name, int index) + { + name += $"_{index}"; + return GetSprite(name); + } + } +} \ No newline at end of file diff --git a/Client/Assets/Scripts/Managers/PackagesImageManager.cs.meta b/Client/Assets/Scripts/Managers/PackagesImageManager.cs.meta new file mode 100644 index 0000000..c310713 --- /dev/null +++ b/Client/Assets/Scripts/Managers/PackagesImageManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a3bbc0fa9efd4f018e27a6b9f2845140 +timeCreated: 1752672790 \ No newline at end of file diff --git a/Client/Assets/Scripts/Managers/TileMapManager.cs b/Client/Assets/Scripts/Managers/TileMapManager.cs deleted file mode 100644 index 5f7ecbb..0000000 --- a/Client/Assets/Scripts/Managers/TileMapManager.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Managers -{ - public class TileMapManager - { - - } -} \ No newline at end of file diff --git a/Client/Assets/Scripts/Managers/TileMapManager.cs.meta b/Client/Assets/Scripts/Managers/TileMapManager.cs.meta deleted file mode 100644 index 5e80be3..0000000 --- a/Client/Assets/Scripts/Managers/TileMapManager.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b9c65bbe278844978d49c3cd26c050ed -timeCreated: 1752248825 \ No newline at end of file diff --git a/Client/Assets/Scripts/Map/DoubleMap.cs b/Client/Assets/Scripts/Map/DoubleMap.cs index 2d88a58..093e6da 100644 --- a/Client/Assets/Scripts/Map/DoubleMap.cs +++ b/Client/Assets/Scripts/Map/DoubleMap.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Data; using UnityEngine; using UnityEngine.Tilemaps; @@ -7,26 +8,105 @@ namespace Map { public class DoubleMap : MonoBehaviour { - public Tilemap dataLevel; + public List> mapData = new(); + // public Tilemap dataLevel; public Tilemap textureLevel; public Dictionary tileDict = new(); void Start() { - tileDict = Configs.ConfigProcessor.LoadResources("TileMap"); - var tile= tileDict.Values; - for (int i = 0; i < 100; i++) + TileManager.Instance.Init(); + } + + public void UpdateTexture() + { + + } + + public void SetTile(int x, int y, string tileName) + { + + } + + public void SetTile(int x, int y, int id) + { + + } + + } + + public class TileManager:Utils.Singleton + { + public Dictionary<(int, int, int, int), TileBase> tileToTileBaseMapping = new(); + public Dictionary tileID = new(); + public void Init() + { + if (tileToTileBaseMapping.Count > 0) + return; + Managers.PackagesImageManager.Instance.Init(); + var imagePack = Managers.PackagesImageManager.Instance; + var tileType = Managers.DefineManager.Instance.QueryDefinesByType(); + for (var i = 1; i < tileType.Length; i++) { - for (int j = 0; j < 100; j++) + tileID.Add(tileType[i].name, i); + } + + var tileTextureMappingDef=Managers.DefineManager.Instance.QueryDefinesByType(); + foreach (var mappingTableDef in tileTextureMappingDef) + { + foreach (var keyVal in mappingTableDef.tileDict) { - textureLevel.SetTile(new(i,j),tile.First()); + var key = keyVal.Key; + var val=keyVal.Value; + var parts = key.Split('_'); + if (parts.Length != 4) + { + var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); + Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{key}内容不合法!\n应该为[瓦片名称_瓦片名称_瓦片名称_瓦片名称]的格式"); + continue; + } + + if (!(tileID.TryGetValue(parts[0], out var k1) && + tileID.TryGetValue(parts[1], out var k2) && + tileID.TryGetValue(parts[2], out var k3) && + tileID.TryGetValue(parts[3], out var k4))) + { + var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); + Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{key}中存在未定义的瓦片名称"); + continue; + } + var sprite = imagePack.GetSprite(val); + if (sprite == null) + { + var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); + Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{val}中存在未定义的图片名称"); + continue; + } + if (tileToTileBaseMapping.ContainsKey((k1, k2, k3, k4))) + { + var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); + Debug.LogWarning($"来自{packName}定义的TileMappingTableDef键值{(k1, k2, k3, k4)}存在重复索引,将忽略重复项"); + continue; + } + var tile = LoadTile(sprite); + tileToTileBaseMapping.Add((k1, k2, k3, k4), tile); } } } - } - public class TileMappingTable:Utils.Singleton - { - + public void Reload() + { + tileToTileBaseMapping.Clear(); + Init(); + } + + public TileBase LoadTile(Sprite sprite) + { + var newTile = ScriptableObject.CreateInstance(); + newTile.sprite = sprite; + newTile.color = Color.white; + newTile.colliderType = Tile.ColliderType.Sprite; + return newTile; + } } } diff --git a/Client/Data/Core/Define/Map/Map.xml b/Client/Data/Core/Define/Map/Map.xml index 2c9384d..a9778d4 100644 --- a/Client/Data/Core/Define/Map/Map.xml +++ b/Client/Data/Core/Define/Map/Map.xml @@ -1,5 +1,21 @@ + + GrassDirt + Resources\Map\GrassSoild.png + 4 + 4 + + + + Grass + Grass + + + Dirt + Dirt + + GrassDirtTable diff --git a/Client/Data/Core/Define/Player/CatGirl.xml b/Client/Data/Core/Define/Player/CatGirl.xml index 5516c08..41b6a56 100644 --- a/Client/Data/Core/Define/Player/CatGirl.xml +++ b/Client/Data/Core/Define/Player/CatGirl.xml @@ -3,7 +3,7 @@ CatGirl 100 - 1.2 + 2 diff --git a/Client/Data/Core/Resource/Character/CatGirl/body/east.png b/Client/Data/Core/Resources/Character/CatGirl/body/east.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/body/east.png rename to Client/Data/Core/Resources/Character/CatGirl/body/east.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/body/north.png b/Client/Data/Core/Resources/Character/CatGirl/body/north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/body/north.png rename to Client/Data/Core/Resources/Character/CatGirl/body/north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/body/south.png b/Client/Data/Core/Resources/Character/CatGirl/body/south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/body/south.png rename to Client/Data/Core/Resources/Character/CatGirl/body/south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/clothing/east.png b/Client/Data/Core/Resources/Character/CatGirl/clothing/east.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/clothing/east.png rename to Client/Data/Core/Resources/Character/CatGirl/clothing/east.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/clothing/north.png b/Client/Data/Core/Resources/Character/CatGirl/clothing/north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/clothing/north.png rename to Client/Data/Core/Resources/Character/CatGirl/clothing/north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/clothing/south.png b/Client/Data/Core/Resources/Character/CatGirl/clothing/south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/clothing/south.png rename to Client/Data/Core/Resources/Character/CatGirl/clothing/south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_east.png b/Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_east.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_east.png rename to Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_east.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_north.png b/Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_north.png rename to Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_south.png b/Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hair/KiiroHair5_south.png rename to Client/Data/Core/Resources/Character/CatGirl/hair/KiiroHair5_south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_east.png b/Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_east.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_east.png rename to Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_east.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_north.png b/Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_north.png rename to Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_south.png b/Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/hairBackground/KiiroHairBG5_south.png rename to Client/Data/Core/Resources/Character/CatGirl/hairBackground/KiiroHairBG5_south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_north.png b/Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_north.png rename to Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_south.png b/Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_south.png rename to Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_west.png b/Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_west.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/head/KiiroHeadH1_west.png rename to Client/Data/Core/Resources/Character/CatGirl/head/KiiroHeadH1_west.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_north.png b/Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_north.png rename to Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_south.png b/Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_south.png rename to Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_south.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_west.png b/Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_west.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/leftEar/LeftEar_west.png rename to Client/Data/Core/Resources/Character/CatGirl/leftEar/LeftEar_west.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_east.png b/Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_east.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_east.png rename to Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_east.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_north.png b/Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_north.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_north.png rename to Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_north.png diff --git a/Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_south.png b/Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_south.png similarity index 100% rename from Client/Data/Core/Resource/Character/CatGirl/rightEar/RightEar_south.png rename to Client/Data/Core/Resources/Character/CatGirl/rightEar/RightEar_south.png diff --git a/Client/Data/Core/Resources/Map/GrassDirtDirtWater.png b/Client/Data/Core/Resources/Map/GrassDirtDirtWater.png new file mode 100644 index 0000000..8362102 Binary files /dev/null and b/Client/Data/Core/Resources/Map/GrassDirtDirtWater.png differ diff --git a/Client/Data/Core/Resources/Map/GrassDirtWaterWater.png b/Client/Data/Core/Resources/Map/GrassDirtWaterWater.png new file mode 100644 index 0000000..7dbbc5d Binary files /dev/null and b/Client/Data/Core/Resources/Map/GrassDirtWaterWater.png differ diff --git a/Client/Data/Core/Resources/Map/GrassGrassDirtWater.png b/Client/Data/Core/Resources/Map/GrassGrassDirtWater.png new file mode 100644 index 0000000..b12f6be Binary files /dev/null and b/Client/Data/Core/Resources/Map/GrassGrassDirtWater.png differ diff --git a/Client/Data/Core/Resources/Map/GrassSoild.png b/Client/Data/Core/Resources/Map/GrassSoild.png new file mode 100644 index 0000000..a821096 Binary files /dev/null and b/Client/Data/Core/Resources/Map/GrassSoild.png differ diff --git a/Client/Data/Core/Resources/Map/GrassWater.png b/Client/Data/Core/Resources/Map/GrassWater.png new file mode 100644 index 0000000..f5feaae Binary files /dev/null and b/Client/Data/Core/Resources/Map/GrassWater.png differ diff --git a/Client/Data/Core/Resources/Map/SoildWater.png b/Client/Data/Core/Resources/Map/SoildWater.png new file mode 100644 index 0000000..aa721a9 Binary files /dev/null and b/Client/Data/Core/Resources/Map/SoildWater.png differ