diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png
new file mode 100644
index 0000000..cb64efb
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png.import
new file mode 100644
index 0000000..f1a115c
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Main.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://betgai078na4v"
+path="res://.godot/imported/Main.png-23d95873487ad9e6bd6e2fd01911f2e2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/map/tileSet/TileSet1/Main.png"
+dest_files=["res://.godot/imported/Main.png-23d95873487ad9e6bd6e2fd01911f2e2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png
deleted file mode 100644
index cb64efb..0000000
--- a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png
+++ /dev/null
Binary files differ
diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png.import
deleted file mode 100644
index efd960c..0000000
--- a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bdbqiceo0p121"
-path="res://.godot/imported/Test1.png-116dc7985045e1cdc2a9599a74b4b18e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://resource/map/tileSet/TileSet1/Test1.png"
-dest_files=["res://.godot/imported/Test1.png-116dc7985045e1cdc2a9599a74b4b18e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json
index d71c243..5bb1ccf 100644
--- a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json
+++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json
@@ -2,300 +2,225 @@
   "Name": "TileSet1",
   "Sources": [
     {
-      "Name": "Test1",
-      "SourcePath": "resource/map/tileSet/TileSet1/Test1.png",
+      "Name": "Main",
+      "SourcePath": "resource/map/tileSet/TileSet1/Main.png",
       "Terrain": {
-        "_f": [
-          0,
-          64
-        ],
-        "_vl": [
-          16,
-          64
-        ],
-        "_vc": [
-          32,
-          64
-        ],
-        "_vr": [
-          48,
-          64
-        ],
-        "_vs": [
-          64,
-          64
-        ],
-        "_000_010_010": [
-          0,
-          0
-        ],
-        "_010_010_010": [
-          0,
-          16
-        ],
-        "_010_010_000": [
-          0,
-          32
-        ],
-        "_000_010_000": [
-          0,
-          48
-        ],
-        "_000_011_010": [
-          16,
-          0
-        ],
-        "_010_011_010": [
-          16,
-          16
-        ],
-        "_010_011_000": [
-          16,
-          32
-        ],
-        "_000_011_000": [
-          16,
-          48
-        ],
-        "_000_111_010": [
-          32,
-          0
-        ],
-        "_010_111_010": [
-          32,
-          16
-        ],
-        "_010_111_000": [
-          32,
-          32
-        ],
-        "_000_111_000": [
-          32,
-          48
-        ],
-        "_000_110_010": [
-          48,
-          0
-        ],
-        "_010_110_010": [
-          48,
-          16
-        ],
-        "_010_110_000": [
-          48,
-          32
-        ],
-        "_000_110_000": [
-          48,
-          48
-        ],
-        "_110_111_010": [
-          64,
-          0
-        ],
-        "_010_011_011": [
-          64,
-          16
-        ],
-        "_011_011_010": [
-          64,
-          32
-        ],
-        "_010_111_110": [
-          64,
-          48
-        ],
-        "_000_111_011": [
-          80,
-          0
-        ],
-        "_011_111_111": [
-          80,
-          16
-        ],
-        "_111_111_011": [
-          80,
-          32
-        ],
-        "_011_111_000": [
-          80,
-          48
-        ],
-        "_000_111_110": [
-          96,
-          0
-        ],
-        "_110_111_111": [
-          96,
-          16
-        ],
-        "_111_111_110": [
-          96,
-          32
-        ],
-        "_110_111_000": [
-          96,
-          48
-        ],
-        "_011_111_010": [
-          112,
-          0
-        ],
-        "_010_110_110": [
-          112,
-          16
-        ],
-        "_110_110_010": [
-          112,
-          32
-        ],
-        "_010_111_011": [
-          112,
-          48
-        ],
-        "_000_011_011": [
-          128,
-          0
-        ],
-        "_011_011_011": [
-          128,
-          16
-        ],
-        "_011_111_011": [
-          128,
-          32
-        ],
-        "_011_011_000": [
-          128,
-          48
-        ],
-        "_010_111_111": [
-          144,
-          0
-        ],
-        "_110_111_011": [
-          160,
-          32
-        ],
-        "_111_111_111": [
-          144,
-          32
-        ],
-        "_111_111_000": [
-          144,
-          48
-        ],
-        "_000_111_111": [
-          160,
-          0
-        ],
-        "_011_111_110": [
-          144,
-          16
-        ],
-        "_111_111_010": [
-          160,
-          48
-        ],
-        "_000_110_110": [
-          176,
-          0
-        ],
-        "_110_111_110": [
-          176,
-          16
-        ],
-        "_110_110_110": [
-          176,
-          32
-        ],
-        "_110_110_000": [
-          176,
-          48
-        ]
-      },
-      "Combination": [
-        {
-          "Id": "638402348017543119",
-          "Name": "\u5899\u58C1",
-          "Cells": [
-            {
-              "X": 16,
-              "Y": 64
-            },
-            {
-              "X": 32,
-              "Y": 64
-            },
-            {
-              "X": 48,
-              "Y": 64
-            },
-            {
-              "X": 48,
-              "Y": 48
-            },
-            {
-              "X": 32,
-              "Y": 48
-            },
-            {
-              "X": 16,
-              "Y": 48
-            }
-          ],
-          "Positions": [
-            {
-              "X": 0,
-              "Y": 16
-            },
-            {
-              "X": 16,
-              "Y": 16
-            },
-            {
-              "X": 32,
-              "Y": 16
-            },
-            {
-              "X": 32,
-              "Y": 0
-            },
-            {
-              "X": 16,
-              "Y": 0
-            },
-            {
-              "X": 0,
-              "Y": 0
-            }
+        "F": {
+          "0": [
+            0,
+            64
           ]
         },
-        {
-          "Id": "638402348110507844",
-          "Name": "\u5899\u58C12",
-          "Cells": [
-            {
-              "X": 0,
-              "Y": 48
-            },
-            {
-              "X": 64,
-              "Y": 64
-            }
+        "M": {
+          "1": [
+            16,
+            64
           ],
-          "Positions": [
-            {
-              "X": 0,
-              "Y": 0
-            },
-            {
-              "X": 0,
-              "Y": 16
-            }
+          "2": [
+            32,
+            64
+          ],
+          "3": [
+            48,
+            64
+          ],
+          "0": [
+            64,
+            64
+          ]
+        },
+        "T": {
+          "144": [
+            0,
+            0
+          ],
+          "216": [
+            176,
+            0
+          ],
+          "27": [
+            176,
+            48
+          ],
+          "146": [
+            0,
+            16
+          ],
+          "18": [
+            0,
+            32
+          ],
+          "16": [
+            0,
+            48
+          ],
+          "48": [
+            16,
+            48
+          ],
+          "56": [
+            32,
+            48
+          ],
+          "24": [
+            48,
+            48
+          ],
+          "250": [
+            64,
+            48
+          ],
+          "62": [
+            80,
+            48
+          ],
+          "59": [
+            96,
+            48
+          ],
+          "442": [
+            112,
+            48
+          ],
+          "54": [
+            128,
+            48
+          ],
+          "63": [
+            144,
+            48
+          ],
+          "191": [
+            160,
+            48
+          ],
+          "219": [
+            176,
+            32
+          ],
+          "251": [
+            176,
+            16
+          ],
+          "504": [
+            160,
+            0
+          ],
+          "506": [
+            144,
+            0
+          ],
+          "432": [
+            128,
+            0
+          ],
+          "438": [
+            128,
+            16
+          ],
+          "446": [
+            128,
+            32
+          ],
+          "443": [
+            144,
+            16
+          ],
+          "511": [
+            144,
+            32
+          ],
+          "254": [
+            160,
+            32
+          ],
+          "190": [
+            112,
+            0
+          ],
+          "218": [
+            112,
+            16
+          ],
+          "155": [
+            112,
+            32
+          ],
+          "255": [
+            96,
+            32
+          ],
+          "447": [
+            80,
+            32
+          ],
+          "510": [
+            80,
+            16
+          ],
+          "507": [
+            96,
+            16
+          ],
+          "248": [
+            96,
+            0
+          ],
+          "440": [
+            80,
+            0
+          ],
+          "187": [
+            64,
+            0
+          ],
+          "434": [
+            64,
+            16
+          ],
+          "182": [
+            64,
+            32
+          ],
+          "176": [
+            16,
+            0
+          ],
+          "178": [
+            16,
+            16
+          ],
+          "50": [
+            16,
+            32
+          ],
+          "58": [
+            32,
+            32
+          ],
+          "26": [
+            48,
+            32
+          ],
+          "184": [
+            32,
+            0
+          ],
+          "152": [
+            48,
+            0
+          ],
+          "154": [
+            48,
+            16
+          ],
+          "186": [
+            32,
+            16
           ]
         }
-      ]
+      },
+      "Combination": []
     }
   ]
 }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSourceInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSourceInfo.cs
index a6f9f88..76f3917 100644
--- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSourceInfo.cs
+++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSourceInfo.cs
@@ -44,6 +44,7 @@
     public void InitData()
     {
         Terrain = new TileSetTerrainInfo();
+        Terrain.InitData();
         Combination = new List<TileCombinationInfo>();
     }
     
diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs
index 753ec10..d0ee602 100644
--- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs
+++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs
@@ -125,8 +125,19 @@
                     }
                 }
                 
+                var terrainInfo = tileSetSourceInfo.Terrain;
                 //初始化地形
-                tileSetAtlasSource.InitTerrain(tileSetSourceInfo.Terrain);
+                tileSetAtlasSource.InitTerrain(terrainInfo, 0, 0);
+                //ySort
+                var index = terrainInfo.TerrainCoordsToIndex(new Vector2I(0, 2));
+                if (terrainInfo.T.TryGetValue(index, out var value))
+                {
+                    var pos = terrainInfo.GetPosition(value);
+                    var tileData = tileSetAtlasSource.GetTileData(pos, 0);
+                    tileData.YSortOrigin = 23;
+                }
+                
+                //碰撞器
                 
                 _tileSet.AddSource(tileSetAtlasSource);
             }
diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs
index 53a6cb6..63a1bfa 100644
--- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs
+++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs
@@ -1,4 +1,5 @@
 
+using System.Collections.Generic;
 using System.Text.Json.Serialization;
 using Godot;
 
@@ -8,191 +9,548 @@
 public class TileSetTerrainInfo : IClone<TileSetTerrainInfo>
 {
     //---------------------- 地板 ----------------------
-    
-    [JsonInclude] public int[] _f;
+
+    [JsonInclude] public Dictionary<uint, int[]> F;
     
     //---------------------- 侧方墙壁 --------------------------
     
-    [JsonInclude] public int[] _vl;
-    [JsonInclude] public int[] _vc;
-    [JsonInclude] public int[] _vr;
-    [JsonInclude] public int[] _vs;
+    [JsonInclude] public Dictionary<uint, int[]> M;
     
     //---------------------- 顶部墙壁47格 ----------------------
     
-    //第一列
-    [JsonInclude] public int[] _000_010_010;
-    [JsonInclude] public int[] _010_010_010;
-    [JsonInclude] public int[] _010_010_000;
+    [JsonInclude] public Dictionary<uint, int[]> T;
 
-    [JsonInclude] public int[] _000_010_000;
+    public void InitData()
+    {
+        T = new Dictionary<uint, int[]>();
+        M = new Dictionary<uint, int[]>();
+        F = new Dictionary<uint, int[]>();
+    }
 
-    //第二列
-    [JsonInclude] public int[] _000_011_010;
-    [JsonInclude] public int[] _010_011_010;
-    [JsonInclude] public int[] _010_011_000;
-
-    [JsonInclude] public int[] _000_011_000;
-
-    //第三列
-    [JsonInclude] public int[] _000_111_010;
-    [JsonInclude] public int[] _010_111_010;
-    [JsonInclude] public int[] _010_111_000;
-
-    [JsonInclude] public int[] _000_111_000;
-
-    //第四列
-    [JsonInclude] public int[] _000_110_010;
-    [JsonInclude] public int[] _010_110_010;
-    [JsonInclude] public int[] _010_110_000;
-
-    [JsonInclude] public int[] _000_110_000;
-
-    //第五列
-    [JsonInclude] public int[] _110_111_010;
-    [JsonInclude] public int[] _010_011_011;
-    [JsonInclude] public int[] _011_011_010;
-
-    [JsonInclude] public int[] _010_111_110;
-
-    //第六列
-    [JsonInclude] public int[] _000_111_011;
-    [JsonInclude] public int[] _011_111_111;
-    [JsonInclude] public int[] _111_111_011;
-
-    [JsonInclude] public int[] _011_111_000;
-
-    //第七列
-    [JsonInclude] public int[] _000_111_110;
-    [JsonInclude] public int[] _110_111_111;
-    [JsonInclude] public int[] _111_111_110;
-
-    [JsonInclude] public int[] _110_111_000;
-
-    //第八列
-    [JsonInclude] public int[] _011_111_010;
-    [JsonInclude] public int[] _010_110_110;
-    [JsonInclude] public int[] _110_110_010;
-
-    [JsonInclude] public int[] _010_111_011;
-
-    //第九列
-    [JsonInclude] public int[] _000_011_011;
-    [JsonInclude] public int[] _011_011_011;
-    [JsonInclude] public int[] _011_111_011;
-
-    [JsonInclude] public int[] _011_011_000;
-
-    //第十列
-    [JsonInclude] public int[] _010_111_111;
-    [JsonInclude] public int[] _110_111_011;
-    [JsonInclude] public int[] _111_111_111;
-
-    [JsonInclude] public int[] _111_111_000;
-
-    //第十一列
-    [JsonInclude] public int[] _000_111_111;
-    [JsonInclude] public int[] _011_111_110;
-
-    [JsonInclude] public int[] _111_111_010;
-
-    //第十二列
-    [JsonInclude] public int[] _000_110_110;
-    [JsonInclude] public int[] _110_111_110;
-    [JsonInclude] public int[] _110_110_110;
-    [JsonInclude] public int[] _110_110_000;
-
+    /// <summary>
+    /// 将存储的坐标数据转换成 Vector2I 对象, 返回的 Vector2I 单位: 格
+    /// </summary>
     public Vector2I GetPosition(int[] ints)
     {
-        return new Vector2I(ints[0], ints[1]);
+        return new Vector2I(ints[0] / GameConfig.TileCellSize, ints[1] / GameConfig.TileCellSize);
+    }
+    
+    public uint TerrainCoordsToIndex(Vector2I coords)
+    {
+        return (uint)(coords.Y * GameConfig.TerrainBitSize1.X + coords.X);
     }
 
     public TileSetTerrainInfo Clone()
     {
         var terrainInfo = new TileSetTerrainInfo();
-        if (_f != null) terrainInfo._f = new[] { _f[0], _f[1] };
-
-        // 地板
-        terrainInfo._f = (_f != null) ? new[] { _f[0], _f[1] } : null;
-
-        // 侧方墙壁
-        terrainInfo._vl = (_vl != null) ? new[] { _vl[0], _vl[1] } : null;
-        terrainInfo._vc = (_vc != null) ? new[] { _vc[0], _vc[1] } : null;
-        terrainInfo._vr = (_vr != null) ? new[] { _vr[0], _vr[1] } : null;
-        terrainInfo._vs = (_vs != null) ? new[] { _vs[0], _vs[1] } : null;
-
-        // 顶部墙壁47格
-        // 第一列
-        terrainInfo._000_010_010 = (_000_010_010 != null) ? new[] { _000_010_010[0], _000_010_010[1] } : null;
-        terrainInfo._010_010_010 = (_010_010_010 != null) ? new[] { _010_010_010[0], _010_010_010[1] } : null;
-        terrainInfo._010_010_000 = (_010_010_000 != null) ? new[] { _010_010_000[0], _010_010_000[1] } : null;
-        terrainInfo._000_010_000 = (_000_010_000 != null) ? new[] { _000_010_000[0], _000_010_000[1] } : null;
-
-        // 第二列
-        terrainInfo._000_011_010 = (_000_011_010 != null) ? new[] { _000_011_010[0], _000_011_010[1] } : null;
-        terrainInfo._010_011_010 = (_010_011_010 != null) ? new[] { _010_011_010[0], _010_011_010[1] } : null;
-        terrainInfo._010_011_000 = (_010_011_000 != null) ? new[] { _010_011_000[0], _010_011_000[1] } : null;
-        terrainInfo._000_011_000 = (_000_011_000 != null) ? new[] { _000_011_000[0], _000_011_000[1] } : null;
-        
-        // 第三列
-        terrainInfo._000_111_010 = (_000_111_010 != null) ? new[] { _000_111_010[0], _000_111_010[1] } : null;
-        terrainInfo._010_111_010 = (_010_111_010 != null) ? new[] { _010_111_010[0], _010_111_010[1] } : null;
-        terrainInfo._010_111_000 = (_010_111_000 != null) ? new[] { _010_111_000[0], _010_111_000[1] } : null;
-        terrainInfo._000_111_000 = (_000_111_000 != null) ? new[] { _000_111_000[0], _000_111_000[1] } : null;
-        
-        // 第四列
-        terrainInfo._000_110_010 = (_000_110_010 != null) ? new[] { _000_110_010[0], _000_110_010[1] } : null;
-        terrainInfo._010_110_010 = (_010_110_010 != null) ? new[] { _010_110_010[0], _010_110_010[1] } : null;
-        terrainInfo._010_110_000 = (_010_110_000 != null) ? new[] { _010_110_000[0], _010_110_000[1] } : null;
-        terrainInfo._000_110_000 = (_000_110_000 != null) ? new[] { _000_110_000[0], _000_110_000[1] } : null;
-        
-        // 第五列
-        terrainInfo._110_111_010 = (_110_111_010 != null) ? new[] { _110_111_010[0], _110_111_010[1] } : null;
-        terrainInfo._010_011_011 = (_010_011_011 != null) ? new[] { _010_011_011[0], _010_011_011[1] } : null;
-        terrainInfo._011_011_010 = (_011_011_010 != null) ? new[] { _011_011_010[0], _011_011_010[1] } : null;
-        terrainInfo._010_111_110 = (_010_111_110 != null) ? new[] { _010_111_110[0], _010_111_110[1] } : null;
-        
-        // 第六列
-        terrainInfo._000_111_011 = (_000_111_011 != null) ? new[] { _000_111_011[0], _000_111_011[1] } : null;
-        terrainInfo._011_111_111 = (_011_111_111 != null) ? new[] { _011_111_111[0], _011_111_111[1] } : null;
-        terrainInfo._111_111_011 = (_111_111_011 != null) ? new[] { _111_111_011[0], _111_111_011[1] } : null;
-        terrainInfo._011_111_000 = (_011_111_000 != null) ? new[] { _011_111_000[0], _011_111_000[1] } : null;
-        
-        // 第七列
-        terrainInfo._000_111_110 = (_000_111_110 != null) ? new[] { _000_111_110[0], _000_111_110[1] } : null;
-        terrainInfo._110_111_111 = (_110_111_111 != null) ? new[] { _110_111_111[0], _110_111_111[1] } : null;
-        terrainInfo._111_111_110 = (_111_111_110 != null) ? new[] { _111_111_110[0], _111_111_110[1] } : null;
-        terrainInfo._110_111_000 = (_110_111_000 != null) ? new[] { _110_111_000[0], _110_111_000[1] } : null;
-        
-        // 第八列
-        terrainInfo._011_111_010 = (_011_111_010 != null) ? new[] { _011_111_010[0], _011_111_010[1] } : null;
-        terrainInfo._010_110_110 = (_010_110_110 != null) ? new[] { _010_110_110[0], _010_110_110[1] } : null;
-        terrainInfo._110_110_010 = (_110_110_010 != null) ? new[] { _110_110_010[0], _110_110_010[1] } : null;
-        terrainInfo._010_111_011 = (_010_111_011 != null) ? new[] { _010_111_011[0], _010_111_011[1] } : null;
-        
-        // 第九列
-        terrainInfo._000_011_011 = (_000_011_011 != null) ? new[] { _000_011_011[0], _000_011_011[1] } : null;
-        terrainInfo._011_011_011 = (_011_011_011 != null) ? new[] { _011_011_011[0], _011_011_011[1] } : null;
-        terrainInfo._011_111_011 = (_011_111_011 != null) ? new[] { _011_111_011[0], _011_111_011[1] } : null;
-        terrainInfo._011_011_000 = (_011_011_000 != null) ? new[] { _011_011_000[0], _011_011_000[1] } : null;
-        
-        // 第十列
-        terrainInfo._010_111_111 = (_010_111_111 != null) ? new[] { _010_111_111[0], _010_111_111[1] } : null;
-        terrainInfo._110_111_011 = (_110_111_011 != null) ? new[] { _110_111_011[0], _110_111_011[1] } : null;
-        terrainInfo._111_111_111 = (_111_111_111 != null) ? new[] { _111_111_111[0], _111_111_111[1] } : null;
-        terrainInfo._111_111_000 = (_111_111_000 != null) ? new[] { _111_111_000[0], _111_111_000[1] } : null;
-        
-        // 第十一列
-        terrainInfo._000_111_111 = (_000_111_111 != null) ? new[] { _000_111_111[0], _000_111_111[1] } : null;
-        terrainInfo._011_111_110 = (_011_111_110 != null) ? new[] { _011_111_110[0], _011_111_110[1] } : null;
-        terrainInfo._111_111_010 = (_111_111_010 != null) ? new[] { _111_111_010[0], _111_111_010[1] } : null;
-        
-        // 第十二列
-        terrainInfo._000_110_110 = (_000_110_110 != null) ? new[] { _000_110_110[0], _000_110_110[1] } : null;
-        terrainInfo._110_111_110 = (_110_111_110 != null) ? new[] { _110_111_110[0], _110_111_110[1] } : null;
-        terrainInfo._110_110_110 = (_110_110_110 != null) ? new[] { _110_110_110[0], _110_110_110[1] } : null;
-        terrainInfo._110_110_000 = (_110_110_000 != null) ? new[] { _110_110_000[0], _110_110_000[1] } : null;
-        
+        terrainInfo.InitData();
+        foreach (var pair in T)
+        {
+            terrainInfo.T.Add(pair.Key, new []{ pair.Value[0], pair.Value[1] });
+        }
+        foreach (var pair in M)
+        {
+            terrainInfo.M.Add(pair.Key, new []{ pair.Value[0], pair.Value[1] });
+        }
+        foreach (var pair in F)
+        {
+            terrainInfo.F.Add(pair.Key, new []{ pair.Value[0], pair.Value[1] });
+        }
         return terrainInfo;
     }
+    
+    /// <summary>
+    /// 将地形掩码存入 TileSetTerrainInfo 中
+    /// </summary>
+    public void SetTerrainBit(int index, byte type, int[] cellData)
+    {
+        if (type == 1) //顶部墙壁
+        {
+            switch (index)
+            {
+                case 0: T[TerrainPeering.Center| TerrainPeering.Bottom] = cellData; break;
+                case 1: T[TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 2: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 3: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom] = cellData; break;
+                case 4: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 5: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 6: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 7: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 8: T[TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 9: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 10: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 11: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 12: T[TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Bottom] = cellData; break;
+                case 13: T[TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 14: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;      
+                case 15: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom] = cellData; break;
+                case 16: T[TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 17: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 18: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 19: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break; 
+                case 20: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 21: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 22: break;
+                case 23: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 24: T[TerrainPeering.Top| TerrainPeering.Center] = cellData; break;
+                case 25: T[TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 26: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 27: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center] = cellData; break;
+                case 28: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;  
+                case 29: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 30: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 31: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom] = cellData; break;
+                case 32: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 33: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 34: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 35: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 36: T[TerrainPeering.Center] = cellData; break;
+                case 37: T[TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 38: T[TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 39: T[TerrainPeering.Left| TerrainPeering.Center] = cellData; break;
+                case 40: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom] = cellData; break;
+                case 41: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;    
+                case 42: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;     
+                case 43: T[TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom] = cellData; break;
+                case 44: T[TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 45: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right] = cellData; break;
+                case 46: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom] = cellData; break;
+                case 47: T[TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center] = cellData; break;
+            }
+        }
+        else if (type == 2) //侧方墙壁
+        {
+            switch (index)
+            {
+                case 0: M[0] = cellData; break;
+                case 1: M[1] = cellData; break;
+                case 2: M[2] = cellData; break;
+                case 3: M[3] = cellData; break;
+            }
+        }
+        else if (type == 3) //地板
+        {
+            F[0] = cellData;
+        }
+    }
+    
+    /// <summary>
+    /// 获取指定索引的地形掩码存储的数据
+    /// </summary>
+    public int[] GetTerrainBit(int index, byte type)
+    {
+        if (type == 1) //顶部墙壁
+        {
+            switch (index)
+            {
+                case 0:
+                {
+                    if (T.TryGetValue(TerrainPeering.Center | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 1:
+                {
+                    if (T.TryGetValue(TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 2:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 3:
+                {
+                    if (T.TryGetValue(TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 4:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 5:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 6:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 7:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 8:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 9:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 10:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 11:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.LeftBottom |
+                            TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 12:
+                {
+                    if (T.TryGetValue(TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 13:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 14:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 15:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 16:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 17:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 18:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 19:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var
+                                cellData))
+                        return cellData;
+                }
+                    break;
+                case 20:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 21:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 22:
+                    break;
+                case 23:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 24:
+                {
+                    if (T.TryGetValue(TerrainPeering.Top | TerrainPeering.Center, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 25:
+                {
+                    if (T.TryGetValue(TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 26:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 27:
+                {
+                    if (T.TryGetValue(TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 28:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 29:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop |
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom |
+                            TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 30:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop |
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 31:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 32:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 33:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop |
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 34:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 35:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 36:
+                {
+                    if (T.TryGetValue(TerrainPeering.Center, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 37:
+                {
+                    if (T.TryGetValue(TerrainPeering.Center | TerrainPeering.Right, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 38:
+                {
+                    if (T.TryGetValue(TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 39:
+                {
+                    if (T.TryGetValue(TerrainPeering.Left | TerrainPeering.Center, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 40:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.LeftBottom | TerrainPeering.Bottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 41:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 42:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center |
+                            TerrainPeering.Right, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 43:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right |
+                            TerrainPeering.Bottom | TerrainPeering.RightBottom, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 44:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center | TerrainPeering.Right,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 45:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop |
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right, out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 46:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop |
+                            TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+                case 47:
+                {
+                    if (T.TryGetValue(
+                            TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center,
+                            out var cellData))
+                        return cellData;
+                }
+                    break;
+            }
+        }
+        else if (type == 2) //侧方墙壁
+        {
+            switch (index)
+            {
+                case 0:
+                {
+                    if (M.TryGetValue(0, out var cellData)) return cellData;
+                }
+                    break;
+                case 1:
+                {
+                    if (M.TryGetValue(1, out var cellData)) return cellData;
+                }
+                    break;
+                case 2:
+                {
+                    if (M.TryGetValue(2, out var cellData)) return cellData;
+                }
+                    break;
+                case 3:
+                {
+                    if (M.TryGetValue(3, out var cellData)) return cellData;
+                }
+                    break;
+            }
+        }
+        else if (type == 3) //地板
+        {
+            if (F.TryGetValue(0, out var cellData)) return cellData;
+        }
+
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/tileSet/TerrainPeering.cs b/DungeonShooting_Godot/src/framework/map/tileSet/TerrainPeering.cs
index e6f73fe..073464a 100644
--- a/DungeonShooting_Godot/src/framework/map/tileSet/TerrainPeering.cs
+++ b/DungeonShooting_Godot/src/framework/map/tileSet/TerrainPeering.cs
@@ -77,8 +77,51 @@
         return None;
     }
 
-    public static void InitTerrain(this TileSetAtlasSource atlasSource, TileSetTerrainInfo terrainInfo)
+    /// <summary>
+    /// 将地形掩码数据设置到 TileSetAtlasSource 中
+    /// </summary>
+    public static void InitTerrain(this TileSetAtlasSource atlasSource, TileSetTerrainInfo terrainInfo, int terrainSet, int terrain)
     {
-        //terrainInfo._000_110_010
+        foreach (var keyValuePair in terrainInfo.T)
+        {
+            var pos = terrainInfo.GetPosition(keyValuePair.Value);
+            var tileData = atlasSource.GetTileData(pos, 0);
+            tileData.TerrainSet = terrainSet;
+            tileData.Terrain = terrain;
+            
+            var bit = keyValuePair.Key;
+            if ((bit & LeftTop) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner, 0);
+            }
+            if ((bit & Top) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopSide, 0);
+            }
+            if ((bit & RightTop) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner, 0);
+            }
+            if ((bit & Left) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide, 0);
+            }
+            if ((bit & Right) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.RightSide, 0);
+            }
+            if ((bit & LeftBottom) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner, 0);
+            }
+            if ((bit & Bottom) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide, 0);
+            }
+            if ((bit & RightBottom) != 0)
+            {
+                tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner, 0);
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs b/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs
index f59fae2..430ec3b 100644
--- a/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs
+++ b/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs
@@ -24,194 +24,12 @@
 #if TOOLS
         CustomTileSetPath = GameConfig.RoomTileSetDir;
 #else
-        CustomMapPath = GameConfig.RoomTileSetDir;
+        CustomTileSetPath = GameConfig.RoomTileSetDir;
 #endif
         EventManager.AddEventListener(EventEnum.OnTileSetSave, OnTileSetSave);
     }
 
     /// <summary>
-    /// 将地形掩码存入 TileSetTerrainInfo 中
-    /// </summary>
-    public static void SetTileSetTerrainBit(TileSetTerrainInfo terrain, int index, byte type, int[] cellData)
-    {
-        if (type == 1) //顶部墙壁
-        {
-            switch (index)
-            {
-                //第一排
-                case 0: terrain._000_010_010 = cellData; break;
-                case 1: terrain._000_011_010 = cellData; break;
-                case 2: terrain._000_111_010 = cellData; break;
-                case 3: terrain._000_110_010 = cellData; break;
-                
-                case 4: terrain._110_111_010 = cellData; break;
-                case 5: terrain._000_111_011 = cellData; break;
-                case 6: terrain._000_111_110 = cellData; break;
-                case 7: terrain._011_111_010 = cellData; break;
-                
-                case 8: terrain._000_011_011 = cellData; break;
-                case 9: terrain._010_111_111 = cellData; break;
-                case 10: terrain._000_111_111 = cellData; break;
-                case 11: terrain._000_110_110 = cellData; break;
-                
-                //第二排
-                case 12: terrain._010_010_010 = cellData; break;
-                case 13: terrain._010_011_010 = cellData; break;
-                case 14: terrain._010_111_010 = cellData; break;
-                case 15: terrain._010_110_010 = cellData; break;
-                
-                case 16: terrain._010_011_011 = cellData; break;
-                case 17: terrain._011_111_111 = cellData; break;
-                case 18: terrain._110_111_111 = cellData; break;
-                case 19: terrain._010_110_110 = cellData; break;
-                
-                case 20: terrain._011_011_011 = cellData; break;
-                case 21: terrain._011_111_110 = cellData; break;
-                case 22: break;
-                case 23: terrain._110_111_110 = cellData; break;
-                
-                //第三排
-                case 24: terrain._010_010_000 = cellData; break;
-                case 25: terrain._010_011_000 = cellData; break;
-                case 26: terrain._010_111_000 = cellData; break;
-                case 27: terrain._010_110_000 = cellData; break;
-                
-                case 28: terrain._011_011_010 = cellData; break;
-                case 29: terrain._111_111_011 = cellData; break;
-                case 30: terrain._111_111_110 = cellData; break;
-                case 31: terrain._110_110_010 = cellData; break;
-                
-                case 32: terrain._011_111_011 = cellData; break;
-                case 33: terrain._111_111_111 = cellData; break;
-                case 34: terrain._110_111_011 = cellData; break;
-                case 35: terrain._110_110_110 = cellData; break;
-                
-                //第四排
-                case 36: terrain._000_010_000 = cellData; break;
-                case 37: terrain._000_011_000 = cellData; break;
-                case 38: terrain._000_111_000 = cellData; break;
-                case 39: terrain._000_110_000 = cellData; break;
-                
-                case 40: terrain._010_111_110 = cellData; break;
-                case 41: terrain._011_111_000 = cellData; break;
-                case 42: terrain._110_111_000 = cellData; break;
-                case 43: terrain._010_111_011 = cellData; break;
-                
-                case 44: terrain._011_011_000 = cellData; break;
-                case 45: terrain._111_111_000 = cellData; break;
-                case 46: terrain._111_111_010 = cellData; break;
-                case 47: terrain._110_110_000 = cellData; break;
-            }
-        }
-        else if (type == 2) //侧方墙壁
-        {
-            switch (index)
-            {
-                case 0: terrain._vs = cellData; break;
-                case 1: terrain._vl = cellData; break;
-                case 2: terrain._vc = cellData; break;
-                case 3: terrain._vr = cellData; break;
-            }
-        }
-        else if (type == 3) //地板
-        {
-            terrain._f = cellData;
-        }
-    }
-
-    /// <summary>
-    /// 获取指定索引的地形掩码存储的数据
-    /// </summary>
-    public static int[] GetTileSetTerrainBit(TileSetTerrainInfo terrain, int index, byte type)
-    {
-        if (type == 1) //顶部墙壁
-        {
-            switch (index)
-            {
-                //第一排
-                case 0: return terrain._000_010_010;
-                case 1: return terrain._000_011_010;
-                case 2: return terrain._000_111_010;
-                case 3: return terrain._000_110_010;
-                
-                case 4: return terrain._110_111_010;
-                case 5: return terrain._000_111_011;
-                case 6: return terrain._000_111_110;
-                case 7: return terrain._011_111_010;
-                
-                case 8: return terrain._000_011_011;
-                case 9: return terrain._010_111_111;
-                case 10: return terrain._000_111_111;
-                case 11: return terrain._000_110_110;
-                
-                //第二排
-                case 12: return terrain._010_010_010;
-                case 13: return terrain._010_011_010;
-                case 14: return terrain._010_111_010;
-                case 15: return terrain._010_110_010;
-                
-                case 16: return terrain._010_011_011;
-                case 17: return terrain._011_111_111;
-                case 18: return terrain._110_111_111;
-                case 19: return terrain._010_110_110;
-                
-                case 20: return terrain._011_011_011;
-                case 21: return terrain._011_111_110;
-                case 22: break;
-                case 23: return terrain._110_111_110;
-                
-                //第三排
-                case 24: return terrain._010_010_000;
-                case 25: return terrain._010_011_000;
-                case 26: return terrain._010_111_000;
-                case 27: return terrain._010_110_000;
-                
-                case 28: return terrain._011_011_010;
-                case 29: return terrain._111_111_011;
-                case 30: return terrain._111_111_110;
-                case 31: return terrain._110_110_010;
-                
-                case 32: return terrain._011_111_011;
-                case 33: return terrain._111_111_111;
-                case 34: return terrain._110_111_011;
-                case 35: return terrain._110_110_110;
-                
-                //第四排
-                case 36: return terrain._000_010_000;
-                case 37: return terrain._000_011_000;
-                case 38: return terrain._000_111_000;
-                case 39: return terrain._000_110_000;
-                
-                case 40: return terrain._010_111_110;
-                case 41: return terrain._011_111_000;
-                case 42: return terrain._110_111_000;
-                case 43: return terrain._010_111_011;
-                
-                case 44: return terrain._011_011_000;
-                case 45: return terrain._111_111_000;
-                case 46: return terrain._111_111_010;
-                case 47: return terrain._110_110_000;
-            }
-        }
-        else if (type == 2) //侧方墙壁
-        {
-            switch (index)
-            {
-                case 0: return terrain._vs;
-                case 1: return terrain._vl;
-                case 2: return terrain._vc;
-                case 3: return terrain._vr;
-            }
-        }
-        else if (type == 3) //地板
-        {
-            return terrain._f;
-        }
-
-        return null;
-    }
-
-    /// <summary>
     /// 保存TileSetConfig数据
     /// </summary>
     public static void SaveTileSetConfig()
diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs
index 1b87644..3e92f1b 100644
--- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs
+++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs
@@ -85,7 +85,7 @@
             var terrain = ((TileSetSourceInfo)obj).Terrain;
             _topGrid1.ForEach(cell =>
             {
-                var ints = EditorTileSetManager.GetTileSetTerrainBit(terrain, cell.Index, cell.Data);
+                var ints = terrain.GetTerrainBit( cell.Index, cell.Data);
                 if (ints != null)
                 {
                     cell.CellNode.Instance.SetCell(new Rect2I(ints[0], ints[1], GameConfig.TileCellSize, GameConfig.TileCellSize));
@@ -93,7 +93,7 @@
             });
             _topGrid2.ForEach(cell =>
             {
-                var ints = EditorTileSetManager.GetTileSetTerrainBit(terrain, cell.Index, cell.Data);
+                var ints = terrain.GetTerrainBit(cell.Index, cell.Data);
                 if (ints != null)
                 {
                     cell.CellNode.Instance.SetCell(new Rect2I(ints[0], ints[1], GameConfig.TileCellSize, GameConfig.TileCellSize));
@@ -101,7 +101,7 @@
             });
             _topGrid3.ForEach(cell =>
             {
-                var ints = EditorTileSetManager.GetTileSetTerrainBit(terrain, cell.Index, cell.Data);
+                var ints = terrain.GetTerrainBit( cell.Index, cell.Data);
                 if (ints != null)
                 {
                     cell.CellNode.Instance.SetCell(new Rect2I(ints[0], ints[1], GameConfig.TileCellSize, GameConfig.TileCellSize));
diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs
index 68bfe41..7427078 100644
--- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs
+++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs
@@ -74,7 +74,7 @@
 
     private void SetTerrainBitData(int[] cellData)
     {
-        EditorTileSetManager.SetTileSetTerrainBit(_panel.EditorPanel.TileSetSourceInfo.Terrain, _cell.Index, _cell.Data, cellData);
+        _panel.EditorPanel.TileSetSourceInfo.Terrain.SetTerrainBit(_cell.Index, _cell.Data, cellData);
         EventManager.EmitEvent(EventEnum.OnTileSetDirty);
     }
 }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs
index a375355..2f87a29 100644
--- a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs
+++ b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs
@@ -1,12 +1,12 @@
 using Godot;
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Text.Json;
+using Godot.Collections;
 
 public partial class TestLoadTileSetConfig : Node2D
 {
-    private Dictionary<string, TileSetSplit> _tileSetConfig;
+    private System.Collections.Generic.Dictionary<string, TileSetSplit> _tileSetConfig;
     private TileMap _tileMap;
     
     public override void _Ready()
@@ -19,6 +19,13 @@
         _tileMap.TileSet = tileSet;
         
         _tileMap.SetCell(0, new Vector2I(5, 5), 0, new Vector2I(0, 0));
+        _tileMap.SetCellsTerrainConnect(0, new Array<Vector2I>()
+        {
+            new Vector2I(10, 10),
+            new Vector2I(10, 11),
+            new Vector2I(10, 12),
+            new Vector2I(11, 12),
+        }, 0, 0, false);
     }
     
     //初始化TileSet配置
@@ -26,7 +33,7 @@
     {
         //加载房间配置信息
         var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile);
-        _tileSetConfig = JsonSerializer.Deserialize<Dictionary<string, TileSetSplit>>(asText);
+        _tileSetConfig = JsonSerializer.Deserialize<System.Collections.Generic.Dictionary<string, TileSetSplit>>(asText);
 		
         //加载所有数据
         foreach (var tileSetSplit in _tileSetConfig)