diff --git a/.gitignore b/.gitignore index 383ff42..7227cb3 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ /DungeonShooting_ExcelTool/obj /DungeonShooting_ExcelTool/bin /DungeonShooting_Godot/DungeonShooting.sln.DotSettings.user +/DungeonShooting_Godot/.VSCodeCounter +**/*.txt diff --git "a/DungeonShooting_Document/\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/DungeonShooting_Document/\345\274\200\345\217\221\346\227\245\345\277\227.md" index e40e569..63f6444 100644 --- "a/DungeonShooting_Document/\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/DungeonShooting_Document/\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -1,5 +1,51 @@ --- +### 2024-2-25 +游戏正式起名为《枪火地牢》! +项目从4.2升级到4.2.1, 本次更新大量内容, 地牢编辑器2.0, 游戏大厅, 奖励房间, 自定义地牢生成规则, 地牢装饰等, 所以开发周期来到了两个半月 +主要工作内容如下: +* 地牢编辑器2.0正式支持47格Tile的平铺地形, 完整的新增功能: + * 新增TileSet编辑器, 功能如下: + * 导入外部图像, 并进行裁剪 + * 编辑自动平铺地形(2x2, 3x3) + * 编辑图块组合 + * 烘焙静态导航网格 + * TileMap编辑器更新: + * 支持选择TileSet + * 支持在自定义层级绘制图块 + * 支持自由绘制TileSet中的纹理图块 + * 支持绘制TileSet中的自定义平铺地形(2x2, 3x3) + * 支持绘制TileSet中的组合图块 + * 支持配置自动填充数据, 生成怪和奖励交给随机池控制 + * 支持配置随机物体的标记 + * 生成墙壁高度改为2格高 + * 标记物体显示图标 + * 地牢房间管理器更新: + * 支持删除地牢组 + * 删除地牢组/地牢房间添加延时确定, 防止用户误删 + * 创建房间添加默认预设 + * 地牢生成器新功能 + * 生成奖励/商店房间(商店目前只是占位) + * 支持自定义逻辑控制房间生成 + * 随机池功能, 控制整个游戏奖惩 +* 新增5把武器(音效特性还没完全做完) + * P90: 射速高, 弹夹容量大 + * (暂未起名): 发色彩虹子弹 + * M1型热能狙击枪: 发射可反弹和穿透的子弹 + * 左轮: 基础抢, 性能较弱 + * 木质短弓: 蓄力拉弓射击, 箭会插在目标身上, 目标死亡时可回收箭 +* 击杀敌人掉落金币, 玩家会自动拾取金币, Ui血条下方显示金币数量 +* 将excel导出工具执行流程改为先动态编译工具源码在执行, 这样导出工具就不用再打包了 +* 将excel导出工具库依赖改为使用`Aspose.Cells`, 这个库在执行导出excel不会修改excel文件内容, 也就是不会被git侦测到修改 +* 新增`InputAction`, 用于控制用户输入行为 +* 更新门素材 +* 新增游戏大厅流程, 进入游戏首先进入大厅, 在通过大厅的地牢入口进入地牢 +* 修复`UiGrid`和部分Ui会产生游离节点的bug +* 修复Mac运行游戏在敌人死亡时游戏会卡死的bug +* 修复Mac运行游戏地上素材闪烁失帧的bug +* 支持在编辑器中放置`ActivityObject`实例, 通过`ActivityInstance`节点实现 + +--- ### 2023-12-07 项目正式从Godot4.2beta升级到4.2, 这一个半月主要工作内容: * 新增武器: diff --git "a/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview1.png" "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview1.png" new file mode 100644 index 0000000..f75e34b --- /dev/null +++ "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview1.png" Binary files differ diff --git "a/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2.png" "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2.png" new file mode 100644 index 0000000..7b1ff40 --- /dev/null +++ "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2.png" Binary files differ diff --git "a/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2_gif.gif" "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2_gif.gif" new file mode 100644 index 0000000..823b011 --- /dev/null +++ "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview2_gif.gif" Binary files differ diff --git "a/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3.png" "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3.png" new file mode 100644 index 0000000..11458c1 --- /dev/null +++ "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3.png" Binary files differ diff --git "a/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3_gif.gif" "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3_gif.gif" new file mode 100644 index 0000000..7539937 --- /dev/null +++ "b/DungeonShooting_Document/\346\226\207\346\241\243\350\265\204\346\272\220/preview3_gif.gif" Binary files differ diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/NodeMonitor.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/NodeMonitor.cs index 2a62912..cc95225 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/NodeMonitor.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/NodeMonitor.cs @@ -95,7 +95,7 @@ catch (Exception e) { //检查节点存在报错, 直接跳过该节点的检查 - Debug.Log(e.Message); + GD.Print(e.Message); } } @@ -131,7 +131,7 @@ catch (Exception e) { //检查节点存在报错, 直接跳过该节点的检查 - Debug.Log(e.Message); + GD.Print(e.Message); _targetNode = null; } _checkTreeTimer = 0; diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs index 198c613..6e9581b 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs @@ -7,7 +7,7 @@ namespace Plugin { [Tool] - public partial class Plugin : EditorPlugin + public partial class Plugin : EditorPlugin, ISerializationListener { /// /// 自定义节点类型数据 @@ -42,18 +42,12 @@ //自定义节点 private CustomTypeInfo[] _customTypeInfos = new CustomTypeInfo[] { - // new CustomTypeInfo( - // "ActivityMark", - // "Node2D", - // "res://src/framework/map/mark/ActivityMark.cs", - // "res://addons/dungeonShooting_plugin/Mark.svg" - // ), - // new CustomTypeInfo( - // "EnemyMark", - // "Node2D", - // "res://src/framework/map/mark/EnemyMark.cs", - // "res://addons/dungeonShooting_plugin/Mark.svg" - // ), + new CustomTypeInfo( + "ActivityInstance", + "Node2D", + "res://src/framework/activity/ActivityInstance.cs", + "res://addons/dungeonShooting_plugin/Mark.svg" + ), }; public override void _Process(double delta) @@ -68,7 +62,7 @@ { _uiMonitor = new NodeMonitor(); _uiMonitor.SceneNodeChangeEvent += GenerateUiCode; - OnSceneChanged(GetEditorInterface().GetEditedSceneRoot()); + OnSceneChanged(EditorInterface.Singleton.GetEditedSceneRoot()); } } @@ -76,6 +70,8 @@ { Instance = this; + #region MyRegion + if (_customTypeInfos != null) { //注册自定义节点 @@ -95,7 +91,7 @@ } _editorTools = GD.Load(ResourcePath.prefab_ui_EditorTools_tscn).Instantiate(); - var editorMainScreen = GetEditorInterface().GetEditorMainScreen(); + var editorMainScreen = EditorInterface.Singleton.GetEditorMainScreen(); editorMainScreen.AddChild(_editorTools); try @@ -116,15 +112,27 @@ Debug.LogError(e.ToString()); } - _MakeVisible(false); + #endregion + //场景切换事件 SceneChanged += OnSceneChanged; _uiMonitor = new NodeMonitor(); _uiMonitor.SceneNodeChangeEvent += GenerateUiCode; - OnSceneChanged(GetEditorInterface().GetEditedSceneRoot()); + + OnSceneChanged(EditorInterface.Singleton.GetEditedSceneRoot()); + } + + public void OnBeforeSerialize() + { + SceneChanged -= OnSceneChanged; + } + + public void OnAfterDeserialize() + { + SceneChanged += OnSceneChanged; } public override void _ExitTree() @@ -252,7 +260,6 @@ } } } - } } #endif diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ExcelGenerator.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ExcelGenerator.cs index 21df908..9be0e02 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ExcelGenerator.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ExcelGenerator.cs @@ -95,8 +95,18 @@ private static int compilerTool(string csProjectPath, string rid, string outputPath) { //dotnet publish excelTool -c Release -r win-x64 -o ./excelTool/publish/win-x64 + //dotnet publish excelTool -c Release -r osx-x64 -o excelTool/publish/osx-x64 + //dotnet publish excelTool -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -o excelTool/publish/osx-x64 var outLog = new Array(); - var result = OS.Execute("dotnet", new string[] { "publish", csProjectPath, "-c", "Release", "-r", rid, "-o", outputPath }, outLog); + var result = OS.Execute("dotnet", new string[] + { + "publish", csProjectPath, + "-c", "Release", "-r", rid, + "--self-contained", "true", + "-p:PublishSingleFile=true", + "-o", outputPath + }, outLog); + //var result = OS.Execute("dotnet", new string[] { "publish", csProjectPath, "-c", "Release", "-r", rid, "-o", outputPath }, outLog); foreach (var variant in outLog) { GD.Print(variant); diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ResourcePathGenerator.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ResourcePathGenerator.cs index c8f4479..0cf335d 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ResourcePathGenerator.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/ResourcePathGenerator.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using Godot; namespace Generator; @@ -39,12 +40,13 @@ ".git", ".import", ".mono", + ".VSCodeCounter", "android", "addons", ".godot", ".vs", - "resource/map/tiledata", - "resource/map/tileMaps" + "resource/map", + "excelTool" }; private static string resultStr = ""; @@ -65,18 +67,18 @@ "public class ResourcePath\n" + "{\n"; - Debug.Log("更新 ResourcePath..."); + GD.Print("更新 ResourcePath..."); var directoryInfo = new DirectoryInfo(System.Environment.CurrentDirectory); EachDir(directoryInfo); resultStr += "}"; File.WriteAllText(savePath, resultStr); - Debug.Log("ResourcePath.cs 写出完成!"); + GD.Print("ResourcePath.cs 写出完成!"); } catch (Exception e) { - Debug.LogError(e.ToString()); + GD.PrintErr(e.ToString()); return false; } @@ -91,7 +93,7 @@ path = path.Replace('\\', '/'); if (exclude.Contains(path)) { - Debug.Log("扫描排除路径: " + path); + GD.Print("扫描排除路径: " + path); return; } } diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiGenerator.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiGenerator.cs index 3a84f2a..eb4a48d 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiGenerator.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiGenerator.cs @@ -80,13 +80,13 @@ //打开ui if (open) { - Plugin.Plugin.Instance.GetEditorInterface().OpenSceneFromPath(prefabResPath); - } + EditorInterface.Singleton.OpenSceneFromPath(prefabResPath); + } } catch (Exception e) { - Debug.LogError(e.ToString()); + GD.PrintErr(e.ToString()); return false; } @@ -117,7 +117,7 @@ var uiName = control.Name.ToString(); var path = GameConfig.UiCodeDir + uiName.FirstToLower() + "/" + uiName + ".cs"; - Debug.Log("重新生成ui代码: " + path); + GD.Print("重新生成ui代码: " + path); var uiNode = EachNodeFromEditor(control.Name, control); var code = GenerateClassCode(uiNode); @@ -126,7 +126,7 @@ { if (pair.Value > 1) { - Debug.Log($"检测到同名节点: '{pair.Key}', 使用该名称的节点将无法生成唯一节点属性!"); + GD.Print($"检测到同名节点: '{pair.Key}', 使用该名称的节点将无法生成唯一节点属性!"); } } @@ -134,7 +134,7 @@ } catch (Exception e) { - Debug.LogError(e.ToString()); + GD.PrintErr(e.ToString()); return false; } @@ -177,25 +177,23 @@ { str += retraction + $" _ = {node};\n"; } - else + + if (uiNodeInfo.Children != null) { - if (uiNodeInfo.Children != null) + for (var i = 0; i < uiNodeInfo.Children.Count; i++) { - for (var i = 0; i < uiNodeInfo.Children.Count; i++) + var item = uiNodeInfo.Children[i]; + if (uiNodeInfo.OriginName == uiNodeInfo.UiRootName) { - var item = uiNodeInfo.Children[i]; - if (uiNodeInfo.OriginName == uiNodeInfo.UiRootName) - { - str += GenerateUiScriptCode("", item, retraction); - } - else - { - str += GenerateUiScriptCode(node, item, retraction); - } + str += GenerateUiScriptCode("", item, retraction); + } + else + { + str += GenerateUiScriptCode(node, item, retraction); } } } - + return str; } @@ -400,12 +398,12 @@ bool isNodeScript; if (match.Success) //存在命名空间 { - isNodeScript = IsNodeScript(match.Value + "." + fileName); + isNodeScript = CheckNodeScript(match.Value + "." + fileName); uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, match.Value + "." + fileName, isNodeScript); } else //不存在命名空间 { - isNodeScript = IsNodeScript(fileName); + isNodeScript = CheckNodeScript(fileName); uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, fileName, isNodeScript); } //检测是否是引用Ui @@ -447,7 +445,7 @@ return uiNode; } - private static bool IsNodeScript(string typeName) + private static bool CheckNodeScript(string typeName) { var type = typeof(UiGenerator).Assembly.GetType(typeName); if (type == null) @@ -501,6 +499,10 @@ ClassName = className; NodeTypeName = nodeTypeName; IsNodeScript = isNodeScript; + if (isNodeScript) + { + GD.Print("发现 IUiNodeScript 节点: " + originName); + } } } diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiManagerMethodsGenerator.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiManagerMethodsGenerator.cs index d005c2b..8aae0cd 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiManagerMethodsGenerator.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/generator/UiManagerMethodsGenerator.cs @@ -2,6 +2,7 @@ using System; using System.IO; +using Godot; namespace Generator; @@ -104,7 +105,7 @@ } catch (Exception e) { - Debug.LogError(e.ToString()); + GD.PrintErr(e.ToString()); return false; } diff --git a/DungeonShooting_Godot/excel/ActivityBase.xlsx b/DungeonShooting_Godot/excel/ActivityBase.xlsx index 560af91..cf9f463 100644 --- a/DungeonShooting_Godot/excel/ActivityBase.xlsx +++ b/DungeonShooting_Godot/excel/ActivityBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx index b23fc4c..16e6778 100644 --- a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx +++ b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/AiAttackAttr.xlsx b/DungeonShooting_Godot/excel/AiAttackAttr.xlsx index 8d3cdf5..b9daab6 100644 --- a/DungeonShooting_Godot/excel/AiAttackAttr.xlsx +++ b/DungeonShooting_Godot/excel/AiAttackAttr.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/BulletBase.xlsx b/DungeonShooting_Godot/excel/BulletBase.xlsx index 6ee6491..65f4af2 100644 --- a/DungeonShooting_Godot/excel/BulletBase.xlsx +++ b/DungeonShooting_Godot/excel/BulletBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/EnemyBase.xlsx b/DungeonShooting_Godot/excel/EnemyBase.xlsx index cec7fac..362bdeb 100644 --- a/DungeonShooting_Godot/excel/EnemyBase.xlsx +++ b/DungeonShooting_Godot/excel/EnemyBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/Sound.xlsx b/DungeonShooting_Godot/excel/Sound.xlsx index ff7944e..47c6585 100644 --- a/DungeonShooting_Godot/excel/Sound.xlsx +++ b/DungeonShooting_Godot/excel/Sound.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/WeaponBase.xlsx b/DungeonShooting_Godot/excel/WeaponBase.xlsx index e3c81e8..8f61a7a 100644 --- a/DungeonShooting_Godot/excel/WeaponBase.xlsx +++ b/DungeonShooting_Godot/excel/WeaponBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excelTool/ExcelGenerator.cs b/DungeonShooting_Godot/excelTool/ExcelGenerator.cs index 0268b2a..c206007 100644 --- a/DungeonShooting_Godot/excelTool/ExcelGenerator.cs +++ b/DungeonShooting_Godot/excelTool/ExcelGenerator.cs @@ -524,7 +524,20 @@ var cellStringValue = GetCellStringValue(cell); if (cellStringValue.Length == 0) { - data.Add(field, null); + if (mappingData.TypeStr == nameof(ActivityQuality)) + { + ActivityQuality v = default; + data.Add(field, v); + } + else if (mappingData.TypeStr == nameof(ActivityType)) + { + ActivityType v = default; + data.Add(field, v); + } + else + { + data.Add(field, null); + } } else { @@ -691,6 +704,8 @@ case "vector2": return "SerializeVector2"; case "vector3": return "SerializeVector3"; case "color": return "SerializeColor"; + case "activityType": return "ActivityType"; + case "activityQuality": return "ActivityQuality"; } return typeName; @@ -716,6 +731,8 @@ case "vector2": return "SerializeVector2"; case "vector3": return "SerializeVector3"; case "color": return "SerializeColor"; + case "activityType": return "ActivityType"; + case "activityQuality": return "ActivityQuality"; } return typeName; diff --git a/DungeonShooting_Godot/excelTool/serialize/ActivityQuality.cs b/DungeonShooting_Godot/excelTool/serialize/ActivityQuality.cs new file mode 100644 index 0000000..9d5641d --- /dev/null +++ b/DungeonShooting_Godot/excelTool/serialize/ActivityQuality.cs @@ -0,0 +1,39 @@ + +/// +/// 物体品质 +/// +public enum ActivityQuality +{ + /// + /// 未设置 + /// + None = 0, + /// + /// 通用物品 + /// + Common = 1, + /// + /// 基础 + /// + Basic = 2, + /// + /// 普通 + /// + Ordinary = 3, + /// + /// 稀有 + /// + Rare = 4, + /// + /// 史诗 + /// + Epic = 5, + /// + /// 传说 + /// + Legend = 6, + /// + /// 独一无二 + /// + Unique = 7 +} \ No newline at end of file diff --git a/DungeonShooting_Godot/excelTool/serialize/ActivityType.cs b/DungeonShooting_Godot/excelTool/serialize/ActivityType.cs new file mode 100644 index 0000000..d094992 --- /dev/null +++ b/DungeonShooting_Godot/excelTool/serialize/ActivityType.cs @@ -0,0 +1,55 @@ + +/// +/// 物体类型 +/// +public enum ActivityType +{ + /// + /// 无类型 + /// + None, + /// + /// 玩家 + /// + Player, + /// + /// 测试对象 + /// + Test, + /// + /// 角色 + /// + Role, + /// + /// 敌人 + /// + Enemy, + /// + /// 武器 + /// + Weapon, + /// + /// 子弹 + /// + Bullet, + /// + /// 弹壳 + /// + Shell, + /// + /// 特效 + /// + Effect, + /// + /// 道具 + /// + Prop, + /// + /// 宝箱 + /// + Treasure, + /// + /// 其它类型 + /// + Other = 99, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/excelTool/version b/DungeonShooting_Godot/excelTool/version index 56a6051..bf0d87a 100644 --- a/DungeonShooting_Godot/excelTool/version +++ b/DungeonShooting_Godot/excelTool/version @@ -1 +1 @@ -1 \ No newline at end of file +4 \ No newline at end of file diff --git a/DungeonShooting_Godot/export_presets.cfg b/DungeonShooting_Godot/export_presets.cfg index dbf459f..fe181fc 100644 --- a/DungeonShooting_Godot/export_presets.cfg +++ b/DungeonShooting_Godot/export_presets.cfg @@ -216,7 +216,7 @@ export_filter="all_resources" include_filter="" exclude_filter="resource/map/tileMaps/*,excel/*,excelTool/*,build/*" -export_path="build/windows/game.exe" +export_path="build/windows/GunfireDungeon.exe" encryption_include_filters="" encryption_exclude_filters="" encrypt_pck=false diff --git a/DungeonShooting_Godot/prefab/box/TreasureBox0001.tscn b/DungeonShooting_Godot/prefab/box/TreasureBox0001.tscn new file mode 100644 index 0000000..804110c --- /dev/null +++ b/DungeonShooting_Godot/prefab/box/TreasureBox0001.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=12 format=3 uid="uid://d2gj0yuup0gdb"] + +[ext_resource type="Script" path="res://src/game/activity/box/TreasureBox.cs" id="1_wxils"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_l4sas"] +[ext_resource type="Texture2D" uid="uid://dladvmgql1pwe" path="res://resource/sprite/box/TreasureBox0001.png" id="3_eed5t"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_1v1is"] +resource_local_to_scene = true +shader = ExtResource("2_l4sas") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_lewo8"] +resource_local_to_scene = true +shader = ExtResource("2_l4sas") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_hserg"] +atlas = ExtResource("3_eed5t") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8d3br"] +atlas = ExtResource("3_eed5t") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fp844"] +atlas = ExtResource("3_eed5t") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_151ky"] +atlas = ExtResource("3_eed5t") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_e74dc"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_hserg") +}], +"loop": false, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_8d3br") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fp844") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_151ky") +}], +"loop": false, +"name": &"open", +"speed": 8.0 +}] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_j3yup"] +size = Vector2(26, 11) + +[node name="TreasureBox0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 516 +script = ExtResource("1_wxils") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_1v1is") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_lewo8") +position = Vector2(0, -11) +sprite_frames = SubResource("SpriteFrames_e74dc") +animation = &"open" + +[node name="Collision" type="CollisionShape2D" parent="."] +position = Vector2(0, -1.5) +shape = SubResource("RectangleShape2D_j3yup") diff --git a/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn b/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn index fad5129..bd7ca13 100644 --- a/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn @@ -307,6 +307,7 @@ modulate = Color(1.3, 1.3, 1.3, 1) z_index = 1 collision_layer = 0 +collision_mask = 0 monitorable = false script = ExtResource("1_qn5pu") diff --git a/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn b/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn index 9189dc9..04de455 100644 --- a/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn @@ -8,6 +8,7 @@ [node name="Laser0001" type="Area2D" node_paths=PackedStringArray("Particles2D")] collision_layer = 2 +collision_mask = 0 monitorable = false script = ExtResource("1_3w0rp") Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/bullet/laser/Laser0002.tscn b/DungeonShooting_Godot/prefab/bullet/laser/Laser0002.tscn new file mode 100644 index 0000000..c989324 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/laser/Laser0002.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=3 uid="uid://cjt68qk2mm7km"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/laser/Laser.cs" id="1_t3xbd"] +[ext_resource type="Texture2D" uid="uid://clfpbq1c1ilp1" path="res://resource/sprite/bullet/laser/Laser0001.png" id="2_ga23q"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_l4vuk"] +resource_local_to_scene = true + +[node name="Laser0001" type="Area2D" node_paths=PackedStringArray("Particles2D")] +collision_layer = 2 +collision_mask = 0 +monitorable = false +script = ExtResource("1_t3xbd") +Particles2D = [] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_l4vuk") + +[node name="LineSprite" type="Sprite2D" parent="."] +modulate = Color(1.5, 1.5, 1.5, 1) +position = Vector2(0, 1.19209e-07) +texture = ExtResource("2_ga23q") +centered = false +offset = Vector2(0, -8) diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn index 6c95617..e1ddde3 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=8 format=3 uid="uid://bj4kmvt8jg1cf"] +[gd_scene load_steps=7 format=3 uid="uid://bj4kmvt8jg1cf"] [ext_resource type="Script" path="res://src/game/activity/bullet/normal/Bullet.cs" id="1_3d3df"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_mxa72"] -[ext_resource type="Texture2D" uid="uid://bu0b11hiuecxy" path="res://resource/sprite/bullet/normal/bullet0001.png" id="3_pm4pr"] +[ext_resource type="SpriteFrames" uid="uid://baoxep7vami72" path="res://resource/spriteFrames/bullet/Bullet0001.tres" id="3_q4a0o"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_w5w0i"] resource_local_to_scene = true @@ -28,22 +28,12 @@ shader_parameter/outline_use_blend = false shader_parameter/grey = 0.0 -[sub_resource type="SpriteFrames" id="SpriteFrames_5wvmf"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": ExtResource("3_pm4pr") -}], -"loop": true, -"name": &"default", -"speed": 5.0 -}] - [sub_resource type="RectangleShape2D" id="RectangleShape2D_lcqb8"] size = Vector2(9, 4) [node name="Bullet0001" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 +collision_mask = 0 script = ExtResource("1_3d3df") CollisionArea = NodePath("AnimatedSprite/CollisionArea") CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") @@ -59,7 +49,7 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] modulate = Color(1.6, 1.6, 1.6, 1) material = SubResource("ShaderMaterial_qhkgc") -sprite_frames = SubResource("SpriteFrames_5wvmf") +sprite_frames = ExtResource("3_q4a0o") [node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] collision_layer = 0 diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn index ecabf2f..4441bc7 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn @@ -36,6 +36,7 @@ [node name="Bullet0002" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 +collision_mask = 0 script = ExtResource("1_hepay") CollisionArea = NodePath("AnimatedSprite/CollisionArea") CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn index b87d8e0..88082d7 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn @@ -33,6 +33,7 @@ [node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 +collision_mask = 0 script = ExtResource("1_h6lfm") CollisionArea = NodePath("AnimatedSprite/CollisionArea") CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn index 3c96ac3..57e55ab 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn @@ -62,6 +62,7 @@ [node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 +collision_mask = 0 script = ExtResource("1_1jbgr") CollisionArea = NodePath("AnimatedSprite/CollisionArea") CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn index 3203560..a6a0493 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn @@ -62,6 +62,8 @@ [node name="Bullet0005" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 +collision_mask = 0 +platform_wall_layers = 512 script = ExtResource("1_13wdl") BrushId = "0004" EffectiveAltitude = 1.0 diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0006.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0006.tscn new file mode 100644 index 0000000..9e58d27 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0006.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=8 format=3 uid="uid://c1fx7c1jwil26"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/normal/TrailBullet.cs" id="1_b8pov"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_iolc6"] +[ext_resource type="SpriteFrames" uid="uid://dx4t45bq8ehhq" path="res://resource/spriteFrames/bullet/Bullet0006.tres" id="3_v2y7a"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_w5w0i"] +resource_local_to_scene = true +shader = ExtResource("2_iolc6") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qhkgc"] +resource_local_to_scene = true +shader = ExtResource("2_iolc6") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = false +shader_parameter/grey = 0.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_4mw2b"] +radius = 3.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_vqdkp"] +radius = 3.0 + +[node name="Bullet0006" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 2 +collision_mask = 0 +script = ExtResource("1_b8pov") +CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_w5w0i") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +modulate = Color(1.6, 1.6, 1.6, 1) +material = SubResource("ShaderMaterial_qhkgc") +sprite_frames = ExtResource("3_v2y7a") + +[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AnimatedSprite/CollisionArea"] +shape = SubResource("CircleShape2D_4mw2b") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_vqdkp") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0007.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0007.tscn new file mode 100644 index 0000000..4dfced6 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0007.tscn @@ -0,0 +1,67 @@ +[gd_scene load_steps=8 format=3 uid="uid://cybey66bhe4ro"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/normal/Bullet.cs" id="1_h4tn7"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_fgeyt"] +[ext_resource type="SpriteFrames" uid="uid://bkwoy70bnm74k" path="res://resource/spriteFrames/bullet/Bullet0007.tres" id="3_c1ec6"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_v77gw"] +resource_local_to_scene = true +shader = ExtResource("2_fgeyt") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_r6pkp"] +resource_local_to_scene = true +shader = ExtResource("2_fgeyt") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = false +shader_parameter/grey = 0.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_0vxfv"] +radius = 2.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_e2yn3"] +radius = 2.0 + +[node name="Bullet0007" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 2 +collision_mask = 0 +script = ExtResource("1_h4tn7") +CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_v77gw") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +modulate = Color(2, 2, 2, 1) +material = SubResource("ShaderMaterial_r6pkp") +sprite_frames = ExtResource("3_c1ec6") + +[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AnimatedSprite/CollisionArea"] +position = Vector2(-2.38419e-07, 0) +shape = SubResource("CircleShape2D_0vxfv") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_e2yn3") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0008.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0008.tscn new file mode 100644 index 0000000..838ada7 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0008.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=8 format=3 uid="uid://d3dcmte122p6t"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/normal/ColorBullet.cs" id="1_qqm5l"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_t3qw6"] +[ext_resource type="SpriteFrames" uid="uid://ubdvau75andr" path="res://resource/spriteFrames/bullet/Bullet0008.tres" id="3_aoni0"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_v77gw"] +resource_local_to_scene = true +shader = ExtResource("2_t3qw6") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_jypdq"] +resource_local_to_scene = true +shader = ExtResource("2_t3qw6") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = false +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_5x14b"] +size = Vector2(22, 3) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_72d75"] +size = Vector2(22, 3) + +[node name="Bullet0008" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 2 +collision_mask = 0 +script = ExtResource("1_qqm5l") +CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_v77gw") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +modulate = Color(1.6, 1.6, 1.6, 1) +material = SubResource("ShaderMaterial_jypdq") +sprite_frames = ExtResource("3_aoni0") + +[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AnimatedSprite/CollisionArea"] +shape = SubResource("RectangleShape2D_5x14b") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_72d75") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0009.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0009.tscn new file mode 100644 index 0000000..2831163 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0009.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=8 format=3 uid="uid://c4puxmnan51ds"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/normal/Arrow.cs" id="1_eots7"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_tscmb"] +[ext_resource type="SpriteFrames" uid="uid://cyg3uvbakan08" path="res://resource/spriteFrames/bullet/Bullet0009.tres" id="3_l58ff"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_v77gw"] +resource_local_to_scene = true +shader = ExtResource("2_tscmb") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_jypdq"] +resource_local_to_scene = true +shader = ExtResource("2_tscmb") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = false +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = false +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_5x14b"] +size = Vector2(21, 3) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_72d75"] +size = Vector2(21, 3) + +[node name="Bullet0009" type="CharacterBody2D" node_paths=PackedStringArray("HalfSprite", "CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 2 +collision_mask = 0 +script = ExtResource("1_eots7") +HalfSprite = NodePath("AnimatedSprite/HalfSprite") +CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_v77gw") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_jypdq") +sprite_frames = ExtResource("3_l58ff") + +[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AnimatedSprite/CollisionArea"] +position = Vector2(-2.5, 0) +shape = SubResource("RectangleShape2D_5x14b") + +[node name="HalfSprite" type="AnimatedSprite2D" parent="AnimatedSprite"] +visible = false +z_index = -1 +sprite_frames = ExtResource("3_l58ff") +animation = &"half_start" + +[node name="Collision" type="CollisionShape2D" parent="."] +position = Vector2(-2.5, 0) +shape = SubResource("RectangleShape2D_72d75") diff --git a/DungeonShooting_Godot/prefab/currency/Gold1.tscn b/DungeonShooting_Godot/prefab/currency/Gold1.tscn new file mode 100644 index 0000000..5db5a1c --- /dev/null +++ b/DungeonShooting_Godot/prefab/currency/Gold1.tscn @@ -0,0 +1,160 @@ +[gd_scene load_steps=24 format=3 uid="uid://bayga6rue4ldm"] + +[ext_resource type="PackedScene" uid="uid://c7i2q4mx5qp2h" path="res://prefab/currency/GoldTemplate.tscn" id="1_7anjj"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_p7xui"] +[ext_resource type="Texture2D" uid="uid://benn0iaclw8dk" path="res://resource/sprite/currency/Gold_1.png" id="3_lhsna"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2tpx1"] +resource_local_to_scene = true +shader = ExtResource("2_p7xui") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_e75yg"] +atlas = ExtResource("3_lhsna") +region = Rect2(0, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vipr3"] +atlas = ExtResource("3_lhsna") +region = Rect2(8, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c2w8t"] +atlas = ExtResource("3_lhsna") +region = Rect2(16, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4u1py"] +atlas = ExtResource("3_lhsna") +region = Rect2(24, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ejbhm"] +atlas = ExtResource("3_lhsna") +region = Rect2(32, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_obptk"] +atlas = ExtResource("3_lhsna") +region = Rect2(40, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xdxp6"] +atlas = ExtResource("3_lhsna") +region = Rect2(48, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j2dug"] +atlas = ExtResource("3_lhsna") +region = Rect2(56, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0yf5k"] +atlas = ExtResource("3_lhsna") +region = Rect2(64, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_aew3e"] +atlas = ExtResource("3_lhsna") +region = Rect2(72, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0uljq"] +atlas = ExtResource("3_lhsna") +region = Rect2(80, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fu3cl"] +atlas = ExtResource("3_lhsna") +region = Rect2(88, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c1vcu"] +atlas = ExtResource("3_lhsna") +region = Rect2(96, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8sqp3"] +atlas = ExtResource("3_lhsna") +region = Rect2(104, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_htbwa"] +atlas = ExtResource("3_lhsna") +region = Rect2(112, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hei3a"] +atlas = ExtResource("3_lhsna") +region = Rect2(120, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0e87y"] +atlas = ExtResource("3_lhsna") +region = Rect2(128, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i2rar"] +atlas = ExtResource("3_lhsna") +region = Rect2(136, 0, 8, 8) + +[sub_resource type="SpriteFrames" id="SpriteFrames_3te8s"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_e75yg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vipr3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c2w8t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4u1py") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ejbhm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_obptk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xdxp6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j2dug") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0yf5k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aew3e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0uljq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fu3cl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c1vcu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8sqp3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_htbwa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hei3a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0e87y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i2rar") +}], +"loop": true, +"name": &"default", +"speed": 10.0 +}] + +[node name="Gold1" instance=ExtResource("1_7anjj")] +GoldCount = 1 + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_2tpx1") +sprite_frames = SubResource("SpriteFrames_3te8s") +autoplay = "default" +frame_progress = 0.578976 diff --git a/DungeonShooting_Godot/prefab/currency/Gold10.tscn b/DungeonShooting_Godot/prefab/currency/Gold10.tscn new file mode 100644 index 0000000..e723646 --- /dev/null +++ b/DungeonShooting_Godot/prefab/currency/Gold10.tscn @@ -0,0 +1,160 @@ +[gd_scene load_steps=24 format=3 uid="uid://cpfeog5xk7frv"] + +[ext_resource type="PackedScene" uid="uid://c7i2q4mx5qp2h" path="res://prefab/currency/GoldTemplate.tscn" id="1_q6rqs"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_fwuy2"] +[ext_resource type="Texture2D" uid="uid://7dy6itvggpwy" path="res://resource/sprite/currency/Gold_10.png" id="3_x42g4"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2tpx1"] +resource_local_to_scene = true +shader = ExtResource("2_fwuy2") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_x41wb"] +atlas = ExtResource("3_x42g4") +region = Rect2(0, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_03ih4"] +atlas = ExtResource("3_x42g4") +region = Rect2(8, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qdoke"] +atlas = ExtResource("3_x42g4") +region = Rect2(16, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3wdhp"] +atlas = ExtResource("3_x42g4") +region = Rect2(24, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vgpiy"] +atlas = ExtResource("3_x42g4") +region = Rect2(32, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jfxvm"] +atlas = ExtResource("3_x42g4") +region = Rect2(40, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hqk1i"] +atlas = ExtResource("3_x42g4") +region = Rect2(48, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j4okn"] +atlas = ExtResource("3_x42g4") +region = Rect2(56, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nohmj"] +atlas = ExtResource("3_x42g4") +region = Rect2(64, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_blcne"] +atlas = ExtResource("3_x42g4") +region = Rect2(72, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_018qf"] +atlas = ExtResource("3_x42g4") +region = Rect2(80, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kb863"] +atlas = ExtResource("3_x42g4") +region = Rect2(88, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nrald"] +atlas = ExtResource("3_x42g4") +region = Rect2(96, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4rlwh"] +atlas = ExtResource("3_x42g4") +region = Rect2(104, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7qdiq"] +atlas = ExtResource("3_x42g4") +region = Rect2(112, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l7tjk"] +atlas = ExtResource("3_x42g4") +region = Rect2(120, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_thd0w"] +atlas = ExtResource("3_x42g4") +region = Rect2(128, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_js8fg"] +atlas = ExtResource("3_x42g4") +region = Rect2(136, 0, 8, 8) + +[sub_resource type="SpriteFrames" id="SpriteFrames_3te8s"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_x41wb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_03ih4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qdoke") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3wdhp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vgpiy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jfxvm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hqk1i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j4okn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nohmj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_blcne") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_018qf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kb863") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nrald") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4rlwh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7qdiq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l7tjk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_thd0w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_js8fg") +}], +"loop": true, +"name": &"default", +"speed": 10.0 +}] + +[node name="Gold10" instance=ExtResource("1_q6rqs")] +GoldCount = 10 + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_2tpx1") +sprite_frames = SubResource("SpriteFrames_3te8s") +autoplay = "default" +frame_progress = 0.578976 diff --git a/DungeonShooting_Godot/prefab/currency/Gold5.tscn b/DungeonShooting_Godot/prefab/currency/Gold5.tscn new file mode 100644 index 0000000..88de932 --- /dev/null +++ b/DungeonShooting_Godot/prefab/currency/Gold5.tscn @@ -0,0 +1,160 @@ +[gd_scene load_steps=24 format=3 uid="uid://dqeph6v1y3ycm"] + +[ext_resource type="PackedScene" uid="uid://c7i2q4mx5qp2h" path="res://prefab/currency/GoldTemplate.tscn" id="1_t3bsk"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_r5r64"] +[ext_resource type="Texture2D" uid="uid://bfpcqj2x8t2os" path="res://resource/sprite/currency/Gold_5.png" id="3_rf7nc"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2tpx1"] +resource_local_to_scene = true +shader = ExtResource("2_r5r64") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_kpbsl"] +atlas = ExtResource("3_rf7nc") +region = Rect2(0, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tpaps"] +atlas = ExtResource("3_rf7nc") +region = Rect2(8, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gfmw0"] +atlas = ExtResource("3_rf7nc") +region = Rect2(16, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kh76b"] +atlas = ExtResource("3_rf7nc") +region = Rect2(24, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h71d5"] +atlas = ExtResource("3_rf7nc") +region = Rect2(32, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_irvf2"] +atlas = ExtResource("3_rf7nc") +region = Rect2(40, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6upf3"] +atlas = ExtResource("3_rf7nc") +region = Rect2(48, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_th3rv"] +atlas = ExtResource("3_rf7nc") +region = Rect2(56, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2nwhu"] +atlas = ExtResource("3_rf7nc") +region = Rect2(64, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3f1xk"] +atlas = ExtResource("3_rf7nc") +region = Rect2(72, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4edoa"] +atlas = ExtResource("3_rf7nc") +region = Rect2(80, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t7eeg"] +atlas = ExtResource("3_rf7nc") +region = Rect2(88, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x22g0"] +atlas = ExtResource("3_rf7nc") +region = Rect2(96, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_14m0u"] +atlas = ExtResource("3_rf7nc") +region = Rect2(104, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4s0em"] +atlas = ExtResource("3_rf7nc") +region = Rect2(112, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ncscs"] +atlas = ExtResource("3_rf7nc") +region = Rect2(120, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gwnv8"] +atlas = ExtResource("3_rf7nc") +region = Rect2(128, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_aw75c"] +atlas = ExtResource("3_rf7nc") +region = Rect2(136, 0, 8, 8) + +[sub_resource type="SpriteFrames" id="SpriteFrames_3te8s"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_kpbsl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tpaps") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gfmw0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kh76b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h71d5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_irvf2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6upf3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_th3rv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2nwhu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3f1xk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4edoa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t7eeg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x22g0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_14m0u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4s0em") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ncscs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gwnv8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aw75c") +}], +"loop": true, +"name": &"default", +"speed": 10.0 +}] + +[node name="Gold5" instance=ExtResource("1_t3bsk")] +GoldCount = 5 + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_2tpx1") +sprite_frames = SubResource("SpriteFrames_3te8s") +autoplay = "default" +frame_progress = 0.578976 diff --git a/DungeonShooting_Godot/prefab/currency/GoldTemplate.tscn b/DungeonShooting_Godot/prefab/currency/GoldTemplate.tscn new file mode 100644 index 0000000..a759eeb --- /dev/null +++ b/DungeonShooting_Godot/prefab/currency/GoldTemplate.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=6 format=3 uid="uid://c7i2q4mx5qp2h"] + +[ext_resource type="Script" path="res://src/game/activity/currency/Gold.cs" id="1_p60kl"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_5nps8"] +[ext_resource type="Texture2D" uid="uid://cthwlbqve6i1l" path="res://resource/sprite/currency/Gold_shadow.png" id="3_6xm1s"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qdjhs"] +resource_local_to_scene = true +shader = ExtResource("2_5nps8") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_jvlsd"] +size = Vector2(6, 4) + +[node name="GoldTemplate" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +collision_mask = 0 +script = ExtResource("1_p60kl") +GoldCount = 0 +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +texture = ExtResource("3_6xm1s") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_qdjhs") +offset = Vector2(0, -4) + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_jvlsd") diff --git a/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn index 9159fe4..c116d1e 100644 --- a/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn +++ b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn @@ -2,8 +2,8 @@ [ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_dxavj"] [ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_s60r7"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="2_3kyig"] -[ext_resource type="Texture2D" uid="uid://csud4e6kc3iku" path="res://resource/sprite/effects/common/Effect1.png" id="3_1mceu"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="2_3kyig"] +[ext_resource type="Texture2D" uid="uid://csud4e6kc3iku" path="res://resource/sprite/common/Effect1.png" id="3_1mceu"] [ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="3_2tlhx"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ipadv"] diff --git a/DungeonShooting_Godot/prefab/effect/common/Trail0001.tscn b/DungeonShooting_Godot/prefab/effect/common/Trail0001.tscn new file mode 100644 index 0000000..d7d9242 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/common/Trail0001.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3 uid="uid://ddwikcidm0gsi"] + +[ext_resource type="Script" path="res://src/game/effects/Trail.cs" id="1_i68ib"] + +[sub_resource type="Curve" id="Curve_fnvhf"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.5), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="Gradient" id="Gradient_cjh8g"] +resource_local_to_scene = true +offsets = PackedFloat32Array(0.825949, 1) +colors = PackedColorArray(1, 1, 1, 0.705882, 1, 1, 1, 0) + +[node name="Trail" type="Line2D"] +width = 3.0 +width_curve = SubResource("Curve_fnvhf") +gradient = SubResource("Gradient_cjh8g") +script = ExtResource("1_i68ib") diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn deleted file mode 100644 index 159734f..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn +++ /dev/null @@ -1,51 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://433h6huyctl1"] - -[ext_resource type="Texture2D" uid="uid://b0jsyrbk4bydt" path="res://resource/sprite/shootFire/ShotFire0001.png" id="1_sencp"] -[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_lnwju"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_asq5h"] -atlas = ExtResource("1_sencp") -region = Rect2(0, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_n77w8"] -atlas = ExtResource("1_sencp") -region = Rect2(16, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_10rnx"] -atlas = ExtResource("1_sencp") -region = Rect2(32, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_qi1pq"] -atlas = ExtResource("1_sencp") -region = Rect2(48, 0, 16, 16) - -[sub_resource type="SpriteFrames" id="SpriteFrames_73j16"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_asq5h") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_n77w8") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_10rnx") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_qi1pq") -}, { -"duration": 1.0, -"texture": null -}], -"loop": false, -"name": &"default", -"speed": 20.0 -}] - -[node name="ShotFire" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] -modulate = Color(1.6, 1.6, 1.6, 1) -sprite_frames = SubResource("SpriteFrames_73j16") -offset = Vector2(8, 0) -script = ExtResource("2_lnwju") -DelayTime = 0.5 -Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0001.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0001.tscn new file mode 100644 index 0000000..159734f --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0001.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=8 format=3 uid="uid://433h6huyctl1"] + +[ext_resource type="Texture2D" uid="uid://b0jsyrbk4bydt" path="res://resource/sprite/shootFire/ShotFire0001.png" id="1_sencp"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_lnwju"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_asq5h"] +atlas = ExtResource("1_sencp") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n77w8"] +atlas = ExtResource("1_sencp") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_10rnx"] +atlas = ExtResource("1_sencp") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qi1pq"] +atlas = ExtResource("1_sencp") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_73j16"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_asq5h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n77w8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_10rnx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qi1pq") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 20.0 +}] + +[node name="ShotFire" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(1.6, 1.6, 1.6, 1) +sprite_frames = SubResource("SpriteFrames_73j16") +offset = Vector2(8, 0) +script = ExtResource("2_lnwju") +DelayTime = 0.5 +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0002.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0002.tscn new file mode 100644 index 0000000..5a3355d --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0002.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=8 format=3 uid="uid://drcvbo0xam6q"] + +[ext_resource type="Texture2D" uid="uid://cj8gb5dxnk8ov" path="res://resource/sprite/shootFire/ShotFire0002.png" id="1_02pnb"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_uoe2l"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_2nk6j"] +atlas = ExtResource("1_02pnb") +region = Rect2(0, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ht7ag"] +atlas = ExtResource("1_02pnb") +region = Rect2(9, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jwqy0"] +atlas = ExtResource("1_02pnb") +region = Rect2(18, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ud7n7"] +atlas = ExtResource("1_02pnb") +region = Rect2(27, 0, 9, 11) + +[sub_resource type="SpriteFrames" id="SpriteFrames_rry1m"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2nk6j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ht7ag") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jwqy0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ud7n7") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 20.0 +}] + +[node name="ShotFire2" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(1.6, 1.6, 1.6, 1) +position = Vector2(-1, 0) +sprite_frames = SubResource("SpriteFrames_rry1m") +offset = Vector2(5.5, 0) +script = ExtResource("2_uoe2l") +DelayTime = 0.5 +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0003.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0003.tscn new file mode 100644 index 0000000..751fef8 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0003.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=7 format=3 uid="uid://dbas3vph0i2ro"] + +[ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="1_pdyqx"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="1_r2unj"] + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4wcis"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="Curve" id="Curve_86ye5"] +_data = [Vector2(0.0215054, 1), 0.0, 0.0, 0, 0, Vector2(0.512545, 0.882353), 0.0, 0.0, 0, 0, Vector2(1, 0.152941), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_j77i6"] +curve = SubResource("Curve_86ye5") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_8n28q"] +lifetime_randomness = 0.3 +particle_flag_disable_z = true +angle_max = 360.0 +initial_velocity_min = 5.0 +initial_velocity_max = 35.0 +gravity = Vector3(0, 0, 0) +scale_min = 0.6 +scale_max = 1.5 +scale_curve = SubResource("CurveTexture_j77i6") +anim_offset_max = 1.0 + +[node name="ShotFire3" type="GPUParticles2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(0.95, 0.70965, 0.6365, 0.470588) +material = SubResource("CanvasItemMaterial_4wcis") +emitting = false +process_material = SubResource("ParticleProcessMaterial_8n28q") +texture = ExtResource("1_r2unj") +lifetime = 0.7 +one_shot = true +explosiveness = 1.0 +randomness = 0.5 +fixed_fps = 20 +script = ExtResource("1_pdyqx") +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0004.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0004.tscn new file mode 100644 index 0000000..448192f --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire0004.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=8 format=3 uid="uid://yg8n8xi3ucqi"] + +[ext_resource type="Texture2D" uid="uid://dw3amegyt2ehh" path="res://resource/sprite/shootFire/ShotFire0003.png" id="1_lxoh4"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_qlt57"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_1cqk8"] +atlas = ExtResource("1_lxoh4") +region = Rect2(0, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hfpwi"] +atlas = ExtResource("1_lxoh4") +region = Rect2(9, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dvimy"] +atlas = ExtResource("1_lxoh4") +region = Rect2(18, 0, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bk1sq"] +atlas = ExtResource("1_lxoh4") +region = Rect2(27, 0, 9, 11) + +[sub_resource type="SpriteFrames" id="SpriteFrames_rry1m"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_1cqk8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hfpwi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dvimy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bk1sq") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 20.0 +}] + +[node name="ShotFire4" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(1.6, 1.6, 1.6, 1) +position = Vector2(-1, 0) +sprite_frames = SubResource("SpriteFrames_rry1m") +offset = Vector2(5.5, 0) +script = ExtResource("2_qlt57") +DelayTime = 0.5 +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn deleted file mode 100644 index 768d4d4..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn +++ /dev/null @@ -1,51 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://drcvbo0xam6q"] - -[ext_resource type="Texture2D" uid="uid://cj8gb5dxnk8ov" path="res://resource/sprite/shootFire/ShotFire0002.png" id="1_ljjfn"] -[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_4ecjw"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_2nk6j"] -atlas = ExtResource("1_ljjfn") -region = Rect2(0, 0, 9, 11) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ht7ag"] -atlas = ExtResource("1_ljjfn") -region = Rect2(9, 0, 9, 11) - -[sub_resource type="AtlasTexture" id="AtlasTexture_jwqy0"] -atlas = ExtResource("1_ljjfn") -region = Rect2(18, 0, 9, 11) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ud7n7"] -atlas = ExtResource("1_ljjfn") -region = Rect2(27, 0, 9, 11) - -[sub_resource type="SpriteFrames" id="SpriteFrames_rry1m"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_2nk6j") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_ht7ag") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_jwqy0") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_ud7n7") -}, { -"duration": 1.0, -"texture": null -}], -"loop": false, -"name": &"default", -"speed": 20.0 -}] - -[node name="ShotFire2" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] -modulate = Color(1.6, 1.6, 1.6, 1) -sprite_frames = SubResource("SpriteFrames_rry1m") -offset = Vector2(5.5, 0) -script = ExtResource("2_4ecjw") -DelayTime = 0.5 -Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.tscn deleted file mode 100644 index 751fef8..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.tscn +++ /dev/null @@ -1,43 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://dbas3vph0i2ro"] - -[ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="1_pdyqx"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="1_r2unj"] - -[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4wcis"] -particles_animation = true -particles_anim_h_frames = 3 -particles_anim_v_frames = 1 -particles_anim_loop = false - -[sub_resource type="Curve" id="Curve_86ye5"] -_data = [Vector2(0.0215054, 1), 0.0, 0.0, 0, 0, Vector2(0.512545, 0.882353), 0.0, 0.0, 0, 0, Vector2(1, 0.152941), 0.0, 0.0, 0, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_j77i6"] -curve = SubResource("Curve_86ye5") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_8n28q"] -lifetime_randomness = 0.3 -particle_flag_disable_z = true -angle_max = 360.0 -initial_velocity_min = 5.0 -initial_velocity_max = 35.0 -gravity = Vector3(0, 0, 0) -scale_min = 0.6 -scale_max = 1.5 -scale_curve = SubResource("CurveTexture_j77i6") -anim_offset_max = 1.0 - -[node name="ShotFire3" type="GPUParticles2D" node_paths=PackedStringArray("Particles2D")] -modulate = Color(0.95, 0.70965, 0.6365, 0.470588) -material = SubResource("CanvasItemMaterial_4wcis") -emitting = false -process_material = SubResource("ParticleProcessMaterial_8n28q") -texture = ExtResource("1_r2unj") -lifetime = 0.7 -one_shot = true -explosiveness = 1.0 -randomness = 0.5 -fixed_fps = 20 -script = ExtResource("1_pdyqx") -Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn index 2631c7c..e90e3fd 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn @@ -15,6 +15,7 @@ shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="ShaderMaterial" id="ShaderMaterial_t4ayq"] resource_local_to_scene = true @@ -22,14 +23,15 @@ shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 shader_parameter/modulate = Color(1, 1, 1, 1) -shader_parameter/show_outline = false +shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_opsb6"] resource_local_to_scene = true -size = Vector2(14, 40) +size = Vector2(16, 40) [node name="RoomDoor_N" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] script = ExtResource("1_4c6sw") @@ -40,25 +42,22 @@ [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 material = SubResource("ShaderMaterial_yvwpk") +position = Vector2(-8, 0) [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(9, -10) +position = Vector2(13, 10) sprite_frames = ExtResource("3_pjvd8") -animation = &"openDoor" +animation = &"closeDoor" autoplay = "default" -frame = 4 -frame_progress = 1.0 [node name="AnimatedSpriteDown" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(9, -10) +position = Vector2(-9, 2) sprite_frames = ExtResource("4_ln8k4") -animation = &"openDoor" autoplay = "default" -frame = 4 -frame_progress = 1.0 +offset = Vector2(0.5, 2.08165e-12) [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, 4) +position = Vector2(-6, 13) shape = SubResource("RectangleShape2D_opsb6") diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_N.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_N.tscn index 0c6565e..3f45c24 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_N.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_N.tscn @@ -10,10 +10,11 @@ shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 shader_parameter/modulate = Color(1, 1, 1, 1) -shader_parameter/show_outline = false +shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="ShaderMaterial" id="ShaderMaterial_t4ayq"] resource_local_to_scene = true @@ -21,14 +22,15 @@ shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 shader_parameter/modulate = Color(1, 1, 1, 1) -shader_parameter/show_outline = false +shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_opsb6"] resource_local_to_scene = true -size = Vector2(32, 23) +size = Vector2(32, 16) [node name="RoomDoor_N" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] script = ExtResource("1_220be") @@ -42,13 +44,9 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(0, -8) sprite_frames = ExtResource("3_apluc") -animation = &"closeDoor" autoplay = "default" -frame = 4 -frame_progress = 1.0 [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, -3.5) +position = Vector2(0, 4) shape = SubResource("RectangleShape2D_opsb6") diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn index a2996d7..0c2f4ea 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://src/game/room/RoomDoor.cs" id="1_f3qbq"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_6vvcd"] -[ext_resource type="SpriteFrames" uid="uid://ciqijjxup5356" path="res://resource/spriteFrames/other/RoomDoor_S.tres" id="3_hhmd5"] +[ext_resource type="SpriteFrames" uid="uid://xs72aopsgpg6" path="res://resource/spriteFrames/other/RoomDoor_N.tres" id="3_vbbxp"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_yvwpk"] resource_local_to_scene = true @@ -14,6 +14,7 @@ shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="ShaderMaterial" id="ShaderMaterial_t4ayq"] resource_local_to_scene = true @@ -21,14 +22,15 @@ shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 shader_parameter/modulate = Color(1, 1, 1, 1) -shader_parameter/show_outline = false +shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_opsb6"] resource_local_to_scene = true -size = Vector2(32, 23) +size = Vector2(32, 16) [node name="RoomDoor_N" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] script = ExtResource("1_f3qbq") @@ -42,13 +44,9 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(0, -8) -sprite_frames = ExtResource("3_hhmd5") -animation = &"openDoor" +sprite_frames = ExtResource("3_vbbxp") autoplay = "default" -frame = 4 -frame_progress = 1.0 [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, -3.5) +position = Vector2(0, 9) shape = SubResource("RectangleShape2D_opsb6") diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn index 727c632..8b50dba 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn @@ -2,8 +2,8 @@ [ext_resource type="Script" path="res://src/game/room/RoomDoor.cs" id="1_agux2"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_wx2w3"] -[ext_resource type="SpriteFrames" uid="uid://cpdt5ywrsruu3" path="res://resource/spriteFrames/other/RoomDoor_W_Up.tres" id="3_veggu"] -[ext_resource type="SpriteFrames" uid="uid://qq3h0mh4r12i" path="res://resource/spriteFrames/other/RoomDoor_W_Down.tres" id="4_dnjb6"] +[ext_resource type="SpriteFrames" uid="uid://3ps6h2f54qa5" path="res://resource/spriteFrames/other/RoomDoor_E_Up.tres" id="3_jquy0"] +[ext_resource type="SpriteFrames" uid="uid://b34tddsmqnj8s" path="res://resource/spriteFrames/other/RoomDoor_E_Down.tres" id="4_6gcqk"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_yvwpk"] resource_local_to_scene = true @@ -15,6 +15,7 @@ shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="ShaderMaterial" id="ShaderMaterial_t4ayq"] resource_local_to_scene = true @@ -22,14 +23,15 @@ shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 shader_parameter/modulate = Color(1, 1, 1, 1) -shader_parameter/show_outline = false +shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_2ko2r"] resource_local_to_scene = true -size = Vector2(14, 40) +size = Vector2(16, 40) [node name="RoomDoor_N" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] script = ExtResource("1_agux2") @@ -40,25 +42,24 @@ [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 material = SubResource("ShaderMaterial_yvwpk") +position = Vector2(8, 0) [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(-9, -10) -sprite_frames = ExtResource("3_veggu") -animation = &"openDoor" +position = Vector2(-13, 10) +scale = Vector2(-1, 1) +sprite_frames = ExtResource("3_jquy0") +animation = &"closeDoor" autoplay = "default" -frame = 4 -frame_progress = 1.0 [node name="AnimatedSpriteDown" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_t4ayq") -position = Vector2(-9, -10) -sprite_frames = ExtResource("4_dnjb6") -animation = &"openDoor" +position = Vector2(8, 2) +scale = Vector2(-1, 1) +sprite_frames = ExtResource("4_6gcqk") autoplay = "default" -frame = 4 -frame_progress = 1.0 +offset = Vector2(-0.5, 2.08165e-12) [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, 4) +position = Vector2(6, 13) shape = SubResource("RectangleShape2D_2ko2r") diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn index d877f44..cb1c9cb 100644 --- a/DungeonShooting_Godot/prefab/role/Role0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn @@ -49,11 +49,14 @@ sprite_frames = ExtResource("4_galcc") animation = &"roll" +[node name="Collision" parent="." index="3"] +position = Vector2(0, 0) + [node name="HurtCollision" parent="HurtArea" index="0"] shape = SubResource("RectangleShape2D_ve262") -[node name="InteractiveArea" parent="." index="5"] -visible = true +[node name="InteractiveCollision" parent="InteractiveArea" index="0"] +position = Vector2(0, 0) [node name="AnimationPlayer" parent="." index="8"] libraries = { diff --git a/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn b/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn index 3625be0..ae33b4a 100644 --- a/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn +++ b/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=3 uid="uid://dbrig6dq441wo"] +[gd_scene load_steps=5 format=3 uid="uid://dbrig6dq441wo"] [ext_resource type="PackedScene" uid="uid://cyrcv2jdgr8cf" path="res://prefab/role/template/RoleTemplate.tscn" id="1_5po38"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_x8agd"] @@ -15,13 +15,20 @@ shader_parameter/outline_use_blend = true shader_parameter/grey = 0.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_wu0xv"] +radius = 8.06226 + [node name="EnemyTemplate" instance=ExtResource("1_5po38")] collision_layer = 16 collision_mask = 25 +floor_stop_on_slope = false [node name="AnimatedSprite" parent="." index="2"] material = SubResource("ShaderMaterial_k8mt5") +[node name="InteractiveCollision" parent="InteractiveArea" index="0"] +shape = SubResource("CircleShape2D_wu0xv") + [node name="ViewRay" type="RayCast2D" parent="." index="6"] position = Vector2(0, -8) enabled = false @@ -29,7 +36,6 @@ [node name="FirePoint" type="Marker2D" parent="." index="8"] [node name="NavigationPoint" type="Marker2D" parent="." index="9"] -position = Vector2(0, -5) [node name="NavigationAgent2D" type="NavigationAgent2D" parent="NavigationPoint" index="0"] path_desired_distance = 3.0 diff --git a/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn b/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn index faf3e36..be6716b 100644 --- a/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn +++ b/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=8 format=3 uid="uid://cyrcv2jdgr8cf"] +[gd_scene load_steps=9 format=3 uid="uid://cyrcv2jdgr8cf"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_xk5yk"] [ext_resource type="Script" path="res://src/game/activity/role/MountRotation.cs" id="2_5ddpw"] +[ext_resource type="Script" path="res://src/framework/activity/hurt/HurtArea.cs" id="2_8jnvr"] [ext_resource type="SpriteFrames" uid="uid://c8h5svp76h3kw" path="res://resource/spriteFrames/role/Role_tip.tres" id="3_bo78w"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_yif6x"] @@ -22,11 +23,13 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_1eja2"] size = Vector2(12, 18) -[sub_resource type="RectangleShape2D" id="RectangleShape2D_n68nu"] -size = Vector2(10, 16.5) +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_843d5"] +radius = 8.0 +height = 16.0 [node name="RoleTemplate" type="CharacterBody2D"] collision_layer = 0 +collision_mask = 513 [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 @@ -39,33 +42,34 @@ offset = Vector2(0, -12) [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, -4) +position = Vector2(0, -2) shape = SubResource("CircleShape2D_5pj80") [node name="HurtArea" type="Area2D" parent="."] collision_layer = 0 collision_mask = 0 monitoring = false +script = ExtResource("2_8jnvr") [node name="HurtCollision" type="CollisionShape2D" parent="HurtArea"] position = Vector2(0, -9) shape = SubResource("RectangleShape2D_1eja2") [node name="InteractiveArea" type="Area2D" parent="."] -visible = false collision_layer = 0 collision_mask = 4 monitorable = false [node name="InteractiveCollision" type="CollisionShape2D" parent="InteractiveArea"] -position = Vector2(0, -5) -shape = SubResource("RectangleShape2D_n68nu") +position = Vector2(0, -2) +shape = SubResource("CapsuleShape2D_843d5") [node name="MountPoint" type="Marker2D" parent="."] position = Vector2(2, -8) script = ExtResource("2_5ddpw") [node name="MeleeAttackArea" type="Area2D" parent="MountPoint"] +visible = false collision_layer = 0 collision_mask = 0 monitorable = false diff --git a/DungeonShooting_Godot/prefab/ui/Debugger.tscn b/DungeonShooting_Godot/prefab/ui/Debugger.tscn index fcd8420..efcc719 100644 --- a/DungeonShooting_Godot/prefab/ui/Debugger.tscn +++ b/DungeonShooting_Godot/prefab/ui/Debugger.tscn @@ -60,10 +60,10 @@ [node name="HoverButton" type="Button" parent="."] layout_mode = 0 -offset_left = 18.0 -offset_top = 169.0 -offset_right = 46.0 -offset_bottom = 193.0 +offset_left = 1295.0 +offset_top = 10.0 +offset_right = 1323.0 +offset_bottom = 34.0 scale = Vector2(2, 2) icon = ExtResource("2_acjpv") flat = true @@ -74,8 +74,8 @@ anchors_preset = 5 anchor_left = 0.5 anchor_right = 0.5 -offset_left = -4.5 -offset_right = 4.5 +offset_left = 400.0 +offset_right = 504.0 offset_bottom = 40.0 grow_horizontal = 2 text = "FPS:60" diff --git a/DungeonShooting_Godot/prefab/ui/EditorColorPicker.tscn b/DungeonShooting_Godot/prefab/ui/EditorColorPicker.tscn new file mode 100644 index 0000000..6d0e4a3 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorColorPicker.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=2 format=3 uid="uid://ceinixdnf00ta"] + +[ext_resource type="Script" path="res://src/game/ui/editorColorPicker/EditorColorPickerPanel.cs" id="1_yaxtp"] + +[node name="EditorColorPicker" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_yaxtp") + +[node name="ColorPicker" type="ColorPicker" parent="."] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 648.0 +grow_horizontal = 2 diff --git a/DungeonShooting_Godot/prefab/ui/EditorDungeonGroup.tscn b/DungeonShooting_Godot/prefab/ui/EditorDungeonGroup.tscn new file mode 100644 index 0000000..c29e13b --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorDungeonGroup.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=2 format=3 uid="uid://1ptjcb64rdbf"] + +[ext_resource type="Script" path="res://src/game/ui/editorDungeonGroup/EditorDungeonGroupPanel.cs" id="1_apg3p"] + +[node name="EditorDungeonGroup" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_apg3p") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="NameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "名称:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="NameInput" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +placeholder_text = "请输入名称" + +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="NameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "图块集:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="TileSetOption" type="OptionButton" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 + +[node name="HBoxContainer5" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="RemarkNameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer5"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 20.0 +text = "备注:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="RemarkInput" type="TextEdit" parent="MarginContainer/VBoxContainer/HBoxContainer5"] +custom_minimum_size = Vector2(0, 150) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +placeholder_text = "选填" +wrap_mode = 1 diff --git a/DungeonShooting_Godot/prefab/ui/EditorForm.tscn b/DungeonShooting_Godot/prefab/ui/EditorForm.tscn new file mode 100644 index 0000000..7dd42cf --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorForm.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=2 format=3 uid="uid://djfbqfqkjoquj"] + +[ext_resource type="Script" path="res://src/game/ui/editorForm/EditorFormPanel.cs" id="1_oq0ff"] + +[node name="EditorForm" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_oq0ff") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 20 + +[node name="Item" type="HBoxContainer" parent="MarginContainer/ScrollContainer/VBoxContainer"] +layout_mode = 2 + +[node name="NameLabel" type="Label" parent="MarginContainer/ScrollContainer/VBoxContainer/Item"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "名称:" +horizontal_alignment = 2 +vertical_alignment = 1 diff --git a/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn b/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn new file mode 100644 index 0000000..d03d013 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=2 format=3 uid="uid://dl0u8eggomust"] + +[ext_resource type="Script" path="res://src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs" id="1_4wd6k"] + +[node name="EditorImportCombination" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_4wd6k") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="NameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "组名称:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="NameInput" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +placeholder_text = "请输入组合名称" + +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="PreviewLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 20.0 +text = "预览:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="PreviewBg" type="ColorRect" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +clip_children = 2 +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +color = Color(0.270588, 0.270588, 0.270588, 1) + +[node name="PreviewTexture" type="TextureRect" parent="MarginContainer/VBoxContainer/HBoxContainer2/PreviewBg"] +custom_minimum_size = Vector2(0, 300) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +expand_mode = 2 +stretch_mode = 5 diff --git a/DungeonShooting_Godot/prefab/ui/EditorInfo.tscn b/DungeonShooting_Godot/prefab/ui/EditorInfo.tscn new file mode 100644 index 0000000..4da2af9 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorInfo.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=2 format=3 uid="uid://45krchsjrluh"] + +[ext_resource type="Script" path="res://src/game/ui/editorInfo/EditorInfoPanel.cs" id="1_3800s"] + +[node name="EditorInfo" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_3800s") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="NameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "名称:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="NameInput" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +placeholder_text = "请输入名称" + +[node name="HBoxContainer5" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="RemarkNameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer5"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 20.0 +text = "备注:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="RemarkInput" type="TextEdit" parent="MarginContainer/VBoxContainer/HBoxContainer5"] +custom_minimum_size = Vector2(0, 150) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +placeholder_text = "选填" +wrap_mode = 1 diff --git a/DungeonShooting_Godot/prefab/ui/EditorInput.tscn b/DungeonShooting_Godot/prefab/ui/EditorInput.tscn new file mode 100644 index 0000000..27cf072 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorInput.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=2 format=3 uid="uid://cewbs487ebu2w"] + +[ext_resource type="Script" path="res://src/game/ui/editorInput/EditorInputPanel.cs" id="1_n62mt"] + +[node name="EditorInput" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_n62mt") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +size_flags_vertical = 10 +text = "描述:" +vertical_alignment = 1 + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +size_flags_vertical = 2 diff --git a/DungeonShooting_Godot/prefab/ui/EditorManager.tscn b/DungeonShooting_Godot/prefab/ui/EditorManager.tscn new file mode 100644 index 0000000..a820185 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorManager.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=5 format=3 uid="uid://bd0jthh4nqnoj"] + +[ext_resource type="Script" path="res://src/game/ui/editorManager/EditorManagerPanel.cs" id="1_6qnog"] +[ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_ykjr7"] +[ext_resource type="PackedScene" uid="uid://dh7y03tq6v0a2" path="res://prefab/ui/MapEditorProject.tscn" id="3_hlfkf"] +[ext_resource type="PackedScene" uid="uid://bxrpxwsvveq8i" path="res://prefab/ui/TileSetEditorProject.tscn" id="4_mejcx"] + +[node name="EditorManager" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_6qnog") + +[node name="Bg" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="Bg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 0 + +[node name="Head" type="Panel" parent="Bg/VBoxContainer"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 + +[node name="Back" type="Button" parent="Bg/VBoxContainer/Head"] +layout_mode = 2 +offset_left = 2.0 +offset_top = 2.0 +offset_right = 62.0 +offset_bottom = 68.0 +size_flags_horizontal = 0 +icon = ExtResource("2_ykjr7") +icon_alignment = 1 + +[node name="Title" type="Label" parent="Bg/VBoxContainer/Head"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -4.5 +offset_top = -20.0 +offset_right = 4.5 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "地图管理器" + +[node name="TabContainer" type="TabContainer" parent="Bg/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Map" type="MarginContainer" parent="Bg/VBoxContainer/TabContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 10 + +[node name="MapEditorProject" parent="Bg/VBoxContainer/TabContainer/Map" instance=ExtResource("3_hlfkf")] +layout_mode = 2 + +[node name="TileSet" type="MarginContainer" parent="Bg/VBoxContainer/TabContainer"] +visible = false +layout_mode = 2 +theme_override_constants/margin_top = 10 + +[node name="TileSetEditorProject" parent="Bg/VBoxContainer/TabContainer/TileSet" instance=ExtResource("4_mejcx")] +layout_mode = 2 diff --git a/DungeonShooting_Godot/prefab/ui/EditorTileImage.tscn b/DungeonShooting_Godot/prefab/ui/EditorTileImage.tscn new file mode 100644 index 0000000..5a15d4c --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/EditorTileImage.tscn @@ -0,0 +1,181 @@ +[gd_scene load_steps=5 format=3 uid="uid://c0j60lj0euk3y"] + +[ext_resource type="Script" path="res://src/game/ui/editorTileImage/EditorTileImagePanel.cs" id="1_y1hns"] +[ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="2_ntsra"] +[ext_resource type="Script" path="res://src/game/ui/editorTileImage/ImageBg.cs" id="2_qkj2u"] +[ext_resource type="Script" path="res://src/game/ui/editorTileImage/RectBrush.cs" id="3_fic1t"] + +[node name="EditorTileImage" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_y1hns") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 0 + +[node name="Left" type="Panel" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Bg" type="ColorRect" parent="HBoxContainer/Left"] +clip_children = 2 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.145098, 0.145098, 0.145098, 1) +script = ExtResource("2_qkj2u") + +[node name="TextureRoot" type="Control" parent="HBoxContainer/Left/Bg"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -0.5 +offset_right = 0.5 +offset_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="TileSprite" type="Sprite2D" parent="HBoxContainer/Left/Bg/TextureRoot"] +centered = false + +[node name="Brush" type="Control" parent="HBoxContainer/Left/Bg/TextureRoot"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("3_fic1t") + +[node name="FocusBtn" type="TextureButton" parent="HBoxContainer/Left/Bg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("2_ntsra") +ignore_texture_size = true +stretch_mode = 5 + +[node name="Right" type="Panel" parent="HBoxContainer"] +custom_minimum_size = Vector2(370, 0) +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Right"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 9.0 +offset_right = -4.0 +offset_bottom = -5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 16 + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "起始X" + +[node name="StartX" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer2"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "起始Y" + +[node name="StartY" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 + +[node name="HBoxContainer3" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer3"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "间距X" + +[node name="OffsetX" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer3"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 + +[node name="HBoxContainer4" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer4"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "间距Y" + +[node name="OffsetY" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer4"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 + +[node name="HBoxContainer5" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer5"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "横轴数量" + +[node name="HCount" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer5"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 + +[node name="HBoxContainer6" type="HBoxContainer" parent="HBoxContainer/Right/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer6"] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +text = "纵轴数量" + +[node name="VCount" type="SpinBox" parent="HBoxContainer/Right/VBoxContainer/HBoxContainer6"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 9999.0 diff --git a/DungeonShooting_Godot/prefab/ui/EditorWindow.tscn b/DungeonShooting_Godot/prefab/ui/EditorWindow.tscn index 1a8f5bb..17a2e37 100644 --- a/DungeonShooting_Godot/prefab/ui/EditorWindow.tscn +++ b/DungeonShooting_Godot/prefab/ui/EditorWindow.tscn @@ -28,7 +28,7 @@ size = Vector2i(500, 350) visible = false transient = true -min_size = Vector2i(500, 350) +min_size = Vector2i(100, 100) theme_override_constants/title_height = 33 [node name="Panel" type="Panel" parent="Window"] diff --git a/DungeonShooting_Godot/prefab/ui/Main.tscn b/DungeonShooting_Godot/prefab/ui/Main.tscn index adb11ae..b3558c1 100644 --- a/DungeonShooting_Godot/prefab/ui/Main.tscn +++ b/DungeonShooting_Godot/prefab/ui/Main.tscn @@ -32,8 +32,8 @@ [node name="Title" type="Label" parent="VBoxContainer"] layout_mode = 2 size_flags_vertical = 6 -theme_override_font_sizes/font_size = 160 -text = "Dungeon Shooting" +theme_override_font_sizes/font_size = 120 +text = "枪火地牢" horizontal_alignment = 1 vertical_alignment = 1 @@ -54,7 +54,7 @@ layout_mode = 2 theme = ExtResource("2_bbd6i") theme_override_font_sizes/font_size = 32 -text = "开发者工具" +text = "地图编辑器" [node name="Setting" type="Button" parent="VBoxContainer/ButtonList"] custom_minimum_size = Vector2(0, 50) @@ -92,7 +92,7 @@ anchor_bottom = 1.0 offset_left = 23.0 offset_top = -100.0 -offset_right = 1943.0 +offset_right = 215.0 offset_bottom = -68.0 grow_vertical = 0 text = "b站:小李xlxl" @@ -105,7 +105,7 @@ anchor_bottom = 1.0 offset_left = 23.0 offset_top = -55.0 -offset_right = 1943.0 +offset_right = 183.0 offset_bottom = -23.0 grow_vertical = 0 text = "GitHub源码" diff --git a/DungeonShooting_Godot/prefab/ui/MapEditor.tscn b/DungeonShooting_Godot/prefab/ui/MapEditor.tscn index 399fdf1..7af9347 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditor.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://csbxfkdupsckv"] +[gd_scene load_steps=16 format=3 uid="uid://csbxfkdupsckv"] [ext_resource type="Script" path="res://src/game/ui/mapEditor/MapEditorPanel.cs" id="1_5s7a0"] [ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_gkcw7"] @@ -10,7 +10,8 @@ [ext_resource type="PackedScene" uid="uid://b4u66mxndxbrg" path="res://prefab/ui/MapEditorTools.tscn" id="6_7pvgu"] [ext_resource type="PackedScene" uid="uid://bb2ekkpxifd7g" path="res://prefab/ui/MapEditorMapLayer.tscn" id="7_ychtn"] [ext_resource type="PackedScene" uid="uid://peo0n8bl15y5" path="res://prefab/ui/MapEditorMapMark.tscn" id="8_8tgeu"] -[ext_resource type="PackedScene" uid="uid://dhtfat7tr8ujw" path="res://prefab/ui/MapEditorTileSet.tscn" id="11_7yaoy"] +[ext_resource type="NavigationPolygon" uid="uid://brpcle7mygiml" path="res://resource/navigation/NavigationPolygon.tres" id="8_t7nq5"] +[ext_resource type="PackedScene" uid="uid://tjbfj67t5akm" path="res://prefab/ui/MapEditorMapTile.tscn" id="10_4fu5v"] [sub_resource type="Animation" id="Animation_o3btm"] length = 0.001 @@ -162,17 +163,39 @@ icon = ExtResource("5_ubl8b") icon_alignment = 1 -[node name="HSplitContainer" type="HSplitContainer" parent="Bg/VBoxContainer"] +[node name="HSplitContainer" type="HBoxContainer" parent="Bg/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +theme_override_constants/separation = 0 -[node name="Left" type="Panel" parent="Bg/VBoxContainer/HSplitContainer"] -custom_minimum_size = Vector2(1000, 0) +[node name="HSplitContainer2" type="HSplitContainer" parent="Bg/VBoxContainer/HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 4.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2"] layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 7.0 -[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/Left"] +[node name="LayerPanel" type="Panel" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer"] +custom_minimum_size = Vector2(350, 0) +layout_mode = 2 + +[node name="MapEditorMapLayer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/LayerPanel" instance=ExtResource("7_ychtn")] +layout_mode = 1 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 + +[node name="Left" type="Panel" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 + +[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -184,22 +207,29 @@ theme_override_constants/margin_right = 2 theme_override_constants/margin_bottom = 2 -[node name="MapView" type="SubViewportContainer" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer"] +[node name="MapView" type="SubViewportContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer"] layout_mode = 2 -[node name="SubViewport" type="SubViewport" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView"] +[node name="SubViewport" type="SubViewport" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView"] handle_input_locally = false +snap_2d_transforms_to_pixel = true +snap_2d_vertices_to_pixel = true canvas_item_default_texture_filter = 0 -size = Vector2i(1334, 1002) +size = Vector2i(980, 1002) render_target_update_mode = 4 -[node name="TileMap" type="TileMap" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport"] +[node name="TileMap" type="TileMap" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport" groups=["navigation"]] +y_sort_enabled = true position = Vector2(500, 540) scale = Vector2(4, 4) format = 2 script = ExtResource("4_mhy1a") -[node name="ErrorCell" type="Sprite2D" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport/TileMap"] +[node name="NavigationRegion" type="NavigationRegion2D" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport/TileMap"] +z_index = 10 +navigation_polygon = ExtResource("8_t7nq5") + +[node name="ErrorCell" type="Sprite2D" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport/TileMap"] visible = false modulate = Color(1, 0, 0, 0) z_index = 10 @@ -207,30 +237,30 @@ texture = ExtResource("4_465u2") centered = false -[node name="ErrorCellAnimationPlayer" type="AnimationPlayer" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport/TileMap/ErrorCell"] +[node name="ErrorCellAnimationPlayer" type="AnimationPlayer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport/TileMap/ErrorCell"] libraries = { "": SubResource("AnimationLibrary_371oi") } -[node name="Brush" type="Node2D" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport/TileMap"] +[node name="Brush" type="Node2D" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport/TileMap"] z_index = 100 -[node name="CanvasLayer" type="CanvasLayer" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport"] +[node name="CanvasLayer" type="CanvasLayer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport"] layer = 2 -[node name="MapEditorTools" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer/MapView/SubViewport/CanvasLayer" instance=ExtResource("6_7pvgu")] +[node name="MapEditorTools" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer/MapView/SubViewport/CanvasLayer" instance=ExtResource("6_7pvgu")] -[node name="MapView2" type="TextureRect" parent="Bg/VBoxContainer/HSplitContainer/Left/MarginContainer"] +[node name="MapView2" type="TextureRect" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/HBoxContainer/Left/MarginContainer"] visible = false layout_mode = 2 -[node name="Right" type="Panel" parent="Bg/VBoxContainer/HSplitContainer"] -custom_minimum_size = Vector2(300, 0) +[node name="Right" type="Panel" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2"] +custom_minimum_size = Vector2(450, 0) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 3.0 -[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/Right"] +[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -242,29 +272,21 @@ theme_override_constants/margin_right = 2 theme_override_constants/margin_bottom = 2 -[node name="TabContainer" type="TabContainer" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer"] +[node name="TabContainer" type="TabContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right/MarginContainer"] layout_mode = 2 size_flags_vertical = 3 -[node name="MapMark" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer"] +[node name="MapTile" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right/MarginContainer/TabContainer"] layout_mode = 2 theme_override_constants/margin_top = 10 -[node name="MapEditorMapMark" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer/MapMark" instance=ExtResource("8_8tgeu")] +[node name="MapEditorMapTile" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right/MarginContainer/TabContainer/MapTile" instance=ExtResource("10_4fu5v")] layout_mode = 2 -[node name="MapLayer" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer"] +[node name="MapMark" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right/MarginContainer/TabContainer"] visible = false layout_mode = 2 theme_override_constants/margin_top = 10 -[node name="MapEditorMapLayer" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer/MapLayer" instance=ExtResource("7_ychtn")] -layout_mode = 2 - -[node name="MapTileSet" type="MarginContainer" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer"] -visible = false -layout_mode = 2 -theme_override_constants/margin_top = 10 - -[node name="MapEditorTileSet" parent="Bg/VBoxContainer/HSplitContainer/Right/MarginContainer/TabContainer/MapTileSet" instance=ExtResource("11_7yaoy")] +[node name="MapEditorMapMark" parent="Bg/VBoxContainer/HSplitContainer/HSplitContainer2/Right/MarginContainer/TabContainer/MapMark" instance=ExtResource("8_8tgeu")] layout_mode = 2 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorCreateGroup.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorCreateGroup.tscn deleted file mode 100644 index 8788c6c..0000000 --- a/DungeonShooting_Godot/prefab/ui/MapEditorCreateGroup.tscn +++ /dev/null @@ -1,65 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://45krchsjrluh"] - -[ext_resource type="Script" path="res://src/game/ui/mapEditorCreateGroup/MapEditorCreateGroupPanel.cs" id="1_qoujx"] - -[node name="MapEditorCreateGroup" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_qoujx") - -[node name="MarginContainer" type="MarginContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 20 -theme_override_constants/margin_top = 50 -theme_override_constants/margin_right = 20 -theme_override_constants/margin_bottom = 20 - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] -layout_mode = 2 -theme_override_constants/separation = 20 - -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="GroupNameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 20.0 -text = "组名称:" -horizontal_alignment = 2 -vertical_alignment = 1 - -[node name="GroupNameInput" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 80.0 -placeholder_text = "请输入组名称" - -[node name="HBoxContainer5" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="RemarkNameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer5"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -size_flags_stretch_ratio = 20.0 -text = "组备注:" -horizontal_alignment = 2 -vertical_alignment = 1 - -[node name="RemarkInput" type="TextEdit" parent="MarginContainer/VBoxContainer/HBoxContainer5"] -custom_minimum_size = Vector2(0, 150) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 80.0 -placeholder_text = "选填" -wrap_mode = 1 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorCreatePreinstall.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorCreatePreinstall.tscn index a90e76d..9ef4b9b 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorCreatePreinstall.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorCreatePreinstall.tscn @@ -44,6 +44,23 @@ size_flags_stretch_ratio = 80.0 placeholder_text = "请输入预设名称" +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="PreinstallNameLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 20.0 +text = "自动填充:" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="AutoCheckInput" type="CheckBox" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 +flat = true + [node name="HBoxContainer4" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] layout_mode = 2 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorMapLayer.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorMapLayer.tscn index eabd3a6..64daa22 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorMapLayer.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorMapLayer.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://bb2ekkpxifd7g"] +[gd_scene load_steps=5 format=3 uid="uid://bb2ekkpxifd7g"] [ext_resource type="Script" path="res://src/game/ui/mapEditorMapLayer/MapEditorMapLayerPanel.cs" id="1_3j05m"] [ext_resource type="Texture2D" uid="uid://dmm8jw06bhffh" path="res://resource/sprite/ui/commonIcon/Lock.png" id="2_pfhyj"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="3_k8b5h"] [ext_resource type="Texture2D" uid="uid://dqvg18aacx6db" path="res://resource/sprite/ui/commonIcon/Visible.png" id="3_rqjh4"] [node name="MapEditorMapLayer" type="Control"] @@ -21,9 +22,17 @@ grow_horizontal = 2 grow_vertical = 2 -[node name="LayerLabel" type="Label" parent="VBoxContainer"] +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] layout_mode = 2 -text = "地图层级:" + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "淡化未选中的层" + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +flat = true [node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] layout_mode = 2 @@ -37,6 +46,19 @@ icon = ExtResource("2_pfhyj") alignment = 0 +[node name="SelectTexture" type="NinePatchRect" parent="VBoxContainer/ScrollContainer/LayerButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("3_k8b5h") +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + [node name="VisibleButton" type="TextureButton" parent="VBoxContainer/ScrollContainer/LayerButton"] layout_mode = 1 anchors_preset = 11 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorMapMark.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorMapMark.tscn index 8bd0e6d..cfac2e0 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorMapMark.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorMapMark.tscn @@ -87,6 +87,22 @@ size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="AutoFillTip" type="ColorRect" parent="VBoxContainer/ScrollContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +color = Color(0.360784, 0.764706, 1, 0.0784314) + +[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer/AutoFillTip"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "当前预设启用了自动填充" +horizontal_alignment = 1 +text_overrun_behavior = 3 + [node name="AddWaveButton" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer"] layout_mode = 2 text = "添加波数" diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn new file mode 100644 index 0000000..49c7fd0 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn @@ -0,0 +1,287 @@ +[gd_scene load_steps=8 format=3 uid="uid://tjbfj67t5akm"] + +[ext_resource type="Script" path="res://src/game/ui/mapEditorMapTile/MapEditorMapTilePanel.cs" id="1_gtth6"] +[ext_resource type="Script" path="res://src/game/ui/mapEditorMapTile/FreeTileTab.cs" id="2_5c2no"] +[ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="3_sibps"] +[ext_resource type="Script" path="res://src/game/ui/mapEditorMapTile/TerrainTileTab.cs" id="4_jxcal"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="5_f4thw"] +[ext_resource type="Script" path="res://src/game/ui/mapEditorMapTile/CombinationTileTab.cs" id="5_ty17f"] +[ext_resource type="Texture2D" uid="uid://c4ltpf5a3egu1" path="res://resource/sprite/ui/commonIcon/Error_mini.png" id="6_u35dn"] + +[node name="MapEditorMapTile" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_gtth6") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +text = "资源:" + +[node name="SourceOption" type="OptionButton" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +text = "笔刷类型:" + +[node name="HandleOption" type="OptionButton" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 3 +selected = 0 +popup/item_0/text = "自由绘制" +popup/item_0/id = 0 +popup/item_1/text = "地形绘制" +popup/item_1/id = 1 +popup/item_2/text = "组合绘制" +popup/item_2/id = 2 + +[node name="Panel" type="Panel" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 2 +theme_override_constants/margin_top = 2 +theme_override_constants/margin_right = 2 +theme_override_constants/margin_bottom = 2 + +[node name="Tab1" type="ColorRect" parent="VBoxContainer/Panel/MarginContainer"] +visible = false +clip_children = 2 +layout_mode = 2 +color = Color(0.145098, 0.145098, 0.145098, 1) +script = ExtResource("2_5c2no") + +[node name="TabRoot" type="Control" parent="VBoxContainer/Panel/MarginContainer/Tab1"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -0.5 +offset_right = 0.5 +offset_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="TileSprite" type="Sprite2D" parent="VBoxContainer/Panel/MarginContainer/Tab1/TabRoot"] +centered = false + +[node name="Brush" type="Control" parent="VBoxContainer/Panel/MarginContainer/Tab1/TabRoot"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Grid" type="ColorRect" parent="VBoxContainer/Panel/MarginContainer/Tab1"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(1, 1, 1, 0) + +[node name="FocusBtn" type="TextureButton" parent="VBoxContainer/Panel/MarginContainer/Tab1"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("3_sibps") +ignore_texture_size = true +stretch_mode = 5 + +[node name="Tab2" type="Control" parent="VBoxContainer/Panel/MarginContainer"] +layout_mode = 2 +script = ExtResource("4_jxcal") + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/Panel/MarginContainer/Tab2"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TerrainItem" type="Button" parent="VBoxContainer/Panel/MarginContainer/Tab2/ScrollContainer"] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Select" type="NinePatchRect" parent="VBoxContainer/Panel/MarginContainer/Tab2/ScrollContainer/TerrainItem"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("5_f4thw") +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + +[node name="TerrainName" type="Label" parent="VBoxContainer/Panel/MarginContainer/Tab2/ScrollContainer/TerrainItem"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 104.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Name +2x2" +vertical_alignment = 1 + +[node name="ErrorIcon" type="TextureRect" parent="VBoxContainer/Panel/MarginContainer/Tab2/ScrollContainer/TerrainItem"] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -46.0 +offset_top = -20.0 +offset_right = -6.0 +offset_bottom = 20.0 +grow_horizontal = 0 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("6_u35dn") + +[node name="TerrainPreview" type="TextureRect" parent="VBoxContainer/Panel/MarginContainer/Tab2/ScrollContainer/TerrainItem"] +layout_mode = 1 +anchors_preset = 9 +anchor_bottom = 1.0 +offset_left = 3.0 +offset_top = 3.0 +offset_right = 97.0 +offset_bottom = -3.0 +grow_vertical = 2 +expand_mode = 2 +stretch_mode = 5 + +[node name="Tab3" type="Control" parent="VBoxContainer/Panel/MarginContainer"] +visible = false +layout_mode = 2 +script = ExtResource("5_ty17f") + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/Panel/MarginContainer/Tab3"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="CellButton" type="Button" parent="VBoxContainer/Panel/MarginContainer/Tab3/ScrollContainer"] +custom_minimum_size = Vector2(120, 170) +layout_mode = 2 + +[node name="PreviewImage" type="TextureRect" parent="VBoxContainer/Panel/MarginContainer/Tab3/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -52.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand_mode = 2 +stretch_mode = 5 + +[node name="CellName" type="Label" parent="VBoxContainer/Panel/MarginContainer/Tab3/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -52.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_font_sizes/font_size = 16 +text = "名称" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 +clip_text = true +text_overrun_behavior = 2 + +[node name="SelectTexture" type="NinePatchRect" parent="VBoxContainer/Panel/MarginContainer/Tab3/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("5_f4thw") +region_rect = Rect2(0, 0, 36, 36) +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + +[node name="MaskBg" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.862745) + +[node name="Label" type="Label" parent="MaskBg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "选中地板层时不能使用自定义图块" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 1 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorProject.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorProject.tscn index b4a3d9a..183f7b3 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorProject.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorProject.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=9 format=3 uid="uid://dh7y03tq6v0a2"] +[gd_scene load_steps=8 format=3 uid="uid://dh7y03tq6v0a2"] [ext_resource type="Script" path="res://src/game/ui/mapEditorProject/MapEditorProjectPanel.cs" id="1_5aioo"] -[ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_v0ry0"] [ext_resource type="Texture2D" uid="uid://blfvsup876agh" path="res://resource/sprite/ui/commonIcon/Search.png" id="3_f5h8c"] [ext_resource type="Texture2D" uid="uid://n4atvj5fkcpg" path="res://resource/sprite/ui/commonIcon/Add.png" id="4_okvq0"] [ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="5_rcbyx"] @@ -17,50 +16,23 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_5aioo") -metadata/_edit_horizontal_guides_ = [449.0] -[node name="Bg" type="Panel" parent="."] +[node name="HBoxContainer" type="HBoxContainer" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="Bg"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 0 - -[node name="Head" type="Panel" parent="Bg/VBoxContainer"] -custom_minimum_size = Vector2(0, 70) -layout_mode = 2 - -[node name="Back" type="Button" parent="Bg/VBoxContainer/Head"] -layout_mode = 2 -offset_left = 2.0 -offset_top = 2.0 -offset_right = 62.0 -offset_bottom = 68.0 -size_flags_horizontal = 0 -icon = ExtResource("2_v0ry0") -icon_alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer"] -layout_mode = 2 size_flags_vertical = 3 theme_override_constants/separation = 0 -[node name="Panel" type="Panel" parent="Bg/VBoxContainer/HBoxContainer"] +[node name="Panel" type="Panel" parent="HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 2.0 -[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel"] +[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/Panel"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -72,31 +44,44 @@ theme_override_constants/margin_right = 12 theme_override_constants/margin_bottom = 12 -[node name="VBoxContainer" type="VBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Panel/MarginContainer"] layout_mode = 2 -[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer"] +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer"] custom_minimum_size = Vector2(0, 45) layout_mode = 2 -[node name="GroupSearchInput" type="LineEdit" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="GroupSearchInput" type="LineEdit" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 placeholder_text = "搜索" -[node name="GroupSearchButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="GroupSearchButton" type="Button" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 icon = ExtResource("3_f5h8c") -[node name="GroupAddButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="HBoxContainer2" type="HBoxContainer" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 45) layout_mode = 2 + +[node name="GroupAddButton" type="Button" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 10 icon = ExtResource("4_okvq0") -[node name="ScrollContainer" type="ScrollContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer"] +[node name="GroupEditButton" type="Button" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +icon = ExtResource("6_qalh0") + +[node name="GroupDeleteButton" type="Button" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +icon = ExtResource("7_lnry3") + +[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 -[node name="GroupButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer/ScrollContainer"] +[node name="GroupButton" type="Button" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/ScrollContainer"] custom_minimum_size = Vector2(0, 100) layout_mode = 2 size_flags_horizontal = 3 @@ -104,7 +89,7 @@ alignment = 0 text_overrun_behavior = 3 -[node name="SelectTexture" type="NinePatchRect" parent="Bg/VBoxContainer/HBoxContainer/Panel/MarginContainer/VBoxContainer/ScrollContainer/GroupButton"] +[node name="SelectTexture" type="NinePatchRect" parent="HBoxContainer/Panel/MarginContainer/VBoxContainer/ScrollContainer/GroupButton"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -118,12 +103,12 @@ patch_margin_right = 3 patch_margin_bottom = 3 -[node name="Panel2" type="Panel" parent="Bg/VBoxContainer/HBoxContainer"] +[node name="Panel2" type="Panel" parent="HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 8.0 -[node name="MarginContainer" type="MarginContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel2"] +[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/Panel2"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -135,47 +120,47 @@ theme_override_constants/margin_right = 12 theme_override_constants/margin_bottom = 12 -[node name="VBoxContainer" type="VBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Panel2/MarginContainer"] layout_mode = 2 -[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer"] +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer"] custom_minimum_size = Vector2(0, 45) layout_mode = 2 -[node name="RoomSearchInput" type="LineEdit" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomSearchInput" type="LineEdit" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] custom_minimum_size = Vector2(500, 0) layout_mode = 2 placeholder_text = "搜索" -[node name="RoomTypeButton" type="OptionButton" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomTypeButton" type="OptionButton" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] custom_minimum_size = Vector2(200, 0) layout_mode = 2 -[node name="RoomSearchButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomSearchButton" type="Button" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 icon = ExtResource("3_f5h8c") -[node name="RoomAddButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomAddButton" type="Button" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 icon = ExtResource("4_okvq0") -[node name="RoomEditButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomEditButton" type="Button" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 icon = ExtResource("6_qalh0") -[node name="RoomDeleteButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] +[node name="RoomDeleteButton" type="Button" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 icon = ExtResource("7_lnry3") -[node name="ScrollContainer" type="ScrollContainer" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer"] +[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 -[node name="RoomButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer"] +[node name="RoomButton" type="Button" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer"] custom_minimum_size = Vector2(200, 285) layout_mode = 2 -[node name="PreviewImage" type="TextureRect" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] +[node name="PreviewImage" type="TextureRect" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -189,7 +174,7 @@ mouse_filter = 2 stretch_mode = 5 -[node name="RoomName" type="Label" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] +[node name="RoomName" type="Label" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] layout_mode = 1 anchors_preset = 12 anchor_top = 1.0 @@ -204,7 +189,7 @@ clip_text = true text_overrun_behavior = 3 -[node name="RoomType" type="Label" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] +[node name="RoomType" type="Label" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] layout_mode = 1 anchors_preset = 12 anchor_top = 1.0 @@ -218,7 +203,7 @@ clip_text = true text_overrun_behavior = 3 -[node name="SelectTexture" type="NinePatchRect" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] +[node name="SelectTexture" type="NinePatchRect" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -232,7 +217,7 @@ patch_margin_right = 3 patch_margin_bottom = 3 -[node name="ErrorTexture" type="TextureRect" parent="Bg/VBoxContainer/HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] +[node name="ErrorTexture" type="TextureRect" parent="HBoxContainer/Panel2/MarginContainer/VBoxContainer/ScrollContainer/RoomButton"] layout_mode = 0 offset_left = 157.0 offset_top = 158.0 diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorTileSet.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorTileSet.tscn deleted file mode 100644 index 955772b..0000000 --- a/DungeonShooting_Godot/prefab/ui/MapEditorTileSet.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dhtfat7tr8ujw"] - -[ext_resource type="Script" path="res://src/game/ui/mapEditorTileSet/MapEditorTileSetPanel.cs" id="1_m3lbx"] - -[node name="MapEditorTileSet" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_m3lbx") - -[node name="Label" type="Label" parent="."] -layout_mode = 0 -offset_right = 9.0 -offset_bottom = 40.0 -text = "TileSet" diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn index c8d6055..9805b0d 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn @@ -32,6 +32,7 @@ grow_vertical = 2 mouse_filter = 1 script = ExtResource("1_mqp1c") +metadata/_edit_vertical_guides_ = [1900.0] [node name="ToolRoot" type="Control" parent="."] anchors_preset = 0 diff --git a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn index a16d493..8a8bc45 100644 --- a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn +++ b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://bvpmtfupny8iu"] +[gd_scene load_steps=22 format=3 uid="uid://bvpmtfupny8iu"] [ext_resource type="Script" path="res://src/game/ui/roomUI/RoomUIPanel.cs" id="1_tfcrp"] [ext_resource type="Texture2D" uid="uid://b67i86mtqrn32" path="res://resource/sprite/ui/roomUI/icon_bullet.png" id="2_ruc0p"] @@ -6,6 +6,8 @@ [ext_resource type="Texture2D" uid="uid://cukrx5yyqw86o" path="res://resource/sprite/ui/roomUI/ReloadBar.png" id="4_hy44s"] [ext_resource type="Texture2D" uid="uid://cx3i1nkcc4307" path="res://resource/sprite/ui/roomUI/ReloadBarBlock.png" id="5_w3lq2"] [ext_resource type="Texture2D" uid="uid://blywnftxn1cfd" path="res://resource/sprite/ui/roomUI/Life_full.png" id="6_ggviq"] +[ext_resource type="Material" uid="uid://j8t31iuumvhr" path="res://resource/material/Outline.tres" id="7_iw6pa"] +[ext_resource type="Texture2D" uid="uid://cysv0dpvm52xw" path="res://resource/sprite/ui/commonIcon/Gold_10.png" id="7_lyxvi"] [ext_resource type="Texture2D" uid="uid://cu0wlvrbntvyd" path="res://resource/sprite/prop/active/ActiveProp5000.png" id="10_5d4np"] [ext_resource type="Texture2D" uid="uid://b8u6s5n37157" path="res://resource/sprite/ui/roomUI/Panel2.png" id="10_eokvx"] [ext_resource type="Texture2D" uid="uid://0swkya4hn82c" path="res://resource/sprite/ui/roomUI/Panel.png" id="10_q3fs8"] @@ -159,17 +161,54 @@ mouse_filter = 2 metadata/_edit_lock_ = true -[node name="LifeBar" type="Control" parent="Control"] -anchors_preset = 0 -offset_right = 40.0 -offset_bottom = 40.0 -scale = Vector2(4, 4) +[node name="LifeBar" type="VBoxContainer" parent="Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -280.0 +grow_horizontal = 2 +grow_vertical = 2 -[node name="Life" type="TextureRect" parent="Control/LifeBar"] +[node name="Life" type="Control" parent="Control/LifeBar"] +custom_minimum_size = Vector2(48, 40) layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 + +[node name="LifeIcon" type="TextureRect" parent="Control/LifeBar/Life"] +layout_mode = 1 offset_right = 12.0 offset_bottom = 10.0 +scale = Vector2(4, 4) +size_flags_horizontal = 0 +size_flags_vertical = 0 texture = ExtResource("6_ggviq") +stretch_mode = 2 + +[node name="Gold" type="Control" parent="Control/LifeBar"] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 + +[node name="GoldIcon" type="TextureRect" parent="Control/LifeBar/Gold"] +material = ExtResource("7_iw6pa") +layout_mode = 1 +offset_right = 8.0 +offset_bottom = 8.0 +scale = Vector2(4, 4) +texture = ExtResource("7_lyxvi") +stretch_mode = 2 + +[node name="GoldText" type="Label" parent="Control/LifeBar/Gold"] +layout_mode = 1 +anchors_preset = 9 +anchor_bottom = 1.0 +offset_left = 32.0 +offset_top = -4.0 +offset_right = 285.0 +offset_bottom = 4.0 +grow_vertical = 2 +text = "0" [node name="ActivePropBar" type="Control" parent="Control"] layout_mode = 1 diff --git a/DungeonShooting_Godot/prefab/ui/Setting.tscn b/DungeonShooting_Godot/prefab/ui/Setting.tscn index d0eb890..1ecf5f0 100644 --- a/DungeonShooting_Godot/prefab/ui/Setting.tscn +++ b/DungeonShooting_Godot/prefab/ui/Setting.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://bnwweusrc44xy"] [ext_resource type="Script" path="res://src/game/ui/setting/SettingPanel.cs" id="1_ff0oi"] -[ext_resource type="Texture2D" uid="uid://bd0kpqji660ta" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_vgl60"] +[ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_vgl60"] [node name="Setting" type="Control"] layout_mode = 3 @@ -315,7 +315,7 @@ [node name="Value" type="Label" parent="ScrollContainer/KeySetting/Key14"] layout_mode = 2 -text = "Ctrl" +text = "Shift" [node name="Back" type="Button" parent="ScrollContainer/KeySetting"] layout_mode = 2 diff --git a/DungeonShooting_Godot/prefab/ui/Settlement.tscn b/DungeonShooting_Godot/prefab/ui/Settlement.tscn index a67e040..bc6b2ab 100644 --- a/DungeonShooting_Godot/prefab/ui/Settlement.tscn +++ b/DungeonShooting_Godot/prefab/ui/Settlement.tscn @@ -60,4 +60,4 @@ layout_mode = 2 focus_neighbor_bottom = NodePath("../Restart") theme = ExtResource("2_63mpy") -text = "回到主菜单" +text = "回到大厅" diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditor.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditor.tscn new file mode 100644 index 0000000..d602c57 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditor.tscn @@ -0,0 +1,164 @@ +[gd_scene load_steps=8 format=3 uid="uid://dn5brsxa6w3l6"] + +[ext_resource type="Script" path="res://src/game/ui/tileSetEditor/TileSetEditorPanel.cs" id="1_rgx4n"] +[ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_naycu"] +[ext_resource type="Texture2D" uid="uid://cat35d7ueu7gu" path="res://resource/sprite/ui/commonIcon/Save.png" id="3_bcuxk"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="4_t8bqb"] +[ext_resource type="Texture2D" uid="uid://n4atvj5fkcpg" path="res://resource/sprite/ui/commonIcon/Add.png" id="4_u8gg1"] +[ext_resource type="Texture2D" uid="uid://c5778ntk2rdon" path="res://resource/sprite/ui/commonIcon/Delete.png" id="5_gepb1"] +[ext_resource type="Texture2D" uid="uid://c4ltpf5a3egu1" path="res://resource/sprite/ui/commonIcon/Error_mini.png" id="7_2tur5"] + +[node name="TileSetEditor" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_rgx4n") + +[node name="Bg" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="Bg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 0 + +[node name="Head" type="Panel" parent="Bg/VBoxContainer"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 + +[node name="Back" type="Button" parent="Bg/VBoxContainer/Head"] +layout_mode = 2 +offset_left = 2.0 +offset_top = 2.0 +offset_right = 62.0 +offset_bottom = 68.0 +size_flags_horizontal = 0 +icon = ExtResource("2_naycu") +icon_alignment = 1 + +[node name="Save" type="Button" parent="Bg/VBoxContainer/Head"] +layout_mode = 0 +offset_left = 64.0 +offset_top = 2.0 +offset_right = 124.0 +offset_bottom = 68.0 +grow_vertical = 2 +size_flags_horizontal = 0 +icon = ExtResource("3_bcuxk") +icon_alignment = 1 + +[node name="Title" type="Label" parent="Bg/VBoxContainer/Head"] +layout_mode = 0 +offset_left = 136.0 +offset_top = 2.0 +offset_right = 272.0 +offset_bottom = 68.0 +text = "正在编辑" +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/separation = 0 + +[node name="LeftRoot" type="Panel" parent="Bg/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 + +[node name="Label" type="Label" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "资源:" + +[node name="AddButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("4_u8gg1") + +[node name="DeleteButton" type="Button" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("5_gepb1") + +[node name="OptionButton" type="OptionButton" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ColorRect" type="ColorRect" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer"] +custom_minimum_size = Vector2(0, 3) +layout_mode = 2 +color = Color(0.188235, 0.188235, 0.188235, 1) + +[node name="ScrollContainer" type="ScrollContainer" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Tab" type="Button" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/ScrollContainer"] +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +size_flags_horizontal = 3 +text = "页签" +flat = true + +[node name="ErrorIcon" type="TextureRect" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/ScrollContainer/Tab"] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -45.0 +offset_top = -20.0 +offset_right = -5.0 +offset_bottom = 20.0 +grow_horizontal = 0 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("7_2tur5") + +[node name="Select" type="NinePatchRect" parent="Bg/VBoxContainer/HBoxContainer/LeftRoot/VBoxContainer/ScrollContainer/Tab"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("4_t8bqb") +region_rect = Rect2(0, 0, 36, 36) +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + +[node name="RightRoot" type="Panel" parent="Bg/VBoxContainer/HBoxContainer"] +clip_children = 2 +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 6.0 diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn new file mode 100644 index 0000000..4a4806a --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn @@ -0,0 +1,305 @@ +[gd_scene load_steps=11 format=3 uid="uid://daias2tkvj20c"] + +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorCombination/TileSetEditorCombinationPanel.cs" id="1_to1lc"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorCombination/leftBottom/TileEditArea.cs" id="2_h43yx"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorCombination/leftTop/RectBrush.cs" id="3_avikb"] +[ext_resource type="Texture2D" uid="uid://fkg21rtph51d" path="res://resource/sprite/ui/commonIcon/Delete2.png" id="5_6jqro"] +[ext_resource type="Texture2D" uid="uid://7l7aqhsaexoh" path="res://resource/sprite/ui/commonIcon/Play.png" id="6_75xjp"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs" id="6_bb3jf"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="6_g5ey6"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorCombination/right/TileSelected.cs" id="6_gql80"] +[ext_resource type="Script" path="res://src/game/common/ui/EditorMaskBrush.cs" id="7_k0dkc"] +[ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="7_mbnpy"] + +[node name="TileSetEditorCombination" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_to1lc") +Layer = null + +[node name="HSplitContainer" type="HSplitContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VSplitContainer" type="VSplitContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 69.0 + +[node name="LeftTop" type="Panel" parent="HSplitContainer/VSplitContainer"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 50.0 + +[node name="MarginContainer" type="MarginContainer" parent="HSplitContainer/VSplitContainer/LeftTop"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 2 +theme_override_constants/margin_top = 2 +theme_override_constants/margin_right = 2 +theme_override_constants/margin_bottom = 2 + +[node name="LeftTopBg" type="ColorRect" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer"] +clip_children = 2 +z_index = 1 +layout_mode = 2 +color = Color(0.203922, 0.203922, 0.203922, 1) +script = ExtResource("6_bb3jf") + +[node name="CombinationRoot" type="Control" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -0.5 +offset_right = 0.5 +offset_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(3, 3) +mouse_filter = 2 + +[node name="CanvasRoot" type="Node2D" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg/CombinationRoot"] + +[node name="BrushRoot" type="Node2D" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg/CombinationRoot"] + +[node name="RectBrush" type="Node2D" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg/CombinationRoot"] +script = ExtResource("3_avikb") + +[node name="Grid" type="ColorRect" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(1, 1, 1, 0) + +[node name="FocusBtn" type="TextureButton" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("7_mbnpy") +ignore_texture_size = true +stretch_mode = 5 + +[node name="DeleteBtn" type="TextureButton" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -151.0 +offset_top = 14.0 +offset_right = -87.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "删除所有图块" +texture_normal = ExtResource("5_6jqro") +ignore_texture_size = true +stretch_mode = 5 + +[node name="ImportBtn" type="Button" parent="HSplitContainer/VSplitContainer/LeftTop/MarginContainer/LeftTopBg"] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -191.0 +offset_top = -84.0 +offset_right = -15.0 +offset_bottom = -20.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "导入组合" +icon = ExtResource("6_75xjp") + +[node name="LeftBottom" type="Panel" parent="HSplitContainer/VSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 50.0 + +[node name="MarginContainer" type="MarginContainer" parent="HSplitContainer/VSplitContainer/LeftBottom"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 2 +theme_override_constants/margin_top = 2 +theme_override_constants/margin_right = 2 +theme_override_constants/margin_bottom = 2 + +[node name="LeftBottomBg" type="ColorRect" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer"] +clip_children = 2 +z_index = 1 +layout_mode = 2 +color = Color(0.203922, 0.203922, 0.203922, 1) +script = ExtResource("2_h43yx") + +[node name="TileTexture" type="TextureRect" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(2, 2) +mouse_filter = 2 + +[node name="MaskRoot" type="Control" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg/TileTexture"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="MaskRect" type="ColorRect" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg/TileTexture/MaskRoot"] +layout_mode = 1 +offset_right = 16.0 +offset_bottom = 16.0 +mouse_filter = 2 +color = Color(0, 0, 0, 0.588235) + +[node name="MaskBrush" type="Control" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg/TileTexture"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("7_k0dkc") + +[node name="Grid" type="ColorRect" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(1, 1, 1, 0) + +[node name="FocusBtn" type="TextureButton" parent="HSplitContainer/VSplitContainer/LeftBottom/MarginContainer/LeftBottomBg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("7_mbnpy") +ignore_texture_size = true +stretch_mode = 5 + +[node name="Right" type="Panel" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 31.0 + +[node name="MarginContainer" type="MarginContainer" parent="HSplitContainer/Right"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 2 +theme_override_constants/margin_top = 2 +theme_override_constants/margin_right = 2 +theme_override_constants/margin_bottom = 2 + +[node name="RightBg" type="VBoxContainer" parent="HSplitContainer/Right/MarginContainer"] +layout_mode = 2 +script = ExtResource("6_gql80") + +[node name="Label" type="Label" parent="HSplitContainer/Right/MarginContainer/RightBg"] +layout_mode = 2 +text = "已经导入的组合:" + +[node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer/Right/MarginContainer/RightBg"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="CellButton" type="Button" parent="HSplitContainer/Right/MarginContainer/RightBg/ScrollContainer"] +custom_minimum_size = Vector2(120, 170) +layout_mode = 2 + +[node name="PreviewImage" type="TextureRect" parent="HSplitContainer/Right/MarginContainer/RightBg/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -52.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand_mode = 2 +stretch_mode = 5 + +[node name="CellName" type="Label" parent="HSplitContainer/Right/MarginContainer/RightBg/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -52.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_font_sizes/font_size = 16 +text = "名称" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 +clip_text = true +text_overrun_behavior = 2 + +[node name="SelectTexture" type="NinePatchRect" parent="HSplitContainer/Right/MarginContainer/RightBg/ScrollContainer/CellButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("6_g5ey6") +region_rect = Rect2(0, 0, 36, 36) +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorImport.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorImport.tscn new file mode 100644 index 0000000..1666fc6 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorImport.tscn @@ -0,0 +1,120 @@ +[gd_scene load_steps=4 format=3 uid="uid://d4h6gt4jkx25e"] + +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorImport/TileSetEditorImportPanel.cs" id="1_rkxih"] +[ext_resource type="Texture2D" uid="uid://duos2p6if4kcp" path="res://resource/sprite/ui/commonIcon/Import.png" id="2_cc6ug"] +[ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="3_tbedj"] + +[node name="TileSetEditorImport" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_rkxih") +Layer = null + +[node name="ImportPreviewBg" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.145098, 0.145098, 0.145098, 1) + +[node name="ImportButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +flat = true + +[node name="ImportLabel" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -388.0 +offset_top = 39.0 +offset_right = 388.0 +offset_bottom = 79.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "点击导入纹理或者将纹理拖拽到该区域, 格式为'.png'" + +[node name="ImportIcon" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -32.0 +offset_right = 32.0 +offset_bottom = 32.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_cc6ug") + +[node name="Control" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -0.5 +offset_right = 0.5 +offset_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="ImportPreview" type="Sprite2D" parent="Control"] + +[node name="ImportColorPicker" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -269.0 +offset_top = 50.0 +offset_right = -65.0 +offset_bottom = 107.0 +grow_horizontal = 0 +text = "背景颜色" + +[node name="ReimportButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -269.0 +offset_top = 131.0 +offset_right = -65.0 +offset_bottom = 188.0 +grow_horizontal = 0 +text = "重新导入" + +[node name="FocusBtn" type="TextureButton" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -129.0 +offset_top = 212.0 +offset_right = -65.0 +offset_bottom = 276.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("3_tbedj") +ignore_texture_size = true +stretch_mode = 5 diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorProject.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorProject.tscn new file mode 100644 index 0000000..2ab1e70 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorProject.tscn @@ -0,0 +1,177 @@ +[gd_scene load_steps=8 format=3 uid="uid://bxrpxwsvveq8i"] + +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorProject/TileSetEditorProjectPanel.cs" id="1_rklha"] +[ext_resource type="Texture2D" uid="uid://blfvsup876agh" path="res://resource/sprite/ui/commonIcon/Search.png" id="3_htmoo"] +[ext_resource type="Texture2D" uid="uid://n4atvj5fkcpg" path="res://resource/sprite/ui/commonIcon/Add.png" id="4_6incc"] +[ext_resource type="Texture2D" uid="uid://dggb6p4sdmfry" path="res://resource/sprite/ui/commonIcon/Edit.png" id="5_0y7kc"] +[ext_resource type="Texture2D" uid="uid://do3q1nsagxayh" path="res://resource/sprite/ui/commonIcon/Success_mini.png" id="5_d0rev"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="5_l4lwx"] +[ext_resource type="Texture2D" uid="uid://c5778ntk2rdon" path="res://resource/sprite/ui/commonIcon/Delete.png" id="6_jwxdd"] + +[node name="TileSetEditorProject" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_rklha") + +[node name="Panel" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 + +[node name="MarginContainer" type="MarginContainer" parent="Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 12 +theme_override_constants/margin_top = 12 +theme_override_constants/margin_right = 12 +theme_override_constants/margin_bottom = 12 + +[node name="HBoxContainer2" type="HBoxContainer" parent="Panel/MarginContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer/HBoxContainer2"] +custom_minimum_size = Vector2(0, 45) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 7.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer"] +custom_minimum_size = Vector2(0, 45) +layout_mode = 2 + +[node name="TileSearchInput" type="LineEdit" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(400, 0) +layout_mode = 2 +placeholder_text = "搜索" + +[node name="TileSearchButton" type="Button" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("3_htmoo") + +[node name="TileAddButton" type="Button" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("4_6incc") + +[node name="TileEditButton" type="Button" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("5_0y7kc") + +[node name="TileDeleteButton" type="Button" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("6_jwxdd") + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 7.0 + +[node name="TileButton" type="Button" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/ScrollContainer"] +custom_minimum_size = Vector2(200, 60) +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Icon" type="TextureRect" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/ScrollContainer/TileButton"] +layout_mode = 1 +anchors_preset = 9 +anchor_bottom = 1.0 +offset_left = 6.0 +offset_top = 6.0 +offset_right = 54.0 +offset_bottom = -6.0 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("5_d0rev") + +[node name="TileName" type="Label" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/ScrollContainer/TileButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 59.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Name" +vertical_alignment = 1 +clip_text = true +text_overrun_behavior = 3 + +[node name="SelectTexture" type="NinePatchRect" parent="Panel/MarginContainer/HBoxContainer2/VBoxContainer/ScrollContainer/TileButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("5_l4lwx") +region_rect = Rect2(0, 0, 36, 36) +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + +[node name="Panel" type="Panel" parent="Panel/MarginContainer/HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 3.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/MarginContainer/HBoxContainer2/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 3.0 + +[node name="Preview" type="Panel" parent="Panel/MarginContainer/HBoxContainer2/Panel/ScrollContainer"] +custom_minimum_size = Vector2(0, 450) +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Name" type="Label" parent="Panel/MarginContainer/HBoxContainer2/Panel/ScrollContainer/Preview"] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 40.0 +grow_horizontal = 2 +text = "Name" +horizontal_alignment = 1 +vertical_alignment = 1 +clip_text = true +text_overrun_behavior = 3 + +[node name="PreviewImage" type="TextureRect" parent="Panel/MarginContainer/HBoxContainer2/Panel/ScrollContainer/Preview"] +custom_minimum_size = Vector2(0, 410) +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = -412.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 0 +expand_mode = 2 +stretch_mode = 5 diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn new file mode 100644 index 0000000..9bb5cd2 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn @@ -0,0 +1,365 @@ +[gd_scene load_steps=16 format=3 uid="uid://dfqb73y4br8yd"] + +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs" id="1_6jjk7"] +[ext_resource type="Texture2D" uid="uid://n4atvj5fkcpg" path="res://resource/sprite/ui/commonIcon/Add.png" id="2_ns54l"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/down/TileEditArea.cs" id="2_ynf0r"] +[ext_resource type="Script" path="res://src/game/common/ui/EditorMaskBrush.cs" id="3_gydh0"] +[ext_resource type="Texture2D" uid="uid://c5778ntk2rdon" path="res://resource/sprite/ui/commonIcon/Delete.png" id="3_jn1bd"] +[ext_resource type="Texture2D" uid="uid://dggb6p4sdmfry" path="res://resource/sprite/ui/commonIcon/Edit.png" id="3_xmuhh"] +[ext_resource type="Texture2D" uid="uid://bn47bmilcw4x0" path="res://resource/sprite/ui/commonIcon/Select2.png" id="4_ka47m"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/up/TileEditTerrain.cs" id="5_0x7yx"] +[ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="5_08bc4"] +[ext_resource type="Texture2D" uid="uid://bud6ah5xyey37" path="res://resource/sprite/map/TerrainMask2.png" id="5_xabgh"] +[ext_resource type="Texture2D" uid="uid://dyshwhf3101em" path="res://resource/sprite/map/TerrainMask4.png" id="6_vbhca"] +[ext_resource type="Texture2D" uid="uid://c4ltpf5a3egu1" path="res://resource/sprite/ui/commonIcon/Error_mini.png" id="6_vh7rd"] +[ext_resource type="Texture2D" uid="uid://chisfq2alcq16" path="res://resource/sprite/map/TerrainMask3.png" id="6_vmj5y"] +[ext_resource type="Texture2D" uid="uid://cvjj6jnmxgprw" path="res://resource/sprite/map/TerrainMask.png" id="7_g8dxk"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/up/TerrainBrush.cs" id="7_lmu64"] + +[node name="TileSetEditorTerrain" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_6jjk7") + +[node name="VSplitContainer" type="VSplitContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelTop" type="Panel" parent="VSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 50.0 + +[node name="HSplitContainer" type="HSplitContainer" parent="VSplitContainer/PanelTop"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopTab" type="Panel" parent="VSplitContainer/PanelTop/HSplitContainer"] +custom_minimum_size = Vector2(270, 0) +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 + +[node name="Label" type="Label" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "地形:" + +[node name="AddButton" type="Button" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("2_ns54l") + +[node name="EditButton" type="Button" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("3_xmuhh") + +[node name="DeleteButton" type="Button" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("3_jn1bd") + +[node name="ScrollContainer" type="ScrollContainer" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TerrainTab" type="Button" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/ScrollContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +size_flags_horizontal = 3 +text = "name" +alignment = 0 +text_overrun_behavior = 3 + +[node name="ErrorIcon" type="TextureRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/ScrollContainer/TerrainTab"] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -45.0 +offset_top = -20.0 +offset_right = -5.0 +offset_bottom = 20.0 +grow_horizontal = 0 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("6_vh7rd") + +[node name="SelectTexture" type="NinePatchRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopTab/VBoxContainer/ScrollContainer/TerrainTab"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("4_ka47m") +patch_margin_left = 3 +patch_margin_top = 3 +patch_margin_right = 3 +patch_margin_bottom = 3 + +[node name="TopBg" type="ColorRect" parent="VSplitContainer/PanelTop/HSplitContainer"] +clip_children = 2 +z_index = 1 +layout_mode = 2 +size_flags_horizontal = 3 +color = Color(0.496094, 0.496094, 0.496094, 1) +script = ExtResource("5_0x7yx") + +[node name="TerrainRoot" type="Control" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -291.0 +offset_top = -92.0 +offset_right = -98.0 +offset_bottom = 4.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(3, 3) +mouse_filter = 2 + +[node name="CellRoot" type="Control" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 1.0 +offset_bottom = 1.0 +mouse_filter = 2 + +[node name="RightCell" type="Control" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/CellRoot"] +z_index = 1 +anchors_preset = 0 +offset_right = 16.0 +offset_bottom = 16.0 +mouse_filter = 2 + +[node name="CellTexture" type="Sprite2D" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/CellRoot/RightCell"] +z_index = -1 +centered = false + +[node name="TerrainTexture1" type="TextureRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +self_modulate = Color(1, 1, 1, 0.27451) +custom_minimum_size = Vector2(192, 64) +layout_mode = 1 +offset_right = 192.0 +offset_bottom = 64.0 +mouse_filter = 2 +texture = ExtResource("7_g8dxk") + +[node name="Label" type="Label" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/TerrainTexture1"] +layout_mode = 0 +offset_top = -10.0 +offset_right = 136.0 +offset_bottom = 30.0 +scale = Vector2(0.25, 0.25) +text = "顶部墙壁" + +[node name="TerrainTexture2" type="TextureRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +self_modulate = Color(1, 1, 1, 0.27451) +custom_minimum_size = Vector2(64, 16) +layout_mode = 1 +offset_top = 80.0 +offset_right = 64.0 +offset_bottom = 112.0 +mouse_filter = 2 +texture = ExtResource("5_xabgh") + +[node name="Label" type="Label" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/TerrainTexture2"] +layout_mode = 0 +offset_top = -10.0 +offset_right = 136.0 +offset_bottom = 30.0 +scale = Vector2(0.25, 0.25) +text = "侧方墙壁" + +[node name="TerrainTexture3" type="TextureRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +self_modulate = Color(1, 1, 1, 0.27451) +custom_minimum_size = Vector2(16, 16) +layout_mode = 1 +offset_left = 80.0 +offset_top = 80.0 +offset_right = 96.0 +offset_bottom = 96.0 +mouse_filter = 2 +texture = ExtResource("6_vmj5y") + +[node name="Label" type="Label" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/TerrainTexture3"] +layout_mode = 0 +offset_top = -10.0 +offset_right = 136.0 +offset_bottom = 30.0 +scale = Vector2(0.25, 0.25) +text = "地板" + +[node name="TerrainTexture4" type="TextureRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +visible = false +self_modulate = Color(1, 1, 1, 0.27451) +custom_minimum_size = Vector2(80, 48) +layout_mode = 1 +offset_right = 80.0 +offset_bottom = 48.0 +mouse_filter = 2 +texture = ExtResource("6_vbhca") + +[node name="Label" type="Label" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot/TerrainTexture4"] +layout_mode = 0 +offset_top = -10.0 +offset_right = 136.0 +offset_bottom = 30.0 +scale = Vector2(0.25, 0.25) +text = "地形" + +[node name="Brush" type="Control" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg/TerrainRoot"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("7_lmu64") + +[node name="Grid" type="ColorRect" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(1, 1, 1, 0) + +[node name="FocusBtn" type="TextureButton" parent="VSplitContainer/PanelTop/HSplitContainer/TopBg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("5_08bc4") +ignore_texture_size = true +stretch_mode = 5 + +[node name="PanelBottom" type="Panel" parent="VSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 50.0 + +[node name="BottomBg" type="ColorRect" parent="VSplitContainer/PanelBottom"] +clip_children = 2 +z_index = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 2.0 +offset_top = 2.0 +offset_right = -2.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.203922, 0.203922, 0.203922, 1) +script = ExtResource("2_ynf0r") + +[node name="TileTexture" type="TextureRect" parent="VSplitContainer/PanelBottom/BottomBg"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(2, 2) +mouse_filter = 2 + +[node name="CellRoot" type="Control" parent="VSplitContainer/PanelBottom/BottomBg/TileTexture"] +anchors_preset = 0 +offset_right = 1.0 +offset_bottom = 1.0 +mouse_filter = 2 + +[node name="BottomCell" type="ColorRect" parent="VSplitContainer/PanelBottom/BottomBg/TileTexture/CellRoot"] +layout_mode = 0 +offset_right = 16.0 +offset_bottom = 16.0 +mouse_filter = 2 +color = Color(0, 0, 0, 0.588235) + +[node name="MaskBrush" type="Control" parent="VSplitContainer/PanelBottom/BottomBg/TileTexture"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("3_gydh0") + +[node name="Grid" type="ColorRect" parent="VSplitContainer/PanelBottom/BottomBg"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(1, 1, 1, 0) + +[node name="FocusBtn" type="TextureButton" parent="VSplitContainer/PanelBottom/BottomBg"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -79.0 +offset_top = 14.0 +offset_right = -15.0 +offset_bottom = 78.0 +grow_horizontal = 0 +tooltip_text = "聚焦" +texture_normal = ExtResource("5_08bc4") +ignore_texture_size = true +stretch_mode = 5 + +[node name="DragSprite" type="Sprite2D" parent="."] +z_index = 10 +region_enabled = true diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn index faf871a..d7de309 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn @@ -154,7 +154,7 @@ position = Vector2(-2, -3) [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] -position = Vector2(7, -1.5) +position = Vector2(12, -1.5) [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(3, 0) diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn index 70a21c3..285a2fa 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn @@ -154,7 +154,7 @@ position = Vector2(-2, -2) [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] -position = Vector2(13, -0.5) +position = Vector2(19, -1.5) [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(6, 0) diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0010.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0010.tscn new file mode 100644 index 0000000..571ff9f --- /dev/null +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0010.tscn @@ -0,0 +1,166 @@ +[gd_scene load_steps=11 format=3 uid="uid://dhnrfqcojc367"] + +[ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="1_bw5v7"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_pht5a"] +[ext_resource type="SpriteFrames" uid="uid://cd7fhaqk587o2" path="res://resource/spriteFrames/weapon/Weapon0010.tres" id="3_nj0c6"] +[ext_resource type="Animation" uid="uid://v3dltmdstqad" path="res://resource/animation/weapon/Weapon_floodlight.res" id="4_2cd01"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_cbiyh"] +resource_local_to_scene = true +shader = ExtResource("2_pht5a") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_0oy4o"] +resource_local_to_scene = true +shader = ExtResource("2_pht5a") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_evjpf"] +size = Vector2(26, 6) + +[sub_resource type="Animation" id="Animation_x136i"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite:animation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"default"] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimatedSprite:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_8xqs8"] +resource_name = "reloading" +length = 1.7 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimatedSprite:animation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1.7), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [&"reloading_frame", &"default"] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 1.7), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0, 18] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2, 1.5, 1.7), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.436332, -0.436332, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] +_data = { +"RESET": SubResource("Animation_x136i"), +"floodlight": ExtResource("4_2cd01"), +"reloading": SubResource("Animation_8xqs8") +} + +[node name="Weapon0010" type="CharacterBody2D" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_bw5v7") +FirePoint = NodePath("AnimatedSprite/FirePoint") +ShellPoint = NodePath("AnimatedSprite/ShellPoint") +AnimationPlayer = NodePath("AnimationPlayer") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_cbiyh") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +modulate = Color(1.9, 1.9, 1.9, 1) +material = SubResource("ShaderMaterial_0oy4o") +sprite_frames = ExtResource("3_nj0c6") +offset = Vector2(4, -2) + +[node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] +position = Vector2(-3, -3) + +[node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] +position = Vector2(21, -1) + +[node name="Collision" type="CollisionShape2D" parent="."] +position = Vector2(5, -1) +shape = SubResource("RectangleShape2D_evjpf") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_trkjd") +} diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0011.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0011.tscn new file mode 100644 index 0000000..278775a --- /dev/null +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0011.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=8 format=3 uid="uid://c17ol2s34ehp7"] + +[ext_resource type="PackedScene" uid="uid://cxltmhhp4rbyk" path="res://prefab/weapon/WeaponTemplate.tscn" id="1_fgcwf"] +[ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="2_m84k4"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_4rq0j"] +[ext_resource type="SpriteFrames" uid="uid://xvfg1a0xj7ng" path="res://resource/spriteFrames/weapon/Weapon0011.tres" id="4_bnkqc"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_m6bme"] +resource_local_to_scene = true +shader = ExtResource("3_4rq0j") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_fqjj0"] +resource_local_to_scene = true +shader = ExtResource("3_4rq0j") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_iq77m"] +size = Vector2(20, 8) + +[node name="Weapon0011" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_fgcwf")] +script = ExtResource("2_m84k4") +FirePoint = NodePath("AnimatedSprite/FirePoint") +ShellPoint = NodePath("AnimatedSprite/ShellPoint") +AnimationPlayer = NodePath("AnimationPlayer") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" parent="." index="0"] +material = SubResource("ShaderMaterial_m6bme") + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_fqjj0") +position = Vector2(3, -1) +sprite_frames = ExtResource("4_bnkqc") + +[node name="ShellPoint" parent="AnimatedSprite" index="0"] +position = Vector2(-4, -2) + +[node name="FirePoint" parent="AnimatedSprite" index="1"] +position = Vector2(15, -0.5) + +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(3, 0) +shape = SubResource("RectangleShape2D_iq77m") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0013.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0013.tscn new file mode 100644 index 0000000..c7c9280 --- /dev/null +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0013.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=8 format=3 uid="uid://chxa5inh7hgxs"] + +[ext_resource type="PackedScene" uid="uid://cxltmhhp4rbyk" path="res://prefab/weapon/WeaponTemplate.tscn" id="1_f1h8o"] +[ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="2_bpgfu"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_0l3ip"] +[ext_resource type="SpriteFrames" uid="uid://cawsi08vaqfrn" path="res://resource/spriteFrames/weapon/Weapon0013.tres" id="4_w7ibl"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_sy2aq"] +resource_local_to_scene = true +shader = ExtResource("3_0l3ip") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_1rqqj"] +resource_local_to_scene = true +shader = ExtResource("3_0l3ip") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_4pn1i"] +size = Vector2(20, 6) + +[node name="Weapon0013" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_f1h8o")] +script = ExtResource("2_bpgfu") +FirePoint = NodePath("AnimatedSprite/FirePoint") +ShellPoint = NodePath("AnimatedSprite/ShellPoint") +AnimationPlayer = NodePath("AnimationPlayer") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" parent="." index="0"] +material = SubResource("ShaderMaterial_sy2aq") + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_1rqqj") +position = Vector2(4, -1) +sprite_frames = ExtResource("4_w7ibl") + +[node name="ShellPoint" parent="AnimatedSprite" index="0"] +position = Vector2(2, -1) + +[node name="FirePoint" parent="AnimatedSprite" index="1"] +position = Vector2(12, -1) + +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(4, 0) +shape = SubResource("RectangleShape2D_4pn1i") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0014.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0014.tscn new file mode 100644 index 0000000..b880d0d --- /dev/null +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0014.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=8 format=3 uid="uid://dvhan2bubtey0"] + +[ext_resource type="PackedScene" uid="uid://cxltmhhp4rbyk" path="res://prefab/weapon/WeaponTemplate.tscn" id="1_3op5w"] +[ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="2_toxwq"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_ch83c"] +[ext_resource type="SpriteFrames" uid="uid://taxfr2lcy0f3" path="res://resource/spriteFrames/weapon/Weapon0014.tres" id="4_xdmw2"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_sy2aq"] +resource_local_to_scene = true +shader = ExtResource("3_ch83c") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_x2qcg"] +resource_local_to_scene = true +shader = ExtResource("3_ch83c") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_4pn1i"] +size = Vector2(10.75, 7.75) + +[node name="Weapon0014" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_3op5w")] +script = ExtResource("2_toxwq") +FirePoint = NodePath("AnimatedSprite/FirePoint") +ShellPoint = NodePath("AnimatedSprite/ShellPoint") +AnimationPlayer = NodePath("AnimationPlayer") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" parent="." index="0"] +material = SubResource("ShaderMaterial_sy2aq") + +[node name="AnimatedSprite" parent="." index="1"] +material = SubResource("ShaderMaterial_x2qcg") +position = Vector2(4, 0) +sprite_frames = ExtResource("4_xdmw2") + +[node name="ShellPoint" parent="AnimatedSprite" index="0"] +position = Vector2(-3, -2) + +[node name="FirePoint" parent="AnimatedSprite" index="1"] +position = Vector2(9, -2) + +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(4, 0) +shape = SubResource("RectangleShape2D_4pn1i") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0016.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0016.tscn new file mode 100644 index 0000000..3e1648b --- /dev/null +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0016.tscn @@ -0,0 +1,170 @@ +[gd_scene load_steps=11 format=3 uid="uid://b7s3fvpkltk1d"] + +[ext_resource type="Script" path="res://src/game/activity/weapon/bow/Bow.cs" id="1_k4gvs"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_cui8l"] +[ext_resource type="SpriteFrames" uid="uid://ccrflh6pjmq7r" path="res://resource/spriteFrames/weapon/Weapon0016.tres" id="4_buwa4"] +[ext_resource type="Animation" uid="uid://v3dltmdstqad" path="res://resource/animation/weapon/Weapon_floodlight.res" id="4_nl06y"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_sy2aq"] +resource_local_to_scene = true +shader = ExtResource("3_cui8l") +shader_parameter/blend = Color(0, 0, 0, 0.470588) +shader_parameter/schedule = 1.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_x2qcg"] +resource_local_to_scene = true +shader = ExtResource("3_cui8l") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_4pn1i"] +size = Vector2(10.1875, 15.9375) + +[sub_resource type="Animation" id="Animation_x136i"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite:animation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"pull_frame"] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimatedSprite/ArrowPoint:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(8, 0)] +} + +[sub_resource type="Animation" id="Animation_njx7h"] +resource_name = "pull" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimatedSprite:animation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"pull_frame"] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0, 10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite/ArrowPoint:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(8, 0), Vector2(-3, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] +_data = { +"RESET": SubResource("Animation_x136i"), +"floodlight": ExtResource("4_nl06y"), +"pull": SubResource("Animation_njx7h") +} + +[node name="Weapon0016" type="CharacterBody2D" node_paths=PackedStringArray("ArrowPoint", "FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_k4gvs") +ArrowPoint = NodePath("AnimatedSprite/ArrowPoint") +FirePoint = NodePath("AnimatedSprite/FirePoint") +ShellPoint = NodePath("AnimatedSprite/ShellPoint") +AnimationPlayer = NodePath("AnimationPlayer") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_sy2aq") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_x2qcg") +position = Vector2(6, -2) +sprite_frames = ExtResource("4_buwa4") +animation = &"pull_frame" + +[node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] + +[node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] +position = Vector2(9, 0) + +[node name="ArrowPoint" type="Marker2D" parent="AnimatedSprite"] +position = Vector2(8, 0) + +[node name="Collision" type="CollisionShape2D" parent="."] +visible = false +position = Vector2(1, 0) +shape = SubResource("RectangleShape2D_4pn1i") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_trkjd") +} diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index 3a53575..06a6754 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -10,7 +10,7 @@ [application] -config/name="DungeonShooting" +config/name="枪火地牢" run/main_scene="res://scene/Main.tscn" config/features=PackedStringArray("4.2", "C#") config/icon="res://icon.png" @@ -24,7 +24,6 @@ window/size/viewport_width=1920 window/size/viewport_height=1080 window/stretch/aspect="keep_width" -window/vsync/vsync_mode=0 [dotnet] @@ -34,6 +33,14 @@ enabled=PackedStringArray("res://addons/dungeonShooting_plugin/plugin.cfg") +[file_customization] + +folder_colors={ +"res://prefab/": "orange", +"res://resource/": "blue", +"res://src/": "green" +} + [gui] theme/custom="res://resource/theme/mainTheme.tres" @@ -110,36 +117,43 @@ fire={ "deadzone": 0.5, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] } move_left={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) ] } move_right={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) ] } move_up={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) ] } move_down={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) ] } exchangeWeapon={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) ] } throwWeapon={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":71,"physical_keycode":71,"key_label":71,"unicode":103,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":true,"script":null) ] } mouse_roll_up={ @@ -155,31 +169,37 @@ interactive={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) ] } reload={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":true,"script":null) ] } meleeAttack={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) ] } roll={ "deadzone": 0.5, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(75, 15),"global_position":Vector2(79, 56),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) ] } useActiveProp={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) ] } removeProp={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":true,"script":null) ] } exchangeProp={ @@ -189,12 +209,29 @@ } map={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null) ] } menu={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) +] +} +mouse_left={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(136, 13),"global_position":Vector2(139, 45),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} +mouse_middle={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(185, 17),"global_position":Vector2(189, 58),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} +mouse_right={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(304, 18),"global_position":Vector2(308, 59),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } @@ -206,7 +243,7 @@ 2d_physics/layer_4="player" 2d_physics/layer_5="enemy" 2d_physics/layer_6="affiliation" -2d_physics/layer_7="onHead" +2d_physics/layer_7="onHand" 2d_physics/layer_8="debris" 2d_physics/layer_9="throwing" @@ -216,6 +253,7 @@ [navigation] +2d/default_cell_size=4.0 2d/default_edge_connection_margin=4 [physics] diff --git a/DungeonShooting_Godot/resource/config/ActivityBase.json b/DungeonShooting_Godot/resource/config/ActivityBase.json index c49dbc4..78354b8 100644 --- a/DungeonShooting_Godot/resource/config/ActivityBase.json +++ b/DungeonShooting_Godot/resource/config/ActivityBase.json @@ -3,6 +3,8 @@ "Id": "role0001", "Type": 3, "Name": "\u73A9\u5BB6", + "Quality": 0, + "Price": 0, "Intro": "\u73A9\u5BB6", "Details": "", "IsStatic": false, @@ -15,6 +17,8 @@ "Id": "enemy0001", "Type": 4, "Name": "\u654C\u4EBA", + "Quality": 0, + "Price": 0, "Intro": "\u654C\u4EBA", "Details": "", "IsStatic": false, @@ -27,6 +31,8 @@ "Id": "enemy0002", "Type": 4, "Name": "\u654C\u4EBA2", + "Quality": 0, + "Price": 0, "Intro": "\u654C\u4EBA2", "Details": "", "IsStatic": false, @@ -39,6 +45,8 @@ "Id": "weapon0001", "Type": 5, "Name": "\u6B65\u67AA", + "Quality": 3, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -51,6 +59,8 @@ "Id": "weapon0002", "Type": 5, "Name": "\u9730\u5F39\u67AA", + "Quality": 3, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -63,6 +73,8 @@ "Id": "weapon0003", "Type": 5, "Name": "\u624B\u67AA", + "Quality": 2, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -75,6 +87,8 @@ "Id": "weapon0004", "Type": 5, "Name": "\u5200", + "Quality": 4, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -87,6 +101,8 @@ "Id": "weapon0005", "Type": 5, "Name": "\u72D9\u51FB\u67AA", + "Quality": 4, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -99,6 +115,8 @@ "Id": "weapon0006", "Type": 5, "Name": "\u51B2\u950B\u67AA", + "Quality": 2, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -111,6 +129,8 @@ "Id": "weapon0007", "Type": 5, "Name": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA", + "Quality": 4, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -123,6 +143,8 @@ "Id": "weapon0008", "Type": 5, "Name": "\u6FC0\u5149\u624B\u67AA", + "Quality": 3, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -135,6 +157,8 @@ "Id": "weapon0009", "Type": 5, "Name": "\u69B4\u5F39\u53D1\u5C04\u5668", + "Quality": 4, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -144,9 +168,81 @@ "ShowInMapEditor": true }, { + "Id": "weapon0010", + "Type": 5, + "Name": "M1\u578B\u70ED\u80FD\u72D9\u51FB\u67AA", + "Quality": 5, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/weapon/Weapon0010.tscn", + "Icon": "res://resource/sprite/weapon/weapon0010/Weapon0010.png", + "ShowInMapEditor": true + }, + { + "Id": "weapon0011", + "Type": 5, + "Name": "weapon0011", + "Quality": 5, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/weapon/Weapon0011.tscn", + "Icon": "res://resource/sprite/weapon/weapon0011/Weapon0011.png", + "ShowInMapEditor": true + }, + { + "Id": "weapon0013", + "Type": 5, + "Name": "P90", + "Quality": 4, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/weapon/Weapon0013.tscn", + "Icon": "res://resource/sprite/weapon/weapon0013/Weapon0013.png", + "ShowInMapEditor": true + }, + { + "Id": "weapon0014", + "Type": 5, + "Name": "\u5DE6\u8F6E", + "Quality": 2, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/weapon/Weapon0014.tscn", + "Icon": "res://resource/sprite/weapon/weapon0014/Weapon0014.png", + "ShowInMapEditor": true + }, + { + "Id": "weapon0016", + "Type": 5, + "Name": "\u6728\u8D28\u77ED\u5F13", + "Quality": 2, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/weapon/Weapon0016.tscn", + "Icon": "res://resource/sprite/weapon/weapon0016/weapon0016.png", + "ShowInMapEditor": true + }, + { "Id": "bullet0001", "Type": 6, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -159,6 +255,8 @@ "Id": "bullet0002", "Type": 6, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -171,6 +269,8 @@ "Id": "bullet0003", "Type": 6, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -183,6 +283,8 @@ "Id": "bullet0004", "Type": 6, "Name": "\u69B4\u5F39\u70AE", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -195,6 +297,8 @@ "Id": "bullet0005", "Type": 6, "Name": "\u629B\u7269\u7EBF\u7C98\u6DB2\u5B50\u5F39", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -204,9 +308,67 @@ "ShowInMapEditor": false }, { + "Id": "bullet0006", + "Type": 6, + "Name": "\u62D6\u5C3E\u5B50\u5F39", + "Quality": 0, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "0003", + "Prefab": "res://prefab/bullet/normal/Bullet0006.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { + "Id": "bullet0007", + "Type": 6, + "Name": "", + "Quality": 0, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "0003", + "Prefab": "res://prefab/bullet/normal/Bullet0007.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { + "Id": "bullet0008", + "Type": 6, + "Name": "", + "Quality": 0, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "0003", + "Prefab": "res://prefab/bullet/normal/Bullet0008.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { + "Id": "bullet0009", + "Type": 6, + "Name": "\u5F13\u7BAD", + "Quality": 0, + "Price": 0, + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/bullet/normal/Bullet0009.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { "Id": "shell0001", "Type": 7, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -219,6 +381,8 @@ "Id": "shell0002", "Type": 7, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -231,6 +395,8 @@ "Id": "shell0003", "Type": 7, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -243,6 +409,8 @@ "Id": "shell0004", "Type": 7, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "", "Details": "", "IsStatic": false, @@ -255,6 +423,8 @@ "Id": "enemy_dead0001", "Type": 8, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u654C\u4EBA1\u6B7B\u4EA1\u788E\u7247", "Details": "", "IsStatic": false, @@ -267,6 +437,8 @@ "Id": "enemy_dead0002", "Type": 8, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u654C\u4EBA2\u6B7B\u4EA1", "Details": "", "IsStatic": false, @@ -279,11 +451,13 @@ "Id": "prop0001", "Type": 9, "Name": "\u978B\u5B50", + "Quality": 4, + "Price": 0, "Intro": "\u63D0\u9AD8\u79FB\u52A8\u901F\u5EA6", "Details": "", "IsStatic": false, "__Material": "", - "Prefab": "res://prefab/effect/enemy/Effect0001.tscn", + "Prefab": "res://prefab/prop/buff/BuffProp0001.tscn", "Icon": "res://resource/sprite/prop/buff/BuffProp0001.png", "ShowInMapEditor": true }, @@ -291,6 +465,8 @@ "Id": "prop0002", "Type": 9, "Name": "\u5FC3\u4E4B\u5BB9\u5668", + "Quality": 3, + "Price": 0, "Intro": "\u63D0\u9AD8\u8840\u91CF\u4E0A\u9650", "Details": "", "IsStatic": false, @@ -303,6 +479,8 @@ "Id": "prop0003", "Type": 9, "Name": "\u62A4\u76FE", + "Quality": 3, + "Price": 0, "Intro": "\u53EF\u4EE5\u62B5\u6321\u5B50\u5F39\uFF0C\u968F\u65F6\u95F4\u63A8\u79FB\u81EA\u52A8\u6062\u590D", "Details": "", "IsStatic": false, @@ -315,6 +493,8 @@ "Id": "prop0004", "Type": 9, "Name": "\u62A4\u76FE\u8BA1\u65F6\u5668", + "Quality": 4, + "Price": 0, "Intro": "\u63D0\u9AD8\u62A4\u76FE\u6062\u590D\u901F\u5EA6", "Details": "", "IsStatic": false, @@ -327,6 +507,8 @@ "Id": "prop0005", "Type": 9, "Name": "\u6740\u4F24\u5F39", + "Quality": 4, + "Price": 0, "Intro": "\u63D0\u9AD8\u5B50\u5F39\u4F24\u5BB3", "Details": "", "IsStatic": false, @@ -339,6 +521,8 @@ "Id": "prop0006", "Type": 9, "Name": "\u7EA2\u5B9D\u77F3\u6212\u6307", + "Quality": 4, + "Price": 0, "Intro": "\u53D7\u4F24\u540E\u5EF6\u957F\u65E0\u654C\u65F6\u95F4", "Details": "", "IsStatic": false, @@ -351,6 +535,8 @@ "Id": "prop0007", "Type": 9, "Name": "\u5907\u7528\u62A4\u76FE", + "Quality": 3, + "Price": 0, "Intro": "\u53D7\u4F24\u65F6\u6709\u4E00\u5B9A\u6982\u7387\u62B5\u6D88\u4F24\u5BB3", "Details": "", "IsStatic": false, @@ -363,6 +549,8 @@ "Id": "prop0008", "Type": 9, "Name": "\u773C\u955C", + "Quality": 3, + "Price": 0, "Intro": "\u63D0\u9AD8\u6B66\u5668\u7CBE\u51C6\u5EA6", "Details": "", "IsStatic": false, @@ -375,6 +563,8 @@ "Id": "prop0009", "Type": 9, "Name": "\u9AD8\u901F\u5B50\u5F39", + "Quality": 3, + "Price": 0, "Intro": "\u63D0\u9AD8\u5B50\u5F39\u901F\u5EA6\u548C\u5C04\u7A0B", "Details": "", "IsStatic": false, @@ -387,6 +577,8 @@ "Id": "prop0010", "Type": 9, "Name": "\u5206\u88C2\u5B50\u5F39", + "Quality": 4, + "Price": 0, "Intro": "\u5B50\u5F39\u6570\u91CF\u7FFB\u500D, \u4F46\u662F\u7CBE\u51C6\u5EA6, \u51FB\u9000\u548C\u4F24\u5BB3\u964D\u4F4E", "Details": "", "IsStatic": false, @@ -399,6 +591,8 @@ "Id": "prop0011", "Type": 9, "Name": "\u5F39\u5C04\u5B50\u5F39", + "Quality": 4, + "Price": 0, "Intro": "\u5B50\u5F39\u53CD\u5F39\u6B21\u6570\u002B2", "Details": "", "IsStatic": false, @@ -411,6 +605,8 @@ "Id": "prop0012", "Type": 9, "Name": "\u7A7F\u900F\u5B50\u5F39", + "Quality": 4, + "Price": 0, "Intro": "\u5B50\u5F39\u7A7F\u900F\u002B1", "Details": "", "IsStatic": false, @@ -423,6 +619,8 @@ "Id": "prop0013", "Type": 9, "Name": "\u6B66\u5668\u80CC\u5305", + "Quality": 2, + "Price": 0, "Intro": "\u6B66\u5668\u5BB9\u91CF\u002B1", "Details": "", "IsStatic": false, @@ -435,6 +633,8 @@ "Id": "prop0014", "Type": 9, "Name": "\u9053\u5177\u80CC\u5305", + "Quality": 2, + "Price": 0, "Intro": "\u9053\u5177\u5BB9\u91CF\u002B1", "Details": "", "IsStatic": false, @@ -447,6 +647,8 @@ "Id": "prop5000", "Type": 9, "Name": "\u533B\u836F\u7BB1", + "Quality": 1, + "Price": 0, "Intro": "\u4F7F\u7528\u540E\u56DE\u590D\u4E00\u9897\u7EA2\u5FC3", "Details": "", "IsStatic": false, @@ -459,6 +661,8 @@ "Id": "prop5001", "Type": 9, "Name": "\u5F39\u836F\u7BB1", + "Quality": 1, + "Price": 0, "Intro": "\u4F7F\u7528\u540E\u8865\u5145\u5F53\u524D\u6B66\u5668\u5907\u7528\u5F39\u836F", "Details": "", "IsStatic": false, @@ -468,9 +672,25 @@ "ShowInMapEditor": true }, { + "Id": "treasure_box0001", + "Type": 10, + "Name": "\u6728\u8D28\u5B9D\u7BB1", + "Quality": 0, + "Price": 0, + "Intro": "\u6728\u8D28\u5B9D\u7BB1", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/box/TreasureBox0001.tscn", + "Icon": "res://resource/sprite/box/TreasureBox0001.png", + "ShowInMapEditor": true + }, + { "Id": "other_door_e", "Type": 99, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u5730\u7262\u623F\u95F4\u7684\u95E8(\u4E1C\u4FA7)", "Details": "", "IsStatic": true, @@ -483,6 +703,8 @@ "Id": "other_door_w", "Type": 99, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u5730\u7262\u623F\u95F4\u7684\u95E8(\u897F\u4FA7)", "Details": "", "IsStatic": true, @@ -495,6 +717,8 @@ "Id": "other_door_s", "Type": 99, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u5730\u7262\u623F\u95F4\u7684\u95E8(\u5357\u4FA7)", "Details": "", "IsStatic": true, @@ -507,6 +731,8 @@ "Id": "other_door_n", "Type": 99, "Name": "", + "Quality": 0, + "Price": 0, "Intro": "\u5730\u7262\u623F\u95F4\u7684\u95E8(\u5317\u4FA7)", "Details": "", "IsStatic": true, @@ -514,5 +740,47 @@ "Prefab": "res://prefab/map/RoomDoor_N.tscn", "Icon": "", "ShowInMapEditor": false + }, + { + "Id": "gold_10", + "Type": 99, + "Name": "\u91D1\u5E01", + "Quality": 0, + "Price": 0, + "Intro": "\u83B7\u5F9710\u91D1\u5E01", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/currency/Gold10.tscn", + "Icon": "res://resource/sprite/ui/commonIcon/Gold_10.png", + "ShowInMapEditor": true + }, + { + "Id": "gold_5", + "Type": 99, + "Name": "\u94F6\u5E01", + "Quality": 0, + "Price": 0, + "Intro": "\u83B7\u5F975\u91D1\u5E01", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/currency/Gold5.tscn", + "Icon": "res://resource/sprite/ui/commonIcon/Gold_5.png", + "ShowInMapEditor": true + }, + { + "Id": "gold_1", + "Type": 99, + "Name": "\u94DC\u5E01", + "Quality": 0, + "Price": 0, + "Intro": "\u83B7\u5F971\u91D1\u5E01", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/currency/Gold1.tscn", + "Icon": "res://resource/sprite/ui/commonIcon/Gold_1.png", + "ShowInMapEditor": true } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/AiAttackAttr.json b/DungeonShooting_Godot/resource/config/AiAttackAttr.json index 251daae..1d78577 100644 --- a/DungeonShooting_Godot/resource/config/AiAttackAttr.json +++ b/DungeonShooting_Godot/resource/config/AiAttackAttr.json @@ -1,38 +1,38 @@ [ { "Id": "0001", - "Remark": "", + "Remark": "\u6B65\u67AA", "LockingStand": true, "FiringStand": true, "ShowSubline": false, - "LockingTime": 1, + "LockingTime": 0.5, "LockAngleTime": 0, "AttackLockAngle": true, - "BulletSpeedScale": 0.4, + "BulletSpeedScale": 0.3, "AmmoConsumptionProbability": 0 }, { "Id": "0002", - "Remark": "", - "LockingStand": true, - "FiringStand": true, - "ShowSubline": false, - "LockingTime": 2, - "LockAngleTime": 0, - "AttackLockAngle": false, - "BulletSpeedScale": 0.35, - "AmmoConsumptionProbability": 0 - }, - { - "Id": "0003", - "Remark": "", + "Remark": "\u9730\u5F39\u67AA", "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 1, "LockAngleTime": 0, "AttackLockAngle": false, - "BulletSpeedScale": 0.35, + "BulletSpeedScale": 0.25, + "AmmoConsumptionProbability": 0 + }, + { + "Id": "0003", + "Remark": "\u624B\u67AA", + "LockingStand": true, + "FiringStand": true, + "ShowSubline": false, + "LockingTime": 0.4, + "LockAngleTime": 0, + "AttackLockAngle": false, + "BulletSpeedScale": 0.3, "AmmoConsumptionProbability": 0 }, { @@ -41,10 +41,10 @@ "LockingStand": false, "FiringStand": false, "ShowSubline": false, - "LockingTime": 0.7, + "LockingTime": 0.3, "LockAngleTime": 0, "AttackLockAngle": true, - "BulletSpeedScale": 0.35, + "BulletSpeedScale": 0.3, "AmmoConsumptionProbability": 0 }, { @@ -53,22 +53,22 @@ "LockingStand": true, "FiringStand": true, "ShowSubline": true, - "LockingTime": 1.5, - "LockAngleTime": 0.5, + "LockingTime": 1, + "LockAngleTime": 0.3, "AttackLockAngle": true, - "BulletSpeedScale": 0.5, + "BulletSpeedScale": 0.9, "AmmoConsumptionProbability": 0 }, { "Id": "0006", - "Remark": "", + "Remark": "\u6C64\u59C6\u900A", "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 0.5, - "LockAngleTime": 0.5, + "LockAngleTime": 0, "AttackLockAngle": false, - "BulletSpeedScale": 0.35, + "BulletSpeedScale": 0.25, "AmmoConsumptionProbability": 0 }, { @@ -77,7 +77,7 @@ "LockingStand": true, "FiringStand": true, "ShowSubline": true, - "LockingTime": 1.5, + "LockingTime": 1.2, "LockAngleTime": 0.5, "AttackLockAngle": true, "BulletSpeedScale": 1, @@ -89,10 +89,22 @@ "LockingStand": true, "FiringStand": true, "ShowSubline": false, - "LockingTime": 1.5, - "LockAngleTime": 0.5, + "LockingTime": 0.6, + "LockAngleTime": 0.2, "AttackLockAngle": true, "BulletSpeedScale": 0.8, "AmmoConsumptionProbability": 0 + }, + { + "Id": "0009", + "Remark": "M1\u578B\u70ED\u80FD\u72D9\u51FB\u67AA", + "LockingStand": true, + "FiringStand": true, + "ShowSubline": false, + "LockingTime": 0.7, + "LockAngleTime": 0, + "AttackLockAngle": true, + "BulletSpeedScale": 0.3, + "AmmoConsumptionProbability": 0 } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/BulletBase.json b/DungeonShooting_Godot/resource/config/BulletBase.json index 5985b17..6074533 100644 --- a/DungeonShooting_Godot/resource/config/BulletBase.json +++ b/DungeonShooting_Godot/resource/config/BulletBase.json @@ -211,12 +211,152 @@ ] }, { + "Id": "0007", + "Name": "\u62D6\u5C3E\u5B50\u5F391", + "Type": 1, + "Prefab": "bullet0006", + "HarmRange": [ + 10 + ], + "RepelRange": [ + 45 + ], + "DeviationAngleRange": [ + 0 + ], + "SpeedRange": [ + 350, + 350 + ], + "LifeTimeRange": [ + -1 + ], + "DistanceRange": [ + 600, + 600 + ], + "VerticalSpeed": [ + 0 + ], + "BounceCount": [ + 3 + ], + "Penetration": [ + 1 + ] + }, + { + "Id": "0008", + "Name": "\u5B50\u5F394", + "Type": 1, + "Prefab": "bullet0007", + "HarmRange": [ + 4 + ], + "RepelRange": [ + 15 + ], + "DeviationAngleRange": [ + 0 + ], + "SpeedRange": [ + 350, + 380 + ], + "LifeTimeRange": [ + -1 + ], + "DistanceRange": [ + 400, + 450 + ], + "VerticalSpeed": [ + 0 + ], + "BounceCount": [ + 0 + ], + "Penetration": [ + 0 + ] + }, + { + "Id": "0009", + "Name": "\u5B50\u5F395", + "Type": 1, + "Prefab": "bullet0008", + "HarmRange": [ + 4 + ], + "RepelRange": [ + 15 + ], + "DeviationAngleRange": [ + 0 + ], + "SpeedRange": [ + 350, + 380 + ], + "LifeTimeRange": [ + -1 + ], + "DistanceRange": [ + 400, + 450 + ], + "VerticalSpeed": [ + 0 + ], + "BounceCount": [ + 0 + ], + "Penetration": [ + 0 + ] + }, + { + "Id": "0010", + "Name": "\u5F13\u7BAD", + "Type": 1, + "Prefab": "bullet0009", + "HarmRange": [ + 15 + ], + "RepelRange": [ + 55 + ], + "DeviationAngleRange": [ + 0 + ], + "SpeedRange": [ + 400, + 400 + ], + "LifeTimeRange": [ + -1 + ], + "DistanceRange": [ + 250, + 300 + ], + "VerticalSpeed": [ + 0 + ], + "BounceCount": [ + 0 + ], + "Penetration": [ + 0 + ] + }, + { "Id": "1001", "Name": "\u6FC0\u51491", "Type": 2, "Prefab": "res://prefab/bullet/laser/Laser0001.tscn", "HarmRange": [ - 5 + 7 ], "RepelRange": [ 35 @@ -225,8 +365,8 @@ 0 ], "SpeedRange": [ - 300, - 330 + 2000, + 2000 ], "LifeTimeRange": [ -1 diff --git a/DungeonShooting_Godot/resource/config/EnemyBase.json b/DungeonShooting_Godot/resource/config/EnemyBase.json index 968950a..054f597 100644 --- a/DungeonShooting_Godot/resource/config/EnemyBase.json +++ b/DungeonShooting_Godot/resource/config/EnemyBase.json @@ -3,24 +3,36 @@ "Id": "0001", "__Activity": "enemy0001", "Remark": "\u654C\u4EBA1", - "MoveSpeed": 120, + "Hp": 20, + "MoveSpeed": 80, "Acceleration": 1500, "Friction": 900, + "AttackInterval": 0, "CanPickUpWeapon": true, "ViewRange": 250, "TailAfterViewRange": 400, - "BackViewRange": 50 + "BackViewRange": 50, + "Gold": [ + -2, + 3 + ] }, { "Id": "0002", "__Activity": "enemy0002", "Remark": "\u654C\u4EBA2", + "Hp": 25, "MoveSpeed": 120, "Acceleration": 1500, "Friction": 900, + "AttackInterval": 2.2, "CanPickUpWeapon": false, - "ViewRange": 250, - "TailAfterViewRange": 400, - "BackViewRange": 50 + "ViewRange": 200, + "TailAfterViewRange": 300, + "BackViewRange": 50, + "Gold": [ + -2, + 4 + ] } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/Sound.json b/DungeonShooting_Godot/resource/config/Sound.json index 73d3cb1..76bbf8c 100644 --- a/DungeonShooting_Godot/resource/config/Sound.json +++ b/DungeonShooting_Godot/resource/config/Sound.json @@ -66,6 +66,18 @@ "Remark": "\u69B4\u5F39\u53D1\u5C04\u5668" }, { + "Id": "shooting0012", + "Path": "res://resource/sound/sfx/shooting/Shooting0012.ogg", + "Volume": 1, + "Remark": "\u6FC0\u5149\u6B66\u5668" + }, + { + "Id": "shooting0013", + "Path": "res://resource/sound/sfx/shooting/Shooting0013.ogg", + "Volume": 0.6, + "Remark": "P90" + }, + { "Id": "reloading0001", "Path": "res://resource/sound/sfx/reloading/Reloading0001.ogg", "Volume": 1, @@ -111,7 +123,13 @@ "Id": "reloadBegin0006", "Path": "res://resource/sound/sfx/reloading/Reloading_begin0006.ogg", "Volume": 1, - "Remark": "" + "Remark": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA" + }, + { + "Id": "reloadBegin0007", + "Path": "res://resource/sound/sfx/reloading/Reloading_begin0007.ogg", + "Volume": 1, + "Remark": "P90" }, { "Id": "reloadBegin0009", @@ -138,6 +156,12 @@ "Remark": "" }, { + "Id": "reloadBegin0013", + "Path": "res://resource/sound/sfx/reloading/Reloading_begin0013.ogg", + "Volume": 1.2, + "Remark": "" + }, + { "Id": "reloadFinish0002", "Path": "res://resource/sound/sfx/reloading/Reloading_finish0002.ogg", "Volume": 1, @@ -156,6 +180,12 @@ "Remark": "" }, { + "Id": "reloadFinish0005", + "Path": "res://resource/sound/sfx/reloading/Reloading_finish0005.ogg", + "Volume": 1.2, + "Remark": "" + }, + { "Id": "beLoaded0001", "Path": "res://resource/sound/sfx/beLoaded/BeLoaded0001.ogg", "Volume": 1, @@ -212,8 +242,8 @@ { "Id": "beLoaded0010", "Path": "res://resource/sound/sfx/beLoaded/BeLoaded0010.ogg", - "Volume": 1, - "Remark": "\u6B65\u67AA" + "Volume": 0.7, + "Remark": "P90" }, { "Id": "beLoaded0011", @@ -280,5 +310,11 @@ "Path": "res://resource/sound/sfx/collision/Collision0001.ogg", "Volume": 0.7, "Remark": "\u78B0\u649E" + }, + { + "Id": "gold", + "Path": "res://resource/sound/sfx/common/gold.ogg", + "Volume": 1.5, + "Remark": "\u91D1\u5E01" } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/WeaponBase.json b/DungeonShooting_Godot/resource/config/WeaponBase.json index 3cbe120..e8e4f61 100644 --- a/DungeonShooting_Godot/resource/config/WeaponBase.json +++ b/DungeonShooting_Godot/resource/config/WeaponBase.json @@ -10,7 +10,9 @@ "AmmoCapacity": 30, "MaxAmmoCapacity": 420, "StandbyAmmoCapacity": 390, - "ReloadTime": 2.2, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -48,15 +50,12 @@ "UpliftAngle": 10, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0001", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -74,11 +73,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0002", "__AiAttackAttr": "" }, { - "Id": "0002", + "Id": "0001_ai", "Remark": "\u6B65\u67AA", "__Activity": "", "Weight": 40, @@ -88,7 +86,9 @@ "AmmoCapacity": 30, "MaxAmmoCapacity": 420, "StandbyAmmoCapacity": 390, - "ReloadTime": 2.2, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -102,7 +102,7 @@ "ContinuousCountRange": [ 3 ], - "TriggerInterval": 3, + "TriggerInterval": 1.2, "StartFiringSpeed": 480, "FinalFiringSpeed": 480, "FiringSpeedAddSpeed": 0, @@ -126,15 +126,12 @@ "UpliftAngle": 10, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0001", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -152,11 +149,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0001" }, { - "Id": "0003", + "Id": "0002", "Remark": "\u9730\u5F39\u67AA", "__Activity": "weapon0002", "Weight": 40, @@ -166,11 +162,13 @@ "AmmoCapacity": 7, "MaxAmmoCapacity": 140, "StandbyAmmoCapacity": 133, - "ReloadTime": 0.4, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 0.26, "AloneReload": true, "AloneReloadCount": 1, - "AloneReloadBeginIntervalTime": 0.6, - "AloneReloadFinishIntervalTime": 0.6, + "AloneReloadBeginIntervalTime": 0.5, + "AloneReloadFinishIntervalTime": 0.45, "AloneReloadCanShoot": true, "LooseShoot": false, "MinChargeTime": 0, @@ -204,15 +202,12 @@ "UpliftAngle": 15, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0002", "__Shell": "shell0002", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.2, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -230,11 +225,10 @@ "__BeLoadedSound": "beLoaded0005", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0004", "__AiAttackAttr": "" }, { - "Id": "0004", + "Id": "0002_ai", "Remark": "\u9730\u5F39\u67AA", "__Activity": "", "Weight": 40, @@ -244,11 +238,13 @@ "AmmoCapacity": 7, "MaxAmmoCapacity": 140, "StandbyAmmoCapacity": 133, - "ReloadTime": 0.4, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 0.26, "AloneReload": true, "AloneReloadCount": 1, - "AloneReloadBeginIntervalTime": 0.6, - "AloneReloadFinishIntervalTime": 0.6, + "AloneReloadBeginIntervalTime": 0.5, + "AloneReloadFinishIntervalTime": 0.45, "AloneReloadCanShoot": true, "LooseShoot": false, "MinChargeTime": 0, @@ -258,7 +254,7 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 3.5, + "TriggerInterval": 1.4, "StartFiringSpeed": 120, "FinalFiringSpeed": 120, "FiringSpeedAddSpeed": 0, @@ -282,15 +278,12 @@ "UpliftAngle": 15, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0002", "__Shell": "shell0002", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.2, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -308,11 +301,10 @@ "__BeLoadedSound": "beLoaded0005", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0002" }, { - "Id": "0005", + "Id": "0003", "Remark": "\u624B\u67AA", "__Activity": "weapon0003", "Weight": 20, @@ -322,7 +314,9 @@ "AmmoCapacity": 12, "MaxAmmoCapacity": 180, "StandbyAmmoCapacity": 168, - "ReloadTime": 1.5, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.4, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -360,15 +354,12 @@ "UpliftAngle": 20, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0001", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -386,11 +377,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0006", "__AiAttackAttr": "" }, { - "Id": "0006", + "Id": "0003_ai", "Remark": "\u624B\u67AA", "__Activity": "", "Weight": 20, @@ -400,7 +390,9 @@ "AmmoCapacity": 12, "MaxAmmoCapacity": 180, "StandbyAmmoCapacity": 168, - "ReloadTime": 1.5, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.4, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -414,9 +406,9 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 1.3, - "StartFiringSpeed": 300, - "FinalFiringSpeed": 300, + "TriggerInterval": 0.55, + "StartFiringSpeed": 460, + "FinalFiringSpeed": 460, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, "FiringSpeedBackTime": 0, @@ -438,15 +430,12 @@ "UpliftAngle": 20, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0001", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -464,11 +453,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0003" }, { - "Id": "0007", + "Id": "0004", "Remark": "\u5200", "__Activity": "weapon0004", "Weight": 40, @@ -478,6 +466,8 @@ "AmmoCapacity": 180, "MaxAmmoCapacity": 180, "StandbyAmmoCapacity": 180, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 2, "AloneReload": false, "AloneReloadCount": 1, @@ -519,11 +509,8 @@ "__Bullet": "2001", "__Shell": "", "ReloadThrowShell": false, + "ThrowShellCount": 0, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -541,11 +528,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0008", "__AiAttackAttr": "" }, { - "Id": "0008", + "Id": "0004_ai", "Remark": "\u5200", "__Activity": "", "Weight": 40, @@ -555,6 +541,8 @@ "AmmoCapacity": 180, "MaxAmmoCapacity": 180, "StandbyAmmoCapacity": 180, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 2, "AloneReload": false, "AloneReloadCount": 1, @@ -569,7 +557,7 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 3, + "TriggerInterval": 2, "StartFiringSpeed": 180, "FinalFiringSpeed": 180, "FiringSpeedAddSpeed": 0, @@ -596,11 +584,8 @@ "__Bullet": "2001", "__Shell": "", "ReloadThrowShell": false, + "ThrowShellCount": 0, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -618,11 +603,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0004" }, { - "Id": "0009", + "Id": "0005", "Remark": "\u72D9\u51FB\u67AA", "__Activity": "weapon0005", "Weight": 50, @@ -632,7 +616,9 @@ "AmmoCapacity": 10, "MaxAmmoCapacity": 80, "StandbyAmmoCapacity": 70, - "ReloadTime": 3, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2.8, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -670,15 +656,12 @@ "UpliftAngle": 15, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0004", "__Shell": "shell0003", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.2, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -696,11 +679,10 @@ "__BeLoadedSound": "beLoaded0007", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0010", "__AiAttackAttr": "" }, { - "Id": "0010", + "Id": "0005_ai", "Remark": "\u72D9\u51FB\u67AA", "__Activity": "", "Weight": 50, @@ -710,7 +692,9 @@ "AmmoCapacity": 10, "MaxAmmoCapacity": 80, "StandbyAmmoCapacity": 70, - "ReloadTime": 3, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2.8, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -724,7 +708,7 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 5, + "TriggerInterval": 2.2, "StartFiringSpeed": 150, "FinalFiringSpeed": 150, "FiringSpeedAddSpeed": 0, @@ -748,15 +732,12 @@ "UpliftAngle": 15, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0004", "__Shell": "shell0003", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.2, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -774,11 +755,10 @@ "__BeLoadedSound": "beLoaded0007", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0005" }, { - "Id": "0011", + "Id": "0006", "Remark": "\u51B2\u950B\u67AA", "__Activity": "weapon0006", "Weight": 30, @@ -788,7 +768,9 @@ "AmmoCapacity": 20, "MaxAmmoCapacity": 600, "StandbyAmmoCapacity": 580, - "ReloadTime": 2.2, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.8, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -826,15 +808,12 @@ "UpliftAngle": 5, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0002", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -844,19 +823,18 @@ ], "__ShootSound": "shooting0002", "__BeginReloadSound": "reloadBegin0005", - "BeginReloadSoundDelayTime": 0.2, + "BeginReloadSoundDelayTime": 0, "__ReloadSound": "", "ReloadSoundDelayTime": 0, "__ReloadFinishSound": "beLoaded0016", - "ReloadFinishSoundAdvanceTime": 0.5, + "ReloadFinishSoundAdvanceTime": 0.6, "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0012", "__AiAttackAttr": "" }, { - "Id": "0012", + "Id": "0006_ai", "Remark": "\u51B2\u950B\u67AA", "__Activity": "", "Weight": 30, @@ -866,7 +844,9 @@ "AmmoCapacity": 20, "MaxAmmoCapacity": 600, "StandbyAmmoCapacity": 580, - "ReloadTime": 2.2, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.8, "AloneReload": false, "AloneReloadCount": 1, "AloneReloadBeginIntervalTime": 0, @@ -880,7 +860,7 @@ "ContinuousCountRange": [ 5 ], - "TriggerInterval": 3.5, + "TriggerInterval": 1.4, "StartFiringSpeed": 700, "FinalFiringSpeed": 700, "FiringSpeedAddSpeed": 0, @@ -904,15 +884,12 @@ "UpliftAngle": 5, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0002", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -922,19 +899,18 @@ ], "__ShootSound": "shooting0002", "__BeginReloadSound": "reloadBegin0005", - "BeginReloadSoundDelayTime": 0.2, + "BeginReloadSoundDelayTime": 0, "__ReloadSound": "", "ReloadSoundDelayTime": 0, "__ReloadFinishSound": "beLoaded0016", - "ReloadFinishSoundAdvanceTime": 0.5, + "ReloadFinishSoundAdvanceTime": 0.6, "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0004" }, { - "Id": "0013", + "Id": "0007", "Remark": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA", "__Activity": "weapon0007", "Weight": 40, @@ -944,6 +920,8 @@ "AmmoCapacity": 60, "MaxAmmoCapacity": 600, "StandbyAmmoCapacity": 540, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 2.2, "AloneReload": false, "AloneReloadCount": 1, @@ -982,15 +960,12 @@ "UpliftAngle": 5, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0003", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1008,11 +983,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0014", "__AiAttackAttr": "" }, { - "Id": "0014", + "Id": "0007_ai", "Remark": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA", "__Activity": "", "Weight": 40, @@ -1022,6 +996,8 @@ "AmmoCapacity": 60, "MaxAmmoCapacity": 600, "StandbyAmmoCapacity": 540, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 2.2, "AloneReload": false, "AloneReloadCount": 1, @@ -1036,9 +1012,9 @@ "ContinuousCountRange": [ 10 ], - "TriggerInterval": 4.5, - "StartFiringSpeed": 200, - "FinalFiringSpeed": 200, + "TriggerInterval": 2, + "StartFiringSpeed": 700, + "FinalFiringSpeed": 700, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, "FiringSpeedBackTime": 0, @@ -1060,15 +1036,12 @@ "UpliftAngle": 5, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0003", "__Shell": "shell0001", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1086,11 +1059,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0006" }, { - "Id": "0015", + "Id": "0008", "Remark": "\u6FC0\u5149\u624B\u67AA", "__Activity": "weapon0008", "Weight": 40, @@ -1100,6 +1072,8 @@ "AmmoCapacity": 10, "MaxAmmoCapacity": 240, "StandbyAmmoCapacity": 120, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 1.8, "AloneReload": false, "AloneReloadCount": 1, @@ -1138,15 +1112,12 @@ "UpliftAngle": 13, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire2.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0002.tscn", "__Bullet": "1001", "__Shell": "", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1164,11 +1135,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0016", "__AiAttackAttr": "" }, { - "Id": "0016", + "Id": "0008_ai", "Remark": "\u6FC0\u5149\u624B\u67AA", "__Activity": "", "Weight": 40, @@ -1178,6 +1148,8 @@ "AmmoCapacity": 10, "MaxAmmoCapacity": 240, "StandbyAmmoCapacity": 120, + "ShowReloadBar": true, + "AutoReload": false, "ReloadTime": 1.8, "AloneReload": false, "AloneReloadCount": 1, @@ -1192,7 +1164,7 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 4, + "TriggerInterval": 1.8, "StartFiringSpeed": 300, "FinalFiringSpeed": 300, "FiringSpeedAddSpeed": 0, @@ -1216,15 +1188,12 @@ "UpliftAngle": 13, "DefaultAngle": 0, "UpliftAngleRestore": 1, - "FireEffect": "res://prefab/effect/weapon/ShotFire2.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0002.tscn", "__Bullet": "1001", "__Shell": "", "ReloadThrowShell": false, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1242,11 +1211,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0007" }, { - "Id": "0017", + "Id": "0009", "Remark": "\u69B4\u5F39\u53D1\u5C04\u5668", "__Activity": "weapon0009", "Weight": 40, @@ -1256,6 +1224,8 @@ "AmmoCapacity": 1, "MaxAmmoCapacity": 50, "StandbyAmmoCapacity": 25, + "ShowReloadBar": true, + "AutoReload": true, "ReloadTime": 1.5, "AloneReload": false, "AloneReloadCount": 1, @@ -1271,8 +1241,8 @@ 1 ], "TriggerInterval": 0, - "StartFiringSpeed": 60, - "FinalFiringSpeed": 60, + "StartFiringSpeed": 180, + "FinalFiringSpeed": 180, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, "FiringSpeedBackTime": 0, @@ -1294,15 +1264,12 @@ "UpliftAngle": 16, "DefaultAngle": 0, "UpliftAngleRestore": 3, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0005", "__Shell": "shell0004", "ReloadThrowShell": true, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.46, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1320,11 +1287,10 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "0018", "__AiAttackAttr": "" }, { - "Id": "0018", + "Id": "0009_ai", "Remark": "\u69B4\u5F39\u53D1\u5C04\u5668", "__Activity": "", "Weight": 40, @@ -1334,6 +1300,8 @@ "AmmoCapacity": 1, "MaxAmmoCapacity": 50, "StandbyAmmoCapacity": 25, + "ShowReloadBar": true, + "AutoReload": true, "ReloadTime": 1.5, "AloneReload": false, "AloneReloadCount": 1, @@ -1348,9 +1316,9 @@ "ContinuousCountRange": [ 1 ], - "TriggerInterval": 5, - "StartFiringSpeed": 60, - "FinalFiringSpeed": 60, + "TriggerInterval": 1.3, + "StartFiringSpeed": 180, + "FinalFiringSpeed": 180, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, "FiringSpeedBackTime": 0, @@ -1372,15 +1340,12 @@ "UpliftAngle": 16, "DefaultAngle": 0, "UpliftAngleRestore": 3, - "FireEffect": "res://prefab/effect/weapon/ShotFire.tscn", + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", "__Bullet": "0005", "__Shell": "shell0004", "ReloadThrowShell": true, + "ThrowShellCount": 1, "ThrowShellDelayTime": 0.46, - "ThrowCollisionSize": { - "X": 20, - "Y": 15 - }, "CanMeleeAttack": true, "MeleeAttackHarmRange": [ 10 @@ -1398,7 +1363,766 @@ "__BeLoadedSound": "", "BeLoadedSoundDelayTime": 0, "__OtherSoundMap": null, - "__AiUseAttribute": "", "__AiAttackAttr": "0008" + }, + { + "Id": "0010", + "Remark": "M1\u578B\u70ED\u80FD\u72D9\u51FB\u67AA", + "__Activity": "weapon0010", + "Weight": 40, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 5, + "MaxAmmoCapacity": 150, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0, + "StartFiringSpeed": 210, + "FinalFiringSpeed": 210, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 0, + "FinalScatteringRange": 20, + "ScatteringRangeAddValue": 7, + "ScatteringRangeBackSpeed": 20, + "ScatteringRangeBackDelayTime": 0.5, + "CameraShake": 2, + "BacklashRange": [ + 2, + 3 + ], + "BacklashRegressionSpeed": 25, + "UpliftAngle": 16, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0004.tscn", + "__Bullet": "0007", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 1, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0012", + "__BeginReloadSound": "reloadBegin0013", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "reloadFinish0005", + "ReloadFinishSoundAdvanceTime": 0.6, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "" + }, + { + "Id": "0010_ai", + "Remark": "M1\u578B\u70ED\u80FD\u72D9\u51FB\u67AA", + "__Activity": "", + "Weight": 40, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 5, + "MaxAmmoCapacity": 150, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 1.5, + "StartFiringSpeed": 210, + "FinalFiringSpeed": 210, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 0, + "FinalScatteringRange": 20, + "ScatteringRangeAddValue": 7, + "ScatteringRangeBackSpeed": 20, + "ScatteringRangeBackDelayTime": 0.5, + "CameraShake": 2, + "BacklashRange": [ + 2, + 3 + ], + "BacklashRegressionSpeed": 25, + "UpliftAngle": 16, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0004.tscn", + "__Bullet": "0007", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 1, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0012", + "__BeginReloadSound": "reloadBegin0013", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "reloadFinish0005", + "ReloadFinishSoundAdvanceTime": 0.6, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "0009" + }, + { + "Id": "0011", + "Remark": "weapon0011", + "__Activity": "weapon0011", + "Weight": 30, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": true, + "AmmoCapacity": 20, + "MaxAmmoCapacity": 600, + "StandbyAmmoCapacity": 580, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.8, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0, + "StartFiringSpeed": 700, + "FinalFiringSpeed": 700, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 3, + "FinalScatteringRange": 30, + "ScatteringRangeAddValue": 2, + "ScatteringRangeBackSpeed": 40, + "ScatteringRangeBackDelayTime": 0.3, + "CameraShake": 2, + "BacklashRange": [ + 1, + 2 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 5, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0009", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 0, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0002", + "__BeginReloadSound": "reloadBegin0005", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0016", + "ReloadFinishSoundAdvanceTime": 0.6, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "" + }, + { + "Id": "0011_ai", + "Remark": "weapon0011", + "__Activity": "", + "Weight": 30, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 20, + "MaxAmmoCapacity": 600, + "StandbyAmmoCapacity": 580, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1.8, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 5 + ], + "TriggerInterval": 1.6, + "StartFiringSpeed": 350, + "FinalFiringSpeed": 350, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 3, + "FinalScatteringRange": 30, + "ScatteringRangeAddValue": 2, + "ScatteringRangeBackSpeed": 30, + "ScatteringRangeBackDelayTime": 0.3, + "CameraShake": 2, + "BacklashRange": [ + 1, + 2 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 5, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0009", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 0, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0002", + "__BeginReloadSound": "reloadBegin0005", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0016", + "ReloadFinishSoundAdvanceTime": 0.6, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "0004" + }, + { + "Id": "0013", + "Remark": "P90", + "__Activity": "weapon0013", + "Weight": 40, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": true, + "AmmoCapacity": 50, + "MaxAmmoCapacity": 500, + "StandbyAmmoCapacity": 350, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0, + "StartFiringSpeed": 900, + "FinalFiringSpeed": 900, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0.5, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 5, + "FinalScatteringRange": 35, + "ScatteringRangeAddValue": 2, + "ScatteringRangeBackSpeed": 50, + "ScatteringRangeBackDelayTime": 0.3, + "CameraShake": 2, + "BacklashRange": [ + 1, + 1 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 3, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0003", + "__Shell": "shell0001", + "ReloadThrowShell": false, + "ThrowShellCount": 1, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0013", + "__BeginReloadSound": "reloadBegin0007", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0010", + "ReloadFinishSoundAdvanceTime": 0.35, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "" + }, + { + "Id": "0013_ai", + "Remark": "P90", + "__Activity": "", + "Weight": 40, + "WeightType": 2, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 50, + "MaxAmmoCapacity": 500, + "StandbyAmmoCapacity": 350, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 2, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0, + "ContinuousCountRange": [ + 25 + ], + "TriggerInterval": 3, + "StartFiringSpeed": 900, + "FinalFiringSpeed": 900, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 10, + "FinalScatteringRange": 30, + "ScatteringRangeAddValue": 3, + "ScatteringRangeBackSpeed": 50, + "ScatteringRangeBackDelayTime": 0.3, + "CameraShake": 2, + "BacklashRange": [ + 1, + 1 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 3, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0003", + "__Shell": "shell0001", + "ReloadThrowShell": false, + "ThrowShellCount": 1, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0013", + "__BeginReloadSound": "reloadBegin0007", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0010", + "ReloadFinishSoundAdvanceTime": 0.35, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "0006" + }, + { + "Id": "0014", + "Remark": "\u5DE6\u8F6E", + "__Activity": "weapon0014", + "Weight": 20, + "WeightType": 1, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 5, + "MaxAmmoCapacity": 120, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0.05, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0, + "StartFiringSpeed": 600, + "FinalFiringSpeed": 600, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 2, + "FinalScatteringRange": 25, + "ScatteringRangeAddValue": 5, + "ScatteringRangeBackSpeed": 25, + "ScatteringRangeBackDelayTime": 0.5, + "CameraShake": 4, + "BacklashRange": [ + 3, + 5 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 20, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0008", + "__Shell": "shell0001", + "ReloadThrowShell": true, + "ThrowShellCount": 5, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0004", + "__BeginReloadSound": "reloading0001", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0015", + "ReloadFinishSoundAdvanceTime": 0.43, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "" + }, + { + "Id": "0014_ai", + "Remark": "\u5DE6\u8F6E", + "__Activity": "", + "Weight": 20, + "WeightType": 1, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 5, + "MaxAmmoCapacity": 120, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": true, + "AutoReload": false, + "ReloadTime": 1, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": false, + "MinChargeTime": 0, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0.05, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0.45, + "StartFiringSpeed": 300, + "FinalFiringSpeed": 300, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 2, + "FinalScatteringRange": 25, + "ScatteringRangeAddValue": 5, + "ScatteringRangeBackSpeed": 25, + "ScatteringRangeBackDelayTime": 0.5, + "CameraShake": 4, + "BacklashRange": [ + 3, + 5 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 20, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "res://prefab/effect/weapon/ShotFire0001.tscn", + "__Bullet": "0008", + "__Shell": "shell0001", + "ReloadThrowShell": true, + "ThrowShellCount": 5, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "shooting0004", + "__BeginReloadSound": "reloading0001", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "beLoaded0015", + "ReloadFinishSoundAdvanceTime": 0.43, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "0003" + }, + { + "Id": "0016", + "Remark": "\u6728\u8D28\u77ED\u5F13", + "__Activity": "weapon0016", + "Weight": 20, + "WeightType": 1, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 1, + "MaxAmmoCapacity": 120, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": false, + "AutoReload": true, + "ReloadTime": 0.01, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": true, + "MinChargeTime": 0.5, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0.05, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0, + "StartFiringSpeed": 600, + "FinalFiringSpeed": 600, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 5, + "FinalScatteringRange": 40, + "ScatteringRangeAddValue": 40, + "ScatteringRangeBackSpeed": 50, + "ScatteringRangeBackDelayTime": 0.4, + "CameraShake": 4, + "BacklashRange": [ + -2, + -2 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 0, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "", + "__Bullet": "0010", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 0, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "", + "__BeginReloadSound": "", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "", + "ReloadFinishSoundAdvanceTime": 0.43, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "" + }, + { + "Id": "0016_ai", + "Remark": "\u6728\u8D28\u77ED\u5F13", + "__Activity": "", + "Weight": 20, + "WeightType": 1, + "IsMelee": false, + "ContinuousShoot": false, + "AmmoCapacity": 1, + "MaxAmmoCapacity": 120, + "StandbyAmmoCapacity": 80, + "ShowReloadBar": false, + "AutoReload": true, + "ReloadTime": 0.5, + "AloneReload": false, + "AloneReloadCount": 1, + "AloneReloadBeginIntervalTime": 0, + "AloneReloadFinishIntervalTime": 0, + "AloneReloadCanShoot": false, + "LooseShoot": true, + "MinChargeTime": 0.5, + "ManualBeLoaded": false, + "AutoManualBeLoaded": false, + "BeLoadedTime": 0.05, + "ContinuousCountRange": [ + 1 + ], + "TriggerInterval": 0.5, + "StartFiringSpeed": 600, + "FinalFiringSpeed": 600, + "FiringSpeedAddSpeed": 0, + "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, + "FireBulletCountRange": [ + 1 + ], + "DelayedTime": 0, + "StartScatteringRange": 5, + "FinalScatteringRange": 40, + "ScatteringRangeAddValue": 40, + "ScatteringRangeBackSpeed": 50, + "ScatteringRangeBackDelayTime": 0.4, + "CameraShake": 4, + "BacklashRange": [ + -2, + -2 + ], + "BacklashRegressionSpeed": 35, + "UpliftAngle": 0, + "DefaultAngle": 0, + "UpliftAngleRestore": 1, + "FireEffect": "", + "__Bullet": "0010", + "__Shell": "", + "ReloadThrowShell": false, + "ThrowShellCount": 0, + "ThrowShellDelayTime": 0, + "CanMeleeAttack": true, + "MeleeAttackHarmRange": [ + 10 + ], + "MeleeAttackRepelRange": [ + 100 + ], + "__ShootSound": "", + "__BeginReloadSound": "", + "BeginReloadSoundDelayTime": 0, + "__ReloadSound": "", + "ReloadSoundDelayTime": 0, + "__ReloadFinishSound": "", + "ReloadFinishSoundAdvanceTime": 0.43, + "__BeLoadedSound": "", + "BeLoadedSoundDelayTime": 0, + "__OtherSoundMap": null, + "__AiAttackAttr": "0003" } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json index 9daed0e..e6bcbed 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json @@ -1,64 +1,69 @@ { - "TestGroup1": { - "GroupName": "TestGroup1", + "Test1": { + "GroupName": "Test1", + "TileSet": "TileSet1", "BattleList": [ { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle1" + "Path": "resource/map/tileMaps/Test1/battle/Battle1" }, { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle2" + "Path": "resource/map/tileMaps/Test1/battle/Battle2" }, { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle3" + "Path": "resource/map/tileMaps/Test1/battle/Battle3" }, { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle4" + "Path": "resource/map/tileMaps/Test1/battle/Battle4" }, { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle5" + "Path": "resource/map/tileMaps/Test1/battle/Battle5" }, { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle6" + "Path": "resource/map/tileMaps/Test1/battle/Battle6" } ], "InletList": [ { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start1" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start2" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start3" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start4" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start5" + "Path": "resource/map/tileMaps/Test1/inlet/Start" } ], "OutletList": [ { "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/outlet/End1" + "Path": "resource/map/tileMaps/Test1/outlet/End1" } ], - "BossList": [], - "RewardList": [], - "ShopList": [], - "EventList": [], - "Remark": "\u6D4B\u8BD5\u7EC4" + "BossList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/Test1/boss/Boss1" + } + ], + "RewardList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/Test1/reward/Award1" + } + ], + "ShopList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/Test1/shop/Shop1" + } + ], + "EventList": [ + { + "ErrorType": 2, + "Path": "resource/map/tileMaps/Test1/event/\u6D4B\u8BD5\u623F\u95F4" + } + ], + "Remark": "" } } \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png new file mode 100644 index 0000000..ce7fa71 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png.import new file mode 100644 index 0000000..cfe8193 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wvfu2bwf6m7t" +path="res://.godot/imported/Preview.png-c3396b369b426836d0fe1b15b21c3825.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle1/Preview.png" +dest_files=["res://.godot/imported/Preview.png-c3396b369b426836d0fe1b15b21c3825.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/tileMaps/Test1/battle/Battle1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/RoomInfo.json new file mode 100644 index 0000000..b5e2972 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-4,"Y":-13},"Size":{"X":16,"Y":19},"DoorAreaInfos":[{"Direction":3,"Start":16,"End":192},{"Direction":1,"Start":80,"End":144},{"Direction":2,"Start":64,"End":192},{"Direction":0,"Start":96,"End":224}],"GroupName":"Test1","RoomType":1,"RoomName":"Battle1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/TileInfo.json new file mode 100644 index 0000000..62aca9a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle1/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":154,"Y":-58},{"X":154,"Y":74},{"X":134,"Y":38},{"X":134,"Y":-22},{"X":42,"Y":-58},{"X":74,"Y":-22},{"X":74,"Y":38},{"X":38,"Y":74},{"X":38,"Y":58},{"X":154,"Y":-154},{"X":154,"Y":-102},{"X":42,"Y":-102},{"X":-10,"Y":-154},{"X":-10,"Y":-74},{"X":-10,"Y":58},{"X":-10,"Y":-6},{"X":-26,"Y":-6},{"X":-26,"Y":-74}],"NavigationPolygon":[[0,1,2,3],[4,0,3,5],[6,2,1,7,8],[9,10,11,12],[13,12,11,4],[8,14,15,4,5,6],[15,16,17,13,4]],"Floor":[-1,-1,0,3,3,-1,0,3,3,0,0,3,2,0,0,3,2,-1,0,3,1,-1,0,3,0,-1,0,3,0,0,0,3,-1,0,0,3,1,0,0,3,-1,1,0,3,0,1,0,3,1,1,0,3,2,1,0,3,3,1,0,3,4,1,0,3,4,2,0,3,3,2,0,3,2,2,0,3,1,2,0,3,0,2,0,3,-1,2,0,3,4,0,0,3,4,-1,0,3,4,-2,0,3,3,-2,0,3,2,-2,0,3,1,-2,0,3,0,-2,0,3,-1,-2,0,3,-1,-3,0,3,0,-3,0,3,1,-3,0,3,2,-3,0,3,3,-3,0,3,4,-3,0,3,5,-3,0,3,2,-5,0,3,1,-5,0,3,0,-5,0,3,-1,-5,0,3,-2,-5,0,3,-2,-4,0,3,-1,-4,0,3,0,-4,0,3,1,-4,0,3,2,-4,0,3,3,-4,0,3,8,-3,0,3,8,-2,0,3,7,-3,0,3,6,-3,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,7,2,0,3,7,3,0,3,6,3,0,3,5,3,0,3,4,3,0,3,3,3,0,3,8,3,0,3,9,3,0,3,9,2,0,3,-2,-3,0,3,-2,-2,0,3,9,0,0,3,9,1,0,3,9,-1,0,3,9,-2,0,3,9,-3,0,3,2,3,0,3,5,2,0,3,6,2,0,3,-1,-9,0,3,0,-9,0,3,1,-9,0,3,2,-9,0,3,0,-10,0,3,1,-10,0,3,2,-10,0,3,-1,-8,0,3,-1,-7,0,3,-1,-6,0,3,0,-6,0,3,0,-7,0,3,1,-7,0,3,1,-8,0,3,0,-8,0,3,1,-6,0,3,2,-7,0,3,2,-8,0,3,2,-6,0,3,3,-10,0,3,4,-10,0,3,5,-10,0,3,6,-10,0,3,7,-10,0,3,8,-10,0,3,9,-10,0,3,9,-9,0,3,8,-9,0,3,7,-9,0,3,6,-9,0,3,5,-9,0,3,4,-9,0,3,3,-9,0,3,3,-8,0,3,4,-8,0,3,5,-8,0,3,6,-8,0,3,7,-8,0,3,8,-8,0,3,9,-8,0,3,-1,-10,0,3,7,-4,0,3,6,-4,0,3,5,-4,0,3,4,-4,0,3,8,-4,0,3,9,-4,0,3],"CustomFloor1":[0,-4,2,2,6,0,-3,2,5,8,-1,-3,2,1,8,-1,-4,2,1,6,1,-4,2,2,6,1,-3,2,2,7,2,-4,2,2,6,2,-3,2,2,7,3,-4,2,2,6,3,-3,2,2,7,1,-2,2,2,7,0,-2,2,1,7,1,-1,2,2,7,0,-1,2,1,7,1,0,2,2,7,0,0,2,1,7,1,1,2,2,8,0,1,2,1,8,2,0,2,2,7,2,1,2,2,8,3,0,2,2,7,3,1,2,5,8,2,-1,2,2,7,2,-2,2,2,7,3,-2,2,2,7,3,-1,2,2,7,4,-4,2,2,6,4,-3,2,4,8,5,-4,2,2,6,5,-3,2,2,8,6,-4,2,2,6,6,-3,2,2,8,7,-4,2,2,6,7,-3,2,2,8,8,-4,2,2,6,8,-3,2,5,8,9,-4,2,3,6,9,-3,2,3,7,9,-2,2,3,7,8,-2,2,1,7,9,-1,2,3,7,8,-1,2,1,7,9,0,2,3,7,8,0,2,1,7,9,1,2,3,7,8,1,2,1,7,9,2,2,3,7,8,2,2,5,9,9,3,2,3,8,8,3,2,2,8,7,3,2,2,8,7,2,2,2,6,6,3,2,2,8,6,2,2,2,6,5,3,2,2,8,5,2,2,2,6,4,3,2,2,8,4,2,2,4,9,3,3,2,1,8,3,2,2,1,7,4,-2,2,3,7,4,-1,2,3,7,4,0,2,3,7,4,1,2,3,7],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png new file mode 100644 index 0000000..a2253ad --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png.import new file mode 100644 index 0000000..612a3f4 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxjknn0fg0u22" +path="res://.godot/imported/Preview.png-7d02ab01a6b11d990eeaacbfc7fdf821.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle2/Preview.png" +dest_files=["res://.godot/imported/Preview.png-7d02ab01a6b11d990eeaacbfc7fdf821.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/tileMaps/Test1/battle/Battle2/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/RoomInfo.json new file mode 100644 index 0000000..6f8b7ec --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-9,"Y":-10},"Size":{"X":27,"Y":21},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":1,"RoomName":"Battle2","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/TileInfo.json new file mode 100644 index 0000000..822b3d6 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle2/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":-106,"Y":154},{"X":-26,"Y":70},{"X":154,"Y":6},{"X":198,"Y":6},{"X":250,"Y":154},{"X":198,"Y":-54},{"X":250,"Y":-106},{"X":-106,"Y":-106},{"X":154,"Y":-54},{"X":-26,"Y":26},{"X":-26,"Y":-10},{"X":-70,"Y":70},{"X":-70,"Y":26},{"X":-26,"Y":-54},{"X":-70,"Y":-54},{"X":-70,"Y":-10}],"NavigationPolygon":[[0,1,2,3,4],[3,5,6,4],[7,6,5,8],[2,1,9],[2,9,10,8],[11,1,0],[11,0,7,12],[8,10,13],[7,8,13],[7,13,14],[15,10,9,12],[15,12,7],[15,7,14]],"Floor":[-7,-7,0,3,-7,-6,0,3,-7,-5,0,3,-7,-4,0,3,-7,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-7,4,0,3,-7,5,0,3,-7,6,0,3,-7,7,0,3,-7,8,0,3,-6,7,0,3,-6,8,0,3,-5,7,0,3,-5,8,0,3,-4,7,0,3,-4,8,0,3,-3,7,0,3,-3,8,0,3,-2,7,0,3,-2,8,0,3,-1,7,0,3,-1,8,0,3,0,7,0,3,0,8,0,3,1,7,0,3,1,8,0,3,2,7,0,3,2,8,0,3,3,7,0,3,3,8,0,3,4,7,0,3,4,8,0,3,5,7,0,3,5,8,0,3,6,7,0,3,6,8,0,3,7,7,0,3,7,8,0,3,8,7,0,3,8,8,0,3,9,7,0,3,9,8,0,3,10,7,0,3,10,8,0,3,11,7,0,3,11,8,0,3,12,7,0,3,12,8,0,3,13,7,0,3,13,8,0,3,14,7,0,3,14,8,0,3,15,-7,0,3,15,-6,0,3,15,-5,0,3,15,-4,0,3,15,-3,0,3,15,-2,0,3,15,-1,0,3,15,0,0,3,15,1,0,3,15,2,0,3,15,3,0,3,15,4,0,3,15,5,0,3,15,6,0,3,15,7,0,3,15,8,0,3,-6,-7,0,3,-6,-6,0,3,-6,-5,0,3,-6,-4,0,3,-6,-3,0,3,-6,-2,0,3,-6,-1,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-6,5,0,3,-6,6,0,3,-5,-7,0,3,-5,-6,0,3,-5,-5,0,3,-5,-4,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,-5,4,0,3,-5,5,0,3,-5,6,0,3,-4,-7,0,3,-4,-6,0,3,-4,-5,0,3,-4,-1,0,3,-4,0,0,3,-4,4,0,3,-4,5,0,3,-4,6,0,3,-3,-7,0,3,-3,-6,0,3,-3,-5,0,3,-3,-1,0,3,-3,0,0,3,-3,4,0,3,-3,5,0,3,-3,6,0,3,-2,-7,0,3,-2,-6,0,3,-2,-5,0,3,-2,-4,0,3,-2,-3,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-2,4,0,3,-2,5,0,3,-2,6,0,3,-1,-7,0,3,-1,-6,0,3,-1,-5,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,-1,3,0,3,-1,4,0,3,-1,5,0,3,-1,6,0,3,0,-7,0,3,0,-6,0,3,0,-5,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,0,3,0,3,0,4,0,3,0,5,0,3,0,6,0,3,1,-7,0,3,1,-6,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,1,3,0,3,1,4,0,3,1,5,0,3,1,6,0,3,2,-7,0,3,2,-6,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,2,3,0,3,2,4,0,3,2,5,0,3,2,6,0,3,3,-7,0,3,3,-6,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,3,3,0,3,3,4,0,3,3,5,0,3,3,6,0,3,4,-7,0,3,4,-6,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,4,5,0,3,4,6,0,3,5,-7,0,3,5,-6,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,5,3,0,3,5,4,0,3,5,5,0,3,5,6,0,3,6,-7,0,3,6,-6,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,6,3,0,3,6,4,0,3,6,5,0,3,6,6,0,3,7,-7,0,3,7,-6,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,7,-1,0,3,7,0,0,3,7,1,0,3,7,2,0,3,7,3,0,3,7,4,0,3,7,5,0,3,7,6,0,3,8,-7,0,3,8,-6,0,3,8,-5,0,3,8,-4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,8,3,0,3,8,4,0,3,8,5,0,3,8,6,0,3,9,-7,0,3,9,-6,0,3,9,-5,0,3,9,-4,0,3,9,-3,0,3,9,-2,0,3,9,-1,0,3,9,0,0,3,9,1,0,3,9,2,0,3,9,3,0,3,9,4,0,3,9,5,0,3,9,6,0,3,10,-7,0,3,10,-6,0,3,10,0,0,3,10,1,0,3,10,2,0,3,10,3,0,3,10,4,0,3,10,5,0,3,10,6,0,3,11,-7,0,3,11,-6,0,3,11,0,0,3,11,1,0,3,11,2,0,3,11,3,0,3,11,4,0,3,11,5,0,3,11,6,0,3,12,-7,0,3,12,-6,0,3,12,-5,0,3,12,-4,0,3,12,-3,0,3,12,-2,0,3,12,-1,0,3,12,0,0,3,12,1,0,3,12,2,0,3,12,3,0,3,12,4,0,3,12,5,0,3,12,6,0,3,13,-7,0,3,13,-5,0,3,13,-4,0,3,13,-3,0,3,13,-2,0,3,13,-1,0,3,13,0,0,3,13,1,0,3,13,2,0,3,13,3,0,3,13,4,0,3,13,5,0,3,13,6,0,3,14,-7,0,3,14,-6,0,3,14,-5,0,3,14,-4,0,3,14,-3,0,3,14,-2,0,3,14,-1,0,3,14,0,0,3,14,1,0,3,14,2,0,3,14,3,0,3,14,4,0,3,14,5,0,3,14,6,0,3,13,-6,0,3,11,-5,0,3,10,-5,0,3],"CustomFloor1":[3,3,2,2,7,2,3,2,2,7,3,4,2,2,7,2,4,2,2,7,3,5,2,2,7,2,5,2,2,7,1,5,2,2,7,1,4,2,2,7,2,6,2,2,7,1,6,2,2,7,3,6,2,2,7,4,5,2,2,7,4,6,2,2,7,5,5,2,2,7,5,6,2,2,7,10,4,2,2,7,9,4,2,2,7,11,4,2,2,7,11,3,2,2,7,10,3,2,2,7,11,2,2,2,7,10,2,2,2,7,10,1,2,2,7,10,0,2,2,6,8,4,2,2,7,5,4,2,2,7,4,4,2,2,7,4,3,2,2,7,5,3,2,2,7,8,2,2,2,7,8,3,2,2,7,9,2,2,2,7,9,3,2,2,7,9,1,2,2,7,5,-1,2,2,7,6,-1,2,2,7,8,-1,2,2,7,9,-1,2,3,7,9,0,2,4,9,-1,2,2,2,7,-2,2,2,1,7,-1,3,2,2,7,-2,3,2,1,7,-1,4,2,2,7,-2,4,2,5,9,-1,5,2,2,7,-2,5,2,2,7,0,4,2,2,7,0,5,2,2,7,0,6,2,2,7,-1,6,2,2,7,-2,6,2,2,7,0,2,2,2,7,0,3,2,2,7,1,3,2,2,7,4,-2,2,2,7,3,-2,2,2,7,4,-3,2,2,7,3,-3,2,2,7,4,-4,2,2,7,3,-4,2,2,7,5,-4,2,2,7,5,-3,2,2,7,6,-4,2,2,7,6,-3,2,2,7,7,-4,2,2,7,7,-3,2,2,7,8,-4,2,2,7,8,-3,2,2,7,9,-4,2,3,7,9,-3,2,3,7,8,-2,2,2,7,7,-2,2,2,7,6,-2,2,2,7,5,-2,2,2,7,2,-3,2,2,7,2,-4,2,2,7,-1,-3,2,2,7,-1,-4,2,2,7,-2,-3,2,1,7,-2,-4,2,1,7,-2,-2,2,1,7,-1,-2,2,2,7,0,-2,2,2,7,1,-2,2,2,7,2,-2,2,2,7,1,-1,2,2,7,0,-1,2,2,7,9,-2,2,3,7,12,-3,2,1,7,12,-2,2,1,7,12,2,2,2,7,12,3,2,2,7,12,4,2,2,7,13,5,2,2,7,13,4,2,2,7,14,4,2,2,7,14,5,2,2,7,14,3,2,2,7,13,3,2,2,7,14,2,2,2,7,13,2,2,2,7,15,1,2,3,7,15,2,2,3,7,14,1,2,2,7,15,0,2,3,7,14,0,2,2,7,15,-1,2,3,7,14,-1,2,2,7,15,-2,2,3,7,14,-2,2,2,7,15,-3,2,3,7,14,-3,2,2,7,13,-2,2,2,7,13,-3,2,2,7,14,-4,2,2,7,13,-4,2,2,7,15,3,2,3,7,15,4,2,3,7,-2,-6,2,2,7,-2,-5,2,5,8,-3,-5,2,2,8,-3,-6,2,2,7,9,-7,2,2,6,9,-6,2,2,7,8,-6,2,2,7,8,-7,2,2,6,7,-6,2,2,7,7,-7,2,2,6,6,-6,2,2,7,6,-7,2,2,6,5,-6,2,2,7,5,-7,2,2,6,4,-6,2,2,7,4,-7,2,2,6,-3,-7,2,2,6,-4,-6,2,2,7,-4,-7,2,2,6,-2,-7,2,2,6,-1,-7,2,2,6,-1,-6,2,2,7,0,-7,2,2,6,0,-6,2,2,7,1,-7,2,2,6,1,-6,2,2,7,2,-7,2,2,6,2,-6,2,2,7,3,-7,2,2,6,3,-6,2,2,7,-4,-5,2,2,8,-3,4,2,2,6,-4,4,2,2,6,-3,5,2,2,7,-4,5,2,2,7,-3,6,2,2,7,-5,5,2,2,7,-5,4,2,4,9,-6,5,2,2,7,-6,4,2,2,7,-5,0,2,4,8,-5,1,2,3,7,-6,1,2,2,7,-6,0,2,2,7,-5,2,2,3,7,-6,2,2,2,7,-5,3,2,3,7,-6,3,2,2,7,-1,1,2,2,7,-2,1,2,1,7,7,-1,2,2,7,6,2,2,2,7,7,2,2,2,7,7,3,2,2,7,6,3,2,2,7,7,4,2,2,7,6,4,2,2,7,7,5,2,2,7,6,5,2,2,7,7,6,2,2,7,6,6,2,2,7,8,5,2,2,7,8,6,2,2,7,9,5,2,2,7,9,6,2,2,7,10,5,2,2,7,10,6,2,2,7,11,5,2,2,7,11,6,2,2,7,12,5,2,2,7,12,6,2,2,7,13,6,2,2,7,-2,-1,2,5,9,-3,-1,2,2,6,-4,-1,2,2,6,-2,0,2,5,8,-3,0,2,2,8,-1,0,2,2,7,-1,-1,2,2,7,0,0,2,2,7,1,0,2,2,7,2,-1,2,2,7,2,0,2,2,7,4,-1,2,2,7,4,0,2,2,7,3,0,2,2,7,3,-1,2,2,7,5,0,2,2,7,6,0,2,2,7,7,0,2,2,7,8,0,2,2,7,11,0,2,2,6,12,-1,2,1,7,12,0,2,5,9,13,-1,2,2,7,13,0,2,2,7,13,1,2,2,7,12,1,2,2,7,11,1,2,2,7,8,1,2,2,7,7,1,2,2,7,6,1,2,2,7,5,1,2,2,7,4,1,2,2,7,3,1,2,2,7,2,1,2,2,7,1,1,2,2,7,0,1,2,2,7,1,2,2,2,7,2,2,2,2,7,3,2,2,2,7,4,2,2,2,7,5,2,2,2,7,-4,0,2,2,8,-5,-1,2,4,9,-6,-1,2,2,7,-6,-2,2,2,7,-6,-3,2,2,7,-5,-4,2,3,7,-6,-4,2,2,7,-5,-5,2,4,8,-6,-5,2,2,7,-5,-6,2,2,7,-6,-6,2,2,7,-1,-5,2,2,7,0,-5,2,2,7,1,-5,2,2,7,3,-5,2,2,7,2,-5,2,2,7,4,-5,2,2,7,5,-5,2,2,7,6,-5,2,2,7,7,-5,2,2,7,8,-5,2,2,7,9,-5,2,4,8,10,-5,2,2,8,11,-5,2,2,8,11,-6,2,2,7,10,-6,2,2,7,11,-7,2,2,6,10,-7,2,2,6,12,-7,2,2,6,12,-6,2,2,7,13,-7,2,2,6,13,-6,2,2,7,14,-7,2,2,6,14,-6,2,2,7,15,-7,2,3,6,15,-6,2,3,7,15,-5,2,3,7,14,-5,2,2,7,15,-4,2,3,7,13,-5,2,2,7,12,-4,2,1,7,12,-5,2,5,8,14,6,2,2,7,14,7,2,2,7,13,7,2,2,7,15,5,2,3,7,15,6,2,3,7,15,7,2,3,7,15,8,2,3,8,14,8,2,2,8,13,8,2,2,8,12,8,2,2,8,12,7,2,2,7,11,8,2,2,8,11,7,2,2,7,10,8,2,2,8,10,7,2,2,7,9,8,2,2,8,9,7,2,2,7,8,8,2,2,8,8,7,2,2,7,7,8,2,2,8,7,7,2,2,7,6,8,2,2,8,6,7,2,2,7,5,8,2,2,8,5,7,2,2,7,4,8,2,2,8,4,7,2,2,7,3,8,2,2,8,3,7,2,2,7,2,8,2,2,8,2,7,2,2,7,1,8,2,2,8,1,7,2,2,7,0,8,2,2,8,0,7,2,2,7,-1,7,2,2,7,-2,7,2,2,7,-3,7,2,2,7,-4,7,2,2,7,-4,6,2,2,7,-5,7,2,2,7,-5,6,2,2,7,-6,7,2,2,7,-6,6,2,2,7,-5,8,2,2,8,-6,8,2,2,8,-4,8,2,2,8,-3,8,2,2,8,-2,8,2,2,8,-1,8,2,2,8,-7,8,2,1,8,-7,7,2,1,7,-7,6,2,1,7,-7,5,2,1,7,-7,4,2,1,7,-7,3,2,1,7,-7,2,2,1,7,-7,1,2,1,7,-7,0,2,1,7,-7,-1,2,1,7,-7,-2,2,1,7,-7,-3,2,1,7,-7,-4,2,1,7,-7,-5,2,1,7,-5,-7,2,2,6,-6,-7,2,2,6,-7,-6,2,1,7,-7,-7,2,1,6,-5,-3,2,3,7,-5,-2,2,3,7,1,-4,2,2,7,1,-3,2,2,7,0,-3,2,2,7,0,-4,2,2,7],"CustomFloor2":[4,-1,1,8,11,3,4,1,8,11,8,5,1,6,14,9,5,1,7,14,10,5,1,8,14,10,6,1,8,15,9,6,1,7,15,8,6,1,6,15,1,2,1,12,11,-2,6,1,0,15,0,-6,1,0,15,7,-5,1,3,5],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png new file mode 100644 index 0000000..a7ad03b --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png.import new file mode 100644 index 0000000..3a15cae --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djatlwx25yc04" +path="res://.godot/imported/Preview.png-059b7ebb6f66594cdd23b790819a4a0c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle3/Preview.png" +dest_files=["res://.godot/imported/Preview.png-059b7ebb6f66594cdd23b790819a4a0c.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/tileMaps/Test1/battle/Battle3/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/RoomInfo.json new file mode 100644 index 0000000..d3e0245 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-10,"Y":-12},"Size":{"X":28,"Y":22},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":128},{"Direction":3,"Start":256,"End":384},{"Direction":2,"Start":256,"End":384},{"Direction":2,"Start":0,"End":128},{"Direction":1,"Start":0,"End":272},{"Direction":0,"Start":0,"End":272}],"GroupName":"Test1","RoomType":1,"RoomName":"Battle3","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/TileInfo.json new file mode 100644 index 0000000..7954779 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle3/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":134,"Y":-74},{"X":134,"Y":-138},{"X":250,"Y":-138},{"X":250,"Y":138},{"X":134,"Y":138},{"X":134,"Y":90},{"X":-6,"Y":-74},{"X":-6,"Y":90},{"X":-122,"Y":-138},{"X":-6,"Y":138},{"X":-122,"Y":138},{"X":-6,"Y":-138}],"NavigationPolygon":[[0,1,2,3],[3,4,5],[0,3,5,6],[6,5,7,8],[7,9,10,8],[11,6,8]],"Floor":[-3,-5,0,3,-3,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-3,3,0,3,-3,4,0,3,-2,-5,0,3,-2,-4,0,3,-2,-3,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-2,4,0,3,-1,-5,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,-1,3,0,3,-1,4,0,3,0,-5,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,0,3,0,3,0,4,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,1,3,0,3,1,4,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,2,3,0,3,2,4,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,3,3,0,3,3,4,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,5,3,0,3,5,4,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,6,3,0,3,6,4,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,7,-1,0,3,7,0,0,3,7,1,0,3,7,2,0,3,7,3,0,3,7,4,0,3,8,-5,0,3,8,-4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,8,3,0,3,8,4,0,3,9,-5,0,3,9,-4,0,3,9,-3,0,3,9,-2,0,3,9,-1,0,3,9,0,0,3,9,1,0,3,9,2,0,3,9,3,0,3,9,4,0,3,10,-5,0,3,10,-4,0,3,10,-3,0,3,10,-2,0,3,10,-1,0,3,10,0,0,3,10,1,0,3,10,2,0,3,10,3,0,3,10,4,0,3,-8,-9,0,3,-8,-8,0,3,-8,-7,0,3,-8,-6,0,3,-8,-5,0,3,-8,-4,0,3,-8,-3,0,3,-8,-2,0,3,-8,-1,0,3,-8,0,0,3,-8,1,0,3,-8,2,0,3,-8,3,0,3,-8,4,0,3,-8,5,0,3,-8,6,0,3,-8,7,0,3,-7,-9,0,3,-7,-8,0,3,-7,-7,0,3,-7,-6,0,3,-7,-5,0,3,-7,-4,0,3,-7,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-7,4,0,3,-7,5,0,3,-7,6,0,3,-7,7,0,3,-6,-9,0,3,-6,-8,0,3,-6,-7,0,3,-6,-6,0,3,-6,-5,0,3,-6,-4,0,3,-6,-3,0,3,-6,-2,0,3,-6,-1,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-6,5,0,3,-6,6,0,3,-6,7,0,3,-5,-9,0,3,-5,-8,0,3,-5,-7,0,3,-5,-6,0,3,-5,-5,0,3,-5,-4,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,-5,4,0,3,-5,5,0,3,-5,6,0,3,-5,7,0,3,-4,-9,0,3,-4,-8,0,3,-4,-7,0,3,-4,-6,0,3,-4,-5,0,3,-4,-4,0,3,-4,-3,0,3,-4,-2,0,3,-4,-1,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-4,3,0,3,-4,4,0,3,-4,5,0,3,-4,6,0,3,-4,7,0,3,-3,-9,0,3,-3,-8,0,3,-3,-7,0,3,-3,-6,0,3,-3,5,0,3,-3,6,0,3,-3,7,0,3,-2,-9,0,3,-2,-8,0,3,-2,-7,0,3,-2,-6,0,3,-2,5,0,3,-2,6,0,3,-2,7,0,3,-1,-9,0,3,-1,-8,0,3,-1,-7,0,3,-1,-6,0,3,-1,5,0,3,-1,6,0,3,-1,7,0,3,8,-9,0,3,8,-8,0,3,8,-7,0,3,8,-6,0,3,8,5,0,3,8,6,0,3,8,7,0,3,9,-9,0,3,9,-8,0,3,9,-7,0,3,9,-6,0,3,9,5,0,3,9,6,0,3,9,7,0,3,10,-9,0,3,10,-8,0,3,10,-7,0,3,10,-6,0,3,10,5,0,3,10,6,0,3,10,7,0,3,11,-9,0,3,11,-8,0,3,11,-7,0,3,11,-6,0,3,11,-5,0,3,11,-4,0,3,11,-3,0,3,11,-2,0,3,11,-1,0,3,11,0,0,3,11,1,0,3,11,2,0,3,11,3,0,3,11,4,0,3,11,5,0,3,11,6,0,3,11,7,0,3,12,-9,0,3,12,-8,0,3,12,-7,0,3,12,-6,0,3,12,-5,0,3,12,-4,0,3,12,-3,0,3,12,-2,0,3,12,-1,0,3,12,0,0,3,12,1,0,3,12,2,0,3,12,3,0,3,12,4,0,3,12,5,0,3,12,6,0,3,12,7,0,3,13,-9,0,3,13,-8,0,3,13,-7,0,3,13,-6,0,3,13,-5,0,3,13,-4,0,3,13,-3,0,3,13,-2,0,3,13,-1,0,3,13,0,0,3,13,1,0,3,13,2,0,3,13,3,0,3,13,4,0,3,13,5,0,3,13,6,0,3,13,7,0,3,14,-9,0,3,14,-8,0,3,14,-7,0,3,14,-6,0,3,14,-5,0,3,14,-4,0,3,14,-3,0,3,14,-2,0,3,14,-1,0,3,14,0,0,3,14,1,0,3,14,2,0,3,14,3,0,3,14,4,0,3,14,5,0,3,14,6,0,3,14,7,0,3,15,-9,0,3,15,-8,0,3,15,-7,0,3,15,-6,0,3,15,-5,0,3,15,-4,0,3,15,-3,0,3,15,-2,0,3,15,-1,0,3,15,0,0,3,15,1,0,3,15,2,0,3,15,3,0,3,15,4,0,3,15,5,0,3,15,6,0,3,15,7,0,3],"CustomFloor1":[-6,-8,2,2,6,-6,-7,2,2,7,-7,-7,2,1,7,-7,-8,2,1,6,-5,-8,2,2,6,-5,-7,2,2,7,-4,-8,2,2,6,-4,-7,2,2,7,-3,-8,2,2,6,-3,-7,2,2,7,-2,-8,2,3,6,-2,-7,2,3,7,-2,-6,2,3,7,-3,-6,2,2,7,-2,-5,2,3,7,-3,-5,2,2,7,-2,-4,2,4,9,-3,-4,2,2,7,-2,-3,2,2,7,-3,-3,2,2,7,-4,-3,2,2,7,-4,-4,2,2,7,-3,-2,2,2,7,-4,-2,2,2,7,-3,-1,2,2,7,-4,-1,2,2,7,-3,0,2,2,7,-4,0,2,2,7,-6,-6,2,2,7,-7,-6,2,1,7,-6,-5,2,2,7,-7,-5,2,1,7,-6,-4,2,2,7,-7,-4,2,1,7,-6,-3,2,2,7,-7,-3,2,1,7,-6,-2,2,2,7,-7,-2,2,1,7,-6,-1,2,2,7,-7,-1,2,1,7,-6,0,2,2,7,-7,0,2,1,7,-6,1,2,2,7,-7,1,2,1,7,-6,2,2,2,7,-7,2,2,1,7,-6,3,2,2,7,-7,3,2,1,7,-6,4,2,2,7,-7,4,2,1,7,-6,5,2,2,7,-7,5,2,1,7,-6,6,2,2,8,-7,6,2,1,8,-5,5,2,2,7,-5,6,2,2,8,-4,5,2,2,7,-4,6,2,2,8,-3,5,2,2,7,-3,6,2,2,8,-2,5,2,3,7,-2,6,2,3,8,-2,4,2,3,7,-3,4,2,2,7,-2,3,2,4,8,-3,3,2,2,7,-2,2,2,2,7,-3,2,2,2,7,-2,1,2,2,7,-3,1,2,2,7,-2,0,2,2,7,-2,-1,2,2,7,-2,-2,2,2,7,-4,-6,2,2,7,-4,-5,2,2,7,-5,-5,2,2,7,-5,-6,2,2,7,-5,-4,2,2,7,-5,-3,2,2,7,-5,-2,2,2,7,-5,-1,2,2,7,-5,0,2,2,7,-4,1,2,2,7,-5,1,2,2,7,-4,2,2,2,7,-5,2,2,2,7,-4,3,2,2,7,-5,3,2,2,7,-4,4,2,2,7,-5,4,2,2,7,0,-4,2,2,6,0,-3,2,2,7,-1,-3,2,2,7,-1,-4,2,2,6,1,-4,2,2,6,1,-3,2,2,7,2,-4,2,2,6,2,-3,2,2,7,3,-4,2,2,6,3,-3,2,2,7,4,-4,2,2,6,4,-3,2,2,7,5,-4,2,2,6,5,-3,2,2,7,6,-4,2,2,6,6,-3,2,2,7,7,-4,2,2,6,7,-3,2,2,7,8,-4,2,2,6,8,-3,2,2,7,-1,2,2,2,7,-1,3,2,2,8,0,2,2,2,7,0,3,2,2,8,1,2,2,2,7,1,3,2,2,8,2,2,2,2,7,2,3,2,2,8,3,2,2,2,7,3,3,2,2,8,4,2,2,2,7,4,3,2,2,8,5,2,2,2,7,5,3,2,2,8,6,2,2,2,7,6,3,2,2,8,7,2,2,2,7,7,3,2,2,8,8,2,2,2,7,8,3,2,2,8,9,2,2,2,7,9,3,2,5,8,10,2,2,2,7,10,3,2,2,7,11,2,2,2,7,11,3,2,2,7,11,1,2,2,7,10,1,2,2,7,11,0,2,2,7,10,0,2,2,7,9,1,2,2,7,9,0,2,2,7,10,-1,2,2,7,9,-1,2,2,7,10,-2,2,2,7,9,-2,2,2,7,8,-1,2,2,7,8,-2,2,2,7,7,-1,2,2,7,7,-2,2,2,7,6,-1,2,2,7,6,-2,2,2,7,5,-1,2,2,7,5,-2,2,2,7,4,-1,2,2,7,4,-2,2,2,7,3,-1,2,2,7,3,-2,2,2,7,2,-1,2,2,7,2,-2,2,2,7,1,-1,2,2,7,1,-2,2,2,7,0,-1,2,2,7,0,-2,2,2,7,-1,-1,2,2,7,-1,-2,2,2,7,-1,0,2,2,7,-1,1,2,2,7,0,1,2,2,7,1,1,2,2,7,2,1,2,2,7,3,1,2,2,7,4,1,2,2,7,5,1,2,2,7,6,1,2,2,7,7,1,2,2,7,7,0,2,2,7,6,0,2,2,7,5,0,2,2,7,4,0,2,2,7,3,0,2,2,7,2,0,2,2,7,1,0,2,2,7,0,0,2,2,7,8,0,2,2,7,8,1,2,2,7,10,4,2,2,7,9,4,2,1,7,10,5,2,2,7,9,5,2,1,7,10,6,2,2,8,9,6,2,1,8,11,5,2,2,7,11,6,2,2,8,12,5,2,2,7,12,6,2,2,8,13,5,2,2,7,13,6,2,2,8,14,5,2,3,7,14,6,2,3,8,14,4,2,3,7,13,4,2,2,7,14,3,2,3,7,13,3,2,2,7,14,2,2,3,7,13,2,2,2,7,14,1,2,3,7,13,1,2,2,7,14,0,2,3,7,13,0,2,2,7,14,-1,2,3,7,14,-2,2,3,7,14,-3,2,3,7,14,-4,2,3,7,14,-5,2,3,7,14,-6,2,3,7,14,-7,2,3,7,13,-1,2,2,7,13,-2,2,2,7,13,-3,2,2,7,13,-4,2,2,7,13,-5,2,2,7,13,-6,2,2,7,13,-7,2,2,7,12,4,2,2,7,12,3,2,2,7,12,2,2,2,7,12,1,2,2,7,12,0,2,2,7,12,-1,2,2,7,12,-2,2,2,7,12,-3,2,2,7,12,-4,2,2,7,12,-5,2,2,7,12,-6,2,2,7,12,-7,2,2,7,11,4,2,2,7,11,-1,2,2,7,11,-2,2,2,7,11,-3,2,2,7,11,-4,2,2,7,11,-5,2,2,7,11,-6,2,2,7,11,-7,2,2,7,10,-3,2,2,7,10,-4,2,2,7,10,-5,2,2,7,10,-6,2,2,7,10,-7,2,2,7,9,-3,2,2,7,9,-4,2,5,9,9,-5,2,1,7,9,-6,2,1,7,9,-7,2,1,7,14,-8,2,3,6,13,-8,2,2,6,12,-8,2,2,6,11,-8,2,2,6,10,-8,2,2,6,9,-8,2,1,6],"CustomFloor2":[-5,-1,1,12,4,-4,-1,1,13,4,-2,1,1,14,6,11,3,1,13,6,12,-5,1,13,5,-6,-7,1,8,11,8,0,1,6,14,8,1,1,6,15,9,1,1,7,15,10,1,1,8,15,10,0,1,8,14,9,0,1,7,14,2,-3,1,6,14,2,-2,1,6,15,3,-2,1,7,15,4,-2,1,8,15,4,-3,1,8,14,3,-3,1,7,14,10,-3,1,7,12,10,-2,1,7,13,11,-2,1,8,13,11,-3,1,8,12],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png new file mode 100644 index 0000000..7f7b4b5 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png.import new file mode 100644 index 0000000..dba2a30 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8mo2r2lt12sx" +path="res://.godot/imported/Preview.png-b0ff3b32424b16028ed7b4659c78de50.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle4/Preview.png" +dest_files=["res://.godot/imported/Preview.png-b0ff3b32424b16028ed7b4659c78de50.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/tileMaps/Test1/battle/Battle4/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/RoomInfo.json new file mode 100644 index 0000000..c9960e1 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-13,"Y":-26},"Size":{"X":36,"Y":33},"DoorAreaInfos":[{"Direction":1,"Start":0,"End":448},{"Direction":2,"Start":0,"End":512},{"Direction":0,"Start":0,"End":448},{"Direction":3,"Start":0,"End":512}],"GroupName":"Test1","RoomType":1,"RoomName":"Battle4","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/TileInfo.json new file mode 100644 index 0000000..81d2236 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle4/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":278,"Y":-218},{"X":278,"Y":-302},{"X":330,"Y":-362},{"X":330,"Y":82},{"X":-170,"Y":-362},{"X":186,"Y":-302},{"X":278,"Y":6},{"X":-170,"Y":82},{"X":186,"Y":6},{"X":-10,"Y":6},{"X":186,"Y":-78},{"X":-102,"Y":6},{"X":-102,"Y":-78},{"X":-10,"Y":-78},{"X":186,"Y":-218},{"X":-10,"Y":-218},{"X":-10,"Y":-302},{"X":-102,"Y":-302},{"X":-102,"Y":-218},{"X":278,"Y":-78}],"NavigationPolygon":[[0,1,2,3],[4,2,1,5],[6,3,7,8],[8,7,9,10],[11,9,7],[11,7,4,12],[10,9,13],[5,14,15,16],[4,5,16],[4,16,17],[4,17,18],[12,4,18],[13,12,18,15],[10,13,15,14],[19,10,14,0],[19,0,3],[19,3,6]],"Floor":[-11,-23,0,3,-11,-22,0,3,-11,-21,0,3,-11,-20,0,3,-11,-19,0,3,-11,-18,0,3,-11,-17,0,3,-11,-16,0,3,-11,-15,0,3,-11,-14,0,3,-11,-13,0,3,-11,-12,0,3,-11,-11,0,3,-11,-10,0,3,-11,-9,0,3,-11,-8,0,3,-11,-7,0,3,-11,-6,0,3,-11,-5,0,3,-11,-4,0,3,-11,-3,0,3,-11,-2,0,3,-11,-1,0,3,-11,0,0,3,-11,1,0,3,-11,2,0,3,-11,3,0,3,-11,4,0,3,-10,-23,0,3,-10,-22,0,3,-10,-21,0,3,-10,-20,0,3,-10,-19,0,3,-10,-18,0,3,-10,-17,0,3,-10,-16,0,3,-10,-15,0,3,-10,-14,0,3,-10,-13,0,3,-10,-12,0,3,-10,-11,0,3,-10,-10,0,3,-10,-9,0,3,-10,-8,0,3,-10,-7,0,3,-10,-6,0,3,-10,-5,0,3,-10,-4,0,3,-10,-3,0,3,-10,-2,0,3,-10,-1,0,3,-10,0,0,3,-10,1,0,3,-10,2,0,3,-10,3,0,3,-10,4,0,3,-9,-23,0,3,-9,-22,0,3,-9,-21,0,3,-9,-20,0,3,-9,-19,0,3,-9,-18,0,3,-9,-17,0,3,-9,-16,0,3,-9,-15,0,3,-9,-14,0,3,-9,-13,0,3,-9,-12,0,3,-9,-11,0,3,-9,-10,0,3,-9,-9,0,3,-9,-8,0,3,-9,-7,0,3,-9,-6,0,3,-9,-5,0,3,-9,-4,0,3,-9,-3,0,3,-9,-2,0,3,-9,-1,0,3,-9,0,0,3,-9,1,0,3,-9,2,0,3,-9,3,0,3,-9,4,0,3,-8,-23,0,3,-8,-22,0,3,-8,-21,0,3,-8,-20,0,3,-8,-19,0,3,-8,-18,0,3,-8,-17,0,3,-8,-16,0,3,-8,-15,0,3,-8,-14,0,3,-8,-13,0,3,-8,-12,0,3,-8,-11,0,3,-8,-10,0,3,-8,-9,0,3,-8,-8,0,3,-8,-7,0,3,-8,-6,0,3,-8,-5,0,3,-8,-4,0,3,-8,-3,0,3,-8,-2,0,3,-8,-1,0,3,-8,0,0,3,-8,1,0,3,-8,2,0,3,-8,3,0,3,-8,4,0,3,-7,-23,0,3,-7,-22,0,3,-7,-21,0,3,-7,-20,0,3,-7,-19,0,3,-7,-18,0,3,-7,-17,0,3,-7,-16,0,3,-7,-15,0,3,-7,-14,0,3,-7,-13,0,3,-7,-12,0,3,-7,-11,0,3,-7,-10,0,3,-7,-9,0,3,-7,-8,0,3,-7,-7,0,3,-7,-6,0,3,-7,-5,0,3,-7,-4,0,3,-7,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-7,4,0,3,-6,-23,0,3,-6,-22,0,3,-6,-21,0,3,-6,-20,0,3,-6,-14,0,3,-6,-13,0,3,-6,-12,0,3,-6,-11,0,3,-6,-10,0,3,-6,-9,0,3,-6,-8,0,3,-6,-7,0,3,-6,-6,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-5,-23,0,3,-5,-22,0,3,-5,-21,0,3,-5,-20,0,3,-5,-14,0,3,-5,-13,0,3,-5,-12,0,3,-5,-11,0,3,-5,-10,0,3,-5,-9,0,3,-5,-8,0,3,-5,-7,0,3,-5,-6,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,-5,4,0,3,-4,-23,0,3,-4,-22,0,3,-4,-21,0,3,-4,-20,0,3,-4,-14,0,3,-4,-13,0,3,-4,-12,0,3,-4,-11,0,3,-4,-10,0,3,-4,-9,0,3,-4,-8,0,3,-4,-7,0,3,-4,-6,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-4,3,0,3,-4,4,0,3,-3,-23,0,3,-3,-22,0,3,-3,-21,0,3,-3,-20,0,3,-3,-14,0,3,-3,-13,0,3,-3,-12,0,3,-3,-11,0,3,-3,-10,0,3,-3,-9,0,3,-3,-8,0,3,-3,-7,0,3,-3,-6,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-3,3,0,3,-3,4,0,3,-2,-23,0,3,-2,-22,0,3,-2,-21,0,3,-2,-20,0,3,-2,-14,0,3,-2,-13,0,3,-2,-12,0,3,-2,-11,0,3,-2,-10,0,3,-2,-9,0,3,-2,-8,0,3,-2,-7,0,3,-2,-6,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-2,4,0,3,-1,-23,0,3,-1,-22,0,3,-1,-21,0,3,-1,-20,0,3,-1,-19,0,3,-1,-18,0,3,-1,-17,0,3,-1,-16,0,3,-1,-15,0,3,-1,-14,0,3,-1,-13,0,3,-1,-12,0,3,-1,-11,0,3,-1,-10,0,3,-1,-9,0,3,-1,-8,0,3,-1,-7,0,3,-1,-6,0,3,-1,-5,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,-1,3,0,3,-1,4,0,3,0,-23,0,3,0,-22,0,3,0,-21,0,3,0,-20,0,3,0,-19,0,3,0,-18,0,3,0,-17,0,3,0,-16,0,3,0,-15,0,3,0,-14,0,3,0,-13,0,3,0,-12,0,3,0,-11,0,3,0,-10,0,3,0,-9,0,3,0,-8,0,3,0,-7,0,3,0,-6,0,3,0,-5,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,0,3,0,3,0,4,0,3,1,-23,0,3,1,-22,0,3,1,-21,0,3,1,-20,0,3,1,-19,0,3,1,-18,0,3,1,-17,0,3,1,-16,0,3,1,-15,0,3,1,-14,0,3,1,-13,0,3,1,-12,0,3,1,-11,0,3,1,-10,0,3,1,-9,0,3,1,-8,0,3,1,-7,0,3,1,-6,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,1,3,0,3,1,4,0,3,2,-23,0,3,2,-22,0,3,2,-21,0,3,2,-20,0,3,2,-19,0,3,2,-18,0,3,2,-17,0,3,2,-16,0,3,2,-15,0,3,2,-14,0,3,2,-13,0,3,2,-12,0,3,2,-11,0,3,2,-10,0,3,2,-9,0,3,2,-8,0,3,2,-7,0,3,2,-6,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,2,3,0,3,2,4,0,3,3,-23,0,3,3,-22,0,3,3,-21,0,3,3,-20,0,3,3,-19,0,3,3,-18,0,3,3,-17,0,3,3,-16,0,3,3,-15,0,3,3,-14,0,3,3,-13,0,3,3,-12,0,3,3,-11,0,3,3,-10,0,3,3,-9,0,3,3,-8,0,3,3,-7,0,3,3,-6,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,3,3,0,3,3,4,0,3,4,-23,0,3,4,-22,0,3,4,-21,0,3,4,-20,0,3,4,-19,0,3,4,-18,0,3,4,-17,0,3,4,-16,0,3,4,-15,0,3,4,-14,0,3,4,-13,0,3,4,-12,0,3,4,-11,0,3,4,-10,0,3,4,-9,0,3,4,-8,0,3,4,-7,0,3,4,-6,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,5,-23,0,3,5,-22,0,3,5,-21,0,3,5,-20,0,3,5,-19,0,3,5,-18,0,3,5,-17,0,3,5,-16,0,3,5,-15,0,3,5,-14,0,3,5,-13,0,3,5,-12,0,3,5,-11,0,3,5,-10,0,3,5,-9,0,3,5,-8,0,3,5,-7,0,3,5,-6,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,5,3,0,3,5,4,0,3,6,-23,0,3,6,-22,0,3,6,-21,0,3,6,-20,0,3,6,-19,0,3,6,-18,0,3,6,-17,0,3,6,-16,0,3,6,-15,0,3,6,-14,0,3,6,-13,0,3,6,-12,0,3,6,-11,0,3,6,-10,0,3,6,-9,0,3,6,-8,0,3,6,-7,0,3,6,-6,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,6,3,0,3,6,4,0,3,7,-23,0,3,7,-22,0,3,7,-21,0,3,7,-20,0,3,7,-19,0,3,7,-18,0,3,7,-17,0,3,7,-16,0,3,7,-15,0,3,7,-14,0,3,7,-13,0,3,7,-12,0,3,7,-11,0,3,7,-10,0,3,7,-9,0,3,7,-8,0,3,7,-7,0,3,7,-6,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,7,-1,0,3,7,0,0,3,7,1,0,3,7,2,0,3,7,3,0,3,7,4,0,3,8,-23,0,3,8,-22,0,3,8,-21,0,3,8,-20,0,3,8,-19,0,3,8,-18,0,3,8,-17,0,3,8,-16,0,3,8,-15,0,3,8,-14,0,3,8,-13,0,3,8,-12,0,3,8,-11,0,3,8,-10,0,3,8,-9,0,3,8,-8,0,3,8,-7,0,3,8,-6,0,3,8,-5,0,3,8,-4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,8,3,0,3,8,4,0,3,9,-23,0,3,9,-22,0,3,9,-21,0,3,9,-20,0,3,9,-19,0,3,9,-18,0,3,9,-17,0,3,9,-16,0,3,9,-15,0,3,9,-14,0,3,9,-13,0,3,9,-12,0,3,9,-11,0,3,9,-10,0,3,9,-9,0,3,9,-8,0,3,9,-7,0,3,9,-6,0,3,9,-5,0,3,9,-4,0,3,9,-3,0,3,9,-2,0,3,9,-1,0,3,9,0,0,3,9,1,0,3,9,2,0,3,9,3,0,3,9,4,0,3,10,-23,0,3,10,-22,0,3,10,-21,0,3,10,-20,0,3,10,-19,0,3,10,-18,0,3,10,-17,0,3,10,-16,0,3,10,-15,0,3,10,-14,0,3,10,-13,0,3,10,-12,0,3,10,-11,0,3,10,-10,0,3,10,-9,0,3,10,-8,0,3,10,-7,0,3,10,-6,0,3,10,-5,0,3,10,-4,0,3,10,-3,0,3,10,-2,0,3,10,-1,0,3,10,0,0,3,10,1,0,3,10,2,0,3,10,3,0,3,10,4,0,3,11,-23,0,3,11,-22,0,3,11,-21,0,3,11,-20,0,3,11,-19,0,3,11,-18,0,3,11,-17,0,3,11,-16,0,3,11,-15,0,3,11,-14,0,3,11,-13,0,3,11,-12,0,3,11,-11,0,3,11,-10,0,3,11,-9,0,3,11,-8,0,3,11,-7,0,3,11,-6,0,3,11,-5,0,3,11,-4,0,3,11,-3,0,3,11,-2,0,3,11,-1,0,3,11,0,0,3,11,1,0,3,11,2,0,3,11,3,0,3,11,4,0,3,12,-23,0,3,12,-22,0,3,12,-21,0,3,12,-20,0,3,12,-14,0,3,12,-13,0,3,12,-12,0,3,12,-11,0,3,12,-10,0,3,12,-9,0,3,12,-8,0,3,12,-7,0,3,12,-6,0,3,12,0,0,3,12,1,0,3,12,2,0,3,12,3,0,3,12,4,0,3,13,-23,0,3,13,-22,0,3,13,-21,0,3,13,-20,0,3,13,-14,0,3,13,-13,0,3,13,-12,0,3,13,-11,0,3,13,-10,0,3,13,-9,0,3,13,-8,0,3,13,-7,0,3,13,-6,0,3,13,0,0,3,13,1,0,3,13,2,0,3,13,3,0,3,13,4,0,3,14,-23,0,3,14,-22,0,3,14,-21,0,3,14,-20,0,3,14,-14,0,3,14,-13,0,3,14,-12,0,3,14,-11,0,3,14,-10,0,3,14,-9,0,3,14,-8,0,3,14,-7,0,3,14,-6,0,3,14,0,0,3,14,1,0,3,14,2,0,3,14,3,0,3,14,4,0,3,15,-23,0,3,15,-22,0,3,15,-21,0,3,15,-20,0,3,15,-14,0,3,15,-13,0,3,15,-12,0,3,15,-11,0,3,15,-10,0,3,15,-9,0,3,15,-8,0,3,15,-7,0,3,15,-6,0,3,15,0,0,3,15,1,0,3,15,2,0,3,15,3,0,3,15,4,0,3,16,-23,0,3,16,-22,0,3,16,-21,0,3,16,-20,0,3,16,-14,0,3,16,-13,0,3,16,-12,0,3,16,-11,0,3,16,-10,0,3,16,-9,0,3,16,-8,0,3,16,-7,0,3,16,-6,0,3,16,0,0,3,16,1,0,3,16,2,0,3,16,3,0,3,16,4,0,3,17,-23,0,3,17,-22,0,3,17,-21,0,3,17,-20,0,3,17,-19,0,3,17,-18,0,3,17,-17,0,3,17,-16,0,3,17,-15,0,3,17,-14,0,3,17,-13,0,3,17,-12,0,3,17,-11,0,3,17,-10,0,3,17,-9,0,3,17,-8,0,3,17,-7,0,3,17,-6,0,3,17,-5,0,3,17,-4,0,3,17,-3,0,3,17,-2,0,3,17,-1,0,3,17,0,0,3,17,1,0,3,17,2,0,3,17,3,0,3,17,4,0,3,18,-23,0,3,18,-22,0,3,18,-21,0,3,18,-20,0,3,18,-19,0,3,18,-18,0,3,18,-17,0,3,18,-16,0,3,18,-15,0,3,18,-14,0,3,18,-13,0,3,18,-12,0,3,18,-11,0,3,18,-10,0,3,18,-9,0,3,18,-8,0,3,18,-7,0,3,18,-6,0,3,18,-5,0,3,18,-4,0,3,18,-3,0,3,18,-2,0,3,18,-1,0,3,18,0,0,3,18,1,0,3,18,2,0,3,18,3,0,3,18,4,0,3,19,-23,0,3,19,-22,0,3,19,-21,0,3,19,-20,0,3,19,-19,0,3,19,-18,0,3,19,-17,0,3,19,-16,0,3,19,-15,0,3,19,-14,0,3,19,-13,0,3,19,-12,0,3,19,-11,0,3,19,-10,0,3,19,-9,0,3,19,-8,0,3,19,-7,0,3,19,-6,0,3,19,-5,0,3,19,-4,0,3,19,-3,0,3,19,-2,0,3,19,-1,0,3,19,0,0,3,19,1,0,3,19,2,0,3,19,3,0,3,19,4,0,3,20,-23,0,3,20,-22,0,3,20,-21,0,3,20,-20,0,3,20,-19,0,3,20,-18,0,3,20,-17,0,3,20,-16,0,3,20,-15,0,3,20,-14,0,3,20,-13,0,3,20,-12,0,3,20,-11,0,3,20,-10,0,3,20,-9,0,3,20,-8,0,3,20,-7,0,3,20,-6,0,3,20,-5,0,3,20,-4,0,3,20,-3,0,3,20,-2,0,3,20,-1,0,3,20,0,0,3,20,1,0,3,20,2,0,3,20,3,0,3,20,4,0,3],"Middle":[-11,-26,63,1,-11,-25,2,2,-11,-24,6,2,-10,-26,63,1,-10,-25,2,2,-10,-24,6,2,-9,-26,63,1,-9,-25,2,2,-9,-24,6,2,-8,-26,63,1,-8,-25,2,2,-8,-24,6,2,-7,-26,63,1,-7,-25,2,2,-7,-24,6,2,-6,-26,63,1,-6,-25,2,2,-6,-24,6,2,-6,-17,54,1,-6,-16,1,2,-6,-15,5,2,-6,-3,54,1,-6,-2,1,2,-6,-1,5,2,-5,-26,63,1,-5,-25,2,2,-5,-24,6,2,-5,-17,63,1,-5,-16,2,2,-5,-15,6,2,-5,-3,63,1,-5,-2,2,2,-5,-1,6,2,-4,-26,63,1,-4,-25,2,2,-4,-24,6,2,-4,-17,63,1,-4,-16,2,2,-4,-15,6,2,-4,-3,63,1,-4,-2,2,2,-4,-1,6,2,-3,-26,63,1,-3,-25,2,2,-3,-24,6,2,-3,-17,63,1,-3,-16,2,2,-3,-15,6,2,-3,-3,63,1,-3,-2,2,2,-3,-1,6,2,-2,-26,63,1,-2,-25,2,2,-2,-24,6,2,-2,-17,27,1,-2,-16,3,2,-2,-15,7,2,-2,-3,27,1,-2,-2,3,2,-2,-1,7,2,-1,-26,63,1,-1,-25,2,2,-1,-24,6,2,0,-26,63,1,0,-25,2,2,0,-24,6,2,1,-26,63,1,1,-25,2,2,1,-24,6,2,2,-26,63,1,2,-25,2,2,2,-24,6,2,3,-26,63,1,3,-25,2,2,3,-24,6,2,4,-26,63,1,4,-25,2,2,4,-24,6,2,5,-26,63,1,5,-25,2,2,5,-24,6,2,6,-26,63,1,6,-25,2,2,6,-24,6,2,7,-26,63,1,7,-25,2,2,7,-24,6,2,8,-26,63,1,8,-25,2,2,8,-24,6,2,9,-26,63,1,9,-25,2,2,9,-24,6,2,10,-26,63,1,10,-25,2,2,10,-24,6,2,11,-26,63,1,11,-25,2,2,11,-24,6,2,12,-26,63,1,12,-25,2,2,12,-24,6,2,12,-17,54,1,12,-16,1,2,12,-15,5,2,12,-3,54,1,12,-2,1,2,12,-1,5,2,13,-26,63,1,13,-25,2,2,13,-24,6,2,13,-17,63,1,13,-16,2,2,13,-15,6,2,13,-3,63,1,13,-2,2,2,13,-1,6,2,14,-26,63,1,14,-25,2,2,14,-24,6,2,14,-17,63,1,14,-16,2,2,14,-15,6,2,14,-3,63,1,14,-2,2,2,14,-1,6,2,15,-26,63,1,15,-25,2,2,15,-24,6,2,15,-17,63,1,15,-16,2,2,15,-15,6,2,15,-3,63,1,15,-2,2,2,15,-1,6,2,16,-26,63,1,16,-25,2,2,16,-24,6,2,16,-17,27,1,16,-16,3,2,16,-15,7,2,16,-3,27,1,16,-2,3,2,16,-1,7,2,17,-26,63,1,17,-25,2,2,17,-24,6,2,18,-26,63,1,18,-25,2,2,18,-24,6,2,19,-26,63,1,19,-25,2,2,19,-24,6,2,20,-26,63,1,20,-25,2,2,20,-24,6,2],"Top":[-13,-27,511,1,-13,-26,511,1,-13,-25,511,1,-13,-24,511,1,-13,-23,511,1,-13,-22,511,1,-13,-21,511,1,-13,-20,511,1,-13,-19,511,1,-13,-18,511,1,-13,-17,511,1,-13,-16,511,1,-13,-15,511,1,-13,-14,511,1,-13,-13,511,1,-13,-12,511,1,-13,-11,511,1,-13,-10,511,1,-13,-9,511,1,-13,-8,511,1,-13,-7,511,1,-13,-6,511,1,-13,-5,511,1,-13,-4,511,1,-13,-3,511,1,-13,-2,511,1,-13,-1,511,1,-13,0,511,1,-13,1,511,1,-13,2,511,1,-13,3,511,1,-13,4,511,1,-13,5,511,1,-13,6,511,1,-12,-27,511,1,-12,-26,255,1,-12,-25,219,1,-12,-24,219,1,-12,-23,219,1,-12,-22,219,1,-12,-21,219,1,-12,-20,219,1,-12,-19,219,1,-12,-18,219,1,-12,-17,219,1,-12,-16,219,1,-12,-15,219,1,-12,-14,219,1,-12,-13,219,1,-12,-12,219,1,-12,-11,219,1,-12,-10,219,1,-12,-9,219,1,-12,-8,219,1,-12,-7,219,1,-12,-6,219,1,-12,-5,219,1,-12,-4,219,1,-12,-3,219,1,-12,-2,219,1,-12,-1,219,1,-12,0,219,1,-12,1,219,1,-12,2,219,1,-12,3,219,1,-12,4,219,1,-12,5,507,1,-12,6,511,1,-11,-27,511,1,-11,5,504,1,-11,6,511,1,-10,-27,511,1,-10,5,504,1,-10,6,511,1,-9,-27,511,1,-9,5,504,1,-9,6,511,1,-8,-27,511,1,-8,5,504,1,-8,6,511,1,-7,-27,511,1,-7,5,504,1,-7,6,511,1,-6,-27,511,1,-6,-19,432,1,-6,-18,438,1,-6,-5,432,1,-6,-4,438,1,-6,5,504,1,-6,6,511,1,-5,-27,511,1,-5,-19,504,1,-5,-18,511,1,-5,-5,504,1,-5,-4,511,1,-5,5,504,1,-5,6,511,1,-4,-27,511,1,-4,-19,504,1,-4,-18,511,1,-4,-5,504,1,-4,-4,511,1,-4,5,504,1,-4,6,511,1,-3,-27,511,1,-3,-19,504,1,-3,-18,511,1,-3,-5,504,1,-3,-4,511,1,-3,5,504,1,-3,6,511,1,-2,-27,511,1,-2,-19,216,1,-2,-18,219,1,-2,-5,216,1,-2,-4,219,1,-2,5,504,1,-2,6,511,1,-1,-27,511,1,-1,5,504,1,-1,6,511,1,0,-27,511,1,0,5,504,1,0,6,511,1,1,-27,511,1,1,5,504,1,1,6,511,1,2,-27,511,1,2,5,504,1,2,6,511,1,3,-27,511,1,3,5,504,1,3,6,511,1,4,-27,511,1,4,5,504,1,4,6,511,1,5,-27,511,1,5,5,504,1,5,6,511,1,6,-27,511,1,6,5,504,1,6,6,511,1,7,-27,511,1,7,5,504,1,7,6,511,1,8,-27,511,1,8,5,504,1,8,6,511,1,9,-27,511,1,9,5,504,1,9,6,511,1,10,-27,511,1,10,5,504,1,10,6,511,1,11,-27,511,1,11,5,504,1,11,6,511,1,12,-27,511,1,12,-19,432,1,12,-18,438,1,12,-5,432,1,12,-4,438,1,12,5,504,1,12,6,511,1,13,-27,511,1,13,-19,504,1,13,-18,511,1,13,-5,504,1,13,-4,511,1,13,5,504,1,13,6,511,1,14,-27,511,1,14,-19,504,1,14,-18,511,1,14,-5,504,1,14,-4,511,1,14,5,504,1,14,6,511,1,15,-27,511,1,15,-19,504,1,15,-18,511,1,15,-5,504,1,15,-4,511,1,15,5,504,1,15,6,511,1,16,-27,511,1,16,-19,216,1,16,-18,219,1,16,-5,216,1,16,-4,219,1,16,5,504,1,16,6,511,1,17,-27,511,1,17,5,504,1,17,6,511,1,18,-27,511,1,18,5,504,1,18,6,511,1,19,-27,511,1,19,5,504,1,19,6,511,1,20,-27,511,1,20,5,504,1,20,6,511,1,21,-27,511,1,21,-26,447,1,21,-25,438,1,21,-24,438,1,21,-23,438,1,21,-22,438,1,21,-21,438,1,21,-20,438,1,21,-19,438,1,21,-18,438,1,21,-17,438,1,21,-16,438,1,21,-15,438,1,21,-14,438,1,21,-13,438,1,21,-12,438,1,21,-11,438,1,21,-10,438,1,21,-9,438,1,21,-8,438,1,21,-7,438,1,21,-6,438,1,21,-5,438,1,21,-4,438,1,21,-3,438,1,21,-2,438,1,21,-1,438,1,21,0,438,1,21,1,438,1,21,2,438,1,21,3,438,1,21,4,438,1,21,5,510,1,21,6,511,1,22,-27,511,1,22,-26,511,1,22,-25,511,1,22,-24,511,1,22,-23,511,1,22,-22,511,1,22,-21,511,1,22,-20,511,1,22,-19,511,1,22,-18,511,1,22,-17,511,1,22,-16,511,1,22,-15,511,1,22,-14,511,1,22,-13,511,1,22,-12,511,1,22,-11,511,1,22,-10,511,1,22,-9,511,1,22,-8,511,1,22,-7,511,1,22,-6,511,1,22,-5,511,1,22,-4,511,1,22,-3,511,1,22,-2,511,1,22,-1,511,1,22,0,511,1,22,1,511,1,22,2,511,1,22,3,511,1,22,4,511,1,22,5,511,1,22,6,511,1],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png new file mode 100644 index 0000000..d47180e --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png.import new file mode 100644 index 0000000..338aee7 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brikrxahc8h8p" +path="res://.godot/imported/Preview.png-1cb30b87cf71ad1cb9553eeb340968d5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle5/Preview.png" +dest_files=["res://.godot/imported/Preview.png-1cb30b87cf71ad1cb9553eeb340968d5.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/tileMaps/Test1/battle/Battle5/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/RoomInfo.json new file mode 100644 index 0000000..b592355 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-10,"Y":-18},"Size":{"X":21,"Y":24},"DoorAreaInfos":[{"Direction":2,"Start":0,"End":64},{"Direction":2,"Start":128,"End":272},{"Direction":0,"Start":192,"End":288},{"Direction":1,"Start":0,"End":288},{"Direction":3,"Start":0,"End":144}],"GroupName":"Test1","RoomType":1,"RoomName":"Battle5","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/TileInfo.json new file mode 100644 index 0000000..37b48eb --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle5/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":10,"Y":-186},{"X":42,"Y":-186},{"X":42,"Y":-154},{"X":-26,"Y":-78},{"X":-70,"Y":-78},{"X":74,"Y":-154},{"X":74,"Y":-106},{"X":6,"Y":-14},{"X":-26,"Y":-14},{"X":106,"Y":-106},{"X":106,"Y":-74},{"X":122,"Y":-74},{"X":122,"Y":-42},{"X":6,"Y":66},{"X":138,"Y":-42},{"X":138,"Y":66},{"X":-70,"Y":66},{"X":-122,"Y":66},{"X":-122,"Y":-234},{"X":10,"Y":-234}],"NavigationPolygon":[[0,1,2,3,4],[3,2,5,6,7,8],[6,9,10,7],[7,10,11,12,13],[12,14,15,13],[4,16,17,18],[4,18,19,0]],"Floor":[-8,-15,0,3,-8,-14,0,3,-8,-13,0,3,-8,-12,0,3,-8,-11,0,3,-8,-10,0,3,-7,-15,0,3,-7,-14,0,3,-7,-13,0,3,-7,-12,0,3,-7,-11,0,3,-7,-10,0,3,-6,-15,0,3,-6,-14,0,3,-6,-13,0,3,-6,-12,0,3,-6,-11,0,3,-6,-10,0,3,-5,-15,0,3,-5,-14,0,3,-5,-13,0,3,-5,-12,0,3,-5,-11,0,3,-5,-10,0,3,-4,-15,0,3,-4,-14,0,3,-4,-13,0,3,-4,-12,0,3,-4,-11,0,3,-4,-10,0,3,-4,-9,0,3,-4,-8,0,3,-4,-7,0,3,-4,-6,0,3,-3,-15,0,3,-3,-14,0,3,-3,-13,0,3,-3,-12,0,3,-3,-11,0,3,-3,-10,0,3,-3,-9,0,3,-3,-8,0,3,-3,-7,0,3,-3,-6,0,3,-2,-15,0,3,-2,-14,0,3,-2,-13,0,3,-2,-12,0,3,-2,-11,0,3,-2,-10,0,3,-2,-9,0,3,-2,-8,0,3,-2,-7,0,3,-2,-6,0,3,-2,-5,0,3,-2,-4,0,3,-2,-3,0,3,-2,-2,0,3,-1,-15,0,3,-1,-14,0,3,-1,-13,0,3,-1,-12,0,3,-1,-11,0,3,-1,-10,0,3,-1,-9,0,3,-1,-8,0,3,-1,-7,0,3,-1,-6,0,3,-1,-5,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,0,-15,0,3,0,-14,0,3,0,-13,0,3,0,-12,0,3,0,-11,0,3,0,-10,0,3,0,-9,0,3,0,-8,0,3,0,-7,0,3,0,-6,0,3,0,-5,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,1,-12,0,3,1,-11,0,3,1,-10,0,3,1,-9,0,3,1,-8,0,3,1,-7,0,3,1,-6,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,2,-12,0,3,2,-11,0,3,2,-10,0,3,2,-9,0,3,2,-8,0,3,2,-7,0,3,2,-6,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,3,-10,0,3,3,-9,0,3,3,-8,0,3,3,-7,0,3,3,-6,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,4,-10,0,3,4,-9,0,3,4,-8,0,3,4,-7,0,3,4,-6,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,5,-7,0,3,5,-6,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,6,-7,0,3,6,-6,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,7,-1,0,3,7,0,0,3,7,1,0,3,7,2,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,-8,-9,0,3,-8,-8,0,3,-8,-7,0,3,-8,-6,0,3,-8,-5,0,3,-8,-4,0,3,-8,-3,0,3,-8,-2,0,3,-8,-1,0,3,-8,0,0,3,-8,1,0,3,-8,2,0,3,-8,3,0,3,-7,-9,0,3,-7,-8,0,3,-7,-7,0,3,-7,-6,0,3,-7,-5,0,3,-7,-4,0,3,-7,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-6,-9,0,3,-6,-8,0,3,-6,-7,0,3,-6,-6,0,3,-6,-5,0,3,-6,-4,0,3,-6,-3,0,3,-6,-2,0,3,-6,-1,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-5,-9,0,3,-5,-8,0,3,-5,-7,0,3,-5,-6,0,3,-5,-5,0,3,-5,-4,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,0,3,0,3,1,3,0,3,2,3,0,3,3,3,0,3,4,3,0,3,5,3,0,3,6,3,0,3,7,3,0,3,8,3,0,3],"Middle":[-8,-18,63,1,-8,-17,2,2,-8,-16,6,2,-7,-18,63,1,-7,-17,2,2,-7,-16,6,2,-6,-18,63,1,-6,-17,2,2,-6,-16,6,2,-5,-18,63,1,-5,-17,2,2,-5,-16,6,2,-4,-18,63,1,-4,-17,2,2,-4,-16,6,2,-3,-18,63,1,-3,-17,2,2,-3,-16,6,2,-2,-18,63,1,-2,-17,2,2,-2,-16,6,2,-1,-18,63,1,-1,-17,2,2,-1,-16,6,2,0,-18,63,1,0,-17,2,2,0,-16,6,2,1,-15,54,1,1,-14,1,2,1,-13,5,2,2,-15,63,1,2,-14,2,2,2,-13,6,2,3,-13,54,1,3,-12,1,2,3,-11,5,2,4,-13,63,1,4,-12,2,2,4,-11,6,2,5,-10,54,1,5,-9,1,2,5,-8,5,2,6,-10,63,1,6,-9,2,2,6,-8,6,2,7,-8,54,1,7,-7,1,2,7,-6,5,2,8,-6,54,1,8,-5,1,2,8,-4,5,2],"Top":[-10,-19,511,1,-10,-18,511,1,-10,-17,511,1,-10,-16,511,1,-10,-15,511,1,-10,-14,511,1,-10,-13,511,1,-10,-12,511,1,-10,-11,511,1,-10,-10,511,1,-10,-9,511,1,-10,-8,511,1,-10,-7,511,1,-10,-6,511,1,-10,-5,511,1,-10,-4,511,1,-10,-3,511,1,-10,-2,511,1,-10,-1,511,1,-10,0,511,1,-10,1,511,1,-10,2,511,1,-10,3,511,1,-10,4,511,1,-10,5,511,1,-9,-19,511,1,-9,-18,255,1,-9,-17,219,1,-9,-16,219,1,-9,-15,219,1,-9,-14,219,1,-9,-13,219,1,-9,-12,219,1,-9,-11,219,1,-9,-10,219,1,-9,-9,219,1,-9,-8,219,1,-9,-7,219,1,-9,-6,219,1,-9,-5,219,1,-9,-4,219,1,-9,-3,219,1,-9,-2,219,1,-9,-1,219,1,-9,0,219,1,-9,1,219,1,-9,2,219,1,-9,3,219,1,-9,4,507,1,-9,5,511,1,-8,-19,511,1,-8,4,504,1,-8,5,511,1,-7,-19,511,1,-7,4,504,1,-7,5,511,1,-6,-19,511,1,-6,4,504,1,-6,5,511,1,-5,-19,511,1,-5,4,504,1,-5,5,511,1,-4,-19,511,1,-4,-5,432,1,-4,-4,438,1,-4,-3,438,1,-4,-2,438,1,-4,-1,438,1,-4,0,438,1,-4,1,438,1,-4,2,438,1,-4,3,438,1,-4,4,510,1,-4,5,511,1,-3,-19,511,1,-3,-5,216,1,-3,-4,219,1,-3,-3,219,1,-3,-2,219,1,-3,-1,507,1,-3,0,511,1,-3,1,511,1,-3,2,511,1,-3,3,511,1,-3,4,511,1,-3,5,511,1,-2,-19,511,1,-2,-1,504,1,-2,0,511,1,-2,1,511,1,-2,2,511,1,-2,3,511,1,-2,4,511,1,-2,5,511,1,-1,-19,511,1,-1,-1,216,1,-1,0,219,1,-1,1,219,1,-1,2,219,1,-1,3,219,1,-1,4,507,1,-1,5,511,1,0,-19,511,1,0,4,504,1,0,5,511,1,1,-19,511,1,1,-18,447,1,1,-17,438,1,1,-16,438,1,1,4,504,1,1,5,511,1,2,-19,511,1,2,-18,511,1,2,-17,511,1,2,-16,511,1,2,4,504,1,2,5,511,1,3,-16,511,1,3,-15,447,1,3,-14,438,1,3,4,504,1,3,5,511,1,4,-16,511,1,4,-15,511,1,4,-14,511,1,4,4,504,1,4,5,511,1,5,-14,511,1,5,-13,447,1,5,-12,438,1,5,-11,438,1,5,4,504,1,5,5,511,1,6,-14,511,1,6,-13,511,1,6,-12,511,1,6,-11,511,1,6,4,504,1,6,5,511,1,7,-11,511,1,7,-10,447,1,7,-9,438,1,7,4,504,1,7,5,511,1,8,-11,511,1,8,-10,511,1,8,-9,511,1,8,-8,447,1,8,-7,438,1,8,4,504,1,8,5,511,1,9,-9,511,1,9,-8,511,1,9,-7,511,1,9,-6,447,1,9,-5,438,1,9,-4,438,1,9,-3,438,1,9,-2,438,1,9,-1,438,1,9,0,438,1,9,1,438,1,9,2,438,1,9,3,438,1,9,4,510,1,9,5,511,1,10,-7,511,1,10,-6,511,1,10,-5,511,1,10,-4,511,1,10,-3,511,1,10,-2,511,1,10,-1,511,1,10,0,511,1,10,1,511,1,10,2,511,1,10,3,511,1,10,4,511,1,10,5,511,1],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png new file mode 100644 index 0000000..aa0623d --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png.import new file mode 100644 index 0000000..63ea7e2 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqhw8cc6jtcwy" +path="res://.godot/imported/Preview.png-f56db6b1aa1f03fe38d599da6ffe5d60.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/battle/Battle6/Preview.png" +dest_files=["res://.godot/imported/Preview.png-f56db6b1aa1f03fe38d599da6ffe5d60.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/tileMaps/Test1/battle/Battle6/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/RoomInfo.json new file mode 100644 index 0000000..6d58834 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-8,"Y":-7},"Size":{"X":15,"Y":18},"DoorAreaInfos":[{"Direction":3,"Start":32,"End":176},{"Direction":0,"Start":80,"End":160},{"Direction":2,"Start":48,"End":128},{"Direction":1,"Start":96,"End":192}],"GroupName":"Test1","RoomType":1,"RoomName":"Battle6","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/TileInfo.json new file mode 100644 index 0000000..5979864 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/battle/Battle6/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":74,"Y":22},{"X":74,"Y":106},{"X":26,"Y":106},{"X":22,"Y":86},{"X":22,"Y":42},{"X":10,"Y":22},{"X":-38,"Y":42},{"X":-74,"Y":38},{"X":-58,"Y":-58},{"X":74,"Y":-58},{"X":74,"Y":-22},{"X":10,"Y":-22},{"X":-58,"Y":-42},{"X":26,"Y":154},{"X":-42,"Y":154},{"X":-42,"Y":138},{"X":-38,"Y":86},{"X":-90,"Y":138},{"X":-90,"Y":38},{"X":-74,"Y":-42}],"NavigationPolygon":[[0,1,2,3,4],[5,0,4,6,7],[8,9,10,11,12],[2,13,14,15,16,3],[15,17,18,7,6,16],[7,19,12,11,5]],"Floor":[-4,-4,0,3,-3,-4,0,3,-2,-4,0,3,-1,-4,0,3,0,-4,0,3,1,-4,0,3,2,-4,0,3,3,-4,0,3,4,-4,0,3,4,-3,0,3,3,-3,0,3,2,-3,0,3,1,-3,0,3,0,-3,0,3,-1,-3,0,3,-2,-3,0,3,-3,-3,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-4,-3,0,3,-4,-2,0,3,-4,-1,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,5,0,3,1,1,0,3,1,2,0,3,1,3,0,3,1,4,0,3,1,5,0,3,2,1,0,3,2,2,0,3,2,3,0,3,2,4,0,3,2,5,0,3,3,1,0,3,3,2,0,3,3,3,0,3,3,4,0,3,3,5,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,4,5,0,3,-3,3,0,3,-3,4,0,3,-3,5,0,3,-2,5,0,3,-1,5,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-6,5,0,3,-6,6,0,3,-6,7,0,3,-5,3,0,3,-5,4,0,3,-5,5,0,3,-5,6,0,3,-5,7,0,3,-4,3,0,3,-4,4,0,3,-4,5,0,3,-4,6,0,3,-4,7,0,3,-3,6,0,3,-3,7,0,3,-3,8,0,3,-2,6,0,3,-2,7,0,3,-2,8,0,3,-1,6,0,3,-1,7,0,3,-1,8,0,3,0,6,0,3,0,7,0,3,0,8,0,3,1,6,0,3,1,7,0,3,1,8,0,3],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png new file mode 100644 index 0000000..478b35a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png.import new file mode 100644 index 0000000..b80c33b --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp0vxdpgngsj8" +path="res://.godot/imported/Preview.png-46acff5fa2872af249169769a17dd53e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/boss/Boss1/Preview.png" +dest_files=["res://.godot/imported/Preview.png-46acff5fa2872af249169769a17dd53e.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/tileMaps/Test1/boss/Boss1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/RoomInfo.json new file mode 100644 index 0000000..bb3bf54 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-7,"Y":-13},"Size":{"X":24,"Y":20},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":8,"RoomName":"Boss1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/TileInfo.json new file mode 100644 index 0000000..29ba246 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/boss/Boss1/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":198,"Y":54},{"X":234,"Y":82},{"X":-74,"Y":82},{"X":138,"Y":54},{"X":234,"Y":-154},{"X":198,"Y":-30},{"X":-74,"Y":-154},{"X":170,"Y":-30},{"X":-10,"Y":-110},{"X":22,"Y":-26},{"X":22,"Y":-78},{"X":170,"Y":2},{"X":138,"Y":2},{"X":-10,"Y":-78},{"X":-38,"Y":-26},{"X":-38,"Y":-110}],"NavigationPolygon":[[0,1,2,3],[4,1,0,5],[6,4,5,7,8],[9,10,7,11,12],[10,13,8],[9,12,3,2,14],[14,2,6,15],[8,15,6],[8,7,10]],"Floor":[-5,-10,0,3,-5,-9,0,3,-5,-8,0,3,-5,-7,0,3,-5,-6,0,3,-5,-5,0,3,-5,-4,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,-4,-10,0,3,-4,-9,0,3,-4,-8,0,3,-4,-7,0,3,-4,-6,0,3,-4,-5,0,3,-4,-4,0,3,-4,-3,0,3,-4,-2,0,3,-4,-1,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-4,3,0,3,-3,-10,0,3,-3,-9,0,3,-3,-8,0,3,-3,-7,0,3,-3,-6,0,3,-3,-5,0,3,-3,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-3,3,0,3,-2,-10,0,3,-2,-9,0,3,-2,-8,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-1,-10,0,3,-1,-9,0,3,-1,-8,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,-1,3,0,3,0,-10,0,3,0,-9,0,3,0,-8,0,3,0,-7,0,3,0,-6,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,0,3,0,3,1,-10,0,3,1,-9,0,3,1,-8,0,3,1,-7,0,3,1,-6,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,1,3,0,3,2,-10,0,3,2,-9,0,3,2,-8,0,3,2,-7,0,3,2,-6,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,2,3,0,3,3,-10,0,3,3,-9,0,3,3,-8,0,3,3,-7,0,3,3,-6,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,3,3,0,3,4,-10,0,3,4,-9,0,3,4,-8,0,3,4,-7,0,3,4,-6,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,4,3,0,3,5,-10,0,3,5,-9,0,3,5,-8,0,3,5,-7,0,3,5,-6,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,5,3,0,3,6,-10,0,3,6,-9,0,3,6,-8,0,3,6,-7,0,3,6,-6,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,6,3,0,3,7,-10,0,3,7,-9,0,3,7,-8,0,3,7,-7,0,3,7,-6,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,7,-1,0,3,7,2,0,3,7,3,0,3,8,-10,0,3,8,-9,0,3,8,-8,0,3,8,-7,0,3,8,-6,0,3,8,-5,0,3,8,-4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,2,0,3,8,3,0,3,9,-10,0,3,9,-9,0,3,9,-8,0,3,9,-7,0,3,9,-6,0,3,9,-5,0,3,9,-4,0,3,9,-3,0,3,9,-2,0,3,9,-1,0,3,9,3,0,3,10,-10,0,3,10,-9,0,3,10,-8,0,3,10,-7,0,3,10,-6,0,3,10,-5,0,3,10,-4,0,3,10,-3,0,3,10,3,0,3,11,-10,0,3,11,-9,0,3,11,-8,0,3,11,-7,0,3,11,-6,0,3,11,-5,0,3,11,-4,0,3,11,-3,0,3,11,3,0,3,12,-10,0,3,12,-9,0,3,12,-8,0,3,12,-7,0,3,12,-6,0,3,12,-5,0,3,12,-4,0,3,12,-3,0,3,12,-2,0,3,12,-1,0,3,12,0,0,3,12,1,0,3,12,2,0,3,12,3,0,3,13,-10,0,3,13,-9,0,3,13,-8,0,3,13,-7,0,3,13,-6,0,3,13,-5,0,3,13,-4,0,3,13,-3,0,3,13,-2,0,3,13,-1,0,3,13,0,0,3,13,1,0,3,13,2,0,3,13,3,0,3,7,0,0,3,7,1,0,3,-5,4,0,3,-4,4,0,3,-3,4,0,3,-2,4,0,3,-1,4,0,3,0,4,0,3,1,4,0,3,2,4,0,3,3,4,0,3,4,4,0,3,5,4,0,3,6,4,0,3,7,4,0,3,8,4,0,3,9,4,0,3,10,4,0,3,11,4,0,3,12,4,0,3,13,4,0,3,14,-10,0,3,14,-9,0,3,14,-8,0,3,14,-7,0,3,14,-6,0,3,14,-5,0,3,14,-4,0,3,14,-3,0,3,14,-2,0,3,14,-1,0,3,14,0,0,3,14,1,0,3,14,2,0,3,14,3,0,3,14,4,0,3,10,-2,0,3,10,-1,0,3,-1,-7,0,3,-1,-6,0,3,8,0,0,3,8,1,0,3],"Middle":[-5,-13,63,1,-5,-12,2,2,-5,-11,6,2,-4,-13,63,1,-4,-12,2,2,-4,-11,6,2,-3,-13,63,1,-3,-12,2,2,-3,-11,6,2,-2,-13,63,1,-2,-12,2,2,-2,-11,6,2,-2,-5,50,1,-2,-4,1,2,-2,-3,5,2,-1,-13,63,1,-1,-12,2,2,-1,-11,6,2,-1,-5,56,1,-1,-4,2,2,-1,-3,6,2,0,-13,63,1,0,-12,2,2,0,-11,6,2,0,-5,24,1,0,-4,3,2,0,-3,7,2,1,-13,63,1,1,-12,2,2,1,-11,6,2,2,-13,63,1,2,-12,2,2,2,-11,6,2,3,-13,63,1,3,-12,2,2,3,-11,6,2,4,-13,63,1,4,-12,2,2,4,-11,6,2,5,-13,63,1,5,-12,2,2,5,-11,6,2,6,-13,63,1,6,-12,2,2,6,-11,6,2,7,-13,63,1,7,-12,2,2,7,-11,6,2,8,-13,63,1,8,-12,2,2,8,-11,6,2,9,-13,63,1,9,-12,2,2,9,-11,6,2,9,0,48,1,9,1,1,2,9,2,5,2,10,-13,63,1,10,-12,2,2,10,-11,6,2,10,0,56,1,10,1,2,2,10,2,6,2,11,-13,63,1,11,-12,2,2,11,-11,6,2,11,0,26,1,11,1,3,2,11,2,7,2,12,-13,63,1,12,-12,2,2,12,-11,6,2,13,-13,63,1,13,-12,2,2,13,-11,6,2,14,-13,63,1,14,-12,2,2,14,-11,6,2],"Top":[-7,-14,511,1,-7,-13,511,1,-7,-12,511,1,-7,-11,511,1,-7,-10,511,1,-7,-9,511,1,-7,-8,511,1,-7,-7,511,1,-7,-6,511,1,-7,-5,511,1,-7,-4,511,1,-7,-3,511,1,-7,-2,511,1,-7,-1,511,1,-7,0,511,1,-7,1,511,1,-7,2,511,1,-7,3,511,1,-7,4,511,1,-7,5,511,1,-7,6,511,1,-6,-14,511,1,-6,-13,255,1,-6,-12,219,1,-6,-11,219,1,-6,-10,219,1,-6,-9,219,1,-6,-8,219,1,-6,-7,219,1,-6,-6,219,1,-6,-5,219,1,-6,-4,219,1,-6,-3,219,1,-6,-2,219,1,-6,-1,219,1,-6,0,219,1,-6,1,219,1,-6,2,219,1,-6,3,219,1,-6,4,219,1,-6,5,507,1,-6,6,511,1,-5,-14,511,1,-5,5,504,1,-5,6,511,1,-4,-14,511,1,-4,5,504,1,-4,6,511,1,-3,-14,511,1,-3,5,504,1,-3,6,511,1,-2,-14,511,1,-2,-7,144,1,-2,-6,146,1,-2,5,504,1,-2,6,511,1,-1,-14,511,1,-1,5,504,1,-1,6,511,1,0,-14,511,1,0,5,504,1,0,6,511,1,1,-14,511,1,1,5,504,1,1,6,511,1,2,-14,511,1,2,5,504,1,2,6,511,1,3,-14,511,1,3,5,504,1,3,6,511,1,4,-14,511,1,4,5,504,1,4,6,511,1,5,-14,511,1,5,5,504,1,5,6,511,1,6,-14,511,1,6,5,504,1,6,6,511,1,7,-14,511,1,7,5,504,1,7,6,511,1,8,-14,511,1,8,5,504,1,8,6,511,1,9,-14,511,1,9,5,504,1,9,6,511,1,10,-14,511,1,10,5,504,1,10,6,511,1,11,-14,511,1,11,-2,144,1,11,-1,146,1,11,5,504,1,11,6,511,1,12,-14,511,1,12,5,504,1,12,6,511,1,13,-14,511,1,13,5,504,1,13,6,511,1,14,-14,511,1,14,5,504,1,14,6,511,1,15,-14,511,1,15,-13,447,1,15,-12,438,1,15,-11,438,1,15,-10,438,1,15,-9,438,1,15,-8,438,1,15,-7,438,1,15,-6,438,1,15,-5,438,1,15,-4,438,1,15,-3,438,1,15,-2,438,1,15,-1,438,1,15,0,438,1,15,1,438,1,15,2,438,1,15,3,438,1,15,4,438,1,15,5,510,1,15,6,511,1,16,-14,511,1,16,-13,511,1,16,-12,511,1,16,-11,511,1,16,-10,511,1,16,-9,511,1,16,-8,511,1,16,-7,511,1,16,-6,511,1,16,-5,511,1,16,-4,511,1,16,-3,511,1,16,-2,511,1,16,-1,511,1,16,0,511,1,16,1,511,1,16,2,511,1,16,3,511,1,16,4,511,1,16,5,511,1,16,6,511,1],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git "a/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preinstall.json" "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preinstall.json" new file mode 100644 index 0000000..a9f951a --- /dev/null +++ "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preinstall.json" @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git "a/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png" "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png" new file mode 100644 index 0000000..d2ad303 --- /dev/null +++ "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png" Binary files differ diff --git "a/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png.import" "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png.import" new file mode 100644 index 0000000..e9f48d4 --- /dev/null +++ "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/Preview.png.import" @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co5xect35y824" +path="res://.godot/imported/Preview.png-fc7bb7c2dfd4b0a1ba5ea4ee2d5b8746.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/event/测试房间/Preview.png" +dest_files=["res://.godot/imported/Preview.png-fc7bb7c2dfd4b0a1ba5ea4ee2d5b8746.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/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/RoomInfo.json" "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/RoomInfo.json" new file mode 100644 index 0000000..3e904a7 --- /dev/null +++ "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/RoomInfo.json" @@ -0,0 +1 @@ +{"Position":{"X":-20,"Y":-11},"Size":{"X":29,"Y":29},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":64,"RoomName":"\u6D4B\u8BD5\u623F\u95F4","Weight":100,"Remark":""} \ No newline at end of file diff --git "a/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/TileInfo.json" "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/TileInfo.json" new file mode 100644 index 0000000..e33c38d --- /dev/null +++ "b/DungeonShooting_Godot/resource/map/tileMaps/Test1/event/\346\265\213\350\257\225\346\210\277\351\227\264/TileInfo.json" @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":-26,"Y":-26},{"X":-26,"Y":-58},{"X":90,"Y":-58},{"X":90,"Y":36},{"X":42,"Y":36},{"X":42,"Y":150},{"X":22,"Y":150},{"X":22,"Y":36},{"X":-26,"Y":-12},{"X":-26,"Y":36},{"X":-166,"Y":-26},{"X":-166,"Y":-12},{"X":-166,"Y":52},{"X":-182,"Y":52},{"X":-26,"Y":166},{"X":-26,"Y":150},{"X":90,"Y":150},{"X":90,"Y":244},{"X":-26,"Y":244},{"X":-26,"Y":180},{"X":-182,"Y":166},{"X":-202,"Y":180},{"X":-202,"Y":52},{"X":-266,"Y":52},{"X":-266,"Y":-106},{"X":-166,"Y":-106}],"NavigationPolygon":[[0,1,2,3,4],[4,5,6,7],[0,4,7,8],[7,9,8],[10,0,8,11],[11,12,13],[14,15,6],[5,16,17,18,19],[6,5,19,14],[20,14,19,21],[20,21,22,13],[22,23,24,25,10],[22,10,11,13]],"Floor":[-2,-4,0,3,-1,-4,0,3,-1,-3,0,3,0,-2,0,3,1,-2,0,3,1,-1,0,3,2,-1,0,3,3,-1,0,3,3,0,0,3,4,0,0,3,5,0,0,3,5,1,0,3,-2,-3,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,0,-4,0,3,0,-3,0,3,0,-1,0,3,0,0,0,3,1,-4,0,3,1,-3,0,3,1,0,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,0,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,-2,1,0,3,-1,1,0,3,0,1,0,3,1,1,0,3,2,1,0,3,3,1,0,3,4,1,0,3,1,2,0,3,2,2,0,3,-2,9,0,3,-2,10,0,3,-2,11,0,3,-2,12,0,3,-2,13,0,3,-2,14,0,3,-1,9,0,3,-1,10,0,3,-1,11,0,3,-1,12,0,3,-1,13,0,3,-1,14,0,3,0,9,0,3,0,10,0,3,0,11,0,3,0,12,0,3,0,13,0,3,0,14,0,3,1,9,0,3,1,10,0,3,1,11,0,3,1,12,0,3,1,13,0,3,1,14,0,3,2,9,0,3,2,10,0,3,2,11,0,3,2,12,0,3,2,13,0,3,2,14,0,3,3,9,0,3,3,10,0,3,3,11,0,3,3,12,0,3,3,13,0,3,3,14,0,3,4,9,0,3,4,10,0,3,4,11,0,3,4,12,0,3,4,13,0,3,4,14,0,3,5,9,0,3,5,10,0,3,5,11,0,3,5,12,0,3,5,13,0,3,5,14,0,3,1,3,0,3,1,4,0,3,1,5,0,3,1,6,0,3,1,7,0,3,1,8,0,3,2,3,0,3,2,4,0,3,2,5,0,3,2,6,0,3,2,7,0,3,2,8,0,3,-17,-7,0,3,-17,-6,0,3,-16,-6,0,3,-16,-5,0,3,-15,-5,0,3,-15,-4,0,3,-14,-3,0,3,-14,-2,0,3,-13,-2,0,3,-13,-1,0,3,-12,-1,0,3,-12,0,0,3,-11,0,0,3,-11,1,0,3,-17,-5,0,3,-17,-4,0,3,-17,-3,0,3,-17,-2,0,3,-17,-1,0,3,-17,0,0,3,-17,1,0,3,-17,2,0,3,-16,-7,0,3,-16,-4,0,3,-16,-3,0,3,-16,-2,0,3,-16,-1,0,3,-16,0,0,3,-16,1,0,3,-16,2,0,3,-15,-7,0,3,-15,-6,0,3,-15,-3,0,3,-15,-2,0,3,-15,-1,0,3,-15,0,0,3,-15,1,0,3,-15,2,0,3,-14,-7,0,3,-14,-6,0,3,-14,-5,0,3,-14,-4,0,3,-14,-1,0,3,-14,0,0,3,-14,1,0,3,-14,2,0,3,-13,-7,0,3,-13,-6,0,3,-13,-5,0,3,-13,-4,0,3,-13,-3,0,3,-13,0,0,3,-13,1,0,3,-13,2,0,3,-12,-7,0,3,-12,-6,0,3,-12,-5,0,3,-12,-4,0,3,-12,-3,0,3,-12,-2,0,3,-12,1,0,3,-12,2,0,3,-11,-7,0,3,-11,-6,0,3,-11,-5,0,3,-11,-4,0,3,-11,-3,0,3,-11,-2,0,3,-11,-1,0,3,-11,2,0,3,-10,-2,0,3,-9,-2,0,3,-8,-2,0,3,-7,-2,0,3,-6,-2,0,3,-5,-2,0,3,-4,-2,0,3,-3,-2,0,3,-13,3,0,3,-13,4,0,3,-13,5,0,3,-13,6,0,3,-13,7,0,3,-13,8,0,3,-13,9,0,3,-13,10,0,3,-12,3,0,3,-12,4,0,3,-12,5,0,3,-12,6,0,3,-12,7,0,3,-12,8,0,3,-12,9,0,3,-12,10,0,3,-11,10,0,3,-10,10,0,3,-9,10,0,3,-8,10,0,3,-7,10,0,3,-6,10,0,3,-5,10,0,3,-4,10,0,3,-3,10,0,3,-11,5,0,3],"Middle":[],"Top":[],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preinstall.json new file mode 100644 index 0000000..df10eda --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":false,"WaveList":[[{"Position":{"X":39,"Y":8},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-16,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":66,"Y":6},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0009","Weight":100,"Attr":{"CurrAmmon":"1","ResidueAmmo":"25"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":66,"Y":47},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0010","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"120"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":47,"Y":-32},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0008","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"120"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":23,"Y":37},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":2,"Y":18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0005","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":24,"Y":-30},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0006","Weight":100,"Attr":{"CurrAmmon":"20","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":40,"Y":-10},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":2,"Y":-37},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-2,"Y":47},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":29,"Y":63},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0013","Weight":100,"Attr":{"CurrAmmon":"50","ResidueAmmo":"250"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-30,"Y":39},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-19,"Y":71},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":48,"Y":29},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0004","Weight":100,"Attr":{"CurrAmmon":"180","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":20,"Y":94},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0014","Weight":100,"Attr":{"CurrAmmon":"5","ResidueAmmo":"60"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-14,"Y":97},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0011","Weight":100,"Attr":{"CurrAmmon":"20","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":9,"Y":-7},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0011","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-41,"Y":61},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0016","Weight":100,"Attr":{"CurrAmmon":"5","ResidueAmmo":"60"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png new file mode 100644 index 0000000..bf23f36 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png.import new file mode 100644 index 0000000..9b13b48 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp0ufqrgdfx7y" +path="res://.godot/imported/Preview.png-316f603611f843062bfe5bd940ed732b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/inlet/Start/Preview.png" +dest_files=["res://.godot/imported/Preview.png-316f603611f843062bfe5bd940ed732b.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/tileMaps/Test1/inlet/Start/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/RoomInfo.json new file mode 100644 index 0000000..dedff1f --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-9,"Y":-7},"Size":{"X":20,"Y":17},"DoorAreaInfos":[{"Direction":3,"Start":32,"End":176},{"Direction":2,"Start":16,"End":144}],"GroupName":"Test1","RoomType":2,"RoomName":"Start","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/TileInfo.json new file mode 100644 index 0000000..bfa5964 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":138,"Y":-42},{"X":138,"Y":90},{"X":134,"Y":38},{"X":134,"Y":-6},{"X":74,"Y":10},{"X":74,"Y":54},{"X":58,"Y":90},{"X":-26,"Y":38},{"X":-26,"Y":-6},{"X":90,"Y":-42},{"X":90,"Y":-6},{"X":90,"Y":10},{"X":118,"Y":54},{"X":118,"Y":38},{"X":58,"Y":138},{"X":-58,"Y":138},{"X":-58,"Y":106},{"X":-86,"Y":38},{"X":-106,"Y":106},{"X":-106,"Y":-42},{"X":-86,"Y":-6},{"X":-42,"Y":-42},{"X":-42,"Y":-58},{"X":90,"Y":-58}],"NavigationPolygon":[[0,1,2,3],[4,5,6,7,8],[9,0,3,10],[10,11,4],[12,13,2,1],[12,1,6,5],[7,6,14,15,16],[17,7,16,18],[17,18,19,20],[20,19,21,8],[4,8,21,22,23,9],[4,9,10]],"Floor":[-3,-4,0,3,-2,-4,0,3,-2,-3,0,3,-3,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-7,4,0,3,-7,5,0,3,-6,-3,0,3,-6,-2,0,3,-6,-1,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-6,5,0,3,-5,-3,0,3,-5,-2,0,3,-5,2,0,3,-5,3,0,3,-5,4,0,3,-5,5,0,3,-4,-3,0,3,-4,-2,0,3,-4,2,0,3,-4,3,0,3,-4,4,0,3,-4,5,0,3,-3,-2,0,3,-3,2,0,3,-3,3,0,3,-3,4,0,3,-3,5,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-2,4,0,3,-2,5,0,3,-4,6,0,3,-4,7,0,3,-3,6,0,3,-3,7,0,3,-2,6,0,3,-2,7,0,3,-1,3,0,3,-1,4,0,3,-1,7,0,3,0,3,0,3,0,4,0,3,0,7,0,3,1,3,0,3,1,4,0,3,1,5,0,3,1,6,0,3,1,7,0,3,2,3,0,3,2,4,0,3,2,5,0,3,2,6,0,3,2,7,0,3,3,3,0,3,3,4,0,3,3,5,0,3,3,6,0,3,3,7,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,5,-4,0,3,5,-3,0,3,5,-1,0,3,3,1,0,3,3,2,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,5,3,0,3,5,4,0,3,6,3,0,3,6,4,0,3,6,-3,0,3,7,-3,0,3,7,-2,0,3,7,2,0,3,7,3,0,3,7,4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,8,3,0,3,8,4,0,3,-1,2,0,3,0,2,0,3,1,2,0,3,2,2,0,3,2,1,0,3,1,1,0,3,0,1,0,3,-1,1,0,3,-1,5,0,3,0,5,0,3,0,6,0,3,-1,6,0,3,-7,-3,0,3,6,-2,0,3,5,-2,0,3],"CustomFloor1":[-4,2,1,7,14,-3,3,1,8,15,-4,3,1,7,15,-5,3,1,6,15,6,4,1,8,15,5,4,1,7,15,-5,2,1,6,14,4,3,1,6,14,4,4,1,6,15,6,3,1,8,14,5,3,1,7,14,-3,2,1,8,14],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[-3,4,1,10,5,-3,5,1,10,6,2,4,1,10,5,2,5,1,10,6],"CustomMiddle2":[5,-4,1,6,0,5,-3,1,6,1,-2,-1,1,5,0,-2,0,1,5,1],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preinstall.json new file mode 100644 index 0000000..cc0f6ed --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[{"Position":{"X":8,"Y":-8},"Size":{"X":14,"Y":14},"SpecialMarkType":2,"DelayTime":0,"MarkList":[]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png new file mode 100644 index 0000000..fcbb563 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png.import new file mode 100644 index 0000000..d152c19 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjbhmlfjo4fbt" +path="res://.godot/imported/Preview.png-4e96f70cfb64e3f150b72a9f4e2754f6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/outlet/End1/Preview.png" +dest_files=["res://.godot/imported/Preview.png-4e96f70cfb64e3f150b72a9f4e2754f6.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/tileMaps/Test1/outlet/End1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/RoomInfo.json new file mode 100644 index 0000000..6881d9b --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-5,"Y":-7},"Size":{"X":11,"Y":12},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":4,"RoomName":"End1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/TileInfo.json new file mode 100644 index 0000000..3880d49 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/outlet/End1/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":58,"Y":-58},{"X":58,"Y":58},{"X":-42,"Y":58},{"X":-26,"Y":-42},{"X":-42,"Y":-42},{"X":-26,"Y":-58}],"NavigationPolygon":[[0,1,2,3],[2,4,3],[0,3,5]],"Floor":[-2,-1,0,3,-2,-2,0,3,-1,-2,0,3,1,-2,0,3,1,-1,0,3,2,-1,0,3,-1,-1,0,3,-2,0,0,3,-2,1,0,3,-1,1,0,3,0,1,0,3,1,1,0,3,2,1,0,3,2,0,0,3,1,0,0,3,-1,0,0,3,2,-2,0,3,2,-3,0,3,1,-3,0,3,0,-3,0,3,-1,-3,0,3,-2,-3,0,3,-2,2,0,3,-1,2,0,3,0,2,0,3,1,2,0,3,2,2,0,3,3,2,0,3,3,1,0,3,3,0,0,3,3,-1,0,3,3,-2,0,3,3,-3,0,3,3,-4,0,3,2,-4,0,3,1,-4,0,3,0,-4,0,3,-1,-4,0,3,-2,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,0,0,0,3,0,-2,0,3,0,-1,0,3],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png new file mode 100644 index 0000000..7b62434 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png.import new file mode 100644 index 0000000..f462856 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b72ww741x2t0w" +path="res://.godot/imported/Preview.png-e48e389971aff40736b911be53ae62ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/reward/Award1/Preview.png" +dest_files=["res://.godot/imported/Preview.png-e48e389971aff40736b911be53ae62ea.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/tileMaps/Test1/reward/Award1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/RoomInfo.json new file mode 100644 index 0000000..46ab0bb --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-7,"Y":-6},"Size":{"X":11,"Y":12},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":26,"RoomName":"Award1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/TileInfo.json new file mode 100644 index 0000000..7c17a71 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/reward/Award1/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":26,"Y":66},{"X":-74,"Y":66},{"X":-74,"Y":-42},{"X":26,"Y":-42}],"NavigationPolygon":[[0,1,2,3]],"Floor":[-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-4,-3,0,3,-4,-2,0,3,-4,-1,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-3,-3,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-2,-3,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,-5,3,0,3,-4,3,0,3,-3,3,0,3,-2,3,0,3,-1,3,0,3,0,3,0,3,1,3,0,3,-3,-2,0,3,-5,-3,0,3],"Middle":[-5,-6,63,1,-5,-5,2,2,-5,-4,6,2,-4,-6,63,1,-4,-5,2,2,-4,-4,6,2,-3,-6,63,1,-3,-5,2,2,-3,-4,6,2,-2,-6,63,1,-2,-5,2,2,-2,-4,6,2,-1,-6,63,1,-1,-5,2,2,-1,-4,6,2,0,-6,63,1,0,-5,2,2,0,-4,6,2,1,-6,63,1,1,-5,2,2,1,-4,6,2],"Top":[-7,-7,511,1,-7,-6,511,1,-7,-5,511,1,-7,-4,511,1,-7,-3,511,1,-7,-2,511,1,-7,-1,511,1,-7,0,511,1,-7,1,511,1,-7,2,511,1,-7,3,511,1,-7,4,511,1,-7,5,511,1,-6,-7,511,1,-6,-6,255,1,-6,-5,219,1,-6,-4,219,1,-6,-3,219,1,-6,-2,219,1,-6,-1,219,1,-6,0,219,1,-6,1,219,1,-6,2,219,1,-6,3,219,1,-6,4,507,1,-6,5,511,1,-5,-7,511,1,-5,4,504,1,-5,5,511,1,-4,-7,511,1,-4,4,504,1,-4,5,511,1,-3,-7,511,1,-3,4,504,1,-3,5,511,1,-2,-7,511,1,-2,4,504,1,-2,5,511,1,-1,-7,511,1,-1,4,504,1,-1,5,511,1,0,-7,511,1,0,4,504,1,0,5,511,1,1,-7,511,1,1,4,504,1,1,5,511,1,2,-7,511,1,2,-6,447,1,2,-5,438,1,2,-4,438,1,2,-3,438,1,2,-2,438,1,2,-1,438,1,2,0,438,1,2,1,438,1,2,2,438,1,2,3,438,1,2,4,510,1,2,5,511,1,3,-7,511,1,3,-6,511,1,3,-5,511,1,3,-4,511,1,3,-3,511,1,3,-2,511,1,3,-1,511,1,3,0,511,1,3,1,511,1,3,2,511,1,3,3,511,1,3,4,511,1,3,5,511,1],"CustomFloor1":[-3,-1,1,18,8,-3,0,1,18,8,-3,1,1,18,8,-2,-1,1,18,8,-2,0,1,18,8,-2,1,1,18,8,-1,-1,1,18,8,-1,0,1,18,8,-1,1,1,18,8,-4,-2,2,4,8,-4,-3,2,2,6,-1,-2,2,2,8,-1,-3,2,2,6,-2,-2,2,2,8,-2,-3,2,2,6,-3,-2,2,2,8,-3,-3,2,2,6,0,-3,2,2,6,0,-2,2,5,8,1,-3,2,3,6,1,-2,2,3,7,1,-1,2,3,7,0,-1,2,1,7,1,0,2,3,7,0,0,2,1,7,1,1,2,3,7,0,1,2,1,7,1,2,2,3,7,0,2,2,5,9,1,3,2,3,8,0,3,2,2,8,-1,3,2,2,8,-1,2,2,2,6,-2,3,2,2,8,-2,2,2,2,6,-3,3,2,2,8,-3,2,2,2,6,-4,3,2,2,8,-4,2,2,4,9,-5,3,2,1,8,-5,2,2,1,7,-4,1,2,3,7,-5,1,2,1,7,-4,0,2,3,7,-5,0,2,1,7,-4,-1,2,3,7,-5,-1,2,1,7,-5,-2,2,1,7,-5,-3,2,1,6],"CustomFloor2":[-4,-2,1,13,5,0,-2,1,13,5,-4,2,1,13,6,0,2,1,13,6],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preinstall.json new file mode 100644 index 0000000..a9f951a --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preinstall.json @@ -0,0 +1 @@ +[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png new file mode 100644 index 0000000..0f9e9f7 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png.import new file mode 100644 index 0000000..d98c705 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnmnf23aj6hki" +path="res://.godot/imported/Preview.png-a6cb6d2603055a6ca060f3ff00e023de.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileMaps/Test1/shop/Shop1/Preview.png" +dest_files=["res://.godot/imported/Preview.png-a6cb6d2603055a6ca060f3ff00e023de.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/tileMaps/Test1/shop/Shop1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/RoomInfo.json new file mode 100644 index 0000000..88ad7e7 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/RoomInfo.json @@ -0,0 +1 @@ +{"Position":{"X":-11,"Y":-14},"Size":{"X":24,"Y":26},"DoorAreaInfos":[{"Direction":3,"Start":96,"End":224},{"Direction":1,"Start":96,"End":240},{"Direction":2,"Start":96,"End":224},{"Direction":0,"Start":96,"End":240}],"GroupName":"Test1","RoomType":32,"RoomName":"Shop1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/TileInfo.json new file mode 100644 index 0000000..68563a0 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/shop/Shop1/TileInfo.json @@ -0,0 +1 @@ +{"NavigationVertices":[{"X":74,"Y":-154},{"X":90,"Y":-154},{"X":90,"Y":-138},{"X":106,"Y":-138},{"X":106,"Y":-122},{"X":122,"Y":-122},{"X":122,"Y":-106},{"X":138,"Y":-106},{"X":138,"Y":-90},{"X":154,"Y":-90},{"X":154,"Y":-74},{"X":170,"Y":-74},{"X":170,"Y":74},{"X":154,"Y":74},{"X":154,"Y":90},{"X":138,"Y":90},{"X":-106,"Y":-90},{"X":138,"Y":106},{"X":122,"Y":106},{"X":122,"Y":122},{"X":106,"Y":122},{"X":-122,"Y":74},{"X":-122,"Y":-74},{"X":106,"Y":138},{"X":90,"Y":138},{"X":-106,"Y":90},{"X":90,"Y":154},{"X":74,"Y":154},{"X":-58,"Y":138},{"X":-74,"Y":122},{"X":74,"Y":170},{"X":-42,"Y":170},{"X":-42,"Y":154},{"X":-58,"Y":154},{"X":-74,"Y":138},{"X":-90,"Y":122},{"X":-90,"Y":106},{"X":-106,"Y":106},{"X":-122,"Y":90},{"X":-138,"Y":74},{"X":-138,"Y":-74},{"X":-122,"Y":-90},{"X":-106,"Y":-106},{"X":-90,"Y":-106},{"X":-90,"Y":-122},{"X":-74,"Y":-122},{"X":-74,"Y":-138},{"X":-58,"Y":-138},{"X":-58,"Y":-154},{"X":-42,"Y":-154},{"X":-42,"Y":-170},{"X":74,"Y":-170}],"NavigationPolygon":[[0,1,2],[2,3,4],[4,5,6],[6,7,8],[8,9,10],[10,11,12,13],[13,14,15,16],[15,17,18,16],[18,19,20,16],[21,22,16,20,23,24,25],[24,26,27,28,29],[27,30,31,32],[32,33,28],[28,34,29],[29,35,36],[36,37,25],[25,38,21],[21,39,40,22],[22,41,16],[16,42,43,8,10,13],[43,44,45,6,8],[45,46,47,4,6],[47,48,49,2,4],[49,50,51,0],[49,0,2],[36,25,24],[29,36,24],[28,27,32]],"Floor":[-6,-8,0,3,-6,-7,0,3,-6,-6,0,3,-6,-5,0,3,-6,-4,0,3,-6,-3,0,3,-6,-2,0,3,-6,-1,0,3,-6,0,0,3,-6,1,0,3,-6,2,0,3,-6,3,0,3,-6,4,0,3,-6,5,0,3,-6,6,0,3,-5,-8,0,3,-5,-7,0,3,-5,-6,0,3,-5,-5,0,3,-5,-4,0,3,-5,-3,0,3,-5,-2,0,3,-5,-1,0,3,-5,0,0,3,-5,1,0,3,-5,2,0,3,-5,3,0,3,-5,4,0,3,-5,5,0,3,-5,6,0,3,-4,-8,0,3,-4,-7,0,3,-4,-6,0,3,-4,-5,0,3,-4,-4,0,3,-4,-3,0,3,-4,-2,0,3,-4,-1,0,3,-4,0,0,3,-4,1,0,3,-4,2,0,3,-4,3,0,3,-4,4,0,3,-4,5,0,3,-4,6,0,3,-3,-8,0,3,-3,-7,0,3,-3,-6,0,3,-3,-5,0,3,-3,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-3,2,0,3,-3,3,0,3,-3,4,0,3,-3,5,0,3,-3,6,0,3,-2,-8,0,3,-2,-7,0,3,-2,-6,0,3,-2,-5,0,3,-2,-4,0,3,-2,-3,0,3,-2,-2,0,3,-2,-1,0,3,-2,0,0,3,-2,1,0,3,-2,2,0,3,-2,3,0,3,-2,4,0,3,-2,5,0,3,-2,6,0,3,-1,-8,0,3,-1,-7,0,3,-1,-6,0,3,-1,-5,0,3,-1,-4,0,3,-1,-3,0,3,-1,-2,0,3,-1,-1,0,3,-1,0,0,3,-1,1,0,3,-1,2,0,3,-1,3,0,3,-1,4,0,3,-1,5,0,3,-1,6,0,3,0,-8,0,3,0,-7,0,3,0,-6,0,3,0,-5,0,3,0,-4,0,3,0,-3,0,3,0,-2,0,3,0,-1,0,3,0,0,0,3,0,1,0,3,0,2,0,3,0,3,0,3,0,4,0,3,0,5,0,3,0,6,0,3,1,-8,0,3,1,-7,0,3,1,-6,0,3,1,-5,0,3,1,-4,0,3,1,-3,0,3,1,-2,0,3,1,-1,0,3,1,0,0,3,1,1,0,3,1,2,0,3,1,3,0,3,1,4,0,3,1,5,0,3,1,6,0,3,2,-8,0,3,2,-7,0,3,2,-6,0,3,2,-5,0,3,2,-4,0,3,2,-3,0,3,2,-2,0,3,2,-1,0,3,2,0,0,3,2,1,0,3,2,2,0,3,2,3,0,3,2,4,0,3,2,5,0,3,2,6,0,3,3,-8,0,3,3,-7,0,3,3,-6,0,3,3,-5,0,3,3,-4,0,3,3,-3,0,3,3,-2,0,3,3,-1,0,3,3,0,0,3,3,1,0,3,3,2,0,3,3,3,0,3,3,4,0,3,3,5,0,3,3,6,0,3,4,-8,0,3,4,-7,0,3,4,-6,0,3,4,-5,0,3,4,-4,0,3,4,-3,0,3,4,-2,0,3,4,-1,0,3,4,0,0,3,4,1,0,3,4,2,0,3,4,3,0,3,4,4,0,3,4,5,0,3,4,6,0,3,5,-8,0,3,5,-7,0,3,5,-6,0,3,5,-5,0,3,5,-4,0,3,5,-3,0,3,5,-2,0,3,5,-1,0,3,5,0,0,3,5,1,0,3,5,2,0,3,5,3,0,3,5,4,0,3,5,5,0,3,5,6,0,3,6,-8,0,3,6,-7,0,3,6,-6,0,3,6,-5,0,3,6,-4,0,3,6,-3,0,3,6,-2,0,3,6,-1,0,3,6,0,0,3,6,1,0,3,6,2,0,3,6,3,0,3,6,4,0,3,6,5,0,3,6,6,0,3,7,-8,0,3,7,-7,0,3,7,-6,0,3,7,-5,0,3,7,-4,0,3,7,-3,0,3,7,-2,0,3,7,-1,0,3,7,0,0,3,7,1,0,3,7,2,0,3,7,3,0,3,7,4,0,3,7,5,0,3,7,6,0,3,-5,-9,0,3,-4,-9,0,3,-3,-9,0,3,-2,-9,0,3,-1,-9,0,3,0,-9,0,3,1,-9,0,3,2,-9,0,3,3,-9,0,3,4,-9,0,3,5,-9,0,3,6,-9,0,3,-3,-10,0,3,-2,-10,0,3,-1,-10,0,3,0,-10,0,3,1,-10,0,3,2,-10,0,3,3,-10,0,3,4,-10,0,3,5,-10,0,3,-4,-10,0,3,-3,-11,0,3,-2,-11,0,3,-1,-11,0,3,0,-11,0,3,1,-11,0,3,2,-11,0,3,3,-11,0,3,4,-11,0,3,-7,-7,0,3,-7,-6,0,3,-7,-5,0,3,-7,-4,0,3,-7,-3,0,3,-7,-2,0,3,-7,-1,0,3,-7,0,0,3,-7,1,0,3,-7,2,0,3,-7,3,0,3,-7,4,0,3,-7,5,0,3,-8,-6,0,3,-8,-5,0,3,-8,-4,0,3,-8,-3,0,3,-8,-2,0,3,-8,-1,0,3,-8,0,0,3,-8,1,0,3,-8,2,0,3,-8,3,0,3,-8,4,0,3,-9,-5,0,3,-9,-4,0,3,-9,-3,0,3,-9,-2,0,3,-9,-1,0,3,-9,0,0,3,-9,1,0,3,-9,2,0,3,-9,3,0,3,-5,7,0,3,-4,7,0,3,-3,7,0,3,-2,7,0,3,-1,7,0,3,0,7,0,3,1,7,0,3,2,7,0,3,3,7,0,3,4,7,0,3,5,7,0,3,6,7,0,3,-4,8,0,3,-3,8,0,3,-2,8,0,3,-1,8,0,3,0,8,0,3,1,8,0,3,2,8,0,3,3,8,0,3,4,8,0,3,5,8,0,3,-3,9,0,3,-2,9,0,3,-1,9,0,3,0,9,0,3,1,9,0,3,2,9,0,3,3,9,0,3,4,9,0,3,8,-6,0,3,8,-5,0,3,8,-4,0,3,8,-3,0,3,8,-2,0,3,8,-1,0,3,8,0,0,3,8,1,0,3,8,2,0,3,8,3,0,3,8,4,0,3,8,5,0,3,8,-7,0,3,9,-5,0,3,9,-4,0,3,9,-3,0,3,9,-2,0,3,9,-1,0,3,9,0,0,3,9,1,0,3,9,2,0,3,9,3,0,3,9,4,0,3,9,-6,0,3,10,-5,0,3,10,-4,0,3,10,-3,0,3,10,-2,0,3,10,-1,0,3,10,0,0,3,10,1,0,3,10,2,0,3,10,3,0,3],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preinstall.json deleted file mode 100644 index 4ebcc0d..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-4,"Y":-6},"Size":{"X":30,"Y":26},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":38,"Y":48},"Size":{"X":31,"Y":25},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":38,"Y":-3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":103,"Y":13},"Size":{"X":105,"Y":36},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":-9,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":17,"Y":78},"Size":{"X":26,"Y":66},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0006","CurrAmmon":"20","ResidueAmmo":"20"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":19,"Y":-48},"Size":{"X":16,"Y":63},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png deleted file mode 100644 index 908f7ce..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png.import deleted file mode 100644 index 67c37b0..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b6aer1lyhcs12" -path="res://.godot/imported/Preview.png-31623ec49f994abd8521d4b3faef200a.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle1/Preview.png" -dest_files=["res://.godot/imported/Preview.png-31623ec49f994abd8521d4b3faef200a.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/tileMaps/TestGroup1/battle/Battle1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/RoomInfo.json deleted file mode 100644 index 1e6b269..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-7,"Y":-7},"Size":{"X":23,"Y":16},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":224},{"Direction":2,"Start":0,"End":224},{"Direction":0,"Start":144,"End":208},{"Direction":0,"Start":16,"End":80},{"Direction":1,"Start":0,"End":224}],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/TileInfo.json deleted file mode 100644 index 309a41e..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle1/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-88,-88,120,-88,120,-24,168,-24,168,-88,184,-88,184,-72,232,-72,232,-16,184,-16,184,56,232,56,232,112,184,112,184,128,168,128,168,48,120,48,120,128,-88,128]},{"Type":1,"Points":[-72,-64,-8,-64,-8,-24,-24,-24,-24,-8,-72,-8]},{"Type":1,"Points":[40,-64,104,-64,104,-8,56,-8,56,-24,40,-24]},{"Type":1,"Points":[-72,48,-24,48,-24,64,-8,64,-8,104,-72,104]},{"Type":1,"Points":[56,48,104,48,104,104,40,104,40,64,56,64]}],"Floor":[14,6,0,0,8,14,5,0,0,8,14,3,0,0,8,14,4,0,0,8,14,-3,0,0,8,14,-4,0,0,8,14,-5,0,0,8,14,-2,0,0,8,13,3,0,0,8,13,4,0,0,8,13,5,0,0,8,13,6,0,0,8,13,-3,0,0,8,13,-4,0,0,8,13,-5,0,0,8,13,-2,0,0,8,12,6,0,0,8,12,5,0,0,8,12,4,0,0,8,12,3,0,0,8,12,-4,0,0,8,12,-3,0,0,8,12,-5,0,0,8,12,-2,0,0,8,11,-6,0,0,8,11,-5,0,0,8,11,-4,0,0,8,11,-3,0,0,8,11,-2,0,0,8,11,-1,0,0,8,11,0,0,0,8,11,1,0,0,8,11,2,0,0,8,11,3,0,0,8,11,4,0,0,8,11,5,0,0,8,11,6,0,0,8,11,7,0,0,8,7,7,0,0,8,7,6,0,0,8,7,5,0,0,8,7,4,0,0,8,7,3,0,0,8,7,2,0,0,8,7,1,0,0,8,7,0,0,0,8,7,-1,0,0,8,7,-2,0,0,8,7,-3,0,0,8,7,-4,0,0,8,7,-5,0,0,8,7,-6,0,0,8,6,7,0,0,8,6,6,0,0,8,6,5,0,0,8,6,4,0,0,8,6,3,0,0,8,6,2,0,0,8,6,1,0,0,8,6,0,0,0,8,6,-1,0,0,8,6,-2,0,0,8,6,-3,0,0,8,6,-4,0,0,8,6,-5,0,0,8,6,-6,0,0,8,5,2,0,0,8,5,-1,0,0,8,5,6,0,0,8,5,7,0,0,8,5,1,0,0,8,5,0,0,0,8,5,-5,0,0,8,5,-6,0,0,8,4,2,0,0,8,4,-1,0,0,8,4,6,0,0,8,4,7,0,0,8,4,1,0,0,8,4,0,0,0,8,4,-5,0,0,8,4,-6,0,0,8,3,6,0,0,8,3,7,0,0,8,3,3,0,0,8,3,2,0,0,8,3,1,0,0,8,3,0,0,0,8,3,-1,0,0,8,3,-2,0,0,8,3,-5,0,0,8,3,-6,0,0,8,2,5,0,0,8,2,4,0,0,8,2,-3,0,0,8,2,-4,0,0,8,2,6,0,0,8,2,7,0,0,8,2,3,0,0,8,2,2,0,0,8,2,1,0,0,8,2,0,0,0,8,2,-1,0,0,8,2,-2,0,0,8,2,-5,0,0,8,2,-6,0,0,8,1,0,0,0,8,1,1,0,0,8,1,7,0,0,8,1,6,0,0,8,1,5,0,0,8,1,4,0,0,8,1,3,0,0,8,1,2,0,0,8,1,-1,0,0,8,1,-2,0,0,8,1,-3,0,0,8,1,-4,0,0,8,1,-5,0,0,8,1,-6,0,0,8,0,1,0,0,8,0,0,0,0,8,0,7,0,0,8,0,6,0,0,8,0,5,0,0,8,0,4,0,0,8,0,3,0,0,8,0,2,0,0,8,0,-1,0,0,8,0,-2,0,0,8,0,-3,0,0,8,0,-4,0,0,8,0,-5,0,0,8,0,-6,0,0,8,-1,5,0,0,8,-1,4,0,0,8,-1,-3,0,0,8,-1,-4,0,0,8,-1,6,0,0,8,-1,7,0,0,8,-1,3,0,0,8,-1,2,0,0,8,-1,1,0,0,8,-1,0,0,0,8,-1,-1,0,0,8,-1,-2,0,0,8,-1,-5,0,0,8,-1,-6,0,0,8,-2,6,0,0,8,-2,7,0,0,8,-2,3,0,0,8,-2,2,0,0,8,-2,1,0,0,8,-2,0,0,0,8,-2,-1,0,0,8,-2,-2,0,0,8,-2,-5,0,0,8,-2,-6,0,0,8,-3,2,0,0,8,-3,-1,0,0,8,-3,6,0,0,8,-3,7,0,0,8,-3,1,0,0,8,-3,0,0,0,8,-3,-5,0,0,8,-3,-6,0,0,8,-4,2,0,0,8,-4,-1,0,0,8,-4,6,0,0,8,-4,7,0,0,8,-4,1,0,0,8,-4,0,0,0,8,-4,-5,0,0,8,-4,-6,0,0,8,-5,7,0,0,8,-5,6,0,0,8,-5,5,0,0,8,-5,4,0,0,8,-5,3,0,0,8,-5,2,0,0,8,-5,1,0,0,8,-5,0,0,0,8,-5,-1,0,0,8,-5,-2,0,0,8,-5,-3,0,0,8,-5,-4,0,0,8,-5,-5,0,0,8,-5,-6,0,0,8,-6,7,0,0,8,-6,6,0,0,8,-6,5,0,0,8,-6,4,0,0,8,-6,3,0,0,8,-6,2,0,0,8,-6,1,0,0,8,-6,0,0,0,8,-6,-1,0,0,8,-6,-2,0,0,8,-6,-3,0,0,8,-6,-4,0,0,8,-6,-5,0,0,8,-6,-6,0,0,8,8,-2,0,0,8,8,2,0,0,8,8,-1,0,0,8,8,0,0,0,8,8,1,0,0,8,9,-2,0,0,8,9,2,0,0,8,9,-1,0,0,8,9,0,0,0,8,9,1,0,0,8,10,-2,0,0,8,10,-3,0,0,8,10,-4,0,0,8,10,-5,0,0,8,10,-6,0,0,8,10,7,0,0,8,10,6,0,0,8,10,5,0,0,8,10,4,0,0,8,10,3,0,0,8,10,2,0,0,8,10,0,0,0,8,10,1,0,0,8,10,-1,0,0,8],"Middle":[-6,-7,0,2,7,-5,-7,0,2,7,-4,-7,0,2,7,-4,-2,0,1,7,-4,5,0,1,7,-3,-7,0,2,7,-3,-2,0,3,7,-3,5,0,2,7,-2,-7,0,2,7,-2,-3,0,3,7,-2,5,0,3,7,-1,-7,0,2,7,0,-7,0,2,7,1,-7,0,2,7,2,-7,0,2,7,3,-7,0,2,7,3,-3,0,1,7,3,5,0,1,7,4,-7,0,2,7,4,-2,0,1,7,4,5,0,2,7,5,-7,0,2,7,5,-2,0,3,7,5,5,0,3,7,6,-7,0,2,7,7,-7,0,2,7,8,-3,0,1,7,9,-3,0,3,7,10,-7,0,2,7,11,-7,0,2,7,12,-6,0,1,7,12,2,0,1,7,13,-6,0,2,7,13,2,0,2,7,14,-6,0,2,7,14,2,0,2,7],"Top":[-7,-7,0,3,4,-7,-6,0,3,3,-7,-5,0,3,3,-7,-4,0,3,3,-7,-3,0,3,3,-7,-2,0,3,3,-7,-1,0,3,3,-7,0,0,3,3,-7,1,0,3,3,-7,2,0,3,3,-7,3,0,3,3,-7,4,0,3,3,-7,5,0,3,3,-7,6,0,3,3,-7,7,0,3,3,-7,8,0,11,2,-6,8,0,2,2,-5,8,0,2,2,-4,-4,0,1,2,-4,-3,0,1,3,-4,3,0,1,2,-4,4,0,1,3,-4,8,0,2,2,-3,-4,0,2,2,-3,-3,0,3,4,-3,3,0,3,2,-3,4,0,11,2,-3,8,0,2,2,-2,-4,0,3,2,-2,4,0,3,2,-2,8,0,2,2,-1,8,0,2,2,0,8,0,2,2,1,8,0,2,2,2,8,0,2,2,3,-4,0,1,2,3,4,0,1,2,3,8,0,2,2,4,-4,0,2,2,4,-3,0,1,4,4,3,0,1,2,4,4,0,13,2,4,8,0,2,2,5,-4,0,3,2,5,-3,0,3,3,5,3,0,3,2,5,4,0,3,3,5,8,0,2,2,6,8,0,2,2,7,8,0,2,2,8,-7,0,1,4,8,-6,0,1,3,8,-5,0,1,3,8,-4,0,1,3,8,3,0,1,2,8,4,0,1,3,8,5,0,1,3,8,6,0,1,3,8,7,0,1,3,8,8,0,13,2,9,-7,0,3,4,9,-6,0,3,3,9,-5,0,3,3,9,-4,0,3,3,9,3,0,3,2,9,4,0,3,3,9,5,0,3,3,9,6,0,3,3,9,7,0,3,3,9,8,0,11,2,10,8,0,2,2,11,8,0,2,2,12,-7,0,1,4,12,-1,0,1,2,12,0,0,1,3,12,1,0,1,3,12,7,0,1,2,12,8,0,13,2,13,-1,0,2,2,13,7,0,2,2,14,-1,0,2,2,14,7,0,2,2,15,-6,0,1,4,15,-5,0,1,3,15,-4,0,1,3,15,-3,0,1,3,15,-2,0,1,3,15,-1,0,13,2,15,2,0,1,4,15,3,0,1,3,15,4,0,1,3,15,5,0,1,3,15,6,0,1,3,15,7,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json deleted file mode 100644 index d380491..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":178,"Y":-21},"Size":{"X":92,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":76,"Y":168},"Size":{"X":43,"Y":77},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":24,"Y":103},"Size":{"X":66,"Y":48},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":89,"Y":19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":65,"Y":142},"Size":{"X":48,"Y":160},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":79,"Y":45},"Size":{"X":46,"Y":121},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":181,"Y":203},"Size":{"X":66,"Y":33},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-19,"Y":100},"Size":{"X":97,"Y":63},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":117,"Y":-14},"Size":{"X":122,"Y":78},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":126,"Y":207},"Size":{"X":81,"Y":27},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":78,"Y":89},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-79,"Y":15},"Size":{"X":30,"Y":140},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-50,"Y":114},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0003","CurrAmmon":"12","ResidueAmmo":"12"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":45,"Y":187},"Size":{"X":42,"Y":72},"SpecialMarkType":0,"DelayTime":3,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0003","CurrAmmon":"12","ResidueAmmo":"12"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":119,"Y":-45},"Size":{"X":91,"Y":37},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-27,"Y":80},"Size":{"X":112,"Y":34},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png deleted file mode 100644 index 41a778f..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png.import deleted file mode 100644 index 47c9f9a..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://7jrgj84mv7k6" -path="res://.godot/imported/Preview.png-7b1ebf12bb329f0035c1b1e63fdb4dac.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png" -dest_files=["res://.godot/imported/Preview.png-7b1ebf12bb329f0035c1b1e63fdb4dac.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/tileMaps/TestGroup1/battle/Battle2/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/RoomInfo.json deleted file mode 100644 index 24c608a..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-8,"Y":-6},"Size":{"X":25,"Y":22},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":64},{"Direction":1,"Start":0,"End":240},{"Direction":2,"Start":96,"End":368},{"Direction":0,"Start":240,"End":320},{"Direction":0,"Start":0,"End":112},{"Direction":3,"Start":144,"End":368}],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle2","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/TileInfo.json deleted file mode 100644 index 38a683d..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-104,-72,-56,-72,-56,56,40,56,40,-72,248,-72,248,32,120,32,120,168,248,168,248,240,-8,240,-8,200,8,200,8,144,-40,144,-40,160,-104,160]}],"Floor":[15,14,0,0,8,15,13,0,0,8,15,12,0,0,8,15,11,0,0,8,15,10,0,0,8,15,1,0,0,8,15,0,0,0,8,15,-1,0,0,8,15,-2,0,0,8,15,-3,0,0,8,15,-4,0,0,8,15,-5,0,0,8,14,14,0,0,8,14,13,0,0,8,14,12,0,0,8,14,11,0,0,8,14,10,0,0,8,14,1,0,0,8,14,0,0,0,8,14,-1,0,0,8,14,-2,0,0,8,14,-3,0,0,8,14,-4,0,0,8,14,-5,0,0,8,13,14,0,0,8,13,13,0,0,8,13,12,0,0,8,13,11,0,0,8,13,10,0,0,8,13,1,0,0,8,13,0,0,0,8,13,-1,0,0,8,13,-2,0,0,8,13,-3,0,0,8,13,-4,0,0,8,13,-5,0,0,8,12,14,0,0,8,12,13,0,0,8,12,12,0,0,8,12,11,0,0,8,12,10,0,0,8,12,1,0,0,8,12,0,0,0,8,12,-1,0,0,8,12,-2,0,0,8,12,-3,0,0,8,12,-4,0,0,8,12,-5,0,0,8,11,14,0,0,8,11,13,0,0,8,11,12,0,0,8,11,11,0,0,8,11,10,0,0,8,11,1,0,0,8,11,0,0,0,8,11,-1,0,0,8,11,-2,0,0,8,11,-3,0,0,8,11,-4,0,0,8,11,-5,0,0,8,10,14,0,0,8,10,13,0,0,8,10,12,0,0,8,10,11,0,0,8,10,10,0,0,8,10,1,0,0,8,10,0,0,0,8,10,-1,0,0,8,10,-2,0,0,8,10,-3,0,0,8,10,-4,0,0,8,10,-5,0,0,8,9,14,0,0,8,9,13,0,0,8,9,12,0,0,8,9,11,0,0,8,9,10,0,0,8,9,1,0,0,8,9,0,0,0,8,9,-1,0,0,8,9,-2,0,0,8,9,-3,0,0,8,9,-4,0,0,8,9,-5,0,0,8,8,14,0,0,8,8,13,0,0,8,8,12,0,0,8,8,11,0,0,8,8,10,0,0,8,8,1,0,0,8,8,0,0,0,8,8,-1,0,0,8,8,-2,0,0,8,8,-3,0,0,8,8,-4,0,0,8,8,-5,0,0,8,7,14,0,0,8,7,13,0,0,8,7,12,0,0,8,7,11,0,0,8,7,10,0,0,8,7,9,0,0,8,7,8,0,0,8,7,7,0,0,8,7,6,0,0,8,7,5,0,0,8,7,4,0,0,8,7,3,0,0,8,7,2,0,0,8,7,1,0,0,8,7,0,0,0,8,7,-1,0,0,8,7,-2,0,0,8,7,-3,0,0,8,7,-4,0,0,8,7,-5,0,0,8,6,14,0,0,8,6,13,0,0,8,6,12,0,0,8,6,11,0,0,8,6,10,0,0,8,6,9,0,0,8,6,8,0,0,8,6,7,0,0,8,6,6,0,0,8,6,5,0,0,8,6,4,0,0,8,6,3,0,0,8,6,2,0,0,8,6,1,0,0,8,6,0,0,0,8,6,-1,0,0,8,6,-2,0,0,8,6,-3,0,0,8,6,-4,0,0,8,6,-5,0,0,8,5,14,0,0,8,5,13,0,0,8,5,12,0,0,8,5,11,0,0,8,5,10,0,0,8,5,9,0,0,8,5,8,0,0,8,5,7,0,0,8,5,6,0,0,8,5,5,0,0,8,5,4,0,0,8,5,3,0,0,8,5,2,0,0,8,5,1,0,0,8,5,0,0,0,8,5,-1,0,0,8,5,-2,0,0,8,5,-3,0,0,8,5,-4,0,0,8,5,-5,0,0,8,4,14,0,0,8,4,13,0,0,8,4,12,0,0,8,4,11,0,0,8,4,10,0,0,8,4,9,0,0,8,4,8,0,0,8,4,7,0,0,8,4,6,0,0,8,4,5,0,0,8,4,4,0,0,8,4,3,0,0,8,4,2,0,0,8,4,1,0,0,8,4,0,0,0,8,4,-1,0,0,8,4,-2,0,0,8,4,-3,0,0,8,4,-4,0,0,8,4,-5,0,0,8,3,14,0,0,8,3,13,0,0,8,3,12,0,0,8,3,11,0,0,8,3,10,0,0,8,3,9,0,0,8,3,8,0,0,8,3,7,0,0,8,3,6,0,0,8,3,5,0,0,8,3,4,0,0,8,3,3,0,0,8,3,2,0,0,8,3,1,0,0,8,3,0,0,0,8,3,-1,0,0,8,3,-2,0,0,8,3,-3,0,0,8,3,-4,0,0,8,3,-5,0,0,8,2,14,0,0,8,2,13,0,0,8,2,12,0,0,8,2,11,0,0,8,2,10,0,0,8,2,9,0,0,8,2,8,0,0,8,2,7,0,0,8,2,6,0,0,8,2,5,0,0,8,2,4,0,0,8,2,3,0,0,8,2,2,0,0,8,2,1,0,0,8,2,0,0,0,8,2,-1,0,0,8,2,-2,0,0,8,2,-3,0,0,8,2,-4,0,0,8,2,-5,0,0,8,-3,9,0,0,8,-3,8,0,0,8,-3,7,0,0,8,-3,6,0,0,8,-3,5,0,0,8,-3,4,0,0,8,-3,3,0,0,8,-4,9,0,0,8,-4,8,0,0,8,-4,7,0,0,8,-4,6,0,0,8,-4,5,0,0,8,-4,4,0,0,8,-4,3,0,0,8,-4,2,0,0,8,-4,1,0,0,8,-4,0,0,0,8,-4,-1,0,0,8,-4,-2,0,0,8,-4,-3,0,0,8,-4,-4,0,0,8,-4,-5,0,0,8,-5,9,0,0,8,-5,8,0,0,8,-5,7,0,0,8,-5,6,0,0,8,-5,5,0,0,8,-5,4,0,0,8,-5,3,0,0,8,-5,2,0,0,8,-5,1,0,0,8,-5,0,0,0,8,-5,-1,0,0,8,-5,-2,0,0,8,-5,-3,0,0,8,-5,-4,0,0,8,-5,-5,0,0,8,-6,9,0,0,8,-6,8,0,0,8,-6,7,0,0,8,-6,6,0,0,8,-6,5,0,0,8,-6,4,0,0,8,-6,3,0,0,8,-6,2,0,0,8,-6,1,0,0,8,-6,0,0,0,8,-6,-1,0,0,8,-6,-2,0,0,8,-6,-3,0,0,8,-6,-4,0,0,8,-6,-5,0,0,8,-7,9,0,0,8,-7,8,0,0,8,-7,7,0,0,8,-7,6,0,0,8,-7,5,0,0,8,-7,4,0,0,8,-7,3,0,0,8,-7,2,0,0,8,-7,1,0,0,8,-7,0,0,0,8,-7,-1,0,0,8,-7,-2,0,0,8,-7,-3,0,0,8,-7,-4,0,0,8,-7,-5,0,0,8,1,14,0,0,8,1,13,0,0,8,1,12,0,0,8,1,11,0,0,8,1,10,0,0,8,1,9,0,0,8,1,8,0,0,8,1,7,0,0,8,1,6,0,0,8,1,5,0,0,8,1,4,0,0,8,1,3,0,0,8,0,14,0,0,8,0,13,0,0,8,0,12,0,0,8,0,11,0,0,8,0,10,0,0,8,0,9,0,0,8,0,8,0,0,8,0,7,0,0,8,0,6,0,0,8,0,5,0,0,8,0,4,0,0,8,0,3,0,0,8,-1,14,0,0,8,-1,13,0,0,8,-1,12,0,0,8,-1,8,0,0,8,-1,7,0,0,8,-1,6,0,0,8,-1,5,0,0,8,-1,4,0,0,8,-1,3,0,0,8,-2,8,0,0,8,-2,7,0,0,8,-2,6,0,0,8,-2,5,0,0,8,-2,4,0,0,8,-2,3,0,0,8],"Middle":[-7,-6,0,2,7,-6,-6,0,2,7,-5,-6,0,2,7,-4,-6,0,2,7,-3,2,0,1,7,-2,2,0,2,7,-1,2,0,2,7,-1,11,0,3,7,0,2,0,2,7,1,2,0,3,7,2,-6,0,2,7,3,-6,0,2,7,4,-6,0,2,7,5,-6,0,2,7,6,-6,0,2,7,7,-6,0,2,7,8,-6,0,2,7,8,9,0,1,7,9,-6,0,2,7,9,9,0,2,7,10,-6,0,2,7,10,9,0,2,7,11,-6,0,2,7,11,9,0,2,7,12,-6,0,2,7,12,9,0,2,7,13,-6,0,2,7,13,9,0,2,7,14,-6,0,2,7,14,9,0,2,7,15,-6,0,2,7,15,9,0,2,7],"Top":[-8,-6,0,3,4,-8,-5,0,3,3,-8,-4,0,3,3,-8,-3,0,3,3,-8,-2,0,3,3,-8,-1,0,3,3,-8,0,0,3,3,-8,1,0,3,3,-8,2,0,3,3,-8,3,0,3,3,-8,4,0,3,3,-8,5,0,3,3,-8,6,0,3,3,-8,7,0,3,3,-8,8,0,3,3,-8,9,0,3,3,-8,10,0,11,2,-7,10,0,2,2,-6,10,0,2,2,-5,10,0,2,2,-4,10,0,2,2,-3,-6,0,1,4,-3,-5,0,1,3,-3,-4,0,1,3,-3,-3,0,1,3,-3,-2,0,1,3,-3,-1,0,1,3,-3,0,0,1,3,-3,1,0,1,3,-3,10,0,2,2,-2,9,0,1,2,-2,10,0,13,2,-2,11,0,3,4,-2,12,0,3,3,-2,13,0,3,3,-2,14,0,3,3,-2,15,0,11,2,-1,9,0,3,2,-1,10,0,3,3,-1,15,0,2,2,0,15,0,2,2,1,-6,0,3,4,1,-5,0,3,3,1,-4,0,3,3,1,-3,0,3,3,1,-2,0,3,3,1,-1,0,3,3,1,0,0,3,3,1,1,0,3,3,1,15,0,2,2,2,15,0,2,2,3,15,0,2,2,4,15,0,2,2,5,15,0,2,2,6,15,0,2,2,7,15,0,2,2,8,2,0,1,2,8,3,0,1,3,8,4,0,1,3,8,5,0,1,3,8,6,0,1,3,8,7,0,1,3,8,8,0,1,3,8,15,0,2,2,9,2,0,2,2,9,15,0,2,2,10,2,0,2,2,10,15,0,2,2,11,2,0,2,2,11,15,0,2,2,12,2,0,2,2,12,15,0,2,2,13,2,0,2,2,13,15,0,2,2,14,2,0,2,2,14,15,0,2,2,15,2,0,2,2,15,15,0,2,2,16,-6,0,1,4,16,-5,0,1,3,16,-4,0,1,3,16,-3,0,1,3,16,-2,0,1,3,16,-1,0,1,3,16,0,0,1,3,16,1,0,1,3,16,2,0,13,2,16,9,0,1,4,16,10,0,1,3,16,11,0,1,3,16,12,0,1,3,16,13,0,1,3,16,14,0,1,3,16,15,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preinstall.json deleted file mode 100644 index 3734766..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test12","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":406,"Y":427},"Size":{"X":66,"Y":54},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0001","CurrAmmon":"30","ResidueAmmo":"30"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":250,"Y":439},"Size":{"X":98,"Y":68},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0001","CurrAmmon":"30","ResidueAmmo":"30"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":329,"Y":370},"Size":{"X":44,"Y":65},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0001","CurrAmmon":"30","ResidueAmmo":"30"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":317,"Y":196},"Size":{"X":201,"Y":60},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":220,"Y":317},"Size":{"X":39,"Y":134},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":473,"Y":302},"Size":{"X":61,"Y":111},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":285,"Y":426},"Size":{"X":149,"Y":56},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":468,"Y":324},"Size":{"X":66,"Y":110},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":346,"Y":371},"Size":{"X":17,"Y":94},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":387,"Y":200},"Size":{"X":82,"Y":36},"SpecialMarkType":0,"DelayTime":2.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":246,"Y":175},"Size":{"X":84,"Y":65},"SpecialMarkType":0,"DelayTime":3,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":325,"Y":417},"Size":{"X":41,"Y":45},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0006","CurrAmmon":"20","ResidueAmmo":"20"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":443,"Y":242},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0006","CurrAmmon":"20","ResidueAmmo":"20"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":241,"Y":227},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0006","CurrAmmon":"20","ResidueAmmo":"20"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png deleted file mode 100644 index 7276ff0..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png.import deleted file mode 100644 index 792054f..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b3m084aaip558" -path="res://.godot/imported/Preview.png-8c476da21cd7f2ad84205fc0a7e6692d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle3/Preview.png" -dest_files=["res://.godot/imported/Preview.png-8c476da21cd7f2ad84205fc0a7e6692d.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/tileMaps/TestGroup1/battle/Battle3/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/RoomInfo.json deleted file mode 100644 index 61b84dc..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":10,"Y":6},"Size":{"X":24,"Y":25},"DoorAreaInfos":[{"Direction":1,"Start":0,"End":368},{"Direction":3,"Start":0,"End":208},{"Direction":0,"Start":96,"End":272},{"Direction":2,"Start":0,"End":144}],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle3","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/TileInfo.json deleted file mode 100644 index c0ec3fa..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle3/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[184,120,376,120,376,152,440,152,440,216,520,216,520,384,456,384,456,464,312,464,312,480,184,480]},{"Type":1,"Points":[264,240,392,240,392,256,408,256,408,272,424,272,424,344,408,344,408,392,360,392,360,328,296,328,296,312,280,312,280,392,232,392,232,272,248,272,248,256,264,256]}],"Floor":[32,23,0,0,8,32,22,0,0,8,32,21,0,0,8,32,20,0,0,8,32,19,0,0,8,32,18,0,0,8,32,17,0,0,8,32,16,0,0,8,32,15,0,0,8,32,14,0,0,8,32,13,0,0,8,31,23,0,0,8,31,22,0,0,8,31,21,0,0,8,31,20,0,0,8,31,19,0,0,8,31,18,0,0,8,31,17,0,0,8,31,16,0,0,8,31,15,0,0,8,31,14,0,0,8,31,13,0,0,8,30,23,0,0,8,30,22,0,0,8,30,21,0,0,8,30,20,0,0,8,30,19,0,0,8,30,18,0,0,8,30,17,0,0,8,30,16,0,0,8,30,15,0,0,8,30,14,0,0,8,30,13,0,0,8,29,23,0,0,8,29,22,0,0,8,29,21,0,0,8,29,20,0,0,8,29,19,0,0,8,29,18,0,0,8,29,17,0,0,8,29,16,0,0,8,29,15,0,0,8,29,14,0,0,8,29,13,0,0,8,28,28,0,0,8,28,27,0,0,8,28,26,0,0,8,28,25,0,0,8,28,24,0,0,8,28,23,0,0,8,28,22,0,0,8,28,21,0,0,8,28,20,0,0,8,28,19,0,0,8,28,18,0,0,8,28,17,0,0,8,28,16,0,0,8,28,15,0,0,8,28,14,0,0,8,28,13,0,0,8,27,28,0,0,8,27,27,0,0,8,27,26,0,0,8,27,25,0,0,8,27,24,0,0,8,27,23,0,0,8,27,22,0,0,8,27,21,0,0,8,27,20,0,0,8,27,19,0,0,8,27,18,0,0,8,27,17,0,0,8,27,16,0,0,8,27,15,0,0,8,27,14,0,0,8,27,13,0,0,8,27,9,0,0,8,27,10,0,0,8,27,11,0,0,8,27,12,0,0,8,26,28,0,0,8,26,27,0,0,8,26,26,0,0,8,26,25,0,0,8,26,24,0,0,8,26,23,0,0,8,26,22,0,0,8,26,21,0,0,8,26,20,0,0,8,26,19,0,0,8,26,18,0,0,8,26,17,0,0,8,26,16,0,0,8,26,15,0,0,8,26,14,0,0,8,26,13,0,0,8,26,9,0,0,8,26,10,0,0,8,26,11,0,0,8,26,12,0,0,8,25,28,0,0,8,25,27,0,0,8,25,26,0,0,8,25,25,0,0,8,25,24,0,0,8,25,23,0,0,8,25,22,0,0,8,25,21,0,0,8,25,16,0,0,8,25,15,0,0,8,25,14,0,0,8,25,13,0,0,8,25,9,0,0,8,25,10,0,0,8,25,11,0,0,8,25,12,0,0,8,24,28,0,0,8,24,27,0,0,8,24,26,0,0,8,24,25,0,0,8,24,24,0,0,8,24,15,0,0,8,24,14,0,0,8,24,13,0,0,8,24,9,0,0,8,24,10,0,0,8,24,11,0,0,8,24,12,0,0,8,23,28,0,0,8,23,27,0,0,8,23,26,0,0,8,23,25,0,0,8,23,24,0,0,8,23,14,0,0,8,23,13,0,0,8,23,7,0,0,8,23,8,0,0,8,23,9,0,0,8,23,10,0,0,8,23,11,0,0,8,23,12,0,0,8,22,28,0,0,8,22,27,0,0,8,22,26,0,0,8,22,25,0,0,8,22,24,0,0,8,22,23,0,0,8,22,22,0,0,8,22,21,0,0,8,22,20,0,0,8,22,7,0,0,8,22,8,0,0,8,22,9,0,0,8,22,10,0,0,8,22,11,0,0,8,22,12,0,0,8,22,13,0,0,8,22,14,0,0,8,21,28,0,0,8,21,27,0,0,8,21,26,0,0,8,21,25,0,0,8,21,24,0,0,8,21,23,0,0,8,21,22,0,0,8,21,21,0,0,8,21,20,0,0,8,21,7,0,0,8,21,8,0,0,8,21,9,0,0,8,21,10,0,0,8,21,11,0,0,8,21,12,0,0,8,21,13,0,0,8,21,14,0,0,8,20,28,0,0,8,20,27,0,0,8,20,26,0,0,8,20,25,0,0,8,20,24,0,0,8,20,23,0,0,8,20,22,0,0,8,20,21,0,0,8,20,20,0,0,8,20,7,0,0,8,20,8,0,0,8,20,9,0,0,8,20,10,0,0,8,20,11,0,0,8,20,12,0,0,8,20,13,0,0,8,20,14,0,0,8,19,29,0,0,8,19,28,0,0,8,19,27,0,0,8,19,26,0,0,8,19,25,0,0,8,19,24,0,0,8,19,23,0,0,8,19,22,0,0,8,19,21,0,0,8,19,20,0,0,8,19,7,0,0,8,19,8,0,0,8,19,9,0,0,8,19,10,0,0,8,19,11,0,0,8,19,12,0,0,8,19,13,0,0,8,19,14,0,0,8,18,19,0,0,8,18,29,0,0,8,18,28,0,0,8,18,27,0,0,8,18,26,0,0,8,18,25,0,0,8,18,24,0,0,8,18,23,0,0,8,18,22,0,0,8,18,21,0,0,8,18,20,0,0,8,18,7,0,0,8,18,8,0,0,8,18,9,0,0,8,18,10,0,0,8,18,11,0,0,8,18,12,0,0,8,18,13,0,0,8,18,14,0,0,8,17,19,0,0,8,17,23,0,0,8,17,22,0,0,8,17,21,0,0,8,17,20,0,0,8,17,29,0,0,8,17,28,0,0,8,17,27,0,0,8,17,26,0,0,8,17,25,0,0,8,17,24,0,0,8,17,7,0,0,8,17,8,0,0,8,17,9,0,0,8,17,10,0,0,8,17,11,0,0,8,17,12,0,0,8,17,13,0,0,8,17,14,0,0,8,16,29,0,0,8,16,28,0,0,8,16,27,0,0,8,16,26,0,0,8,16,25,0,0,8,16,24,0,0,8,16,7,0,0,8,16,8,0,0,8,16,9,0,0,8,16,10,0,0,8,16,11,0,0,8,16,12,0,0,8,16,13,0,0,8,16,14,0,0,8,16,15,0,0,8,15,29,0,0,8,15,28,0,0,8,15,27,0,0,8,15,26,0,0,8,15,25,0,0,8,15,24,0,0,8,15,7,0,0,8,15,8,0,0,8,15,9,0,0,8,15,10,0,0,8,15,11,0,0,8,15,12,0,0,8,15,13,0,0,8,15,14,0,0,8,15,15,0,0,8,15,16,0,0,8,14,29,0,0,8,14,28,0,0,8,14,27,0,0,8,14,26,0,0,8,14,25,0,0,8,14,24,0,0,8,14,23,0,0,8,14,22,0,0,8,14,21,0,0,8,14,20,0,0,8,14,7,0,0,8,14,8,0,0,8,14,9,0,0,8,14,10,0,0,8,14,11,0,0,8,14,12,0,0,8,14,13,0,0,8,14,14,0,0,8,14,15,0,0,8,14,16,0,0,8,14,17,0,0,8,14,18,0,0,8,14,19,0,0,8,13,29,0,0,8,13,28,0,0,8,13,27,0,0,8,13,26,0,0,8,13,25,0,0,8,13,24,0,0,8,13,23,0,0,8,13,22,0,0,8,13,21,0,0,8,13,20,0,0,8,13,7,0,0,8,13,8,0,0,8,13,9,0,0,8,13,10,0,0,8,13,11,0,0,8,13,12,0,0,8,13,13,0,0,8,13,14,0,0,8,13,15,0,0,8,13,16,0,0,8,13,17,0,0,8,13,18,0,0,8,13,19,0,0,8,12,29,0,0,8,12,28,0,0,8,12,27,0,0,8,12,26,0,0,8,12,25,0,0,8,12,24,0,0,8,12,23,0,0,8,12,22,0,0,8,12,21,0,0,8,12,20,0,0,8,12,7,0,0,8,12,8,0,0,8,12,9,0,0,8,12,10,0,0,8,12,11,0,0,8,12,12,0,0,8,12,13,0,0,8,12,14,0,0,8,12,15,0,0,8,12,16,0,0,8,12,17,0,0,8,12,18,0,0,8,12,19,0,0,8,11,29,0,0,8,11,28,0,0,8,11,27,0,0,8,11,26,0,0,8,11,25,0,0,8,11,24,0,0,8,11,23,0,0,8,11,22,0,0,8,11,21,0,0,8,11,20,0,0,8,11,7,0,0,8,11,8,0,0,8,11,9,0,0,8,11,10,0,0,8,11,11,0,0,8,11,12,0,0,8,11,13,0,0,8,11,14,0,0,8,11,15,0,0,8,11,16,0,0,8,11,17,0,0,8,11,18,0,0,8,11,19,0,0,8],"Middle":[11,6,0,2,7,12,6,0,2,7,13,6,0,2,7,14,6,0,2,7,15,6,0,2,7,15,23,0,1,7,16,6,0,2,7,16,23,0,3,7,17,6,0,2,7,17,18,0,2,7,18,6,0,2,7,18,18,0,2,7,19,6,0,2,7,19,19,0,1,7,20,6,0,2,7,20,19,0,2,7,21,6,0,2,7,21,19,0,2,7,22,6,0,2,7,22,19,0,2,7,23,6,0,2,7,23,23,0,1,7,24,8,0,1,7,24,23,0,3,7,25,8,0,2,7,25,20,0,3,7,26,8,0,2,7,27,8,0,2,7,28,12,0,1,7,29,12,0,2,7,30,12,0,2,7,31,12,0,2,7,32,12,0,2,7],"Top":[10,6,0,3,4,10,7,0,3,3,10,8,0,3,3,10,9,0,3,3,10,10,0,3,3,10,11,0,3,3,10,12,0,3,3,10,13,0,3,3,10,14,0,3,3,10,15,0,3,3,10,16,0,3,3,10,17,0,3,3,10,18,0,3,3,10,19,0,3,3,10,20,0,3,3,10,21,0,3,3,10,22,0,3,3,10,23,0,3,3,10,24,0,3,3,10,25,0,3,3,10,26,0,3,3,10,27,0,3,3,10,28,0,3,3,10,29,0,3,3,10,30,0,11,2,11,30,0,2,2,12,30,0,2,2,13,30,0,2,2,14,30,0,2,2,15,17,0,1,2,15,18,0,1,3,15,19,0,1,3,15,20,0,1,3,15,21,0,1,3,15,22,0,1,3,15,30,0,2,2,16,16,0,1,2,16,17,0,13,2,16,18,0,3,4,16,19,0,3,3,16,20,0,3,3,16,21,0,3,3,16,22,0,3,3,16,30,0,2,2,17,15,0,1,2,17,16,0,13,2,17,30,0,2,2,18,15,0,2,2,18,30,0,2,2,19,15,0,2,2,19,18,0,1,4,19,30,0,2,2,20,15,0,2,2,20,29,0,1,2,20,30,0,13,2,21,15,0,2,2,21,29,0,2,2,22,15,0,2,2,22,29,0,2,2,23,15,0,3,2,23,16,0,11,2,23,19,0,1,4,23,20,0,1,3,23,21,0,1,3,23,22,0,1,3,23,29,0,2,2,24,6,0,1,4,24,7,0,1,3,24,16,0,3,2,24,17,0,11,2,24,20,0,3,4,24,21,0,3,3,24,22,0,3,3,24,29,0,2,2,25,17,0,3,2,25,18,0,3,3,25,19,0,3,3,25,29,0,2,2,26,29,0,2,2,27,29,0,2,2,28,8,0,1,4,28,9,0,1,3,28,10,0,1,3,28,11,0,1,3,28,29,0,2,2,29,24,0,1,2,29,25,0,1,3,29,26,0,1,3,29,27,0,1,3,29,28,0,1,3,29,29,0,13,2,30,24,0,2,2,31,24,0,2,2,32,24,0,2,2,33,12,0,1,4,33,13,0,1,3,33,14,0,1,3,33,15,0,1,3,33,16,0,1,3,33,17,0,1,3,33,18,0,1,3,33,19,0,1,3,33,20,0,1,3,33,21,0,1,3,33,22,0,1,3,33,23,0,1,3,33,24,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preinstall.json deleted file mode 100644 index 3ca0692..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"Test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-138,"Y":82},"Size":{"X":36,"Y":48},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":60,"Y":145},"Size":{"X":40,"Y":51},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-66,"Y":-6},"Size":{"X":51,"Y":49},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-2,"Y":-54},"Size":{"X":75,"Y":37},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":-182,"Y":105},"Size":{"X":59,"Y":26},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0005","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-162,"Y":27},"Size":{"X":42,"Y":37},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0003","CurrAmmon":"12","ResidueAmmo":"12"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":48,"Y":21},"Size":{"X":16,"Y":91},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0005","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-52,"Y":155},"Size":{"X":106,"Y":41},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png deleted file mode 100644 index a8f84c1..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png.import deleted file mode 100644 index 9e4ef59..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://x2ytkmtkn53s" -path="res://.godot/imported/Preview.png-8f3c76ec034bcd9156b51bf3b67fca71.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle4/Preview.png" -dest_files=["res://.godot/imported/Preview.png-8f3c76ec034bcd9156b51bf3b67fca71.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/tileMaps/TestGroup1/battle/Battle4/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/RoomInfo.json deleted file mode 100644 index a698207..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-16,"Y":-15},"Size":{"X":26,"Y":31},"DoorAreaInfos":[{"Direction":0,"Start":128,"End":272},{"Direction":2,"Start":144,"End":304},{"Direction":1,"Start":208,"End":368},{"Direction":3,"Start":80,"End":192}],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle4","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/TileInfo.json deleted file mode 100644 index 859f5fd..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle4/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-152,-216,-56,-216,-56,-88,136,-88,136,48,104,48,104,208,56,208,56,240,-88,240,-88,192,-136,192,-136,144,-232,144,-232,-8,-120,-8,-120,-48,-152,-48]},{"Type":1,"Points":[-24,-16,24,-16,24,88,8,88,8,104,-8,104,-8,120,-88,120,-88,32,-40,32,-40,48,-24,48]}],"Floor":[-2,-2,0,0,8,-1,-2,0,0,8,0,-2,0,0,8,1,-2,0,0,8,2,-2,0,0,8,3,-2,0,0,8,4,-2,0,0,8,5,-2,0,0,8,6,-2,0,0,8,7,-2,0,0,8,-8,-6,0,0,8,-8,-5,0,0,8,-8,-4,0,0,8,-8,-3,0,0,8,-8,-2,0,0,8,-8,-1,0,0,8,-8,0,0,0,8,-8,1,0,0,8,-8,2,0,0,8,-7,-6,0,0,8,-7,-5,0,0,8,-7,-4,0,0,8,-7,-3,0,0,8,-7,-2,0,0,8,-7,-1,0,0,8,-7,0,0,0,8,-7,1,0,0,8,-7,2,0,0,8,-6,-6,0,0,8,-6,-5,0,0,8,-6,-4,0,0,8,-6,-3,0,0,8,-6,-2,0,0,8,-6,-1,0,0,8,-6,0,0,0,8,-6,1,0,0,8,-6,2,0,0,8,-5,-6,0,0,8,-5,-5,0,0,8,-5,-4,0,0,8,-5,-3,0,0,8,-5,-2,0,0,8,-5,-1,0,0,8,-5,0,0,0,8,-5,1,0,0,8,-4,-6,0,0,8,-4,-5,0,0,8,-4,-4,0,0,8,-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,0,0,0,8,-4,1,0,0,8,-3,-6,0,0,8,-3,-5,0,0,8,-3,-4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-2,-6,0,0,8,-2,-5,0,0,8,-2,-4,0,0,8,-2,-3,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-1,-6,0,0,8,-1,-5,0,0,8,-1,-4,0,0,8,-1,-3,0,0,8,0,-6,0,0,8,0,-5,0,0,8,0,-4,0,0,8,0,-3,0,0,8,1,-6,0,0,8,1,-5,0,0,8,1,-4,0,0,8,1,-3,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,2,-6,0,0,8,2,-5,0,0,8,2,-4,0,0,8,2,-3,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,1,0,0,8,2,2,0,0,8,3,-6,0,0,8,3,-5,0,0,8,3,-4,0,0,8,3,-3,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,1,0,0,8,3,2,0,0,8,4,-6,0,0,8,4,-5,0,0,8,4,-4,0,0,8,4,-3,0,0,8,4,-1,0,0,8,4,0,0,0,8,4,1,0,0,8,4,2,0,0,8,5,-6,0,0,8,5,-5,0,0,8,5,-4,0,0,8,5,-3,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,6,-6,0,0,8,6,-5,0,0,8,6,-4,0,0,8,6,-3,0,0,8,6,-1,0,0,8,6,0,0,0,8,6,1,0,0,8,6,2,0,0,8,7,-6,0,0,8,7,-5,0,0,8,7,-4,0,0,8,7,-3,0,0,8,7,-1,0,0,8,7,0,0,0,8,7,1,0,0,8,7,2,0,0,8,8,-6,0,0,8,8,-5,0,0,8,8,-4,0,0,8,8,-3,0,0,8,8,-2,0,0,8,8,-1,0,0,8,8,0,0,0,8,8,1,0,0,8,8,2,0,0,8,0,5,0,0,8,0,6,0,0,8,0,7,0,0,8,0,8,0,0,8,1,3,0,0,8,1,4,0,0,8,1,5,0,0,8,1,6,0,0,8,1,7,0,0,8,1,8,0,0,8,2,3,0,0,8,2,4,0,0,8,2,5,0,0,8,2,6,0,0,8,2,7,0,0,8,2,8,0,0,8,3,3,0,0,8,3,4,0,0,8,3,5,0,0,8,3,6,0,0,8,3,7,0,0,8,3,8,0,0,8,4,3,0,0,8,4,4,0,0,8,4,5,0,0,8,4,6,0,0,8,4,7,0,0,8,4,8,0,0,8,5,3,0,0,8,5,4,0,0,8,5,5,0,0,8,5,6,0,0,8,5,7,0,0,8,5,8,0,0,8,6,3,0,0,8,6,4,0,0,8,6,5,0,0,8,6,6,0,0,8,6,7,0,0,8,6,8,0,0,8,-10,-14,0,0,8,-10,-13,0,0,8,-10,-12,0,0,8,-10,-11,0,0,8,-10,-10,0,0,8,-10,-9,0,0,8,-10,-8,0,0,8,-10,-7,0,0,8,-10,-6,0,0,8,-10,-5,0,0,8,-10,-4,0,0,8,-9,-14,0,0,8,-9,-13,0,0,8,-9,-12,0,0,8,-9,-11,0,0,8,-9,-10,0,0,8,-9,-9,0,0,8,-9,-8,0,0,8,-9,-7,0,0,8,-9,-6,0,0,8,-9,-5,0,0,8,-9,-4,0,0,8,-8,-14,0,0,8,-8,-13,0,0,8,-8,-12,0,0,8,-8,-11,0,0,8,-8,-10,0,0,8,-8,-9,0,0,8,-8,-8,0,0,8,-8,-7,0,0,8,-7,-14,0,0,8,-7,-13,0,0,8,-7,-12,0,0,8,-7,-11,0,0,8,-7,-10,0,0,8,-7,-9,0,0,8,-7,-8,0,0,8,-7,-7,0,0,8,-6,-14,0,0,8,-6,-13,0,0,8,-6,-12,0,0,8,-6,-11,0,0,8,-6,-10,0,0,8,-6,-9,0,0,8,-6,-8,0,0,8,-6,-7,0,0,8,-5,-14,0,0,8,-5,-13,0,0,8,-5,-12,0,0,8,-5,-11,0,0,8,-5,-10,0,0,8,-5,-9,0,0,8,-5,-8,0,0,8,-5,-7,0,0,8,-4,-14,0,0,8,-4,-13,0,0,8,-4,-12,0,0,8,-4,-11,0,0,8,-4,-10,0,0,8,-4,-9,0,0,8,-4,-8,0,0,8,-4,-7,0,0,8,-15,-1,0,0,8,-15,0,0,0,8,-15,1,0,0,8,-15,2,0,0,8,-15,3,0,0,8,-15,4,0,0,8,-15,5,0,0,8,-15,6,0,0,8,-15,7,0,0,8,-15,8,0,0,8,-14,-1,0,0,8,-14,0,0,0,8,-14,1,0,0,8,-14,2,0,0,8,-14,3,0,0,8,-14,4,0,0,8,-14,5,0,0,8,-14,6,0,0,8,-14,7,0,0,8,-14,8,0,0,8,-13,-1,0,0,8,-13,0,0,0,8,-13,1,0,0,8,-13,2,0,0,8,-13,3,0,0,8,-13,4,0,0,8,-13,5,0,0,8,-13,6,0,0,8,-13,7,0,0,8,-13,8,0,0,8,-12,-1,0,0,8,-12,0,0,0,8,-12,1,0,0,8,-12,2,0,0,8,-12,3,0,0,8,-12,4,0,0,8,-12,5,0,0,8,-12,6,0,0,8,-12,7,0,0,8,-12,8,0,0,8,-11,-1,0,0,8,-11,0,0,0,8,-11,1,0,0,8,-11,2,0,0,8,-11,3,0,0,8,-11,4,0,0,8,-11,5,0,0,8,-11,6,0,0,8,-11,7,0,0,8,-11,8,0,0,8,-10,-1,0,0,8,-10,0,0,0,8,-10,1,0,0,8,-10,2,0,0,8,-10,3,0,0,8,-10,4,0,0,8,-10,5,0,0,8,-10,6,0,0,8,-10,7,0,0,8,-10,8,0,0,8,-9,-1,0,0,8,-9,0,0,0,8,-9,1,0,0,8,-9,2,0,0,8,-9,3,0,0,8,-9,4,0,0,8,-9,5,0,0,8,-9,6,0,0,8,-9,7,0,0,8,-9,8,0,0,8,-8,3,0,0,8,-8,4,0,0,8,-8,5,0,0,8,-8,6,0,0,8,-8,7,0,0,8,-8,8,0,0,8,-7,3,0,0,8,-7,4,0,0,8,-7,5,0,0,8,-7,6,0,0,8,-7,7,0,0,8,-7,8,0,0,8,-6,3,0,0,8,-6,4,0,0,8,-6,5,0,0,8,-6,6,0,0,8,-6,7,0,0,8,-6,8,0,0,8,-5,7,0,0,8,-5,8,0,0,8,-4,7,0,0,8,-4,8,0,0,8,-4,9,0,0,8,-4,10,0,0,8,-4,11,0,0,8,-4,12,0,0,8,-3,7,0,0,8,-3,8,0,0,8,-3,9,0,0,8,-3,10,0,0,8,-3,11,0,0,8,-3,12,0,0,8,-2,7,0,0,8,-2,8,0,0,8,-2,9,0,0,8,-2,10,0,0,8,-2,11,0,0,8,-2,12,0,0,8,-1,6,0,0,8,-1,7,0,0,8,-1,8,0,0,8,-1,9,0,0,8,-1,10,0,0,8,-1,11,0,0,8,-1,12,0,0,8,0,9,0,0,8,0,10,0,0,8,0,11,0,0,8,0,12,0,0,8,1,9,0,0,8,1,10,0,0,8,1,11,0,0,8,1,12,0,0,8,2,9,0,0,8,2,10,0,0,8,2,11,0,0,8,2,12,0,0,8,-6,9,0,0,8,-6,10,0,0,8,-6,11,0,0,8,-6,12,0,0,8,-6,13,0,0,8,-6,14,0,0,8,-5,9,0,0,8,-5,10,0,0,8,-5,11,0,0,8,-5,12,0,0,8,-5,13,0,0,8,-5,14,0,0,8,-4,13,0,0,8,-4,14,0,0,8,-9,9,0,0,8,-9,10,0,0,8,-9,11,0,0,8,-8,9,0,0,8,-8,10,0,0,8,-8,11,0,0,8,-7,9,0,0,8,-7,10,0,0,8,-7,11,0,0,8,3,9,0,0,8,3,10,0,0,8,3,11,0,0,8,3,12,0,0,8,4,9,0,0,8,4,10,0,0,8,4,11,0,0,8,4,12,0,0,8,5,9,0,0,8,5,10,0,0,8,5,11,0,0,8,5,12,0,0,8,6,9,0,0,8,6,10,0,0,8,6,11,0,0,8,6,12,0,0,8,-3,13,0,0,8,-3,14,0,0,8,-2,13,0,0,8,-2,14,0,0,8,-1,13,0,0,8,-1,14,0,0,8,0,13,0,0,8,0,14,0,0,8,1,13,0,0,8,1,14,0,0,8,2,13,0,0,8,2,14,0,0,8,3,13,0,0,8,3,14,0,0,8,-3,2,0,0,8],"Middle":[-15,-2,0,2,7,-14,-2,0,2,7,-13,-2,0,2,7,-12,-2,0,2,7,-11,-2,0,2,7,-10,-15,0,2,7,-10,-2,0,2,7,-9,-15,0,2,7,-9,-2,0,3,7,-8,-15,0,2,7,-7,-15,0,2,7,-6,-15,0,2,7,-5,-15,0,2,7,-5,6,0,1,7,-4,-15,0,2,7,-4,6,0,2,7,-3,-7,0,1,7,-3,6,0,2,7,-2,-7,0,2,7,-2,6,0,3,7,-1,-7,0,2,7,-1,5,0,3,7,0,-7,0,2,7,0,4,0,3,7,1,-7,0,2,7,2,-7,0,2,7,3,-7,0,2,7,4,-7,0,2,7,5,-7,0,2,7,6,-7,0,2,7,7,-7,0,2,7,8,-7,0,2,7],"Top":[-16,-2,0,3,4,-16,-1,0,3,3,-16,0,0,3,3,-16,1,0,3,3,-16,2,0,3,3,-16,3,0,3,3,-16,4,0,3,3,-16,5,0,3,3,-16,6,0,3,3,-16,7,0,3,3,-16,8,0,3,3,-16,9,0,11,2,-15,9,0,2,2,-14,9,0,2,2,-13,9,0,2,2,-12,9,0,2,2,-11,-15,0,3,4,-11,-14,0,3,3,-11,-13,0,3,3,-11,-12,0,3,3,-11,-11,0,3,3,-11,-10,0,3,3,-11,-9,0,3,3,-11,-8,0,3,3,-11,-7,0,3,3,-11,-6,0,3,3,-11,-5,0,3,3,-11,-4,0,3,3,-11,-3,0,11,2,-11,9,0,2,2,-10,-3,0,2,2,-10,9,0,3,2,-10,10,0,3,3,-10,11,0,3,3,-10,12,0,11,2,-9,-3,0,3,2,-9,12,0,2,2,-8,12,0,2,2,-7,12,0,3,2,-7,13,0,3,3,-7,14,0,3,3,-7,15,0,11,2,-6,15,0,2,2,-5,2,0,1,2,-5,3,0,1,3,-5,4,0,1,3,-5,5,0,1,3,-5,15,0,2,2,-4,2,0,3,2,-4,3,0,11,2,-4,15,0,2,2,-3,-15,0,1,4,-3,-14,0,1,3,-3,-13,0,1,3,-3,-12,0,1,3,-3,-11,0,1,3,-3,-10,0,1,3,-3,-9,0,1,3,-3,-8,0,1,3,-3,3,0,2,2,-3,15,0,2,2,-2,3,0,2,2,-2,5,0,3,4,-2,15,0,2,2,-1,-1,0,1,2,-1,0,0,1,3,-1,1,0,1,3,-1,2,0,1,3,-1,3,0,13,2,-1,4,0,3,4,-1,15,0,2,2,0,-1,0,3,2,0,0,0,3,3,0,1,0,3,3,0,2,0,3,3,0,3,0,3,3,0,15,0,2,2,1,15,0,2,2,2,15,0,2,2,3,15,0,2,2,4,13,0,1,2,4,14,0,1,3,4,15,0,13,2,5,13,0,2,2,6,13,0,2,2,7,3,0,1,2,7,4,0,1,3,7,5,0,1,3,7,6,0,1,3,7,7,0,1,3,7,8,0,1,3,7,9,0,1,3,7,10,0,1,3,7,11,0,1,3,7,12,0,1,3,7,13,0,13,2,8,3,0,2,2,9,-7,0,1,4,9,-6,0,1,3,9,-5,0,1,3,9,-4,0,1,3,9,-3,0,1,3,9,-2,0,1,3,9,-1,0,1,3,9,0,0,1,3,9,1,0,1,3,9,2,0,1,3,9,3,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json deleted file mode 100644 index ddd7807..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":51,"Y":90},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0009","CurrAmmon":"1","ResidueAmmo":"5"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":11,"Y":228},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":103,"Y":173},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0009","CurrAmmon":"1","ResidueAmmo":"5"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":66,"Y":-4},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0007","CurrAmmon":"60","ResidueAmmo":"60"},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":-1,"Y":119},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":185,"Y":110},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-44,"Y":-39},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":116,"Y":229},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-73,"Y":226},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0009","CurrAmmon":"1","ResidueAmmo":"5"},"Altitude":0,"VerticalSpeed":0}]}],[{"Position":{"X":65,"Y":208},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":71,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-65,"Y":102},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":119,"Y":115},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png deleted file mode 100644 index c9a72b9..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png.import deleted file mode 100644 index 41fdf86..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://w8enumbscx08" -path="res://.godot/imported/Preview.png-57faf91d48bfaedc5b04c411842f9580.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle5/Preview.png" -dest_files=["res://.godot/imported/Preview.png-57faf91d48bfaedc5b04c411842f9580.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/tileMaps/TestGroup1/battle/Battle5/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/RoomInfo.json deleted file mode 100644 index 1fba846..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-10,"Y":-8},"Size":{"X":28,"Y":30},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":192},{"Direction":3,"Start":272,"End":400},{"Direction":0,"Start":128,"End":384},{"Direction":2,"Start":144,"End":336},{"Direction":1,"Start":288,"End":400},{"Direction":1,"Start":0,"End":160}],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle5","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/TileInfo.json deleted file mode 100644 index be4573e..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-136,-104,40,-104,40,-40,136,-40,136,-104,248,-104,248,24,264,24,264,272,184,272,184,336,8,336,8,272,-40,272,-40,288,-136,288,-136,184,-88,184,-88,128,-120,128,-120,48,-136,48]},{"Type":1,"Points":[-40,16,24,16,24,72,-40,72]},{"Type":1,"Points":[104,16,168,16,168,72,104,72]},{"Type":1,"Points":[-24,144,40,144,40,200,-24,200]},{"Type":1,"Points":[136,160,200,160,200,216,136,216]}],"Floor":[-9,-7,0,0,8,-9,-6,0,0,8,-9,-5,0,0,8,-9,-4,0,0,8,-9,-3,0,0,8,-9,-2,0,0,8,-9,-1,0,0,8,-9,0,0,0,8,-9,1,0,0,8,-9,2,0,0,8,-8,-7,0,0,8,-8,-6,0,0,8,-8,-5,0,0,8,-8,-4,0,0,8,-8,-3,0,0,8,-8,-2,0,0,8,-8,-1,0,0,8,-8,0,0,0,8,-8,1,0,0,8,-8,2,0,0,8,-7,-7,0,0,8,-7,-6,0,0,8,-7,-5,0,0,8,-7,-4,0,0,8,-7,-3,0,0,8,-7,-2,0,0,8,-7,-1,0,0,8,-7,0,0,0,8,-7,1,0,0,8,-7,2,0,0,8,-6,-7,0,0,8,-6,-6,0,0,8,-6,-5,0,0,8,-6,-4,0,0,8,-6,-3,0,0,8,-6,-2,0,0,8,-6,-1,0,0,8,-6,0,0,0,8,-6,1,0,0,8,-6,2,0,0,8,-5,-7,0,0,8,-5,-6,0,0,8,-5,-5,0,0,8,-5,-4,0,0,8,-5,-3,0,0,8,-5,-2,0,0,8,-5,-1,0,0,8,-5,0,0,0,8,-5,1,0,0,8,-5,2,0,0,8,-4,-7,0,0,8,-4,-6,0,0,8,-4,-5,0,0,8,-4,-4,0,0,8,-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,0,0,0,8,-4,1,0,0,8,-4,2,0,0,8,-3,-7,0,0,8,-3,-6,0,0,8,-3,-5,0,0,8,-3,-4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-3,2,0,0,8,-2,-7,0,0,8,-2,-6,0,0,8,-2,-5,0,0,8,-2,-4,0,0,8,-2,-3,0,0,8,-2,-2,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-1,-7,0,0,8,-1,-6,0,0,8,-1,-5,0,0,8,-1,-4,0,0,8,-1,-3,0,0,8,-1,-2,0,0,8,-1,-1,0,0,8,-1,0,0,0,8,0,-7,0,0,8,0,-6,0,0,8,0,-5,0,0,8,0,-4,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,0,0,0,8,1,-7,0,0,8,1,-6,0,0,8,1,-5,0,0,8,1,-4,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,2,-7,0,0,8,2,-6,0,0,8,2,-5,0,0,8,2,-4,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,1,0,0,8,2,2,0,0,8,1,3,0,0,8,1,4,0,0,8,1,5,0,0,8,1,6,0,0,8,1,7,0,0,8,1,8,0,0,8,2,3,0,0,8,2,4,0,0,8,2,5,0,0,8,2,6,0,0,8,2,7,0,0,8,2,8,0,0,8,2,9,0,0,8,2,10,0,0,8,2,11,0,0,8,3,1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,3,5,0,0,8,3,6,0,0,8,3,7,0,0,8,3,8,0,0,8,3,9,0,0,8,3,10,0,0,8,3,11,0,0,8,4,1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,4,5,0,0,8,4,6,0,0,8,4,7,0,0,8,4,8,0,0,8,4,9,0,0,8,4,10,0,0,8,4,11,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,5,5,0,0,8,5,6,0,0,8,5,7,0,0,8,5,8,0,0,8,5,9,0,0,8,5,10,0,0,8,5,11,0,0,8,6,1,0,0,8,6,2,0,0,8,6,3,0,0,8,6,4,0,0,8,6,5,0,0,8,6,6,0,0,8,6,7,0,0,8,6,8,0,0,8,6,9,0,0,8,6,10,0,0,8,6,11,0,0,8,7,4,0,0,8,7,5,0,0,8,7,6,0,0,8,7,7,0,0,8,7,8,0,0,8,7,9,0,0,8,7,10,0,0,8,7,11,0,0,8,8,4,0,0,8,8,5,0,0,8,8,6,0,0,8,8,7,0,0,8,8,8,0,0,8,8,9,0,0,8,8,10,0,0,8,8,11,0,0,8,9,4,0,0,8,9,5,0,0,8,9,6,0,0,8,9,7,0,0,8,9,8,0,0,8,9,9,0,0,8,10,1,0,0,8,10,2,0,0,8,10,3,0,0,8,10,4,0,0,8,10,5,0,0,8,10,6,0,0,8,10,7,0,0,8,10,8,0,0,8,10,9,0,0,8,11,1,0,0,8,11,2,0,0,8,11,3,0,0,8,11,4,0,0,8,11,5,0,0,8,11,6,0,0,8,11,7,0,0,8,11,8,0,0,8,11,9,0,0,8,12,1,0,0,8,12,2,0,0,8,12,3,0,0,8,12,4,0,0,8,12,5,0,0,8,12,6,0,0,8,12,7,0,0,8,12,8,0,0,8,12,9,0,0,8,12,10,0,0,8,12,11,0,0,8,13,1,0,0,8,13,2,0,0,8,13,3,0,0,8,13,4,0,0,8,13,5,0,0,8,13,6,0,0,8,13,7,0,0,8,13,8,0,0,8,13,9,0,0,8,13,10,0,0,8,13,11,0,0,8,14,1,0,0,8,14,2,0,0,8,14,3,0,0,8,14,4,0,0,8,14,5,0,0,8,14,6,0,0,8,14,7,0,0,8,14,8,0,0,8,14,9,0,0,8,14,10,0,0,8,14,11,0,0,8,15,1,0,0,8,15,2,0,0,8,15,3,0,0,8,15,4,0,0,8,15,5,0,0,8,15,6,0,0,8,15,7,0,0,8,15,8,0,0,8,15,9,0,0,8,15,10,0,0,8,15,11,0,0,8,16,1,0,0,8,16,2,0,0,8,16,3,0,0,8,16,4,0,0,8,16,5,0,0,8,16,6,0,0,8,16,7,0,0,8,16,8,0,0,8,16,9,0,0,8,16,10,0,0,8,16,11,0,0,8,-8,3,0,0,8,-8,4,0,0,8,-8,5,0,0,8,-8,6,0,0,8,-8,7,0,0,8,-7,3,0,0,8,-7,4,0,0,8,-7,5,0,0,8,-7,6,0,0,8,-7,7,0,0,8,-6,3,0,0,8,-6,4,0,0,8,-6,5,0,0,8,-6,6,0,0,8,-6,7,0,0,8,-5,3,0,0,8,-5,4,0,0,8,-5,5,0,0,8,-5,6,0,0,8,-5,7,0,0,8,-4,3,0,0,8,-4,4,0,0,8,-4,5,0,0,8,-4,6,0,0,8,-4,7,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-3,5,0,0,8,-3,6,0,0,8,-3,7,0,0,8,-2,4,0,0,8,-2,5,0,0,8,-2,6,0,0,8,-2,7,0,0,8,-1,4,0,0,8,-1,5,0,0,8,-1,6,0,0,8,-1,7,0,0,8,0,4,0,0,8,0,5,0,0,8,0,6,0,0,8,0,7,0,0,8,-6,8,0,0,8,-6,9,0,0,8,-6,10,0,0,8,-6,11,0,0,8,-6,12,0,0,8,-6,13,0,0,8,-5,8,0,0,8,-5,9,0,0,8,-5,10,0,0,8,-5,11,0,0,8,-5,12,0,0,8,-5,13,0,0,8,-4,8,0,0,8,-4,9,0,0,8,-4,10,0,0,8,-4,11,0,0,8,-4,12,0,0,8,-4,13,0,0,8,-3,8,0,0,8,-3,9,0,0,8,-3,10,0,0,8,-3,11,0,0,8,-3,12,0,0,8,-3,13,0,0,8,-2,8,0,0,8,-2,9,0,0,8,-2,10,0,0,8,-2,11,0,0,8,-2,12,0,0,8,-2,13,0,0,8,-2,14,0,0,8,-2,15,0,0,8,-2,16,0,0,8,-1,8,0,0,8,-1,12,0,0,8,-1,13,0,0,8,-1,14,0,0,8,-1,15,0,0,8,-1,16,0,0,8,0,8,0,0,8,0,12,0,0,8,0,13,0,0,8,0,14,0,0,8,0,15,0,0,8,0,16,0,0,8,1,12,0,0,8,1,13,0,0,8,1,14,0,0,8,1,15,0,0,8,1,16,0,0,8,0,17,0,0,8,0,18,0,0,8,0,19,0,0,8,0,20,0,0,8,1,17,0,0,8,1,18,0,0,8,1,19,0,0,8,1,20,0,0,8,2,12,0,0,8,2,13,0,0,8,2,14,0,0,8,2,15,0,0,8,2,16,0,0,8,2,17,0,0,8,2,18,0,0,8,2,19,0,0,8,2,20,0,0,8,3,12,0,0,8,3,13,0,0,8,3,14,0,0,8,3,15,0,0,8,3,16,0,0,8,3,17,0,0,8,3,18,0,0,8,3,19,0,0,8,3,20,0,0,8,4,12,0,0,8,4,13,0,0,8,4,14,0,0,8,4,15,0,0,8,4,16,0,0,8,4,17,0,0,8,4,18,0,0,8,4,19,0,0,8,4,20,0,0,8,5,12,0,0,8,5,13,0,0,8,5,14,0,0,8,5,15,0,0,8,5,16,0,0,8,5,17,0,0,8,5,18,0,0,8,5,19,0,0,8,5,20,0,0,8,6,12,0,0,8,6,13,0,0,8,6,14,0,0,8,6,15,0,0,8,6,16,0,0,8,6,17,0,0,8,6,18,0,0,8,6,19,0,0,8,6,20,0,0,8,7,12,0,0,8,7,13,0,0,8,7,14,0,0,8,7,15,0,0,8,7,16,0,0,8,7,17,0,0,8,7,18,0,0,8,7,19,0,0,8,7,20,0,0,8,8,12,0,0,8,8,13,0,0,8,8,14,0,0,8,8,15,0,0,8,8,16,0,0,8,8,17,0,0,8,8,18,0,0,8,8,19,0,0,8,8,20,0,0,8,9,13,0,0,8,9,14,0,0,8,9,15,0,0,8,9,16,0,0,8,9,17,0,0,8,9,18,0,0,8,9,19,0,0,8,9,20,0,0,8,10,13,0,0,8,10,14,0,0,8,10,15,0,0,8,10,16,0,0,8,10,17,0,0,8,10,18,0,0,8,10,19,0,0,8,10,20,0,0,8,11,13,0,0,8,11,14,0,0,8,11,15,0,0,8,11,16,0,0,8,11,17,0,0,8,11,18,0,0,8,11,19,0,0,8,11,20,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,4,-3,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,0,0,0,8,5,-3,0,0,8,5,-2,0,0,8,5,-1,0,0,8,5,0,0,0,8,6,-3,0,0,8,6,-2,0,0,8,6,-1,0,0,8,6,0,0,0,8,7,-3,0,0,8,7,-2,0,0,8,7,-1,0,0,8,7,0,0,0,8,8,-3,0,0,8,8,-2,0,0,8,8,-1,0,0,8,8,0,0,0,8,9,-3,0,0,8,9,-2,0,0,8,9,-1,0,0,8,9,0,0,0,8,10,-2,0,0,8,10,-1,0,0,8,10,0,0,0,8,11,-2,0,0,8,11,-1,0,0,8,11,0,0,0,8,12,-2,0,0,8,12,-1,0,0,8,12,0,0,0,8,13,-2,0,0,8,13,-1,0,0,8,13,0,0,0,8,14,-2,0,0,8,14,-1,0,0,8,14,0,0,0,8,12,12,0,0,8,12,13,0,0,8,12,14,0,0,8,13,12,0,0,8,13,13,0,0,8,13,14,0,0,8,14,12,0,0,8,14,13,0,0,8,14,14,0,0,8,12,15,0,0,8,12,16,0,0,8,13,15,0,0,8,13,16,0,0,8,14,15,0,0,8,14,16,0,0,8,15,14,0,0,8,15,15,0,0,8,15,16,0,0,8,15,12,0,0,8,15,13,0,0,8,16,12,0,0,8,16,13,0,0,8,16,14,0,0,8,16,15,0,0,8,16,16,0,0,8,-9,11,0,0,8,-9,12,0,0,8,-9,13,0,0,8,-9,14,0,0,8,-9,15,0,0,8,-9,16,0,0,8,-9,17,0,0,8,-8,11,0,0,8,-8,12,0,0,8,-8,13,0,0,8,-8,14,0,0,8,-8,15,0,0,8,-8,16,0,0,8,-8,17,0,0,8,-7,11,0,0,8,-7,12,0,0,8,-7,13,0,0,8,-7,14,0,0,8,-7,15,0,0,8,-7,16,0,0,8,-7,17,0,0,8,-6,14,0,0,8,-6,15,0,0,8,-6,16,0,0,8,-6,17,0,0,8,-5,14,0,0,8,-5,15,0,0,8,-5,16,0,0,8,-5,17,0,0,8,-4,14,0,0,8,-4,15,0,0,8,-4,16,0,0,8,-4,17,0,0,8,-3,14,0,0,8,-3,15,0,0,8,-3,16,0,0,8,-3,17,0,0,8,8,-7,0,0,8,8,-6,0,0,8,8,-5,0,0,8,8,-4,0,0,8,9,-7,0,0,8,9,-6,0,0,8,9,-5,0,0,8,9,-4,0,0,8,10,-7,0,0,8,10,-6,0,0,8,10,-5,0,0,8,10,-4,0,0,8,10,-3,0,0,8,11,-7,0,0,8,11,-6,0,0,8,11,-5,0,0,8,11,-4,0,0,8,11,-3,0,0,8,12,-7,0,0,8,12,-6,0,0,8,12,-5,0,0,8,12,-4,0,0,8,12,-3,0,0,8,13,-7,0,0,8,13,-6,0,0,8,13,-5,0,0,8,13,-4,0,0,8,13,-3,0,0,8,14,-7,0,0,8,14,-6,0,0,8,14,-5,0,0,8,14,-4,0,0,8,14,-3,0,0,8,15,-7,0,0,8,15,-6,0,0,8,15,-5,0,0,8,15,-4,0,0,8,15,-3,0,0,8,15,-2,0,0,8,15,-1,0,0,8,15,0,0,0,8],"Middle":[-9,-8,0,2,7,-9,10,0,2,7,-8,-8,0,2,7,-8,10,0,2,7,-7,-8,0,2,7,-7,10,0,3,7,-6,-8,0,2,7,-5,-8,0,2,7,-4,-8,0,2,7,-3,-8,0,2,7,-2,-8,0,2,7,-2,3,0,1,7,-1,-8,0,2,7,-1,3,0,2,7,-1,11,0,1,7,0,-8,0,2,7,0,3,0,3,7,0,11,0,2,7,1,-8,0,2,7,1,11,0,3,7,2,-8,0,2,7,3,-4,0,1,7,4,-4,0,2,7,5,-4,0,2,7,6,-4,0,2,7,7,-4,0,3,7,7,3,0,1,7,8,-8,0,2,7,8,3,0,2,7,9,-8,0,2,7,9,3,0,3,7,9,12,0,1,7,10,-8,0,2,7,10,12,0,2,7,11,-8,0,2,7,11,12,0,3,7,12,-8,0,2,7,13,-8,0,2,7,14,-8,0,2,7,15,-8,0,2,7,16,0,0,1,7],"Top":[-10,-8,0,3,4,-10,-7,0,3,3,-10,-6,0,3,3,-10,-5,0,3,3,-10,-4,0,3,3,-10,-3,0,3,3,-10,-2,0,3,3,-10,-1,0,3,3,-10,0,0,3,3,-10,1,0,3,3,-10,2,0,3,3,-10,3,0,11,2,-10,10,0,3,4,-10,11,0,3,3,-10,12,0,3,3,-10,13,0,3,3,-10,14,0,3,3,-10,15,0,3,3,-10,16,0,3,3,-10,17,0,3,3,-10,18,0,11,2,-9,3,0,3,2,-9,4,0,3,3,-9,5,0,3,3,-9,6,0,3,3,-9,7,0,3,3,-9,8,0,11,2,-9,18,0,2,2,-8,8,0,2,2,-8,18,0,2,2,-7,8,0,3,2,-7,9,0,3,3,-7,18,0,2,2,-6,18,0,2,2,-5,18,0,2,2,-4,18,0,2,2,-3,18,0,2,2,-2,1,0,1,2,-2,2,0,1,3,-2,17,0,1,2,-2,18,0,13,2,-1,1,0,2,2,-1,9,0,1,2,-1,10,0,1,3,-1,17,0,3,2,-1,18,0,3,3,-1,19,0,3,3,-1,20,0,3,3,-1,21,0,11,2,0,1,0,3,2,0,2,0,3,3,0,9,0,2,2,0,21,0,2,2,1,9,0,3,2,1,10,0,3,3,1,21,0,2,2,2,21,0,2,2,3,-8,0,1,4,3,-7,0,1,3,3,-6,0,1,3,3,-5,0,1,3,3,21,0,2,2,4,21,0,2,2,5,21,0,2,2,6,21,0,2,2,7,-8,0,3,4,7,-7,0,3,3,7,-6,0,3,3,7,-5,0,3,3,7,1,0,1,2,7,2,0,1,3,7,21,0,2,2,8,1,0,2,2,8,21,0,2,2,9,1,0,3,2,9,2,0,3,3,9,10,0,1,2,9,11,0,1,3,9,21,0,2,2,10,10,0,2,2,10,21,0,2,2,11,10,0,3,2,11,11,0,3,3,11,21,0,2,2,12,17,0,1,2,12,18,0,1,3,12,19,0,1,3,12,20,0,1,3,12,21,0,13,2,13,17,0,2,2,14,17,0,2,2,15,17,0,2,2,16,-8,0,1,4,16,-7,0,1,3,16,-6,0,1,3,16,-5,0,1,3,16,-4,0,1,3,16,-3,0,1,3,16,-2,0,1,3,16,-1,0,1,3,16,17,0,2,2,17,0,0,1,4,17,1,0,1,3,17,2,0,1,3,17,3,0,1,3,17,4,0,1,3,17,5,0,1,3,17,6,0,1,3,17,7,0,1,3,17,8,0,1,3,17,9,0,1,3,17,10,0,1,3,17,11,0,1,3,17,12,0,1,3,17,13,0,1,3,17,14,0,1,3,17,15,0,1,3,17,16,0,1,3,17,17,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preinstall.json deleted file mode 100644 index c483fbf..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"Preinstall1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":114,"Y":34},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":76,"Y":-35},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0008","CurrAmmon":"10","ResidueAmmo":"10"},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png deleted file mode 100644 index a396f2c..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png.import deleted file mode 100644 index 7d40ed3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://7rcbxc5erlk2" -path="res://.godot/imported/Preview.png-8acadee4f0f58814edc8b7c9c800f88c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/battle/Battle6/Preview.png" -dest_files=["res://.godot/imported/Preview.png-8acadee4f0f58814edc8b7c9c800f88c.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/tileMaps/TestGroup1/battle/Battle6/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/RoomInfo.json deleted file mode 100644 index 6126ee9..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-4,"Y":-6},"Size":{"X":23,"Y":18},"DoorAreaInfos":[],"GroupName":"TestGroup1","RoomType":0,"RoomName":"Battle6","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/TileInfo.json deleted file mode 100644 index 8c5cd7b..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle6/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-40,-72,280,-72,280,176,-40,176]},{"Type":1,"Points":[168,-16,248,-16,248,40,216,40,216,104,168,104]},{"Type":1,"Points":[24,16,72,16,72,136,-8,136,-8,80,24,80]}],"Floor":[-3,-5,0,0,8,-3,-4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-3,2,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-3,5,0,0,8,-3,6,0,0,8,-3,7,0,0,8,-3,8,0,0,8,-3,9,0,0,8,-3,10,0,0,8,-2,-5,0,0,8,-2,-4,0,0,8,-2,-3,0,0,8,-2,-2,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-2,3,0,0,8,-2,4,0,0,8,-2,5,0,0,8,-2,6,0,0,8,-2,7,0,0,8,-2,8,0,0,8,-2,9,0,0,8,-2,10,0,0,8,-1,-5,0,0,8,-1,-4,0,0,8,-1,-3,0,0,8,-1,-2,0,0,8,-1,-1,0,0,8,-1,0,0,0,8,-1,1,0,0,8,-1,2,0,0,8,-1,3,0,0,8,-1,4,0,0,8,-1,6,0,0,8,-1,7,0,0,8,-1,8,0,0,8,-1,9,0,0,8,-1,10,0,0,8,0,-5,0,0,8,0,-4,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,0,0,0,8,0,1,0,0,8,0,2,0,0,8,0,3,0,0,8,0,4,0,0,8,0,8,0,0,8,0,9,0,0,8,0,10,0,0,8,1,-5,0,0,8,1,-4,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,1,3,0,0,8,1,4,0,0,8,1,8,0,0,8,1,9,0,0,8,1,10,0,0,8,2,-5,0,0,8,2,-4,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,8,0,0,8,2,9,0,0,8,2,10,0,0,8,3,-5,0,0,8,3,-4,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,8,0,0,8,3,9,0,0,8,3,10,0,0,8,4,-5,0,0,8,4,-4,0,0,8,4,-3,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,0,0,0,8,4,1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,4,5,0,0,8,4,6,0,0,8,4,7,0,0,8,4,8,0,0,8,4,9,0,0,8,4,10,0,0,8,5,-5,0,0,8,5,-4,0,0,8,5,-3,0,0,8,5,-2,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,5,5,0,0,8,5,6,0,0,8,5,7,0,0,8,5,8,0,0,8,5,9,0,0,8,5,10,0,0,8,6,-5,0,0,8,6,-4,0,0,8,6,-3,0,0,8,6,-2,0,0,8,6,-1,0,0,8,6,0,0,0,8,6,1,0,0,8,6,2,0,0,8,6,3,0,0,8,6,4,0,0,8,6,5,0,0,8,6,6,0,0,8,6,7,0,0,8,6,8,0,0,8,6,9,0,0,8,6,10,0,0,8,7,-5,0,0,8,7,-4,0,0,8,7,-3,0,0,8,7,-2,0,0,8,7,-1,0,0,8,7,0,0,0,8,7,1,0,0,8,7,2,0,0,8,7,3,0,0,8,7,4,0,0,8,7,5,0,0,8,7,6,0,0,8,7,7,0,0,8,7,8,0,0,8,7,9,0,0,8,7,10,0,0,8,8,-5,0,0,8,8,-4,0,0,8,8,-3,0,0,8,8,-2,0,0,8,8,-1,0,0,8,8,0,0,0,8,8,1,0,0,8,8,2,0,0,8,8,3,0,0,8,8,4,0,0,8,8,5,0,0,8,8,6,0,0,8,8,7,0,0,8,8,8,0,0,8,8,9,0,0,8,8,10,0,0,8,9,-5,0,0,8,9,-4,0,0,8,9,-3,0,0,8,9,-2,0,0,8,9,-1,0,0,8,9,0,0,0,8,9,1,0,0,8,9,2,0,0,8,9,3,0,0,8,9,4,0,0,8,9,5,0,0,8,9,6,0,0,8,9,7,0,0,8,9,8,0,0,8,9,9,0,0,8,9,10,0,0,8,10,-5,0,0,8,10,-4,0,0,8,10,-3,0,0,8,10,-2,0,0,8,10,-1,0,0,8,10,0,0,0,8,10,1,0,0,8,10,2,0,0,8,10,3,0,0,8,10,4,0,0,8,10,5,0,0,8,10,6,0,0,8,10,7,0,0,8,10,8,0,0,8,10,9,0,0,8,10,10,0,0,8,11,-5,0,0,8,11,-4,0,0,8,11,-3,0,0,8,11,-2,0,0,8,11,6,0,0,8,11,7,0,0,8,11,8,0,0,8,11,9,0,0,8,11,10,0,0,8,12,-5,0,0,8,12,-4,0,0,8,12,-3,0,0,8,12,-2,0,0,8,12,6,0,0,8,12,7,0,0,8,12,8,0,0,8,12,9,0,0,8,12,10,0,0,8,13,-5,0,0,8,13,-4,0,0,8,13,-3,0,0,8,13,-2,0,0,8,13,2,0,0,8,13,3,0,0,8,13,4,0,0,8,13,5,0,0,8,13,6,0,0,8,13,7,0,0,8,13,8,0,0,8,13,9,0,0,8,13,10,0,0,8,14,-5,0,0,8,14,-4,0,0,8,14,-3,0,0,8,14,-2,0,0,8,14,2,0,0,8,14,3,0,0,8,14,4,0,0,8,14,5,0,0,8,14,6,0,0,8,14,7,0,0,8,14,8,0,0,8,14,9,0,0,8,14,10,0,0,8,15,-5,0,0,8,15,-4,0,0,8,15,-3,0,0,8,15,-2,0,0,8,15,-1,0,0,8,15,0,0,0,8,15,1,0,0,8,15,2,0,0,8,15,3,0,0,8,15,4,0,0,8,15,5,0,0,8,15,6,0,0,8,15,7,0,0,8,15,8,0,0,8,15,9,0,0,8,15,10,0,0,8,16,-5,0,0,8,16,-4,0,0,8,16,-3,0,0,8,16,-2,0,0,8,16,-1,0,0,8,16,0,0,0,8,16,1,0,0,8,16,2,0,0,8,16,3,0,0,8,16,4,0,0,8,16,5,0,0,8,16,6,0,0,8,16,7,0,0,8,16,8,0,0,8,16,9,0,0,8,16,10,0,0,8,17,-5,0,0,8,17,-4,0,0,8,17,-3,0,0,8,17,-2,0,0,8,17,-1,0,0,8,17,0,0,0,8,17,1,0,0,8,17,2,0,0,8,17,3,0,0,8,17,4,0,0,8,17,5,0,0,8,17,6,0,0,8,17,7,0,0,8,17,8,0,0,8,17,9,0,0,8,17,10,0,0,8,-1,5,0,0,8],"Middle":[-3,-6,0,2,7,-2,-6,0,2,7,-1,-6,0,2,7,0,-6,0,2,7,0,7,0,1,7,1,-6,0,2,7,1,7,0,2,7,2,-6,0,2,7,2,7,0,2,7,3,-6,0,2,7,3,7,0,3,7,4,-6,0,2,7,5,-6,0,2,7,6,-6,0,2,7,7,-6,0,2,7,8,-6,0,2,7,9,-6,0,2,7,10,-6,0,2,7,11,-6,0,2,7,11,5,0,1,7,12,-6,0,2,7,12,5,0,3,7,13,-6,0,2,7,13,1,0,2,7,14,-6,0,2,7,14,1,0,3,7,15,-6,0,2,7,16,-6,0,2,7,17,-6,0,2,7],"Top":[-4,-6,0,3,4,-4,-5,0,3,3,-4,-4,0,3,3,-4,-3,0,3,3,-4,-2,0,3,3,-4,-1,0,3,3,-4,0,0,3,3,-4,1,0,3,3,-4,2,0,3,3,-4,3,0,3,3,-4,4,0,3,3,-4,5,0,3,3,-4,6,0,3,3,-4,7,0,3,3,-4,8,0,3,3,-4,9,0,3,3,-4,10,0,3,3,-4,11,0,11,2,-3,11,0,2,2,-2,11,0,2,2,-1,11,0,2,2,0,5,0,1,2,0,6,0,1,3,0,11,0,2,2,1,5,0,2,2,1,11,0,2,2,2,1,0,1,2,2,2,0,1,3,2,3,0,1,3,2,4,0,1,3,2,5,0,13,2,2,11,0,2,2,3,1,0,3,2,3,2,0,3,3,3,3,0,3,3,3,4,0,3,3,3,5,0,3,3,3,6,0,3,3,3,11,0,2,2,4,11,0,2,2,5,11,0,2,2,6,11,0,2,2,7,11,0,2,2,8,11,0,2,2,9,11,0,2,2,10,11,0,2,2,11,-1,0,1,2,11,0,0,1,3,11,1,0,1,3,11,2,0,1,3,11,3,0,1,3,11,4,0,1,3,11,11,0,2,2,12,-1,0,2,2,12,1,0,3,4,12,2,0,3,3,12,3,0,3,3,12,4,0,3,3,12,11,0,2,2,13,-1,0,2,2,13,11,0,2,2,14,-1,0,3,2,14,0,0,3,3,14,11,0,2,2,15,11,0,2,2,16,11,0,2,2,17,11,0,2,2,18,-6,0,1,4,18,-5,0,1,3,18,-4,0,1,3,18,-3,0,1,3,18,-2,0,1,3,18,-1,0,1,3,18,0,0,1,3,18,1,0,1,3,18,2,0,1,3,18,3,0,1,3,18,4,0,1,3,18,5,0,1,3,18,6,0,1,3,18,7,0,1,3,18,8,0,1,3,18,9,0,1,3,18,10,0,1,3,18,11,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json deleted file mode 100644 index 87b9dd1..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":0,"Y":0},"Size":{"X":14,"Y":16},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":35,"Y":-27},"Size":{"X":30,"Y":12},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":8,"Y":32},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-50,"Y":7},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0004","Weight":100,"Attr":{"CurrAmmon":"180","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-63,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-31,"Y":-16},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-54,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0006","Weight":100,"Attr":{"CurrAmmon":"20","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":2,"Y":-25},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-76,"Y":21},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0008","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"120"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-87,"Y":46},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0009","Weight":100,"Attr":{"CurrAmmon":"1","ResidueAmmo":"25"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":34,"Y":-1},"Size":{"X":24,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0011","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":45,"Y":55},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0012","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-90,"Y":-26},"Size":{"X":13,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0013","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-91,"Y":-6},"Size":{"X":14,"Y":13},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0014","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-73,"Y":66},"Size":{"X":14,"Y":14},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":72,"Y":62},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":67,"Y":28},"Size":{"X":16,"Y":17},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":67,"Y":-12},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":25},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-24,"Y":8},"Size":{"X":18,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-20,"Y":34},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0},{"Id":"prop0006","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png deleted file mode 100644 index e7bb706..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png.import deleted file mode 100644 index 74d2d7c..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dwr8eoslvwdu2" -path="res://.godot/imported/Preview.png-d30d131cfacf4b4842b55e3203acdd42.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png" -dest_files=["res://.godot/imported/Preview.png-d30d131cfacf4b4842b55e3203acdd42.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/tileMaps/TestGroup1/inlet/Start1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/RoomInfo.json deleted file mode 100644 index 6005b11..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-8,"Y":-4},"Size":{"X":15,"Y":10},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":208},{"Direction":0,"Start":0,"End":128},{"Direction":2,"Start":128,"End":208},{"Direction":1,"Start":0,"End":128},{"Direction":2,"Start":0,"End":64}],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json deleted file mode 100644 index 68ed08e..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-104,-40,88,-40,88,80,24,80,24,48,-56,48,-56,80,-104,80]}],"Floor":[-7,-3,0,0,8,-7,-2,0,0,8,-7,-1,0,0,8,-7,0,0,0,8,-7,1,0,0,8,-7,2,0,0,8,-7,3,0,0,8,-7,4,0,0,8,-6,-3,0,0,8,-6,-2,0,0,8,-6,-1,0,0,8,-6,0,0,0,8,-6,1,0,0,8,-6,2,0,0,8,-6,3,0,0,8,-6,4,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,5,-2,0,0,8,5,-3,0,0,8,-5,-3,0,0,8,-5,-2,0,0,8,-5,-1,0,0,8,-5,0,0,0,8,-5,1,0,0,8,-5,2,0,0,8,-5,3,0,0,8,-5,4,0,0,8,1,4,0,0,8,1,3,0,0,8,1,2,0,0,8,1,1,0,0,8,1,0,0,0,8,1,-1,0,0,8,1,-2,0,0,8,1,-3,0,0,8,2,4,0,0,8,2,3,0,0,8,2,2,0,0,8,2,1,0,0,8,2,0,0,0,8,2,-1,0,0,8,2,-2,0,0,8,2,-3,0,0,8,3,4,0,0,8,3,3,0,0,8,3,2,0,0,8,3,1,0,0,8,3,0,0,0,8,3,-1,0,0,8,3,-2,0,0,8,3,-3,0,0,8,4,4,0,0,8,4,3,0,0,8,4,2,0,0,8,4,1,0,0,8,4,0,0,0,8,4,-1,0,0,8,4,-2,0,0,8,4,-3,0,0,8,0,2,0,0,8,0,1,0,0,8,0,0,0,0,8,0,-1,0,0,8,0,-2,0,0,8,0,-3,0,0,8,-1,2,0,0,8,-1,1,0,0,8,-1,0,0,0,8,-1,-1,0,0,8,-1,-2,0,0,8,-1,-3,0,0,8,-2,2,0,0,8,-2,1,0,0,8,-2,0,0,0,8,-2,-1,0,0,8,-2,-2,0,0,8,-2,-3,0,0,8,-3,2,0,0,8,-3,1,0,0,8,-3,0,0,0,8,-3,-1,0,0,8,-3,-2,0,0,8,-3,-3,0,0,8,-4,4,0,0,8,-4,3,0,0,8,-4,2,0,0,8,-4,1,0,0,8,-4,0,0,0,8,-4,-1,0,0,8,-4,-2,0,0,8,-4,-3,0,0,8],"Middle":[-7,-4,0,2,7,-6,-4,0,2,7,-5,-4,0,2,7,-4,-4,0,2,7,-3,-4,0,2,7,-2,-4,0,2,7,-1,-4,0,2,7,0,-4,0,2,7,1,-4,0,2,7,2,-4,0,2,7,3,-4,0,2,7,4,-4,0,2,7,5,-4,0,2,7],"Top":[-8,-4,0,3,4,-8,-3,0,3,3,-8,-2,0,3,3,-8,-1,0,3,3,-8,0,0,3,3,-8,1,0,3,3,-8,2,0,3,3,-8,3,0,3,3,-8,4,0,3,3,-8,5,0,11,2,-7,5,0,2,2,-6,5,0,2,2,-5,5,0,2,2,-4,5,0,2,2,-3,3,0,1,2,-3,4,0,1,3,-3,5,0,13,2,-2,3,0,2,2,-1,3,0,2,2,0,3,0,3,2,0,4,0,3,3,0,5,0,11,2,1,5,0,2,2,2,5,0,2,2,3,5,0,2,2,4,5,0,2,2,5,5,0,2,2,6,-4,0,1,4,6,-3,0,1,3,6,-2,0,1,3,6,-1,0,1,3,6,0,0,1,3,6,1,0,1,3,6,2,0,1,3,6,3,0,1,3,6,4,0,1,3,6,5,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json deleted file mode 100644 index b2a4f57..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":0,"Y":0},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":16,"Y":26},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-16,"Y":25},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":37,"Y":-13},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-11,"Y":-12},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0009","Weight":100,"Attr":{"CurrAmmon":"1","ResidueAmmo":"25"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":10,"Y":-39},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-115,"Y":39},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0002","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png deleted file mode 100644 index 055d7fa..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png.import deleted file mode 100644 index 68d306b..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cr5tlhxfjetuf" -path="res://.godot/imported/Preview.png-8fbf34b154290497f5a1f19b421f568c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png" -dest_files=["res://.godot/imported/Preview.png-8fbf34b154290497f5a1f19b421f568c.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/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json deleted file mode 100644 index 0370957..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-11,"Y":-7},"Size":{"X":16,"Y":14},"DoorAreaInfos":[{"Direction":3,"Start":96,"End":224},{"Direction":0,"Start":0,"End":192},{"Direction":1,"Start":0,"End":192},{"Direction":2,"Start":0,"End":144}],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start2","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/TileInfo.json deleted file mode 100644 index b37b37a..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-152,-88,-120,-88,-120,-24,-72,-24,-72,-40,-56,-40,-56,-88,56,-88,56,96,40,96,40,48,-8,48,-8,64,-24,64,-24,96,-152,96]}],"Floor":[-3,-4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-3,2,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-3,5,0,0,8,-2,-2,0,0,8,-2,-4,0,0,8,-2,-3,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-1,-1,0,0,8,-1,-4,0,0,8,-1,-3,0,0,8,-1,-2,0,0,8,-1,0,0,0,8,-1,1,0,0,8,-1,2,0,0,8,0,0,0,0,8,0,-4,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,1,0,0,8,0,2,0,0,8,1,1,0,0,8,1,-4,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,2,0,0,8,2,1,0,0,8,2,-4,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,2,0,0,8,2,3,0,0,8,2,4,0,0,8,2,5,0,0,8,-4,-4,0,0,8,-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,0,0,0,8,-4,1,0,0,8,-4,2,0,0,8,-4,3,0,0,8,-4,4,0,0,8,-4,5,0,0,8,3,-4,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,3,5,0,0,8,-9,-4,0,0,8,-9,-3,0,0,8,-9,-2,0,0,8,-9,-1,0,0,8,-9,0,0,0,8,-9,1,0,0,8,-8,-4,0,0,8,-8,-3,0,0,8,-8,-2,0,0,8,-8,-1,0,0,8,-8,0,0,0,8,-10,1,0,0,8,-10,0,0,0,8,-10,-1,0,0,8,-10,-2,0,0,8,-10,-3,0,0,8,-10,-4,0,0,8,-10,-5,0,0,8,-9,-5,0,0,8,-9,-6,0,0,8,-8,-6,0,0,8,-8,-5,0,0,8,-7,-2,0,0,8,-6,-2,0,0,8,-5,-2,0,0,8,-7,-1,0,0,8,-6,-1,0,0,8,-5,-1,0,0,8,-7,0,0,0,8,-6,0,0,0,8,-5,0,0,0,8,-10,-6,0,0,8,-4,-5,0,0,8,-3,-5,0,0,8,-2,-5,0,0,8,-1,-5,0,0,8,0,-5,0,0,8,1,-5,0,0,8,2,-5,0,0,8,3,-5,0,0,8,3,-6,0,0,8,2,-6,0,0,8,1,-6,0,0,8,0,-6,0,0,8,-1,-6,0,0,8,-2,-6,0,0,8,-3,-6,0,0,8,-4,-6,0,0,8,-2,4,0,0,8,-2,3,0,0,8,-2,5,0,0,8,-5,1,0,0,8,-5,2,0,0,8,-5,3,0,0,8,-5,4,0,0,8,-5,5,0,0,8,-6,1,0,0,8,-6,2,0,0,8,-6,3,0,0,8,-6,4,0,0,8,-6,5,0,0,8,-8,1,0,0,8,-8,2,0,0,8,-7,2,0,0,8,-7,3,0,0,8,-7,1,0,0,8,-7,4,0,0,8,-7,5,0,0,8,-8,5,0,0,8,-9,5,0,0,8,-9,4,0,0,8,-10,2,0,0,8,-10,3,0,0,8,-10,4,0,0,8,-10,5,0,0,8,-8,4,0,0,8,-8,3,0,0,8,-9,3,0,0,8,-9,2,0,0,8,-1,3,0,0,8,-5,-3,0,0,8],"Middle":[-10,-7,0,2,7,-9,-7,0,2,7,-8,-7,0,2,7,-7,-3,0,1,7,-6,-3,0,3,7,-5,-4,0,3,7,-4,-7,0,2,7,-3,-7,0,2,7,-2,-7,0,2,7,-1,-7,0,2,7,0,-7,0,2,7,1,-7,0,2,7,2,-7,0,2,7,3,-7,0,2,7],"Top":[-11,-7,0,3,4,-11,-6,0,3,3,-11,-5,0,3,3,-11,-4,0,3,3,-11,-3,0,3,3,-11,-2,0,3,3,-11,-1,0,3,3,-11,0,0,3,3,-11,1,0,3,3,-11,2,0,3,3,-11,3,0,3,3,-11,4,0,3,3,-11,5,0,3,3,-11,6,0,11,2,-10,6,0,2,2,-9,6,0,2,2,-8,6,0,2,2,-7,-7,0,1,4,-7,-6,0,1,3,-7,-5,0,1,3,-7,-4,0,1,3,-7,6,0,2,2,-6,-4,0,3,4,-6,6,0,2,2,-5,-7,0,3,4,-5,-6,0,3,3,-5,-5,0,3,3,-5,6,0,2,2,-4,6,0,2,2,-3,6,0,2,2,-2,6,0,2,2,-1,4,0,1,2,-1,5,0,1,3,-1,6,0,13,2,0,3,0,1,2,0,4,0,13,2,1,3,0,3,2,1,4,0,3,3,1,5,0,3,3,1,6,0,11,2,2,6,0,2,2,3,6,0,2,2,4,-7,0,1,4,4,-6,0,1,3,4,-5,0,1,3,4,-4,0,1,3,4,-3,0,1,3,4,-2,0,1,3,4,-1,0,1,3,4,0,0,1,3,4,1,0,1,3,4,2,0,1,3,4,3,0,1,3,4,4,0,1,3,4,5,0,1,3,4,6,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json deleted file mode 100644 index 876f2c4..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-84,"Y":-46},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-56,"Y":-72},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":33,"Y":65},"Size":{"X":29,"Y":28},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"-1","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":25,"Y":-16},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.8,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png deleted file mode 100644 index 6273480..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png.import deleted file mode 100644 index 59dce7f..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://hrny6himu2o8" -path="res://.godot/imported/Preview.png-36e30cc056284bf63e359cca99f69e15.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png" -dest_files=["res://.godot/imported/Preview.png-36e30cc056284bf63e359cca99f69e15.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/tileMaps/TestGroup1/inlet/Start3/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/RoomInfo.json deleted file mode 100644 index a5d10e3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-8,"Y":-7},"Size":{"X":15,"Y":14},"DoorAreaInfos":[{"Direction":1,"Start":0,"End":96},{"Direction":2,"Start":0,"End":208},{"Direction":0,"Start":0,"End":192},{"Direction":3,"Start":0,"End":208}],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start3","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/TileInfo.json deleted file mode 100644 index a354c37..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-104,-88,88,-88,88,96,-104,96]},{"Type":1,"Points":[-40,-64,8,-64,8,0,72,0,72,40,-88,40,-88,0,-40,0]}],"Floor":[-7,-6,0,0,8,-7,-5,0,0,8,-7,-4,0,0,8,-7,-3,0,0,8,-7,-2,0,0,8,-7,-1,0,0,8,-7,2,0,0,8,-7,3,0,0,8,-7,4,0,0,8,-7,5,0,0,8,-6,-6,0,0,8,-6,-5,0,0,8,-6,-4,0,0,8,-6,-3,0,0,8,-6,-2,0,0,8,-6,-1,0,0,8,-6,2,0,0,8,-6,3,0,0,8,-6,4,0,0,8,-6,5,0,0,8,-5,-6,0,0,8,-5,-5,0,0,8,-5,-4,0,0,8,-5,-3,0,0,8,-5,-2,0,0,8,-5,-1,0,0,8,-5,2,0,0,8,-5,3,0,0,8,-5,4,0,0,8,-5,5,0,0,8,-4,-6,0,0,8,-4,-5,0,0,8,-4,-4,0,0,8,-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,2,0,0,8,-4,3,0,0,8,-4,4,0,0,8,-4,5,0,0,8,-3,-6,0,0,8,-3,-5,0,0,8,-3,-4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,2,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-3,5,0,0,8,-2,-6,0,0,8,-2,-5,0,0,8,-2,2,0,0,8,-2,3,0,0,8,-2,4,0,0,8,-2,5,0,0,8,-1,-6,0,0,8,-1,-5,0,0,8,-1,2,0,0,8,-1,3,0,0,8,-1,4,0,0,8,-1,5,0,0,8,0,-6,0,0,8,0,-5,0,0,8,0,-4,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,2,0,0,8,0,3,0,0,8,0,4,0,0,8,0,5,0,0,8,1,-6,0,0,8,1,-5,0,0,8,1,-4,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,2,0,0,8,1,3,0,0,8,1,4,0,0,8,1,5,0,0,8,2,-6,0,0,8,2,-5,0,0,8,2,-4,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,2,0,0,8,2,3,0,0,8,2,4,0,0,8,2,5,0,0,8,3,-6,0,0,8,3,-5,0,0,8,3,-4,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,3,5,0,0,8,4,-6,0,0,8,4,-5,0,0,8,4,-4,0,0,8,4,-3,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,4,5,0,0,8,5,-6,0,0,8,5,-5,0,0,8,5,-4,0,0,8,5,-3,0,0,8,5,-2,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,5,5,0,0,8,4,0,0,0,8,4,1,0,0,8,-7,0,0,0,8,-7,1,0,0,8,-6,1,0,0,8,-6,0,0,0,8],"Middle":[-7,-7,0,2,7,-6,-7,0,2,7,-5,-7,0,2,7,-5,1,0,1,7,-4,-7,0,2,7,-4,1,0,2,7,-3,-7,0,2,7,-3,1,0,2,7,-2,-7,0,2,7,-2,1,0,2,7,-1,-7,0,2,7,-1,1,0,2,7,0,-7,0,2,7,0,1,0,2,7,1,-7,0,2,7,1,1,0,2,7,2,-7,0,2,7,2,1,0,2,7,3,-7,0,2,7,3,1,0,3,7,4,-7,0,2,7,5,-7,0,2,7],"Top":[-8,-7,0,3,4,-8,-6,0,3,3,-8,-5,0,3,3,-8,-4,0,3,3,-8,-3,0,3,3,-8,-2,0,3,3,-8,-1,0,3,3,-8,0,0,3,3,-8,1,0,3,3,-8,2,0,3,3,-8,3,0,3,3,-8,4,0,3,3,-8,5,0,3,3,-8,6,0,11,2,-7,6,0,2,2,-6,6,0,2,2,-5,0,0,1,2,-5,6,0,2,2,-4,0,0,2,2,-4,6,0,2,2,-3,0,0,2,2,-3,6,0,2,2,-2,-4,0,1,2,-2,-3,0,1,3,-2,-2,0,1,3,-2,-1,0,1,3,-2,0,0,13,2,-2,6,0,2,2,-1,-4,0,3,2,-1,-3,0,3,3,-1,-2,0,3,3,-1,-1,0,3,3,-1,0,0,11,2,-1,6,0,2,2,0,0,0,2,2,0,6,0,2,2,1,0,0,2,2,1,6,0,2,2,2,0,0,2,2,2,6,0,2,2,3,0,0,3,2,3,6,0,2,2,4,6,0,2,2,5,6,0,2,2,6,-7,0,1,4,6,-6,0,1,3,6,-5,0,1,3,6,-4,0,1,3,6,-3,0,1,3,6,-2,0,1,3,6,-1,0,1,3,6,0,0,1,3,6,1,0,1,3,6,2,0,1,3,6,3,0,1,3,6,4,0,1,3,6,5,0,1,3,6,6,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preinstall.json deleted file mode 100644 index a239003..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":43,"Y":26},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":43,"Y":49},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png deleted file mode 100644 index 9d9c52d..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png.import deleted file mode 100644 index 95f9d45..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cdwxp0hlmhbg3" -path="res://.godot/imported/Preview.png-8e06125c0ecec4a197e22dd3de0e8fb1.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png" -dest_files=["res://.godot/imported/Preview.png-8e06125c0ecec4a197e22dd3de0e8fb1.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/tileMaps/TestGroup1/inlet/Start4/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/RoomInfo.json deleted file mode 100644 index 0d902b3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-3,"Y":-3},"Size":{"X":11,"Y":9},"DoorAreaInfos":[],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start4","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/TileInfo.json deleted file mode 100644 index 77531b5..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-24,-24,104,-24,104,80,-24,80]}],"Floor":[-2,-2,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-2,3,0,0,8,-2,4,0,0,8,-1,-2,0,0,8,-1,-1,0,0,8,-1,0,0,0,8,-1,1,0,0,8,-1,2,0,0,8,-1,3,0,0,8,-1,4,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,0,0,0,8,0,1,0,0,8,0,2,0,0,8,0,3,0,0,8,0,4,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,1,3,0,0,8,1,4,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,1,0,0,8,2,2,0,0,8,2,3,0,0,8,2,4,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,0,0,0,8,4,1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,5,-2,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,6,-2,0,0,8,6,-1,0,0,8,6,0,0,0,8,6,1,0,0,8,6,2,0,0,8,6,3,0,0,8,6,4,0,0,8],"Middle":[-2,-3,0,2,7,-1,-3,0,2,7,0,-3,0,2,7,1,-3,0,2,7,2,-3,0,2,7,3,-3,0,2,7,4,-3,0,2,7,5,-3,0,2,7,6,-3,0,2,7],"Top":[-3,-3,0,3,4,-3,-2,0,3,3,-3,-1,0,3,3,-3,0,0,3,3,-3,1,0,3,3,-3,2,0,3,3,-3,3,0,3,3,-3,4,0,3,3,-3,5,0,11,2,-2,5,0,2,2,-1,5,0,2,2,0,5,0,2,2,1,5,0,2,2,2,5,0,2,2,3,5,0,2,2,4,5,0,2,2,5,5,0,2,2,6,5,0,2,2,7,-3,0,1,4,7,-2,0,1,3,7,-1,0,1,3,7,0,0,1,3,7,1,0,1,3,7,2,0,1,3,7,3,0,1,3,7,4,0,1,3,7,5,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preinstall.json deleted file mode 100644 index 8a3f2d3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"Preinstall1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":160,"Y":-164},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]}],[{"Position":{"X":160,"Y":-140},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png deleted file mode 100644 index d0b030f..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png.import deleted file mode 100644 index 35b9abb..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dfknx1exbrlr3" -path="res://.godot/imported/Preview.png-4ef7f48fbf1f8cdd60e24618c73a0558.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/inlet/Start5/Preview.png" -dest_files=["res://.godot/imported/Preview.png-4ef7f48fbf1f8cdd60e24618c73a0558.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/tileMaps/TestGroup1/inlet/Start5/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/RoomInfo.json deleted file mode 100644 index d9a8221..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":3,"Y":-16},"Size":{"X":14,"Y":12},"DoorAreaInfos":[],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start5","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/TileInfo.json deleted file mode 100644 index 6f28ca3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start5/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[72,-232,248,-232,248,-80,72,-80]}],"Floor":[4,-15,0,0,8,4,-14,0,0,8,4,-13,0,0,8,4,-12,0,0,8,4,-11,0,0,8,4,-10,0,0,8,4,-9,0,0,8,4,-8,0,0,8,4,-7,0,0,8,4,-6,0,0,8,5,-15,0,0,8,5,-14,0,0,8,5,-13,0,0,8,5,-12,0,0,8,5,-11,0,0,8,5,-10,0,0,8,5,-9,0,0,8,5,-8,0,0,8,5,-7,0,0,8,5,-6,0,0,8,6,-15,0,0,8,6,-14,0,0,8,6,-13,0,0,8,6,-12,0,0,8,6,-11,0,0,8,6,-10,0,0,8,6,-9,0,0,8,6,-8,0,0,8,6,-7,0,0,8,6,-6,0,0,8,7,-15,0,0,8,7,-14,0,0,8,7,-13,0,0,8,7,-12,0,0,8,7,-11,0,0,8,7,-10,0,0,8,7,-9,0,0,8,7,-8,0,0,8,7,-7,0,0,8,7,-6,0,0,8,8,-15,0,0,8,8,-14,0,0,8,8,-13,0,0,8,8,-12,0,0,8,8,-11,0,0,8,8,-10,0,0,8,8,-9,0,0,8,8,-8,0,0,8,8,-7,0,0,8,8,-6,0,0,8,9,-15,0,0,8,9,-14,0,0,8,9,-13,0,0,8,9,-12,0,0,8,9,-11,0,0,8,9,-10,0,0,8,9,-9,0,0,8,9,-8,0,0,8,9,-7,0,0,8,9,-6,0,0,8,10,-15,0,0,8,10,-14,0,0,8,10,-13,0,0,8,10,-12,0,0,8,10,-11,0,0,8,10,-10,0,0,8,10,-9,0,0,8,10,-8,0,0,8,10,-7,0,0,8,10,-6,0,0,8,11,-15,0,0,8,11,-14,0,0,8,11,-13,0,0,8,11,-12,0,0,8,11,-11,0,0,8,11,-10,0,0,8,11,-9,0,0,8,11,-8,0,0,8,11,-7,0,0,8,11,-6,0,0,8,12,-15,0,0,8,12,-14,0,0,8,12,-13,0,0,8,12,-12,0,0,8,12,-11,0,0,8,12,-10,0,0,8,12,-9,0,0,8,12,-8,0,0,8,12,-7,0,0,8,12,-6,0,0,8,13,-15,0,0,8,13,-14,0,0,8,13,-13,0,0,8,13,-12,0,0,8,13,-11,0,0,8,13,-10,0,0,8,13,-9,0,0,8,13,-8,0,0,8,13,-7,0,0,8,13,-6,0,0,8,14,-15,0,0,8,14,-14,0,0,8,14,-13,0,0,8,14,-12,0,0,8,14,-11,0,0,8,14,-10,0,0,8,14,-9,0,0,8,14,-8,0,0,8,14,-7,0,0,8,14,-6,0,0,8,15,-15,0,0,8,15,-14,0,0,8,15,-13,0,0,8,15,-12,0,0,8,15,-11,0,0,8,15,-10,0,0,8,15,-9,0,0,8,15,-8,0,0,8,15,-7,0,0,8,15,-6,0,0,8],"Middle":[4,-16,0,2,7,5,-16,0,2,7,6,-16,0,2,7,7,-16,0,2,7,8,-16,0,2,7,9,-16,0,2,7,10,-16,0,2,7,11,-16,0,2,7,12,-16,0,2,7,13,-16,0,2,7,14,-16,0,2,7,15,-16,0,2,7],"Top":[3,-16,0,3,4,3,-15,0,3,3,3,-14,0,3,3,3,-13,0,3,3,3,-12,0,3,3,3,-11,0,3,3,3,-10,0,3,3,3,-9,0,3,3,3,-8,0,3,3,3,-7,0,3,3,3,-6,0,3,3,3,-5,0,11,2,4,-5,0,2,2,5,-5,0,2,2,6,-5,0,2,2,7,-5,0,2,2,8,-5,0,2,2,9,-5,0,2,2,10,-5,0,2,2,11,-5,0,2,2,12,-5,0,2,2,13,-5,0,2,2,14,-5,0,2,2,15,-5,0,2,2,16,-16,0,1,4,16,-15,0,1,3,16,-14,0,1,3,16,-13,0,1,3,16,-12,0,1,3,16,-11,0,1,3,16,-10,0,1,3,16,-9,0,1,3,16,-8,0,1,3,16,-7,0,1,3,16,-6,0,1,3,16,-5,0,13,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preinstall.json deleted file mode 100644 index d4d67e3..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preinstall.json +++ /dev/null @@ -1 +0,0 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":11,"Y":28},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]},{"Name":"test2","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-54,"Y":95},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png deleted file mode 100644 index 81b14c4..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png.import b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png.import deleted file mode 100644 index d756672..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bi3cl40jqw1bq" -path="res://.godot/imported/Preview.png-de99484c552e8633c08889ca0fe2fe8e.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileMaps/TestGroup1/outlet/End1/Preview.png" -dest_files=["res://.godot/imported/Preview.png-de99484c552e8633c08889ca0fe2fe8e.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/tileMaps/TestGroup1/outlet/End1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/RoomInfo.json deleted file mode 100644 index ba808d1..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/RoomInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"Position":{"X":-6,"Y":-4},"Size":{"X":15,"Y":12},"DoorAreaInfos":[],"GroupName":"TestGroup1","RoomType":2,"RoomName":"End1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/TileInfo.json deleted file mode 100644 index 148a844..0000000 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/outlet/End1/TileInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"NavigationList":[{"Type":0,"Points":[-72,-40,120,-40,120,112,-72,112]}],"Floor":[-5,-3,0,0,8,-5,-2,0,0,8,-5,-1,0,0,8,-5,0,0,0,8,-5,1,0,0,8,-5,2,0,0,8,-5,3,0,0,8,-5,4,0,0,8,-5,5,0,0,8,-5,6,0,0,8,-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,0,0,0,8,-4,1,0,0,8,-4,2,0,0,8,-4,3,0,0,8,-4,4,0,0,8,-4,5,0,0,8,-4,6,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-3,2,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-3,5,0,0,8,-3,6,0,0,8,-2,-3,0,0,8,-2,-2,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-2,3,0,0,8,-2,4,0,0,8,-2,5,0,0,8,-2,6,0,0,8,-1,-3,0,0,8,-1,-2,0,0,8,-1,-1,0,0,8,-1,0,0,0,8,-1,1,0,0,8,-1,2,0,0,8,-1,3,0,0,8,-1,4,0,0,8,-1,5,0,0,8,-1,6,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,0,0,0,8,0,1,0,0,8,0,2,0,0,8,0,3,0,0,8,0,4,0,0,8,0,5,0,0,8,0,6,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,1,3,0,0,8,1,4,0,0,8,1,5,0,0,8,1,6,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,1,0,0,8,2,2,0,0,8,2,3,0,0,8,2,4,0,0,8,2,5,0,0,8,2,6,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,3,5,0,0,8,3,6,0,0,8,4,-3,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,0,0,0,8,4,1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,4,5,0,0,8,4,6,0,0,8,5,-3,0,0,8,5,-2,0,0,8,5,-1,0,0,8,5,0,0,0,8,5,1,0,0,8,5,2,0,0,8,5,3,0,0,8,5,4,0,0,8,5,5,0,0,8,5,6,0,0,8,6,-3,0,0,8,6,-2,0,0,8,6,-1,0,0,8,6,0,0,0,8,6,1,0,0,8,6,2,0,0,8,6,3,0,0,8,6,4,0,0,8,6,5,0,0,8,6,6,0,0,8,7,-3,0,0,8,7,-2,0,0,8,7,-1,0,0,8,7,0,0,0,8,7,1,0,0,8,7,2,0,0,8,7,3,0,0,8,7,4,0,0,8,7,5,0,0,8,7,6,0,0,8],"Middle":[-5,-4,0,2,7,-4,-4,0,2,7,-3,-4,0,2,7,-2,-4,0,2,7,-1,-4,0,2,7,0,-4,0,2,7,1,-4,0,2,7,2,-4,0,2,7,3,-4,0,2,7,4,-4,0,2,7,5,-4,0,2,7,6,-4,0,2,7,7,-4,0,2,7],"Top":[-6,-4,0,3,4,-6,-3,0,3,3,-6,-2,0,3,3,-6,-1,0,3,3,-6,0,0,3,3,-6,1,0,3,3,-6,2,0,3,3,-6,3,0,3,3,-6,4,0,3,3,-6,5,0,3,3,-6,6,0,3,3,-6,7,0,11,2,-5,7,0,2,2,-4,7,0,2,2,-3,7,0,2,2,-2,7,0,2,2,-1,7,0,2,2,0,7,0,2,2,1,7,0,2,2,2,7,0,2,2,3,7,0,2,2,4,7,0,2,2,5,7,0,2,2,6,7,0,2,2,7,7,0,2,2,8,-4,0,1,4,8,-3,0,1,3,8,-2,0,1,3,8,-1,0,1,3,8,0,0,1,3,8,1,0,1,3,8,2,0,1,3,8,3,0,1,3,8,4,0,1,3,8,5,0,1,3,8,6,0,1,3,8,7,0,13,2]} \ No newline at end of file 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..193d030 --- /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 new file mode 100644 index 0000000..45a766d --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png 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 new file mode 100644 index 0000000..07c2242 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cq56j2rxoghq4" +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/Test2.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test2.png new file mode 100644 index 0000000..78244d5 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test2.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test2.png.import new file mode 100644 index 0000000..d245cfd --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ca000afypubil" +path="res://.godot/imported/Test2.png-b301e28325d77d91724d44e1372b62e5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileSet/TileSet1/Test2.png" +dest_files=["res://.godot/imported/Test2.png-b301e28325d77d91724d44e1372b62e5.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/Test3.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test3.png new file mode 100644 index 0000000..c3cbdb1 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test3.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test3.png.import new file mode 100644 index 0000000..09c92c1 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/Test3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8dljk1dbo45l" +path="res://.godot/imported/Test3.png-c2f29114ce951ed85e4d92b58dbb0d74.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileSet/TileSet1/Test3.png" +dest_files=["res://.godot/imported/Test3.png-c2f29114ce951ed85e4d92b58dbb0d74.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 new file mode 100644 index 0000000..b8042c2 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json @@ -0,0 +1,1084 @@ +{ + "Name": "TileSet1", + "Sources": [ + { + "Name": "Main", + "SourcePath": "resource/map/tileSet/TileSet1/Main.png", + "Terrain": [ + { + "Name": "Main", + "F": { + "0": [ + 0, + 64 + ] + }, + "M": { + "1": [ + 16, + 64 + ], + "2": [ + 32, + 64 + ], + "3": [ + 48, + 64 + ], + "0": [ + 64, + 64 + ], + "5": [ + 16, + 80 + ], + "6": [ + 32, + 80 + ], + "7": [ + 48, + 80 + ], + "4": [ + 64, + 80 + ] + }, + "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 + ] + }, + "TerrainType": 0, + "Ready": true + }, + { + "Name": "Test1", + "F": {}, + "M": {}, + "T": {}, + "TerrainType": 1, + "Ready": false + } + ], + "Combination": [] + }, + { + "Name": "Test1", + "SourcePath": "resource/map/tileSet/TileSet1/Test1.png", + "Terrain": [], + "Combination": [ + { + "Id": "638411075459225723", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 80, + "Y": 80 + }, + { + "X": 80, + "Y": 96 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 0, + "Y": 16 + } + ] + }, + { + "Id": "638411075513293604", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 160, + "Y": 80 + }, + { + "X": 160, + "Y": 96 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 0, + "Y": 16 + } + ] + }, + { + "Id": "638411075593121170", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 288, + "Y": 192 + }, + { + "X": 304, + "Y": 192 + }, + { + "X": 304, + "Y": 176 + }, + { + "X": 288, + "Y": 176 + } + ], + "Positions": [ + { + "X": 0, + "Y": 16 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 16, + "Y": 0 + }, + { + "X": 0, + "Y": 0 + } + ] + }, + { + "Id": "638411075650242118", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 96, + "Y": 224 + }, + { + "X": 112, + "Y": 224 + }, + { + "X": 128, + "Y": 224 + }, + { + "X": 128, + "Y": 240 + }, + { + "X": 112, + "Y": 240 + }, + { + "X": 96, + "Y": 240 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 16, + "Y": 0 + }, + { + "X": 32, + "Y": 0 + }, + { + "X": 32, + "Y": 16 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 0, + "Y": 16 + } + ] + }, + { + "Id": "638411075701755677", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 192, + "Y": 208 + }, + { + "X": 192, + "Y": 224 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 0, + "Y": 16 + } + ] + }, + { + "Id": "638411075748707154", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 240, + "Y": 208 + }, + { + "X": 256, + "Y": 208 + }, + { + "X": 256, + "Y": 224 + }, + { + "X": 240, + "Y": 224 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 16, + "Y": 0 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 0, + "Y": 16 + } + ] + } + ] + }, + { + "Name": "Test2", + "SourcePath": "resource/map/tileSet/TileSet1/Test2.png", + "Terrain": [ + { + "Name": "Terrain1", + "F": {}, + "M": {}, + "T": { + "272": [ + 16, + 96 + ], + "336": [ + 32, + 96 + ], + "80": [ + 48, + 96 + ], + "341": [ + 32, + 112 + ], + "276": [ + 16, + 112 + ], + "81": [ + 48, + 112 + ], + "20": [ + 16, + 128 + ], + "21": [ + 32, + 128 + ], + "17": [ + 48, + 128 + ], + "85": [ + 64, + 128 + ], + "277": [ + 80, + 128 + ], + "337": [ + 64, + 144 + ], + "340": [ + 80, + 144 + ] + }, + "TerrainType": 1, + "Ready": true + }, + { + "Name": "T2", + "F": {}, + "M": {}, + "T": { + "504": [ + 128, + 16 + ], + "216": [ + 144, + 16 + ], + "438": [ + 112, + 32 + ], + "432": [ + 112, + 16 + ], + "511": [ + 128, + 32 + ], + "54": [ + 112, + 48 + ], + "63": [ + 128, + 48 + ], + "27": [ + 144, + 48 + ], + "219": [ + 144, + 32 + ] + }, + "TerrainType": 0, + "Ready": false + } + ], + "Combination": [ + { + "Id": "638411400212509936", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 16, + "Y": 96 + }, + { + "X": 16, + "Y": 112 + }, + { + "X": 16, + "Y": 112 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 64, + "Y": 144 + }, + { + "X": 48, + "Y": 112 + }, + { + "X": 48, + "Y": 96 + }, + { + "X": 32, + "Y": 96 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 16, + "Y": 112 + }, + { + "X": 16, + "Y": 128 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 96 + }, + { + "X": 32, + "Y": 96 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 96 + }, + { + "X": 16, + "Y": 96 + }, + { + "X": 16, + "Y": 112 + }, + { + "X": 16, + "Y": 112 + }, + { + "X": 80, + "Y": 144 + }, + { + "X": 32, + "Y": 112 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 32, + "Y": 128 + }, + { + "X": 48, + "Y": 128 + }, + { + "X": 48, + "Y": 112 + }, + { + "X": 48, + "Y": 112 + }, + { + "X": 48, + "Y": 112 + }, + { + "X": 48, + "Y": 112 + }, + { + "X": 48, + "Y": 96 + } + ], + "Positions": [ + { + "X": 0, + "Y": 16 + }, + { + "X": 0, + "Y": 32 + }, + { + "X": 0, + "Y": 48 + }, + { + "X": 16, + "Y": 48 + }, + { + "X": 32, + "Y": 48 + }, + { + "X": 32, + "Y": 32 + }, + { + "X": 32, + "Y": 16 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 16, + "Y": 32 + }, + { + "X": 0, + "Y": 64 + }, + { + "X": 0, + "Y": 80 + }, + { + "X": 16, + "Y": 80 + }, + { + "X": 16, + "Y": 64 + }, + { + "X": 32, + "Y": 64 + }, + { + "X": 48, + "Y": 64 + }, + { + "X": 48, + "Y": 48 + }, + { + "X": 64, + "Y": 48 + }, + { + "X": 64, + "Y": 64 + }, + { + "X": 80, + "Y": 64 + }, + { + "X": 80, + "Y": 48 + }, + { + "X": 96, + "Y": 0 + }, + { + "X": 96, + "Y": 16 + }, + { + "X": 96, + "Y": 32 + }, + { + "X": 96, + "Y": 48 + }, + { + "X": 96, + "Y": 64 + }, + { + "X": 32, + "Y": 80 + }, + { + "X": 48, + "Y": 80 + }, + { + "X": 64, + "Y": 80 + }, + { + "X": 80, + "Y": 80 + }, + { + "X": 96, + "Y": 80 + }, + { + "X": 112, + "Y": 80 + }, + { + "X": 112, + "Y": 48 + }, + { + "X": 112, + "Y": 64 + }, + { + "X": 112, + "Y": 32 + }, + { + "X": 112, + "Y": 16 + }, + { + "X": 112, + "Y": 0 + } + ] + } + ] + }, + { + "Name": "Test3", + "SourcePath": "resource/map/tileSet/TileSet1/Test3.png", + "Terrain": [ + { + "Name": "T1", + "F": {}, + "M": {}, + "T": { + "144": [ + 0, + 0 + ], + "146": [ + 0, + 16 + ], + "18": [ + 0, + 32 + ], + "176": [ + 16, + 0 + ], + "184": [ + 32, + 0 + ], + "152": [ + 48, + 0 + ], + "178": [ + 16, + 16 + ], + "186": [ + 32, + 16 + ], + "154": [ + 48, + 16 + ], + "50": [ + 16, + 32 + ], + "58": [ + 32, + 32 + ], + "26": [ + 48, + 32 + ], + "16": [ + 0, + 48 + ], + "48": [ + 16, + 48 + ], + "56": [ + 32, + 48 + ], + "24": [ + 48, + 48 + ], + "187": [ + 64, + 0 + ], + "434": [ + 64, + 16 + ], + "182": [ + 64, + 32 + ], + "250": [ + 64, + 48 + ], + "440": [ + 80, + 0 + ], + "510": [ + 80, + 16 + ], + "447": [ + 80, + 32 + ], + "62": [ + 80, + 48 + ], + "248": [ + 96, + 0 + ], + "190": [ + 112, + 0 + ], + "507": [ + 96, + 16 + ], + "218": [ + 112, + 16 + ], + "255": [ + 96, + 32 + ], + "155": [ + 112, + 32 + ], + "59": [ + 96, + 48 + ], + "442": [ + 112, + 48 + ], + "432": [ + 128, + 0 + ], + "506": [ + 144, + 0 + ], + "504": [ + 160, + 0 + ], + "216": [ + 176, + 0 + ], + "438": [ + 128, + 16 + ], + "443": [ + 144, + 16 + ], + "254": [ + 160, + 32 + ], + "511": [ + 144, + 32 + ], + "446": [ + 128, + 32 + ], + "54": [ + 128, + 48 + ], + "63": [ + 144, + 48 + ], + "191": [ + 160, + 48 + ], + "27": [ + 176, + 48 + ], + "219": [ + 176, + 32 + ], + "251": [ + 176, + 16 + ] + }, + "TerrainType": 0, + "Ready": true + } + ], + "Combination": [] + } + ] +} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png new file mode 100644 index 0000000..d74eba2 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png.import new file mode 100644 index 0000000..be7dd76 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Main.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6pesrr162s6" +path="res://.godot/imported/Main.png-d5a6dac6cf1a2b2af633c597ddadfe73.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileSet/TileSet2/Main.png" +dest_files=["res://.godot/imported/Main.png-d5a6dac6cf1a2b2af633c597ddadfe73.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/TileSet2/Test2.png b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Test2.png new file mode 100644 index 0000000..cb64efb --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Test2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Test2.png.import b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Test2.png.import new file mode 100644 index 0000000..2dd9ddc --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/Test2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dslcjy284qx53" +path="res://.godot/imported/Test2.png-427a8c43a36ea928d410624045881fbb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/map/tileSet/TileSet2/Test2.png" +dest_files=["res://.godot/imported/Test2.png-427a8c43a36ea928d410624045881fbb.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/TileSet2/TileSet.json b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/TileSet.json new file mode 100644 index 0000000..dfcd90e --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet2/TileSet.json @@ -0,0 +1,618 @@ +{ + "Name": "TileSet2", + "Sources": [ + { + "Name": "Main", + "SourcePath": "resource/map/tileSet/TileSet2/Main.png", + "Terrain": [ + { + "Name": "Main", + "F": { + "0": [ + 16, + 144 + ] + }, + "M": { + "3": [ + 160, + 112 + ], + "2": [ + 80, + 112 + ], + "1": [ + 64, + 112 + ], + "0": [ + 0, + 112 + ] + }, + "T": { + "144": [ + 0, + 32 + ], + "146": [ + 0, + 48 + ], + "434": [ + 80, + 96 + ], + "18": [ + 0, + 96 + ], + "219": [ + 160, + 80 + ], + "438": [ + 64, + 80 + ], + "63": [ + 96, + 96 + ], + "504": [ + 112, + 0 + ], + "506": [ + 192, + 32 + ], + "16": [ + 0, + 0 + ], + "48": [ + 16, + 0 + ], + "56": [ + 32, + 0 + ], + "24": [ + 48, + 0 + ], + "50": [ + 64, + 64 + ], + "26": [ + 160, + 64 + ], + "176": [ + 16, + 32 + ], + "178": [ + 32, + 32 + ], + "184": [ + 48, + 32 + ], + "186": [ + 32, + 48 + ], + "58": [ + 16, + 64 + ], + "152": [ + 32, + 64 + ], + "154": [ + 64, + 96 + ], + "182": [ + 16, + 48 + ], + "250": [ + 48, + 48 + ], + "187": [ + 48, + 64 + ], + "440": [ + 0, + 64 + ], + "510": [ + 0, + 80 + ], + "447": [ + 80, + 32 + ], + "62": [ + 16, + 96 + ], + "248": [ + 48, + 96 + ], + "507": [ + 0, + 16 + ], + "255": [ + 128, + 0 + ], + "59": [ + 144, + 0 + ], + "190": [ + 176, + 0 + ], + "218": [ + 192, + 0 + ], + "155": [ + 176, + 16 + ], + "442": [ + 144, + 16 + ], + "432": [ + 112, + 16 + ], + "446": [ + 80, + 16 + ], + "54": [ + 64, + 16 + ], + "511": [ + 80, + 0 + ], + "254": [ + 96, + 16 + ], + "443": [ + 112, + 32 + ], + "191": [ + 128, + 16 + ], + "251": [ + 160, + 16 + ], + "216": [ + 144, + 32 + ], + "27": [ + 160, + 32 + ] + }, + "TerrainType": 0, + "Ready": false + }, + { + "Name": "Test2", + "F": {}, + "M": {}, + "T": { + "337": [ + 224, + 0 + ], + "340": [ + 240, + 0 + ], + "80": [ + 160, + 0 + ], + "272": [ + 64, + 0 + ], + "85": [ + 96, + 32 + ], + "341": [ + 32, + 80 + ], + "276": [ + 16, + 80 + ], + "277": [ + 128, + 32 + ], + "81": [ + 48, + 80 + ], + "17": [ + 48, + 16 + ], + "21": [ + 32, + 16 + ], + "20": [ + 16, + 16 + ], + "336": [ + 96, + 0 + ] + }, + "TerrainType": 1, + "Ready": true + } + ], + "Combination": [ + { + "Id": "638404496948408912", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 160, + "Y": 128 + }, + { + "X": 176, + "Y": 128 + }, + { + "X": 192, + "Y": 128 + }, + { + "X": 208, + "Y": 128 + }, + { + "X": 224, + "Y": 128 + }, + { + "X": 240, + "Y": 128 + }, + { + "X": 240, + "Y": 144 + }, + { + "X": 224, + "Y": 144 + }, + { + "X": 208, + "Y": 144 + }, + { + "X": 192, + "Y": 144 + }, + { + "X": 176, + "Y": 144 + }, + { + "X": 160, + "Y": 144 + }, + { + "X": 160, + "Y": 128 + }, + { + "X": 176, + "Y": 128 + }, + { + "X": 192, + "Y": 128 + }, + { + "X": 208, + "Y": 128 + }, + { + "X": 224, + "Y": 128 + }, + { + "X": 240, + "Y": 128 + }, + { + "X": 240, + "Y": 144 + }, + { + "X": 224, + "Y": 144 + }, + { + "X": 208, + "Y": 144 + }, + { + "X": 192, + "Y": 144 + }, + { + "X": 176, + "Y": 144 + }, + { + "X": 160, + "Y": 144 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 16, + "Y": 0 + }, + { + "X": 32, + "Y": 0 + }, + { + "X": 48, + "Y": 0 + }, + { + "X": 64, + "Y": 0 + }, + { + "X": 80, + "Y": 0 + }, + { + "X": 80, + "Y": 16 + }, + { + "X": 64, + "Y": 16 + }, + { + "X": 48, + "Y": 16 + }, + { + "X": 32, + "Y": 16 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 0, + "Y": 16 + }, + { + "X": 0, + "Y": 32 + }, + { + "X": 16, + "Y": 32 + }, + { + "X": 32, + "Y": 32 + }, + { + "X": 48, + "Y": 32 + }, + { + "X": 64, + "Y": 32 + }, + { + "X": 80, + "Y": 32 + }, + { + "X": 80, + "Y": 48 + }, + { + "X": 64, + "Y": 48 + }, + { + "X": 48, + "Y": 48 + }, + { + "X": 32, + "Y": 48 + }, + { + "X": 16, + "Y": 48 + }, + { + "X": 0, + "Y": 48 + } + ] + } + ] + }, + { + "Name": "Test2", + "SourcePath": "resource/map/tileSet/TileSet2/Test2.png", + "Terrain": [ + { + "Name": "TestTerrain2", + "F": {}, + "M": {}, + "T": { + "80": [ + 176, + 0 + ], + "272": [ + 128, + 0 + ], + "336": [ + 160, + 0 + ], + "21": [ + 144, + 48 + ], + "20": [ + 128, + 48 + ], + "17": [ + 176, + 48 + ], + "81": [ + 176, + 32 + ], + "276": [ + 128, + 16 + ], + "341": [ + 144, + 32 + ], + "337": [ + 96, + 16 + ], + "85": [ + 96, + 32 + ], + "277": [ + 80, + 32 + ], + "340": [ + 80, + 16 + ] + }, + "TerrainType": 1, + "Ready": true + } + ], + "Combination": [ + { + "Id": "638404866100310178", + "Name": "\u7EC4\u5408", + "Cells": [ + { + "X": 16, + "Y": 48 + }, + { + "X": 32, + "Y": 48 + }, + { + "X": 48, + "Y": 48 + }, + { + "X": 48, + "Y": 64 + }, + { + "X": 32, + "Y": 64 + }, + { + "X": 16, + "Y": 64 + } + ], + "Positions": [ + { + "X": 0, + "Y": 0 + }, + { + "X": 16, + "Y": 0 + }, + { + "X": 32, + "Y": 0 + }, + { + "X": 32, + "Y": 16 + }, + { + "X": 16, + "Y": 16 + }, + { + "X": 0, + "Y": 16 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSetConfig.json b/DungeonShooting_Godot/resource/map/tileSet/TileSetConfig.json new file mode 100644 index 0000000..82cab39 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSetConfig.json @@ -0,0 +1,10 @@ +{ + "TileSet1": { + "Path": "resource/map/tileSet/TileSet1", + "Remark": "" + }, + "TileSet2": { + "Path": "resource/map/tileSet/TileSet2", + "Remark": "" + } +} diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet_old.tres b/DungeonShooting_Godot/resource/map/tileSet/TileSet_old.tres deleted file mode 100644 index e63012e..0000000 --- a/DungeonShooting_Godot/resource/map/tileSet/TileSet_old.tres +++ /dev/null @@ -1,560 +0,0 @@ -[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://bn21mn0gu6jel"] - -[ext_resource type="Texture2D" uid="uid://dj8nrd5od4fcl" path="res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" id="1_vqd0o"] - - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_rkmbu"] -texture = ExtResource("1_vqd0o") -0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 -8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 -9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 -10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 -11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 -12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 -13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -6:1/0 = 0 -6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:1/0/physics_layer_0/angular_velocity = 0.0 -7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 -8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 -9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 -10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 -11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 -12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 -13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -0:2/0 = 0 -0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:2/0/physics_layer_0/angular_velocity = 0.0 -1:2/0 = 0 -1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:2/0/physics_layer_0/angular_velocity = 0.0 -1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -5:2/0 = 0 -5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:2/0/physics_layer_0/angular_velocity = 0.0 -6:2/0 = 0 -6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:2/0/physics_layer_0/angular_velocity = 0.0 -7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 -8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 -9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 -10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 -11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 -11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 -13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 -13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -0:3/0 = 0 -0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:3/0/physics_layer_0/angular_velocity = 0.0 -1:3/0 = 0 -1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:3/0/physics_layer_0/angular_velocity = 0.0 -1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:3/0 = 0 -2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:3/0/physics_layer_0/angular_velocity = 0.0 -2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -6:3/0 = 0 -6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:3/0/physics_layer_0/angular_velocity = 0.0 -7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 -8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 -9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 -10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 -13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -0:4/0 = 0 -0:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:4/0/physics_layer_0/angular_velocity = 0.0 -1:4/0 = 0 -1:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:4/0/physics_layer_0/angular_velocity = 0.0 -1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:4/0 = 0 -2:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:4/0/physics_layer_0/angular_velocity = 0.0 -2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -6:4/0 = 0 -6:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 -12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 -13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -0:5/0 = 0 -0:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:5/0/physics_layer_0/angular_velocity = 0.0 -1:5/0 = 0 -1:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:5/0/physics_layer_0/angular_velocity = 0.0 -1:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:5/0 = 0 -2:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:5/0/physics_layer_0/angular_velocity = 0.0 -2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -5:5/0 = 0 -5:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:5/0/physics_layer_0/angular_velocity = 0.0 -6:5/0 = 0 -6:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 -12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 -13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -0:6/0 = 0 -0:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:6/0/physics_layer_0/angular_velocity = 0.0 -1:6/0 = 0 -1:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:6/0/physics_layer_0/angular_velocity = 0.0 -1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:6/0 = 0 -2:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:6/0/physics_layer_0/angular_velocity = 0.0 -2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -5:6/0 = 0 -5:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:6/0/physics_layer_0/angular_velocity = 0.0 -6:6/0 = 0 -6:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 -12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 -13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -0:7/0 = 0 -0:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:7/0/physics_layer_0/angular_velocity = 0.0 -1:7/0 = 0 -1:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:7/0/physics_layer_0/angular_velocity = 0.0 -1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -6:7/0 = 0 -6:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:7/0/physics_layer_0/angular_velocity = 0.0 -7:7/0 = 0 -7:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:7/0/physics_layer_0/angular_velocity = 0.0 -8:7/0 = 0 -8:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:7/0/physics_layer_0/angular_velocity = 0.0 -9:7/0 = 0 -9:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:7/0/physics_layer_0/angular_velocity = 0.0 -10:7/0 = 0 -10:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:7/0/physics_layer_0/angular_velocity = 0.0 -11:7/0 = 0 -11:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:7/0/physics_layer_0/angular_velocity = 0.0 -12:7/0 = 0 -12:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:7/0/physics_layer_0/angular_velocity = 0.0 -13:7/0 = 0 -13:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:7/0/physics_layer_0/angular_velocity = 0.0 -14:7/0 = 0 -14:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:7/0/physics_layer_0/angular_velocity = 0.0 -15:7/0 = 0 -15:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:7/0/physics_layer_0/angular_velocity = 0.0 -0:8/0 = 0 -0:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:8/0/physics_layer_0/angular_velocity = 0.0 -1:8/0 = 0 -1:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:8/0/physics_layer_0/angular_velocity = 0.0 -2:8/0 = 0 -2:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:8/0/physics_layer_0/angular_velocity = 0.0 -3:8/0 = 0 -3:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:8/0/physics_layer_0/angular_velocity = 0.0 -4:8/0 = 0 -4:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:8/0/physics_layer_0/angular_velocity = 0.0 -5:8/0 = 0 -5:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:8/0/physics_layer_0/angular_velocity = 0.0 -6:8/0 = 0 -6:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:8/0/physics_layer_0/angular_velocity = 0.0 -7:8/0 = 0 -7:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:8/0/physics_layer_0/angular_velocity = 0.0 -8:8/0 = 0 -8:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:8/0/physics_layer_0/angular_velocity = 0.0 -9:8/0 = 0 -9:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:8/0/physics_layer_0/angular_velocity = 0.0 -10:8/0 = 0 -10:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:8/0/physics_layer_0/angular_velocity = 0.0 -11:8/0 = 0 -11:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:8/0/physics_layer_0/angular_velocity = 0.0 -12:8/0 = 0 -12:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:8/0/physics_layer_0/angular_velocity = 0.0 -13:8/0 = 0 -13:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:8/0/physics_layer_0/angular_velocity = 0.0 -14:8/0 = 0 -14:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:8/0/physics_layer_0/angular_velocity = 0.0 -15:8/0 = 0 -15:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:8/0/physics_layer_0/angular_velocity = 0.0 -0:9/0 = 0 -0:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:9/0/physics_layer_0/angular_velocity = 0.0 -1:9/0 = 0 -1:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:9/0/physics_layer_0/angular_velocity = 0.0 -2:9/0 = 0 -2:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:9/0/physics_layer_0/angular_velocity = 0.0 -3:9/0 = 0 -3:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:9/0/physics_layer_0/angular_velocity = 0.0 -4:9/0 = 0 -4:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:9/0/physics_layer_0/angular_velocity = 0.0 -5:9/0 = 0 -5:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:9/0/physics_layer_0/angular_velocity = 0.0 -6:9/0 = 0 -6:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:9/0/physics_layer_0/angular_velocity = 0.0 -7:9/0 = 0 -7:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:9/0/physics_layer_0/angular_velocity = 0.0 -10:9/0 = 0 -10:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:9/0/physics_layer_0/angular_velocity = 0.0 -11:9/0 = 0 -11:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:9/0/physics_layer_0/angular_velocity = 0.0 -12:9/0 = 0 -12:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:9/0/physics_layer_0/angular_velocity = 0.0 -13:9/0 = 0 -13:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:9/0/physics_layer_0/angular_velocity = 0.0 -14:9/0 = 0 -14:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:9/0/physics_layer_0/angular_velocity = 0.0 -15:9/0 = 0 -15:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:9/0/physics_layer_0/angular_velocity = 0.0 -0:10/0 = 0 -0:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:10/0/physics_layer_0/angular_velocity = 0.0 -1:10/0 = 0 -1:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:10/0/physics_layer_0/angular_velocity = 0.0 -2:10/0 = 0 -2:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:10/0/physics_layer_0/angular_velocity = 0.0 -3:10/0 = 0 -3:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:10/0/physics_layer_0/angular_velocity = 0.0 -5:10/0 = 0 -5:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:10/0/physics_layer_0/angular_velocity = 0.0 -6:10/0 = 0 -6:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:10/0/physics_layer_0/angular_velocity = 0.0 -7:10/0 = 0 -7:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:10/0/physics_layer_0/angular_velocity = 0.0 -13:10/0 = 0 -13:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:10/0/physics_layer_0/angular_velocity = 0.0 -14:10/0 = 0 -14:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:10/0/physics_layer_0/angular_velocity = 0.0 -15:10/0 = 0 -15:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:10/0/physics_layer_0/angular_velocity = 0.0 -0:11/0 = 0 -0:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:11/0/physics_layer_0/angular_velocity = 0.0 -1:11/0 = 0 -1:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:11/0/physics_layer_0/angular_velocity = 0.0 -2:11/0 = 0 -2:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:11/0/physics_layer_0/angular_velocity = 0.0 -3:11/0 = 0 -3:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:11/0/physics_layer_0/angular_velocity = 0.0 -4:11/0 = 0 -4:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:11/0/physics_layer_0/angular_velocity = 0.0 -13:11/0 = 0 -13:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:11/0/physics_layer_0/angular_velocity = 0.0 -14:11/0 = 0 -14:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:11/0/physics_layer_0/angular_velocity = 0.0 -15:11/0 = 0 -15:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:11/0/physics_layer_0/angular_velocity = 0.0 - -[resource] -physics_layer_0/collision_layer = 1 -physics_layer_0/collision_mask = 0 -sources/1 = SubResource("TileSetAtlasSource_rkmbu") diff --git a/DungeonShooting_Godot/resource/map/tileSet/map1/TileSet1.tres b/DungeonShooting_Godot/resource/map/tileSet/map1/TileSet1.tres deleted file mode 100644 index 0cb7129..0000000 --- a/DungeonShooting_Godot/resource/map/tileSet/map1/TileSet1.tres +++ /dev/null @@ -1,609 +0,0 @@ -[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://b00g22o1cqhe8"] - -[ext_resource type="Texture2D" uid="uid://dj8nrd5od4fcl" path="res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" id="1_aqcu3"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yvgyd"] -texture = ExtResource("1_aqcu3") -0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 -8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 -9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 -10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 -11:0/next_alternative_id = 2 -11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 -12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 -13:0/next_alternative_id = 2 -13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -6:1/0 = 0 -6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:1/0/physics_layer_0/angular_velocity = 0.0 -7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 -8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 -9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 -10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 -11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 -12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 -13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -0:2/0 = 0 -0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:2/0/physics_layer_0/angular_velocity = 0.0 -1:2/0 = 0 -1:2/0/terrain_set = 0 -1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:2/0/physics_layer_0/angular_velocity = 0.0 -1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -1:2/0/terrains_peering_bit/bottom_left_corner = 0 -1:2/0/terrains_peering_bit/top_left_corner = 0 -1:2/0/terrains_peering_bit/top_right_corner = 0 -2:2/0 = 0 -2:2/0/terrain_set = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -2:2/0/terrains_peering_bit/top_left_corner = 0 -2:2/0/terrains_peering_bit/top_right_corner = 0 -3:2/0 = 0 -3:2/0/terrain_set = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) -3:2/0/terrains_peering_bit/bottom_right_corner = 0 -3:2/0/terrains_peering_bit/top_left_corner = 0 -3:2/0/terrains_peering_bit/top_right_corner = 0 -4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -5:2/0 = 0 -5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:2/0/physics_layer_0/angular_velocity = 0.0 -6:2/0 = 0 -6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:2/0/physics_layer_0/angular_velocity = 0.0 -7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 -8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 -9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 -10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 -11:2/0 = 0 -11:2/0/terrain_set = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 -11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/terrains_peering_bit/top_right_corner = 0 -12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 -13:2/0 = 0 -13:2/0/terrain_set = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 -13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/terrains_peering_bit/top_left_corner = 0 -14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -0:3/0 = 0 -0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:3/0/physics_layer_0/angular_velocity = 0.0 -1:3/0 = 0 -1:3/0/terrain_set = 0 -1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:3/0/physics_layer_0/angular_velocity = 0.0 -1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:3/0/terrains_peering_bit/bottom_left_corner = 0 -1:3/0/terrains_peering_bit/top_left_corner = 0 -2:3/0 = 0 -2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:3/0/physics_layer_0/angular_velocity = 0.0 -2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:3/0 = 0 -3:3/0/terrain_set = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:3/0/terrains_peering_bit/bottom_right_corner = 0 -3:3/0/terrains_peering_bit/top_right_corner = 0 -4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -6:3/0 = 0 -6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:3/0/physics_layer_0/angular_velocity = 0.0 -7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 -8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 -9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 -10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 -13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -0:4/0 = 0 -0:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:4/0/physics_layer_0/angular_velocity = 0.0 -1:4/0 = 0 -1:4/0/terrain_set = 0 -1:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:4/0/physics_layer_0/angular_velocity = 0.0 -1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:4/0/terrains_peering_bit/bottom_left_corner = 0 -2:4/0 = 0 -2:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:4/0/physics_layer_0/angular_velocity = 0.0 -2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:4/0 = 0 -3:4/0/terrain_set = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:4/0/terrains_peering_bit/bottom_right_corner = 0 -4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -6:4/0 = 0 -6:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 -12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 -13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -0:5/0 = 0 -0:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:5/0/physics_layer_0/angular_velocity = 0.0 -1:5/0 = 0 -1:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:5/0/physics_layer_0/angular_velocity = 0.0 -1:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:5/0 = 0 -2:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:5/0/physics_layer_0/angular_velocity = 0.0 -2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -5:5/0 = 0 -5:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:5/0/physics_layer_0/angular_velocity = 0.0 -6:5/0 = 0 -6:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 -12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 -13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -0:6/0 = 0 -0:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:6/0/physics_layer_0/angular_velocity = 0.0 -1:6/next_alternative_id = 3 -1:6/0 = 0 -1:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:6/0/physics_layer_0/angular_velocity = 0.0 -1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:6/next_alternative_id = 3 -2:6/0 = 0 -2:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:6/0/physics_layer_0/angular_velocity = 0.0 -2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:6/next_alternative_id = 3 -3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -5:6/0 = 0 -5:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:6/0/physics_layer_0/angular_velocity = 0.0 -6:6/0 = 0 -6:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 -12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 -13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -0:7/0 = 0 -0:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:7/0/physics_layer_0/angular_velocity = 0.0 -1:7/0 = 0 -1:7/0/terrain_set = 0 -1:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:7/0/physics_layer_0/angular_velocity = 0.0 -1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:7/0/terrains_peering_bit/bottom_right_corner = 0 -1:7/0/terrains_peering_bit/bottom_left_corner = 0 -1:7/0/terrains_peering_bit/top_left_corner = 0 -2:7/0 = 0 -2:7/0/terrain_set = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:7/0/terrains_peering_bit/bottom_right_corner = 0 -2:7/0/terrains_peering_bit/bottom_left_corner = 0 -3:7/0 = 0 -3:7/0/terrain_set = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:7/0/terrains_peering_bit/bottom_right_corner = 0 -3:7/0/terrains_peering_bit/bottom_left_corner = 0 -3:7/0/terrains_peering_bit/top_right_corner = 0 -4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -6:7/0 = 0 -6:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:7/0/physics_layer_0/angular_velocity = 0.0 -7:7/0 = 0 -7:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:7/0/physics_layer_0/angular_velocity = 0.0 -8:7/0 = 0 -8:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:7/0/physics_layer_0/angular_velocity = 0.0 -9:7/0 = 0 -9:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:7/0/physics_layer_0/angular_velocity = 0.0 -10:7/0 = 0 -10:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:7/0/physics_layer_0/angular_velocity = 0.0 -11:7/0 = 0 -11:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:7/0/physics_layer_0/angular_velocity = 0.0 -12:7/0 = 0 -12:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:7/0/physics_layer_0/angular_velocity = 0.0 -13:7/0 = 0 -13:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:7/0/physics_layer_0/angular_velocity = 0.0 -14:7/0 = 0 -14:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:7/0/physics_layer_0/angular_velocity = 0.0 -15:7/0 = 0 -15:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:7/0/physics_layer_0/angular_velocity = 0.0 -0:8/0 = 0 -0:8/0/terrain_set = 0 -0:8/0/terrain = 0 -0:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:8/0/physics_layer_0/angular_velocity = 0.0 -0:8/0/terrains_peering_bit/bottom_right_corner = 0 -0:8/0/terrains_peering_bit/bottom_left_corner = 0 -0:8/0/terrains_peering_bit/top_left_corner = 0 -0:8/0/terrains_peering_bit/top_right_corner = 0 -1:8/0 = 0 -1:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:8/0/physics_layer_0/angular_velocity = 0.0 -2:8/0 = 0 -2:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:8/0/physics_layer_0/angular_velocity = 0.0 -3:8/0 = 0 -3:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:8/0/physics_layer_0/angular_velocity = 0.0 -4:8/0 = 0 -4:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:8/0/physics_layer_0/angular_velocity = 0.0 -5:8/0 = 0 -5:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:8/0/physics_layer_0/angular_velocity = 0.0 -6:8/0 = 0 -6:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:8/0/physics_layer_0/angular_velocity = 0.0 -7:8/0 = 0 -7:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:8/0/physics_layer_0/angular_velocity = 0.0 -8:8/0 = 0 -8:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:8/0/physics_layer_0/angular_velocity = 0.0 -9:8/0 = 0 -9:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:8/0/physics_layer_0/angular_velocity = 0.0 -10:8/0 = 0 -10:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:8/0/physics_layer_0/angular_velocity = 0.0 -11:8/0 = 0 -11:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:8/0/physics_layer_0/angular_velocity = 0.0 -12:8/0 = 0 -12:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:8/0/physics_layer_0/angular_velocity = 0.0 -13:8/0 = 0 -13:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:8/0/physics_layer_0/angular_velocity = 0.0 -14:8/0 = 0 -14:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:8/0/physics_layer_0/angular_velocity = 0.0 -15:8/0 = 0 -15:8/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:8/0/physics_layer_0/angular_velocity = 0.0 -0:9/0 = 0 -0:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:9/0/physics_layer_0/angular_velocity = 0.0 -1:9/0 = 0 -1:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:9/0/physics_layer_0/angular_velocity = 0.0 -2:9/0 = 0 -2:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:9/0/physics_layer_0/angular_velocity = 0.0 -3:9/0 = 0 -3:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:9/0/physics_layer_0/angular_velocity = 0.0 -4:9/0 = 0 -4:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:9/0/physics_layer_0/angular_velocity = 0.0 -5:9/0 = 0 -5:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:9/0/physics_layer_0/angular_velocity = 0.0 -6:9/0 = 0 -6:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:9/0/physics_layer_0/angular_velocity = 0.0 -7:9/0 = 0 -7:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:9/0/physics_layer_0/angular_velocity = 0.0 -10:9/0 = 0 -10:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:9/0/physics_layer_0/angular_velocity = 0.0 -11:9/0 = 0 -11:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:9/0/physics_layer_0/angular_velocity = 0.0 -12:9/0 = 0 -12:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:9/0/physics_layer_0/angular_velocity = 0.0 -13:9/0 = 0 -13:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:9/0/physics_layer_0/angular_velocity = 0.0 -14:9/0 = 0 -14:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:9/0/physics_layer_0/angular_velocity = 0.0 -15:9/0 = 0 -15:9/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:9/0/physics_layer_0/angular_velocity = 0.0 -0:10/0 = 0 -0:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:10/0/physics_layer_0/angular_velocity = 0.0 -1:10/0 = 0 -1:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:10/0/physics_layer_0/angular_velocity = 0.0 -2:10/0 = 0 -2:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:10/0/physics_layer_0/angular_velocity = 0.0 -3:10/0 = 0 -3:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:10/0/physics_layer_0/angular_velocity = 0.0 -5:10/0 = 0 -5:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:10/0/physics_layer_0/angular_velocity = 0.0 -6:10/0 = 0 -6:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:10/0/physics_layer_0/angular_velocity = 0.0 -7:10/0 = 0 -7:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:10/0/physics_layer_0/angular_velocity = 0.0 -13:10/0 = 0 -13:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:10/0/physics_layer_0/angular_velocity = 0.0 -14:10/0 = 0 -14:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:10/0/physics_layer_0/angular_velocity = 0.0 -15:10/0 = 0 -15:10/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:10/0/physics_layer_0/angular_velocity = 0.0 -0:11/0 = 0 -0:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:11/0/physics_layer_0/angular_velocity = 0.0 -1:11/0 = 0 -1:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:11/0/physics_layer_0/angular_velocity = 0.0 -2:11/0 = 0 -2:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:11/0/physics_layer_0/angular_velocity = 0.0 -3:11/0 = 0 -3:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:11/0/physics_layer_0/angular_velocity = 0.0 -4:11/0 = 0 -4:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:11/0/physics_layer_0/angular_velocity = 0.0 -13:11/0 = 0 -13:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:11/0/physics_layer_0/angular_velocity = 0.0 -14:11/0 = 0 -14:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:11/0/physics_layer_0/angular_velocity = 0.0 -15:11/0 = 0 -15:11/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:11/0/physics_layer_0/angular_velocity = 0.0 - -[resource] -physics_layer_0/collision_layer = 1 -physics_layer_0/collision_mask = 0 -terrain_set_0/mode = 1 -terrain_set_0/terrain_0/name = "Terrain 0" -terrain_set_0/terrain_0/color = Color(0.886275, 0.0980392, 0.0980392, 1) -sources/0 = SubResource("TileSetAtlasSource_yvgyd") diff --git a/DungeonShooting_Godot/resource/map/tileSet/map1/website.txt b/DungeonShooting_Godot/resource/map/tileSet/map1/website.txt deleted file mode 100644 index bb6d4d7..0000000 --- a/DungeonShooting_Godot/resource/map/tileSet/map1/website.txt +++ /dev/null @@ -1 +0,0 @@ -https://aekae13.itch.io/16x16-dungeon-walls-reconfig diff --git a/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png b/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png deleted file mode 100644 index 00d2144..0000000 --- a/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png.import b/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png.import deleted file mode 100644 index 2a14084..0000000 --- a/DungeonShooting_Godot/resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dj8nrd5od4fcl" -path="res://.godot/imported/16x16 dungeon ii wall reconfig v04 spritesheet.png-c062adcaebcfa511f8bb4f73bd30ea6f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" -dest_files=["res://.godot/imported/16x16 dungeon ii wall reconfig v04 spritesheet.png-c062adcaebcfa511f8bb4f73bd30ea6f.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/material/GodRays.gdshader b/DungeonShooting_Godot/resource/material/GodRays.gdshader new file mode 100644 index 0000000..4892b88 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/GodRays.gdshader @@ -0,0 +1,107 @@ +/* +Shader from Godot Shaders - the free shader library. +godotshaders.com/shader/god-rays + +Feel free to use, improve and change this shader according to your needs +and consider sharing the modified result on godotshaders.com. +*/ + +shader_type canvas_item; + +uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; + +uniform float angle = -0.3; +uniform float position = -0.2; +uniform float spread : hint_range(0.0, 1.0) = 0.5; +uniform float cutoff : hint_range(-1.0, 1.0) = 0.1; +uniform float falloff : hint_range(0.0, 1.0) = 0.2; +uniform float edge_fade : hint_range(0.0, 1.0) = 0.15; + +uniform float speed = 1.0; +uniform float ray1_density = 8.0; +uniform float ray2_density = 30.0; +uniform float ray2_intensity : hint_range(0.0, 1.0) = 0.3; + +uniform vec4 color : source_color = vec4(1.0, 0.9, 0.65, 0.8); + +uniform bool hdr = false; +uniform float seed = 5.0; + +float random(vec2 _uv) { + _uv += min(TIME,0.0); + return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233))) * 43758.5453123); +} + +float noise (in vec2 uv) { + vec2 i = floor(uv); + vec2 f = fract(uv); + + // Four corners in 2D of a tile + float a = random(i); + float b = random(i + vec2(1.0, 0.0)); + float c = random(i + vec2(0.0, 1.0)); + float d = random(i + vec2(1.0, 1.0)); + + + // Smooth Interpolation + + // Cubic Hermine Curve. Same as SmoothStep() + vec2 u = f * f * (3.0-2.0 * f); + + // Mix 4 coorners percentages + return mix(a, b, u.x) + + (c - a)* u.y * (1.0 - u.x) + + (d - b) * u.x * u.y; +} + +mat2 rotate(float _angle){ + return mat2(vec2(cos(_angle), -sin(_angle)), + vec2(sin(_angle), cos(_angle))); +} + +vec4 screen(vec4 base, vec4 blend){ + return 1.0 - (1.0 - base) * (1.0 - blend); +} + +void fragment() +{ + + // Rotate, skew and move the UVs + vec2 transformed_uv = ( rotate(angle) * (UV - position) ) / ( (UV.y + spread) - (UV.y * spread) ); + + // Animate the ray according the the new transformed UVs + vec2 ray1 = vec2(transformed_uv.x * ray1_density + sin(TIME * 0.1 * speed) * (ray1_density * 0.2) + seed, 1.0); + vec2 ray2 = vec2(transformed_uv.x * ray2_density + sin(TIME * 0.2 * speed) * (ray1_density * 0.2) + seed, 1.0); + + // Cut off the ray's edges + float cut = step(cutoff, transformed_uv.x) * step(cutoff, 1.0 - transformed_uv.x); + ray1 *= cut; + ray2 *= cut; + + // Apply the noise pattern (i.e. create the rays) + float rays; + + if (hdr){ + // This is not really HDR, but check this to not clamp the two merged rays making + // their values go over 1.0. Can make for some nice effect + rays = noise(ray1) + (noise(ray2) * ray2_intensity); + } + else{ + rays = clamp(noise(ray1) + (noise(ray2) * ray2_intensity), 0., 1.); + } + + // Fade out edges + rays *= smoothstep(0.0, falloff, (1.0 - UV.y)); // Bottom + rays *= smoothstep(0.0 + cutoff, edge_fade + cutoff, transformed_uv.x); // Left + rays *= smoothstep(0.0 + cutoff, edge_fade + cutoff, 1.0 - transformed_uv.x); // Right + + // Color to the rays + vec3 shine = vec3(rays) * color.rgb; + + // Try different blending modes for a nicer effect. "Screen" is included in the code, + // but take a look at https://godotshaders.com/snippet/blending-modes/ for more. + // With "Screen" blend mode: + shine = screen(texture(SCREEN_TEXTURE, SCREEN_UV), vec4(color)).rgb; + + COLOR = vec4(shine, rays * color.a); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/material/Grid.gdshader b/DungeonShooting_Godot/resource/material/Grid.gdshader new file mode 100644 index 0000000..571251f --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Grid.gdshader @@ -0,0 +1,17 @@ +shader_type canvas_item; +render_mode blend_mix; + +uniform vec4 color : source_color = vec4(1.0, 1.0, 1.0, 1.0); +uniform vec2 size = vec2(1280.0, 720.0); +uniform int line_width = 1; +uniform vec2 offset = vec2(0.0, 0.0); +uniform float grid_size = 16.0; + +void fragment() { + vec2 uv = ((offset - vec2(float(line_width)) * 0.5f) / size) + UV; + vec2 r = mod(size * uv, vec2(grid_size)); + vec2 lines = step(1.0 - float(line_width) / grid_size, r / vec2(grid_size)); + float alpha = dot(lines, vec2(1.0, 1.0)); + COLOR = color; + COLOR.a *= alpha; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/material/Grid.tres b/DungeonShooting_Godot/resource/material/Grid.tres new file mode 100644 index 0000000..2b824d9 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Grid.tres @@ -0,0 +1,12 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://chcpnatun8hlf"] + +[ext_resource type="Shader" path="res://resource/material/Grid.gdshader" id="1_xhgfe"] + +[resource] +resource_local_to_scene = true +shader = ExtResource("1_xhgfe") +shader_parameter/color = Color(0.529412, 0.529412, 0.529412, 0.0784314) +shader_parameter/size = Vector2(1280, 720) +shader_parameter/line_width = 2 +shader_parameter/offset = Vector2(0, 0) +shader_parameter/grid_size = 16.0 diff --git a/DungeonShooting_Godot/resource/navigation/NavigationPolygon.tres b/DungeonShooting_Godot/resource/navigation/NavigationPolygon.tres new file mode 100644 index 0000000..2027580 --- /dev/null +++ b/DungeonShooting_Godot/resource/navigation/NavigationPolygon.tres @@ -0,0 +1,7 @@ +[gd_resource type="NavigationPolygon" format=3 uid="uid://brpcle7mygiml"] + +[resource] +resource_local_to_scene = true +source_geometry_mode = 1 +source_geometry_group_name = &"navigation" +cell_size = 4.0 diff --git a/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg b/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg new file mode 100644 index 0000000..b4b2a02 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg Binary files differ diff --git a/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg.import new file mode 100644 index 0000000..e57b929 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/common/gold.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://c7u5cykgimrd4" +path="res://.godot/imported/gold.ogg-d06a726cc6fb4031ede1140774780273.oggvorbisstr" + +[deps] + +source_file="res://resource/sound/sfx/common/gold.ogg" +dest_files=["res://.godot/imported/gold.ogg-d06a726cc6fb4031ede1140774780273.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg new file mode 100644 index 0000000..937aa7b --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg Binary files differ diff --git a/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg.import new file mode 100644 index 0000000..f339289 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_begin0013.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://vcstbu7wion4" +path="res://.godot/imported/Reloading_begin0013.ogg-9e3fec03cec4408e1ae49f78ae7fd10c.oggvorbisstr" + +[deps] + +source_file="res://resource/sound/sfx/reloading/Reloading_begin0013.ogg" +dest_files=["res://.godot/imported/Reloading_begin0013.ogg-9e3fec03cec4408e1ae49f78ae7fd10c.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg new file mode 100644 index 0000000..1cd4a17 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg Binary files differ diff --git a/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg.import new file mode 100644 index 0000000..04fad80 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/reloading/Reloading_finish0005.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://lf3yfq82qetp" +path="res://.godot/imported/Reloading_finish0005.ogg-6f8f9af81ced17f866850f45f4e2a055.oggvorbisstr" + +[deps] + +source_file="res://resource/sound/sfx/reloading/Reloading_finish0005.ogg" +dest_files=["res://.godot/imported/Reloading_finish0005.ogg-6f8f9af81ced17f866850f45f4e2a055.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg new file mode 100644 index 0000000..00d92b6 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg Binary files differ diff --git a/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg.import new file mode 100644 index 0000000..54a9ae7 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0012.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bhpgoq6oqhd24" +path="res://.godot/imported/Shooting0012.ogg-6d1b24c8d5291f0e566c777a5c1a223b.oggvorbisstr" + +[deps] + +source_file="res://resource/sound/sfx/shooting/Shooting0012.ogg" +dest_files=["res://.godot/imported/Shooting0012.ogg-6d1b24c8d5291f0e566c777a5c1a223b.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg new file mode 100644 index 0000000..32b39ff --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg Binary files differ diff --git a/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg.import new file mode 100644 index 0000000..ea34494 --- /dev/null +++ b/DungeonShooting_Godot/resource/sound/sfx/shooting/Shooting0013.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://b7dnq60ppy3rt" +path="res://.godot/imported/Shooting0013.ogg-f68af44d2b878523bfde72871d459a6a.oggvorbisstr" + +[deps] + +source_file="res://resource/sound/sfx/shooting/Shooting0013.ogg" +dest_files=["res://.godot/imported/Shooting0013.ogg-f68af44d2b878523bfde72871d459a6a.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png new file mode 100644 index 0000000..96ba1c1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png.import b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png.import new file mode 100644 index 0000000..11628b1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dladvmgql1pwe" +path="res://.godot/imported/TreasureBox0001.png-470db2c564e486f7e8aa1da89a50df44.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/box/TreasureBox0001.png" +dest_files=["res://.godot/imported/TreasureBox0001.png-470db2c564e486f7e8aa1da89a50df44.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/sprite/box/TreasureBox0001_icon.png b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001_icon.png new file mode 100644 index 0000000..6b1d441 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001_icon.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001_icon.png.import b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001_icon.png.import new file mode 100644 index 0000000..f90f748 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/box/TreasureBox0001_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmmq0qjtk3emj" +path="res://.godot/imported/TreasureBox0001_icon.png-84fd776b11f978d95f53508cc4a524a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/box/TreasureBox0001_icon.png" +dest_files=["res://.godot/imported/TreasureBox0001_icon.png-84fd776b11f978d95f53508cc4a524a3.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/sprite/bullet/normal/arrow.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/arrow.png deleted file mode 100644 index 4baebfb..0000000 --- a/DungeonShooting_Godot/resource/sprite/bullet/normal/arrow.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/arrow.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/arrow.png.import deleted file mode 100644 index ffa58c4..0000000 --- a/DungeonShooting_Godot/resource/sprite/bullet/normal/arrow.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cjb4rq1qavfm6" -path="res://.godot/imported/arrow.png-e6292bc0b86a2f51ddcbf6755de06ee0.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/bullet/normal/arrow.png" -dest_files=["res://.godot/imported/arrow.png-e6292bc0b86a2f51ddcbf6755de06ee0.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/sprite/bullet/normal/bullet0006.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0006.png new file mode 100644 index 0000000..b71a05e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0006.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0006.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0006.png.import new file mode 100644 index 0000000..3aa8d10 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0006.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bn8k07n2y6lmr" +path="res://.godot/imported/bullet0006.png-7a22d278d8906f52f8fe1d151125dd27.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/normal/bullet0006.png" +dest_files=["res://.godot/imported/bullet0006.png-7a22d278d8906f52f8fe1d151125dd27.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/sprite/bullet/normal/bullet0007.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0007.png new file mode 100644 index 0000000..409f5ea --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0007.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0007.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0007.png.import new file mode 100644 index 0000000..d3df7c1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0007.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ktgwsn6cecn1" +path="res://.godot/imported/bullet0007.png-671d78db00259eec71ff1bbeb7323d38.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/normal/bullet0007.png" +dest_files=["res://.godot/imported/bullet0007.png-671d78db00259eec71ff1bbeb7323d38.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/sprite/bullet/normal/bullet0008.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0008.png new file mode 100644 index 0000000..274f521 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0008.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0008.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0008.png.import new file mode 100644 index 0000000..75e0859 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0008.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cf6jtee53ru6t" +path="res://.godot/imported/bullet0008.png-ee2d2af8fd8c07d5f50b667ec409caea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/normal/bullet0008.png" +dest_files=["res://.godot/imported/bullet0008.png-ee2d2af8fd8c07d5f50b667ec409caea.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/sprite/bullet/normal/bullet0009.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0009.png new file mode 100644 index 0000000..fe240cd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0009.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0009.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0009.png.import new file mode 100644 index 0000000..ac77e77 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0009.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5b2dmsxgv1p8" +path="res://.godot/imported/bullet0009.png-97565aeda60064867828dff1a7fe009a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/normal/bullet0009.png" +dest_files=["res://.godot/imported/bullet0009.png-97565aeda60064867828dff1a7fe009a.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/sprite/currency/Gold_1.png b/DungeonShooting_Godot/resource/sprite/currency/Gold_1.png new file mode 100644 index 0000000..3110228 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/currency/Gold_1.png.import b/DungeonShooting_Godot/resource/sprite/currency/Gold_1.png.import new file mode 100644 index 0000000..0597d88 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://benn0iaclw8dk" +path="res://.godot/imported/Gold_1.png-a93928c0075919d29a145c4dafb11474.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/currency/Gold_1.png" +dest_files=["res://.godot/imported/Gold_1.png-a93928c0075919d29a145c4dafb11474.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/sprite/currency/Gold_10.png b/DungeonShooting_Godot/resource/sprite/currency/Gold_10.png new file mode 100644 index 0000000..d7c4a53 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_10.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/currency/Gold_10.png.import b/DungeonShooting_Godot/resource/sprite/currency/Gold_10.png.import new file mode 100644 index 0000000..c89b9a9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7dy6itvggpwy" +path="res://.godot/imported/Gold_10.png-6dad896477e2d64ee4b53dfc61512c52.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/currency/Gold_10.png" +dest_files=["res://.godot/imported/Gold_10.png-6dad896477e2d64ee4b53dfc61512c52.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/sprite/currency/Gold_5.png b/DungeonShooting_Godot/resource/sprite/currency/Gold_5.png new file mode 100644 index 0000000..daf65e3 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_5.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/currency/Gold_5.png.import b/DungeonShooting_Godot/resource/sprite/currency/Gold_5.png.import new file mode 100644 index 0000000..ca47a36 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfpcqj2x8t2os" +path="res://.godot/imported/Gold_5.png-0b8f56330acf1bae56d208261bbe00e3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/currency/Gold_5.png" +dest_files=["res://.godot/imported/Gold_5.png-0b8f56330acf1bae56d208261bbe00e3.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/sprite/currency/Gold_shadow.png b/DungeonShooting_Godot/resource/sprite/currency/Gold_shadow.png new file mode 100644 index 0000000..5e67581 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_shadow.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/currency/Gold_shadow.png.import b/DungeonShooting_Godot/resource/sprite/currency/Gold_shadow.png.import new file mode 100644 index 0000000..ca0e61e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/currency/Gold_shadow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cthwlbqve6i1l" +path="res://.godot/imported/Gold_shadow.png-7f96d16d057af7e8ad9968d1695208d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/currency/Gold_shadow.png" +dest_files=["res://.godot/imported/Gold_shadow.png-7f96d16d057af7e8ad9968d1695208d9.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/sprite/hall/HallBg.png b/DungeonShooting_Godot/resource/sprite/hall/HallBg.png new file mode 100644 index 0000000..d6e14ba --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/hall/HallBg.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/hall/HallBg.png.import b/DungeonShooting_Godot/resource/sprite/hall/HallBg.png.import new file mode 100644 index 0000000..e2aae09 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/hall/HallBg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2j5mkqm3uv6w" +path="res://.godot/imported/HallBg.png-89bef7b6572850afc3924a9f7262187d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/hall/HallBg.png" +dest_files=["res://.godot/imported/HallBg.png-89bef7b6572850afc3924a9f7262187d.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/sprite/map/PreviewMap.png b/DungeonShooting_Godot/resource/sprite/map/PreviewMap.png new file mode 100644 index 0000000..9a371b6 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewMap.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewMap.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewMap.png.import new file mode 100644 index 0000000..81123f1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewMap.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://18dira1me63t" +path="res://.godot/imported/PreviewMap.png-69bdc8b1ae7987056ae4712f2e214162.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewMap.png" +dest_files=["res://.godot/imported/PreviewMap.png-69bdc8b1ae7987056ae4712f2e214162.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/sprite/map/PreviewMapShadow.png b/DungeonShooting_Godot/resource/sprite/map/PreviewMapShadow.png new file mode 100644 index 0000000..f325155 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewMapShadow.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewMapShadow.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewMapShadow.png.import new file mode 100644 index 0000000..917949a --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewMapShadow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqdrgtiyilkma" +path="res://.godot/imported/PreviewMapShadow.png-3130416368f768977b52443934e01dc1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewMapShadow.png" +dest_files=["res://.godot/imported/PreviewMapShadow.png-3130416368f768977b52443934e01dc1.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/sprite/map/PreviewTransition.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition.png index 13d2000..8f3d4af 100644 --- a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition.png +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition2.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition2.png index 4c71a5f..f35e713 100644 --- a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition2.png +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png new file mode 100644 index 0000000..8c11d7d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png.import new file mode 100644 index 0000000..ef25f32 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://darrof8dpbr1t" +path="res://.godot/imported/PreviewTransition3.png-fe787d7afcb36d01d034087e48b4cabb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewTransition3.png" +dest_files=["res://.godot/imported/PreviewTransition3.png-fe787d7afcb36d01d034087e48b4cabb.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/sprite/map/PreviewTransition4.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition4.png new file mode 100644 index 0000000..d225841 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition4.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition4.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition4.png.import new file mode 100644 index 0000000..7895003 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfhuexwjihrmj" +path="res://.godot/imported/PreviewTransition4.png-a16e3d1cadcfa369e074f4745e39ff47.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewTransition4.png" +dest_files=["res://.godot/imported/PreviewTransition4.png-a16e3d1cadcfa369e074f4745e39ff47.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/sprite/map/PreviewTransition5.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition5.png new file mode 100644 index 0000000..1732b21 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition5.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition5.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition5.png.import new file mode 100644 index 0000000..65c399b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf5fcyfevur3x" +path="res://.godot/imported/PreviewTransition5.png-62bb59bbb2e2175f34891c69492a6e8a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewTransition5.png" +dest_files=["res://.godot/imported/PreviewTransition5.png-62bb59bbb2e2175f34891c69492a6e8a.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/sprite/map/PreviewTransition6.png b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition6.png new file mode 100644 index 0000000..2f3df49 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition6.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/PreviewTransition6.png.import b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition6.png.import new file mode 100644 index 0000000..ce59fce --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/PreviewTransition6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cofij3ar8uyar" +path="res://.godot/imported/PreviewTransition6.png-0b6b35a233f1e280f49eef4313432187.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/PreviewTransition6.png" +dest_files=["res://.godot/imported/PreviewTransition6.png-0b6b35a233f1e280f49eef4313432187.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/sprite/map/TerrainMask.png b/DungeonShooting_Godot/resource/sprite/map/TerrainMask.png new file mode 100644 index 0000000..426bb52 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/TerrainMask.png.import b/DungeonShooting_Godot/resource/sprite/map/TerrainMask.png.import new file mode 100644 index 0000000..2a98c8b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvjj6jnmxgprw" +path="res://.godot/imported/TerrainMask.png-15fc73cf90f6ff1547134db4982b53af.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/TerrainMask.png" +dest_files=["res://.godot/imported/TerrainMask.png-15fc73cf90f6ff1547134db4982b53af.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/sprite/map/TerrainMask2.png b/DungeonShooting_Godot/resource/sprite/map/TerrainMask2.png new file mode 100644 index 0000000..c45bc4d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/TerrainMask2.png.import b/DungeonShooting_Godot/resource/sprite/map/TerrainMask2.png.import new file mode 100644 index 0000000..701ad63 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bud6ah5xyey37" +path="res://.godot/imported/TerrainMask2.png-1f32f81f65f05bff60b1eb56be6f0962.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/TerrainMask2.png" +dest_files=["res://.godot/imported/TerrainMask2.png-1f32f81f65f05bff60b1eb56be6f0962.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/sprite/map/TerrainMask3.png b/DungeonShooting_Godot/resource/sprite/map/TerrainMask3.png new file mode 100644 index 0000000..b841f40 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/TerrainMask3.png.import b/DungeonShooting_Godot/resource/sprite/map/TerrainMask3.png.import new file mode 100644 index 0000000..a1ece12 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chisfq2alcq16" +path="res://.godot/imported/TerrainMask3.png-20aa76a7c73efe35531ad8d0722d181b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/TerrainMask3.png" +dest_files=["res://.godot/imported/TerrainMask3.png-20aa76a7c73efe35531ad8d0722d181b.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/sprite/map/TerrainMask4.png b/DungeonShooting_Godot/resource/sprite/map/TerrainMask4.png new file mode 100644 index 0000000..8416b87 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask4.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/TerrainMask4.png.import b/DungeonShooting_Godot/resource/sprite/map/TerrainMask4.png.import new file mode 100644 index 0000000..4c96cd0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/TerrainMask4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyshwhf3101em" +path="res://.godot/imported/TerrainMask4.png-946931709433ef3d5ae9865b1065e17f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/TerrainMask4.png" +dest_files=["res://.godot/imported/TerrainMask4.png-946931709433ef3d5ae9865b1065e17f.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/sprite/map/WallTransition2.png b/DungeonShooting_Godot/resource/sprite/map/WallTransition2.png index f01f30b..da720ec 100644 --- a/DungeonShooting_Godot/resource/sprite/map/WallTransition2.png +++ b/DungeonShooting_Godot/resource/sprite/map/WallTransition2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door.png b/DungeonShooting_Godot/resource/sprite/map/door.png deleted file mode 100644 index 5a02887..0000000 --- a/DungeonShooting_Godot/resource/sprite/map/door.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door.png.import b/DungeonShooting_Godot/resource/sprite/map/door.png.import deleted file mode 100644 index d2fa145..0000000 --- a/DungeonShooting_Godot/resource/sprite/map/door.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://f7d7qsdxqx28" -path="res://.godot/imported/door.png-df89cda31b3be3b13dd6a96afcb773e6.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/map/door.png" -dest_files=["res://.godot/imported/door.png-df89cda31b3be3b13dd6a96afcb773e6.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/sprite/map/door1_down.png b/DungeonShooting_Godot/resource/sprite/map/door1_down.png deleted file mode 100644 index faeba59..0000000 --- a/DungeonShooting_Godot/resource/sprite/map/door1_down.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door1_down.png.import b/DungeonShooting_Godot/resource/sprite/map/door1_down.png.import deleted file mode 100644 index de95af2..0000000 --- a/DungeonShooting_Godot/resource/sprite/map/door1_down.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dviv44fhwvkb1" -path="res://.godot/imported/door1_down.png-59ffc0993731fd627318f9402b22d199.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/map/door1_down.png" -dest_files=["res://.godot/imported/door1_down.png-59ffc0993731fd627318f9402b22d199.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/sprite/map/door_close.png b/DungeonShooting_Godot/resource/sprite/map/door_close.png new file mode 100644 index 0000000..02be975 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_close.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door_close.png.import b/DungeonShooting_Godot/resource/sprite/map/door_close.png.import new file mode 100644 index 0000000..017050f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_close.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dem4b762asjry" +path="res://.godot/imported/door_close.png-1ecc9b3d8e11bebd90ca6a7c4e421947.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/door_close.png" +dest_files=["res://.godot/imported/door_close.png-1ecc9b3d8e11bebd90ca6a7c4e421947.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/sprite/map/door_open.png b/DungeonShooting_Godot/resource/sprite/map/door_open.png new file mode 100644 index 0000000..349313d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door_open.png.import b/DungeonShooting_Godot/resource/sprite/map/door_open.png.import new file mode 100644 index 0000000..a51bb11 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv63neggj3xtl" +path="res://.godot/imported/door_open.png-c046225698fe76d75f5eca3b5c10f1b6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/door_open.png" +dest_files=["res://.godot/imported/door_open.png-c046225698fe76d75f5eca3b5c10f1b6.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/sprite/map/door_open2.png b/DungeonShooting_Godot/resource/sprite/map/door_open2.png new file mode 100644 index 0000000..c0780f0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door_open2.png.import b/DungeonShooting_Godot/resource/sprite/map/door_open2.png.import new file mode 100644 index 0000000..5983c8e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qhkn265gpa5w" +path="res://.godot/imported/door_open2.png-73c5521e780280f61d4d40d025e4f229.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/door_open2.png" +dest_files=["res://.godot/imported/door_open2.png-73c5521e780280f61d4d40d025e4f229.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/sprite/map/door_open3.png b/DungeonShooting_Godot/resource/sprite/map/door_open3.png new file mode 100644 index 0000000..929b7f2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door_open3.png.import b/DungeonShooting_Godot/resource/sprite/map/door_open3.png.import new file mode 100644 index 0000000..eb02d15 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_open3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddl5cjv08f7i1" +path="res://.godot/imported/door_open3.png-0e6d51f809ebb5d34bf8caf6c9972fdd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/door_open3.png" +dest_files=["res://.godot/imported/door_open3.png-0e6d51f809ebb5d34bf8caf6c9972fdd.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/sprite/map/door_up.png b/DungeonShooting_Godot/resource/sprite/map/door_up.png new file mode 100644 index 0000000..9ff2ee4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_up.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/map/door_up.png.import b/DungeonShooting_Godot/resource/sprite/map/door_up.png.import new file mode 100644 index 0000000..b018503 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/map/door_up.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gf8wefrp284o" +path="res://.godot/imported/door_up.png-259e579b5cfa6c19dca2feec2294583b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/map/door_up.png" +dest_files=["res://.godot/imported/door_up.png-259e579b5cfa6c19dca2feec2294583b.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/sprite/prop/buff/BuffProp0001-export.png b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0001-export.png new file mode 100644 index 0000000..3c960fd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0001-export.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0001-export.png.import b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0001-export.png.import new file mode 100644 index 0000000..8bc94d8 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0001-export.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gr6504bt0ein" +path="res://.godot/imported/BuffProp0001-export.png-02580f5ffa8ac621f1aa19877d0fcc7b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/prop/buff/BuffProp0001-export.png" +dest_files=["res://.godot/imported/BuffProp0001-export.png-02580f5ffa8ac621f1aa19877d0fcc7b.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/sprite/role/scarecrow0001.png b/DungeonShooting_Godot/resource/sprite/role/scarecrow0001.png new file mode 100644 index 0000000..8f764e8 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/scarecrow0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/scarecrow0001.png.import b/DungeonShooting_Godot/resource/sprite/role/scarecrow0001.png.import new file mode 100644 index 0000000..99fea38 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/scarecrow0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://daqqdil4cn0pn" +path="res://.godot/imported/scarecrow0001.png-e7231d46124cae94ccf3ff7468ad2842.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/scarecrow0001.png" +dest_files=["res://.godot/imported/scarecrow0001.png-e7231d46124cae94ccf3ff7468ad2842.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/sprite/shootFire/ShotFire0003.png b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0003.png new file mode 100644 index 0000000..944ab2f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0003.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0003.png.import b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0003.png.import new file mode 100644 index 0000000..cfd03e8 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0003.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw3amegyt2ehh" +path="res://.godot/imported/ShotFire0003.png-96bf214260aefa07ecedf1608829c903.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/shootFire/ShotFire0003.png" +dest_files=["res://.godot/imported/ShotFire0003.png-96bf214260aefa07ecedf1608829c903.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/sprite/ui/commonIcon/CenterTool.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/CenterTool.png index d980ce2..0ecd99e 100644 --- a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/CenterTool.png +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/CenterTool.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png new file mode 100644 index 0000000..dc4c9f9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png.import new file mode 100644 index 0000000..7130c78 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Delete2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fkg21rtph51d" +path="res://.godot/imported/Delete2.png-171dd9a0d65da0bd6c6e0b2740c3d2b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Delete2.png" +dest_files=["res://.godot/imported/Delete2.png-171dd9a0d65da0bd6c6e0b2740c3d2b7.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/sprite/ui/commonIcon/Dice.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Dice.png new file mode 100644 index 0000000..6a767cb --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Dice.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Dice.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Dice.png.import new file mode 100644 index 0000000..c71ccef --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Dice.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg837c2qhscrm" +path="res://.godot/imported/Dice.png-bb14f0cc0f74e12e43728472a30e9dca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Dice.png" +dest_files=["res://.godot/imported/Dice.png-bb14f0cc0f74e12e43728472a30e9dca.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/sprite/ui/commonIcon/Gold_10.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Gold_10.png new file mode 100644 index 0000000..c0e1473 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Gold_10.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Gold_10.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Gold_10.png.import new file mode 100644 index 0000000..d08eb20 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Gold_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cysv0dpvm52xw" +path="res://.godot/imported/Gold_10.png-90370d287f395564703b058392c1eb5b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Gold_10.png" +dest_files=["res://.godot/imported/Gold_10.png-90370d287f395564703b058392c1eb5b.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/sprite/ui/commonIcon/Import.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Import.png new file mode 100644 index 0000000..c6a448e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Import.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Import.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Import.png.import new file mode 100644 index 0000000..899bac9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Import.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://duos2p6if4kcp" +path="res://.godot/imported/Import.png-3a038e8711ed54d5352d58a89d1736e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Import.png" +dest_files=["res://.godot/imported/Import.png-3a038e8711ed54d5352d58a89d1736e0.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/sprite/ui/commonIcon/Missing.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Missing.png new file mode 100644 index 0000000..1e41480 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Missing.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Missing.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Missing.png.import new file mode 100644 index 0000000..69ac8ed --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Missing.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bit0o4oadgxr0" +path="res://.godot/imported/Missing.png-a5d6965e8f7a3a0c127af8eb6ab18af8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Missing.png" +dest_files=["res://.godot/imported/Missing.png-a5d6965e8f7a3a0c127af8eb6ab18af8.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/sprite/ui/commonIcon/PackageMark.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/PackageMark.png index 67234a6..6f566be 100644 --- a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/PackageMark.png +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/PackageMark.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png new file mode 100644 index 0000000..f0ee233 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png.import new file mode 100644 index 0000000..6de5da5 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Success_mini.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do3q1nsagxayh" +path="res://.godot/imported/Success_mini.png-d6b53004d1673ea1eec0224fa98c69b6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Success_mini.png" +dest_files=["res://.godot/imported/Success_mini.png-d6b53004d1673ea1eec0224fa98c69b6.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/sprite/weapon/bow.png b/DungeonShooting_Godot/resource/sprite/weapon/bow.png deleted file mode 100644 index 0654ef2..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/bow.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/bow.png.import b/DungeonShooting_Godot/resource/sprite/weapon/bow.png.import deleted file mode 100644 index 412e93d..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/bow.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b4exgoa8t0wny" -path="res://.godot/imported/bow.png-9ae685914082766e6dbcd1eaddb43b40.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/bow.png" -dest_files=["res://.godot/imported/bow.png-9ae685914082766e6dbcd1eaddb43b40.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/sprite/weapon/gun1.png b/DungeonShooting_Godot/resource/sprite/weapon/gun1.png deleted file mode 100644 index fc6c2ce..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun1.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun1.png.import deleted file mode 100644 index 9964bdc..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://yn8t7ovmt4gj" -path="res://.godot/imported/gun1.png-87777518c2382cd35c967ee32bf367ad.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun1.png" -dest_files=["res://.godot/imported/gun1.png-87777518c2382cd35c967ee32bf367ad.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/sprite/weapon/gun2.png b/DungeonShooting_Godot/resource/sprite/weapon/gun2.png deleted file mode 100644 index 4e0b9e6..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun2.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun2.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun2.png.import deleted file mode 100644 index feb8eb6..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun2.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://5geiuvv6hyov" -path="res://.godot/imported/gun2.png-78b331a2f245cfbe03b10da276435b64.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun2.png" -dest_files=["res://.godot/imported/gun2.png-78b331a2f245cfbe03b10da276435b64.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/sprite/weapon/gun3.png b/DungeonShooting_Godot/resource/sprite/weapon/gun3.png deleted file mode 100644 index 4f5aff6..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun3.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun3.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun3.png.import deleted file mode 100644 index e5154c0..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun3.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c1tnh6laf172u" -path="res://.godot/imported/gun3.png-d2428e7c1819cfb8a78ef87505aee0a3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun3.png" -dest_files=["res://.godot/imported/gun3.png-d2428e7c1819cfb8a78ef87505aee0a3.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/sprite/weapon/gun4.png b/DungeonShooting_Godot/resource/sprite/weapon/gun4.png deleted file mode 100644 index c6b4b23..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun4.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun4.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun4.png.import deleted file mode 100644 index 316b26d..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun4.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://xafbhgrxmosy" -path="res://.godot/imported/gun4.png-f47ef44de364483b033f38a2d031303c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun4.png" -dest_files=["res://.godot/imported/gun4.png-f47ef44de364483b033f38a2d031303c.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/sprite/weapon/gun5.png b/DungeonShooting_Godot/resource/sprite/weapon/gun5.png deleted file mode 100644 index 9845085..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun5.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun5.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun5.png.import deleted file mode 100644 index 3e8d082..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun5.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c2eber1v7nb4j" -path="res://.godot/imported/gun5.png-da05c9e18ddc46a7f72168cb9c25449c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun5.png" -dest_files=["res://.godot/imported/gun5.png-da05c9e18ddc46a7f72168cb9c25449c.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/sprite/weapon/gun6.png b/DungeonShooting_Godot/resource/sprite/weapon/gun6.png deleted file mode 100644 index b4948f3..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun6.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun6.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun6.png.import deleted file mode 100644 index 94f2abb..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun6.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://rlp8f2rgxlbf" -path="res://.godot/imported/gun6.png-698dacce2603c9d452b55702363db8fc.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun6.png" -dest_files=["res://.godot/imported/gun6.png-698dacce2603c9d452b55702363db8fc.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/sprite/weapon/gun7.png b/DungeonShooting_Godot/resource/sprite/weapon/gun7.png deleted file mode 100644 index a4d1cea..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun7.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun7.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun7.png.import deleted file mode 100644 index 92fb78d..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun7.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bs6ukbtcmxuiw" -path="res://.godot/imported/gun7.png-9068807109603150cd0529909f81d6c1.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun7.png" -dest_files=["res://.godot/imported/gun7.png-9068807109603150cd0529909f81d6c1.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/sprite/weapon/gun8.png b/DungeonShooting_Godot/resource/sprite/weapon/gun8.png deleted file mode 100644 index 6186597..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun8.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/gun8.png.import b/DungeonShooting_Godot/resource/sprite/weapon/gun8.png.import deleted file mode 100644 index ac3d0d8..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/gun8.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://2lcc20olyi5d" -path="res://.godot/imported/gun8.png-a936b61cfb3713c19173bfa954b35ecd.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/gun8.png" -dest_files=["res://.godot/imported/gun8.png-a936b61cfb3713c19173bfa954b35ecd.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/sprite/weapon/weapon0010/Weapon0010.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010.png new file mode 100644 index 0000000..e7997d0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010.png.import new file mode 100644 index 0000000..a15a246 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7uvgno67d1aq" +path="res://.godot/imported/Weapon0010.png-81895ae43c7fb76772f8c51d14f4b78e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0010/Weapon0010.png" +dest_files=["res://.godot/imported/Weapon0010.png-81895ae43c7fb76772f8c51d14f4b78e.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/sprite/weapon/weapon0010/Weapon0010_reloading.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010_reloading.png new file mode 100644 index 0000000..f4b5ae0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010_reloading.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010_reloading.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010_reloading.png.import new file mode 100644 index 0000000..9844f79 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0010/Weapon0010_reloading.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drhwb6yaqfocm" +path="res://.godot/imported/Weapon0010_reloading.png-992da254579c65f8c0e81d226fb3f4c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0010/Weapon0010_reloading.png" +dest_files=["res://.godot/imported/Weapon0010_reloading.png-992da254579c65f8c0e81d226fb3f4c6.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/sprite/weapon/weapon0011/Weapon0011.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0011/Weapon0011.png new file mode 100644 index 0000000..63eb45e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0011/Weapon0011.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0011/Weapon0011.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0011/Weapon0011.png.import new file mode 100644 index 0000000..8eb64d2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0011/Weapon0011.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2nw07bxifdv6" +path="res://.godot/imported/Weapon0011.png-4508f5f36303362ac300f62d27601f6d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0011/Weapon0011.png" +dest_files=["res://.godot/imported/Weapon0011.png-4508f5f36303362ac300f62d27601f6d.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/sprite/weapon/weapon0012/bow.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0012/bow.png new file mode 100644 index 0000000..0654ef2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0012/bow.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0012/bow.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0012/bow.png.import new file mode 100644 index 0000000..4616585 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0012/bow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4exgoa8t0wny" +path="res://.godot/imported/bow.png-88942d9562b550ee90573ad2cdb4bb92.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0012/bow.png" +dest_files=["res://.godot/imported/bow.png-88942d9562b550ee90573ad2cdb4bb92.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/sprite/weapon/weapon0013/weapon0013.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0013.png new file mode 100644 index 0000000..d35a25d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0013.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0013.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0013.png.import new file mode 100644 index 0000000..cc29c2c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0013.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cphawlk2w0w6w" +path="res://.godot/imported/weapon0013.png-ebf877c1ae1b135ec79dd1b6a7ae1165.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0013/weapon0013.png" +dest_files=["res://.godot/imported/weapon0013.png-ebf877c1ae1b135ec79dd1b6a7ae1165.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/sprite/weapon/weapon0013/weapon0014-export.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014-export.png new file mode 100644 index 0000000..d7784a0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014-export.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014-export.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014-export.png.import new file mode 100644 index 0000000..203d743 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014-export.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cuivqyq32tjan" +path="res://.godot/imported/weapon0014-export.png-f1691475edd2682499f71dfe7d46110d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0013/weapon0014-export.png" +dest_files=["res://.godot/imported/weapon0014-export.png-f1691475edd2682499f71dfe7d46110d.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/sprite/weapon/weapon0013/weapon0014.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014.png new file mode 100644 index 0000000..e111d83 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014.png.import new file mode 100644 index 0000000..eb6d28b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0013/weapon0014.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://deqflkjkgkebd" +path="res://.godot/imported/weapon0014.png-231a4437579a4dfcadef71f1a72de1ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0013/weapon0014.png" +dest_files=["res://.godot/imported/weapon0014.png-231a4437579a4dfcadef71f1a72de1ed.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/sprite/weapon/weapon0014/Weapon0014.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0014/Weapon0014.png new file mode 100644 index 0000000..3113087 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0014/Weapon0014.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0014/Weapon0014.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0014/Weapon0014.png.import new file mode 100644 index 0000000..af570f3 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0014/Weapon0014.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d27ax1aqghn0k" +path="res://.godot/imported/Weapon0014.png-24bed8267d2ed0e312778ce83c4afa5a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0014/Weapon0014.png" +dest_files=["res://.godot/imported/Weapon0014.png-24bed8267d2ed0e312778ce83c4afa5a.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/sprite/weapon/weapon0016/weapon0016.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016.png new file mode 100644 index 0000000..9c4ce9d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016.png.import new file mode 100644 index 0000000..fbc4710 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5yvr8ylxhqtf" +path="res://.godot/imported/weapon0016.png-1662287584976db33d587029269c4cd5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0016/weapon0016.png" +dest_files=["res://.godot/imported/weapon0016.png-1662287584976db33d587029269c4cd5.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/sprite/weapon/weapon0016/weapon0016_pull.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016_pull.png new file mode 100644 index 0000000..40d4222 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016_pull.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016_pull.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016_pull.png.import new file mode 100644 index 0000000..c2424b7 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0016/weapon0016_pull.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3nqcx8tshjpd" +path="res://.godot/imported/weapon0016_pull.png-42e36ca2937d4c72bf6c0228101577ca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0016/weapon0016_pull.png" +dest_files=["res://.godot/imported/weapon0016_pull.png-42e36ca2937d4c72bf6c0228101577ca.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/sprite/weapon/weapon0017/gun5.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/gun5.png.import new file mode 100644 index 0000000..2dcc1e9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/gun5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2eber1v7nb4j" +path="res://.godot/imported/gun5.png-dde9a0cdc02e2378517e9d271797761c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0017/gun5.png" +dest_files=["res://.godot/imported/gun5.png-dde9a0cdc02e2378517e9d271797761c.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/sprite/weapon/weapon0017/seapon0017t.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/seapon0017t.png new file mode 100644 index 0000000..38a30b9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/seapon0017t.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/seapon0017t.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/seapon0017t.png.import new file mode 100644 index 0000000..04580b8 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0017/seapon0017t.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p1eortgblmp8" +path="res://.godot/imported/seapon0017t.png-9abedc9a57c3bd415cd9551b1a39f0da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0017/seapon0017t.png" +dest_files=["res://.godot/imported/seapon0017t.png-9abedc9a57c3bd415cd9551b1a39f0da.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/sprite/weapon/weapon0018/gun6.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/gun6.png.import new file mode 100644 index 0000000..c7dff5f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/gun6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rlp8f2rgxlbf" +path="res://.godot/imported/gun6.png-661eed06db2d1504a8e43f81aca88938.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0018/gun6.png" +dest_files=["res://.godot/imported/gun6.png-661eed06db2d1504a8e43f81aca88938.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/sprite/weapon/weapon0018/weapon0018.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/weapon0018.png new file mode 100644 index 0000000..d99a34b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/weapon0018.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/weapon0018.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/weapon0018.png.import new file mode 100644 index 0000000..91972d5 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0018/weapon0018.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://o2oqd1wnm57h" +path="res://.godot/imported/weapon0018.png-9a3780ff4c33d7f9e469624682fd58c4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0018/weapon0018.png" +dest_files=["res://.godot/imported/weapon0018.png-9a3780ff4c33d7f9e469624682fd58c4.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/sprite/weapon/weapon0019/gun7.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/gun7.png.import new file mode 100644 index 0000000..f37ec50 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/gun7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs6ukbtcmxuiw" +path="res://.godot/imported/gun7.png-f1428c4b8a1ac62dafacd70a35e5813b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0019/gun7.png" +dest_files=["res://.godot/imported/gun7.png-f1428c4b8a1ac62dafacd70a35e5813b.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/sprite/weapon/weapon0019/weapon0019.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/weapon0019.png new file mode 100644 index 0000000..ef3da63 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/weapon0019.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/weapon0019.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/weapon0019.png.import new file mode 100644 index 0000000..f6f6e85 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0019/weapon0019.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxqkog61v8lyj" +path="res://.godot/imported/weapon0019.png-b7a74db5f050400f0cbda8fb3f8911af.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0019/weapon0019.png" +dest_files=["res://.godot/imported/weapon0019.png-b7a74db5f050400f0cbda8fb3f8911af.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/sprite/weapon/weapon0020/gun8.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/gun8.png.import new file mode 100644 index 0000000..6b19bf3 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/gun8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2lcc20olyi5d" +path="res://.godot/imported/gun8.png-981667783ada37a774730057971adda6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0020/gun8.png" +dest_files=["res://.godot/imported/gun8.png-981667783ada37a774730057971adda6.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/sprite/weapon/weapon0020/weapon0020-export.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020-export.png new file mode 100644 index 0000000..8321c61 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020-export.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020-export.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020-export.png.import new file mode 100644 index 0000000..3c24fb1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020-export.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btnj62x7f7g0o" +path="res://.godot/imported/weapon0020-export.png-7be73470641614cd8714bd63b993d747.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0020/weapon0020-export.png" +dest_files=["res://.godot/imported/weapon0020-export.png-7be73470641614cd8714bd63b993d747.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/sprite/weapon/weapon0020/weapon0020.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020.png new file mode 100644 index 0000000..6e2d69d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020.png.import new file mode 100644 index 0000000..7dcc588 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0020/weapon0020.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctrjjcbdp3tta" +path="res://.godot/imported/weapon0020.png-9f128bf4442aa1480d9ec45175bc4f90.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0020/weapon0020.png" +dest_files=["res://.godot/imported/weapon0020.png-9f128bf4442aa1480d9ec45175bc4f90.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/sprite/weapon/weapon0021/weapon0021.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0021/weapon0021.png new file mode 100644 index 0000000..b95c827 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0021/weapon0021.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0021/weapon0021.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0021/weapon0021.png.import new file mode 100644 index 0000000..525b391 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0021/weapon0021.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1flmled7wnta" +path="res://.godot/imported/weapon0021.png-8521cdceaba26d86490558b8c26e718a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0021/weapon0021.png" +dest_files=["res://.godot/imported/weapon0021.png-8521cdceaba26d86490558b8c26e718a.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/sprite/weapon/weapon0022/weapon0022.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0022/weapon0022.png new file mode 100644 index 0000000..a3d5317 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0022/weapon0022.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0022/weapon0022.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0022/weapon0022.png.import new file mode 100644 index 0000000..da4a121 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0022/weapon0022.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chbegajgfo3wy" +path="res://.godot/imported/weapon0022.png-5596c5876bee1aeaafafc48d08a6158a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0022/weapon0022.png" +dest_files=["res://.godot/imported/weapon0022.png-5596c5876bee1aeaafafc48d08a6158a.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/sprite/weapon/weapon0023/weapon0023.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0023/weapon0023.png new file mode 100644 index 0000000..246cd6f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0023/weapon0023.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0023/weapon0023.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0023/weapon0023.png.import new file mode 100644 index 0000000..4a33e4e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0023/weapon0023.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqpwge7clvpae" +path="res://.godot/imported/weapon0023.png-1c0cadf8abfe1a7081a7bee9cce9fe2d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0023/weapon0023.png" +dest_files=["res://.godot/imported/weapon0023.png-1c0cadf8abfe1a7081a7bee9cce9fe2d.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/sprite/weapon/weapon0030/weapon0030.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0030/weapon0030.png new file mode 100644 index 0000000..610a7fd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0030/weapon0030.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0030/weapon0030.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0030/weapon0030.png.import new file mode 100644 index 0000000..ccaa46b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0030/weapon0030.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wcuv5oy17ede" +path="res://.godot/imported/weapon0030.png-d068b0866dcc9b9002082be1954c20e8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0030/weapon0030.png" +dest_files=["res://.godot/imported/weapon0030.png-d068b0866dcc9b9002082be1954c20e8.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/sprite/weapon/weapon0032/weapon0032.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0032/weapon0032.png new file mode 100644 index 0000000..760696c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0032/weapon0032.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0032/weapon0032.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0032/weapon0032.png.import new file mode 100644 index 0000000..04b1f8c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0032/weapon0032.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sqq2a5o3n8b" +path="res://.godot/imported/weapon0032.png-81b32a2cc96540e73ceef21bc1d963db.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0032/weapon0032.png" +dest_files=["res://.godot/imported/weapon0032.png-81b32a2cc96540e73ceef21bc1d963db.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/sprite/weapon/weapon0033/weapon0033-export.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033-export.png.import new file mode 100644 index 0000000..070fb1b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033-export.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j6xh6hcuppke" +path="res://.godot/imported/weapon0033-export.png-877b29fc1053c32f952b6d4f13685bab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0033/weapon0033-export.png" +dest_files=["res://.godot/imported/weapon0033-export.png-877b29fc1053c32f952b6d4f13685bab.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/sprite/weapon/weapon0033/weapon0033.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033.png new file mode 100644 index 0000000..17e1166 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033.png.import new file mode 100644 index 0000000..b84bd9c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0033/weapon0033.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1htv2be7irx3" +path="res://.godot/imported/weapon0033.png-041de9eae10d13aa43f148b0e0788e8f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0033/weapon0033.png" +dest_files=["res://.godot/imported/weapon0033.png-041de9eae10d13aa43f148b0e0788e8f.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/sprite/weapon/weapon0034/weapon0034.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0034/weapon0034.png new file mode 100644 index 0000000..e911279 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0034/weapon0034.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0034/weapon0034.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0034/weapon0034.png.import new file mode 100644 index 0000000..c047c98 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0034/weapon0034.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u3mv4mk30uoh" +path="res://.godot/imported/weapon0034.png-8e09fc5fa56b0dc44972264beacfb495.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0034/weapon0034.png" +dest_files=["res://.godot/imported/weapon0034.png-8e09fc5fa56b0dc44972264beacfb495.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/sprite/weapon/weapon0035/weapon0035.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0035/weapon0035.png new file mode 100644 index 0000000..074e06e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0035/weapon0035.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0035/weapon0035.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0035/weapon0035.png.import new file mode 100644 index 0000000..689f199 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0035/weapon0035.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dflwuph4be4pi" +path="res://.godot/imported/weapon0035.png-7d4bb765333f7d7bdb676b5581fcc39b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0035/weapon0035.png" +dest_files=["res://.godot/imported/weapon0035.png-7d4bb765333f7d7bdb676b5581fcc39b.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/sprite/weapon/weapon0036/weapon0036.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0036/weapon0036.png new file mode 100644 index 0000000..c9139e6 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0036/weapon0036.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0036/weapon0036.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0036/weapon0036.png.import new file mode 100644 index 0000000..93ad6b4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0036/weapon0036.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wugxu2mmlhwo" +path="res://.godot/imported/weapon0036.png-87e18b3411eaa14c261078fb9cc36560.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0036/weapon0036.png" +dest_files=["res://.godot/imported/weapon0036.png-87e18b3411eaa14c261078fb9cc36560.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/sprite/weapon/weapon0037/weapon0037.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0037/weapon0037.png new file mode 100644 index 0000000..34bf16e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0037/weapon0037.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0037/weapon0037.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0037/weapon0037.png.import new file mode 100644 index 0000000..70cefab --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0037/weapon0037.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyf6n3w7btjql" +path="res://.godot/imported/weapon0037.png-4bb6b5c3a0b7638679c0ce4a85ff9db7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0037/weapon0037.png" +dest_files=["res://.godot/imported/weapon0037.png-4bb6b5c3a0b7638679c0ce4a85ff9db7.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/sprite/weapon/weapon0038/weapon0038.1.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.1.png new file mode 100644 index 0000000..69c5bc0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.1.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.1.png.import new file mode 100644 index 0000000..068100d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c25bgxmy16gty" +path="res://.godot/imported/weapon0038.1.png-24ebb560742bfd964ce8c5a8466b26f7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0038/weapon0038.1.png" +dest_files=["res://.godot/imported/weapon0038.1.png-24ebb560742bfd964ce8c5a8466b26f7.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/sprite/weapon/weapon0038/weapon0038.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.png new file mode 100644 index 0000000..34ed391 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.png.import new file mode 100644 index 0000000..7832b4e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0038/weapon0038.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcn1tkwk4tbt5" +path="res://.godot/imported/weapon0038.png-4d9b2d98379e2f0fe9903b448ef9a65f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0038/weapon0038.png" +dest_files=["res://.godot/imported/weapon0038.png-4d9b2d98379e2f0fe9903b448ef9a65f.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/sprite/weapon/weapon0039/weapon0039.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039.png new file mode 100644 index 0000000..b285286 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039.png.import new file mode 100644 index 0000000..ef5196b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0wxp84d740v4" +path="res://.godot/imported/weapon0039.png-ecee11ba46e7c40fd6b69832e60fbb47.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0039/weapon0039.png" +dest_files=["res://.godot/imported/weapon0039.png-ecee11ba46e7c40fd6b69832e60fbb47.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/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png" "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png" new file mode 100644 index 0000000..314e27c --- /dev/null +++ "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png" Binary files differ diff --git "a/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png.import" "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png.import" new file mode 100644 index 0000000..bca25f5 --- /dev/null +++ "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0039/weapon0039\357\274\2101\357\274\211.png.import" @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ce0w3823krfp5" +path="res://.godot/imported/weapon0039(1).png-a6bff37000990178b6ef6e6a94132c7c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0039/weapon0039(1).png" +dest_files=["res://.godot/imported/weapon0039(1).png-a6bff37000990178b6ef6e6a94132c7c.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/sprite/weapon/weapon0040/weapon0040,1.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040,1.png new file mode 100644 index 0000000..c8f223f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040,1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040,1.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040,1.png.import new file mode 100644 index 0000000..633e3ff --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040,1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkoa7v301oe7k" +path="res://.godot/imported/weapon0040,1.png-df36d158904dfa9be2640e9a53c3435d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0040/weapon0040,1.png" +dest_files=["res://.godot/imported/weapon0040,1.png-df36d158904dfa9be2640e9a53c3435d.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/sprite/weapon/weapon0040/weapon0040.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040.png new file mode 100644 index 0000000..37a9f44 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040.png.import new file mode 100644 index 0000000..f7a45da --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0040/weapon0040.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vlevxg7d4iud" +path="res://.godot/imported/weapon0040.png-4da3559c3eed5002c7edb38f191f6aa5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0040/weapon0040.png" +dest_files=["res://.godot/imported/weapon0040.png-4da3559c3eed5002c7edb38f191f6aa5.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/sprite/weapon/weapon0041/weapon0041.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0041/weapon0041.png new file mode 100644 index 0000000..05fdade --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0041/weapon0041.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0041/weapon0041.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0041/weapon0041.png.import new file mode 100644 index 0000000..79f93da --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0041/weapon0041.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgpt5sox41had" +path="res://.godot/imported/weapon0041.png-bc6e68522a6fc0223f80d06af365d475.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0041/weapon0041.png" +dest_files=["res://.godot/imported/weapon0041.png-bc6e68522a6fc0223f80d06af365d475.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/sprite/weapon/weapon0042/weapon0042.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0042/weapon0042.png new file mode 100644 index 0000000..4d265af --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0042/weapon0042.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0042/weapon0042.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0042/weapon0042.png.import new file mode 100644 index 0000000..7e67d03 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0042/weapon0042.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgd5d4wsyphco" +path="res://.godot/imported/weapon0042.png-0cc626b5ea8c951effcccb723b71168a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0042/weapon0042.png" +dest_files=["res://.godot/imported/weapon0042.png-0cc626b5ea8c951effcccb723b71168a.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/sprite/weapon/weapon0043/weapon0043.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0043/weapon0043.png new file mode 100644 index 0000000..6019e03 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0043/weapon0043.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0043/weapon0043.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0043/weapon0043.png.import new file mode 100644 index 0000000..da1ad83 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0043/weapon0043.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq5tcaqju0icj" +path="res://.godot/imported/weapon0043.png-245ddd1635cbc7abe5e9f90f5d5a459d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0043/weapon0043.png" +dest_files=["res://.godot/imported/weapon0043.png-245ddd1635cbc7abe5e9f90f5d5a459d.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/sprite/weapon/weapon0044/weapon0044.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0044/weapon0044.png new file mode 100644 index 0000000..75d31d7 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0044/weapon0044.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0044/weapon0044.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0044/weapon0044.png.import new file mode 100644 index 0000000..0f40edf --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0044/weapon0044.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckv2qfcbuyw27" +path="res://.godot/imported/weapon0044.png-0a168ddd1a230f76db91625c3fe9e7d5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0044/weapon0044.png" +dest_files=["res://.godot/imported/weapon0044.png-0a168ddd1a230f76db91625c3fe9e7d5.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/sprite/weapon/weapon0045/weapon0045.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/weapon0045.png new file mode 100644 index 0000000..b9861ff --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/weapon0045.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/weapon0045.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/weapon0045.png.import new file mode 100644 index 0000000..97d849c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/weapon0045.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cogtgq1aoa0xw" +path="res://.godot/imported/weapon0045.png-86861d1626d9c0b9f4d2632e7a763f63.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0045/weapon0045.png" +dest_files=["res://.godot/imported/weapon0045.png-86861d1626d9c0b9f4d2632e7a763f63.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/sprite/weapon/weapon0045/\345\255\220\345\274\271.png" "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/\345\255\220\345\274\271.png" new file mode 100644 index 0000000..74ef08e --- /dev/null +++ "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/\345\255\220\345\274\271.png" Binary files differ diff --git "a/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/\345\255\220\345\274\271.png.import" "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/\345\255\220\345\274\271.png.import" new file mode 100644 index 0000000..2fd0958 --- /dev/null +++ "b/DungeonShooting_Godot/resource/sprite/weapon/weapon0045/\345\255\220\345\274\271.png.import" @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csyqaglrxpus0" +path="res://.godot/imported/子弹.png-50072d5fb54502db90827299ba900a43.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0045/子弹.png" +dest_files=["res://.godot/imported/子弹.png-50072d5fb54502db90827299ba900a43.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/sprite/weapon/weapon0046/weapon0046.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0046/weapon0046.png new file mode 100644 index 0000000..04f042d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0046/weapon0046.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0046/weapon0046.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0046/weapon0046.png.import new file mode 100644 index 0000000..0ca72d6 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0046/weapon0046.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhyb3122qx50y" +path="res://.godot/imported/weapon0046.png-978eee461209b567302df2ed7ad70035.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0046/weapon0046.png" +dest_files=["res://.godot/imported/weapon0046.png-978eee461209b567302df2ed7ad70035.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/sprite/weapon/weapon29/weapon0029.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon29/weapon0029.png new file mode 100644 index 0000000..455b075 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon29/weapon0029.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon29/weapon0029.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon29/weapon0029.png.import new file mode 100644 index 0000000..e681ce2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon29/weapon0029.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dph00sfp1wksx" +path="res://.godot/imported/weapon0029.png-37dc40dbf3de56fbcf49fc241c201f2d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon29/weapon0029.png" +dest_files=["res://.godot/imported/weapon0029.png-37dc40dbf3de56fbcf49fc241c201f2d.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/sprite/weapon/weapon31/weapon0031.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon31/weapon0031.png new file mode 100644 index 0000000..03369e9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon31/weapon0031.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon31/weapon0031.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon31/weapon0031.png.import new file mode 100644 index 0000000..49a2bc5 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon31/weapon0031.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fbe0jp7o8ccq" +path="res://.godot/imported/weapon0031.png-778cb9a417b671f93729b391300c4db6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon31/weapon0031.png" +dest_files=["res://.godot/imported/weapon0031.png-778cb9a417b671f93729b391300c4db6.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/spriteFrames/bullet/Bullet0006.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0006.tres new file mode 100644 index 0000000..4e845c6 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0006.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://dx4t45bq8ehhq"] + +[ext_resource type="Texture2D" uid="uid://bn8k07n2y6lmr" path="res://resource/sprite/bullet/normal/bullet0006.png" id="1_xjtjd"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_xjtjd") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0007.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0007.tres new file mode 100644 index 0000000..c719795 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0007.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://bkwoy70bnm74k"] + +[ext_resource type="Texture2D" uid="uid://ktgwsn6cecn1" path="res://resource/sprite/bullet/normal/bullet0007.png" id="1_5lygh"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_5lygh") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0008.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0008.tres new file mode 100644 index 0000000..caf8579 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0008.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://ubdvau75andr"] + +[ext_resource type="Texture2D" uid="uid://cf6jtee53ru6t" path="res://resource/sprite/bullet/normal/bullet0008.png" id="1_dwc4l"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_dwc4l") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0009.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0009.tres new file mode 100644 index 0000000..2941488 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0009.tres @@ -0,0 +1,42 @@ +[gd_resource type="SpriteFrames" load_steps=5 format=3 uid="uid://cyg3uvbakan08"] + +[ext_resource type="Texture2D" uid="uid://c5b2dmsxgv1p8" path="res://resource/sprite/bullet/normal/bullet0009.png" id="1_v33wk"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_n6dlo"] +atlas = ExtResource("1_v33wk") +region = Rect2(0, 0, 28, 7) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b3wh3"] +atlas = ExtResource("1_v33wk") +region = Rect2(28, 0, 28, 7) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bdaam"] +atlas = ExtResource("1_v33wk") +region = Rect2(56, 0, 28, 7) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_n6dlo") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_b3wh3") +}], +"loop": false, +"name": &"half_end", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_bdaam") +}], +"loop": false, +"name": &"half_start", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Down.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Down.tres index 9669b44..fbcb708 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Down.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Down.tres @@ -1,98 +1,14 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://b34tddsmqnj8s"] +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://b34tddsmqnj8s"] -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="1_nc77d"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_4o2e1"] -atlas = ExtResource("1_nc77d") -region = Rect2(128, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_d1gjl"] -atlas = ExtResource("1_nc77d") -region = Rect2(96, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_g4rm7"] -atlas = ExtResource("1_nc77d") -region = Rect2(64, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_5d5bq"] -atlas = ExtResource("1_nc77d") -region = Rect2(32, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ekma7"] -atlas = ExtResource("1_nc77d") -region = Rect2(0, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_7y01b"] -atlas = ExtResource("1_nc77d") -region = Rect2(128, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_jm1e2"] -atlas = ExtResource("1_nc77d") -region = Rect2(0, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_1bb60"] -atlas = ExtResource("1_nc77d") -region = Rect2(32, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_oylje"] -atlas = ExtResource("1_nc77d") -region = Rect2(64, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_truep"] -atlas = ExtResource("1_nc77d") -region = Rect2(96, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_lfr82"] -atlas = ExtResource("1_nc77d") -region = Rect2(128, 104, 32, 52) +[ext_resource type="Texture2D" uid="uid://gf8wefrp284o" path="res://resource/sprite/map/door_up.png" id="1_vlsx2"] [resource] animations = [{ "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_4o2e1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_d1gjl") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_g4rm7") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_5d5bq") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_ekma7") -}], -"loop": false, -"name": &"closeDoor", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_7y01b") +"texture": ExtResource("1_vlsx2") }], "loop": false, "name": &"default", "speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_jm1e2") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_1bb60") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_oylje") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_truep") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_lfr82") -}], -"loop": false, -"name": &"openDoor", -"speed": 10.0 }] diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Up.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Up.tres index 8e74aa6..3085acb 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Up.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_E_Up.tres @@ -1,68 +1,197 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://3ps6h2f54qa5"] +[gd_resource type="SpriteFrames" load_steps=34 format=3 uid="uid://3ps6h2f54qa5"] -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="2_u3fum"] +[ext_resource type="Texture2D" uid="uid://dem4b762asjry" path="res://resource/sprite/map/door_close.png" id="1_5ymra"] +[ext_resource type="Texture2D" uid="uid://dv63neggj3xtl" path="res://resource/sprite/map/door_open.png" id="2_niclj"] -[sub_resource type="AtlasTexture" id="AtlasTexture_8f67t"] -atlas = ExtResource("2_u3fum") -region = Rect2(128, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_6i65d"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_qlja2"] -atlas = ExtResource("2_u3fum") -region = Rect2(96, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_gvd0a"] +atlas = ExtResource("1_5ymra") +region = Rect2(192, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_glno6"] -atlas = ExtResource("2_u3fum") -region = Rect2(64, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_kbtel"] +atlas = ExtResource("1_5ymra") +region = Rect2(320, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_frnbt"] -atlas = ExtResource("2_u3fum") -region = Rect2(32, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_4o7p2"] +atlas = ExtResource("1_5ymra") +region = Rect2(448, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_2ytfc"] -atlas = ExtResource("2_u3fum") -region = Rect2(0, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_2urqt"] +atlas = ExtResource("1_5ymra") +region = Rect2(576, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_oyi3c"] -atlas = ExtResource("2_u3fum") -region = Rect2(128, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_pcxt2"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_e68us"] -atlas = ExtResource("2_u3fum") -region = Rect2(0, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_vuqy3"] +atlas = ExtResource("1_5ymra") +region = Rect2(192, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_e7wqp"] -atlas = ExtResource("2_u3fum") -region = Rect2(32, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_abxng"] +atlas = ExtResource("1_5ymra") +region = Rect2(320, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_qcket"] -atlas = ExtResource("2_u3fum") -region = Rect2(64, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_lstal"] +atlas = ExtResource("1_5ymra") +region = Rect2(448, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_genp5"] -atlas = ExtResource("2_u3fum") -region = Rect2(96, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_0l1oe"] +atlas = ExtResource("1_5ymra") +region = Rect2(576, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_krdph"] -atlas = ExtResource("2_u3fum") -region = Rect2(128, 52, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_rxxco"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bbdxx"] +atlas = ExtResource("1_5ymra") +region = Rect2(192, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0ig2j"] +atlas = ExtResource("1_5ymra") +region = Rect2(320, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y6ht0"] +atlas = ExtResource("1_5ymra") +region = Rect2(448, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7b7xb"] +atlas = ExtResource("1_5ymra") +region = Rect2(576, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yxxxi"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g75mr"] +atlas = ExtResource("1_5ymra") +region = Rect2(192, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1467k"] +atlas = ExtResource("1_5ymra") +region = Rect2(320, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2o7eb"] +atlas = ExtResource("1_5ymra") +region = Rect2(448, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yobme"] +atlas = ExtResource("1_5ymra") +region = Rect2(576, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ylcxs"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 320, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ohx3w"] +atlas = ExtResource("1_5ymra") +region = Rect2(64, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_edun5"] +atlas = ExtResource("2_niclj") +region = Rect2(64, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_udxe4"] +atlas = ExtResource("2_niclj") +region = Rect2(192, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_knqv5"] +atlas = ExtResource("2_niclj") +region = Rect2(320, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1d1rp"] +atlas = ExtResource("2_niclj") +region = Rect2(64, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ki550"] +atlas = ExtResource("2_niclj") +region = Rect2(192, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8tfix"] +atlas = ExtResource("2_niclj") +region = Rect2(320, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jvsmj"] +atlas = ExtResource("2_niclj") +region = Rect2(64, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mk01a"] +atlas = ExtResource("2_niclj") +region = Rect2(192, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j6b5g"] +atlas = ExtResource("2_niclj") +region = Rect2(320, 160, 64, 80) [resource] animations = [{ "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_8f67t") +"texture": SubResource("AtlasTexture_6i65d") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_qlja2") +"texture": SubResource("AtlasTexture_gvd0a") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_glno6") +"texture": SubResource("AtlasTexture_kbtel") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_frnbt") +"texture": SubResource("AtlasTexture_4o7p2") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_2ytfc") +"texture": SubResource("AtlasTexture_2urqt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pcxt2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vuqy3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_abxng") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lstal") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0l1oe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rxxco") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bbdxx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0ig2j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y6ht0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7b7xb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yxxxi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g75mr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1467k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2o7eb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yobme") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ylcxs") }], "loop": false, "name": &"closeDoor", @@ -70,7 +199,7 @@ }, { "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_oyi3c") +"texture": SubResource("AtlasTexture_ohx3w") }], "loop": false, "name": &"default", @@ -78,19 +207,31 @@ }, { "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_e68us") +"texture": SubResource("AtlasTexture_edun5") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_e7wqp") +"texture": SubResource("AtlasTexture_udxe4") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_qcket") +"texture": SubResource("AtlasTexture_knqv5") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_genp5") +"texture": SubResource("AtlasTexture_1d1rp") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_krdph") +"texture": SubResource("AtlasTexture_ki550") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8tfix") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jvsmj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mk01a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j6b5g") }], "loop": false, "name": &"openDoor", diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_N.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_N.tres index 1d7086c..91599bd 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_N.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_N.tres @@ -1,68 +1,197 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://xs72aopsgpg6"] +[gd_resource type="SpriteFrames" load_steps=34 format=3 uid="uid://xs72aopsgpg6"] -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="1_6mlq3"] +[ext_resource type="Texture2D" uid="uid://dem4b762asjry" path="res://resource/sprite/map/door_close.png" id="1_ei0vs"] +[ext_resource type="Texture2D" uid="uid://dv63neggj3xtl" path="res://resource/sprite/map/door_open.png" id="2_jmlqx"] -[sub_resource type="AtlasTexture" id="AtlasTexture_jiqrp"] -atlas = ExtResource("1_6mlq3") -region = Rect2(288, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_4ljkw"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_id4d1"] -atlas = ExtResource("1_6mlq3") -region = Rect2(256, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_gsbr3"] +atlas = ExtResource("1_ei0vs") +region = Rect2(128, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_dun04"] -atlas = ExtResource("1_6mlq3") -region = Rect2(224, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_3xyad"] +atlas = ExtResource("1_ei0vs") +region = Rect2(256, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_1rfr2"] -atlas = ExtResource("1_6mlq3") -region = Rect2(192, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_3rhje"] +atlas = ExtResource("1_ei0vs") +region = Rect2(384, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_c8ka5"] -atlas = ExtResource("1_6mlq3") -region = Rect2(160, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_scmwd"] +atlas = ExtResource("1_ei0vs") +region = Rect2(512, 0, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_3jbbr"] -atlas = ExtResource("1_6mlq3") -region = Rect2(288, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_yahdi"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_xuwj8"] -atlas = ExtResource("1_6mlq3") -region = Rect2(160, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_b3qcg"] +atlas = ExtResource("1_ei0vs") +region = Rect2(128, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_xx0rn"] -atlas = ExtResource("1_6mlq3") -region = Rect2(192, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_btbte"] +atlas = ExtResource("1_ei0vs") +region = Rect2(256, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_5h1on"] -atlas = ExtResource("1_6mlq3") -region = Rect2(224, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_0b28w"] +atlas = ExtResource("1_ei0vs") +region = Rect2(384, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_rwd5l"] -atlas = ExtResource("1_6mlq3") -region = Rect2(256, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_6ukg1"] +atlas = ExtResource("1_ei0vs") +region = Rect2(512, 80, 64, 80) -[sub_resource type="AtlasTexture" id="AtlasTexture_wov8g"] -atlas = ExtResource("1_6mlq3") -region = Rect2(288, 0, 32, 52) +[sub_resource type="AtlasTexture" id="AtlasTexture_jiet8"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_r28tm"] +atlas = ExtResource("1_ei0vs") +region = Rect2(128, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jkf57"] +atlas = ExtResource("1_ei0vs") +region = Rect2(256, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_frdgf"] +atlas = ExtResource("1_ei0vs") +region = Rect2(384, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_573yg"] +atlas = ExtResource("1_ei0vs") +region = Rect2(512, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xafye"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tsxiw"] +atlas = ExtResource("1_ei0vs") +region = Rect2(128, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_67ks6"] +atlas = ExtResource("1_ei0vs") +region = Rect2(256, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_plgh2"] +atlas = ExtResource("1_ei0vs") +region = Rect2(384, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_68xl6"] +atlas = ExtResource("1_ei0vs") +region = Rect2(512, 240, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_40vaw"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 320, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4cyi6"] +atlas = ExtResource("1_ei0vs") +region = Rect2(0, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y1j0t"] +atlas = ExtResource("2_jmlqx") +region = Rect2(0, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0lg71"] +atlas = ExtResource("2_jmlqx") +region = Rect2(128, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_al4vf"] +atlas = ExtResource("2_jmlqx") +region = Rect2(256, 0, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_odhj1"] +atlas = ExtResource("2_jmlqx") +region = Rect2(0, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ammds"] +atlas = ExtResource("2_jmlqx") +region = Rect2(128, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rt3bg"] +atlas = ExtResource("2_jmlqx") +region = Rect2(256, 80, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3qiys"] +atlas = ExtResource("2_jmlqx") +region = Rect2(0, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_smh0c"] +atlas = ExtResource("2_jmlqx") +region = Rect2(128, 160, 64, 80) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ewvdi"] +atlas = ExtResource("2_jmlqx") +region = Rect2(256, 160, 64, 80) [resource] animations = [{ "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_jiqrp") +"texture": SubResource("AtlasTexture_4ljkw") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_id4d1") +"texture": SubResource("AtlasTexture_gsbr3") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_dun04") +"texture": SubResource("AtlasTexture_3xyad") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_1rfr2") +"texture": SubResource("AtlasTexture_3rhje") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_c8ka5") +"texture": SubResource("AtlasTexture_scmwd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yahdi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b3qcg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_btbte") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0b28w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6ukg1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jiet8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r28tm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jkf57") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_frdgf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_573yg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xafye") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tsxiw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_67ks6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_plgh2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_68xl6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_40vaw") }], "loop": false, "name": &"closeDoor", @@ -70,7 +199,7 @@ }, { "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_3jbbr") +"texture": SubResource("AtlasTexture_4cyi6") }], "loop": false, "name": &"default", @@ -78,19 +207,31 @@ }, { "frames": [{ "duration": 1.0, -"texture": SubResource("AtlasTexture_xuwj8") +"texture": SubResource("AtlasTexture_y1j0t") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_xx0rn") +"texture": SubResource("AtlasTexture_0lg71") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_5h1on") +"texture": SubResource("AtlasTexture_al4vf") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_rwd5l") +"texture": SubResource("AtlasTexture_odhj1") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_wov8g") +"texture": SubResource("AtlasTexture_ammds") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rt3bg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3qiys") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_smh0c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ewvdi") }], "loop": false, "name": &"openDoor", diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_S.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_S.tres deleted file mode 100644 index 5988cc3..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_S.tres +++ /dev/null @@ -1,98 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://ciqijjxup5356"] - -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="1_46oik"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_w2vr1"] -atlas = ExtResource("1_46oik") -region = Rect2(128, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_3akio"] -atlas = ExtResource("1_46oik") -region = Rect2(96, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_xxpwm"] -atlas = ExtResource("1_46oik") -region = Rect2(64, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_vjx8u"] -atlas = ExtResource("1_46oik") -region = Rect2(32, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_clyvp"] -atlas = ExtResource("1_46oik") -region = Rect2(0, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_1vfst"] -atlas = ExtResource("1_46oik") -region = Rect2(128, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_8wrb5"] -atlas = ExtResource("1_46oik") -region = Rect2(0, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_nwt0b"] -atlas = ExtResource("1_46oik") -region = Rect2(32, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ohokj"] -atlas = ExtResource("1_46oik") -region = Rect2(64, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_wqsd1"] -atlas = ExtResource("1_46oik") -region = Rect2(96, 0, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_i6sro"] -atlas = ExtResource("1_46oik") -region = Rect2(128, 0, 32, 52) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_w2vr1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_3akio") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_xxpwm") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_vjx8u") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_clyvp") -}], -"loop": false, -"name": &"closeDoor", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_1vfst") -}], -"loop": false, -"name": &"default", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_8wrb5") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_nwt0b") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_ohokj") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_wqsd1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_i6sro") -}], -"loop": false, -"name": &"openDoor", -"speed": 10.0 -}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Down.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Down.tres deleted file mode 100644 index 86fc6ad..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Down.tres +++ /dev/null @@ -1,98 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://qq3h0mh4r12i"] - -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="1_b4js3"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_526no"] -atlas = ExtResource("1_b4js3") -region = Rect2(288, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_84kmd"] -atlas = ExtResource("1_b4js3") -region = Rect2(256, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_km4i6"] -atlas = ExtResource("1_b4js3") -region = Rect2(224, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_wtul1"] -atlas = ExtResource("1_b4js3") -region = Rect2(192, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_vbu5n"] -atlas = ExtResource("1_b4js3") -region = Rect2(160, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_yxx5v"] -atlas = ExtResource("1_b4js3") -region = Rect2(288, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_4ncdo"] -atlas = ExtResource("1_b4js3") -region = Rect2(160, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_bxfu1"] -atlas = ExtResource("1_b4js3") -region = Rect2(192, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_8082a"] -atlas = ExtResource("1_b4js3") -region = Rect2(224, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_mjuqg"] -atlas = ExtResource("1_b4js3") -region = Rect2(256, 104, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_rc634"] -atlas = ExtResource("1_b4js3") -region = Rect2(288, 104, 32, 52) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_526no") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_84kmd") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_km4i6") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_wtul1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_vbu5n") -}], -"loop": false, -"name": &"closeDoor", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_yxx5v") -}], -"loop": false, -"name": &"default", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_4ncdo") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_bxfu1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_8082a") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_mjuqg") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_rc634") -}], -"loop": false, -"name": &"openDoor", -"speed": 10.0 -}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Up.tres b/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Up.tres deleted file mode 100644 index 6c18e9e..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/other/RoomDoor_W_Up.tres +++ /dev/null @@ -1,98 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=13 format=3 uid="uid://cpdt5ywrsruu3"] - -[ext_resource type="Texture2D" uid="uid://f7d7qsdxqx28" path="res://resource/sprite/map/door.png" id="2_klr41"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_skb20"] -atlas = ExtResource("2_klr41") -region = Rect2(288, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_dk55p"] -atlas = ExtResource("2_klr41") -region = Rect2(256, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_78qdb"] -atlas = ExtResource("2_klr41") -region = Rect2(224, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_sqirq"] -atlas = ExtResource("2_klr41") -region = Rect2(192, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_c65nc"] -atlas = ExtResource("2_klr41") -region = Rect2(160, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6tswf"] -atlas = ExtResource("2_klr41") -region = Rect2(288, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_hg8wo"] -atlas = ExtResource("2_klr41") -region = Rect2(160, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_qkhur"] -atlas = ExtResource("2_klr41") -region = Rect2(192, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6rqcm"] -atlas = ExtResource("2_klr41") -region = Rect2(224, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_y0tub"] -atlas = ExtResource("2_klr41") -region = Rect2(256, 52, 32, 52) - -[sub_resource type="AtlasTexture" id="AtlasTexture_w8xe5"] -atlas = ExtResource("2_klr41") -region = Rect2(288, 52, 32, 52) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_skb20") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_dk55p") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_78qdb") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_sqirq") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_c65nc") -}], -"loop": false, -"name": &"closeDoor", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_6tswf") -}], -"loop": false, -"name": &"default", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_hg8wo") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_qkhur") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_6rqcm") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_y0tub") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_w8xe5") -}], -"loop": false, -"name": &"openDoor", -"speed": 10.0 -}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0010.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0010.tres new file mode 100644 index 0000000..fd083c4 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0010.tres @@ -0,0 +1,97 @@ +[gd_resource type="SpriteFrames" load_steps=14 format=3 uid="uid://cd7fhaqk587o2"] + +[ext_resource type="Texture2D" uid="uid://7uvgno67d1aq" path="res://resource/sprite/weapon/weapon0010/Weapon0010.png" id="1_4kjnn"] +[ext_resource type="Texture2D" uid="uid://drhwb6yaqfocm" path="res://resource/sprite/weapon/weapon0010/Weapon0010_reloading.png" id="2_rwx4o"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_0dydo"] +atlas = ExtResource("2_rwx4o") +region = Rect2(0, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dfwtc"] +atlas = ExtResource("2_rwx4o") +region = Rect2(37, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gak18"] +atlas = ExtResource("2_rwx4o") +region = Rect2(74, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rv7be"] +atlas = ExtResource("2_rwx4o") +region = Rect2(111, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5t03e"] +atlas = ExtResource("2_rwx4o") +region = Rect2(148, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lyx3v"] +atlas = ExtResource("2_rwx4o") +region = Rect2(185, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gpgko"] +atlas = ExtResource("2_rwx4o") +region = Rect2(222, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vovwl"] +atlas = ExtResource("2_rwx4o") +region = Rect2(259, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2eogh"] +atlas = ExtResource("2_rwx4o") +region = Rect2(296, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ushsg"] +atlas = ExtResource("2_rwx4o") +region = Rect2(333, 0, 37, 17) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a4yk5"] +atlas = ExtResource("2_rwx4o") +region = Rect2(370, 0, 37, 17) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_4kjnn") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_0dydo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dfwtc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gak18") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rv7be") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5t03e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lyx3v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gpgko") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vovwl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2eogh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ushsg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a4yk5") +}], +"loop": false, +"name": &"reloading_frame", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0011.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0011.tres new file mode 100644 index 0000000..9619c42 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0011.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://xvfg1a0xj7ng"] + +[ext_resource type="Texture2D" uid="uid://d2nw07bxifdv6" path="res://resource/sprite/weapon/weapon0011/Weapon0011.png" id="1_d6ft8"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_d6ft8") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0013.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0013.tres new file mode 100644 index 0000000..4901466 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0013.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://cawsi08vaqfrn"] + +[ext_resource type="Texture2D" uid="uid://cphawlk2w0w6w" path="res://resource/sprite/weapon/weapon0013/weapon0013.png" id="1_akn2h"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_akn2h") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0014.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0014.tres new file mode 100644 index 0000000..148385f --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0014.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://taxfr2lcy0f3"] + +[ext_resource type="Texture2D" uid="uid://d27ax1aqghn0k" path="res://resource/sprite/weapon/weapon0014/Weapon0014.png" id="1_lpq2x"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_lpq2x") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0016.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0016.tres new file mode 100644 index 0000000..57712f9 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0016.tres @@ -0,0 +1,97 @@ +[gd_resource type="SpriteFrames" load_steps=14 format=3 uid="uid://ccrflh6pjmq7r"] + +[ext_resource type="Texture2D" uid="uid://5yvr8ylxhqtf" path="res://resource/sprite/weapon/weapon0016/weapon0016.png" id="1_tbusc"] +[ext_resource type="Texture2D" uid="uid://3nqcx8tshjpd" path="res://resource/sprite/weapon/weapon0016/weapon0016_pull.png" id="2_a4jp6"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_355pd"] +atlas = ExtResource("2_a4jp6") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xe11p"] +atlas = ExtResource("2_a4jp6") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tvcy5"] +atlas = ExtResource("2_a4jp6") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3mfbu"] +atlas = ExtResource("2_a4jp6") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_08e07"] +atlas = ExtResource("2_a4jp6") +region = Rect2(0, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_50vyq"] +atlas = ExtResource("2_a4jp6") +region = Rect2(32, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ufb5n"] +atlas = ExtResource("2_a4jp6") +region = Rect2(64, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qdq04"] +atlas = ExtResource("2_a4jp6") +region = Rect2(96, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_co5vl"] +atlas = ExtResource("2_a4jp6") +region = Rect2(0, 64, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_chj45"] +atlas = ExtResource("2_a4jp6") +region = Rect2(32, 64, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gf76j"] +atlas = ExtResource("2_a4jp6") +region = Rect2(64, 64, 32, 32) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_tbusc") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_355pd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xe11p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tvcy5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3mfbu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_08e07") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_50vyq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ufb5n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qdq04") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_co5vl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_chj45") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gf76j") +}], +"loop": false, +"name": &"pull_frame", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/theme/mainTheme.tres b/DungeonShooting_Godot/resource/theme/mainTheme.tres index 591d33f..4c042ce 100644 --- a/DungeonShooting_Godot/resource/theme/mainTheme.tres +++ b/DungeonShooting_Godot/resource/theme/mainTheme.tres @@ -13,7 +13,6 @@ border_width_right = 1 border_width_bottom = 1 border_color = Color(0.117647, 0.431373, 0.905882, 1) -corner_radius_bottom_left = 4 [sub_resource type="StyleBoxFlat" id="3"] content_margin_left = 6.0 diff --git a/DungeonShooting_Godot/scene/Dungeon.tscn b/DungeonShooting_Godot/scene/Dungeon.tscn new file mode 100644 index 0000000..8944b1e --- /dev/null +++ b/DungeonShooting_Godot/scene/Dungeon.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=3 format=3 uid="uid://bqf2vks5ggnsp"] + +[ext_resource type="Script" path="res://src/game/room/Dungeon.cs" id="1_txiyv"] + +[sub_resource type="Environment" id="Environment_g06jj"] +background_mode = 3 +glow_enabled = true +glow_normalized = true +glow_strength = 1.05 +glow_blend_mode = 1 + +[node name="Dungeon" type="CanvasModulate"] +script = ExtResource("1_txiyv") +metadata/_edit_vertical_guides_ = [] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_g06jj") + +[node name="TileRoot" type="TileMap" parent="." groups=["navigation"]] +y_sort_enabled = true +format = 2 + +[node name="NavigationRoot" type="Node2D" parent="TileRoot"] +z_index = -2 + +[node name="StaticSpriteRoot" type="Node2D" parent="TileRoot"] +z_index = -2 + +[node name="NormalLayer" type="Node2D" parent="TileRoot"] +z_index = -1 + +[node name="YSortLayer" type="Node2D" parent="TileRoot"] +z_index = 2 +y_sort_enabled = true + +[node name="AffiliationAreaRoot" type="Node2D" parent="TileRoot"] + +[node name="FogMaskRoot" type="Node2D" parent="TileRoot"] diff --git a/DungeonShooting_Godot/scene/Hall.tscn b/DungeonShooting_Godot/scene/Hall.tscn new file mode 100644 index 0000000..30dfa28 --- /dev/null +++ b/DungeonShooting_Godot/scene/Hall.tscn @@ -0,0 +1,75 @@ +[gd_scene load_steps=11 format=3 uid="uid://c2hynqudkykxl"] + +[ext_resource type="PackedScene" path="res://scene/Dungeon.tscn" id="1_31od0"] +[ext_resource type="Script" path="res://src/game/hall/Hall.cs" id="2_43fdu"] +[ext_resource type="Texture2D" uid="uid://b2j5mkqm3uv6w" path="res://resource/sprite/hall/HallBg.png" id="3_p8v6p"] +[ext_resource type="Script" path="res://src/game/hall/DungeonEntrance.cs" id="3_t3my6"] +[ext_resource type="Script" path="res://src/framework/activity/ActivityInstance.cs" id="5_lowqi"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ru8u4"] +size = Vector2(66, 32) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_l0mok"] +size = Vector2(91, 434) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ch1xw"] +size = Vector2(1024.5, 65.5) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ea4u5"] +size = Vector2(448, 110) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_o0n0h"] +size = Vector2(1023, 110) + +[node name="Hall" node_paths=PackedStringArray("BirthMark", "BgSprite") instance=ExtResource("1_31od0")] +script = ExtResource("2_43fdu") +BirthMark = NodePath("BirthMark") +BgSprite = NodePath("HallBg") +metadata/_edit_horizontal_guides_ = [666.0, -210.0] + +[node name="HallBg" type="Sprite2D" parent="." index="1"] +z_index = -5 +texture = ExtResource("3_p8v6p") +centered = false + +[node name="BirthMark" type="Marker2D" parent="." index="2"] +position = Vector2(553, 320) + +[node name="DungeonEntrance" type="Area2D" parent="." index="3"] +position = Vector2(537, 209) +collision_layer = 0 +collision_mask = 8 +monitorable = false +script = ExtResource("3_t3my6") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DungeonEntrance" index="0"] +shape = SubResource("RectangleShape2D_ru8u4") + +[node name="ActivityInstance" type="Node2D" parent="." index="4"] +position = Vector2(533, 317) +script = ExtResource("5_lowqi") +Id = "weapon0002" +CollisionVisible = false + +[node name="StaticBody2D" type="StaticBody2D" parent="." index="5"] +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D" index="0"] +position = Vector2(-47, 296) +shape = SubResource("RectangleShape2D_l0mok") + +[node name="CollisionShape2D5" type="CollisionShape2D" parent="StaticBody2D" index="1"] +position = Vector2(1070, 306) +shape = SubResource("RectangleShape2D_l0mok") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="StaticBody2D" index="2"] +position = Vector2(511.75, 481.25) +shape = SubResource("RectangleShape2D_ch1xw") + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="StaticBody2D" index="3"] +position = Vector2(528, 393) +shape = SubResource("RectangleShape2D_ea4u5") + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="StaticBody2D" index="4"] +position = Vector2(512.5, 148) +shape = SubResource("RectangleShape2D_o0n0h") diff --git a/DungeonShooting_Godot/scene/Main.tscn b/DungeonShooting_Godot/scene/Main.tscn index 346e221..b55999a 100644 --- a/DungeonShooting_Godot/scene/Main.tscn +++ b/DungeonShooting_Godot/scene/Main.tscn @@ -8,12 +8,8 @@ shader = ExtResource("2_fxoum") shader_parameter/offset = Vector2(0, 0) -[node name="Main" type="Node2D" node_paths=PackedStringArray("SubViewport", "SubViewportContainer", "SceneRoot", "GlobalNodeRoot")] +[node name="Main" type="Node2D"] script = ExtResource("1_mh1cq") -SubViewport = NodePath("ViewCanvas/SubViewportContainer/SubViewport") -SubViewportContainer = NodePath("ViewCanvas/SubViewportContainer") -SceneRoot = NodePath("ViewCanvas/SubViewportContainer/SubViewport/SceneRoot") -GlobalNodeRoot = NodePath("GlobalNodeRoot") metadata/_edit_vertical_guides_ = [] [node name="ViewCanvas" type="CanvasLayer" parent="."] @@ -28,6 +24,8 @@ [node name="SubViewport" type="SubViewport" parent="ViewCanvas/SubViewportContainer"] disable_3d = true handle_input_locally = false +snap_2d_transforms_to_pixel = true +snap_2d_vertices_to_pixel = true use_hdr_2d = true canvas_item_default_texture_filter = 0 size = Vector2i(320, 180) diff --git a/DungeonShooting_Godot/scene/World.tscn b/DungeonShooting_Godot/scene/World.tscn deleted file mode 100644 index bead9d8..0000000 --- a/DungeonShooting_Godot/scene/World.tscn +++ /dev/null @@ -1,49 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://bqf2vks5ggnsp"] - -[ext_resource type="Script" path="res://src/game/room/World.cs" id="1_kt3mm"] - -[sub_resource type="Environment" id="Environment_g06jj"] -background_mode = 3 -glow_enabled = true -glow_normalized = true -glow_strength = 1.05 -glow_blend_mode = 1 - -[node name="World" type="CanvasModulate" node_paths=PackedStringArray("NormalLayer", "YSortLayer", "TileRoot", "StaticSpriteRoot", "AffiliationAreaRoot", "FogMaskRoot")] -script = ExtResource("1_kt3mm") -NormalLayer = NodePath("NormalLayer") -YSortLayer = NodePath("YSortLayer") -TileRoot = NodePath("TileRoot") -StaticSpriteRoot = NodePath("StaticSpriteRoot") -AffiliationAreaRoot = NodePath("AffiliationAreaRoot") -FogMaskRoot = NodePath("FogMaskRoot") -metadata/_edit_vertical_guides_ = [] - -[node name="WorldEnvironment" type="WorldEnvironment" parent="."] -environment = SubResource("Environment_g06jj") - -[node name="TileRoot" type="TileMap" parent="."] -format = 2 -layer_0/name = "Floor" -layer_0/z_index = -10 -layer_1/name = "Middle" -layer_1/tile_data = PackedInt32Array() -layer_2/name = "Top" -layer_2/z_index = 10 -layer_2/tile_data = PackedInt32Array() -layer_3/name = "AisleFloor" -layer_3/z_index = -10 -layer_3/tile_data = PackedInt32Array() - -[node name="StaticSpriteRoot" type="Node2D" parent="."] -z_index = -2 - -[node name="NormalLayer" type="Node2D" parent="."] -z_index = -1 - -[node name="YSortLayer" type="Node2D" parent="."] -y_sort_enabled = true - -[node name="AffiliationAreaRoot" type="Node2D" parent="."] - -[node name="FogMaskRoot" type="Node2D" parent="."] diff --git a/DungeonShooting_Godot/scene/test/TestLoadTileSetConfig.tscn b/DungeonShooting_Godot/scene/test/TestLoadTileSetConfig.tscn new file mode 100644 index 0000000..e06b23c --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestLoadTileSetConfig.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://cye62nvkf8ld1"] + +[ext_resource type="Script" path="res://src/test/TestLoadTileSetConfig.cs" id="1_1wodj"] + +[node name="TestLoadTileSetConfig" type="Node2D"] +script = ExtResource("1_1wodj") + +[node name="TileMap" type="TileMap" parent="."] +scale = Vector2(4, 4) +format = 2 diff --git a/DungeonShooting_Godot/scene/test/TestMask2.tscn b/DungeonShooting_Godot/scene/test/TestMask2.tscn index a18fde2..5ce4dee 100644 --- a/DungeonShooting_Godot/scene/test/TestMask2.tscn +++ b/DungeonShooting_Godot/scene/test/TestMask2.tscn @@ -3,10 +3,10 @@ [ext_resource type="Script" path="res://src/test/TestMask2.cs" id="1_rtexh"] [ext_resource type="Texture2D" uid="uid://b1qqkdbgeiptt" path="res://resource/sprite/brush/Brush1.png" id="2_bgpg8"] [ext_resource type="Texture2D" uid="uid://diehy0xukqgxk" path="res://resource/sprite/brush/Brush2.png" id="3_207p4"] -[ext_resource type="TileSet" uid="uid://b00g22o1cqhe8" path="res://resource/map/tileSet/map1/TileSet1.tres" id="4_10tef"] [ext_resource type="SpriteFrames" uid="uid://n11thtali6es" path="res://resource/spriteFrames/role/Role0001.tres" id="7_dqhlh"] + [node name="TestMask2" type="SubViewportContainer" node_paths=PackedStringArray("Message", "Player")] offset_right = 480.0 offset_bottom = 270.0 @@ -28,7 +28,6 @@ render_target_update_mode = 4 [node name="TileMap" type="TileMap" parent="SubViewport"] -tile_set = ExtResource("4_10tef") format = 2 layer_0/tile_data = PackedInt32Array(917527, 0, 8, 851991, 0, 8, 786455, 0, 8, 720919, 0, 8, 655383, 0, 8, 589847, 0, 8, 524311, 0, 8, 458775, 0, 8, 393239, 0, 8, 327703, 0, 8, 262167, 0, 8, 196631, 0, 8, 131095, 0, 8, 65559, 0, 8, 23, 0, 8, -65513, 0, 8, -131049, 0, 8, -196585, 0, 8, -262121, 0, 8, -327657, 0, 8, 917526, 0, 8, 851990, 0, 8, 786454, 0, 8, 720918, 0, 8, 655382, 0, 8, 589846, 0, 8, 524310, 0, 8, 458774, 0, 8, 393238, 0, 8, 327702, 0, 8, 262166, 0, 8, 196630, 0, 8, 131094, 0, 8, 65558, 0, 8, 22, 0, 8, -65514, 0, 8, -131050, 0, 8, -196586, 0, 8, -262122, 0, 8, -327658, 0, 8, 917525, 0, 8, 851989, 0, 8, 786453, 0, 8, 720917, 0, 8, 655381, 0, 8, 589845, 0, 8, 524309, 0, 8, 458773, 0, 8, 393237, 0, 8, 327701, 0, 8, 262165, 0, 8, 196629, 0, 8, 131093, 0, 8, 65557, 0, 8, 21, 0, 8, -65515, 0, 8, -131051, 0, 8, -196587, 0, 8, -262123, 0, 8, -327659, 0, 8, 917524, 0, 8, 851988, 0, 8, 786452, 0, 8, 720916, 0, 8, 655380, 0, 8, 589844, 0, 8, 524308, 0, 8, 458772, 0, 8, 393236, 0, 8, 327700, 0, 8, 262164, 0, 8, 196628, 0, 8, 131092, 0, 8, 65556, 0, 8, 20, 0, 8, -65516, 0, 8, -131052, 0, 8, -196588, 0, 8, -262124, 0, 8, -327660, 0, 8, 917523, 0, 8, 851987, 0, 8, 786451, 0, 8, 720915, 0, 8, 655379, 0, 8, 589843, 0, 8, 524307, 0, 8, 458771, 0, 8, 393235, 0, 8, 327699, 0, 8, 262163, 0, 8, 196627, 0, 8, 131091, 0, 8, 65555, 0, 8, 19, 0, 8, -65517, 0, 8, -131053, 0, 8, -196589, 0, 8, -262125, 0, 8, -327661, 0, 8, 917522, 0, 8, 851986, 0, 8, 786450, 0, 8, 720914, 0, 8, 655378, 0, 8, 589842, 0, 8, 524306, 0, 8, 458770, 0, 8, 393234, 0, 8, 327698, 0, 8, 262162, 0, 8, 196626, 0, 8, 131090, 0, 8, 65554, 0, 8, 18, 0, 8, -65518, 0, 8, -131054, 0, 8, -196590, 0, 8, -262126, 0, 8, -327662, 0, 8, 917521, 0, 8, 851985, 0, 8, 786449, 0, 8, 720913, 0, 8, 655377, 0, 8, 589841, 0, 8, 524305, 0, 8, 458769, 0, 8, 393233, 0, 8, 327697, 0, 8, 262161, 0, 8, 196625, 0, 8, 131089, 0, 8, 65553, 0, 8, 17, 0, 8, -65519, 0, 8, -131055, 0, 8, -196591, 0, 8, -262127, 0, 8, -327663, 0, 8, 917520, 0, 8, 851984, 0, 8, 786448, 0, 8, 720912, 0, 8, 655376, 0, 8, 589840, 0, 8, 524304, 0, 8, 458768, 0, 8, 393232, 0, 8, 327696, 0, 8, 262160, 0, 8, 196624, 0, 8, 131088, 0, 8, 65552, 0, 8, 16, 0, 8, -65520, 0, 8, -131056, 0, 8, -196592, 0, 8, -262128, 0, 8, -327664, 0, 8, 917519, 0, 8, 851983, 0, 8, 786447, 0, 8, 720911, 0, 8, 655375, 0, 8, 589839, 0, 8, 524303, 0, 8, 458767, 0, 8, 393231, 0, 8, 327695, 0, 8, 262159, 0, 8, 196623, 0, 8, 131087, 0, 8, 65551, 0, 8, 15, 0, 8, -65521, 0, 8, -131057, 0, 8, -196593, 0, 8, -262129, 0, 8, -327665, 0, 8, 917518, 0, 8, 851982, 0, 8, 786446, 0, 8, 720910, 0, 8, 655374, 0, 8, 589838, 0, 8, 524302, 0, 8, 458766, 0, 8, 393230, 0, 8, 327694, 0, 8, 262158, 0, 8, 196622, 0, 8, 131086, 0, 8, 65550, 0, 8, 14, 0, 8, -65522, 0, 8, -131058, 0, 8, -196594, 0, 8, -262130, 0, 8, -327666, 0, 8, 917517, 0, 8, 851981, 0, 8, 786445, 0, 8, 720909, 0, 8, 655373, 0, 8, 589837, 0, 8, 524301, 0, 8, 458765, 0, 8, 393229, 0, 8, 327693, 0, 8, 262157, 0, 8, 196621, 0, 8, 131085, 0, 8, 65549, 0, 8, 13, 0, 8, -65523, 0, 8, -131059, 0, 8, -196595, 0, 8, -262131, 0, 8, -327667, 0, 8, 917516, 0, 8, 851980, 0, 8, 786444, 0, 8, 720908, 0, 8, 655372, 0, 8, 589836, 0, 8, 524300, 0, 8, 458764, 0, 8, 393228, 0, 8, 327692, 0, 8, 262156, 0, 8, 196620, 0, 8, 131084, 0, 8, 65548, 0, 8, 12, 0, 8, -65524, 0, 8, -131060, 0, 8, -196596, 0, 8, -262132, 0, 8, -327668, 0, 8, 917515, 0, 8, 851979, 0, 8, 786443, 0, 8, 720907, 0, 8, 655371, 0, 8, 589835, 0, 8, 524299, 0, 8, 458763, 0, 8, 393227, 0, 8, 327691, 0, 8, 262155, 0, 8, 196619, 0, 8, 131083, 0, 8, 65547, 0, 8, 11, 0, 8, -65525, 0, 8, -131061, 0, 8, -196597, 0, 8, -262133, 0, 8, -327669, 0, 8, 917514, 0, 8, 851978, 0, 8, 786442, 0, 8, 720906, 0, 8, 655370, 0, 8, 589834, 0, 8, 524298, 0, 8, 458762, 0, 8, 393226, 0, 8, 327690, 0, 8, 262154, 0, 8, 196618, 0, 8, 131082, 0, 8, 65546, 0, 8, 10, 0, 8, -65526, 0, 8, -131062, 0, 8, -196598, 0, 8, -262134, 0, 8, -327670, 0, 8, 917513, 0, 8, 851977, 0, 8, 786441, 0, 8, 720905, 0, 8, 655369, 0, 8, 589833, 0, 8, 524297, 0, 8, 458761, 0, 8, 393225, 0, 8, 327689, 0, 8, 262153, 0, 8, 196617, 0, 8, 131081, 0, 8, 65545, 0, 8, 9, 0, 8, -65527, 0, 8, -131063, 0, 8, -196599, 0, 8, -262135, 0, 8, -327671, 0, 8, 917512, 0, 8, 851976, 0, 8, 786440, 0, 8, 720904, 0, 8, 655368, 0, 8, 589832, 0, 8, 524296, 0, 8, 458760, 0, 8, 393224, 0, 8, 327688, 0, 8, 262152, 0, 8, 196616, 0, 8, 131080, 0, 8, 65544, 0, 8, 8, 0, 8, -65528, 0, 8, -131064, 0, 8, -196600, 0, 8, -262136, 0, 8, -327672, 0, 8, 917511, 0, 8, 851975, 0, 8, 786439, 0, 8, 720903, 0, 8, 655367, 0, 8, 589831, 0, 8, 524295, 0, 8, 458759, 0, 8, 393223, 0, 8, 327687, 0, 8, 262151, 0, 8, 196615, 0, 8, 131079, 0, 8, 65543, 0, 8, 7, 0, 8, -65529, 0, 8, -131065, 0, 8, -196601, 0, 8, -262137, 0, 8, -327673, 0, 8, 917510, 0, 8, 851974, 0, 8, 786438, 0, 8, 720902, 0, 8, 655366, 0, 8, 589830, 0, 8, 524294, 0, 8, 458758, 0, 8, 393222, 0, 8, 327686, 0, 8, 262150, 0, 8, 196614, 0, 8, 131078, 0, 8, 65542, 0, 8, 6, 0, 8, -65530, 0, 8, -131066, 0, 8, -196602, 0, 8, -262138, 0, 8, -327674, 0, 8, 917509, 0, 8, 851973, 0, 8, 786437, 0, 8, 720901, 0, 8, 655365, 0, 8, 589829, 0, 8, 524293, 0, 8, 458757, 0, 8, 393221, 0, 8, 327685, 0, 8, 262149, 0, 8, 196613, 0, 8, 131077, 0, 8, 65541, 0, 8, 5, 0, 8, -65531, 0, 8, -131067, 0, 8, -196603, 0, 8, -262139, 0, 8, -327675, 0, 8, 917508, 0, 8, 851972, 0, 8, 786436, 0, 8, 720900, 0, 8, 655364, 0, 8, 589828, 0, 8, 524292, 0, 8, 458756, 0, 8, 393220, 0, 8, 327684, 0, 8, 262148, 0, 8, 196612, 0, 8, 131076, 0, 8, 65540, 0, 8, 4, 0, 8, -65532, 0, 8, -131068, 0, 8, -196604, 0, 8, -262140, 0, 8, -327676, 0, 8, 917507, 0, 8, 851971, 0, 8, 786435, 0, 8, 720899, 0, 8, 655363, 0, 8, 589827, 0, 8, 524291, 0, 8, 458755, 0, 8, 393219, 0, 8, 327683, 0, 8, 262147, 0, 8, 196611, 0, 8, 131075, 0, 8, 65539, 0, 8, 3, 0, 8, -65533, 0, 8, -131069, 0, 8, -196605, 0, 8, -262141, 0, 8, -327677, 0, 8, 917506, 0, 8, 851970, 0, 8, 786434, 0, 8, 720898, 0, 8, 655362, 0, 8, 589826, 0, 8, 524290, 0, 8, 458754, 0, 8, 393218, 0, 8, 327682, 0, 8, 262146, 0, 8, 196610, 0, 8, 131074, 0, 8, 65538, 0, 8, 2, 0, 8, -65534, 0, 8, -131070, 0, 8, -196606, 0, 8, -262142, 0, 8, -327678, 0, 8, 917505, 0, 8, 851969, 0, 8, 786433, 0, 8, 720897, 0, 8, 655361, 0, 8, 589825, 0, 8, 524289, 0, 8, 458753, 0, 8, 393217, 0, 8, 327681, 0, 8, 262145, 0, 8, 196609, 0, 8, 131073, 0, 8, 65537, 0, 8, 1, 0, 8, -65535, 0, 8, -131071, 0, 8, -196607, 0, 8, -262143, 0, 8, -327679, 0, 8, 917504, 0, 8, 851968, 0, 8, 786432, 0, 8, 720896, 0, 8, 655360, 0, 8, 589824, 0, 8, 524288, 0, 8, 458752, 0, 8, 393216, 0, 8, 327680, 0, 8, 262144, 0, 8, 196608, 0, 8, 131072, 0, 8, 65536, 0, 8, 0, 0, 8, -65536, 0, 8, -131072, 0, 8, -196608, 0, 8, -262144, 0, 8, -327680, 0, 8, 983039, 0, 8, 917503, 0, 8, 851967, 0, 8, 786431, 0, 8, 720895, 0, 8, 655359, 0, 8, 589823, 0, 8, 524287, 0, 8, 458751, 0, 8, 393215, 0, 8, 327679, 0, 8, 262143, 0, 8, 196607, 0, 8, 131071, 0, 8, 65535, 0, 8, -1, 0, 8, -65537, 0, 8, -131073, 0, 8, -196609, 0, 8, -262145, 0, 8, 983038, 0, 8, 917502, 0, 8, 851966, 0, 8, 786430, 0, 8, 720894, 0, 8, 655358, 0, 8, 589822, 0, 8, 524286, 0, 8, 458750, 0, 8, 393214, 0, 8, 327678, 0, 8, 262142, 0, 8, 196606, 0, 8, 131070, 0, 8, 65534, 0, 8, -2, 0, 8, -65538, 0, 8, -131074, 0, 8, -196610, 0, 8, -262146, 0, 8, 983037, 0, 8, 917501, 0, 8, 851965, 0, 8, 786429, 0, 8, 720893, 0, 8, 655357, 0, 8, 589821, 0, 8, 524285, 0, 8, 458749, 0, 8, 393213, 0, 8, 327677, 0, 8, 262141, 0, 8, 196605, 0, 8, 131069, 0, 8, 65533, 0, 8, -3, 0, 8, -65539, 0, 8, -131075, 0, 8, -196611, 0, 8, -262147, 0, 8, 983036, 0, 8, 917500, 0, 8, 851964, 0, 8, 786428, 0, 8, 720892, 0, 8, 655356, 0, 8, 589820, 0, 8, 524284, 0, 8, 458748, 0, 8, 393212, 0, 8, 327676, 0, 8, 262140, 0, 8, 196604, 0, 8, 131068, 0, 8, 65532, 0, 8, -4, 0, 8, -65540, 0, 8, -131076, 0, 8, -196612, 0, 8, -262148, 0, 8, 983035, 0, 8, 917499, 0, 8, 851963, 0, 8, 786427, 0, 8, 720891, 0, 8, 655355, 0, 8, 589819, 0, 8, 524283, 0, 8, 458747, 0, 8, 393211, 0, 8, 327675, 0, 8, 262139, 0, 8, 196603, 0, 8, 131067, 0, 8, 65531, 0, 8, -5, 0, 8, -65541, 0, 8, -131077, 0, 8, -196613, 0, 8, -262149, 0, 8, -196614, 196608, 3, -262150, 196608, 3, -327686, 196608, 4, -327685, 131072, 7, -327684, 131072, 7, -131078, 196608, 3, -65542, 196608, 3, -6, 196608, 3, 65530, 196608, 3, 131066, 196608, 3, 196602, 196608, 3, 262138, 196608, 3, 327674, 196608, 3, 393210, 196608, 3, 458746, 196608, 3, 524282, 196608, 3, 589818, 196608, 3, 655354, 196608, 3, 720890, 196608, 7, 786426, 0, 8, 851962, 0, 8, 917498, 0, 8, 983034, 0, 8, 1048572, 0, 8, 1048571, 0, 8, 1048570, 0, 8, -327683, 131072, 7, 1048573, 0, 8, -327682, 131072, 7, 1048574, 0, 8, -327681, 131072, 7, 1048575, 0, 8, -393216, 131072, 7, 983040, 0, 8, -393215, 131072, 7, 983041, 0, 8, -393214, 131072, 7, 983042, 0, 8, -393213, 131072, 7, 983043, 0, 8, -393212, 131072, 7, 983044, 0, 8, -393211, 131072, 7, 983045, 0, 8, -393210, 131072, 7, 983046, 0, 8, -393209, 131072, 7, 983047, 0, 8, -393208, 131072, 7, 983048, 0, 8, -393207, 131072, 7, 983049, 0, 8, -393206, 131072, 7, 983050, 0, 8, -393205, 131072, 7, 983051, 0, 8, -393204, 131072, 7, 983052, 0, 8, -393203, 131072, 7, 983053, 0, 8, -393202, 131072, 7, 983054, 0, 8, -393201, 131072, 7, 983055, 0, 8, -393200, 131072, 7, 983056, 0, 8, -393199, 131072, 7, 983057, 0, 8, -393198, 131072, 7, 983058, 65536, 2, -393197, 131072, 7, 983059, 131072, 2, -393196, 131072, 7, 983060, 131072, 2, -393195, 131072, 7, 983061, 131072, 2, -393194, 131072, 7, 983062, 131072, 2, -393193, 131072, 7, 983063, 131072, 2, -327656, 65536, 3, -262120, 65536, 3, -393192, 65536, 4, -196584, 65536, 3, -131048, 65536, 3, -65512, 65536, 3, 24, 65536, 3, 65560, 65536, 3, 131096, 65536, 3, 196632, 65536, 3, 262168, 65536, 3, 327704, 65536, 3, 393240, 65536, 3, 458776, 65536, 3, 524312, 65536, 3, 589848, 65536, 3, 655384, 65536, 3, 720920, 65536, 3, 786456, 65536, 3, 851992, 65536, 3, 917528, 65536, 3, 983064, 851968, 2, 3670033, 0, 8, 3604497, 0, 8, 3538961, 0, 8, 3473425, 0, 8, 3407889, 0, 8, 3342353, 0, 8, 3276817, 0, 8, 3211281, 0, 8, 3145745, 0, 8, 3080209, 0, 8, 3014673, 0, 8, 2949137, 0, 8, 2883601, 0, 8, 2818065, 0, 8, 2752529, 0, 8, 2686993, 0, 8, 2621457, 0, 8, 2555921, 0, 8, 2490385, 0, 8, 2424849, 0, 8, 2359313, 0, 8, 2293777, 0, 8, 2228241, 0, 8, 2162705, 0, 8, 2097169, 0, 8, 2031633, 0, 8, 1966097, 0, 8, 1900561, 0, 8, 1835025, 0, 8, 1769489, 0, 8, 1703953, 0, 8, 1638417, 0, 8, 1572881, 0, 8, 1507345, 0, 8, 1441809, 0, 8, 1376273, 0, 8, 1310737, 0, 8, 1245201, 0, 8, 1179665, 0, 8, 1114129, 0, 8, 1048593, 0, 8, 3670032, 0, 8, 3604496, 0, 8, 3538960, 0, 8, 3473424, 0, 8, 3407888, 0, 8, 3342352, 0, 8, 3276816, 0, 8, 3211280, 0, 8, 3145744, 0, 8, 3080208, 0, 8, 3014672, 0, 8, 2949136, 0, 8, 2883600, 0, 8, 2818064, 0, 8, 2752528, 0, 8, 2686992, 0, 8, 2621456, 0, 8, 2555920, 0, 8, 2490384, 0, 8, 2424848, 0, 8, 2359312, 0, 8, 2293776, 0, 8, 2228240, 0, 8, 2162704, 0, 8, 2097168, 0, 8, 2031632, 0, 8, 1966096, 0, 8, 1900560, 0, 8, 1835024, 0, 8, 1769488, 0, 8, 1703952, 0, 8, 1638416, 0, 8, 1572880, 0, 8, 1507344, 0, 8, 1441808, 0, 8, 1376272, 0, 8, 1310736, 0, 8, 1245200, 0, 8, 1179664, 0, 8, 1114128, 0, 8, 1048592, 0, 8, 3670031, 0, 8, 3604495, 0, 8, 3538959, 0, 8, 3473423, 0, 8, 3407887, 0, 8, 3342351, 0, 8, 3276815, 0, 8, 3211279, 0, 8, 3145743, 0, 8, 3080207, 0, 8, 3014671, 0, 8, 2949135, 0, 8, 2883599, 0, 8, 2818063, 0, 8, 2752527, 0, 8, 2686991, 0, 8, 2621455, 0, 8, 2555919, 0, 8, 2490383, 0, 8, 2424847, 0, 8, 2359311, 0, 8, 2293775, 0, 8, 2228239, 0, 8, 2162703, 0, 8, 2097167, 0, 8, 2031631, 0, 8, 1966095, 0, 8, 1900559, 0, 8, 1835023, 0, 8, 1769487, 0, 8, 1703951, 0, 8, 1638415, 0, 8, 1572879, 0, 8, 1507343, 0, 8, 1441807, 0, 8, 1376271, 0, 8, 1310735, 0, 8, 1245199, 0, 8, 1179663, 0, 8, 1114127, 0, 8, 1048591, 0, 8, 3670030, 0, 8, 3604494, 0, 8, 3538958, 0, 8, 3473422, 0, 8, 3407886, 0, 8, 3342350, 0, 8, 3276814, 0, 8, 3211278, 0, 8, 3145742, 0, 8, 3080206, 0, 8, 3014670, 0, 8, 2949134, 0, 8, 2883598, 0, 8, 2818062, 0, 8, 2752526, 0, 8, 2686990, 0, 8, 2621454, 0, 8, 2555918, 0, 8, 2490382, 0, 8, 2424846, 0, 8, 2359310, 0, 8, 2293774, 0, 8, 2228238, 0, 8, 2162702, 0, 8, 2097166, 0, 8, 2031630, 0, 8, 1966094, 0, 8, 1900558, 0, 8, 1835022, 0, 8, 1769486, 0, 8, 1703950, 0, 8, 1638414, 0, 8, 1572878, 0, 8, 1507342, 0, 8, 1441806, 0, 8, 1376270, 0, 8, 1310734, 0, 8, 1245198, 0, 8, 1179662, 0, 8, 1114126, 0, 8, 1048590, 0, 8, 3670029, 0, 8, 3604493, 0, 8, 3538957, 0, 8, 3473421, 0, 8, 3407885, 0, 8, 3342349, 0, 8, 3276813, 0, 8, 3211277, 0, 8, 3145741, 0, 8, 3080205, 0, 8, 3014669, 0, 8, 2949133, 0, 8, 2883597, 0, 8, 2818061, 0, 8, 2752525, 0, 8, 2686989, 0, 8, 2621453, 0, 8, 2555917, 0, 8, 2490381, 0, 8, 2424845, 0, 8, 2359309, 0, 8, 2293773, 0, 8, 2228237, 0, 8, 2162701, 0, 8, 2097165, 0, 8, 2031629, 0, 8, 1966093, 0, 8, 1900557, 0, 8, 1835021, 0, 8, 1769485, 0, 8, 1703949, 0, 8, 1638413, 0, 8, 1572877, 0, 8, 1507341, 0, 8, 1441805, 0, 8, 1376269, 0, 8, 1310733, 0, 8, 1245197, 0, 8, 1179661, 0, 8, 1114125, 0, 8, 1048589, 0, 8, 3670028, 0, 8, 3604492, 0, 8, 3538956, 0, 8, 3473420, 0, 8, 3407884, 0, 8, 3342348, 0, 8, 3276812, 0, 8, 3211276, 0, 8, 3145740, 0, 8, 3080204, 0, 8, 3014668, 0, 8, 2949132, 0, 8, 2883596, 0, 8, 2818060, 0, 8, 2752524, 0, 8, 2686988, 0, 8, 2621452, 0, 8, 2555916, 0, 8, 2490380, 0, 8, 2424844, 0, 8, 2359308, 0, 8, 2293772, 0, 8, 2228236, 0, 8, 2162700, 0, 8, 2097164, 0, 8, 2031628, 0, 8, 1966092, 0, 8, 1900556, 0, 8, 1835020, 0, 8, 1769484, 0, 8, 1703948, 0, 8, 1638412, 0, 8, 1572876, 0, 8, 1507340, 0, 8, 1441804, 0, 8, 1376268, 0, 8, 1310732, 0, 8, 1245196, 0, 8, 1179660, 0, 8, 1114124, 0, 8, 1048588, 0, 8, 3670027, 0, 8, 3604491, 0, 8, 3538955, 0, 8, 3473419, 0, 8, 3407883, 0, 8, 3342347, 0, 8, 3276811, 0, 8, 3211275, 0, 8, 3145739, 0, 8, 3080203, 0, 8, 3014667, 0, 8, 2949131, 0, 8, 2883595, 0, 8, 2818059, 0, 8, 2752523, 0, 8, 2686987, 0, 8, 2621451, 0, 8, 2555915, 0, 8, 2490379, 0, 8, 2424843, 0, 8, 2359307, 0, 8, 2293771, 0, 8, 2228235, 0, 8, 2162699, 0, 8, 2097163, 0, 8, 2031627, 0, 8, 1966091, 0, 8, 1900555, 0, 8, 1835019, 0, 8, 1769483, 0, 8, 1703947, 0, 8, 1638411, 0, 8, 1572875, 0, 8, 1507339, 0, 8, 1441803, 0, 8, 1376267, 0, 8, 1310731, 0, 8, 1245195, 0, 8, 1179659, 0, 8, 1114123, 0, 8, 1048587, 0, 8, 3670026, 0, 8, 3604490, 0, 8, 3538954, 0, 8, 3473418, 0, 8, 3407882, 0, 8, 3342346, 0, 8, 3276810, 0, 8, 3211274, 0, 8, 3145738, 0, 8, 3080202, 0, 8, 3014666, 0, 8, 2949130, 0, 8, 2883594, 0, 8, 2818058, 0, 8, 2752522, 0, 8, 2686986, 0, 8, 2621450, 0, 8, 2555914, 0, 8, 2490378, 0, 8, 2424842, 0, 8, 2359306, 0, 8, 2293770, 0, 8, 2228234, 0, 8, 2162698, 0, 8, 2097162, 0, 8, 2031626, 0, 8, 1966090, 0, 8, 1900554, 0, 8, 1835018, 0, 8, 1769482, 0, 8, 1703946, 0, 8, 1638410, 0, 8, 1572874, 0, 8, 1507338, 0, 8, 1441802, 0, 8, 1376266, 0, 8, 1310730, 0, 8, 1245194, 0, 8, 1179658, 0, 8, 1114122, 0, 8, 1048586, 0, 8, 3670025, 0, 8, 3604489, 0, 8, 3538953, 0, 8, 3473417, 0, 8, 3407881, 0, 8, 3342345, 0, 8, 3276809, 0, 8, 3211273, 0, 8, 3145737, 0, 8, 3080201, 0, 8, 3014665, 0, 8, 2949129, 0, 8, 2883593, 0, 8, 2818057, 0, 8, 2752521, 0, 8, 2686985, 0, 8, 2621449, 0, 8, 2555913, 0, 8, 2490377, 0, 8, 2424841, 0, 8, 2359305, 0, 8, 2293769, 0, 8, 2228233, 0, 8, 2162697, 0, 8, 2097161, 0, 8, 2031625, 0, 8, 1966089, 0, 8, 1900553, 0, 8, 1835017, 0, 8, 1769481, 0, 8, 1703945, 0, 8, 1638409, 0, 8, 1572873, 0, 8, 1507337, 0, 8, 1441801, 0, 8, 1376265, 0, 8, 1310729, 0, 8, 1245193, 0, 8, 1179657, 0, 8, 1114121, 0, 8, 1048585, 0, 8, 3670024, 0, 8, 3604488, 0, 8, 3538952, 0, 8, 3473416, 0, 8, 3407880, 0, 8, 3342344, 0, 8, 3276808, 0, 8, 3211272, 0, 8, 3145736, 0, 8, 3080200, 0, 8, 3014664, 0, 8, 2949128, 0, 8, 2883592, 0, 8, 2818056, 0, 8, 2752520, 0, 8, 2686984, 0, 8, 2621448, 0, 8, 2555912, 0, 8, 2490376, 0, 8, 2424840, 0, 8, 2359304, 0, 8, 2293768, 0, 8, 2228232, 0, 8, 2162696, 0, 8, 2097160, 0, 8, 2031624, 0, 8, 1966088, 0, 8, 1900552, 0, 8, 1835016, 0, 8, 1769480, 0, 8, 1703944, 0, 8, 1638408, 0, 8, 1572872, 0, 8, 1507336, 0, 8, 1441800, 0, 8, 1376264, 0, 8, 1310728, 0, 8, 1245192, 0, 8, 1179656, 0, 8, 1114120, 0, 8, 1048584, 0, 8, 3670023, 0, 8, 3604487, 0, 8, 3538951, 0, 8, 3473415, 0, 8, 3407879, 0, 8, 3342343, 0, 8, 3276807, 0, 8, 3211271, 0, 8, 3145735, 0, 8, 3080199, 0, 8, 3014663, 0, 8, 2949127, 0, 8, 2883591, 0, 8, 2818055, 0, 8, 2752519, 0, 8, 2686983, 0, 8, 2621447, 0, 8, 2555911, 0, 8, 2490375, 0, 8, 2424839, 0, 8, 2359303, 0, 8, 2293767, 0, 8, 2228231, 0, 8, 2162695, 0, 8, 2097159, 0, 8, 2031623, 0, 8, 1966087, 0, 8, 1900551, 0, 8, 1835015, 0, 8, 1769479, 0, 8, 1703943, 0, 8, 1638407, 0, 8, 1572871, 0, 8, 1507335, 0, 8, 1441799, 0, 8, 1376263, 0, 8, 1310727, 0, 8, 1245191, 0, 8, 1179655, 0, 8, 1114119, 0, 8, 1048583, 0, 8, 3670022, 0, 8, 3604486, 0, 8, 3538950, 0, 8, 3473414, 0, 8, 3407878, 0, 8, 3342342, 0, 8, 3276806, 0, 8, 3211270, 0, 8, 3145734, 0, 8, 3080198, 0, 8, 3014662, 0, 8, 2949126, 0, 8, 2883590, 0, 8, 2818054, 0, 8, 2752518, 0, 8, 2686982, 0, 8, 2621446, 0, 8, 2555910, 0, 8, 2490374, 0, 8, 2424838, 0, 8, 2359302, 0, 8, 2293766, 0, 8, 2228230, 0, 8, 2162694, 0, 8, 2097158, 0, 8, 2031622, 0, 8, 1966086, 0, 8, 1900550, 0, 8, 1835014, 0, 8, 1769478, 0, 8, 1703942, 0, 8, 1638406, 0, 8, 1572870, 0, 8, 1507334, 0, 8, 1441798, 0, 8, 1376262, 0, 8, 1310726, 0, 8, 1245190, 0, 8, 1179654, 0, 8, 1114118, 0, 8, 1048582, 0, 8, 3670021, 0, 8, 3604485, 0, 8, 3538949, 0, 8, 3473413, 0, 8, 3407877, 0, 8, 3342341, 0, 8, 3276805, 0, 8, 3211269, 0, 8, 3145733, 0, 8, 3080197, 0, 8, 3014661, 0, 8, 2949125, 0, 8, 2883589, 0, 8, 2818053, 0, 8, 2752517, 0, 8, 2686981, 0, 8, 2621445, 0, 8, 2555909, 0, 8, 2490373, 0, 8, 2424837, 0, 8, 2359301, 0, 8, 2293765, 0, 8, 2228229, 0, 8, 2162693, 0, 8, 2097157, 0, 8, 2031621, 0, 8, 1966085, 0, 8, 1900549, 0, 8, 1835013, 0, 8, 1769477, 0, 8, 1703941, 0, 8, 1638405, 0, 8, 1572869, 0, 8, 1507333, 0, 8, 1441797, 0, 8, 1376261, 0, 8, 1310725, 0, 8, 1245189, 0, 8, 1179653, 0, 8, 1114117, 0, 8, 1048581, 0, 8, 3670020, 0, 8, 3604484, 0, 8, 3538948, 0, 8, 3473412, 0, 8, 3407876, 0, 8, 3342340, 0, 8, 3276804, 0, 8, 3211268, 0, 8, 3145732, 0, 8, 3080196, 0, 8, 3014660, 0, 8, 2949124, 0, 8, 2883588, 0, 8, 2818052, 0, 8, 2752516, 0, 8, 2686980, 0, 8, 2621444, 0, 8, 2555908, 0, 8, 2490372, 0, 8, 2424836, 0, 8, 2359300, 0, 8, 2293764, 0, 8, 2228228, 0, 8, 2162692, 0, 8, 2097156, 0, 8, 2031620, 0, 8, 1966084, 0, 8, 1900548, 0, 8, 1835012, 0, 8, 1769476, 0, 8, 1703940, 0, 8, 1638404, 0, 8, 1572868, 0, 8, 1507332, 0, 8, 1441796, 0, 8, 1376260, 0, 8, 1310724, 0, 8, 1245188, 0, 8, 1179652, 0, 8, 1114116, 0, 8, 1048580, 0, 8, 3670019, 0, 8, 3604483, 0, 8, 3538947, 0, 8, 3473411, 0, 8, 3407875, 0, 8, 3342339, 0, 8, 3276803, 0, 8, 3211267, 0, 8, 3145731, 0, 8, 3080195, 0, 8, 3014659, 0, 8, 2949123, 0, 8, 2883587, 0, 8, 2818051, 0, 8, 2752515, 0, 8, 2686979, 0, 8, 2621443, 0, 8, 2555907, 0, 8, 2490371, 0, 8, 2424835, 0, 8, 2359299, 0, 8, 2293763, 0, 8, 2228227, 0, 8, 2162691, 0, 8, 2097155, 0, 8, 2031619, 0, 8, 1966083, 0, 8, 1900547, 0, 8, 1835011, 0, 8, 1769475, 0, 8, 1703939, 0, 8, 1638403, 0, 8, 1572867, 0, 8, 1507331, 0, 8, 1441795, 0, 8, 1376259, 0, 8, 1310723, 0, 8, 1245187, 0, 8, 1179651, 0, 8, 1114115, 0, 8, 1048579, 0, 8, 3670018, 0, 8, 3604482, 0, 8, 3538946, 0, 8, 3473410, 0, 8, 3407874, 0, 8, 3342338, 0, 8, 3276802, 0, 8, 3211266, 0, 8, 3145730, 0, 8, 3080194, 0, 8, 3014658, 0, 8, 2949122, 0, 8, 2883586, 0, 8, 2818050, 0, 8, 2752514, 0, 8, 2686978, 0, 8, 2621442, 0, 8, 2555906, 0, 8, 2490370, 0, 8, 2424834, 0, 8, 2359298, 0, 8, 2293762, 0, 8, 2228226, 0, 8, 2162690, 0, 8, 2097154, 0, 8, 2031618, 0, 8, 1966082, 0, 8, 1900546, 0, 8, 1835010, 0, 8, 1769474, 0, 8, 1703938, 0, 8, 1638402, 0, 8, 1572866, 0, 8, 1507330, 0, 8, 1441794, 0, 8, 1376258, 0, 8, 1310722, 0, 8, 1245186, 0, 8, 1179650, 0, 8, 1114114, 0, 8, 1048578, 0, 8, 3670017, 0, 8, 3604481, 0, 8, 3538945, 0, 8, 3473409, 0, 8, 3407873, 0, 8, 3342337, 0, 8, 3276801, 0, 8, 3211265, 0, 8, 3145729, 0, 8, 3080193, 0, 8, 3014657, 0, 8, 2949121, 0, 8, 2883585, 0, 8, 2818049, 0, 8, 2752513, 0, 8, 2686977, 0, 8, 2621441, 0, 8, 2555905, 0, 8, 2490369, 0, 8, 2424833, 0, 8, 2359297, 0, 8, 2293761, 0, 8, 2228225, 0, 8, 2162689, 0, 8, 2097153, 0, 8, 2031617, 0, 8, 1966081, 0, 8, 1900545, 0, 8, 1835009, 0, 8, 1769473, 0, 8, 1703937, 0, 8, 1638401, 0, 8, 1572865, 0, 8, 1507329, 0, 8, 1441793, 0, 8, 1376257, 0, 8, 1310721, 0, 8, 1245185, 0, 8, 1179649, 0, 8, 1114113, 0, 8, 1048577, 0, 8, 3670016, 0, 8, 3604480, 0, 8, 3538944, 0, 8, 3473408, 0, 8, 3407872, 0, 8, 3342336, 0, 8, 3276800, 0, 8, 3211264, 0, 8, 3145728, 0, 8, 3080192, 0, 8, 3014656, 0, 8, 2949120, 0, 8, 2883584, 0, 8, 2818048, 0, 8, 2752512, 0, 8, 2686976, 0, 8, 2621440, 0, 8, 2555904, 0, 8, 2490368, 0, 8, 2424832, 0, 8, 2359296, 0, 8, 2293760, 0, 8, 2228224, 0, 8, 2162688, 0, 8, 2097152, 0, 8, 2031616, 0, 8, 1966080, 0, 8, 1900544, 0, 8, 1835008, 0, 8, 1769472, 0, 8, 1703936, 0, 8, 1638400, 0, 8, 1572864, 0, 8, 1507328, 0, 8, 1441792, 0, 8, 1376256, 0, 8, 1310720, 0, 8, 1245184, 0, 8, 1179648, 0, 8, 1114112, 0, 8, 1048576, 0, 8, 3735551, 0, 8, 3670015, 0, 8, 3604479, 0, 8, 3538943, 0, 8, 3473407, 0, 8, 3407871, 0, 8, 3342335, 0, 8, 3276799, 0, 8, 3211263, 0, 8, 3145727, 0, 8, 3080191, 0, 8, 3014655, 0, 8, 2949119, 0, 8, 2883583, 0, 8, 2818047, 0, 8, 2752511, 0, 8, 2686975, 0, 8, 2621439, 0, 8, 2555903, 0, 8, 2490367, 0, 8, 2424831, 0, 8, 2359295, 0, 8, 2293759, 0, 8, 2228223, 0, 8, 2162687, 0, 8, 2097151, 0, 8, 2031615, 0, 8, 1966079, 0, 8, 1900543, 0, 8, 1835007, 0, 8, 1769471, 0, 8, 1703935, 0, 8, 1638399, 0, 8, 1572863, 0, 8, 1507327, 0, 8, 1441791, 0, 8, 1376255, 0, 8, 1310719, 0, 8, 1245183, 0, 8, 1179647, 0, 8, 1114111, 0, 8, 3735550, 0, 8, 3670014, 0, 8, 3604478, 0, 8, 3538942, 0, 8, 3473406, 0, 8, 3407870, 0, 8, 3342334, 0, 8, 3276798, 0, 8, 3211262, 0, 8, 3145726, 0, 8, 3080190, 0, 8, 3014654, 0, 8, 2949118, 0, 8, 2883582, 0, 8, 2818046, 0, 8, 2752510, 0, 8, 2686974, 0, 8, 2621438, 0, 8, 2555902, 0, 8, 2490366, 0, 8, 2424830, 0, 8, 2359294, 0, 8, 2293758, 0, 8, 2228222, 0, 8, 2162686, 0, 8, 2097150, 0, 8, 2031614, 0, 8, 1966078, 0, 8, 1900542, 0, 8, 1835006, 0, 8, 1769470, 0, 8, 1703934, 0, 8, 1638398, 0, 8, 1572862, 0, 8, 1507326, 0, 8, 1441790, 0, 8, 1376254, 0, 8, 1310718, 0, 8, 1245182, 0, 8, 1179646, 0, 8, 1114110, 0, 8, 3735549, 0, 8, 3670013, 0, 8, 3604477, 0, 8, 3538941, 0, 8, 3473405, 0, 8, 3407869, 0, 8, 3342333, 0, 8, 3276797, 0, 8, 3211261, 0, 8, 3145725, 0, 8, 3080189, 0, 8, 3014653, 0, 8, 2949117, 0, 8, 2883581, 0, 8, 2818045, 0, 8, 2752509, 0, 8, 2686973, 0, 8, 2621437, 0, 8, 2555901, 0, 8, 2490365, 0, 8, 2424829, 0, 8, 2359293, 0, 8, 2293757, 0, 8, 2228221, 0, 8, 2162685, 0, 8, 2097149, 0, 8, 2031613, 0, 8, 1966077, 0, 8, 1900541, 0, 8, 1835005, 0, 8, 1769469, 0, 8, 1703933, 0, 8, 1638397, 0, 8, 1572861, 0, 8, 1507325, 0, 8, 1441789, 0, 8, 1376253, 0, 8, 1310717, 0, 8, 1245181, 0, 8, 1179645, 0, 8, 1114109, 0, 8, 3735548, 0, 8, 3670012, 0, 8, 3604476, 0, 8, 3538940, 0, 8, 3473404, 0, 8, 3407868, 0, 8, 3342332, 0, 8, 3276796, 0, 8, 3211260, 0, 8, 3145724, 0, 8, 3080188, 0, 8, 3014652, 0, 8, 2949116, 0, 8, 2883580, 0, 8, 2818044, 0, 8, 2752508, 0, 8, 2686972, 0, 8, 2621436, 0, 8, 2555900, 0, 8, 2490364, 0, 8, 2424828, 0, 8, 2359292, 0, 8, 2293756, 0, 8, 2228220, 0, 8, 2162684, 0, 8, 2097148, 0, 8, 2031612, 0, 8, 1966076, 0, 8, 1900540, 0, 8, 1835004, 0, 8, 1769468, 0, 8, 1703932, 0, 8, 1638396, 0, 8, 1572860, 0, 8, 1507324, 0, 8, 1441788, 0, 8, 1376252, 0, 8, 1310716, 0, 8, 1245180, 0, 8, 1179644, 0, 8, 1114108, 0, 8, 3735547, 0, 8, 3670011, 0, 8, 3604475, 0, 8, 3538939, 0, 8, 3473403, 0, 8, 3407867, 0, 8, 3342331, 0, 8, 3276795, 0, 8, 3211259, 0, 8, 3145723, 0, 8, 3080187, 0, 8, 3014651, 0, 8, 2949115, 0, 8, 2883579, 0, 8, 2818043, 0, 8, 2752507, 0, 8, 2686971, 0, 8, 2621435, 0, 8, 2555899, 0, 8, 2490363, 0, 8, 2424827, 0, 8, 2359291, 0, 8, 2293755, 0, 8, 2228219, 0, 8, 2162683, 0, 8, 2097147, 0, 8, 2031611, 0, 8, 1966075, 0, 8, 1900539, 0, 8, 1835003, 0, 8, 1769467, 0, 8, 1703931, 0, 8, 1638395, 0, 8, 1572859, 0, 8, 1507323, 0, 8, 1441787, 0, 8, 1376251, 0, 8, 1310715, 0, 8, 1245179, 0, 8, 1179643, 0, 8, 1114107, 0, 8, 3735546, 0, 8, 3670010, 0, 8, 3604474, 0, 8, 3538938, 0, 8, 3473402, 0, 8, 3407866, 0, 8, 3342330, 0, 8, 3276794, 0, 8, 3211258, 0, 8, 3145722, 0, 8, 3080186, 0, 8, 3014650, 0, 8, 2949114, 0, 8, 2883578, 0, 8, 2818042, 0, 8, 2752506, 0, 8, 2686970, 0, 8, 2621434, 0, 8, 2555898, 0, 8, 2490362, 0, 8, 2424826, 0, 8, 2359290, 0, 8, 2293754, 0, 8, 2228218, 0, 8, 2162682, 0, 8, 2097146, 0, 8, 2031610, 0, 8, 1966074, 0, 8, 1900538, 0, 8, 1835002, 0, 8, 1769466, 0, 8, 1703930, 0, 8, 1638394, 0, 8, 1572858, 0, 8, 1507322, 0, 8, 1441786, 0, 8, 1376250, 0, 8, 1310714, 0, 8, 1245178, 0, 8, 1179642, 0, 8, 1114106, 0, 8, 3735545, 0, 8, 3670009, 0, 8, 3604473, 0, 8, 3538937, 0, 8, 3473401, 0, 8, 3407865, 0, 8, 3342329, 0, 8, 3276793, 0, 8, 3211257, 0, 8, 3145721, 0, 8, 3080185, 0, 8, 3014649, 0, 8, 2949113, 0, 8, 2883577, 0, 8, 2818041, 0, 8, 2752505, 0, 8, 2686969, 0, 8, 2621433, 0, 8, 2555897, 0, 8, 2490361, 0, 8, 2424825, 0, 8, 2359289, 0, 8, 2293753, 0, 8, 2228217, 0, 8, 2162681, 0, 8, 2097145, 0, 8, 2031609, 0, 8, 1966073, 0, 8, 1900537, 0, 8, 1835001, 0, 8, 1769465, 0, 8, 1703929, 0, 8, 1638393, 0, 8, 1572857, 0, 8, 1507321, 0, 8, 1441785, 0, 8, 1376249, 0, 8, 1310713, 0, 8, 1245177, 0, 8, 1179641, 0, 8, 1114105, 0, 8, 1048569, 0, 8, 983033, 0, 8, 917497, 0, 8, 851961, 0, 8, 786425, 0, 8, 3735544, 0, 8, 3670008, 0, 8, 3604472, 0, 8, 3538936, 0, 8, 3473400, 0, 8, 3407864, 0, 8, 3342328, 0, 8, 3276792, 0, 8, 3211256, 0, 8, 3145720, 0, 8, 3080184, 0, 8, 3014648, 0, 8, 2949112, 0, 8, 2883576, 0, 8, 2818040, 0, 8, 2752504, 0, 8, 2686968, 0, 8, 2621432, 0, 8, 2555896, 0, 8, 2490360, 0, 8, 2424824, 0, 8, 2359288, 0, 8, 2293752, 0, 8, 2228216, 0, 8, 2162680, 0, 8, 2097144, 0, 8, 2031608, 0, 8, 1966072, 0, 8, 1900536, 0, 8, 1835000, 0, 8, 1769464, 0, 8, 1703928, 0, 8, 1638392, 0, 8, 1572856, 0, 8, 1507320, 0, 8, 1441784, 0, 8, 1376248, 0, 8, 1310712, 0, 8, 1245176, 0, 8, 1179640, 0, 8, 1114104, 0, 8, 1048568, 0, 8, 983032, 0, 8, 917496, 0, 8, 851960, 0, 8, 786424, 0, 8, 851959, 196608, 3, 720887, 196608, 4, 720889, 131072, 7, 917495, 196608, 3, 786423, 196608, 3, 983031, 196608, 3, 1048567, 196608, 3, 1114103, 196608, 3, 1179639, 196608, 3, 1245175, 196608, 3, 1310711, 196608, 3, 1376247, 196608, 3, 1441783, 196608, 3, 1507319, 196608, 3, 1572855, 196608, 3, 1638391, 196608, 3, 1703927, 196608, 3, 1769463, 196608, 3, 1834999, 196608, 3, 1900535, 196608, 3, 1966071, 196608, 3, 2031607, 196608, 3, 2097143, 196608, 3, 2162679, 196608, 3, 2228215, 196608, 3, 2293751, 196608, 3, 2359287, 196608, 3, 2424823, 196608, 3, 2490359, 196608, 3, 2555895, 196608, 3, 2621431, 196608, 3, 2686967, 196608, 3, 2752503, 196608, 3, 2818039, 196608, 3, 2883575, 196608, 3, 2949111, 196608, 3, 3014647, 196608, 3, 3080183, 196608, 3, 3145719, 196608, 3, 3211255, 196608, 3, 3276791, 196608, 3, 3342327, 196608, 3, 3407863, 196608, 3, 3473399, 196608, 3, 3538935, 196608, 3, 3604471, 196608, 3, 3670007, 196608, 3, 3735543, 196608, 3, 3801081, 131072, 2, 3801079, 720896, 2, 720888, 131072, 7, 3801082, 131072, 2, 3801080, 131072, 2, 3801083, 131072, 2, 3801084, 131072, 2, 3801085, 131072, 2, 3801086, 131072, 2, 3801087, 131072, 2, 3735552, 131072, 2, 3735553, 131072, 2, 3735554, 131072, 2, 3735555, 131072, 2, 3735556, 131072, 2, 3735557, 131072, 2, 3735558, 131072, 2, 3735559, 131072, 2, 3735560, 131072, 2, 3735561, 131072, 2, 3735562, 131072, 2, 3735563, 131072, 2, 3735564, 196608, 2, 3735565, 0, 8, 3735566, 0, 8, 3735567, 0, 8, 3735568, 0, 8, 3735569, 0, 8, 1048594, 65536, 3, 1114130, 65536, 3, 1179666, 65536, 3, 1245202, 65536, 3, 1310738, 65536, 3, 1376274, 65536, 3, 1441810, 65536, 3, 1507346, 65536, 3, 1572882, 65536, 3, 1638418, 65536, 3, 1703954, 65536, 3, 1769490, 65536, 3, 1835026, 65536, 3, 1900562, 65536, 3, 1966098, 65536, 3, 2031634, 65536, 3, 2097170, 65536, 3, 2162706, 65536, 3, 2228242, 65536, 3, 2293778, 65536, 3, 2359314, 65536, 3, 2424850, 65536, 3, 2490386, 65536, 7, 2555922, 0, 8, 2621458, 0, 8, 2686994, 0, 8, 2752530, 0, 8, 2818066, 0, 8, 2883602, 0, 8, 2949138, 0, 8, 3014674, 0, 8, 3080210, 0, 8, 3145746, 0, 8, 3211282, 0, 8, 3276818, 0, 8, 3342354, 0, 8, 3407890, 0, 8, 3473426, 0, 8, 3538962, 0, 8, 3604498, 0, 8, 3670034, 0, 8, 3735570, 0, 8, 5046336, 0, 8, 4980800, 0, 8, 4915264, 0, 8, 4849728, 0, 8, 4784192, 0, 8, 4718656, 0, 8, 4653120, 0, 8, 4587584, 0, 8, 4522048, 0, 8, 4456512, 0, 8, 4390976, 0, 8, 4325440, 0, 8, 4259904, 0, 8, 4194368, 0, 8, 4128832, 0, 8, 4063296, 0, 8, 3997760, 0, 8, 3932224, 0, 8, 3866688, 0, 8, 3801152, 0, 8, 3735616, 0, 8, 3670080, 0, 8, 3604544, 0, 8, 3539008, 0, 8, 3473472, 0, 8, 3407936, 0, 8, 3342400, 0, 8, 3276864, 0, 8, 3211328, 0, 8, 3145792, 0, 8, 3080256, 0, 8, 3014720, 0, 8, 2949184, 0, 8, 2883648, 0, 8, 2818112, 0, 8, 2752576, 0, 8, 2687040, 0, 8, 2621504, 0, 8, 2555968, 0, 8, 5046335, 0, 8, 4980799, 0, 8, 4915263, 0, 8, 4849727, 0, 8, 4784191, 0, 8, 4718655, 0, 8, 4653119, 0, 8, 4587583, 0, 8, 4522047, 0, 8, 4456511, 0, 8, 4390975, 0, 8, 4325439, 0, 8, 4259903, 0, 8, 4194367, 0, 8, 4128831, 0, 8, 4063295, 0, 8, 3997759, 0, 8, 3932223, 0, 8, 3866687, 0, 8, 3801151, 0, 8, 3735615, 0, 8, 3670079, 0, 8, 3604543, 0, 8, 3539007, 0, 8, 3473471, 0, 8, 3407935, 0, 8, 3342399, 0, 8, 3276863, 0, 8, 3211327, 0, 8, 3145791, 0, 8, 3080255, 0, 8, 3014719, 0, 8, 2949183, 0, 8, 2883647, 0, 8, 2818111, 0, 8, 2752575, 0, 8, 2687039, 0, 8, 2621503, 0, 8, 2555967, 0, 8, 5046334, 0, 8, 4980798, 0, 8, 4915262, 0, 8, 4849726, 0, 8, 4784190, 0, 8, 4718654, 0, 8, 4653118, 0, 8, 4587582, 0, 8, 4522046, 0, 8, 4456510, 0, 8, 4390974, 0, 8, 4325438, 0, 8, 4259902, 0, 8, 4194366, 0, 8, 4128830, 0, 8, 4063294, 0, 8, 3997758, 0, 8, 3932222, 0, 8, 3866686, 0, 8, 3801150, 0, 8, 3735614, 0, 8, 3670078, 0, 8, 3604542, 0, 8, 3539006, 0, 8, 3473470, 0, 8, 3407934, 0, 8, 3342398, 0, 8, 3276862, 0, 8, 3211326, 0, 8, 3145790, 0, 8, 3080254, 0, 8, 3014718, 0, 8, 2949182, 0, 8, 2883646, 0, 8, 2818110, 0, 8, 2752574, 0, 8, 2687038, 0, 8, 2621502, 0, 8, 2555966, 0, 8, 5046333, 0, 8, 4980797, 0, 8, 4915261, 0, 8, 4849725, 0, 8, 4784189, 0, 8, 4718653, 0, 8, 4653117, 0, 8, 4587581, 0, 8, 4522045, 0, 8, 4456509, 0, 8, 4390973, 0, 8, 4325437, 0, 8, 4259901, 0, 8, 4194365, 0, 8, 4128829, 0, 8, 4063293, 0, 8, 3997757, 0, 8, 3932221, 0, 8, 3866685, 0, 8, 3801149, 0, 8, 3735613, 0, 8, 3670077, 0, 8, 3604541, 0, 8, 3539005, 0, 8, 3473469, 0, 8, 3407933, 0, 8, 3342397, 0, 8, 3276861, 0, 8, 3211325, 0, 8, 3145789, 0, 8, 3080253, 0, 8, 3014717, 0, 8, 2949181, 0, 8, 2883645, 0, 8, 2818109, 0, 8, 2752573, 0, 8, 2687037, 0, 8, 2621501, 0, 8, 2555965, 0, 8, 5046332, 0, 8, 4980796, 0, 8, 4915260, 0, 8, 4849724, 0, 8, 4784188, 0, 8, 4718652, 0, 8, 4653116, 0, 8, 4587580, 0, 8, 4522044, 0, 8, 4456508, 0, 8, 4390972, 0, 8, 4325436, 0, 8, 4259900, 0, 8, 4194364, 0, 8, 4128828, 0, 8, 4063292, 0, 8, 3997756, 0, 8, 3932220, 0, 8, 3866684, 0, 8, 3801148, 0, 8, 3735612, 0, 8, 3670076, 0, 8, 3604540, 0, 8, 3539004, 0, 8, 3473468, 0, 8, 3407932, 0, 8, 3342396, 0, 8, 3276860, 0, 8, 3211324, 0, 8, 3145788, 0, 8, 3080252, 0, 8, 3014716, 0, 8, 2949180, 0, 8, 2883644, 0, 8, 2818108, 0, 8, 2752572, 0, 8, 2687036, 0, 8, 2621500, 0, 8, 2555964, 0, 8, 5046331, 0, 8, 4980795, 0, 8, 4915259, 0, 8, 4849723, 0, 8, 4784187, 0, 8, 4718651, 0, 8, 4653115, 0, 8, 4587579, 0, 8, 4522043, 0, 8, 4456507, 0, 8, 4390971, 0, 8, 4325435, 0, 8, 4259899, 0, 8, 4194363, 0, 8, 4128827, 0, 8, 4063291, 0, 8, 3997755, 0, 8, 3932219, 0, 8, 3866683, 0, 8, 3801147, 0, 8, 3735611, 0, 8, 3670075, 0, 8, 3604539, 0, 8, 3539003, 0, 8, 3473467, 0, 8, 3407931, 0, 8, 3342395, 0, 8, 3276859, 0, 8, 3211323, 0, 8, 3145787, 0, 8, 3080251, 0, 8, 3014715, 0, 8, 2949179, 0, 8, 2883643, 0, 8, 2818107, 0, 8, 2752571, 0, 8, 2687035, 0, 8, 2621499, 0, 8, 2555963, 0, 8, 5046330, 0, 8, 4980794, 0, 8, 4915258, 0, 8, 4849722, 0, 8, 4784186, 0, 8, 4718650, 0, 8, 4653114, 0, 8, 4587578, 0, 8, 4522042, 0, 8, 4456506, 0, 8, 4390970, 0, 8, 4325434, 0, 8, 4259898, 0, 8, 4194362, 0, 8, 4128826, 0, 8, 4063290, 0, 8, 3997754, 0, 8, 3932218, 0, 8, 3866682, 0, 8, 3801146, 0, 8, 3735610, 0, 8, 3670074, 0, 8, 3604538, 0, 8, 3539002, 0, 8, 3473466, 0, 8, 3407930, 0, 8, 3342394, 0, 8, 3276858, 0, 8, 3211322, 0, 8, 3145786, 0, 8, 3080250, 0, 8, 3014714, 0, 8, 2949178, 0, 8, 2883642, 0, 8, 2818106, 0, 8, 2752570, 0, 8, 2687034, 0, 8, 2621498, 0, 8, 2555962, 0, 8, 5046329, 0, 8, 4980793, 0, 8, 4915257, 0, 8, 4849721, 0, 8, 4784185, 0, 8, 4718649, 0, 8, 4653113, 0, 8, 4587577, 0, 8, 4522041, 0, 8, 4456505, 0, 8, 4390969, 0, 8, 4325433, 0, 8, 4259897, 0, 8, 4194361, 0, 8, 4128825, 0, 8, 4063289, 0, 8, 3997753, 0, 8, 3932217, 0, 8, 3866681, 0, 8, 3801145, 0, 8, 3735609, 0, 8, 3670073, 0, 8, 3604537, 0, 8, 3539001, 0, 8, 3473465, 0, 8, 3407929, 0, 8, 3342393, 0, 8, 3276857, 0, 8, 3211321, 0, 8, 3145785, 0, 8, 3080249, 0, 8, 3014713, 0, 8, 2949177, 0, 8, 2883641, 0, 8, 2818105, 0, 8, 2752569, 0, 8, 2687033, 0, 8, 2621497, 0, 8, 2555961, 0, 8, 5046328, 0, 8, 4980792, 0, 8, 4915256, 0, 8, 4849720, 0, 8, 4784184, 0, 8, 4718648, 0, 8, 4653112, 0, 8, 4587576, 0, 8, 4522040, 0, 8, 4456504, 0, 8, 4390968, 0, 8, 4325432, 0, 8, 4259896, 0, 8, 4194360, 0, 8, 4128824, 0, 8, 4063288, 0, 8, 3997752, 0, 8, 3932216, 0, 8, 3866680, 0, 8, 3801144, 0, 8, 3735608, 0, 8, 3670072, 0, 8, 3604536, 0, 8, 3539000, 0, 8, 3473464, 0, 8, 3407928, 0, 8, 3342392, 0, 8, 3276856, 0, 8, 3211320, 0, 8, 3145784, 0, 8, 3080248, 0, 8, 3014712, 0, 8, 2949176, 0, 8, 2883640, 0, 8, 2818104, 0, 8, 2752568, 0, 8, 2687032, 0, 8, 2621496, 0, 8, 2555960, 0, 8, 5046327, 0, 8, 4980791, 0, 8, 4915255, 0, 8, 4849719, 0, 8, 4784183, 0, 8, 4718647, 0, 8, 4653111, 0, 8, 4587575, 0, 8, 4522039, 0, 8, 4456503, 0, 8, 4390967, 0, 8, 4325431, 0, 8, 4259895, 0, 8, 4194359, 0, 8, 4128823, 0, 8, 4063287, 0, 8, 3997751, 0, 8, 3932215, 0, 8, 3866679, 0, 8, 3801143, 0, 8, 3735607, 0, 8, 3670071, 0, 8, 3604535, 0, 8, 3538999, 0, 8, 3473463, 0, 8, 3407927, 0, 8, 3342391, 0, 8, 3276855, 0, 8, 3211319, 0, 8, 3145783, 0, 8, 3080247, 0, 8, 3014711, 0, 8, 2949175, 0, 8, 2883639, 0, 8, 2818103, 0, 8, 2752567, 0, 8, 2687031, 0, 8, 2621495, 0, 8, 2555959, 0, 8, 5046326, 0, 8, 4980790, 0, 8, 4915254, 0, 8, 4849718, 0, 8, 4784182, 0, 8, 4718646, 0, 8, 4653110, 0, 8, 4587574, 0, 8, 4522038, 0, 8, 4456502, 0, 8, 4390966, 0, 8, 4325430, 0, 8, 4259894, 0, 8, 4194358, 0, 8, 4128822, 0, 8, 4063286, 0, 8, 3997750, 0, 8, 3932214, 0, 8, 3866678, 0, 8, 3801142, 0, 8, 3735606, 0, 8, 3670070, 0, 8, 3604534, 0, 8, 3538998, 0, 8, 3473462, 0, 8, 3407926, 0, 8, 3342390, 0, 8, 3276854, 0, 8, 3211318, 0, 8, 3145782, 0, 8, 3080246, 0, 8, 3014710, 0, 8, 2949174, 0, 8, 2883638, 0, 8, 2818102, 0, 8, 2752566, 0, 8, 2687030, 0, 8, 2621494, 0, 8, 2555958, 0, 8, 5046325, 0, 8, 4980789, 0, 8, 4915253, 0, 8, 4849717, 0, 8, 4784181, 0, 8, 4718645, 0, 8, 4653109, 0, 8, 4587573, 0, 8, 4522037, 0, 8, 4456501, 0, 8, 4390965, 0, 8, 4325429, 0, 8, 4259893, 0, 8, 4194357, 0, 8, 4128821, 0, 8, 4063285, 0, 8, 3997749, 0, 8, 3932213, 0, 8, 3866677, 0, 8, 3801141, 0, 8, 3735605, 0, 8, 3670069, 0, 8, 3604533, 0, 8, 3538997, 0, 8, 3473461, 0, 8, 3407925, 0, 8, 3342389, 0, 8, 3276853, 0, 8, 3211317, 0, 8, 3145781, 0, 8, 3080245, 0, 8, 3014709, 0, 8, 2949173, 0, 8, 2883637, 0, 8, 2818101, 0, 8, 2752565, 0, 8, 2687029, 0, 8, 2621493, 0, 8, 2555957, 0, 8, 5046324, 0, 8, 4980788, 0, 8, 4915252, 0, 8, 4849716, 0, 8, 4784180, 0, 8, 4718644, 0, 8, 4653108, 0, 8, 4587572, 0, 8, 4522036, 0, 8, 4456500, 0, 8, 4390964, 0, 8, 4325428, 0, 8, 4259892, 0, 8, 4194356, 0, 8, 4128820, 0, 8, 4063284, 0, 8, 3997748, 0, 8, 3932212, 0, 8, 3866676, 0, 8, 3801140, 0, 8, 3735604, 0, 8, 3670068, 0, 8, 3604532, 0, 8, 3538996, 0, 8, 3473460, 0, 8, 3407924, 0, 8, 3342388, 0, 8, 3276852, 0, 8, 3211316, 0, 8, 3145780, 0, 8, 3080244, 0, 8, 3014708, 0, 8, 2949172, 0, 8, 2883636, 0, 8, 2818100, 0, 8, 2752564, 0, 8, 2687028, 0, 8, 2621492, 0, 8, 2555956, 0, 8, 5046323, 0, 8, 4980787, 0, 8, 4915251, 0, 8, 4849715, 0, 8, 4784179, 0, 8, 4718643, 0, 8, 4653107, 0, 8, 4587571, 0, 8, 4522035, 0, 8, 4456499, 0, 8, 4390963, 0, 8, 4325427, 0, 8, 4259891, 0, 8, 4194355, 0, 8, 4128819, 0, 8, 4063283, 0, 8, 3997747, 0, 8, 3932211, 0, 8, 3866675, 0, 8, 3801139, 0, 8, 3735603, 0, 8, 3670067, 0, 8, 3604531, 0, 8, 3538995, 0, 8, 3473459, 0, 8, 3407923, 0, 8, 3342387, 0, 8, 3276851, 0, 8, 3211315, 0, 8, 3145779, 0, 8, 3080243, 0, 8, 3014707, 0, 8, 2949171, 0, 8, 2883635, 0, 8, 2818099, 0, 8, 2752563, 0, 8, 2687027, 0, 8, 2621491, 0, 8, 2555955, 0, 8, 5046322, 0, 8, 4980786, 0, 8, 4915250, 0, 8, 4849714, 0, 8, 4784178, 0, 8, 4718642, 0, 8, 4653106, 0, 8, 4587570, 0, 8, 4522034, 0, 8, 4456498, 0, 8, 4390962, 0, 8, 4325426, 0, 8, 4259890, 0, 8, 4194354, 0, 8, 4128818, 0, 8, 4063282, 0, 8, 3997746, 0, 8, 3932210, 0, 8, 3866674, 0, 8, 3801138, 0, 8, 3735602, 0, 8, 3670066, 0, 8, 3604530, 0, 8, 3538994, 0, 8, 3473458, 0, 8, 3407922, 0, 8, 3342386, 0, 8, 3276850, 0, 8, 3211314, 0, 8, 3145778, 0, 8, 3080242, 0, 8, 3014706, 0, 8, 2949170, 0, 8, 2883634, 0, 8, 2818098, 0, 8, 2752562, 0, 8, 2687026, 0, 8, 2621490, 0, 8, 2555954, 0, 8, 5046321, 0, 8, 4980785, 0, 8, 4915249, 0, 8, 4849713, 0, 8, 4784177, 0, 8, 4718641, 0, 8, 4653105, 0, 8, 4587569, 0, 8, 4522033, 0, 8, 4456497, 0, 8, 4390961, 0, 8, 4325425, 0, 8, 4259889, 0, 8, 4194353, 0, 8, 4128817, 0, 8, 4063281, 0, 8, 3997745, 0, 8, 3932209, 0, 8, 3866673, 0, 8, 3801137, 0, 8, 3735601, 0, 8, 3670065, 0, 8, 3604529, 0, 8, 3538993, 0, 8, 3473457, 0, 8, 3407921, 0, 8, 3342385, 0, 8, 3276849, 0, 8, 3211313, 0, 8, 3145777, 0, 8, 3080241, 0, 8, 3014705, 0, 8, 2949169, 0, 8, 2883633, 0, 8, 2818097, 0, 8, 2752561, 0, 8, 2687025, 0, 8, 2621489, 0, 8, 2555953, 0, 8, 5046320, 0, 8, 4980784, 0, 8, 4915248, 0, 8, 4849712, 0, 8, 4784176, 0, 8, 4718640, 0, 8, 4653104, 0, 8, 4587568, 0, 8, 4522032, 0, 8, 4456496, 0, 8, 4390960, 0, 8, 4325424, 0, 8, 4259888, 0, 8, 4194352, 0, 8, 4128816, 0, 8, 4063280, 0, 8, 3997744, 0, 8, 3932208, 0, 8, 3866672, 0, 8, 3801136, 0, 8, 3735600, 0, 8, 3670064, 0, 8, 3604528, 0, 8, 3538992, 0, 8, 3473456, 0, 8, 3407920, 0, 8, 3342384, 0, 8, 3276848, 0, 8, 3211312, 0, 8, 3145776, 0, 8, 3080240, 0, 8, 3014704, 0, 8, 2949168, 0, 8, 2883632, 0, 8, 2818096, 0, 8, 2752560, 0, 8, 2687024, 0, 8, 2621488, 0, 8, 2555952, 0, 8, 5046319, 0, 8, 4980783, 0, 8, 4915247, 0, 8, 4849711, 0, 8, 4784175, 0, 8, 4718639, 0, 8, 4653103, 0, 8, 4587567, 0, 8, 4522031, 0, 8, 4456495, 0, 8, 4390959, 0, 8, 4325423, 0, 8, 4259887, 0, 8, 4194351, 0, 8, 4128815, 0, 8, 4063279, 0, 8, 3997743, 0, 8, 3932207, 0, 8, 3866671, 0, 8, 3801135, 0, 8, 3735599, 0, 8, 3670063, 0, 8, 3604527, 0, 8, 3538991, 0, 8, 3473455, 0, 8, 3407919, 0, 8, 3342383, 0, 8, 3276847, 0, 8, 3211311, 0, 8, 3145775, 0, 8, 3080239, 0, 8, 3014703, 0, 8, 2949167, 0, 8, 2883631, 0, 8, 2818095, 0, 8, 2752559, 0, 8, 2687023, 0, 8, 2621487, 0, 8, 2555951, 0, 8, 5046318, 0, 8, 4980782, 0, 8, 4915246, 0, 8, 4849710, 0, 8, 4784174, 0, 8, 4718638, 0, 8, 4653102, 0, 8, 4587566, 0, 8, 4522030, 0, 8, 4456494, 0, 8, 4390958, 0, 8, 4325422, 0, 8, 4259886, 0, 8, 4194350, 0, 8, 4128814, 0, 8, 4063278, 0, 8, 3997742, 0, 8, 3932206, 0, 8, 3866670, 0, 8, 3801134, 0, 8, 3735598, 0, 8, 3670062, 0, 8, 3604526, 0, 8, 3538990, 0, 8, 3473454, 0, 8, 3407918, 0, 8, 3342382, 0, 8, 3276846, 0, 8, 3211310, 0, 8, 3145774, 0, 8, 3080238, 0, 8, 3014702, 0, 8, 2949166, 0, 8, 2883630, 0, 8, 2818094, 0, 8, 2752558, 0, 8, 2687022, 0, 8, 2621486, 0, 8, 2555950, 0, 8, 5046317, 0, 8, 4980781, 0, 8, 4915245, 0, 8, 4849709, 0, 8, 4784173, 0, 8, 4718637, 0, 8, 4653101, 0, 8, 4587565, 0, 8, 4522029, 0, 8, 4456493, 0, 8, 4390957, 0, 8, 4325421, 0, 8, 4259885, 0, 8, 4194349, 0, 8, 4128813, 0, 8, 4063277, 0, 8, 3997741, 0, 8, 3932205, 0, 8, 3866669, 0, 8, 3801133, 0, 8, 3735597, 0, 8, 3670061, 0, 8, 3604525, 0, 8, 3538989, 0, 8, 3473453, 0, 8, 3407917, 0, 8, 3342381, 0, 8, 3276845, 0, 8, 3211309, 0, 8, 3145773, 0, 8, 3080237, 0, 8, 3014701, 0, 8, 2949165, 0, 8, 2883629, 0, 8, 2818093, 0, 8, 2752557, 0, 8, 2687021, 0, 8, 2621485, 0, 8, 2555949, 0, 8, 5046316, 0, 8, 4980780, 0, 8, 4915244, 0, 8, 4849708, 0, 8, 4784172, 0, 8, 4718636, 0, 8, 4653100, 0, 8, 4587564, 0, 8, 4522028, 0, 8, 4456492, 0, 8, 4390956, 0, 8, 4325420, 0, 8, 4259884, 0, 8, 4194348, 0, 8, 4128812, 0, 8, 4063276, 0, 8, 3997740, 0, 8, 3932204, 0, 8, 3866668, 0, 8, 3801132, 0, 8, 3735596, 0, 8, 3670060, 0, 8, 3604524, 0, 8, 3538988, 0, 8, 3473452, 0, 8, 3407916, 0, 8, 3342380, 0, 8, 3276844, 0, 8, 3211308, 0, 8, 3145772, 0, 8, 3080236, 0, 8, 3014700, 0, 8, 2949164, 0, 8, 2883628, 0, 8, 2818092, 0, 8, 2752556, 0, 8, 2687020, 0, 8, 2621484, 0, 8, 2555948, 0, 8, 5046315, 0, 8, 4980779, 0, 8, 4915243, 0, 8, 4849707, 0, 8, 4784171, 0, 8, 4718635, 0, 8, 4653099, 0, 8, 4587563, 0, 8, 4522027, 0, 8, 4456491, 0, 8, 4390955, 0, 8, 4325419, 0, 8, 4259883, 0, 8, 4194347, 0, 8, 4128811, 0, 8, 4063275, 0, 8, 3997739, 0, 8, 3932203, 0, 8, 3866667, 0, 8, 3801131, 0, 8, 3735595, 0, 8, 3670059, 0, 8, 3604523, 0, 8, 3538987, 0, 8, 3473451, 0, 8, 3407915, 0, 8, 3342379, 0, 8, 3276843, 0, 8, 3211307, 0, 8, 3145771, 0, 8, 3080235, 0, 8, 3014699, 0, 8, 2949163, 0, 8, 2883627, 0, 8, 2818091, 0, 8, 2752555, 0, 8, 2687019, 0, 8, 2621483, 0, 8, 2555947, 0, 8, 5046314, 0, 8, 4980778, 0, 8, 4915242, 0, 8, 4849706, 0, 8, 4784170, 0, 8, 4718634, 0, 8, 4653098, 0, 8, 4587562, 0, 8, 4522026, 0, 8, 4456490, 0, 8, 4390954, 0, 8, 4325418, 0, 8, 4259882, 0, 8, 4194346, 0, 8, 4128810, 0, 8, 4063274, 0, 8, 3997738, 0, 8, 3932202, 0, 8, 3866666, 0, 8, 3801130, 0, 8, 3735594, 0, 8, 3670058, 0, 8, 3604522, 0, 8, 3538986, 0, 8, 3473450, 0, 8, 3407914, 0, 8, 3342378, 0, 8, 3276842, 0, 8, 3211306, 0, 8, 3145770, 0, 8, 3080234, 0, 8, 3014698, 0, 8, 2949162, 0, 8, 2883626, 0, 8, 2818090, 0, 8, 2752554, 0, 8, 2687018, 0, 8, 2621482, 0, 8, 2555946, 0, 8, 5046313, 0, 8, 4980777, 0, 8, 4915241, 0, 8, 4849705, 0, 8, 4784169, 0, 8, 4718633, 0, 8, 4653097, 0, 8, 4587561, 0, 8, 4522025, 0, 8, 4456489, 0, 8, 4390953, 0, 8, 4325417, 0, 8, 4259881, 0, 8, 4194345, 0, 8, 4128809, 0, 8, 4063273, 0, 8, 3997737, 0, 8, 3932201, 0, 8, 3866665, 0, 8, 3801129, 0, 8, 3735593, 0, 8, 3670057, 0, 8, 3604521, 0, 8, 3538985, 0, 8, 3473449, 0, 8, 3407913, 0, 8, 3342377, 0, 8, 3276841, 0, 8, 3211305, 0, 8, 3145769, 0, 8, 3080233, 0, 8, 3014697, 0, 8, 2949161, 0, 8, 2883625, 0, 8, 2818089, 0, 8, 2752553, 0, 8, 2687017, 0, 8, 2621481, 0, 8, 2555945, 0, 8, 5046312, 0, 8, 4980776, 0, 8, 4915240, 0, 8, 4849704, 0, 8, 4784168, 0, 8, 4718632, 0, 8, 4653096, 0, 8, 4587560, 0, 8, 4522024, 0, 8, 4456488, 0, 8, 4390952, 0, 8, 4325416, 0, 8, 4259880, 0, 8, 4194344, 0, 8, 4128808, 0, 8, 4063272, 0, 8, 3997736, 0, 8, 3932200, 0, 8, 3866664, 0, 8, 3801128, 0, 8, 3735592, 0, 8, 3670056, 0, 8, 3604520, 0, 8, 3538984, 0, 8, 3473448, 0, 8, 3407912, 0, 8, 3342376, 0, 8, 3276840, 0, 8, 3211304, 0, 8, 3145768, 0, 8, 3080232, 0, 8, 3014696, 0, 8, 2949160, 0, 8, 2883624, 0, 8, 2818088, 0, 8, 2752552, 0, 8, 2687016, 0, 8, 2621480, 0, 8, 2555944, 0, 8, 5046311, 0, 8, 4980775, 0, 8, 4915239, 0, 8, 4849703, 0, 8, 4784167, 0, 8, 4718631, 0, 8, 4653095, 0, 8, 4587559, 0, 8, 4522023, 0, 8, 4456487, 0, 8, 4390951, 0, 8, 4325415, 0, 8, 4259879, 0, 8, 4194343, 0, 8, 4128807, 0, 8, 4063271, 0, 8, 3997735, 0, 8, 3932199, 0, 8, 3866663, 0, 8, 3801127, 0, 8, 3735591, 0, 8, 3670055, 0, 8, 3604519, 0, 8, 3538983, 0, 8, 3473447, 0, 8, 3407911, 0, 8, 3342375, 0, 8, 3276839, 0, 8, 3211303, 0, 8, 3145767, 0, 8, 3080231, 0, 8, 3014695, 0, 8, 2949159, 0, 8, 2883623, 0, 8, 2818087, 0, 8, 2752551, 0, 8, 2687015, 0, 8, 2621479, 0, 8, 2555943, 0, 8, 5046310, 0, 8, 4980774, 0, 8, 4915238, 0, 8, 4849702, 0, 8, 4784166, 0, 8, 4718630, 0, 8, 4653094, 0, 8, 4587558, 0, 8, 4522022, 0, 8, 4456486, 0, 8, 4390950, 0, 8, 4325414, 0, 8, 4259878, 0, 8, 4194342, 0, 8, 4128806, 0, 8, 4063270, 0, 8, 3997734, 0, 8, 3932198, 0, 8, 3866662, 0, 8, 3801126, 0, 8, 3735590, 0, 8, 3670054, 0, 8, 3604518, 0, 8, 3538982, 0, 8, 3473446, 0, 8, 3407910, 0, 8, 3342374, 0, 8, 3276838, 0, 8, 3211302, 0, 8, 3145766, 0, 8, 3080230, 0, 8, 3014694, 0, 8, 2949158, 0, 8, 2883622, 0, 8, 2818086, 0, 8, 2752550, 0, 8, 2687014, 0, 8, 2621478, 0, 8, 2555942, 0, 8, 5046309, 0, 8, 4980773, 0, 8, 4915237, 0, 8, 4849701, 0, 8, 4784165, 0, 8, 4718629, 0, 8, 4653093, 0, 8, 4587557, 0, 8, 4522021, 0, 8, 4456485, 0, 8, 4390949, 0, 8, 4325413, 0, 8, 4259877, 0, 8, 4194341, 0, 8, 4128805, 0, 8, 4063269, 0, 8, 3997733, 0, 8, 3932197, 0, 8, 3866661, 0, 8, 3801125, 0, 8, 3735589, 0, 8, 3670053, 0, 8, 3604517, 0, 8, 3538981, 0, 8, 3473445, 0, 8, 3407909, 0, 8, 3342373, 0, 8, 3276837, 0, 8, 3211301, 0, 8, 3145765, 0, 8, 3080229, 0, 8, 3014693, 0, 8, 2949157, 0, 8, 2883621, 0, 8, 2818085, 0, 8, 2752549, 0, 8, 2687013, 0, 8, 2621477, 0, 8, 2555941, 0, 8, 5046308, 0, 8, 4980772, 0, 8, 4915236, 0, 8, 4849700, 0, 8, 4784164, 0, 8, 4718628, 0, 8, 4653092, 0, 8, 4587556, 0, 8, 4522020, 0, 8, 4456484, 0, 8, 4390948, 0, 8, 4325412, 0, 8, 4259876, 0, 8, 4194340, 0, 8, 4128804, 0, 8, 4063268, 0, 8, 3997732, 0, 8, 3932196, 0, 8, 3866660, 0, 8, 3801124, 0, 8, 3735588, 0, 8, 3670052, 0, 8, 3604516, 0, 8, 3538980, 0, 8, 3473444, 0, 8, 3407908, 0, 8, 3342372, 0, 8, 3276836, 0, 8, 3211300, 0, 8, 3145764, 0, 8, 3080228, 0, 8, 3014692, 0, 8, 2949156, 0, 8, 2883620, 0, 8, 2818084, 0, 8, 2752548, 0, 8, 2687012, 0, 8, 2621476, 0, 8, 2555940, 0, 8, 5046307, 0, 8, 4980771, 0, 8, 4915235, 0, 8, 4849699, 0, 8, 4784163, 0, 8, 4718627, 0, 8, 4653091, 0, 8, 4587555, 0, 8, 4522019, 0, 8, 4456483, 0, 8, 4390947, 0, 8, 4325411, 0, 8, 4259875, 0, 8, 4194339, 0, 8, 4128803, 0, 8, 4063267, 0, 8, 3997731, 0, 8, 3932195, 0, 8, 3866659, 0, 8, 3801123, 0, 8, 3735587, 0, 8, 3670051, 0, 8, 3604515, 0, 8, 3538979, 0, 8, 3473443, 0, 8, 3407907, 0, 8, 3342371, 0, 8, 3276835, 0, 8, 3211299, 0, 8, 3145763, 0, 8, 3080227, 0, 8, 3014691, 0, 8, 2949155, 0, 8, 2883619, 0, 8, 2818083, 0, 8, 2752547, 0, 8, 2687011, 0, 8, 2621475, 0, 8, 2555939, 0, 8, 5046306, 0, 8, 4980770, 0, 8, 4915234, 0, 8, 4849698, 0, 8, 4784162, 0, 8, 4718626, 0, 8, 4653090, 0, 8, 4587554, 0, 8, 4522018, 0, 8, 4456482, 0, 8, 4390946, 0, 8, 4325410, 0, 8, 4259874, 0, 8, 4194338, 0, 8, 4128802, 0, 8, 4063266, 0, 8, 3997730, 0, 8, 3932194, 0, 8, 3866658, 0, 8, 3801122, 0, 8, 3735586, 0, 8, 3670050, 0, 8, 3604514, 0, 8, 3538978, 0, 8, 3473442, 0, 8, 3407906, 0, 8, 3342370, 0, 8, 3276834, 0, 8, 3211298, 0, 8, 3145762, 0, 8, 3080226, 0, 8, 3014690, 0, 8, 2949154, 0, 8, 2883618, 0, 8, 2818082, 0, 8, 2752546, 0, 8, 2687010, 0, 8, 2621474, 0, 8, 2555938, 0, 8, 5046305, 0, 8, 4980769, 0, 8, 4915233, 0, 8, 4849697, 0, 8, 4784161, 0, 8, 4718625, 0, 8, 4653089, 0, 8, 4587553, 0, 8, 4522017, 0, 8, 4456481, 0, 8, 4390945, 0, 8, 4325409, 0, 8, 4259873, 0, 8, 4194337, 0, 8, 4128801, 0, 8, 4063265, 0, 8, 3997729, 0, 8, 3932193, 0, 8, 3866657, 0, 8, 3801121, 0, 8, 3735585, 0, 8, 3670049, 0, 8, 3604513, 0, 8, 3538977, 0, 8, 3473441, 0, 8, 3407905, 0, 8, 3342369, 0, 8, 3276833, 0, 8, 3211297, 0, 8, 3145761, 0, 8, 3080225, 0, 8, 3014689, 0, 8, 2949153, 0, 8, 2883617, 0, 8, 2818081, 0, 8, 2752545, 0, 8, 2687009, 0, 8, 2621473, 0, 8, 2555937, 0, 8, 5046304, 0, 8, 4980768, 0, 8, 4915232, 0, 8, 4849696, 0, 8, 4784160, 0, 8, 4718624, 0, 8, 4653088, 0, 8, 4587552, 0, 8, 4522016, 0, 8, 4456480, 0, 8, 4390944, 0, 8, 4325408, 0, 8, 4259872, 0, 8, 4194336, 0, 8, 4128800, 0, 8, 4063264, 0, 8, 3997728, 0, 8, 3932192, 0, 8, 3866656, 0, 8, 3801120, 0, 8, 3735584, 0, 8, 3670048, 0, 8, 3604512, 0, 8, 3538976, 0, 8, 3473440, 0, 8, 3407904, 0, 8, 3342368, 0, 8, 3276832, 0, 8, 3211296, 0, 8, 3145760, 0, 8, 3080224, 0, 8, 3014688, 0, 8, 2949152, 0, 8, 2883616, 0, 8, 2818080, 0, 8, 2752544, 0, 8, 2687008, 0, 8, 2621472, 0, 8, 2555936, 0, 8, 5046303, 0, 8, 4980767, 0, 8, 4915231, 0, 8, 4849695, 0, 8, 4784159, 0, 8, 4718623, 0, 8, 4653087, 0, 8, 4587551, 0, 8, 4522015, 0, 8, 4456479, 0, 8, 4390943, 0, 8, 4325407, 0, 8, 4259871, 0, 8, 4194335, 0, 8, 4128799, 0, 8, 4063263, 0, 8, 3997727, 0, 8, 3932191, 0, 8, 3866655, 0, 8, 3801119, 0, 8, 3735583, 0, 8, 3670047, 0, 8, 3604511, 0, 8, 3538975, 0, 8, 3473439, 0, 8, 3407903, 0, 8, 3342367, 0, 8, 3276831, 0, 8, 3211295, 0, 8, 3145759, 0, 8, 3080223, 0, 8, 3014687, 0, 8, 2949151, 0, 8, 2883615, 0, 8, 2818079, 0, 8, 2752543, 0, 8, 2687007, 0, 8, 2621471, 0, 8, 2555935, 0, 8, 5046302, 0, 8, 4980766, 0, 8, 4915230, 0, 8, 4849694, 0, 8, 4784158, 0, 8, 4718622, 0, 8, 4653086, 0, 8, 4587550, 0, 8, 4522014, 0, 8, 4456478, 0, 8, 4390942, 0, 8, 4325406, 0, 8, 4259870, 0, 8, 4194334, 0, 8, 4128798, 0, 8, 4063262, 0, 8, 3997726, 0, 8, 3932190, 0, 8, 3866654, 0, 8, 3801118, 0, 8, 3735582, 0, 8, 3670046, 0, 8, 3604510, 0, 8, 3538974, 0, 8, 3473438, 0, 8, 3407902, 0, 8, 3342366, 0, 8, 3276830, 0, 8, 3211294, 0, 8, 3145758, 0, 8, 3080222, 0, 8, 3014686, 0, 8, 2949150, 0, 8, 2883614, 0, 8, 2818078, 0, 8, 2752542, 0, 8, 2687006, 0, 8, 2621470, 0, 8, 2555934, 0, 8, 5046301, 0, 8, 4980765, 0, 8, 4915229, 0, 8, 4849693, 0, 8, 4784157, 0, 8, 4718621, 0, 8, 4653085, 0, 8, 4587549, 0, 8, 4522013, 0, 8, 4456477, 0, 8, 4390941, 0, 8, 4325405, 0, 8, 4259869, 0, 8, 4194333, 0, 8, 4128797, 0, 8, 4063261, 0, 8, 3997725, 0, 8, 3932189, 0, 8, 3866653, 0, 8, 3801117, 0, 8, 3735581, 0, 8, 3670045, 0, 8, 3604509, 0, 8, 3538973, 0, 8, 3473437, 0, 8, 3407901, 0, 8, 3342365, 0, 8, 3276829, 0, 8, 3211293, 0, 8, 3145757, 0, 8, 3080221, 0, 8, 3014685, 0, 8, 2949149, 0, 8, 2883613, 0, 8, 2818077, 0, 8, 2752541, 0, 8, 2687005, 0, 8, 2621469, 0, 8, 2555933, 0, 8, 5046300, 0, 8, 4980764, 0, 8, 4915228, 0, 8, 4849692, 0, 8, 4784156, 0, 8, 4718620, 0, 8, 4653084, 0, 8, 4587548, 0, 8, 4522012, 0, 8, 4456476, 0, 8, 4390940, 0, 8, 4325404, 0, 8, 4259868, 0, 8, 4194332, 0, 8, 4128796, 0, 8, 4063260, 0, 8, 3997724, 0, 8, 3932188, 0, 8, 3866652, 0, 8, 3801116, 0, 8, 3735580, 0, 8, 3670044, 0, 8, 3604508, 0, 8, 3538972, 0, 8, 3473436, 0, 8, 3407900, 0, 8, 3342364, 0, 8, 3276828, 0, 8, 3211292, 0, 8, 3145756, 0, 8, 3080220, 0, 8, 3014684, 0, 8, 2949148, 0, 8, 2883612, 0, 8, 2818076, 0, 8, 2752540, 0, 8, 2687004, 0, 8, 2621468, 0, 8, 2555932, 0, 8, 5046299, 0, 8, 4980763, 0, 8, 4915227, 0, 8, 4849691, 0, 8, 4784155, 0, 8, 4718619, 0, 8, 4653083, 0, 8, 4587547, 0, 8, 4522011, 0, 8, 4456475, 0, 8, 4390939, 0, 8, 4325403, 0, 8, 4259867, 0, 8, 4194331, 0, 8, 4128795, 0, 8, 4063259, 0, 8, 3997723, 0, 8, 3932187, 0, 8, 3866651, 0, 8, 3801115, 0, 8, 3735579, 0, 8, 3670043, 0, 8, 3604507, 0, 8, 3538971, 0, 8, 3473435, 0, 8, 3407899, 0, 8, 3342363, 0, 8, 3276827, 0, 8, 3211291, 0, 8, 3145755, 0, 8, 3080219, 0, 8, 3014683, 0, 8, 2949147, 0, 8, 2883611, 0, 8, 2818075, 0, 8, 2752539, 0, 8, 2687003, 0, 8, 2621467, 0, 8, 2555931, 0, 8, 5046298, 0, 8, 4980762, 0, 8, 4915226, 0, 8, 4849690, 0, 8, 4784154, 0, 8, 4718618, 0, 8, 4653082, 0, 8, 4587546, 0, 8, 4522010, 0, 8, 4456474, 0, 8, 4390938, 0, 8, 4325402, 0, 8, 4259866, 0, 8, 4194330, 0, 8, 4128794, 0, 8, 4063258, 0, 8, 3997722, 0, 8, 3932186, 0, 8, 3866650, 0, 8, 3801114, 0, 8, 3735578, 0, 8, 3670042, 0, 8, 3604506, 0, 8, 3538970, 0, 8, 3473434, 0, 8, 3407898, 0, 8, 3342362, 0, 8, 3276826, 0, 8, 3211290, 0, 8, 3145754, 0, 8, 3080218, 0, 8, 3014682, 0, 8, 2949146, 0, 8, 2883610, 0, 8, 2818074, 0, 8, 2752538, 0, 8, 2687002, 0, 8, 2621466, 0, 8, 2555930, 0, 8, 5046297, 0, 8, 4980761, 0, 8, 4915225, 0, 8, 4849689, 0, 8, 4784153, 0, 8, 4718617, 0, 8, 4653081, 0, 8, 4587545, 0, 8, 4522009, 0, 8, 4456473, 0, 8, 4390937, 0, 8, 4325401, 0, 8, 4259865, 0, 8, 4194329, 0, 8, 4128793, 0, 8, 4063257, 0, 8, 3997721, 0, 8, 3932185, 0, 8, 3866649, 0, 8, 3801113, 0, 8, 3735577, 0, 8, 3670041, 0, 8, 3604505, 0, 8, 3538969, 0, 8, 3473433, 0, 8, 3407897, 0, 8, 3342361, 0, 8, 3276825, 0, 8, 3211289, 0, 8, 3145753, 0, 8, 3080217, 0, 8, 3014681, 0, 8, 2949145, 0, 8, 2883609, 0, 8, 2818073, 0, 8, 2752537, 0, 8, 2687001, 0, 8, 2621465, 0, 8, 2555929, 0, 8, 5046296, 0, 8, 4980760, 0, 8, 4915224, 0, 8, 4849688, 0, 8, 4784152, 0, 8, 4718616, 0, 8, 4653080, 0, 8, 4587544, 0, 8, 4522008, 0, 8, 4456472, 0, 8, 4390936, 0, 8, 4325400, 0, 8, 4259864, 0, 8, 4194328, 0, 8, 4128792, 0, 8, 4063256, 0, 8, 3997720, 0, 8, 3932184, 0, 8, 3866648, 0, 8, 3801112, 0, 8, 3735576, 0, 8, 3670040, 0, 8, 3604504, 0, 8, 3538968, 0, 8, 3473432, 0, 8, 3407896, 0, 8, 3342360, 0, 8, 3276824, 0, 8, 3211288, 0, 8, 3145752, 0, 8, 3080216, 0, 8, 3014680, 0, 8, 2949144, 0, 8, 2883608, 0, 8, 2818072, 0, 8, 2752536, 0, 8, 2687000, 0, 8, 2621464, 0, 8, 2555928, 0, 8, 5046295, 0, 8, 4980759, 0, 8, 4915223, 0, 8, 4849687, 0, 8, 4784151, 0, 8, 4718615, 0, 8, 4653079, 0, 8, 4587543, 0, 8, 4522007, 0, 8, 4456471, 0, 8, 4390935, 0, 8, 4325399, 0, 8, 4259863, 0, 8, 4194327, 0, 8, 4128791, 0, 8, 4063255, 0, 8, 3997719, 0, 8, 3932183, 0, 8, 3866647, 0, 8, 3801111, 0, 8, 3735575, 0, 8, 3670039, 0, 8, 3604503, 0, 8, 3538967, 0, 8, 3473431, 0, 8, 3407895, 0, 8, 3342359, 0, 8, 3276823, 0, 8, 3211287, 0, 8, 3145751, 0, 8, 3080215, 0, 8, 3014679, 0, 8, 2949143, 0, 8, 2883607, 0, 8, 2818071, 0, 8, 2752535, 0, 8, 2686999, 0, 8, 2621463, 0, 8, 2555927, 0, 8, 5046294, 0, 8, 4980758, 0, 8, 4915222, 0, 8, 4849686, 0, 8, 4784150, 0, 8, 4718614, 0, 8, 4653078, 0, 8, 4587542, 0, 8, 4522006, 0, 8, 4456470, 0, 8, 4390934, 0, 8, 4325398, 0, 8, 4259862, 0, 8, 4194326, 0, 8, 4128790, 0, 8, 4063254, 0, 8, 3997718, 0, 8, 3932182, 0, 8, 3866646, 0, 8, 3801110, 0, 8, 3735574, 0, 8, 3670038, 0, 8, 3604502, 0, 8, 3538966, 0, 8, 3473430, 0, 8, 3407894, 0, 8, 3342358, 0, 8, 3276822, 0, 8, 3211286, 0, 8, 3145750, 0, 8, 3080214, 0, 8, 3014678, 0, 8, 2949142, 0, 8, 2883606, 0, 8, 2818070, 0, 8, 2752534, 0, 8, 2686998, 0, 8, 2621462, 0, 8, 2555926, 0, 8, 5046293, 0, 8, 4980757, 0, 8, 4915221, 0, 8, 4849685, 0, 8, 4784149, 0, 8, 4718613, 0, 8, 4653077, 0, 8, 4587541, 0, 8, 4522005, 0, 8, 4456469, 0, 8, 4390933, 0, 8, 4325397, 0, 8, 4259861, 0, 8, 4194325, 0, 8, 4128789, 0, 8, 4063253, 0, 8, 3997717, 0, 8, 3932181, 0, 8, 3866645, 0, 8, 3801109, 0, 8, 3735573, 0, 8, 3670037, 0, 8, 3604501, 0, 8, 3538965, 0, 8, 3473429, 0, 8, 3407893, 0, 8, 3342357, 0, 8, 3276821, 0, 8, 3211285, 0, 8, 3145749, 0, 8, 3080213, 0, 8, 3014677, 0, 8, 2949141, 0, 8, 2883605, 0, 8, 2818069, 0, 8, 2752533, 0, 8, 2686997, 0, 8, 2621461, 0, 8, 2555925, 0, 8, 5046292, 0, 8, 4980756, 0, 8, 4915220, 0, 8, 4849684, 0, 8, 4784148, 0, 8, 4718612, 0, 8, 4653076, 0, 8, 4587540, 0, 8, 4522004, 0, 8, 4456468, 0, 8, 4390932, 0, 8, 4325396, 0, 8, 4259860, 0, 8, 4194324, 0, 8, 4128788, 0, 8, 4063252, 0, 8, 3997716, 0, 8, 3932180, 0, 8, 3866644, 0, 8, 3801108, 0, 8, 3735572, 0, 8, 3670036, 0, 8, 3604500, 0, 8, 3538964, 0, 8, 3473428, 0, 8, 3407892, 0, 8, 3342356, 0, 8, 3276820, 0, 8, 3211284, 0, 8, 3145748, 0, 8, 3080212, 0, 8, 3014676, 0, 8, 2949140, 0, 8, 2883604, 0, 8, 2818068, 0, 8, 2752532, 0, 8, 2686996, 0, 8, 2621460, 0, 8, 2555924, 0, 8, 5046291, 0, 8, 4980755, 0, 8, 4915219, 0, 8, 4849683, 0, 8, 4784147, 0, 8, 4718611, 0, 8, 4653075, 0, 8, 4587539, 0, 8, 4522003, 0, 8, 4456467, 0, 8, 4390931, 0, 8, 4325395, 0, 8, 4259859, 0, 8, 4194323, 0, 8, 4128787, 0, 8, 4063251, 0, 8, 3997715, 0, 8, 3932179, 0, 8, 3866643, 0, 8, 3801107, 0, 8, 3735571, 0, 8, 3670035, 0, 8, 3604499, 0, 8, 3538963, 0, 8, 3473427, 0, 8, 3407891, 0, 8, 3342355, 0, 8, 3276819, 0, 8, 3211283, 0, 8, 3145747, 0, 8, 3080211, 0, 8, 3014675, 0, 8, 2949139, 0, 8, 2883603, 0, 8, 2818067, 0, 8, 2752531, 0, 8, 2686995, 0, 8, 2621459, 0, 8, 2555923, 0, 8, 5046290, 0, 8, 4980754, 0, 8, 4915218, 0, 8, 4849682, 0, 8, 4784146, 0, 8, 4718610, 0, 8, 4653074, 0, 8, 4587538, 0, 8, 4522002, 0, 8, 4456466, 0, 8, 4390930, 0, 8, 4325394, 0, 8, 4259858, 0, 8, 4194322, 0, 8, 4128786, 0, 8, 4063250, 0, 8, 3997714, 0, 8, 3932178, 0, 8, 3866642, 0, 8, 3801106, 0, 8, 5046289, 0, 8, 4980753, 0, 8, 4915217, 0, 8, 4849681, 0, 8, 4784145, 0, 8, 4718609, 0, 8, 4653073, 0, 8, 4587537, 0, 8, 4522001, 0, 8, 4456465, 0, 8, 4390929, 0, 8, 4325393, 0, 8, 4259857, 0, 8, 4194321, 0, 8, 4128785, 0, 8, 4063249, 0, 8, 3997713, 0, 8, 3932177, 0, 8, 3866641, 0, 8, 3801105, 0, 8, 5046288, 0, 8, 4980752, 0, 8, 4915216, 0, 8, 4849680, 0, 8, 4784144, 0, 8, 4718608, 0, 8, 4653072, 0, 8, 4587536, 0, 8, 4522000, 0, 8, 4456464, 0, 8, 4390928, 0, 8, 4325392, 0, 8, 4259856, 0, 8, 4194320, 0, 8, 4128784, 0, 8, 4063248, 0, 8, 3997712, 0, 8, 3932176, 0, 8, 3866640, 0, 8, 3801104, 0, 8, 5046287, 0, 8, 4980751, 0, 8, 4915215, 0, 8, 4849679, 0, 8, 4784143, 0, 8, 4718607, 0, 8, 4653071, 0, 8, 4587535, 0, 8, 4521999, 0, 8, 4456463, 0, 8, 4390927, 0, 8, 4325391, 0, 8, 4259855, 0, 8, 4194319, 0, 8, 4128783, 0, 8, 4063247, 0, 8, 3997711, 0, 8, 3932175, 0, 8, 3866639, 0, 8, 3801103, 0, 8, 5046286, 0, 8, 4980750, 0, 8, 4915214, 0, 8, 4849678, 0, 8, 4784142, 0, 8, 4718606, 0, 8, 4653070, 0, 8, 4587534, 0, 8, 4521998, 0, 8, 4456462, 0, 8, 4390926, 0, 8, 4325390, 0, 8, 4259854, 0, 8, 4194318, 0, 8, 4128782, 0, 8, 4063246, 0, 8, 3997710, 0, 8, 3932174, 0, 8, 3866638, 0, 8, 3801102, 0, 8, 5046285, 0, 8, 4980749, 0, 8, 4915213, 0, 8, 4849677, 0, 8, 4784141, 0, 8, 4718605, 0, 8, 4653069, 0, 8, 4587533, 0, 8, 4521997, 0, 8, 4456461, 0, 8, 4390925, 0, 8, 4325389, 0, 8, 4259853, 0, 8, 4194317, 0, 8, 4128781, 0, 8, 4063245, 0, 8, 3997709, 0, 8, 3932173, 0, 8, 3866637, 0, 8, 3801101, 0, 8, 3801100, 196608, 3, 3866636, 196608, 3, 3932172, 196608, 3, 3997708, 196608, 3, 4063244, 196608, 3, 4128780, 196608, 3, 4194316, 196608, 3, 4259852, 196608, 3, 4325388, 196608, 3, 4390924, 196608, 3, 4456460, 196608, 3, 4521996, 196608, 3, 4587532, 196608, 3, 4653068, 196608, 3, 4718604, 196608, 3, 4784140, 196608, 3, 4849676, 196608, 3, 4915212, 196608, 3, 4980748, 196608, 3, 5046284, 196608, 3, 5111822, 131072, 2, 5111820, 720896, 2, 5111823, 131072, 2, 5111821, 131072, 2, 5111824, 131072, 2, 5111825, 131072, 2, 5111826, 131072, 2, 2490387, 131072, 7, 5111827, 131072, 2, 2490388, 131072, 7, 5111828, 131072, 2, 2490389, 131072, 7, 5111829, 131072, 2, 2490390, 131072, 7, 5111830, 131072, 2, 2490391, 131072, 7, 5111831, 131072, 2, 2490392, 131072, 7, 5111832, 131072, 2, 2490393, 131072, 7, 5111833, 131072, 2, 2490394, 131072, 7, 5111834, 131072, 2, 2490395, 131072, 7, 5111835, 131072, 2, 2490396, 131072, 7, 5111836, 131072, 2, 2490397, 131072, 7, 5111837, 131072, 2, 2490398, 131072, 7, 5111838, 131072, 2, 2490399, 131072, 7, 5111839, 131072, 2, 2490400, 131072, 7, 5111840, 131072, 2, 2490401, 131072, 7, 5111841, 131072, 2, 2490402, 131072, 7, 5111842, 131072, 2, 2490403, 131072, 7, 5111843, 131072, 2, 2490404, 131072, 7, 5111844, 131072, 2, 2490405, 131072, 7, 5111845, 131072, 2, 2490406, 131072, 7, 5111846, 131072, 2, 2490407, 131072, 7, 5111847, 131072, 2, 2490408, 131072, 7, 5111848, 131072, 2, 2490409, 196608, 7, 5111849, 131072, 2, 2490410, 0, 8, 5111850, 131072, 2, 2490411, 0, 8, 5111851, 131072, 2, 2490412, 0, 8, 5111852, 131072, 2, 2490413, 0, 8, 5111853, 131072, 2, 2490414, 0, 8, 5111854, 131072, 2, 2490415, 0, 8, 5111855, 131072, 2, 2490416, 0, 8, 5111856, 131072, 2, 2490417, 0, 8, 5111857, 131072, 2, 2490418, 0, 8, 5111858, 131072, 2, 2490419, 0, 8, 5111859, 131072, 2, 2490420, 0, 8, 5111860, 131072, 2, 2490421, 0, 8, 5111861, 131072, 2, 2490422, 0, 8, 5111862, 131072, 2, 2490423, 0, 8, 5111863, 131072, 2, 2490424, 0, 8, 5111864, 131072, 2, 2490425, 0, 8, 5111865, 131072, 2, 2490426, 0, 8, 5111866, 131072, 2, 2490427, 0, 8, 5111867, 131072, 2, 2490428, 0, 8, 5111868, 131072, 2, 2490429, 0, 8, 5111869, 131072, 2, 2490430, 0, 8, 5111870, 131072, 2, 2490431, 0, 8, 5111871, 131072, 2, 2490432, 0, 8, 5111872, 131072, 2, 2621505, 0, 8, 2490433, 0, 8, 2687041, 0, 8, 2555969, 0, 8, 2752577, 0, 8, 2818113, 0, 8, 2883649, 0, 8, 2949185, 0, 8, 3014721, 0, 8, 3080257, 0, 8, 3145793, 0, 8, 3211329, 0, 8, 3276865, 0, 8, 3342401, 0, 8, 3407937, 0, 8, 3473473, 0, 8, 3539009, 0, 8, 3604545, 0, 8, 3670081, 0, 8, 3735617, 0, 8, 3801153, 0, 8, 3866689, 0, 8, 3932225, 0, 8, 3997761, 0, 8, 4063297, 0, 8, 4128833, 0, 8, 4194369, 0, 8, 4259905, 0, 8, 4325441, 0, 8, 4390977, 0, 8, 4456513, 0, 8, 4522049, 65536, 2, 4587585, 65536, 3, 4653121, 65536, 3, 4718657, 65536, 3, 4784193, 65536, 3, 4849729, 65536, 3, 4915265, 65536, 3, 4980801, 65536, 3, 5046337, 65536, 3, 5111873, 851968, 2, 4456579, 0, 8, 4391043, 0, 8, 4325507, 0, 8, 4259971, 0, 8, 4194435, 0, 8, 4128899, 0, 8, 4063363, 0, 8, 3997827, 0, 8, 3932291, 0, 8, 3866755, 0, 8, 3801219, 0, 8, 3735683, 0, 8, 3670147, 0, 8, 3604611, 0, 8, 3539075, 0, 8, 3473539, 0, 8, 3408003, 0, 8, 3342467, 0, 8, 3276931, 0, 8, 3211395, 0, 8, 4456578, 0, 8, 4391042, 0, 8, 4325506, 0, 8, 4259970, 0, 8, 4194434, 0, 8, 4128898, 0, 8, 4063362, 0, 8, 3997826, 0, 8, 3932290, 0, 8, 3866754, 0, 8, 3801218, 0, 8, 3735682, 0, 8, 3670146, 0, 8, 3604610, 0, 8, 3539074, 0, 8, 3473538, 0, 8, 3408002, 0, 8, 3342466, 0, 8, 3276930, 0, 8, 3211394, 0, 8, 4456577, 0, 8, 4391041, 0, 8, 4325505, 0, 8, 4259969, 0, 8, 4194433, 0, 8, 4128897, 0, 8, 4063361, 0, 8, 3997825, 0, 8, 3932289, 0, 8, 3866753, 0, 8, 3801217, 0, 8, 3735681, 0, 8, 3670145, 0, 8, 3604609, 0, 8, 3539073, 0, 8, 3473537, 0, 8, 3408001, 0, 8, 3342465, 0, 8, 3276929, 0, 8, 3211393, 0, 8, 4456576, 0, 8, 4391040, 0, 8, 4325504, 0, 8, 4259968, 0, 8, 4194432, 0, 8, 4128896, 0, 8, 4063360, 0, 8, 3997824, 0, 8, 3932288, 0, 8, 3866752, 0, 8, 3801216, 0, 8, 3735680, 0, 8, 3670144, 0, 8, 3604608, 0, 8, 3539072, 0, 8, 3473536, 0, 8, 3408000, 0, 8, 3342464, 0, 8, 3276928, 0, 8, 3211392, 0, 8, 4456575, 0, 8, 4391039, 0, 8, 4325503, 0, 8, 4259967, 0, 8, 4194431, 0, 8, 4128895, 0, 8, 4063359, 0, 8, 3997823, 0, 8, 3932287, 0, 8, 3866751, 0, 8, 3801215, 0, 8, 3735679, 0, 8, 3670143, 0, 8, 3604607, 0, 8, 3539071, 0, 8, 3473535, 0, 8, 3407999, 0, 8, 3342463, 0, 8, 3276927, 0, 8, 3211391, 0, 8, 4456574, 0, 8, 4391038, 0, 8, 4325502, 0, 8, 4259966, 0, 8, 4194430, 0, 8, 4128894, 0, 8, 4063358, 0, 8, 3997822, 0, 8, 3932286, 0, 8, 3866750, 0, 8, 3801214, 0, 8, 3735678, 0, 8, 3670142, 0, 8, 3604606, 0, 8, 3539070, 0, 8, 3473534, 0, 8, 3407998, 0, 8, 3342462, 0, 8, 3276926, 0, 8, 3211390, 0, 8, 4456573, 0, 8, 4391037, 0, 8, 4325501, 0, 8, 4259965, 0, 8, 4194429, 0, 8, 4128893, 0, 8, 4063357, 0, 8, 3997821, 0, 8, 3932285, 0, 8, 3866749, 0, 8, 3801213, 0, 8, 3735677, 0, 8, 3670141, 0, 8, 3604605, 0, 8, 3539069, 0, 8, 3473533, 0, 8, 3407997, 0, 8, 3342461, 0, 8, 3276925, 0, 8, 3211389, 0, 8, 4456572, 0, 8, 4391036, 0, 8, 4325500, 0, 8, 4259964, 0, 8, 4194428, 0, 8, 4128892, 0, 8, 4063356, 0, 8, 3997820, 0, 8, 3932284, 0, 8, 3866748, 0, 8, 3801212, 0, 8, 3735676, 0, 8, 3670140, 0, 8, 3604604, 0, 8, 3539068, 0, 8, 3473532, 0, 8, 3407996, 0, 8, 3342460, 0, 8, 3276924, 0, 8, 3211388, 0, 8, 4456571, 0, 8, 4391035, 0, 8, 4325499, 0, 8, 4259963, 0, 8, 4194427, 0, 8, 4128891, 0, 8, 4063355, 0, 8, 3997819, 0, 8, 3932283, 0, 8, 3866747, 0, 8, 3801211, 0, 8, 3735675, 0, 8, 3670139, 0, 8, 3604603, 0, 8, 3539067, 0, 8, 3473531, 0, 8, 3407995, 0, 8, 3342459, 0, 8, 3276923, 0, 8, 3211387, 0, 8, 4456570, 0, 8, 4391034, 0, 8, 4325498, 0, 8, 4259962, 0, 8, 4194426, 0, 8, 4128890, 0, 8, 4063354, 0, 8, 3997818, 0, 8, 3932282, 0, 8, 3866746, 0, 8, 3801210, 0, 8, 3735674, 0, 8, 3670138, 0, 8, 3604602, 0, 8, 3539066, 0, 8, 3473530, 0, 8, 3407994, 0, 8, 3342458, 0, 8, 3276922, 0, 8, 3211386, 0, 8, 4456569, 0, 8, 4391033, 0, 8, 4325497, 0, 8, 4259961, 0, 8, 4194425, 0, 8, 4128889, 0, 8, 4063353, 0, 8, 3997817, 0, 8, 3932281, 0, 8, 3866745, 0, 8, 3801209, 0, 8, 3735673, 0, 8, 3670137, 0, 8, 3604601, 0, 8, 3539065, 0, 8, 3473529, 0, 8, 3407993, 0, 8, 3342457, 0, 8, 3276921, 0, 8, 3211385, 0, 8, 4456568, 0, 8, 4391032, 0, 8, 4325496, 0, 8, 4259960, 0, 8, 4194424, 0, 8, 4128888, 0, 8, 4063352, 0, 8, 3997816, 0, 8, 3932280, 0, 8, 3866744, 0, 8, 3801208, 0, 8, 3735672, 0, 8, 3670136, 0, 8, 3604600, 0, 8, 3539064, 0, 8, 3473528, 0, 8, 3407992, 0, 8, 3342456, 0, 8, 3276920, 0, 8, 3211384, 0, 8, 4456567, 0, 8, 4391031, 0, 8, 4325495, 0, 8, 4259959, 0, 8, 4194423, 0, 8, 4128887, 0, 8, 4063351, 0, 8, 3997815, 0, 8, 3932279, 0, 8, 3866743, 0, 8, 3801207, 0, 8, 3735671, 0, 8, 3670135, 0, 8, 3604599, 0, 8, 3539063, 0, 8, 3473527, 0, 8, 3407991, 0, 8, 3342455, 0, 8, 3276919, 0, 8, 3211383, 0, 8, 4456566, 0, 8, 4391030, 0, 8, 4325494, 0, 8, 4259958, 0, 8, 4194422, 0, 8, 4128886, 0, 8, 4063350, 0, 8, 3997814, 0, 8, 3932278, 0, 8, 3866742, 0, 8, 3801206, 0, 8, 3735670, 0, 8, 3670134, 0, 8, 3604598, 0, 8, 3539062, 0, 8, 3473526, 0, 8, 3407990, 0, 8, 3342454, 0, 8, 3276918, 0, 8, 3211382, 0, 8, 4456565, 0, 8, 4391029, 0, 8, 4325493, 0, 8, 4259957, 0, 8, 4194421, 0, 8, 4128885, 0, 8, 4063349, 0, 8, 3997813, 0, 8, 3932277, 0, 8, 3866741, 0, 8, 3801205, 0, 8, 3735669, 0, 8, 3670133, 0, 8, 3604597, 0, 8, 3539061, 0, 8, 3473525, 0, 8, 3407989, 0, 8, 3342453, 0, 8, 3276917, 0, 8, 3211381, 0, 8, 4456564, 0, 8, 4391028, 0, 8, 4325492, 0, 8, 4259956, 0, 8, 4194420, 0, 8, 4128884, 0, 8, 4063348, 0, 8, 3997812, 0, 8, 3932276, 0, 8, 3866740, 0, 8, 3801204, 0, 8, 3735668, 0, 8, 3670132, 0, 8, 3604596, 0, 8, 3539060, 0, 8, 3473524, 0, 8, 3407988, 0, 8, 3342452, 0, 8, 3276916, 0, 8, 3211380, 0, 8, 4456563, 0, 8, 4391027, 0, 8, 4325491, 0, 8, 4259955, 0, 8, 4194419, 0, 8, 4128883, 0, 8, 4063347, 0, 8, 3997811, 0, 8, 3932275, 0, 8, 3866739, 0, 8, 3801203, 0, 8, 3735667, 0, 8, 3670131, 0, 8, 3604595, 0, 8, 3539059, 0, 8, 3473523, 0, 8, 3407987, 0, 8, 3342451, 0, 8, 3276915, 0, 8, 3211379, 0, 8, 4456562, 0, 8, 4391026, 0, 8, 4325490, 0, 8, 4259954, 0, 8, 4194418, 0, 8, 4128882, 0, 8, 4063346, 0, 8, 3997810, 0, 8, 3932274, 0, 8, 3866738, 0, 8, 3801202, 0, 8, 3735666, 0, 8, 3670130, 0, 8, 3604594, 0, 8, 3539058, 0, 8, 3473522, 0, 8, 3407986, 0, 8, 3342450, 0, 8, 3276914, 0, 8, 3211378, 0, 8, 4456561, 0, 8, 4391025, 0, 8, 4325489, 0, 8, 4259953, 0, 8, 4194417, 0, 8, 4128881, 0, 8, 4063345, 0, 8, 3997809, 0, 8, 3932273, 0, 8, 3866737, 0, 8, 3801201, 0, 8, 3735665, 0, 8, 3670129, 0, 8, 3604593, 0, 8, 3539057, 0, 8, 3473521, 0, 8, 3407985, 0, 8, 3342449, 0, 8, 3276913, 0, 8, 3211377, 0, 8, 4456560, 0, 8, 4391024, 0, 8, 4325488, 0, 8, 4259952, 0, 8, 4194416, 0, 8, 4128880, 0, 8, 4063344, 0, 8, 3997808, 0, 8, 3932272, 0, 8, 3866736, 0, 8, 3801200, 0, 8, 3735664, 0, 8, 3670128, 0, 8, 3604592, 0, 8, 3539056, 0, 8, 3473520, 0, 8, 3407984, 0, 8, 3342448, 0, 8, 3276912, 0, 8, 3211376, 0, 8, 4456559, 0, 8, 4391023, 0, 8, 4325487, 0, 8, 4259951, 0, 8, 4194415, 0, 8, 4128879, 0, 8, 4063343, 0, 8, 3997807, 0, 8, 3932271, 0, 8, 3866735, 0, 8, 3801199, 0, 8, 3735663, 0, 8, 3670127, 0, 8, 3604591, 0, 8, 3539055, 0, 8, 3473519, 0, 8, 3407983, 0, 8, 3342447, 0, 8, 3276911, 0, 8, 3211375, 0, 8, 4456558, 0, 8, 4391022, 0, 8, 4325486, 0, 8, 4259950, 0, 8, 4194414, 0, 8, 4128878, 0, 8, 4063342, 0, 8, 3997806, 0, 8, 3932270, 0, 8, 3866734, 0, 8, 3801198, 0, 8, 3735662, 0, 8, 3670126, 0, 8, 3604590, 0, 8, 3539054, 0, 8, 3473518, 0, 8, 3407982, 0, 8, 3342446, 0, 8, 3276910, 0, 8, 3211374, 0, 8, 4456557, 0, 8, 4391021, 0, 8, 4325485, 0, 8, 4259949, 0, 8, 4194413, 0, 8, 4128877, 0, 8, 4063341, 0, 8, 3997805, 0, 8, 3932269, 0, 8, 3866733, 0, 8, 3801197, 0, 8, 3735661, 0, 8, 3670125, 0, 8, 3604589, 0, 8, 3539053, 0, 8, 3473517, 0, 8, 3407981, 0, 8, 3342445, 0, 8, 3276909, 0, 8, 3211373, 0, 8, 4456556, 0, 8, 4391020, 0, 8, 4325484, 0, 8, 4259948, 0, 8, 4194412, 0, 8, 4128876, 0, 8, 4063340, 0, 8, 3997804, 0, 8, 3932268, 0, 8, 3866732, 0, 8, 3801196, 0, 8, 3735660, 0, 8, 3670124, 0, 8, 3604588, 0, 8, 3539052, 0, 8, 3473516, 0, 8, 3407980, 0, 8, 3342444, 0, 8, 3276908, 0, 8, 3211372, 0, 8, 4456555, 0, 8, 4391019, 0, 8, 4325483, 0, 8, 4259947, 0, 8, 4194411, 0, 8, 4128875, 0, 8, 4063339, 0, 8, 3997803, 0, 8, 3932267, 0, 8, 3866731, 0, 8, 3801195, 0, 8, 3735659, 0, 8, 3670123, 0, 8, 3604587, 0, 8, 3539051, 0, 8, 3473515, 0, 8, 3407979, 0, 8, 3342443, 0, 8, 3276907, 0, 8, 3211371, 0, 8, 4456554, 0, 8, 4391018, 0, 8, 4325482, 0, 8, 4259946, 0, 8, 4194410, 0, 8, 4128874, 0, 8, 4063338, 0, 8, 3997802, 0, 8, 3932266, 0, 8, 3866730, 0, 8, 3801194, 0, 8, 3735658, 0, 8, 3670122, 0, 8, 3604586, 0, 8, 3539050, 0, 8, 3473514, 0, 8, 3407978, 0, 8, 3342442, 0, 8, 3276906, 0, 8, 3211370, 0, 8, 4456553, 0, 8, 4391017, 0, 8, 4325481, 0, 8, 4259945, 0, 8, 4194409, 0, 8, 4128873, 0, 8, 4063337, 0, 8, 3997801, 0, 8, 3932265, 0, 8, 3866729, 0, 8, 3801193, 0, 8, 3735657, 0, 8, 3670121, 0, 8, 3604585, 0, 8, 3539049, 0, 8, 3473513, 0, 8, 3407977, 0, 8, 3342441, 0, 8, 3276905, 0, 8, 3211369, 0, 8, 4456552, 0, 8, 4391016, 0, 8, 4325480, 0, 8, 4259944, 0, 8, 4194408, 0, 8, 4128872, 0, 8, 4063336, 0, 8, 3997800, 0, 8, 3932264, 0, 8, 3866728, 0, 8, 3801192, 0, 8, 3735656, 0, 8, 3670120, 0, 8, 3604584, 0, 8, 3539048, 0, 8, 3473512, 0, 8, 3407976, 0, 8, 3342440, 0, 8, 3276904, 0, 8, 3211368, 0, 8, 4456551, 0, 8, 4391015, 0, 8, 4325479, 0, 8, 4259943, 0, 8, 4194407, 0, 8, 4128871, 0, 8, 4063335, 0, 8, 3997799, 0, 8, 3932263, 0, 8, 3866727, 0, 8, 3801191, 0, 8, 3735655, 0, 8, 3670119, 0, 8, 3604583, 0, 8, 3539047, 0, 8, 3473511, 0, 8, 3407975, 0, 8, 3342439, 0, 8, 3276903, 0, 8, 3211367, 0, 8, 4456550, 0, 8, 4391014, 0, 8, 4325478, 0, 8, 4259942, 0, 8, 4194406, 0, 8, 4128870, 0, 8, 4063334, 0, 8, 3997798, 0, 8, 3932262, 0, 8, 3866726, 0, 8, 3801190, 0, 8, 3735654, 0, 8, 3670118, 0, 8, 3604582, 0, 8, 3539046, 0, 8, 3473510, 0, 8, 3407974, 0, 8, 3342438, 0, 8, 3276902, 0, 8, 3211366, 0, 8, 4456549, 0, 8, 4391013, 0, 8, 4325477, 0, 8, 4259941, 0, 8, 4194405, 0, 8, 4128869, 0, 8, 4063333, 0, 8, 3997797, 0, 8, 3932261, 0, 8, 3866725, 0, 8, 3801189, 0, 8, 3735653, 0, 8, 3670117, 0, 8, 3604581, 0, 8, 3539045, 0, 8, 3473509, 0, 8, 3407973, 0, 8, 3342437, 0, 8, 3276901, 0, 8, 3211365, 0, 8, 4456548, 0, 8, 4391012, 0, 8, 4325476, 0, 8, 4259940, 0, 8, 4194404, 0, 8, 4128868, 0, 8, 4063332, 0, 8, 3997796, 0, 8, 3932260, 0, 8, 3866724, 0, 8, 3801188, 0, 8, 3735652, 0, 8, 3670116, 0, 8, 3604580, 0, 8, 3539044, 0, 8, 3473508, 0, 8, 3407972, 0, 8, 3342436, 0, 8, 3276900, 0, 8, 3211364, 0, 8, 4456547, 0, 8, 4391011, 0, 8, 4325475, 0, 8, 4259939, 0, 8, 4194403, 0, 8, 4128867, 0, 8, 4063331, 0, 8, 3997795, 0, 8, 3932259, 0, 8, 3866723, 0, 8, 3801187, 0, 8, 3735651, 0, 8, 3670115, 0, 8, 3604579, 0, 8, 3539043, 0, 8, 3473507, 0, 8, 3407971, 0, 8, 3342435, 0, 8, 3276899, 0, 8, 3211363, 0, 8, 4456546, 0, 8, 4391010, 0, 8, 4325474, 0, 8, 4259938, 0, 8, 4194402, 0, 8, 4128866, 0, 8, 4063330, 0, 8, 3997794, 0, 8, 3932258, 0, 8, 3866722, 0, 8, 3801186, 0, 8, 3735650, 0, 8, 3670114, 0, 8, 3604578, 0, 8, 3539042, 0, 8, 3473506, 0, 8, 3407970, 0, 8, 3342434, 0, 8, 3276898, 0, 8, 3211362, 0, 8, 4456545, 0, 8, 4391009, 0, 8, 4325473, 0, 8, 4259937, 0, 8, 4194401, 0, 8, 4128865, 0, 8, 4063329, 0, 8, 3997793, 0, 8, 3932257, 0, 8, 3866721, 0, 8, 3801185, 0, 8, 3735649, 0, 8, 3670113, 0, 8, 3604577, 0, 8, 3539041, 0, 8, 3473505, 0, 8, 3407969, 0, 8, 3342433, 0, 8, 3276897, 0, 8, 3211361, 0, 8, 4456544, 0, 8, 4391008, 0, 8, 4325472, 0, 8, 4259936, 0, 8, 4194400, 0, 8, 4128864, 0, 8, 4063328, 0, 8, 3997792, 0, 8, 3932256, 0, 8, 3866720, 0, 8, 3801184, 0, 8, 3735648, 0, 8, 3670112, 0, 8, 3604576, 0, 8, 3539040, 0, 8, 3473504, 0, 8, 3407968, 0, 8, 3342432, 0, 8, 3276896, 0, 8, 3211360, 0, 8, 4456543, 0, 8, 4391007, 0, 8, 4325471, 0, 8, 4259935, 0, 8, 4194399, 0, 8, 4128863, 0, 8, 4063327, 0, 8, 3997791, 0, 8, 3932255, 0, 8, 3866719, 0, 8, 3801183, 0, 8, 3735647, 0, 8, 3670111, 0, 8, 3604575, 0, 8, 3539039, 0, 8, 3473503, 0, 8, 3407967, 0, 8, 3342431, 0, 8, 3276895, 0, 8, 3211359, 0, 8, 4456542, 0, 8, 4391006, 0, 8, 4325470, 0, 8, 4259934, 0, 8, 4194398, 0, 8, 4128862, 0, 8, 4063326, 0, 8, 3997790, 0, 8, 3932254, 0, 8, 3866718, 0, 8, 3801182, 0, 8, 3735646, 0, 8, 3670110, 0, 8, 3604574, 0, 8, 3539038, 0, 8, 3473502, 0, 8, 3407966, 0, 8, 3342430, 0, 8, 3276894, 0, 8, 3211358, 0, 8, 4456541, 0, 8, 4391005, 0, 8, 4325469, 0, 8, 4259933, 0, 8, 4194397, 0, 8, 4128861, 0, 8, 4063325, 0, 8, 3997789, 0, 8, 3932253, 0, 8, 3866717, 0, 8, 3801181, 0, 8, 3735645, 0, 8, 3670109, 0, 8, 3604573, 0, 8, 3539037, 0, 8, 3473501, 0, 8, 3407965, 0, 8, 3342429, 0, 8, 3276893, 0, 8, 3211357, 0, 8, 4456540, 0, 8, 4391004, 0, 8, 4325468, 0, 8, 4259932, 0, 8, 4194396, 0, 8, 4128860, 0, 8, 4063324, 0, 8, 3997788, 0, 8, 3932252, 0, 8, 3866716, 0, 8, 3801180, 0, 8, 3735644, 0, 8, 3670108, 0, 8, 3604572, 0, 8, 3539036, 0, 8, 3473500, 0, 8, 3407964, 0, 8, 3342428, 0, 8, 3276892, 0, 8, 3211356, 0, 8, 4456539, 0, 8, 4391003, 0, 8, 4325467, 0, 8, 4259931, 0, 8, 4194395, 0, 8, 4128859, 0, 8, 4063323, 0, 8, 3997787, 0, 8, 3932251, 0, 8, 3866715, 0, 8, 3801179, 0, 8, 3735643, 0, 8, 3670107, 0, 8, 3604571, 0, 8, 3539035, 0, 8, 3473499, 0, 8, 3407963, 0, 8, 3342427, 0, 8, 3276891, 0, 8, 3211355, 0, 8, 4456538, 0, 8, 4391002, 0, 8, 4325466, 0, 8, 4259930, 0, 8, 4194394, 0, 8, 4128858, 0, 8, 4063322, 0, 8, 3997786, 0, 8, 3932250, 0, 8, 3866714, 0, 8, 3801178, 0, 8, 3735642, 0, 8, 3670106, 0, 8, 3604570, 0, 8, 3539034, 0, 8, 3473498, 0, 8, 3407962, 0, 8, 3342426, 0, 8, 3276890, 0, 8, 3211354, 0, 8, 4456537, 0, 8, 4391001, 0, 8, 4325465, 0, 8, 4259929, 0, 8, 4194393, 0, 8, 4128857, 0, 8, 4063321, 0, 8, 3997785, 0, 8, 3932249, 0, 8, 3866713, 0, 8, 3801177, 0, 8, 3735641, 0, 8, 3670105, 0, 8, 3604569, 0, 8, 3539033, 0, 8, 3473497, 0, 8, 3407961, 0, 8, 3342425, 0, 8, 3276889, 0, 8, 3211353, 0, 8, 4456536, 0, 8, 4391000, 0, 8, 4325464, 0, 8, 4259928, 0, 8, 4194392, 0, 8, 4128856, 0, 8, 4063320, 0, 8, 3997784, 0, 8, 3932248, 0, 8, 3866712, 0, 8, 3801176, 0, 8, 3735640, 0, 8, 3670104, 0, 8, 3604568, 0, 8, 3539032, 0, 8, 3473496, 0, 8, 3407960, 0, 8, 3342424, 0, 8, 3276888, 0, 8, 3211352, 0, 8, 4456535, 0, 8, 4390999, 0, 8, 4325463, 0, 8, 4259927, 0, 8, 4194391, 0, 8, 4128855, 0, 8, 4063319, 0, 8, 3997783, 0, 8, 3932247, 0, 8, 3866711, 0, 8, 3801175, 0, 8, 3735639, 0, 8, 3670103, 0, 8, 3604567, 0, 8, 3539031, 0, 8, 3473495, 0, 8, 3407959, 0, 8, 3342423, 0, 8, 3276887, 0, 8, 3211351, 0, 8, 4456534, 0, 8, 4390998, 0, 8, 4325462, 0, 8, 4259926, 0, 8, 4194390, 0, 8, 4128854, 0, 8, 4063318, 0, 8, 3997782, 0, 8, 3932246, 0, 8, 3866710, 0, 8, 3801174, 0, 8, 3735638, 0, 8, 3670102, 0, 8, 3604566, 0, 8, 3539030, 0, 8, 3473494, 0, 8, 3407958, 0, 8, 3342422, 0, 8, 3276886, 0, 8, 3211350, 0, 8, 4456533, 0, 8, 4390997, 0, 8, 4325461, 0, 8, 4259925, 0, 8, 4194389, 0, 8, 4128853, 0, 8, 4063317, 0, 8, 3997781, 0, 8, 3932245, 0, 8, 3866709, 0, 8, 3801173, 0, 8, 3735637, 0, 8, 3670101, 0, 8, 3604565, 0, 8, 3539029, 0, 8, 3473493, 0, 8, 3407957, 0, 8, 3342421, 0, 8, 3276885, 0, 8, 3211349, 0, 8, 4456532, 0, 8, 4390996, 0, 8, 4325460, 0, 8, 4259924, 0, 8, 4194388, 0, 8, 4128852, 0, 8, 4063316, 0, 8, 3997780, 0, 8, 3932244, 0, 8, 3866708, 0, 8, 3801172, 0, 8, 3735636, 0, 8, 3670100, 0, 8, 3604564, 0, 8, 3539028, 0, 8, 3473492, 0, 8, 3407956, 0, 8, 3342420, 0, 8, 3276884, 0, 8, 3211348, 0, 8, 4456531, 0, 8, 4390995, 0, 8, 4325459, 0, 8, 4259923, 0, 8, 4194387, 0, 8, 4128851, 0, 8, 4063315, 0, 8, 3997779, 0, 8, 3932243, 0, 8, 3866707, 0, 8, 3801171, 0, 8, 3735635, 0, 8, 3670099, 0, 8, 3604563, 0, 8, 3539027, 0, 8, 3473491, 0, 8, 3407955, 0, 8, 3342419, 0, 8, 3276883, 0, 8, 3211347, 0, 8, 4456530, 0, 8, 4390994, 0, 8, 4325458, 0, 8, 4259922, 0, 8, 4194386, 0, 8, 4128850, 0, 8, 4063314, 0, 8, 3997778, 0, 8, 3932242, 0, 8, 3866706, 0, 8, 3801170, 0, 8, 3735634, 0, 8, 3670098, 0, 8, 3604562, 0, 8, 3539026, 0, 8, 3473490, 0, 8, 3407954, 0, 8, 3342418, 0, 8, 3276882, 0, 8, 3211346, 0, 8, 4456529, 0, 8, 4390993, 0, 8, 4325457, 0, 8, 4259921, 0, 8, 4194385, 0, 8, 4128849, 0, 8, 4063313, 0, 8, 3997777, 0, 8, 3932241, 0, 8, 3866705, 0, 8, 3801169, 0, 8, 3735633, 0, 8, 3670097, 0, 8, 3604561, 0, 8, 3539025, 0, 8, 3473489, 0, 8, 3407953, 0, 8, 3342417, 0, 8, 3276881, 0, 8, 3211345, 0, 8, 4456528, 0, 8, 4390992, 0, 8, 4325456, 0, 8, 4259920, 0, 8, 4194384, 0, 8, 4128848, 0, 8, 4063312, 0, 8, 3997776, 0, 8, 3932240, 0, 8, 3866704, 0, 8, 3801168, 0, 8, 3735632, 0, 8, 3670096, 0, 8, 3604560, 0, 8, 3539024, 0, 8, 3473488, 0, 8, 3407952, 0, 8, 3342416, 0, 8, 3276880, 0, 8, 3211344, 0, 8, 4456527, 0, 8, 4390991, 0, 8, 4325455, 0, 8, 4259919, 0, 8, 4194383, 0, 8, 4128847, 0, 8, 4063311, 0, 8, 3997775, 0, 8, 3932239, 0, 8, 3866703, 0, 8, 3801167, 0, 8, 3735631, 0, 8, 3670095, 0, 8, 3604559, 0, 8, 3539023, 0, 8, 3473487, 0, 8, 3407951, 0, 8, 3342415, 0, 8, 3276879, 0, 8, 3211343, 0, 8, 4456526, 0, 8, 4390990, 0, 8, 4325454, 0, 8, 4259918, 0, 8, 4194382, 0, 8, 4128846, 0, 8, 4063310, 0, 8, 3997774, 0, 8, 3932238, 0, 8, 3866702, 0, 8, 3801166, 0, 8, 3735630, 0, 8, 3670094, 0, 8, 3604558, 0, 8, 3539022, 0, 8, 3473486, 0, 8, 3407950, 0, 8, 3342414, 0, 8, 3276878, 0, 8, 3211342, 0, 8, 4456525, 0, 8, 4390989, 0, 8, 4325453, 0, 8, 4259917, 0, 8, 4194381, 0, 8, 4128845, 0, 8, 4063309, 0, 8, 3997773, 0, 8, 3932237, 0, 8, 3866701, 0, 8, 3801165, 0, 8, 3735629, 0, 8, 3670093, 0, 8, 3604557, 0, 8, 3539021, 0, 8, 3473485, 0, 8, 3407949, 0, 8, 3342413, 0, 8, 3276877, 0, 8, 3211341, 0, 8, 4456524, 0, 8, 4390988, 0, 8, 4325452, 0, 8, 4259916, 0, 8, 4194380, 0, 8, 4128844, 0, 8, 4063308, 0, 8, 3997772, 0, 8, 3932236, 0, 8, 3866700, 0, 8, 3801164, 0, 8, 3735628, 0, 8, 3670092, 0, 8, 3604556, 0, 8, 3539020, 0, 8, 3473484, 0, 8, 3407948, 0, 8, 3342412, 0, 8, 3276876, 0, 8, 3211340, 0, 8, 4456523, 0, 8, 4390987, 0, 8, 4325451, 0, 8, 4259915, 0, 8, 4194379, 0, 8, 4128843, 0, 8, 4063307, 0, 8, 3997771, 0, 8, 3932235, 0, 8, 3866699, 0, 8, 3801163, 0, 8, 3735627, 0, 8, 3670091, 0, 8, 3604555, 0, 8, 3539019, 0, 8, 3473483, 0, 8, 3407947, 0, 8, 3342411, 0, 8, 3276875, 0, 8, 3211339, 0, 8, 4456522, 0, 8, 4390986, 0, 8, 4325450, 0, 8, 4259914, 0, 8, 4194378, 0, 8, 4128842, 0, 8, 4063306, 0, 8, 3997770, 0, 8, 3932234, 0, 8, 3866698, 0, 8, 3801162, 0, 8, 3735626, 0, 8, 3670090, 0, 8, 3604554, 0, 8, 3539018, 0, 8, 3473482, 0, 8, 3407946, 0, 8, 3342410, 0, 8, 3276874, 0, 8, 3211338, 0, 8, 4456521, 0, 8, 4390985, 0, 8, 4325449, 0, 8, 4259913, 0, 8, 4194377, 0, 8, 4128841, 0, 8, 4063305, 0, 8, 3997769, 0, 8, 3932233, 0, 8, 3866697, 0, 8, 3801161, 0, 8, 3735625, 0, 8, 3670089, 0, 8, 3604553, 0, 8, 3539017, 0, 8, 3473481, 0, 8, 3407945, 0, 8, 3342409, 0, 8, 3276873, 0, 8, 3211337, 0, 8, 4456520, 0, 8, 4390984, 0, 8, 4325448, 0, 8, 4259912, 0, 8, 4194376, 0, 8, 4128840, 0, 8, 4063304, 0, 8, 3997768, 0, 8, 3932232, 0, 8, 3866696, 0, 8, 3801160, 0, 8, 3735624, 0, 8, 3670088, 0, 8, 3604552, 0, 8, 3539016, 0, 8, 3473480, 0, 8, 3407944, 0, 8, 3342408, 0, 8, 3276872, 0, 8, 3211336, 0, 8, 4456519, 0, 8, 4390983, 0, 8, 4325447, 0, 8, 4259911, 0, 8, 4194375, 0, 8, 4128839, 0, 8, 4063303, 0, 8, 3997767, 0, 8, 3932231, 0, 8, 3866695, 0, 8, 3801159, 0, 8, 3735623, 0, 8, 3670087, 0, 8, 3604551, 0, 8, 3539015, 0, 8, 3473479, 0, 8, 3407943, 0, 8, 3342407, 0, 8, 3276871, 0, 8, 3211335, 0, 8, 4456518, 0, 8, 4390982, 0, 8, 4325446, 0, 8, 4259910, 0, 8, 4194374, 0, 8, 4128838, 0, 8, 4063302, 0, 8, 3997766, 0, 8, 3932230, 0, 8, 3866694, 0, 8, 3801158, 0, 8, 3735622, 0, 8, 3670086, 0, 8, 3604550, 0, 8, 3539014, 0, 8, 3473478, 0, 8, 3407942, 0, 8, 3342406, 0, 8, 3276870, 0, 8, 3211334, 0, 8, 4456517, 0, 8, 4390981, 0, 8, 4325445, 0, 8, 4259909, 0, 8, 4194373, 0, 8, 4128837, 0, 8, 4063301, 0, 8, 3997765, 0, 8, 3932229, 0, 8, 3866693, 0, 8, 3801157, 0, 8, 3735621, 0, 8, 3670085, 0, 8, 3604549, 0, 8, 3539013, 0, 8, 3473477, 0, 8, 3407941, 0, 8, 3342405, 0, 8, 3276869, 0, 8, 3211333, 0, 8, 4456516, 0, 8, 4390980, 0, 8, 4325444, 0, 8, 4259908, 0, 8, 4194372, 0, 8, 4128836, 0, 8, 4063300, 0, 8, 3997764, 0, 8, 3932228, 0, 8, 3866692, 0, 8, 3801156, 0, 8, 3735620, 0, 8, 3670084, 0, 8, 3604548, 0, 8, 3539012, 0, 8, 3473476, 0, 8, 3407940, 0, 8, 3342404, 0, 8, 3276868, 0, 8, 3211332, 0, 8, 4456515, 0, 8, 4390979, 0, 8, 4325443, 0, 8, 4259907, 0, 8, 4194371, 0, 8, 4128835, 0, 8, 4063299, 0, 8, 3997763, 0, 8, 3932227, 0, 8, 3866691, 0, 8, 3801155, 0, 8, 3735619, 0, 8, 3670083, 0, 8, 3604547, 0, 8, 3539011, 0, 8, 3473475, 0, 8, 3407939, 0, 8, 3342403, 0, 8, 3276867, 0, 8, 3211331, 0, 8, 4456514, 0, 8, 4390978, 0, 8, 4325442, 0, 8, 4259906, 0, 8, 4194370, 0, 8, 4128834, 0, 8, 4063298, 0, 8, 3997762, 0, 8, 3932226, 0, 8, 3866690, 0, 8, 3801154, 0, 8, 3735618, 0, 8, 3670082, 0, 8, 3604546, 0, 8, 3539010, 0, 8, 3473474, 0, 8, 3407938, 0, 8, 3342402, 0, 8, 3276866, 0, 8, 3211330, 0, 8, 3145794, 0, 8, 4522050, 131072, 2, 3145795, 0, 8, 4522051, 131072, 2, 3145796, 0, 8, 4522052, 131072, 2, 3145797, 0, 8, 4522053, 131072, 2, 3145798, 0, 8, 4522054, 131072, 2, 3145799, 0, 8, 4522055, 131072, 2, 3145800, 0, 8, 4522056, 131072, 2, 3145801, 0, 8, 4522057, 131072, 2, 3145802, 0, 8, 4522058, 131072, 2, 3145803, 0, 8, 4522059, 131072, 2, 3145804, 0, 8, 4522060, 131072, 2, 3145805, 0, 8, 4522061, 131072, 2, 3145806, 0, 8, 4522062, 131072, 2, 3145807, 0, 8, 4522063, 131072, 2, 3145808, 0, 8, 4522064, 131072, 2, 3145809, 0, 8, 4522065, 131072, 2, 3145810, 0, 8, 4522066, 131072, 2, 3145811, 0, 8, 4522067, 131072, 2, 3145812, 0, 8, 4522068, 131072, 2, 3145813, 0, 8, 4522069, 131072, 2, 3145814, 0, 8, 4522070, 131072, 2, 3145815, 0, 8, 4522071, 131072, 2, 3145816, 0, 8, 4522072, 131072, 2, 3145817, 0, 8, 4522073, 131072, 2, 3145818, 0, 8, 4522074, 131072, 2, 3145819, 0, 8, 4522075, 131072, 2, 3145820, 0, 8, 4522076, 131072, 2, 3145821, 0, 8, 4522077, 131072, 2, 3145822, 0, 8, 4522078, 131072, 2, 3145823, 0, 8, 4522079, 131072, 2, 3145824, 0, 8, 4522080, 131072, 2, 3145825, 0, 8, 4522081, 131072, 2, 3145826, 0, 8, 4522082, 131072, 2, 3145827, 0, 8, 4522083, 131072, 2, 3145828, 0, 8, 4522084, 131072, 2, 3145829, 0, 8, 4522085, 131072, 2, 3145830, 0, 8, 4522086, 131072, 2, 3145831, 0, 8, 4522087, 131072, 2, 3145832, 65536, 7, 4522088, 131072, 2, 3145833, 131072, 7, 4522089, 131072, 2, 3145834, 131072, 7, 4522090, 131072, 2, 3145835, 131072, 7, 4522091, 131072, 2, 3145836, 131072, 7, 4522092, 131072, 2, 3145837, 131072, 7, 4522093, 131072, 2, 3145838, 131072, 7, 4522094, 131072, 2, 3145839, 131072, 7, 4522095, 131072, 2, 3145840, 131072, 7, 4522096, 131072, 2, 3145841, 131072, 7, 4522097, 131072, 2, 3145842, 131072, 7, 4522098, 131072, 2, 3145843, 131072, 7, 4522099, 131072, 2, 3145844, 131072, 7, 4522100, 131072, 2, 3145845, 131072, 7, 4522101, 131072, 2, 3145846, 131072, 7, 4522102, 131072, 2, 3145847, 131072, 7, 4522103, 131072, 2, 3145848, 131072, 7, 4522104, 131072, 2, 3145849, 131072, 7, 4522105, 131072, 2, 3145850, 131072, 7, 4522106, 131072, 2, 3145851, 131072, 7, 4522107, 131072, 2, 3145852, 131072, 7, 4522108, 131072, 2, 3145853, 131072, 7, 4522109, 131072, 2, 3145854, 131072, 7, 4522110, 131072, 2, 3145855, 131072, 7, 4522111, 131072, 2, 3145856, 131072, 7, 4522112, 131072, 2, 3145857, 131072, 7, 4522113, 131072, 2, 3145858, 131072, 7, 4522114, 131072, 2, 3145859, 131072, 7, 4522115, 131072, 2, 3276932, 65536, 3, 3145860, 65536, 4, 3342468, 65536, 3, 3211396, 65536, 3, 3408004, 65536, 3, 3473540, 65536, 3, 3539076, 65536, 3, 3604612, 65536, 3, 3670148, 65536, 3, 3735684, 65536, 3, 3801220, 65536, 3, 3866756, 65536, 3, 3932292, 65536, 3, 3997828, 65536, 3, 4063364, 65536, 3, 4128900, 65536, 3, 4194436, 65536, 3, 4259972, 65536, 3, 4325508, 65536, 3, 4391044, 65536, 3, 4456580, 65536, 3, 4522116, 851968, 2, 3080295, 0, 8, 3014759, 0, 8, 2949223, 0, 8, 2883687, 0, 8, 2818151, 0, 8, 2752615, 0, 8, 2687079, 0, 8, 2621543, 0, 8, 2556007, 0, 8, 2490471, 0, 8, 2424935, 0, 8, 2359399, 0, 8, 2293863, 0, 8, 2228327, 0, 8, 2162791, 0, 8, 2097255, 0, 8, 2031719, 0, 8, 1966183, 0, 8, 1900647, 0, 8, 1835111, 0, 8, 1769575, 0, 8, 1704039, 0, 8, 1638503, 0, 8, 1572967, 0, 8, 1507431, 0, 8, 1441895, 0, 8, 1376359, 0, 8, 1310823, 0, 8, 1245287, 0, 8, 1179751, 0, 8, 1114215, 0, 8, 1048679, 0, 8, 983143, 0, 8, 917607, 0, 8, 852071, 0, 8, 786535, 0, 8, 720999, 0, 8, 655463, 0, 8, 589927, 0, 8, 524391, 0, 8, 3080294, 0, 8, 3014758, 0, 8, 2949222, 0, 8, 2883686, 0, 8, 2818150, 0, 8, 2752614, 0, 8, 2687078, 0, 8, 2621542, 0, 8, 2556006, 0, 8, 2490470, 0, 8, 2424934, 0, 8, 2359398, 0, 8, 2293862, 0, 8, 2228326, 0, 8, 2162790, 0, 8, 2097254, 0, 8, 2031718, 0, 8, 1966182, 0, 8, 1900646, 0, 8, 1835110, 0, 8, 1769574, 0, 8, 1704038, 0, 8, 1638502, 0, 8, 1572966, 0, 8, 1507430, 0, 8, 1441894, 0, 8, 1376358, 0, 8, 1310822, 0, 8, 1245286, 0, 8, 1179750, 0, 8, 1114214, 0, 8, 1048678, 0, 8, 983142, 0, 8, 917606, 0, 8, 852070, 0, 8, 786534, 0, 8, 720998, 0, 8, 655462, 0, 8, 589926, 0, 8, 524390, 0, 8, 3080293, 0, 8, 3014757, 0, 8, 2949221, 0, 8, 2883685, 0, 8, 2818149, 0, 8, 2752613, 0, 8, 2687077, 0, 8, 2621541, 0, 8, 2556005, 0, 8, 2490469, 0, 8, 2424933, 0, 8, 2359397, 0, 8, 2293861, 0, 8, 2228325, 0, 8, 2162789, 0, 8, 2097253, 0, 8, 2031717, 0, 8, 1966181, 0, 8, 1900645, 0, 8, 1835109, 0, 8, 1769573, 0, 8, 1704037, 0, 8, 1638501, 0, 8, 1572965, 0, 8, 1507429, 0, 8, 1441893, 0, 8, 1376357, 0, 8, 1310821, 0, 8, 1245285, 0, 8, 1179749, 0, 8, 1114213, 0, 8, 1048677, 0, 8, 983141, 0, 8, 917605, 0, 8, 852069, 0, 8, 786533, 0, 8, 720997, 0, 8, 655461, 0, 8, 589925, 0, 8, 524389, 0, 8, 3080292, 0, 8, 3014756, 0, 8, 2949220, 0, 8, 2883684, 0, 8, 2818148, 0, 8, 2752612, 0, 8, 2687076, 0, 8, 2621540, 0, 8, 2556004, 0, 8, 2490468, 0, 8, 2424932, 0, 8, 2359396, 0, 8, 2293860, 0, 8, 2228324, 0, 8, 2162788, 0, 8, 2097252, 0, 8, 2031716, 0, 8, 1966180, 0, 8, 1900644, 0, 8, 1835108, 0, 8, 1769572, 0, 8, 1704036, 0, 8, 1638500, 0, 8, 1572964, 0, 8, 1507428, 0, 8, 1441892, 0, 8, 1376356, 0, 8, 1310820, 0, 8, 1245284, 0, 8, 1179748, 0, 8, 1114212, 0, 8, 1048676, 0, 8, 983140, 0, 8, 917604, 0, 8, 852068, 0, 8, 786532, 0, 8, 720996, 0, 8, 655460, 0, 8, 589924, 0, 8, 524388, 0, 8, 3080291, 0, 8, 3014755, 0, 8, 2949219, 0, 8, 2883683, 0, 8, 2818147, 0, 8, 2752611, 0, 8, 2687075, 0, 8, 2621539, 0, 8, 2556003, 0, 8, 2490467, 0, 8, 2424931, 0, 8, 2359395, 0, 8, 2293859, 0, 8, 2228323, 0, 8, 2162787, 0, 8, 2097251, 0, 8, 2031715, 0, 8, 1966179, 0, 8, 1900643, 0, 8, 1835107, 0, 8, 1769571, 0, 8, 1704035, 0, 8, 1638499, 0, 8, 1572963, 0, 8, 1507427, 0, 8, 1441891, 0, 8, 1376355, 0, 8, 1310819, 0, 8, 1245283, 0, 8, 1179747, 0, 8, 1114211, 0, 8, 1048675, 0, 8, 983139, 0, 8, 917603, 0, 8, 852067, 0, 8, 786531, 0, 8, 720995, 0, 8, 655459, 0, 8, 589923, 0, 8, 524387, 0, 8, 3080290, 0, 8, 3014754, 0, 8, 2949218, 0, 8, 2883682, 0, 8, 2818146, 0, 8, 2752610, 0, 8, 2687074, 0, 8, 2621538, 0, 8, 2556002, 0, 8, 2490466, 0, 8, 2424930, 0, 8, 2359394, 0, 8, 2293858, 0, 8, 2228322, 0, 8, 2162786, 0, 8, 2097250, 0, 8, 2031714, 0, 8, 1966178, 0, 8, 1900642, 0, 8, 1835106, 0, 8, 1769570, 0, 8, 1704034, 0, 8, 1638498, 0, 8, 1572962, 0, 8, 1507426, 0, 8, 1441890, 0, 8, 1376354, 0, 8, 1310818, 0, 8, 1245282, 0, 8, 1179746, 0, 8, 1114210, 0, 8, 1048674, 0, 8, 983138, 0, 8, 917602, 0, 8, 852066, 0, 8, 786530, 0, 8, 720994, 0, 8, 655458, 0, 8, 589922, 0, 8, 524386, 0, 8, 3080289, 0, 8, 3014753, 0, 8, 2949217, 0, 8, 2883681, 0, 8, 2818145, 0, 8, 2752609, 0, 8, 2687073, 0, 8, 2621537, 0, 8, 2556001, 0, 8, 2490465, 0, 8, 2424929, 0, 8, 2359393, 0, 8, 2293857, 0, 8, 2228321, 0, 8, 2162785, 0, 8, 2097249, 0, 8, 2031713, 0, 8, 1966177, 0, 8, 1900641, 0, 8, 1835105, 0, 8, 1769569, 0, 8, 1704033, 0, 8, 1638497, 0, 8, 1572961, 0, 8, 1507425, 0, 8, 1441889, 0, 8, 1376353, 0, 8, 1310817, 0, 8, 1245281, 0, 8, 1179745, 0, 8, 1114209, 0, 8, 1048673, 0, 8, 983137, 0, 8, 917601, 0, 8, 852065, 0, 8, 786529, 0, 8, 720993, 0, 8, 655457, 0, 8, 589921, 0, 8, 524385, 0, 8, 3080288, 0, 8, 3014752, 0, 8, 2949216, 0, 8, 2883680, 0, 8, 2818144, 0, 8, 2752608, 0, 8, 2687072, 0, 8, 2621536, 0, 8, 2556000, 0, 8, 2490464, 0, 8, 2424928, 0, 8, 2359392, 0, 8, 2293856, 0, 8, 2228320, 0, 8, 2162784, 0, 8, 2097248, 0, 8, 2031712, 0, 8, 1966176, 0, 8, 1900640, 0, 8, 1835104, 0, 8, 1769568, 0, 8, 1704032, 0, 8, 1638496, 0, 8, 1572960, 0, 8, 1507424, 0, 8, 1441888, 0, 8, 1376352, 0, 8, 1310816, 0, 8, 1245280, 0, 8, 1179744, 0, 8, 1114208, 0, 8, 1048672, 0, 8, 983136, 0, 8, 917600, 0, 8, 852064, 0, 8, 786528, 0, 8, 720992, 0, 8, 655456, 0, 8, 589920, 0, 8, 524384, 0, 8, 3080287, 0, 8, 3014751, 0, 8, 2949215, 0, 8, 2883679, 0, 8, 2818143, 0, 8, 2752607, 0, 8, 2687071, 0, 8, 2621535, 0, 8, 2555999, 0, 8, 2490463, 0, 8, 2424927, 0, 8, 2359391, 0, 8, 2293855, 0, 8, 2228319, 0, 8, 2162783, 0, 8, 2097247, 0, 8, 2031711, 0, 8, 1966175, 0, 8, 1900639, 0, 8, 1835103, 0, 8, 1769567, 0, 8, 1704031, 0, 8, 1638495, 0, 8, 1572959, 0, 8, 1507423, 0, 8, 1441887, 0, 8, 1376351, 0, 8, 1310815, 0, 8, 1245279, 0, 8, 1179743, 0, 8, 1114207, 0, 8, 1048671, 0, 8, 983135, 0, 8, 917599, 0, 8, 852063, 0, 8, 786527, 0, 8, 720991, 0, 8, 655455, 0, 8, 589919, 0, 8, 524383, 0, 8, 3080286, 0, 8, 3014750, 0, 8, 2949214, 0, 8, 2883678, 0, 8, 2818142, 0, 8, 2752606, 0, 8, 2687070, 0, 8, 2621534, 0, 8, 2555998, 0, 8, 2490462, 0, 8, 2424926, 0, 8, 2359390, 0, 8, 2293854, 0, 8, 2228318, 0, 8, 2162782, 0, 8, 2097246, 0, 8, 2031710, 0, 8, 1966174, 0, 8, 1900638, 0, 8, 1835102, 0, 8, 1769566, 0, 8, 1704030, 0, 8, 1638494, 0, 8, 1572958, 0, 8, 1507422, 0, 8, 1441886, 0, 8, 1376350, 0, 8, 1310814, 0, 8, 1245278, 0, 8, 1179742, 0, 8, 1114206, 0, 8, 1048670, 0, 8, 983134, 0, 8, 917598, 0, 8, 852062, 0, 8, 786526, 0, 8, 720990, 0, 8, 655454, 0, 8, 589918, 0, 8, 524382, 0, 8, 3080285, 0, 8, 3014749, 0, 8, 2949213, 0, 8, 2883677, 0, 8, 2818141, 0, 8, 2752605, 0, 8, 2687069, 0, 8, 2621533, 0, 8, 2555997, 0, 8, 2490461, 0, 8, 2424925, 0, 8, 2359389, 0, 8, 2293853, 0, 8, 2228317, 0, 8, 2162781, 0, 8, 2097245, 0, 8, 2031709, 0, 8, 1966173, 0, 8, 1900637, 0, 8, 1835101, 0, 8, 1769565, 0, 8, 1704029, 0, 8, 1638493, 0, 8, 1572957, 0, 8, 1507421, 0, 8, 1441885, 0, 8, 1376349, 0, 8, 1310813, 0, 8, 1245277, 0, 8, 1179741, 0, 8, 1114205, 0, 8, 1048669, 0, 8, 983133, 0, 8, 917597, 0, 8, 852061, 0, 8, 786525, 0, 8, 720989, 0, 8, 655453, 0, 8, 589917, 0, 8, 524381, 0, 8, 3080284, 0, 8, 3014748, 0, 8, 2949212, 0, 8, 2883676, 0, 8, 2818140, 0, 8, 2752604, 0, 8, 2687068, 0, 8, 2621532, 0, 8, 2555996, 0, 8, 2490460, 0, 8, 2424924, 0, 8, 2359388, 0, 8, 2293852, 0, 8, 2228316, 0, 8, 2162780, 0, 8, 2097244, 0, 8, 2031708, 0, 8, 1966172, 0, 8, 1900636, 0, 8, 1835100, 0, 8, 1769564, 0, 8, 1704028, 0, 8, 1638492, 0, 8, 1572956, 0, 8, 1507420, 0, 8, 1441884, 0, 8, 1376348, 0, 8, 1310812, 0, 8, 1245276, 0, 8, 1179740, 0, 8, 1114204, 0, 8, 1048668, 0, 8, 983132, 0, 8, 917596, 0, 8, 852060, 0, 8, 786524, 0, 8, 720988, 0, 8, 655452, 0, 8, 589916, 0, 8, 524380, 0, 8, 3080283, 0, 8, 3014747, 0, 8, 2949211, 0, 8, 2883675, 0, 8, 2818139, 0, 8, 2752603, 0, 8, 2687067, 0, 8, 2621531, 0, 8, 2555995, 0, 8, 2490459, 0, 8, 2424923, 0, 8, 2359387, 0, 8, 2293851, 0, 8, 2228315, 0, 8, 2162779, 0, 8, 2097243, 0, 8, 2031707, 0, 8, 1966171, 0, 8, 1900635, 0, 8, 1835099, 0, 8, 1769563, 0, 8, 1704027, 0, 8, 1638491, 0, 8, 1572955, 0, 8, 1507419, 0, 8, 1441883, 0, 8, 1376347, 0, 8, 1310811, 0, 8, 1245275, 0, 8, 1179739, 0, 8, 1114203, 0, 8, 1048667, 0, 8, 983131, 0, 8, 917595, 0, 8, 852059, 0, 8, 786523, 0, 8, 720987, 0, 8, 655451, 0, 8, 589915, 0, 8, 524379, 0, 8, 3080282, 0, 8, 3014746, 0, 8, 2949210, 0, 8, 2883674, 0, 8, 2818138, 0, 8, 2752602, 0, 8, 2687066, 0, 8, 2621530, 0, 8, 2555994, 0, 8, 2490458, 0, 8, 2424922, 0, 8, 2359386, 0, 8, 2293850, 0, 8, 2228314, 0, 8, 2162778, 0, 8, 2097242, 0, 8, 2031706, 0, 8, 1966170, 0, 8, 1900634, 0, 8, 1835098, 0, 8, 1769562, 0, 8, 1704026, 0, 8, 1638490, 0, 8, 1572954, 0, 8, 1507418, 0, 8, 1441882, 0, 8, 1376346, 0, 8, 1310810, 0, 8, 1245274, 0, 8, 1179738, 0, 8, 1114202, 0, 8, 1048666, 0, 8, 983130, 0, 8, 917594, 0, 8, 852058, 0, 8, 786522, 0, 8, 720986, 0, 8, 655450, 0, 8, 589914, 0, 8, 524378, 0, 8, 3080281, 0, 8, 3014745, 0, 8, 2949209, 0, 8, 2883673, 0, 8, 2818137, 0, 8, 2752601, 0, 8, 2687065, 0, 8, 2621529, 0, 8, 2555993, 0, 8, 2490457, 0, 8, 2424921, 0, 8, 2359385, 0, 8, 2293849, 0, 8, 2228313, 0, 8, 2162777, 0, 8, 2097241, 0, 8, 2031705, 0, 8, 1966169, 0, 8, 1900633, 0, 8, 1835097, 0, 8, 1769561, 0, 8, 1704025, 0, 8, 1638489, 0, 8, 1572953, 0, 8, 1507417, 0, 8, 1441881, 0, 8, 1376345, 0, 8, 1310809, 0, 8, 1245273, 0, 8, 1179737, 0, 8, 1114201, 0, 8, 1048665, 0, 8, 983129, 0, 8, 917593, 0, 8, 852057, 0, 8, 786521, 0, 8, 720985, 0, 8, 655449, 0, 8, 589913, 0, 8, 524377, 0, 8, 3080280, 0, 8, 3014744, 0, 8, 2949208, 0, 8, 2883672, 0, 8, 2818136, 0, 8, 2752600, 0, 8, 2687064, 0, 8, 2621528, 0, 8, 2555992, 0, 8, 2490456, 0, 8, 2424920, 0, 8, 2359384, 0, 8, 2293848, 0, 8, 2228312, 0, 8, 2162776, 0, 8, 2097240, 0, 8, 2031704, 0, 8, 1966168, 0, 8, 1900632, 0, 8, 1835096, 0, 8, 1769560, 0, 8, 1704024, 0, 8, 1638488, 0, 8, 1572952, 0, 8, 1507416, 0, 8, 1441880, 0, 8, 1376344, 0, 8, 1310808, 0, 8, 1245272, 0, 8, 1179736, 0, 8, 1114200, 0, 8, 1048664, 0, 8, 983128, 0, 8, 917592, 0, 8, 852056, 0, 8, 786520, 0, 8, 720984, 0, 8, 655448, 0, 8, 589912, 0, 8, 524376, 0, 8, 3080279, 0, 8, 3014743, 0, 8, 2949207, 0, 8, 2883671, 0, 8, 2818135, 0, 8, 2752599, 0, 8, 2687063, 0, 8, 2621527, 0, 8, 2555991, 0, 8, 2490455, 0, 8, 2424919, 0, 8, 2359383, 0, 8, 2293847, 0, 8, 2228311, 0, 8, 2162775, 0, 8, 2097239, 0, 8, 2031703, 0, 8, 1966167, 0, 8, 1900631, 0, 8, 1835095, 0, 8, 1769559, 0, 8, 1704023, 0, 8, 1638487, 0, 8, 1572951, 0, 8, 1507415, 0, 8, 1441879, 0, 8, 1376343, 0, 8, 1310807, 0, 8, 1245271, 0, 8, 1179735, 0, 8, 1114199, 0, 8, 1048663, 0, 8, 983127, 0, 8, 917591, 0, 8, 852055, 0, 8, 786519, 0, 8, 720983, 0, 8, 655447, 0, 8, 589911, 0, 8, 524375, 0, 8, 3080278, 0, 8, 3014742, 0, 8, 2949206, 0, 8, 2883670, 0, 8, 2818134, 0, 8, 2752598, 0, 8, 2687062, 0, 8, 2621526, 0, 8, 2555990, 0, 8, 2490454, 0, 8, 2424918, 0, 8, 2359382, 0, 8, 2293846, 0, 8, 2228310, 0, 8, 2162774, 0, 8, 2097238, 0, 8, 2031702, 0, 8, 1966166, 0, 8, 1900630, 0, 8, 1835094, 0, 8, 1769558, 0, 8, 1704022, 0, 8, 1638486, 0, 8, 1572950, 0, 8, 1507414, 0, 8, 1441878, 0, 8, 1376342, 0, 8, 1310806, 0, 8, 1245270, 0, 8, 1179734, 0, 8, 1114198, 0, 8, 1048662, 0, 8, 983126, 0, 8, 917590, 0, 8, 852054, 0, 8, 786518, 0, 8, 720982, 0, 8, 655446, 0, 8, 589910, 0, 8, 524374, 0, 8, 3080277, 0, 8, 3014741, 0, 8, 2949205, 0, 8, 2883669, 0, 8, 2818133, 0, 8, 2752597, 0, 8, 2687061, 0, 8, 2621525, 0, 8, 2555989, 0, 8, 2490453, 0, 8, 2424917, 0, 8, 2359381, 0, 8, 2293845, 0, 8, 2228309, 0, 8, 2162773, 0, 8, 2097237, 0, 8, 2031701, 0, 8, 1966165, 0, 8, 1900629, 0, 8, 1835093, 0, 8, 1769557, 0, 8, 1704021, 0, 8, 1638485, 0, 8, 1572949, 0, 8, 1507413, 0, 8, 1441877, 0, 8, 1376341, 0, 8, 1310805, 0, 8, 1245269, 0, 8, 1179733, 0, 8, 1114197, 0, 8, 1048661, 0, 8, 983125, 0, 8, 917589, 0, 8, 852053, 0, 8, 786517, 0, 8, 720981, 0, 8, 655445, 0, 8, 589909, 0, 8, 524373, 0, 8, 3080276, 0, 8, 3014740, 0, 8, 2949204, 0, 8, 2883668, 0, 8, 2818132, 0, 8, 2752596, 0, 8, 2687060, 0, 8, 2621524, 0, 8, 2555988, 0, 8, 2490452, 0, 8, 2424916, 0, 8, 2359380, 0, 8, 2293844, 0, 8, 2228308, 0, 8, 2162772, 0, 8, 2097236, 0, 8, 2031700, 0, 8, 1966164, 0, 8, 1900628, 0, 8, 1835092, 0, 8, 1769556, 0, 8, 1704020, 0, 8, 1638484, 0, 8, 1572948, 0, 8, 1507412, 0, 8, 1441876, 0, 8, 1376340, 0, 8, 1310804, 0, 8, 1245268, 0, 8, 1179732, 0, 8, 1114196, 0, 8, 1048660, 0, 8, 983124, 0, 8, 917588, 0, 8, 852052, 0, 8, 786516, 0, 8, 720980, 0, 8, 655444, 0, 8, 589908, 0, 8, 524372, 0, 8, 3080275, 0, 8, 3014739, 0, 8, 2949203, 0, 8, 2883667, 0, 8, 2818131, 0, 8, 2752595, 0, 8, 2687059, 0, 8, 2621523, 0, 8, 2555987, 0, 8, 2490451, 0, 8, 2424915, 0, 8, 2359379, 0, 8, 2293843, 0, 8, 2228307, 0, 8, 2162771, 0, 8, 2097235, 0, 8, 2031699, 0, 8, 1966163, 0, 8, 1900627, 0, 8, 1835091, 0, 8, 1769555, 0, 8, 1704019, 0, 8, 1638483, 0, 8, 1572947, 0, 8, 1507411, 0, 8, 1441875, 0, 8, 1376339, 0, 8, 1310803, 0, 8, 1245267, 0, 8, 1179731, 0, 8, 1114195, 0, 8, 1048659, 0, 8, 983123, 0, 8, 917587, 0, 8, 852051, 0, 8, 786515, 0, 8, 720979, 0, 8, 655443, 0, 8, 589907, 0, 8, 524371, 0, 8, 3080274, 0, 8, 3014738, 0, 8, 2949202, 0, 8, 2883666, 0, 8, 2818130, 0, 8, 2752594, 0, 8, 2687058, 0, 8, 2621522, 0, 8, 2555986, 0, 8, 2490450, 0, 8, 2424914, 0, 8, 2359378, 0, 8, 2293842, 0, 8, 2228306, 0, 8, 2162770, 0, 8, 2097234, 0, 8, 2031698, 0, 8, 1966162, 0, 8, 1900626, 0, 8, 1835090, 0, 8, 1769554, 0, 8, 1704018, 0, 8, 1638482, 0, 8, 1572946, 0, 8, 1507410, 0, 8, 1441874, 0, 8, 1376338, 0, 8, 1310802, 0, 8, 1245266, 0, 8, 1179730, 0, 8, 1114194, 0, 8, 1048658, 0, 8, 983122, 0, 8, 917586, 0, 8, 852050, 0, 8, 786514, 0, 8, 720978, 0, 8, 655442, 0, 8, 589906, 0, 8, 524370, 0, 8, 3080273, 0, 8, 3014737, 0, 8, 2949201, 0, 8, 2883665, 0, 8, 2818129, 0, 8, 2752593, 0, 8, 2687057, 0, 8, 2621521, 0, 8, 2555985, 0, 8, 2490449, 0, 8, 2424913, 0, 8, 2359377, 0, 8, 2293841, 0, 8, 2228305, 0, 8, 2162769, 0, 8, 2097233, 0, 8, 2031697, 0, 8, 1966161, 0, 8, 1900625, 0, 8, 1835089, 0, 8, 1769553, 0, 8, 1704017, 0, 8, 1638481, 0, 8, 1572945, 0, 8, 1507409, 0, 8, 1441873, 0, 8, 1376337, 0, 8, 1310801, 0, 8, 1245265, 0, 8, 1179729, 0, 8, 1114193, 0, 8, 1048657, 0, 8, 983121, 0, 8, 917585, 0, 8, 852049, 0, 8, 786513, 0, 8, 720977, 0, 8, 655441, 0, 8, 589905, 0, 8, 524369, 0, 8, 3080272, 0, 8, 3014736, 0, 8, 2949200, 0, 8, 2883664, 0, 8, 2818128, 0, 8, 2752592, 0, 8, 2687056, 0, 8, 2621520, 0, 8, 2555984, 0, 8, 2490448, 0, 8, 2424912, 0, 8, 2359376, 0, 8, 2293840, 0, 8, 2228304, 0, 8, 2162768, 0, 8, 2097232, 0, 8, 2031696, 0, 8, 1966160, 0, 8, 1900624, 0, 8, 1835088, 0, 8, 1769552, 0, 8, 1704016, 0, 8, 1638480, 0, 8, 1572944, 0, 8, 1507408, 0, 8, 1441872, 0, 8, 1376336, 0, 8, 1310800, 0, 8, 1245264, 0, 8, 1179728, 0, 8, 1114192, 0, 8, 1048656, 0, 8, 983120, 0, 8, 917584, 0, 8, 852048, 0, 8, 786512, 0, 8, 720976, 0, 8, 655440, 0, 8, 589904, 0, 8, 524368, 0, 8, 3080271, 0, 8, 3014735, 0, 8, 2949199, 0, 8, 2883663, 0, 8, 2818127, 0, 8, 2752591, 0, 8, 2687055, 0, 8, 2621519, 0, 8, 2555983, 0, 8, 2490447, 0, 8, 2424911, 0, 8, 2359375, 0, 8, 2293839, 0, 8, 2228303, 0, 8, 2162767, 0, 8, 2097231, 0, 8, 2031695, 0, 8, 1966159, 0, 8, 1900623, 0, 8, 1835087, 0, 8, 1769551, 0, 8, 1704015, 0, 8, 1638479, 0, 8, 1572943, 0, 8, 1507407, 0, 8, 1441871, 0, 8, 1376335, 0, 8, 1310799, 0, 8, 1245263, 0, 8, 1179727, 0, 8, 1114191, 0, 8, 1048655, 0, 8, 983119, 0, 8, 917583, 0, 8, 852047, 0, 8, 786511, 0, 8, 720975, 0, 8, 655439, 0, 8, 589903, 0, 8, 524367, 0, 8, 3080270, 0, 8, 3014734, 0, 8, 2949198, 0, 8, 2883662, 0, 8, 2818126, 0, 8, 2752590, 0, 8, 2687054, 0, 8, 2621518, 0, 8, 2555982, 0, 8, 2490446, 0, 8, 2424910, 0, 8, 2359374, 0, 8, 2293838, 0, 8, 2228302, 0, 8, 2162766, 0, 8, 2097230, 0, 8, 2031694, 0, 8, 1966158, 0, 8, 1900622, 0, 8, 1835086, 0, 8, 1769550, 0, 8, 1704014, 0, 8, 1638478, 0, 8, 1572942, 0, 8, 1507406, 0, 8, 1441870, 0, 8, 1376334, 0, 8, 1310798, 0, 8, 1245262, 0, 8, 1179726, 0, 8, 1114190, 0, 8, 1048654, 0, 8, 983118, 0, 8, 917582, 0, 8, 852046, 0, 8, 786510, 0, 8, 720974, 0, 8, 655438, 0, 8, 589902, 0, 8, 524366, 0, 8, 3080269, 0, 8, 3014733, 0, 8, 2949197, 0, 8, 2883661, 0, 8, 2818125, 0, 8, 2752589, 0, 8, 2687053, 0, 8, 2621517, 0, 8, 2555981, 0, 8, 2490445, 0, 8, 2424909, 0, 8, 2359373, 0, 8, 2293837, 0, 8, 2228301, 0, 8, 2162765, 0, 8, 2097229, 0, 8, 2031693, 0, 8, 1966157, 0, 8, 1900621, 0, 8, 1835085, 0, 8, 1769549, 0, 8, 1704013, 0, 8, 1638477, 0, 8, 1572941, 0, 8, 1507405, 0, 8, 1441869, 0, 8, 1376333, 0, 8, 1310797, 0, 8, 1245261, 0, 8, 1179725, 0, 8, 1114189, 0, 8, 1048653, 0, 8, 983117, 0, 8, 917581, 0, 8, 852045, 0, 8, 786509, 0, 8, 720973, 0, 8, 655437, 0, 8, 589901, 0, 8, 524365, 0, 8, 3080268, 0, 8, 3014732, 0, 8, 2949196, 0, 8, 2883660, 0, 8, 2818124, 0, 8, 2752588, 0, 8, 2687052, 0, 8, 2621516, 0, 8, 2555980, 0, 8, 2490444, 0, 8, 2424908, 0, 8, 2359372, 0, 8, 2293836, 0, 8, 2228300, 0, 8, 2162764, 0, 8, 2097228, 0, 8, 2031692, 0, 8, 1966156, 0, 8, 1900620, 0, 8, 1835084, 0, 8, 1769548, 0, 8, 1704012, 0, 8, 1638476, 0, 8, 1572940, 0, 8, 1507404, 0, 8, 1441868, 0, 8, 1376332, 0, 8, 1310796, 0, 8, 1245260, 0, 8, 1179724, 0, 8, 1114188, 0, 8, 1048652, 0, 8, 983116, 0, 8, 917580, 0, 8, 852044, 0, 8, 786508, 0, 8, 720972, 0, 8, 655436, 0, 8, 589900, 0, 8, 524364, 0, 8, 3080267, 0, 8, 3014731, 0, 8, 2949195, 0, 8, 2883659, 0, 8, 2818123, 0, 8, 2752587, 0, 8, 2687051, 0, 8, 2621515, 0, 8, 2555979, 0, 8, 2490443, 0, 8, 2424907, 0, 8, 2359371, 0, 8, 2293835, 0, 8, 2228299, 0, 8, 2162763, 0, 8, 2097227, 0, 8, 2031691, 0, 8, 1966155, 0, 8, 1900619, 0, 8, 1835083, 0, 8, 1769547, 0, 8, 1704011, 0, 8, 1638475, 0, 8, 1572939, 0, 8, 1507403, 0, 8, 1441867, 0, 8, 1376331, 0, 8, 1310795, 0, 8, 1245259, 0, 8, 1179723, 0, 8, 1114187, 0, 8, 1048651, 0, 8, 983115, 0, 8, 917579, 0, 8, 852043, 0, 8, 786507, 0, 8, 720971, 0, 8, 655435, 0, 8, 589899, 0, 8, 524363, 0, 8, 3080266, 0, 8, 3014730, 0, 8, 2949194, 0, 8, 2883658, 0, 8, 2818122, 0, 8, 2752586, 0, 8, 2687050, 0, 8, 2621514, 0, 8, 2555978, 0, 8, 2490442, 0, 8, 2424906, 0, 8, 2359370, 0, 8, 2293834, 0, 8, 2228298, 0, 8, 2162762, 0, 8, 2097226, 0, 8, 2031690, 0, 8, 1966154, 0, 8, 1900618, 0, 8, 1835082, 0, 8, 1769546, 0, 8, 1704010, 0, 8, 1638474, 0, 8, 1572938, 0, 8, 1507402, 0, 8, 1441866, 0, 8, 1376330, 0, 8, 1310794, 0, 8, 1245258, 0, 8, 1179722, 0, 8, 1114186, 0, 8, 1048650, 0, 8, 983114, 0, 8, 917578, 0, 8, 852042, 0, 8, 786506, 0, 8, 720970, 0, 8, 655434, 0, 8, 589898, 0, 8, 524362, 0, 8, 3080265, 0, 8, 3014729, 0, 8, 2949193, 0, 8, 2883657, 0, 8, 2818121, 0, 8, 2752585, 0, 8, 2687049, 0, 8, 2621513, 0, 8, 2555977, 0, 8, 2490441, 0, 8, 2424905, 0, 8, 2359369, 0, 8, 2293833, 0, 8, 2228297, 0, 8, 2162761, 0, 8, 2097225, 0, 8, 2031689, 0, 8, 1966153, 0, 8, 1900617, 0, 8, 1835081, 0, 8, 1769545, 0, 8, 1704009, 0, 8, 1638473, 0, 8, 1572937, 0, 8, 1507401, 0, 8, 1441865, 0, 8, 1376329, 0, 8, 1310793, 0, 8, 1245257, 0, 8, 1179721, 0, 8, 1114185, 0, 8, 1048649, 0, 8, 983113, 0, 8, 917577, 0, 8, 852041, 0, 8, 786505, 0, 8, 720969, 0, 8, 655433, 0, 8, 589897, 0, 8, 524361, 0, 8, 3080264, 0, 8, 3014728, 0, 8, 2949192, 0, 8, 2883656, 0, 8, 2818120, 0, 8, 2752584, 0, 8, 2687048, 0, 8, 2621512, 0, 8, 2555976, 0, 8, 2490440, 0, 8, 2424904, 0, 8, 2359368, 0, 8, 2293832, 0, 8, 2228296, 0, 8, 2162760, 0, 8, 2097224, 0, 8, 2031688, 0, 8, 1966152, 0, 8, 1900616, 0, 8, 1835080, 0, 8, 1769544, 0, 8, 1704008, 0, 8, 1638472, 0, 8, 1572936, 0, 8, 1507400, 0, 8, 1441864, 0, 8, 1376328, 0, 8, 1310792, 0, 8, 1245256, 0, 8, 1179720, 0, 8, 1114184, 0, 8, 1048648, 0, 8, 983112, 0, 8, 917576, 0, 8, 852040, 0, 8, 786504, 0, 8, 720968, 0, 8, 655432, 0, 8, 589896, 0, 8, 524360, 0, 8, 3080263, 0, 8, 3014727, 0, 8, 2949191, 0, 8, 2883655, 0, 8, 2818119, 0, 8, 2752583, 0, 8, 2687047, 0, 8, 2621511, 0, 8, 2555975, 0, 8, 2490439, 0, 8, 2424903, 0, 8, 2359367, 0, 8, 2293831, 0, 8, 2228295, 0, 8, 2162759, 0, 8, 2097223, 0, 8, 2031687, 0, 8, 1966151, 0, 8, 1900615, 0, 8, 1835079, 0, 8, 1769543, 0, 8, 1704007, 0, 8, 1638471, 0, 8, 1572935, 0, 8, 1507399, 0, 8, 1441863, 0, 8, 1376327, 0, 8, 1310791, 0, 8, 1245255, 0, 8, 1179719, 0, 8, 1114183, 0, 8, 1048647, 0, 8, 983111, 0, 8, 917575, 0, 8, 852039, 0, 8, 786503, 0, 8, 720967, 0, 8, 655431, 0, 8, 589895, 0, 8, 524359, 0, 8, 3080262, 0, 8, 3014726, 0, 8, 2949190, 0, 8, 2883654, 0, 8, 2818118, 0, 8, 2752582, 0, 8, 2687046, 0, 8, 2621510, 0, 8, 2555974, 0, 8, 2490438, 0, 8, 2424902, 0, 8, 2359366, 0, 8, 2293830, 0, 8, 2228294, 0, 8, 2162758, 0, 8, 2097222, 0, 8, 2031686, 0, 8, 1966150, 0, 8, 1900614, 0, 8, 1835078, 0, 8, 1769542, 0, 8, 1704006, 0, 8, 1638470, 0, 8, 1572934, 0, 8, 1507398, 0, 8, 1441862, 0, 8, 1376326, 0, 8, 1310790, 0, 8, 1245254, 0, 8, 1179718, 0, 8, 1114182, 0, 8, 1048646, 0, 8, 983110, 0, 8, 917574, 0, 8, 852038, 0, 8, 786502, 0, 8, 720966, 0, 8, 655430, 0, 8, 589894, 0, 8, 524358, 0, 8, 3080261, 0, 8, 3014725, 0, 8, 2949189, 0, 8, 2883653, 0, 8, 2818117, 0, 8, 2752581, 0, 8, 2687045, 0, 8, 2621509, 0, 8, 2555973, 0, 8, 2490437, 0, 8, 2424901, 0, 8, 2359365, 0, 8, 2293829, 0, 8, 2228293, 0, 8, 2162757, 0, 8, 2097221, 0, 8, 2031685, 0, 8, 1966149, 0, 8, 1900613, 0, 8, 1835077, 0, 8, 1769541, 0, 8, 1704005, 0, 8, 1638469, 0, 8, 1572933, 0, 8, 1507397, 0, 8, 1441861, 0, 8, 1376325, 0, 8, 1310789, 0, 8, 1245253, 0, 8, 1179717, 0, 8, 1114181, 0, 8, 1048645, 0, 8, 983109, 0, 8, 917573, 0, 8, 852037, 0, 8, 786501, 0, 8, 720965, 0, 8, 655429, 0, 8, 589893, 0, 8, 524357, 0, 8, 3080260, 0, 8, 3014724, 0, 8, 2949188, 0, 8, 2883652, 0, 8, 2818116, 0, 8, 2752580, 0, 8, 2687044, 0, 8, 2621508, 0, 8, 2555972, 0, 8, 2490436, 0, 8, 2424900, 0, 8, 2359364, 0, 8, 2293828, 0, 8, 2228292, 0, 8, 2162756, 0, 8, 2097220, 0, 8, 2031684, 0, 8, 1966148, 0, 8, 1900612, 0, 8, 1835076, 0, 8, 1769540, 0, 8, 1704004, 0, 8, 1638468, 0, 8, 1572932, 0, 8, 1507396, 0, 8, 1441860, 0, 8, 1376324, 0, 8, 1310788, 0, 8, 1245252, 0, 8, 1179716, 0, 8, 1114180, 0, 8, 1048644, 0, 8, 983108, 0, 8, 917572, 0, 8, 852036, 0, 8, 786500, 0, 8, 720964, 0, 8, 655428, 0, 8, 589892, 0, 8, 524356, 0, 8, 3080259, 0, 8, 3014723, 0, 8, 2949187, 0, 8, 2883651, 0, 8, 2818115, 0, 8, 2752579, 0, 8, 2687043, 0, 8, 2621507, 0, 8, 2555971, 0, 8, 2490435, 0, 8, 2424899, 0, 8, 2359363, 0, 8, 2293827, 0, 8, 2228291, 0, 8, 2162755, 0, 8, 2097219, 0, 8, 2031683, 0, 8, 1966147, 0, 8, 1900611, 0, 8, 1835075, 0, 8, 1769539, 0, 8, 1704003, 0, 8, 1638467, 0, 8, 1572931, 0, 8, 1507395, 0, 8, 1441859, 0, 8, 1376323, 0, 8, 1310787, 0, 8, 1245251, 0, 8, 1179715, 0, 8, 1114179, 0, 8, 1048643, 0, 8, 983107, 0, 8, 917571, 0, 8, 852035, 0, 8, 786499, 0, 8, 720963, 0, 8, 655427, 0, 8, 589891, 0, 8, 524355, 0, 8, 589890, 0, 8, 458818, 0, 8, 458820, 0, 8, 655426, 0, 8, 524354, 0, 8, 720962, 0, 8, 786498, 0, 8, 852034, 0, 8, 917570, 0, 8, 983106, 0, 8, 1048642, 0, 8, 1114178, 0, 8, 1179714, 0, 8, 1245250, 0, 8, 1310786, 0, 8, 1376322, 0, 8, 1441858, 0, 8, 1507394, 0, 8, 1572930, 196608, 2, 1638466, 196608, 3, 1704002, 196608, 3, 1769538, 196608, 3, 1835074, 196608, 3, 1900610, 196608, 3, 1966146, 196608, 3, 2031682, 196608, 3, 2097218, 196608, 7, 2162754, 0, 8, 2228290, 0, 8, 2293826, 0, 8, 2359362, 0, 8, 2424898, 0, 8, 2490434, 0, 8, 2555970, 0, 8, 2621506, 0, 8, 2687042, 0, 8, 2752578, 0, 8, 2818114, 0, 8, 2883650, 0, 8, 2949186, 0, 8, 3014722, 0, 8, 3080258, 0, 8, 458819, 0, 8, 458821, 0, 8, 458822, 0, 8, 458823, 0, 8, 458824, 0, 8, 458825, 0, 8, 458826, 0, 8, 458827, 0, 8, 458828, 65536, 7, 458829, 131072, 7, 458830, 131072, 7, 458831, 131072, 7, 458832, 131072, 7, 458833, 131072, 7, 458834, 131072, 7, 458835, 131072, 7, 458836, 131072, 7, 458837, 131072, 7, 458838, 131072, 7, 458839, 131072, 7, 458840, 131072, 7, 458841, 131072, 7, 458842, 131072, 7, 458843, 131072, 7, 458844, 131072, 7, 458845, 131072, 7, 458846, 131072, 7, 458847, 131072, 7, 458848, 131072, 7, 458849, 131072, 7, 458850, 131072, 7, 458851, 131072, 7, 458852, 131072, 7, 458853, 131072, 7, 458854, 131072, 7, 458855, 131072, 7, 589928, 65536, 3, 458856, 65536, 4, 655464, 65536, 3, 524392, 65536, 3, 721000, 65536, 3, 786536, 65536, 3, 852072, 65536, 3, 917608, 65536, 7, 983144, 0, 8, 1048680, 0, 8, 1114216, 0, 8, 1179752, 0, 8, 1245288, 0, 8, 1310824, 0, 8, 1376360, 0, 8, 1441896, 0, 8, 1507432, 0, 8, 1572968, 0, 8, 1638504, 0, 8, 1704040, 0, 8, 1769576, 0, 8, 1835112, 0, 8, 1900648, 0, 8, 1966184, 0, 8, 2031720, 0, 8, 2097256, 0, 8, 2162792, 0, 8, 2228328, 0, 8, 2293864, 65536, 2, 2359400, 65536, 3, 2424936, 65536, 3, 2490472, 65536, 3, 2556008, 65536, 3, 2621544, 65536, 3, 2687080, 65536, 3, 2752616, 65536, 3, 2818152, 65536, 3, 2883688, 65536, 3, 2949224, 65536, 3, 3014760, 65536, 3, 3080296, 65536, 3, 2424897, 0, 8, 2359361, 0, 8, 2293825, 0, 8, 2228289, 0, 8, 2162753, 0, 8, 2424896, 0, 8, 2359360, 0, 8, 2293824, 0, 8, 2228288, 0, 8, 2162752, 0, 8, 2424895, 0, 8, 2359359, 0, 8, 2293823, 0, 8, 2228287, 0, 8, 2162751, 0, 8, 2424894, 0, 8, 2359358, 0, 8, 2293822, 0, 8, 2228286, 0, 8, 2162750, 0, 8, 2424893, 0, 8, 2359357, 0, 8, 2293821, 0, 8, 2228285, 0, 8, 2162749, 0, 8, 2424892, 0, 8, 2359356, 0, 8, 2293820, 0, 8, 2228284, 0, 8, 2162748, 0, 8, 2424891, 0, 8, 2359355, 0, 8, 2293819, 0, 8, 2228283, 0, 8, 2162747, 0, 8, 2424890, 0, 8, 2359354, 0, 8, 2293818, 0, 8, 2228282, 0, 8, 2162746, 0, 8, 2424889, 0, 8, 2359353, 0, 8, 2293817, 0, 8, 2228281, 0, 8, 2162745, 0, 8, 2424888, 0, 8, 2359352, 0, 8, 2293816, 0, 8, 2228280, 0, 8, 2162744, 0, 8, 2424887, 0, 8, 2359351, 0, 8, 2293815, 0, 8, 2228279, 0, 8, 2162743, 0, 8, 2424886, 0, 8, 2359350, 0, 8, 2293814, 0, 8, 2228278, 0, 8, 2162742, 0, 8, 2424885, 0, 8, 2359349, 0, 8, 2293813, 0, 8, 2228277, 0, 8, 2162741, 0, 8, 2424884, 0, 8, 2359348, 0, 8, 2293812, 0, 8, 2228276, 0, 8, 2162740, 0, 8, 2424883, 0, 8, 2359347, 0, 8, 2293811, 0, 8, 2228275, 0, 8, 2162739, 0, 8, 2424882, 0, 8, 2359346, 0, 8, 2293810, 0, 8, 2228274, 0, 8, 2162738, 0, 8, 2424881, 0, 8, 2359345, 0, 8, 2293809, 0, 8, 2228273, 0, 8, 2162737, 0, 8, 2424880, 0, 8, 2359344, 0, 8, 2293808, 0, 8, 2228272, 0, 8, 2162736, 0, 8, 2424879, 0, 8, 2359343, 0, 8, 2293807, 0, 8, 2228271, 0, 8, 2162735, 0, 8, 2424878, 0, 8, 2359342, 0, 8, 2293806, 0, 8, 2228270, 0, 8, 2162734, 0, 8, 2424877, 0, 8, 2359341, 0, 8, 2293805, 0, 8, 2228269, 0, 8, 2162733, 0, 8, 2424876, 0, 8, 2359340, 0, 8, 2293804, 0, 8, 2228268, 0, 8, 2162732, 0, 8, 2424875, 0, 8, 2359339, 0, 8, 2293803, 0, 8, 2228267, 0, 8, 2162731, 0, 8, 2424874, 0, 8, 2359338, 0, 8, 2293802, 0, 8, 2228266, 0, 8, 2162730, 0, 8, 2228265, 196608, 3, 2097193, 196608, 4, 2097195, 131072, 7, 2293801, 196608, 3, 2162729, 196608, 3, 2359337, 196608, 3, 2424873, 196608, 3, 2097194, 131072, 7, 2097196, 131072, 7, 2097197, 131072, 7, 2097198, 131072, 7, 2097199, 131072, 7, 2097200, 131072, 7, 2097201, 131072, 7, 2097202, 131072, 7, 2097203, 131072, 7, 2097204, 131072, 7, 2097205, 131072, 7, 2097206, 131072, 7, 2097207, 131072, 7, 2097208, 131072, 7, 2097209, 131072, 7, 2097210, 131072, 7, 2097211, 131072, 7, 2097212, 131072, 7, 2097213, 131072, 7, 2097214, 131072, 7, 2097215, 131072, 7, 2097216, 131072, 7, 2097217, 131072, 7, 2228361, 0, 8, 2162825, 0, 8, 2097289, 0, 8, 2031753, 0, 8, 1966217, 0, 8, 1900681, 0, 8, 1835145, 0, 8, 1769609, 0, 8, 1704073, 0, 8, 1638537, 0, 8, 1573001, 0, 8, 1507465, 0, 8, 1441929, 0, 8, 1376393, 0, 8, 1310857, 0, 8, 1245321, 0, 8, 1179785, 0, 8, 1114249, 0, 8, 1048713, 0, 8, 983177, 0, 8, 2228360, 0, 8, 2162824, 0, 8, 2097288, 0, 8, 2031752, 0, 8, 1966216, 0, 8, 1900680, 0, 8, 1835144, 0, 8, 1769608, 0, 8, 1704072, 0, 8, 1638536, 0, 8, 1573000, 0, 8, 1507464, 0, 8, 1441928, 0, 8, 1376392, 0, 8, 1310856, 0, 8, 1245320, 0, 8, 1179784, 0, 8, 1114248, 0, 8, 1048712, 0, 8, 983176, 0, 8, 2228359, 0, 8, 2162823, 0, 8, 2097287, 0, 8, 2031751, 0, 8, 1966215, 0, 8, 1900679, 0, 8, 1835143, 0, 8, 1769607, 0, 8, 1704071, 0, 8, 1638535, 0, 8, 1572999, 0, 8, 1507463, 0, 8, 1441927, 0, 8, 1376391, 0, 8, 1310855, 0, 8, 1245319, 0, 8, 1179783, 0, 8, 1114247, 0, 8, 1048711, 0, 8, 983175, 0, 8, 2228358, 0, 8, 2162822, 0, 8, 2097286, 0, 8, 2031750, 0, 8, 1966214, 0, 8, 1900678, 0, 8, 1835142, 0, 8, 1769606, 0, 8, 1704070, 0, 8, 1638534, 0, 8, 1572998, 0, 8, 1507462, 0, 8, 1441926, 0, 8, 1376390, 0, 8, 1310854, 0, 8, 1245318, 0, 8, 1179782, 0, 8, 1114246, 0, 8, 1048710, 0, 8, 983174, 0, 8, 2228357, 0, 8, 2162821, 0, 8, 2097285, 0, 8, 2031749, 0, 8, 1966213, 0, 8, 1900677, 0, 8, 1835141, 0, 8, 1769605, 0, 8, 1704069, 0, 8, 1638533, 0, 8, 1572997, 0, 8, 1507461, 0, 8, 1441925, 0, 8, 1376389, 0, 8, 1310853, 0, 8, 1245317, 0, 8, 1179781, 0, 8, 1114245, 0, 8, 1048709, 0, 8, 983173, 0, 8, 2228356, 0, 8, 2162820, 0, 8, 2097284, 0, 8, 2031748, 0, 8, 1966212, 0, 8, 1900676, 0, 8, 1835140, 0, 8, 1769604, 0, 8, 1704068, 0, 8, 1638532, 0, 8, 1572996, 0, 8, 1507460, 0, 8, 1441924, 0, 8, 1376388, 0, 8, 1310852, 0, 8, 1245316, 0, 8, 1179780, 0, 8, 1114244, 0, 8, 1048708, 0, 8, 983172, 0, 8, 2228355, 0, 8, 2162819, 0, 8, 2097283, 0, 8, 2031747, 0, 8, 1966211, 0, 8, 1900675, 0, 8, 1835139, 0, 8, 1769603, 0, 8, 1704067, 0, 8, 1638531, 0, 8, 1572995, 0, 8, 1507459, 0, 8, 1441923, 0, 8, 1376387, 0, 8, 1310851, 0, 8, 1245315, 0, 8, 1179779, 0, 8, 1114243, 0, 8, 1048707, 0, 8, 983171, 0, 8, 2228354, 0, 8, 2162818, 0, 8, 2097282, 0, 8, 2031746, 0, 8, 1966210, 0, 8, 1900674, 0, 8, 1835138, 0, 8, 1769602, 0, 8, 1704066, 0, 8, 1638530, 0, 8, 1572994, 0, 8, 1507458, 0, 8, 1441922, 0, 8, 1376386, 0, 8, 1310850, 0, 8, 1245314, 0, 8, 1179778, 0, 8, 1114242, 0, 8, 1048706, 0, 8, 983170, 0, 8, 2228353, 0, 8, 2162817, 0, 8, 2097281, 0, 8, 2031745, 0, 8, 1966209, 0, 8, 1900673, 0, 8, 1835137, 0, 8, 1769601, 0, 8, 1704065, 0, 8, 1638529, 0, 8, 1572993, 0, 8, 1507457, 0, 8, 1441921, 0, 8, 1376385, 0, 8, 1310849, 0, 8, 1245313, 0, 8, 1179777, 0, 8, 1114241, 0, 8, 1048705, 0, 8, 983169, 0, 8, 2228352, 0, 8, 2162816, 0, 8, 2097280, 0, 8, 2031744, 0, 8, 1966208, 0, 8, 1900672, 0, 8, 1835136, 0, 8, 1769600, 0, 8, 1704064, 0, 8, 1638528, 0, 8, 1572992, 0, 8, 1507456, 0, 8, 1441920, 0, 8, 1376384, 0, 8, 1310848, 0, 8, 1245312, 0, 8, 1179776, 0, 8, 1114240, 0, 8, 1048704, 0, 8, 983168, 0, 8, 2228351, 0, 8, 2162815, 0, 8, 2097279, 0, 8, 2031743, 0, 8, 1966207, 0, 8, 1900671, 0, 8, 1835135, 0, 8, 1769599, 0, 8, 1704063, 0, 8, 1638527, 0, 8, 1572991, 0, 8, 1507455, 0, 8, 1441919, 0, 8, 1376383, 0, 8, 1310847, 0, 8, 1245311, 0, 8, 1179775, 0, 8, 1114239, 0, 8, 1048703, 0, 8, 983167, 0, 8, 2228350, 0, 8, 2162814, 0, 8, 2097278, 0, 8, 2031742, 0, 8, 1966206, 0, 8, 1900670, 0, 8, 1835134, 0, 8, 1769598, 0, 8, 1704062, 0, 8, 1638526, 0, 8, 1572990, 0, 8, 1507454, 0, 8, 1441918, 0, 8, 1376382, 0, 8, 1310846, 0, 8, 1245310, 0, 8, 1179774, 0, 8, 1114238, 0, 8, 1048702, 0, 8, 983166, 0, 8, 2228349, 0, 8, 2162813, 0, 8, 2097277, 0, 8, 2031741, 0, 8, 1966205, 0, 8, 1900669, 0, 8, 1835133, 0, 8, 1769597, 0, 8, 1704061, 0, 8, 1638525, 0, 8, 1572989, 0, 8, 1507453, 0, 8, 1441917, 0, 8, 1376381, 0, 8, 1310845, 0, 8, 1245309, 0, 8, 1179773, 0, 8, 1114237, 0, 8, 1048701, 0, 8, 983165, 0, 8, 2228348, 0, 8, 2162812, 0, 8, 2097276, 0, 8, 2031740, 0, 8, 1966204, 0, 8, 1900668, 0, 8, 1835132, 0, 8, 1769596, 0, 8, 1704060, 0, 8, 1638524, 0, 8, 1572988, 0, 8, 1507452, 0, 8, 1441916, 0, 8, 1376380, 0, 8, 1310844, 0, 8, 1245308, 0, 8, 1179772, 0, 8, 1114236, 0, 8, 1048700, 0, 8, 983164, 0, 8, 2228347, 0, 8, 2162811, 0, 8, 2097275, 0, 8, 2031739, 0, 8, 1966203, 0, 8, 1900667, 0, 8, 1835131, 0, 8, 1769595, 0, 8, 1704059, 0, 8, 1638523, 0, 8, 1572987, 0, 8, 1507451, 0, 8, 1441915, 0, 8, 1376379, 0, 8, 1310843, 0, 8, 1245307, 0, 8, 1179771, 0, 8, 1114235, 0, 8, 1048699, 0, 8, 983163, 0, 8, 2228346, 0, 8, 2162810, 0, 8, 2097274, 0, 8, 2031738, 0, 8, 1966202, 0, 8, 1900666, 0, 8, 1835130, 0, 8, 1769594, 0, 8, 1704058, 0, 8, 1638522, 0, 8, 1572986, 0, 8, 1507450, 0, 8, 1441914, 0, 8, 1376378, 0, 8, 1310842, 0, 8, 1245306, 0, 8, 1179770, 0, 8, 1114234, 0, 8, 1048698, 0, 8, 983162, 0, 8, 2228345, 0, 8, 2162809, 0, 8, 2097273, 0, 8, 2031737, 0, 8, 1966201, 0, 8, 1900665, 0, 8, 1835129, 0, 8, 1769593, 0, 8, 1704057, 0, 8, 1638521, 0, 8, 1572985, 0, 8, 1507449, 0, 8, 1441913, 0, 8, 1376377, 0, 8, 1310841, 0, 8, 1245305, 0, 8, 1179769, 0, 8, 1114233, 0, 8, 1048697, 0, 8, 983161, 0, 8, 2228344, 0, 8, 2162808, 0, 8, 2097272, 0, 8, 2031736, 0, 8, 1966200, 0, 8, 1900664, 0, 8, 1835128, 0, 8, 1769592, 0, 8, 1704056, 0, 8, 1638520, 0, 8, 1572984, 0, 8, 1507448, 0, 8, 1441912, 0, 8, 1376376, 0, 8, 1310840, 0, 8, 1245304, 0, 8, 1179768, 0, 8, 1114232, 0, 8, 1048696, 0, 8, 983160, 0, 8, 2228343, 0, 8, 2162807, 0, 8, 2097271, 0, 8, 2031735, 0, 8, 1966199, 0, 8, 1900663, 0, 8, 1835127, 0, 8, 1769591, 0, 8, 1704055, 0, 8, 1638519, 0, 8, 1572983, 0, 8, 1507447, 0, 8, 1441911, 0, 8, 1376375, 0, 8, 1310839, 0, 8, 1245303, 0, 8, 1179767, 0, 8, 1114231, 0, 8, 1048695, 0, 8, 983159, 0, 8, 2228342, 0, 8, 2162806, 0, 8, 2097270, 0, 8, 2031734, 0, 8, 1966198, 0, 8, 1900662, 0, 8, 1835126, 0, 8, 1769590, 0, 8, 1704054, 0, 8, 1638518, 0, 8, 1572982, 0, 8, 1507446, 0, 8, 1441910, 0, 8, 1376374, 0, 8, 1310838, 0, 8, 1245302, 0, 8, 1179766, 0, 8, 1114230, 0, 8, 1048694, 0, 8, 983158, 0, 8, 2228341, 0, 8, 2162805, 0, 8, 2097269, 0, 8, 2031733, 0, 8, 1966197, 0, 8, 1900661, 0, 8, 1835125, 0, 8, 1769589, 0, 8, 1704053, 0, 8, 1638517, 0, 8, 1572981, 0, 8, 1507445, 0, 8, 1441909, 0, 8, 1376373, 0, 8, 1310837, 0, 8, 1245301, 0, 8, 1179765, 0, 8, 1114229, 0, 8, 1048693, 0, 8, 983157, 0, 8, 2228340, 0, 8, 2162804, 0, 8, 2097268, 0, 8, 2031732, 0, 8, 1966196, 0, 8, 1900660, 0, 8, 1835124, 0, 8, 1769588, 0, 8, 1704052, 0, 8, 1638516, 0, 8, 1572980, 0, 8, 1507444, 0, 8, 1441908, 0, 8, 1376372, 0, 8, 1310836, 0, 8, 1245300, 0, 8, 1179764, 0, 8, 1114228, 0, 8, 1048692, 0, 8, 983156, 0, 8, 2228339, 0, 8, 2162803, 0, 8, 2097267, 0, 8, 2031731, 0, 8, 1966195, 0, 8, 1900659, 0, 8, 1835123, 0, 8, 1769587, 0, 8, 1704051, 0, 8, 1638515, 0, 8, 1572979, 0, 8, 1507443, 0, 8, 1441907, 0, 8, 1376371, 0, 8, 1310835, 0, 8, 1245299, 0, 8, 1179763, 0, 8, 1114227, 0, 8, 1048691, 0, 8, 983155, 0, 8, 2228338, 0, 8, 2162802, 0, 8, 2097266, 0, 8, 2031730, 0, 8, 1966194, 0, 8, 1900658, 0, 8, 1835122, 0, 8, 1769586, 0, 8, 1704050, 0, 8, 1638514, 0, 8, 1572978, 0, 8, 1507442, 0, 8, 1441906, 0, 8, 1376370, 0, 8, 1310834, 0, 8, 1245298, 0, 8, 1179762, 0, 8, 1114226, 0, 8, 1048690, 0, 8, 983154, 0, 8, 2228337, 0, 8, 2162801, 0, 8, 2097265, 0, 8, 2031729, 0, 8, 1966193, 0, 8, 1900657, 0, 8, 1835121, 0, 8, 1769585, 0, 8, 1704049, 0, 8, 1638513, 0, 8, 1572977, 0, 8, 1507441, 0, 8, 1441905, 0, 8, 1376369, 0, 8, 1310833, 0, 8, 1245297, 0, 8, 1179761, 0, 8, 1114225, 0, 8, 1048689, 0, 8, 983153, 0, 8, 2228336, 0, 8, 2162800, 0, 8, 2097264, 0, 8, 2031728, 0, 8, 1966192, 0, 8, 1900656, 0, 8, 1835120, 0, 8, 1769584, 0, 8, 1704048, 0, 8, 1638512, 0, 8, 1572976, 0, 8, 1507440, 0, 8, 1441904, 0, 8, 1376368, 0, 8, 1310832, 0, 8, 1245296, 0, 8, 1179760, 0, 8, 1114224, 0, 8, 1048688, 0, 8, 983152, 0, 8, 2228335, 0, 8, 2162799, 0, 8, 2097263, 0, 8, 2031727, 0, 8, 1966191, 0, 8, 1900655, 0, 8, 1835119, 0, 8, 1769583, 0, 8, 1704047, 0, 8, 1638511, 0, 8, 1572975, 0, 8, 1507439, 0, 8, 1441903, 0, 8, 1376367, 0, 8, 1310831, 0, 8, 1245295, 0, 8, 1179759, 0, 8, 1114223, 0, 8, 1048687, 0, 8, 983151, 0, 8, 2228334, 0, 8, 2162798, 0, 8, 2097262, 0, 8, 2031726, 0, 8, 1966190, 0, 8, 1900654, 0, 8, 1835118, 0, 8, 1769582, 0, 8, 1704046, 0, 8, 1638510, 0, 8, 1572974, 0, 8, 1507438, 0, 8, 1441902, 0, 8, 1376366, 0, 8, 1310830, 0, 8, 1245294, 0, 8, 1179758, 0, 8, 1114222, 0, 8, 1048686, 0, 8, 983150, 0, 8, 2228333, 0, 8, 2162797, 0, 8, 2097261, 0, 8, 2031725, 0, 8, 1966189, 0, 8, 1900653, 0, 8, 1835117, 0, 8, 1769581, 0, 8, 1704045, 0, 8, 1638509, 0, 8, 1572973, 0, 8, 1507437, 0, 8, 1441901, 0, 8, 1376365, 0, 8, 1310829, 0, 8, 1245293, 0, 8, 1179757, 0, 8, 1114221, 0, 8, 1048685, 0, 8, 983149, 0, 8, 2228332, 0, 8, 2162796, 0, 8, 2097260, 0, 8, 2031724, 0, 8, 1966188, 0, 8, 1900652, 0, 8, 1835116, 0, 8, 1769580, 0, 8, 1704044, 0, 8, 1638508, 0, 8, 1572972, 0, 8, 1507436, 0, 8, 1441900, 0, 8, 1376364, 0, 8, 1310828, 0, 8, 1245292, 0, 8, 1179756, 0, 8, 1114220, 0, 8, 1048684, 0, 8, 983148, 0, 8, 2228331, 0, 8, 2162795, 0, 8, 2097259, 0, 8, 2031723, 0, 8, 1966187, 0, 8, 1900651, 0, 8, 1835115, 0, 8, 1769579, 0, 8, 1704043, 0, 8, 1638507, 0, 8, 1572971, 0, 8, 1507435, 0, 8, 1441899, 0, 8, 1376363, 0, 8, 1310827, 0, 8, 1245291, 0, 8, 1179755, 0, 8, 1114219, 0, 8, 1048683, 0, 8, 983147, 0, 8, 2228330, 0, 8, 2162794, 0, 8, 2097258, 0, 8, 2031722, 0, 8, 1966186, 0, 8, 1900650, 0, 8, 1835114, 0, 8, 1769578, 0, 8, 1704042, 0, 8, 1638506, 0, 8, 1572970, 0, 8, 1507434, 0, 8, 1441898, 0, 8, 1376362, 0, 8, 1310826, 0, 8, 1245290, 0, 8, 1179754, 0, 8, 1114218, 0, 8, 1048682, 0, 8, 983146, 0, 8, 2228329, 0, 8, 2162793, 0, 8, 2097257, 0, 8, 2031721, 0, 8, 1966185, 0, 8, 1900649, 0, 8, 1835113, 0, 8, 1769577, 0, 8, 1704041, 0, 8, 1638505, 0, 8, 1572969, 0, 8, 1507433, 0, 8, 1441897, 0, 8, 1376361, 0, 8, 1310825, 0, 8, 1245289, 0, 8, 1179753, 0, 8, 1114217, 0, 8, 1048681, 0, 8, 983145, 0, 8, 917609, 131072, 7, 2293865, 131072, 2, 917610, 131072, 7, 2293866, 131072, 2, 917611, 131072, 7, 2293867, 131072, 2, 917612, 131072, 7, 2293868, 131072, 2, 917613, 131072, 7, 2293869, 131072, 2, 917614, 131072, 7, 2293870, 131072, 2, 917615, 131072, 7, 2293871, 131072, 2, 917616, 131072, 7, 2293872, 131072, 2, 917617, 131072, 7, 2293873, 131072, 2, 917618, 131072, 7, 2293874, 131072, 2, 917619, 131072, 7, 2293875, 131072, 2, 917620, 131072, 7, 2293876, 131072, 2, 917621, 131072, 7, 2293877, 131072, 2, 917622, 131072, 7, 2293878, 131072, 2, 917623, 131072, 7, 2293879, 131072, 2, 917624, 131072, 7, 2293880, 131072, 2, 917625, 131072, 7, 2293881, 131072, 2, 917626, 131072, 7, 2293882, 131072, 2, 917627, 131072, 7, 2293883, 131072, 2, 917628, 131072, 7, 2293884, 131072, 2, 917629, 131072, 7, 2293885, 131072, 2, 917630, 131072, 7, 2293886, 131072, 2, 917631, 131072, 7, 2293887, 131072, 2, 917632, 131072, 7, 2293888, 131072, 2, 917633, 131072, 7, 2293889, 131072, 2, 917634, 131072, 7, 2293890, 131072, 2, 917635, 131072, 7, 2293891, 131072, 2, 917636, 131072, 7, 2293892, 131072, 2, 917637, 131072, 7, 2293893, 131072, 2, 917638, 131072, 7, 2293894, 131072, 2, 917639, 131072, 7, 2293895, 131072, 2, 917640, 131072, 7, 2293896, 131072, 2, 917641, 131072, 7, 2293897, 131072, 2, 1048714, 65536, 3, 917642, 65536, 4, 1114250, 65536, 3, 983178, 65536, 3, 1179786, 65536, 3, 1245322, 65536, 3, 1310858, 65536, 3, 1376394, 65536, 3, 1441930, 65536, 3, 1507466, 65536, 3, 1573002, 65536, 3, 1638538, 65536, 3, 1704074, 65536, 3, 1769610, 65536, 3, 1835146, 65536, 3, 1900682, 65536, 3, 1966218, 65536, 3, 2031754, 65536, 3, 2097290, 65536, 3, 2162826, 65536, 3, 2228362, 65536, 3, 2293898, 851968, 2, 917560, 0, 8, 852024, 0, 8, 786488, 0, 8, 720952, 0, 8, 655416, 0, 8, 589880, 0, 8, 524344, 0, 8, 458808, 0, 8, 393272, 0, 8, 327736, 0, 8, 262200, 0, 8, 196664, 0, 8, 131128, 0, 8, 65592, 0, 8, 56, 0, 8, -65480, 0, 8, -131016, 0, 8, -196552, 0, 8, -262088, 0, 8, -327624, 0, 8, -393160, 0, 8, -458696, 0, 8, -524232, 0, 8, -589768, 0, 8, 917559, 0, 8, 852023, 0, 8, 786487, 0, 8, 720951, 0, 8, 655415, 0, 8, 589879, 0, 8, 524343, 0, 8, 458807, 0, 8, 393271, 0, 8, 327735, 0, 8, 262199, 0, 8, 196663, 0, 8, 131127, 0, 8, 65591, 0, 8, 55, 0, 8, -65481, 0, 8, -131017, 0, 8, -196553, 0, 8, -262089, 0, 8, -327625, 0, 8, -393161, 0, 8, -458697, 0, 8, -524233, 0, 8, -589769, 0, 8, 917558, 0, 8, 852022, 0, 8, 786486, 0, 8, 720950, 0, 8, 655414, 0, 8, 589878, 0, 8, 524342, 0, 8, 458806, 0, 8, 393270, 0, 8, 327734, 0, 8, 262198, 0, 8, 196662, 0, 8, 131126, 0, 8, 65590, 0, 8, 54, 0, 8, -65482, 0, 8, -131018, 0, 8, -196554, 0, 8, -262090, 0, 8, -327626, 0, 8, -393162, 0, 8, -458698, 0, 8, -524234, 0, 8, -589770, 0, 8, 917557, 0, 8, 852021, 0, 8, 786485, 0, 8, 720949, 0, 8, 655413, 0, 8, 589877, 0, 8, 524341, 0, 8, 458805, 0, 8, 393269, 0, 8, 327733, 0, 8, 262197, 0, 8, 196661, 0, 8, 131125, 0, 8, 65589, 0, 8, 53, 0, 8, -65483, 0, 8, -131019, 0, 8, -196555, 0, 8, -262091, 0, 8, -327627, 0, 8, -393163, 0, 8, -458699, 0, 8, -524235, 0, 8, -589771, 0, 8, 917556, 0, 8, 852020, 0, 8, 786484, 0, 8, 720948, 0, 8, 655412, 0, 8, 589876, 0, 8, 524340, 0, 8, 458804, 0, 8, 393268, 0, 8, 327732, 0, 8, 262196, 0, 8, 196660, 0, 8, 131124, 0, 8, 65588, 0, 8, 52, 0, 8, -65484, 0, 8, -131020, 0, 8, -196556, 0, 8, -262092, 0, 8, -327628, 0, 8, -393164, 0, 8, -458700, 0, 8, -524236, 0, 8, -589772, 0, 8, 917555, 0, 8, 852019, 0, 8, 786483, 0, 8, 720947, 0, 8, 655411, 0, 8, 589875, 0, 8, 524339, 0, 8, 458803, 0, 8, 393267, 0, 8, 327731, 0, 8, 262195, 0, 8, 196659, 0, 8, 131123, 0, 8, 65587, 0, 8, 51, 0, 8, -65485, 0, 8, -131021, 0, 8, -196557, 0, 8, -262093, 0, 8, -327629, 0, 8, -393165, 0, 8, -458701, 0, 8, -524237, 0, 8, -589773, 0, 8, 917554, 0, 8, 852018, 0, 8, 786482, 0, 8, 720946, 0, 8, 655410, 0, 8, 589874, 0, 8, 524338, 0, 8, 458802, 0, 8, 393266, 0, 8, 327730, 0, 8, 262194, 0, 8, 196658, 0, 8, 131122, 0, 8, 65586, 0, 8, 50, 0, 8, -65486, 0, 8, -131022, 0, 8, -196558, 0, 8, -262094, 0, 8, -327630, 0, 8, -393166, 0, 8, -458702, 0, 8, -524238, 0, 8, -589774, 0, 8, 917553, 0, 8, 852017, 0, 8, 786481, 0, 8, 720945, 0, 8, 655409, 0, 8, 589873, 0, 8, 524337, 0, 8, 458801, 0, 8, 393265, 0, 8, 327729, 0, 8, 262193, 0, 8, 196657, 0, 8, 131121, 0, 8, 65585, 0, 8, 49, 0, 8, -65487, 0, 8, -131023, 0, 8, -196559, 0, 8, -262095, 0, 8, -327631, 0, 8, -393167, 0, 8, -458703, 0, 8, -524239, 0, 8, -589775, 0, 8, 917552, 0, 8, 852016, 0, 8, 786480, 0, 8, 720944, 0, 8, 655408, 0, 8, 589872, 0, 8, 524336, 0, 8, 458800, 0, 8, 393264, 0, 8, 327728, 0, 8, 262192, 0, 8, 196656, 0, 8, 131120, 0, 8, 65584, 0, 8, 48, 0, 8, -65488, 0, 8, -131024, 0, 8, -196560, 0, 8, -262096, 0, 8, -327632, 0, 8, -393168, 0, 8, -458704, 0, 8, -524240, 0, 8, -589776, 0, 8, 917551, 0, 8, 852015, 0, 8, 786479, 0, 8, 720943, 0, 8, 655407, 0, 8, 589871, 0, 8, 524335, 0, 8, 458799, 0, 8, 393263, 0, 8, 327727, 0, 8, 262191, 0, 8, 196655, 0, 8, 131119, 0, 8, 65583, 0, 8, 47, 0, 8, -65489, 0, 8, -131025, 0, 8, -196561, 0, 8, -262097, 0, 8, -327633, 0, 8, -393169, 0, 8, -458705, 0, 8, -524241, 0, 8, -589777, 0, 8, 917550, 0, 8, 852014, 0, 8, 786478, 0, 8, 720942, 0, 8, 655406, 0, 8, 589870, 0, 8, 524334, 0, 8, 458798, 0, 8, 393262, 0, 8, 327726, 0, 8, 262190, 0, 8, 196654, 0, 8, 131118, 0, 8, 65582, 0, 8, 46, 0, 8, -65490, 0, 8, -131026, 0, 8, -196562, 0, 8, -262098, 0, 8, -327634, 0, 8, -393170, 0, 8, -458706, 0, 8, -524242, 0, 8, -589778, 0, 8, 917549, 0, 8, 852013, 0, 8, 786477, 0, 8, 720941, 0, 8, 655405, 0, 8, 589869, 0, 8, 524333, 0, 8, 458797, 0, 8, 393261, 0, 8, 327725, 0, 8, 262189, 0, 8, 196653, 0, 8, 131117, 0, 8, 65581, 0, 8, 45, 0, 8, -65491, 0, 8, -131027, 0, 8, -196563, 0, 8, -262099, 0, 8, -327635, 0, 8, -393171, 0, 8, -458707, 0, 8, -524243, 0, 8, -589779, 0, 8, 917548, 0, 8, 852012, 0, 8, 786476, 0, 8, 720940, 0, 8, 655404, 0, 8, 589868, 0, 8, 524332, 0, 8, 458796, 0, 8, 393260, 0, 8, 327724, 0, 8, 262188, 0, 8, 196652, 0, 8, 131116, 0, 8, 65580, 0, 8, 44, 0, 8, -65492, 0, 8, -131028, 0, 8, -196564, 0, 8, -262100, 0, 8, -327636, 0, 8, -393172, 0, 8, -458708, 0, 8, -524244, 0, 8, -589780, 0, 8, 917547, 0, 8, 852011, 0, 8, 786475, 0, 8, 720939, 0, 8, 655403, 0, 8, 589867, 0, 8, 524331, 0, 8, 458795, 0, 8, 393259, 0, 8, 327723, 0, 8, 262187, 0, 8, 196651, 0, 8, 131115, 0, 8, 65579, 0, 8, 43, 0, 8, -65493, 0, 8, -131029, 0, 8, -196565, 0, 8, -262101, 0, 8, -327637, 0, 8, -393173, 0, 8, -458709, 0, 8, -524245, 0, 8, -589781, 0, 8, 917546, 0, 8, 852010, 0, 8, 786474, 0, 8, 720938, 0, 8, 655402, 0, 8, 589866, 0, 8, 524330, 0, 8, 458794, 0, 8, 393258, 0, 8, 327722, 0, 8, 262186, 0, 8, 196650, 0, 8, 131114, 0, 8, 65578, 0, 8, 42, 0, 8, -65494, 0, 8, -131030, 0, 8, -196566, 0, 8, -262102, 0, 8, -327638, 0, 8, -393174, 0, 8, -458710, 0, 8, -524246, 0, 8, -589782, 0, 8, 917545, 0, 8, 852009, 0, 8, 786473, 0, 8, 720937, 0, 8, 655401, 0, 8, 589865, 0, 8, 524329, 0, 8, 458793, 0, 8, 393257, 0, 8, 327721, 0, 8, 262185, 0, 8, 196649, 0, 8, 131113, 0, 8, 65577, 0, 8, 41, 0, 8, -65495, 0, 8, -131031, 0, 8, -196567, 0, 8, -262103, 0, 8, -327639, 0, 8, -393175, 0, 8, -458711, 0, 8, -524247, 0, 8, -589783, 0, 8, 917544, 0, 8, 852008, 0, 8, 786472, 0, 8, 720936, 0, 8, 655400, 0, 8, 589864, 0, 8, 524328, 0, 8, 458792, 0, 8, 393256, 0, 8, 327720, 0, 8, 262184, 0, 8, 196648, 0, 8, 131112, 0, 8, 65576, 0, 8, 40, 0, 8, -65496, 0, 8, -131032, 0, 8, -196568, 0, 8, -262104, 0, 8, -327640, 0, 8, -393176, 0, 8, -458712, 0, 8, -524248, 0, 8, -589784, 0, 8, 917543, 0, 8, 852007, 0, 8, 786471, 0, 8, 720935, 0, 8, 655399, 0, 8, 589863, 0, 8, 524327, 0, 8, 458791, 0, 8, 393255, 0, 8, 327719, 0, 8, 262183, 0, 8, 196647, 0, 8, 131111, 0, 8, 65575, 0, 8, 39, 0, 8, -65497, 0, 8, -131033, 0, 8, -196569, 0, 8, -262105, 0, 8, -327641, 0, 8, -393177, 0, 8, -458713, 0, 8, -524249, 0, 8, -589785, 0, 8, 917542, 0, 8, 852006, 0, 8, 786470, 0, 8, 720934, 0, 8, 655398, 0, 8, 589862, 0, 8, 524326, 0, 8, 458790, 0, 8, 393254, 0, 8, 327718, 0, 8, 262182, 0, 8, 196646, 0, 8, 131110, 0, 8, 65574, 0, 8, 38, 0, 8, -65498, 0, 8, -131034, 0, 8, -196570, 0, 8, -262106, 0, 8, -327642, 0, 8, -393178, 0, 8, -458714, 0, 8, -524250, 0, 8, -589786, 0, 8, 917541, 0, 8, 852005, 0, 8, 786469, 0, 8, 720933, 0, 8, 655397, 0, 8, 589861, 0, 8, 524325, 0, 8, 458789, 0, 8, 393253, 0, 8, 327717, 0, 8, 262181, 0, 8, 196645, 0, 8, 131109, 0, 8, 65573, 0, 8, 37, 0, 8, -65499, 0, 8, -131035, 0, 8, -196571, 0, 8, -262107, 0, 8, -327643, 0, 8, -393179, 0, 8, -458715, 0, 8, -524251, 0, 8, -589787, 0, 8, 917540, 0, 8, 852004, 0, 8, 786468, 0, 8, 720932, 0, 8, 655396, 0, 8, 589860, 0, 8, 524324, 0, 8, 458788, 0, 8, 393252, 0, 8, 327716, 0, 8, 262180, 0, 8, 196644, 0, 8, 131108, 0, 8, 65572, 0, 8, 36, 0, 8, -65500, 0, 8, -131036, 0, 8, -196572, 0, 8, -262108, 0, 8, -327644, 0, 8, -393180, 0, 8, -458716, 0, 8, -524252, 0, 8, -589788, 0, 8, 917539, 0, 8, 852003, 0, 8, 786467, 0, 8, 720931, 0, 8, 655395, 0, 8, 589859, 0, 8, 524323, 0, 8, 458787, 0, 8, 393251, 0, 8, 327715, 0, 8, 262179, 0, 8, 196643, 0, 8, 131107, 0, 8, 65571, 0, 8, 35, 0, 8, -65501, 0, 8, -131037, 0, 8, -196573, 0, 8, -262109, 0, 8, -327645, 0, 8, -393181, 0, 8, -458717, 0, 8, -524253, 0, 8, -589789, 0, 8, 917538, 0, 8, 852002, 0, 8, 786466, 0, 8, 720930, 0, 8, 655394, 0, 8, 589858, 0, 8, 524322, 0, 8, 458786, 0, 8, 393250, 0, 8, 327714, 0, 8, 262178, 0, 8, 196642, 0, 8, 131106, 0, 8, 65570, 0, 8, 34, 0, 8, -65502, 0, 8, -131038, 0, 8, -196574, 0, 8, -262110, 0, 8, -327646, 0, 8, -393182, 0, 8, -458718, 0, 8, -524254, 0, 8, -589790, 0, 8, -524255, 196608, 3, -655327, 196608, 4, -655325, 131072, 7, -458719, 196608, 3, -589791, 196608, 3, -393183, 196608, 3, -327647, 196608, 3, -262111, 196608, 3, -196575, 196608, 3, -131039, 196608, 3, -65503, 196608, 3, 33, 196608, 3, 65569, 196608, 3, 131105, 196608, 3, 196641, 196608, 3, 262177, 196608, 3, 327713, 196608, 3, 393249, 196608, 3, 458785, 196608, 3, 524321, 196608, 3, 589857, 196608, 3, 655393, 196608, 3, 720929, 196608, 3, 786465, 196608, 3, 852001, 196608, 3, 917537, 196608, 3, 983075, 131072, 2, 983073, 720896, 2, -655326, 131072, 7, -655324, 131072, 7, 983076, 131072, 2, 983074, 131072, 2, -655323, 131072, 7, 983077, 131072, 2, -655322, 131072, 7, 983078, 131072, 2, -655321, 131072, 7, 983079, 131072, 2, -655320, 131072, 7, 983080, 131072, 2, -655319, 131072, 7, 983081, 131072, 2, -655318, 131072, 7, 983082, 131072, 2, -655317, 131072, 7, 983083, 131072, 2, -655316, 131072, 7, 983084, 131072, 2, -655315, 131072, 7, 983085, 131072, 2, -655314, 131072, 7, 983086, 131072, 2, -655313, 131072, 7, 983087, 131072, 2, -655312, 131072, 7, 983088, 131072, 2, -655311, 131072, 7, 983089, 131072, 2, -655310, 131072, 7, 983090, 131072, 2, -655309, 131072, 7, 983091, 196608, 2, -655308, 131072, 7, 983092, 0, 8, -655307, 131072, 7, 983093, 0, 8, -655306, 131072, 7, 983094, 0, 8, -655305, 131072, 7, 983095, 0, 8, -655304, 131072, 7, 983096, 0, 8, -524231, 65536, 3, -655303, 65536, 4, -458695, 65536, 3, -589767, 65536, 3, -393159, 65536, 3, -327623, 65536, 3, -262087, 65536, 3, -196551, 65536, 3, -131015, 65536, 3, -65479, 65536, 3, 57, 65536, 3, 65593, 65536, 3, 131129, 65536, 3, 196665, 65536, 7, 262201, 0, 8, 327737, 0, 8, 393273, 0, 8, 458809, 0, 8, 524345, 0, 8, 589881, 0, 8, 655417, 0, 8, 720953, 0, 8, 786489, 0, 8, 852025, 0, 8, 917561, 0, 8, 983097, 0, 8, 393291, 0, 8, 327755, 0, 8, 262219, 0, 8, 393290, 0, 8, 327754, 0, 8, 262218, 0, 8, 393289, 0, 8, 327753, 0, 8, 262217, 0, 8, 393288, 0, 8, 327752, 0, 8, 262216, 0, 8, 393287, 0, 8, 327751, 0, 8, 262215, 0, 8, 393286, 0, 8, 327750, 0, 8, 262214, 0, 8, 393285, 0, 8, 327749, 0, 8, 262213, 0, 8, 393284, 0, 8, 327748, 0, 8, 262212, 0, 8, 393283, 0, 8, 327747, 0, 8, 262211, 0, 8, 393282, 0, 8, 327746, 0, 8, 262210, 0, 8, 1507393, 0, 8, 1441857, 0, 8, 1376321, 0, 8, 1310785, 0, 8, 1245249, 0, 8, 1179713, 0, 8, 1114177, 0, 8, 1048641, 0, 8, 983105, 0, 8, 917569, 0, 8, 852033, 0, 8, 786497, 0, 8, 720961, 0, 8, 655425, 0, 8, 589889, 0, 8, 524353, 0, 8, 458817, 0, 8, 393281, 0, 8, 327745, 0, 8, 262209, 0, 8, 1507392, 0, 8, 1441856, 0, 8, 1376320, 0, 8, 1310784, 0, 8, 1245248, 0, 8, 1179712, 0, 8, 1114176, 0, 8, 1048640, 0, 8, 983104, 0, 8, 917568, 0, 8, 852032, 0, 8, 786496, 0, 8, 720960, 0, 8, 655424, 0, 8, 589888, 0, 8, 524352, 0, 8, 458816, 0, 8, 393280, 0, 8, 327744, 0, 8, 262208, 0, 8, 1507391, 0, 8, 1441855, 0, 8, 1376319, 0, 8, 1310783, 0, 8, 1245247, 0, 8, 1179711, 0, 8, 1114175, 0, 8, 1048639, 0, 8, 983103, 0, 8, 917567, 0, 8, 852031, 0, 8, 786495, 0, 8, 720959, 0, 8, 655423, 0, 8, 589887, 0, 8, 524351, 0, 8, 458815, 0, 8, 393279, 0, 8, 327743, 0, 8, 262207, 0, 8, 1507390, 0, 8, 1441854, 0, 8, 1376318, 0, 8, 1310782, 0, 8, 1245246, 0, 8, 1179710, 0, 8, 1114174, 0, 8, 1048638, 0, 8, 983102, 0, 8, 917566, 0, 8, 852030, 0, 8, 786494, 0, 8, 720958, 0, 8, 655422, 0, 8, 589886, 0, 8, 524350, 0, 8, 458814, 0, 8, 393278, 0, 8, 327742, 0, 8, 262206, 0, 8, 1507389, 0, 8, 1441853, 0, 8, 1376317, 0, 8, 1310781, 0, 8, 1245245, 0, 8, 1179709, 0, 8, 1114173, 0, 8, 1048637, 0, 8, 983101, 0, 8, 917565, 0, 8, 852029, 0, 8, 786493, 0, 8, 720957, 0, 8, 655421, 0, 8, 589885, 0, 8, 524349, 0, 8, 458813, 0, 8, 393277, 0, 8, 327741, 0, 8, 262205, 0, 8, 1507388, 0, 8, 1441852, 0, 8, 1376316, 0, 8, 1310780, 0, 8, 1245244, 0, 8, 1179708, 0, 8, 1114172, 0, 8, 1048636, 0, 8, 983100, 0, 8, 917564, 0, 8, 852028, 0, 8, 786492, 0, 8, 720956, 0, 8, 655420, 0, 8, 589884, 0, 8, 524348, 0, 8, 458812, 0, 8, 393276, 0, 8, 327740, 0, 8, 262204, 0, 8, 1507387, 0, 8, 1441851, 0, 8, 1376315, 0, 8, 1310779, 0, 8, 1245243, 0, 8, 1179707, 0, 8, 1114171, 0, 8, 1048635, 0, 8, 983099, 0, 8, 917563, 0, 8, 852027, 0, 8, 786491, 0, 8, 720955, 0, 8, 655419, 0, 8, 589883, 0, 8, 524347, 0, 8, 458811, 0, 8, 393275, 0, 8, 327739, 0, 8, 262203, 0, 8, 1507386, 0, 8, 1441850, 0, 8, 1376314, 0, 8, 1310778, 0, 8, 1245242, 0, 8, 1179706, 0, 8, 1114170, 0, 8, 1048634, 0, 8, 983098, 0, 8, 917562, 0, 8, 852026, 0, 8, 786490, 0, 8, 720954, 0, 8, 655418, 0, 8, 589882, 0, 8, 524346, 0, 8, 458810, 0, 8, 393274, 0, 8, 327738, 0, 8, 262202, 0, 8, 1507385, 0, 8, 1441849, 0, 8, 1376313, 0, 8, 1310777, 0, 8, 1245241, 0, 8, 1179705, 0, 8, 1114169, 0, 8, 1048633, 0, 8, 1507384, 0, 8, 1441848, 0, 8, 1376312, 0, 8, 1310776, 0, 8, 1245240, 0, 8, 1179704, 0, 8, 1114168, 0, 8, 1048632, 0, 8, 1507383, 0, 8, 1441847, 0, 8, 1376311, 0, 8, 1310775, 0, 8, 1245239, 0, 8, 1179703, 0, 8, 1114167, 0, 8, 1048631, 0, 8, 1507382, 0, 8, 1441846, 0, 8, 1376310, 0, 8, 1310774, 0, 8, 1245238, 0, 8, 1179702, 0, 8, 1114166, 0, 8, 1048630, 0, 8, 1507381, 0, 8, 1441845, 0, 8, 1376309, 0, 8, 1310773, 0, 8, 1245237, 0, 8, 1179701, 0, 8, 1114165, 0, 8, 1048629, 0, 8, 1507380, 0, 8, 1441844, 0, 8, 1376308, 0, 8, 1310772, 0, 8, 1245236, 0, 8, 1179700, 0, 8, 1114164, 0, 8, 1048628, 0, 8, 1048627, 196608, 3, 1114163, 196608, 3, 1179699, 196608, 3, 1245235, 196608, 3, 1310771, 196608, 3, 1376307, 196608, 3, 1441843, 196608, 3, 1507379, 196608, 3, 1572917, 131072, 2, 1572915, 720896, 2, 1572918, 131072, 2, 1572916, 131072, 2, 1572919, 131072, 2, 1572920, 131072, 2, 1572921, 131072, 2, 196666, 131072, 7, 1572922, 131072, 2, 196667, 131072, 7, 1572923, 131072, 2, 196668, 131072, 7, 1572924, 131072, 2, 196669, 131072, 7, 1572925, 131072, 2, 196670, 131072, 7, 1572926, 131072, 2, 196671, 131072, 7, 1572927, 131072, 2, 196672, 131072, 7, 1572928, 131072, 2, 196673, 131072, 7, 1572929, 131072, 2, 196674, 131072, 7, 196675, 131072, 7, 196676, 131072, 7, 196677, 131072, 7, 196678, 131072, 7, 196679, 131072, 7, 196680, 131072, 7, 196681, 131072, 7, 196682, 131072, 7, 196683, 131072, 7, 327756, 65536, 3, 196684, 65536, 4, 393292, 65536, 3, 262220, 65536, 3) diff --git a/DungeonShooting_Godot/scene/test/TestNavigation2.tscn b/DungeonShooting_Godot/scene/test/TestNavigation2.tscn index bd27dfe..eae5866 100644 --- a/DungeonShooting_Godot/scene/test/TestNavigation2.tscn +++ b/DungeonShooting_Godot/scene/test/TestNavigation2.tscn @@ -7,16 +7,19 @@ vertices = PackedVector2Array(1138, 78, 1168, 948, 1070, 733, 1033, 218, 79, 73, 950, 211, 975, 834, 888, 830, 62, 978, 806, 831, 883, 208, 796, 205, 288, 833, 286, 610, 807, 609, 208, 836, 212, 202, 795, 525, 300, 527, 292, 192) polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(4, 0, 3, 5), PackedInt32Array(6, 2, 1), PackedInt32Array(7, 6, 1, 8, 9), PackedInt32Array(5, 6, 7, 10), PackedInt32Array(4, 5, 10), PackedInt32Array(4, 10, 11), PackedInt32Array(12, 13, 14, 9), PackedInt32Array(12, 9, 8, 15), PackedInt32Array(15, 8, 4, 16), PackedInt32Array(11, 17, 18, 19), PackedInt32Array(4, 11, 19), PackedInt32Array(4, 19, 16)]) outlines = Array[PackedVector2Array]([PackedVector2Array(79, 73, 62, 978, 1168, 948, 1138, 78), PackedVector2Array(212, 202, 208, 836, 288, 833, 286, 610, 807, 609, 806, 831, 888, 830, 883, 208, 796, 205, 795, 525, 300, 527, 292, 192), PackedVector2Array(950, 211, 975, 834, 1070, 733, 1033, 218)]) +source_geometry_group_name = &"navigation_polygon_source_group" [sub_resource type="NavigationPolygon" id="NavigationPolygon_oawm0"] vertices = PackedVector2Array(606, 123, 648, 952, 62, 978, 79, 73) polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)]) outlines = Array[PackedVector2Array]([PackedVector2Array(79, 73, 62, 978, 648, 952, 606, 123)]) +source_geometry_group_name = &"navigation_polygon_source_group" [sub_resource type="NavigationPolygon" id="NavigationPolygon_nrkta"] vertices = PackedVector2Array(379, 510, 374, 753, 172, 747, 161, 524) polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)]) outlines = Array[PackedVector2Array]([PackedVector2Array(161, 524, 172, 747, 374, 753, 379, 510)]) +source_geometry_group_name = &"navigation_polygon_source_group" [node name="TestNavigation2" type="Node2D"] script = ExtResource("1") diff --git a/DungeonShooting_Godot/scene/test/TestNewTerrain.tscn b/DungeonShooting_Godot/scene/test/TestNewTerrain.tscn new file mode 100644 index 0000000..da3d648 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestNewTerrain.tscn @@ -0,0 +1,126 @@ +[gd_scene load_steps=10 format=3 uid="uid://iwm27vpirfef"] + +[ext_resource type="Script" path="res://src/test/TestNewTerrain.cs" id="1_68mbo"] +[ext_resource type="PackedScene" uid="uid://cxhrcytrx0kcf" path="res://prefab/role/Role0001.tscn" id="3_bo13a"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="4_iy0ux"] +[ext_resource type="Texture2D" uid="uid://bda63puujv425" path="res://resource/sprite/role/common/Role_query.png" id="5_rv0km"] +[ext_resource type="Shader" path="res://resource/material/GodRays.gdshader" id="6_bcjt6"] +[ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="7_34lsg"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7va3f"] +resource_local_to_scene = true +shader = ExtResource("4_iy0ux") +shader_parameter/blend = Color(1, 1, 1, 1) +shader_parameter/schedule = 0.0 +shader_parameter/modulate = Color(1, 1, 1, 1) +shader_parameter/show_outline = true +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_fwac7"] +shader = ExtResource("6_bcjt6") +shader_parameter/angle = 0.535 +shader_parameter/position = 0.28 +shader_parameter/spread = 0.5 +shader_parameter/cutoff = 0.1 +shader_parameter/falloff = 0.221 +shader_parameter/edge_fade = 0.15 +shader_parameter/speed = 1.0 +shader_parameter/ray1_density = 8.0 +shader_parameter/ray2_density = 30.0 +shader_parameter/ray2_intensity = 0.3 +shader_parameter/color = Color(1, 0.901961, 0.65098, 0.619608) +shader_parameter/hdr = false +shader_parameter/seed = 5.0 + +[node name="TestNewTerrain" type="Node2D"] +scale = Vector2(2, 2) +script = ExtResource("1_68mbo") + +[node name="TileMap2" type="TileMap" parent="." groups=["navigation"]] +z_index = -1 +y_sort_enabled = true +format = 2 +layer_0/tile_data = PackedInt32Array(1769510, 720896, 3, 1703974, 720896, 2, 1638438, 720896, 2, 1572902, 720896, 2, 1507366, 720896, 2, 1441830, 720896, 2, 1376294, 720896, 2, 1310758, 720896, 2, 1245222, 720896, 2, 1179686, 720896, 2, 1114150, 720896, 2, 1048614, 720896, 2, 983078, 720896, 2, 917542, 720896, 2, 852006, 720896, 2, 786470, 720896, 2, 1769509, 589824, 3, 1703973, 589824, 2, 1638437, 589824, 2, 1572901, 589824, 2, 1507365, 589824, 2, 1441829, 589824, 2, 1376293, 589824, 2, 1310757, 589824, 2, 1245221, 589824, 2, 1179685, 589824, 2, 1114149, 589824, 2, 1048613, 589824, 2, 983077, 589824, 2, 917541, 589824, 2, 852005, 589824, 2, 786469, 589824, 2, 1769508, 589824, 3, 1703972, 589824, 2, 1638436, 589824, 2, 1572900, 589824, 2, 1507364, 589824, 2, 1441828, 589824, 2, 1376292, 589824, 2, 1310756, 589824, 2, 1245220, 589824, 2, 1179684, 589824, 2, 1114148, 589824, 2, 1048612, 589824, 2, 983076, 589824, 2, 917540, 589824, 2, 852004, 589824, 2, 786468, 589824, 2, 1769507, 589824, 3, 1703971, 589824, 2, 1638435, 589824, 2, 1572899, 589824, 2, 1507363, 589824, 2, 1441827, 589824, 2, 1376291, 589824, 2, 1310755, 589824, 2, 1245219, 589824, 2, 1179683, 589824, 2, 1114147, 589824, 2, 1048611, 589824, 2, 983075, 589824, 2, 917539, 589824, 2, 852003, 589824, 2, 786467, 589824, 2, 1769506, 589824, 3, 1703970, 589824, 2, 1638434, 589824, 2, 1572898, 589824, 2, 1507362, 589824, 2, 1441826, 589824, 2, 1376290, 589824, 2, 1310754, 589824, 2, 1245218, 327680, 1, 1179682, 524288, 1, 1114146, 524288, 1, 1048610, 524288, 1, 983074, 327680, 2, 917538, 589824, 2, 852002, 589824, 2, 786466, 589824, 2, 1769505, 589824, 3, 1703969, 589824, 2, 1638433, 589824, 2, 1572897, 589824, 2, 1507361, 589824, 2, 1441825, 589824, 2, 1376289, 589824, 2, 1310753, 589824, 2, 1245217, 655360, 0, 983073, 589824, 3, 917537, 589824, 2, 852001, 589824, 2, 786465, 589824, 2, 1769504, 589824, 3, 1703968, 589824, 2, 1638432, 589824, 2, 1572896, 589824, 2, 1507360, 589824, 2, 1441824, 589824, 2, 1376288, 589824, 2, 1310752, 589824, 2, 1245216, 655360, 0, 983072, 589824, 3, 917536, 589824, 2, 852000, 589824, 2, 786464, 589824, 2, 1769503, 589824, 3, 1703967, 589824, 2, 1638431, 589824, 2, 1572895, 589824, 2, 1507359, 327680, 1, 1441823, 524288, 1, 1376287, 524288, 1, 1310751, 524288, 1, 1245215, 524288, 0, 983071, 589824, 3, 917535, 589824, 2, 851999, 589824, 2, 786463, 589824, 2, 1769502, 589824, 3, 1703966, 589824, 2, 1638430, 589824, 2, 1572894, 589824, 2, 1507358, 655360, 0, 983070, 327680, 3, 851998, 524288, 1, 786462, 327680, 2, 1769501, 589824, 3, 1703965, 589824, 2, 1638429, 589824, 2, 1572893, 327680, 1, 1507357, 524288, 0, 983069, 131072, 3, 786461, 589824, 3, 1769500, 589824, 3, 1703964, 589824, 2, 1638428, 327680, 1, 1572892, 524288, 0, 983068, 131072, 3, 786460, 589824, 3, 1769499, 589824, 3, 1703963, 589824, 2, 1638427, 655360, 0, 1376283, 196608, 3, 983067, 131072, 3, 786459, 589824, 3, 1769498, 589824, 3, 1703962, 589824, 2, 1638426, 655360, 0, 1376282, 131072, 2, 983066, 131072, 3, 786458, 589824, 3, 1769497, 589824, 3, 1703961, 589824, 2, 1638425, 393216, 1, 1572889, 720896, 0, 1376281, 65536, 3, 983065, 65536, 3, 786457, 589824, 3, 1769496, 589824, 3, 1703960, 589824, 2, 1638424, 589824, 2, 1572888, 655360, 0, 786456, 589824, 3, 1769495, 589824, 3, 1703959, 589824, 2, 1638423, 589824, 2, 1572887, 393216, 1, 1507351, 720896, 0, 983063, 720896, 3, 917527, 720896, 2, 851991, 720896, 2, 786455, 393216, 2, 1769494, 589824, 3, 1703958, 589824, 2, 1638422, 589824, 2, 1572886, 589824, 2, 1507350, 655360, 0, 983062, 589824, 3, 917526, 589824, 2, 851990, 589824, 2, 786454, 589824, 2, 1769493, 589824, 3, 1703957, 589824, 2, 1638421, 589824, 2, 1572885, 589824, 2, 1507349, 655360, 0, 983061, 589824, 3, 917525, 589824, 2, 851989, 589824, 2, 786453, 589824, 2, 1769492, 589824, 3, 1703956, 589824, 2, 1638420, 589824, 2, 1572884, 589824, 2, 1507348, 393216, 1, 1441812, 720896, 2, 1376276, 720896, 2, 1310740, 720896, 0, 983060, 589824, 3, 917524, 589824, 2, 851988, 589824, 2, 786452, 589824, 2, 1769491, 589824, 3, 1703955, 589824, 2, 1638419, 589824, 2, 1572883, 589824, 2, 1507347, 589824, 2, 1441811, 589824, 2, 1376275, 589824, 2, 1310739, 393216, 1, 1245203, 720896, 0, 1048595, 720896, 3, 983059, 393216, 2, 917523, 589824, 2, 851987, 589824, 2, 786451, 589824, 2, 1769490, 589824, 3, 1703954, 589824, 2, 1638418, 589824, 2, 1572882, 589824, 2, 1507346, 589824, 2, 1441810, 589824, 2, 1376274, 589824, 2, 1310738, 589824, 2, 1245202, 655360, 0, 1048594, 589824, 3, 983058, 589824, 2, 917522, 589824, 2, 851986, 589824, 2, 786450, 589824, 2, 1769489, 589824, 3, 1703953, 589824, 2, 1638417, 589824, 2, 1572881, 589824, 2, 1507345, 589824, 2, 1441809, 589824, 2, 1376273, 589824, 2, 1310737, 589824, 2, 1245201, 655360, 0, 1048593, 589824, 3, 983057, 589824, 2, 917521, 589824, 2, 851985, 589824, 2, 786449, 589824, 2, 1769488, 589824, 3, 1703952, 589824, 2, 1638416, 589824, 2, 1572880, 589824, 2, 1507344, 589824, 2, 1441808, 589824, 2, 1376272, 589824, 2, 1310736, 589824, 2, 1245200, 655360, 0, 1048592, 589824, 3, 983056, 589824, 2, 917520, 589824, 2, 851984, 589824, 2, 786448, 589824, 2, 1769487, 589824, 3, 1703951, 589824, 2, 1638415, 589824, 2, 1572879, 589824, 2, 1507343, 589824, 2, 1441807, 589824, 2, 1376271, 589824, 2, 1310735, 589824, 2, 1245199, 393216, 1, 1179663, 720896, 2, 1114127, 720896, 2, 1048591, 393216, 2, 983055, 589824, 2, 917519, 589824, 2, 851983, 589824, 2, 786447, 589824, 2, 1769486, 589824, 3, 1703950, 589824, 2, 1638414, 589824, 2, 1572878, 589824, 2, 1507342, 589824, 2, 1441806, 589824, 2, 1376270, 589824, 2, 1310734, 589824, 2, 1245198, 589824, 2, 1179662, 589824, 2, 1114126, 589824, 2, 1048590, 589824, 2, 983054, 589824, 2, 917518, 589824, 2, 851982, 589824, 2, 786446, 589824, 2, 1769485, 589824, 3, 1703949, 589824, 2, 1638413, 589824, 2, 1572877, 589824, 2, 1507341, 589824, 2, 1441805, 589824, 2, 1376269, 589824, 2, 1310733, 589824, 2, 1245197, 589824, 2, 1179661, 589824, 2, 1114125, 589824, 2, 1048589, 589824, 2, 983053, 589824, 2, 917517, 589824, 2, 851981, 589824, 2, 786445, 589824, 2, 1769484, 524288, 3, 1703948, 524288, 1, 1638412, 524288, 1, 1572876, 524288, 1, 1507340, 524288, 1, 1441804, 524288, 1, 1376268, 524288, 1, 1310732, 524288, 1, 1245196, 524288, 1, 1179660, 524288, 1, 1114124, 524288, 1, 1048588, 524288, 1, 983052, 524288, 1, 917516, 524288, 1, 851980, 524288, 1, 786444, 524288, 1, 720934, 720896, 2, 655398, 720896, 2, 589862, 720896, 0, 720933, 589824, 2, 655397, 589824, 2, 589861, 655360, 0, 720932, 589824, 2, 655396, 589824, 2, 589860, 655360, 0, 720931, 589824, 2, 655395, 589824, 2, 589859, 655360, 0, 720930, 589824, 2, 655394, 589824, 2, 589858, 655360, 0, 720929, 589824, 2, 655393, 589824, 2, 589857, 655360, 0, 720928, 589824, 2, 655392, 589824, 2, 589856, 655360, 0, 720927, 589824, 2, 655391, 589824, 2, 589855, 655360, 0, 720926, 589824, 2, 655390, 589824, 2, 589854, 655360, 0, 720925, 589824, 2, 655389, 589824, 2, 589853, 655360, 0, 720924, 589824, 2, 655388, 589824, 2, 589852, 655360, 0, 720923, 589824, 2, 655387, 589824, 2, 589851, 655360, 0, 720922, 589824, 2, 655386, 589824, 2, 589850, 655360, 0, 720921, 589824, 2, 655385, 589824, 2, 589849, 655360, 0, 720920, 589824, 2, 655384, 589824, 2, 589848, 655360, 0, 720919, 589824, 2, 655383, 589824, 2, 589847, 655360, 0, 720918, 589824, 2, 655382, 589824, 2, 589846, 655360, 0, 720917, 589824, 2, 655381, 589824, 2, 589845, 655360, 0, 720916, 589824, 2, 655380, 589824, 2, 589844, 655360, 0, 720915, 589824, 2, 655379, 589824, 2, 589843, 655360, 0, 720914, 589824, 2, 655378, 589824, 2, 589842, 655360, 0, 720913, 589824, 2, 655377, 589824, 2, 589841, 655360, 0, 720912, 589824, 2, 655376, 589824, 2, 589840, 655360, 0, 720911, 589824, 2, 655375, 589824, 2, 589839, 655360, 0, 720910, 589824, 2, 655374, 589824, 2, 589838, 655360, 0, 720909, 589824, 2, 655373, 589824, 2, 589837, 655360, 0, 720908, 524288, 1, 655372, 524288, 1, 589836, 524288, 0, 1114128, 131072, 4, 1114129, 131072, 4, 1114130, 131072, 4, 1114131, 196608, 4, 1048609, 131072, 4, 1048608, 131072, 4, 1048607, 131072, 4, 1048606, 131072, 4, 1048605, 131072, 4, 1048604, 131072, 4, 1048603, 131072, 4, 1048602, 131072, 4, 1048601, 65536, 4, 851993, 131072, 4, 851994, 131072, 4, 851995, 131072, 4, 851996, 131072, 4, 851997, 131072, 4, 917534, 524288, 1, 1048596, 131072, 4, 1048597, 131072, 4, 1048598, 131072, 4, 1048599, 196608, 4, 851992, 131072, 4, 1441817, 65536, 4, 1441818, 131072, 4, 1441819, 196608, 4, 1179671, 0, 3, 1245207, 262144, 4, 1310746, 0, 0, 1310742, 0, 4, 1245206, 0, 4, 1179670, 0, 4, 1114134, 0, 4, 1114133, 0, 4, 1114132, 0, 4, 1179668, 0, 4, 1179667, 0, 4, 1179666, 0, 4, 1179665, 0, 4, 1179664, 0, 4, 1245204, 0, 4, 1245205, 0, 4, 1179669, 0, 4, 1310741, 0, 4, 1376277, 0, 4, 1441813, 0, 4, 1441814, 0, 4, 1376278, 0, 4, 1376279, 0, 4, 1310743, 0, 4, 1310744, 0, 4, 1245208, 0, 4, 1179672, 0, 4, 1114136, 0, 4, 1048600, 0, 4, 983064, 0, 4, 917528, 0, 4, 917529, 0, 4, 917530, 0, 4, 917531, 0, 4, 917532, 0, 4, 917533, 0, 4, 1114135, 0, 4, 1114137, 0, 4, 1179673, 0, 4, 1245209, 0, 4, 1310745, 0, 4, 1245210, 0, 4, 1179674, 0, 4, 1114138, 0, 4, 1114139, 0, 4, 1179675, 0, 4, 1245211, 0, 4, 1310747, 0, 4, 1310748, 0, 4, 1245212, 0, 4, 1179676, 0, 4, 1114140, 0, 4, 1114141, 0, 4, 1179677, 0, 4, 1245213, 0, 4, 1310749, 0, 4, 1376285, 0, 4, 1376284, 0, 4, 1441820, 0, 4, 1507356, 0, 4, 1507355, 0, 4, 1507354, 0, 4, 1507353, 0, 4, 1507352, 0, 4, 1441816, 0, 4, 1376280, 0, 4, 1441815, 0, 4, 1572890, 0, 4, 1572891, 0, 4, 1441821, 0, 4, 1441822, 0, 4, 1376286, 0, 4, 1310750, 0, 4, 1245214, 0, 4, 1179678, 0, 4, 1114142, 0, 4, 1114143, 0, 4, 1179679, 0, 4, 1179680, 0, 4, 1114144, 0, 4, 1114145, 0, 4, 1179681, 0, 4) +layer_1/name = "floor" +layer_1/z_index = -10 +layer_1/tile_data = PackedInt32Array(65541, 0, 4, 131077, 0, 4, 196613, 0, 4, 262149, 0, 4, 262150, 0, 4, 196614, 0, 4, 131078, 0, 4, 65542, 0, 4, 6, 0, 4, 5, 0, 4, 327685, 0, 4, 327686, 0, 4, 7, 0, 4, 65543, 0, 4, 131079, 0, 4, 196615, 0, 4, 262151, 0, 4, 327687, 0, 4, 327688, 0, 4, 262152, 0, 4, 196616, 0, 4, 8, 0, 4, 65544, 0, 4, 131080, 0, 4, 327689, 0, 4, 262153, 0, 4, 262154, 0, 4, 327690, 0, 4, 327691, 0, 4, 262155, 0, 4, 196619, 0, 4, 196618, 0, 4, 196617, 0, 4) +layer_2/name = "middle" +layer_2/y_sort_enabled = true +layer_2/tile_data = PackedInt32Array(-65531, 131072, 4, -65530, 131072, 4, -65529, 131072, 4, -65528, 131072, 4, 131081, 65536, 4, 131082, 131072, 4, 131083, 131072, 4, -131067, 589824, 3, -131066, 589824, 3, -131065, 589824, 3, -131064, 589824, 3, 65547, 589824, 3, 65546, 589824, 3, 65545, 524288, 3) +layer_3/name = "top" +layer_3/z_index = 10 +layer_3/tile_data = PackedInt32Array(393221, 655360, 0, 393222, 655360, 0, 393223, 655360, 0, 393224, 655360, 0, 327684, 720896, 2, 262148, 720896, 2, 196612, 720896, 2, 131076, 720896, 2, 65540, 720896, 2, 4, 720896, 2, 9, 524288, 1, 393220, 393216, 1, -131063, 327680, 2, -131068, 393216, 2, -65527, 524288, 1, -65532, 720896, 2, 393225, 655360, 0, 393226, 655360, 0, 393227, 655360, 0, 65548, 327680, 2, 393228, 327680, 1, 327692, 524288, 1, 262156, 524288, 1, 196620, 524288, 1, 131084, 524288, 1) + +[node name="NavigationRegion2D" type="NavigationRegion2D" parent="TileMap2"] + +[node name="NormalLayer" type="Node2D" parent="TileMap2"] +z_index = -1 +y_sort_enabled = true + +[node name="Role0001" parent="TileMap2/NormalLayer" node_paths=PackedStringArray("HurtArea", "HurtCollision", "InteractiveArea", "InteractiveCollision", "TipRoot", "TipSprite", "AnimationPlayer", "MountPoint", "BackMountPoint", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("3_bo13a")] +position = Vector2(125.5, 64) +HurtArea = NodePath("../../YSortLayer/Role0001/HurtArea") +HurtCollision = NodePath("../../YSortLayer/Role0001/HurtArea/HurtCollision") +InteractiveArea = NodePath("../../YSortLayer/Role0001/InteractiveArea") +InteractiveCollision = NodePath("../../YSortLayer/Role0001/InteractiveArea/InteractiveCollision") +TipRoot = NodePath("../../YSortLayer/Role0001/TipRoot") +TipSprite = NodePath("../../YSortLayer/Role0001/TipRoot/TipSprite") +AnimationPlayer = NodePath("../../YSortLayer/Role0001/AnimationPlayer") +MountPoint = NodePath("../../YSortLayer/Role0001/MountPoint") +BackMountPoint = NodePath("../../YSortLayer/Role0001/BackMountPoint") +MeleeAttackArea = NodePath("../../YSortLayer/Role0001/MountPoint/MeleeAttackArea") +MeleeAttackCollision = NodePath("../../YSortLayer/Role0001/MountPoint/MeleeAttackArea/MeleeAttackCollision") +ShadowSprite = NodePath("../../YSortLayer/Role0001/ShadowSprite") +AnimatedSprite = NodePath("../../YSortLayer/Role0001/AnimatedSprite") +Collision = NodePath("../../YSortLayer/Role0001/Collision") +metadata/_edit_group_ = true + +[node name="AnimatedSprite" parent="TileMap2/NormalLayer/Role0001" index="2"] +material = SubResource("ShaderMaterial_7va3f") +animation = &"idle" + +[node name="Collision" parent="TileMap2/NormalLayer/Role0001" index="3"] +visible = false + +[node name="HurtArea" parent="TileMap2/NormalLayer/Role0001" index="4"] +visible = false + +[node name="InteractiveArea" parent="TileMap2/NormalLayer/Role0001" index="5"] +visible = false + +[node name="YSortLayer" type="Node2D" parent="TileMap2"] +y_sort_enabled = true + +[node name="Role0001" parent="TileMap2/YSortLayer" instance=ExtResource("3_bo13a")] +position = Vector2(145, 55) +metadata/_edit_group_ = true + +[node name="AnimatedSprite" parent="TileMap2/YSortLayer/Role0001" index="2"] +material = SubResource("ShaderMaterial_7va3f") +animation = &"idle" + +[node name="Collision" parent="TileMap2/YSortLayer/Role0001" index="3"] +visible = false + +[node name="HurtArea" parent="TileMap2/YSortLayer/Role0001" index="4"] +visible = false + +[node name="InteractiveArea" parent="TileMap2/YSortLayer/Role0001" index="5"] +visible = false + +[node name="Sprite2D" type="Sprite2D" parent="TileMap2/YSortLayer"] +z_index = 1 +position = Vector2(103, 32.5) +texture = ExtResource("5_rv0km") + +[node name="Sprite2D" type="Sprite2D" parent="."] +material = SubResource("ShaderMaterial_fwac7") +position = Vector2(420, 252) +scale = Vector2(3.09375, 2.65625) +texture = ExtResource("7_34lsg") + +[editable path="TileMap2/NormalLayer/Role0001"] +[editable path="TileMap2/YSortLayer/Role0001"] diff --git a/DungeonShooting_Godot/scene/test/TestNewTileMap.tscn b/DungeonShooting_Godot/scene/test/TestNewTileMap.tscn index 7d954b0..9c083c5 100644 --- a/DungeonShooting_Godot/scene/test/TestNewTileMap.tscn +++ b/DungeonShooting_Godot/scene/test/TestNewTileMap.tscn @@ -1,6 +1,5 @@ [gd_scene load_steps=3 format=3 uid="uid://dr72ij0rwlafo"] -[ext_resource type="TileSet" uid="uid://b00g22o1cqhe8" path="res://resource/map/tileSet/map1/TileSet1.tres" id="1_oisp3"] @@ -10,7 +9,6 @@ [node name="TileMap" type="TileMap" parent="."] y_sort_enabled = true -tile_set = ExtResource("1_oisp3") format = 2 layer_0/name = "layer1" layer_0/y_sort_enabled = true diff --git a/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn b/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn index e8bcfc6..1619299 100644 --- a/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn +++ b/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=6 format=3 uid="uid://b3ybffxcq0kkb"] [ext_resource type="Script" path="res://src/test/TestPerfectPixelScene.cs" id="1_u6ihh"] -[ext_resource type="TileSet" uid="uid://b00g22o1cqhe8" path="res://resource/map/tileSet/map1/TileSet1.tres" id="1_wc2ux"] [ext_resource type="Texture2D" uid="uid://dto03bc2qbhnj" path="res://resource/sprite/shell/Shell0001.png" id="3_kc4l0"] [ext_resource type="SpriteFrames" uid="uid://n11thtali6es" path="res://resource/spriteFrames/role/Role0001.tres" id="4_6nerw"] + [sub_resource type="RectangleShape2D" id="RectangleShape2D_tmsub"] [node name="TestPerfectPixelScene" type="Node2D" node_paths=PackedStringArray("Player", "FpsLabel", "Camera2D")] @@ -17,7 +17,6 @@ Type = 2 [node name="TileMap" type="TileMap" parent="."] -tile_set = ExtResource("1_wc2ux") format = 2 layer_0/tile_data = PackedInt32Array(1900589, 0, 8, 1835053, 0, 8, 1769517, 0, 8, 1703981, 0, 8, 1638445, 0, 8, 1572909, 0, 8, 1507373, 0, 8, 1441837, 0, 8, 1376301, 0, 8, 1310765, 0, 8, 1245229, 0, 8, 1179693, 0, 8, 1114157, 0, 8, 1048621, 0, 8, 983085, 0, 8, 917549, 0, 8, 852013, 0, 8, 786477, 0, 8, 720941, 0, 8, 655405, 0, 8, 589869, 0, 8, 524333, 0, 8, 458797, 0, 8, 393261, 0, 8, 327725, 0, 8, 262189, 0, 8, 196653, 0, 8, 131117, 0, 8, 65581, 0, 8, 45, 0, 8, -65491, 0, 8, -131027, 0, 8, -196563, 0, 8, -262099, 0, 8, 1900588, 0, 8, 1835052, 0, 8, 1769516, 0, 8, 1703980, 0, 8, 1638444, 0, 8, 1572908, 0, 8, 1507372, 0, 8, 1441836, 0, 8, 1376300, 0, 8, 1310764, 0, 8, 1245228, 0, 8, 1179692, 0, 8, 1114156, 0, 8, 1048620, 0, 8, 983084, 0, 8, 917548, 0, 8, 852012, 0, 8, 786476, 0, 8, 720940, 0, 8, 655404, 0, 8, 589868, 0, 8, 524332, 0, 8, 458796, 0, 8, 393260, 0, 8, 327724, 0, 8, 262188, 0, 8, 196652, 0, 8, 131116, 0, 8, 65580, 0, 8, 44, 0, 8, -65492, 0, 8, -131028, 0, 8, -196564, 0, 8, -262100, 0, 8, 1900587, 0, 8, 1835051, 0, 8, 1769515, 0, 8, 1703979, 0, 8, 1638443, 0, 8, 1572907, 0, 8, 1507371, 0, 8, 1441835, 0, 8, 1376299, 0, 8, 1310763, 0, 8, 1245227, 0, 8, 1179691, 0, 8, 1114155, 0, 8, 1048619, 0, 8, 983083, 0, 8, 917547, 0, 8, 852011, 0, 8, 786475, 0, 8, 720939, 0, 8, 655403, 0, 8, 589867, 0, 8, 524331, 0, 8, 458795, 0, 8, 393259, 0, 8, 327723, 0, 8, 262187, 0, 8, 196651, 0, 8, 131115, 0, 8, 65579, 0, 8, 43, 0, 8, -65493, 0, 8, -131029, 0, 8, -196565, 0, 8, -262101, 0, 8, 1900586, 0, 8, 1835050, 0, 8, 1769514, 0, 8, 1703978, 0, 8, 1638442, 0, 8, 1572906, 0, 8, 1507370, 0, 8, 1441834, 0, 8, 1376298, 0, 8, 1310762, 0, 8, 1245226, 0, 8, 1179690, 0, 8, 1114154, 0, 8, 1048618, 0, 8, 983082, 0, 8, 917546, 0, 8, 852010, 0, 8, 786474, 0, 8, 720938, 0, 8, 655402, 0, 8, 589866, 0, 8, 524330, 0, 8, 458794, 0, 8, 393258, 0, 8, 327722, 0, 8, 262186, 0, 8, 196650, 0, 8, 131114, 0, 8, 65578, 0, 8, 42, 0, 8, -65494, 0, 8, -131030, 0, 8, -196566, 0, 8, -262102, 0, 8, 1900585, 0, 8, 1835049, 0, 8, 1769513, 0, 8, 1703977, 0, 8, 1638441, 0, 8, 1572905, 0, 8, 1507369, 0, 8, 1441833, 0, 8, 1376297, 0, 8, 1310761, 0, 8, 1245225, 0, 8, 1179689, 0, 8, 1114153, 0, 8, 1048617, 0, 8, 983081, 0, 8, 917545, 0, 8, 852009, 0, 8, 786473, 0, 8, 720937, 0, 8, 655401, 0, 8, 589865, 0, 8, 524329, 0, 8, 458793, 0, 8, 393257, 0, 8, 327721, 0, 8, 262185, 0, 8, 196649, 0, 8, 131113, 0, 8, 65577, 0, 8, 41, 0, 8, -65495, 0, 8, -131031, 0, 8, -196567, 0, 8, -262103, 0, 8, 1900584, 0, 8, 1835048, 0, 8, 1769512, 0, 8, 1703976, 0, 8, 1638440, 0, 8, 1572904, 0, 8, 1507368, 0, 8, 1441832, 0, 8, 1376296, 0, 8, 1310760, 0, 8, 1245224, 0, 8, 1179688, 0, 8, 1114152, 0, 8, 1048616, 0, 8, 983080, 0, 8, 917544, 0, 8, 852008, 0, 8, 786472, 0, 8, 720936, 0, 8, 655400, 0, 8, 589864, 0, 8, 524328, 0, 8, 458792, 0, 8, 393256, 0, 8, 327720, 0, 8, 262184, 0, 8, 196648, 0, 8, 131112, 0, 8, 65576, 0, 8, 40, 0, 8, -65496, 0, 8, -131032, 0, 8, -196568, 0, 8, -262104, 0, 8, 1900583, 0, 8, 1835047, 0, 8, 1769511, 0, 8, 1703975, 0, 8, 1638439, 0, 8, 1572903, 0, 8, 1507367, 0, 8, 1441831, 0, 8, 1376295, 0, 8, 1310759, 0, 8, 1245223, 0, 8, 1179687, 0, 8, 1114151, 0, 8, 1048615, 0, 8, 983079, 0, 8, 917543, 0, 8, 852007, 0, 8, 786471, 0, 8, 720935, 0, 8, 655399, 0, 8, 589863, 0, 8, 524327, 0, 8, 458791, 0, 8, 393255, 0, 8, 327719, 0, 8, 262183, 0, 8, 196647, 0, 8, 131111, 0, 8, 65575, 0, 8, 39, 0, 8, -65497, 0, 8, -131033, 0, 8, -196569, 0, 8, -262105, 0, 8, 1900582, 0, 8, 1835046, 0, 8, 1769510, 0, 8, 1703974, 0, 8, 1638438, 0, 8, 1572902, 0, 8, 1507366, 0, 8, 1441830, 0, 8, 1376294, 0, 8, 1310758, 0, 8, 1245222, 0, 8, 1179686, 0, 8, 1114150, 0, 8, 1048614, 0, 8, 983078, 0, 8, 917542, 0, 8, 852006, 0, 8, 786470, 0, 8, 720934, 0, 8, 655398, 0, 8, 589862, 0, 8, 524326, 0, 8, 458790, 0, 8, 393254, 0, 8, 327718, 0, 8, 262182, 0, 8, 196646, 0, 8, 131110, 0, 8, 65574, 0, 8, 38, 0, 8, -65498, 0, 8, -131034, 0, 8, -196570, 0, 8, -262106, 0, 8, 1900581, 0, 8, 1835045, 0, 8, 1769509, 0, 8, 1703973, 0, 8, 1638437, 0, 8, 1572901, 0, 8, 1507365, 0, 8, 1441829, 0, 8, 1376293, 0, 8, 1310757, 0, 8, 1245221, 0, 8, 1179685, 0, 8, 1114149, 0, 8, 1048613, 0, 8, 983077, 0, 8, 917541, 0, 8, 852005, 0, 8, 786469, 0, 8, 720933, 0, 8, 655397, 0, 8, 589861, 0, 8, 524325, 0, 8, 458789, 0, 8, 393253, 0, 8, 327717, 0, 8, 262181, 0, 8, 196645, 0, 8, 131109, 0, 8, 65573, 0, 8, 37, 0, 8, -65499, 0, 8, -131035, 0, 8, -196571, 0, 8, -262107, 0, 8, 1900580, 0, 8, 1835044, 0, 8, 1769508, 0, 8, 1703972, 0, 8, 1638436, 0, 8, 1572900, 0, 8, 1507364, 0, 8, 1441828, 0, 8, 1376292, 0, 8, 1310756, 0, 8, 1245220, 0, 8, 1179684, 0, 8, 1114148, 0, 8, 1048612, 0, 8, 983076, 0, 8, 917540, 0, 8, 852004, 0, 8, 786468, 0, 8, 720932, 0, 8, 655396, 0, 8, 589860, 0, 8, 524324, 0, 8, 458788, 0, 8, 393252, 0, 8, 327716, 0, 8, 262180, 0, 8, 196644, 0, 8, 131108, 0, 8, 65572, 0, 8, 36, 0, 8, -65500, 0, 8, -131036, 0, 8, -196572, 0, 8, -262108, 0, 8, 1900579, 0, 8, 1835043, 0, 8, 1769507, 0, 8, 1703971, 0, 8, 1638435, 0, 8, 1572899, 0, 8, 1507363, 0, 8, 1441827, 0, 8, 1376291, 0, 8, 1310755, 0, 8, 1245219, 0, 8, 1179683, 0, 8, 1114147, 0, 8, 1048611, 0, 8, 983075, 0, 8, 917539, 0, 8, 852003, 0, 8, 786467, 0, 8, 720931, 0, 8, 655395, 0, 8, 589859, 0, 8, 524323, 0, 8, 458787, 0, 8, 393251, 0, 8, 327715, 0, 8, 262179, 0, 8, 196643, 0, 8, 131107, 0, 8, 65571, 0, 8, 35, 0, 8, -65501, 0, 8, -131037, 0, 8, -196573, 0, 8, -262109, 0, 8, 1900578, 0, 8, 1835042, 0, 8, 1769506, 0, 8, 1703970, 0, 8, 1638434, 0, 8, 1572898, 0, 8, 1507362, 0, 8, 1441826, 0, 8, 1376290, 0, 8, 1310754, 0, 8, 1245218, 0, 8, 1179682, 0, 8, 1114146, 0, 8, 1048610, 0, 8, 983074, 0, 8, 917538, 0, 8, 852002, 0, 8, 786466, 0, 8, 720930, 0, 8, 655394, 0, 8, 589858, 0, 8, 524322, 0, 8, 458786, 0, 8, 393250, 0, 8, 327714, 0, 8, 262178, 0, 8, 196642, 0, 8, 131106, 0, 8, 65570, 0, 8, 34, 0, 8, -65502, 0, 8, -131038, 0, 8, -196574, 0, 8, -262110, 0, 8, 1900577, 0, 8, 1835041, 0, 8, 1769505, 0, 8, 1703969, 0, 8, 1638433, 0, 8, 1572897, 0, 8, 1507361, 0, 8, 1441825, 0, 8, 1376289, 0, 8, 1310753, 0, 8, 1245217, 0, 8, 1179681, 0, 8, 1114145, 0, 8, 1048609, 0, 8, 983073, 0, 8, 917537, 0, 8, 852001, 0, 8, 786465, 0, 8, 720929, 0, 8, 655393, 0, 8, 589857, 0, 8, 524321, 0, 8, 458785, 0, 8, 393249, 0, 8, 327713, 0, 8, 262177, 0, 8, 196641, 0, 8, 131105, 0, 8, 65569, 0, 8, 33, 0, 8, -65503, 0, 8, -131039, 0, 8, -196575, 0, 8, -262111, 0, 8, 1900576, 0, 8, 1835040, 0, 8, 1769504, 0, 8, 1703968, 0, 8, 1638432, 0, 8, 1572896, 0, 8, 1507360, 0, 8, 1441824, 0, 8, 1376288, 0, 8, 1310752, 0, 8, 1245216, 0, 8, 1179680, 0, 8, 1114144, 0, 8, 1048608, 0, 8, 983072, 0, 8, 917536, 0, 8, 852000, 0, 8, 786464, 0, 8, 720928, 0, 8, 655392, 0, 8, 589856, 0, 8, 524320, 0, 8, 458784, 0, 8, 393248, 0, 8, 327712, 0, 8, 262176, 0, 8, 196640, 0, 8, 131104, 0, 8, 65568, 0, 8, 32, 0, 8, -65504, 0, 8, -131040, 0, 8, -196576, 0, 8, -262112, 0, 8, 1900575, 0, 8, 1835039, 0, 8, 1769503, 0, 8, 1703967, 0, 8, 1638431, 0, 8, 1572895, 0, 8, 1507359, 0, 8, 1441823, 0, 8, 1376287, 0, 8, 1310751, 0, 8, 1245215, 0, 8, 1179679, 0, 8, 1114143, 0, 8, 1048607, 0, 8, 983071, 0, 8, 917535, 0, 8, 851999, 0, 8, 786463, 0, 8, 720927, 0, 8, 655391, 0, 8, 589855, 0, 8, 524319, 0, 8, 458783, 0, 8, 393247, 0, 8, 327711, 0, 8, 262175, 0, 8, 196639, 0, 8, 131103, 0, 8, 65567, 0, 8, 31, 0, 8, -65505, 0, 8, -131041, 0, 8, -196577, 0, 8, -262113, 0, 8, 1900574, 0, 8, 1835038, 0, 8, 1769502, 0, 8, 1703966, 0, 8, 1638430, 0, 8, 1572894, 0, 8, 1507358, 0, 8, 1441822, 0, 8, 1376286, 0, 8, 1310750, 0, 8, 1245214, 0, 8, 1179678, 0, 8, 1114142, 0, 8, 1048606, 0, 8, 983070, 0, 8, 917534, 0, 8, 851998, 0, 8, 786462, 0, 8, 720926, 0, 8, 655390, 0, 8, 589854, 0, 8, 524318, 0, 8, 458782, 0, 8, 393246, 0, 8, 327710, 0, 8, 262174, 0, 8, 196638, 0, 8, 131102, 0, 8, 65566, 0, 8, 30, 0, 8, -65506, 0, 8, -131042, 0, 8, -196578, 0, 8, -262114, 0, 8, 1900573, 0, 8, 1835037, 0, 8, 1769501, 0, 8, 1703965, 0, 8, 1638429, 0, 8, 1572893, 0, 8, 1507357, 0, 8, 1441821, 0, 8, 1376285, 0, 8, 1310749, 0, 8, 1245213, 0, 8, 1179677, 0, 8, 1114141, 0, 8, 1048605, 0, 8, 983069, 0, 8, 917533, 0, 8, 851997, 0, 8, 786461, 0, 8, 720925, 0, 8, 655389, 0, 8, 589853, 0, 8, 524317, 0, 8, 458781, 0, 8, 393245, 0, 8, 327709, 0, 8, 262173, 0, 8, 196637, 0, 8, 131101, 0, 8, 65565, 0, 8, 29, 0, 8, -65507, 0, 8, -131043, 0, 8, -196579, 0, 8, -262115, 0, 8, 1900572, 0, 8, 1835036, 0, 8, 1769500, 0, 8, 1703964, 0, 8, 1638428, 0, 8, 1572892, 0, 8, 1507356, 0, 8, 1441820, 0, 8, 1376284, 0, 8, 1310748, 0, 8, 1245212, 0, 8, 1179676, 0, 8, 1114140, 0, 8, 1048604, 0, 8, 983068, 0, 8, 917532, 0, 8, 851996, 0, 8, 786460, 0, 8, 720924, 0, 8, 655388, 0, 8, 589852, 0, 8, 524316, 0, 8, 458780, 0, 8, 393244, 0, 8, 327708, 0, 8, 262172, 0, 8, 196636, 0, 8, 131100, 0, 8, 65564, 0, 8, 28, 0, 8, -65508, 0, 8, -131044, 0, 8, -196580, 0, 8, -262116, 0, 8, 1900571, 0, 8, 1835035, 0, 8, 1769499, 0, 8, 1703963, 0, 8, 1638427, 0, 8, 1572891, 0, 8, 1507355, 0, 8, 1441819, 0, 8, 1376283, 0, 8, 1310747, 0, 8, 1245211, 0, 8, 1179675, 0, 8, 1114139, 0, 8, 1048603, 0, 8, 983067, 0, 8, 917531, 0, 8, 851995, 0, 8, 786459, 0, 8, 720923, 0, 8, 655387, 0, 8, 589851, 0, 8, 524315, 0, 8, 458779, 0, 8, 393243, 0, 8, 327707, 0, 8, 262171, 0, 8, 196635, 0, 8, 131099, 0, 8, 65563, 0, 8, 27, 0, 8, -65509, 0, 8, -131045, 0, 8, -196581, 0, 8, -262117, 0, 8, 1900570, 0, 8, 1835034, 0, 8, 1769498, 0, 8, 1703962, 0, 8, 1638426, 0, 8, 1572890, 0, 8, 1507354, 0, 8, 1441818, 0, 8, 1376282, 0, 8, 1310746, 0, 8, 1245210, 0, 8, 1179674, 0, 8, 1114138, 0, 8, 1048602, 0, 8, 983066, 0, 8, 917530, 0, 8, 851994, 0, 8, 786458, 0, 8, 720922, 0, 8, 655386, 0, 8, 589850, 0, 8, 524314, 0, 8, 458778, 0, 8, 393242, 0, 8, 327706, 0, 8, 262170, 0, 8, 196634, 0, 8, 131098, 0, 8, 65562, 0, 8, 26, 0, 8, -65510, 0, 8, -131046, 0, 8, -196582, 0, 8, -262118, 0, 8, 1900569, 0, 8, 1835033, 0, 8, 1769497, 0, 8, 1703961, 0, 8, 1638425, 0, 8, 1572889, 0, 8, 1507353, 0, 8, 1441817, 0, 8, 1376281, 0, 8, 1310745, 0, 8, 1245209, 0, 8, 1179673, 0, 8, 1114137, 0, 8, 1048601, 0, 8, 983065, 0, 8, 917529, 0, 8, 851993, 0, 8, 786457, 0, 8, 720921, 0, 8, 655385, 0, 8, 589849, 0, 8, 524313, 0, 8, 458777, 0, 8, 393241, 0, 8, 327705, 0, 8, 262169, 0, 8, 196633, 0, 8, 131097, 0, 8, 65561, 0, 8, 25, 0, 8, -65511, 0, 8, -131047, 0, 8, -196583, 0, 8, -262119, 0, 8, 1900568, 0, 8, 1835032, 0, 8, 1769496, 0, 8, 1703960, 0, 8, 1638424, 0, 8, 1572888, 0, 8, 1507352, 0, 8, 1441816, 0, 8, 1376280, 0, 8, 1310744, 0, 8, 1245208, 0, 8, 1179672, 0, 8, 1114136, 0, 8, 1048600, 0, 8, 983064, 0, 8, 917528, 0, 8, 851992, 0, 8, 786456, 0, 8, 720920, 0, 8, 655384, 0, 8, 589848, 0, 8, 524312, 0, 8, 458776, 0, 8, 393240, 0, 8, 327704, 0, 8, 262168, 0, 8, 196632, 0, 8, 131096, 0, 8, 65560, 0, 8, 24, 0, 8, -65512, 0, 8, -131048, 0, 8, -196584, 0, 8, -262120, 0, 8, 1900567, 0, 8, 1835031, 0, 8, 1769495, 0, 8, 1703959, 0, 8, 1638423, 0, 8, 1572887, 0, 8, 1507351, 0, 8, 1441815, 0, 8, 1376279, 0, 8, 1310743, 0, 8, 1245207, 0, 8, 1179671, 0, 8, 1114135, 0, 8, 1048599, 0, 8, 983063, 0, 8, 917527, 0, 8, 851991, 0, 8, 786455, 0, 8, 720919, 0, 8, 655383, 0, 8, 589847, 0, 8, 524311, 0, 8, 458775, 0, 8, 393239, 0, 8, 327703, 0, 8, 262167, 0, 8, 196631, 0, 8, 131095, 0, 8, 65559, 0, 8, 23, 0, 8, -65513, 0, 8, -131049, 0, 8, -196585, 0, 8, -262121, 0, 8, 1900566, 0, 8, 1835030, 0, 8, 1769494, 0, 8, 1703958, 0, 8, 1638422, 0, 8, 1572886, 0, 8, 1507350, 0, 8, 1441814, 0, 8, 1376278, 0, 8, 1310742, 0, 8, 1245206, 0, 8, 1179670, 0, 8, 1114134, 0, 8, 1048598, 0, 8, 983062, 0, 8, 917526, 0, 8, 851990, 0, 8, 786454, 0, 8, 720918, 0, 8, 655382, 0, 8, 589846, 0, 8, 524310, 0, 8, 458774, 0, 8, 393238, 0, 8, 327702, 0, 8, 262166, 0, 8, 196630, 0, 8, 131094, 0, 8, 65558, 0, 8, 22, 0, 8, -65514, 0, 8, -131050, 0, 8, -196586, 0, 8, -262122, 0, 8, 1900565, 0, 8, 1835029, 0, 8, 1769493, 0, 8, 1703957, 0, 8, 1638421, 0, 8, 1572885, 0, 8, 1507349, 0, 8, 1441813, 0, 8, 1376277, 0, 8, 1310741, 0, 8, 1245205, 0, 8, 1179669, 0, 8, 1114133, 0, 8, 1048597, 0, 8, 983061, 0, 8, 917525, 0, 8, 851989, 0, 8, 786453, 0, 8, 720917, 0, 8, 655381, 0, 8, 589845, 0, 8, 524309, 0, 8, 458773, 0, 8, 393237, 0, 8, 327701, 0, 8, 262165, 0, 8, 196629, 0, 8, 131093, 0, 8, 65557, 0, 8, 21, 0, 8, -65515, 0, 8, -131051, 0, 8, -196587, 0, 8, -262123, 0, 8, 1900564, 0, 8, 1835028, 0, 8, 1769492, 0, 8, 1703956, 0, 8, 1638420, 0, 8, 1572884, 0, 8, 1507348, 0, 8, 1441812, 0, 8, 1376276, 0, 8, 1310740, 0, 8, 1245204, 0, 8, 1179668, 0, 8, 1114132, 0, 8, 1048596, 0, 8, 983060, 0, 8, 917524, 0, 8, 851988, 0, 8, 786452, 0, 8, 720916, 0, 8, 655380, 0, 8, 589844, 0, 8, 524308, 0, 8, 458772, 0, 8, 393236, 0, 8, 327700, 0, 8, 262164, 0, 8, 196628, 0, 8, 131092, 0, 8, 65556, 0, 8, 20, 0, 8, -65516, 0, 8, -131052, 0, 8, -196588, 0, 8, -262124, 0, 8, 1900563, 0, 8, 1835027, 0, 8, 1769491, 0, 8, 1703955, 0, 8, 1638419, 0, 8, 1572883, 0, 8, 1507347, 0, 8, 1441811, 0, 8, 1376275, 0, 8, 1310739, 0, 8, 1245203, 0, 8, 1179667, 0, 8, 1114131, 0, 8, 1048595, 0, 8, 983059, 0, 8, 917523, 0, 8, 851987, 0, 8, 786451, 0, 8, 720915, 0, 8, 655379, 0, 8, 589843, 0, 8, 524307, 0, 8, 458771, 0, 8, 393235, 0, 8, 327699, 0, 8, 262163, 0, 8, 196627, 0, 8, 131091, 0, 8, 65555, 0, 8, 19, 0, 8, -65517, 0, 8, -131053, 0, 8, -196589, 0, 8, -262125, 0, 8, 1900562, 0, 8, 1835026, 0, 8, 1769490, 0, 8, 1703954, 0, 8, 1638418, 0, 8, 1572882, 0, 8, 1507346, 0, 8, 1441810, 0, 8, 1376274, 0, 8, 1310738, 0, 8, 1245202, 0, 8, 1179666, 0, 8, 1114130, 0, 8, 1048594, 0, 8, 983058, 0, 8, 917522, 0, 8, 851986, 0, 8, 786450, 0, 8, 720914, 0, 8, 655378, 0, 8, 589842, 0, 8, 524306, 0, 8, 458770, 0, 8, 393234, 0, 8, 327698, 0, 8, 262162, 0, 8, 196626, 0, 8, 131090, 0, 8, 65554, 0, 8, 18, 0, 8, -65518, 0, 8, -131054, 0, 8, -196590, 0, 8, -262126, 0, 8, 1900561, 0, 8, 1835025, 0, 8, 1769489, 0, 8, 1703953, 0, 8, 1638417, 0, 8, 1572881, 0, 8, 1507345, 0, 8, 1441809, 0, 8, 1376273, 0, 8, 1310737, 0, 8, 1245201, 0, 8, 1179665, 0, 8, 1114129, 0, 8, 1048593, 0, 8, 983057, 0, 8, 917521, 0, 8, 851985, 0, 8, 786449, 0, 8, 720913, 0, 8, 655377, 0, 8, 589841, 0, 8, 524305, 0, 8, 458769, 0, 8, 393233, 0, 8, 327697, 0, 8, 262161, 0, 8, 196625, 0, 8, 131089, 0, 8, 65553, 0, 8, 17, 0, 8, -65519, 0, 8, -131055, 0, 8, -196591, 0, 8, -262127, 0, 8, 1900560, 0, 8, 1835024, 0, 8, 1769488, 0, 8, 1703952, 0, 8, 1638416, 0, 8, 1572880, 0, 8, 1507344, 0, 8, 1441808, 0, 8, 1376272, 0, 8, 1310736, 0, 8, 1245200, 0, 8, 1179664, 0, 8, 1114128, 0, 8, 1048592, 0, 8, 983056, 0, 8, 917520, 0, 8, 851984, 0, 8, 786448, 0, 8, 720912, 0, 8, 655376, 0, 8, 589840, 0, 8, 524304, 0, 8, 458768, 0, 8, 393232, 0, 8, 327696, 0, 8, 262160, 0, 8, 196624, 0, 8, 131088, 0, 8, 65552, 0, 8, 16, 0, 8, -65520, 0, 8, -131056, 0, 8, -196592, 0, 8, -262128, 0, 8, 1900559, 0, 8, 1835023, 0, 8, 1769487, 0, 8, 1703951, 0, 8, 1638415, 0, 8, 1572879, 0, 8, 1507343, 0, 8, 1441807, 0, 8, 1376271, 0, 8, 1310735, 0, 8, 1245199, 0, 8, 1179663, 0, 8, 1114127, 0, 8, 1048591, 0, 8, 983055, 0, 8, 917519, 0, 8, 851983, 0, 8, 786447, 0, 8, 720911, 0, 8, 655375, 0, 8, 589839, 0, 8, 524303, 0, 8, 458767, 0, 8, 393231, 0, 8, 327695, 0, 8, 262159, 0, 8, 196623, 0, 8, 131087, 0, 8, 65551, 0, 8, 15, 0, 8, -65521, 0, 8, -131057, 0, 8, -196593, 0, 8, -262129, 0, 8, 1900558, 0, 8, 1835022, 0, 8, 1769486, 0, 8, 1703950, 0, 8, 1638414, 0, 8, 1572878, 0, 8, 1507342, 0, 8, 1441806, 0, 8, 1376270, 0, 8, 1310734, 0, 8, 1245198, 0, 8, 1179662, 0, 8, 1114126, 0, 8, 1048590, 0, 8, 983054, 0, 8, 917518, 0, 8, 851982, 0, 8, 786446, 0, 8, 720910, 0, 8, 655374, 0, 8, 589838, 0, 8, 524302, 0, 8, 458766, 0, 8, 393230, 0, 8, 327694, 0, 8, 262158, 0, 8, 196622, 0, 8, 131086, 0, 8, 65550, 0, 8, 14, 0, 8, -65522, 0, 8, -131058, 0, 8, -196594, 0, 8, -262130, 0, 8, 1900557, 0, 8, 1835021, 0, 8, 1769485, 0, 8, 1703949, 0, 8, 1638413, 0, 8, 1572877, 0, 8, 1507341, 0, 8, 1441805, 0, 8, 1376269, 0, 8, 1310733, 0, 8, 1245197, 0, 8, 1179661, 0, 8, 1114125, 0, 8, 1048589, 0, 8, 983053, 0, 8, 917517, 0, 8, 851981, 0, 8, 786445, 0, 8, 720909, 0, 8, 655373, 0, 8, 589837, 0, 8, 524301, 0, 8, 458765, 0, 8, 393229, 0, 8, 327693, 0, 8, 262157, 0, 8, 196621, 0, 8, 131085, 0, 8, 65549, 0, 8, 13, 0, 8, -65523, 0, 8, -131059, 0, 8, -196595, 0, 8, -262131, 0, 8, 1900556, 0, 8, 1835020, 0, 8, 1769484, 0, 8, 1703948, 0, 8, 1638412, 0, 8, 1572876, 0, 8, 1507340, 0, 8, 1441804, 0, 8, 1376268, 0, 8, 1310732, 0, 8, 1245196, 0, 8, 1179660, 0, 8, 1114124, 0, 8, 1048588, 0, 8, 983052, 0, 8, 917516, 0, 8, 851980, 0, 8, 786444, 0, 8, 720908, 0, 8, 655372, 0, 8, 589836, 0, 8, 524300, 0, 8, 458764, 0, 8, 393228, 0, 8, 327692, 0, 8, 262156, 0, 8, 196620, 0, 8, 131084, 0, 8, 65548, 0, 8, 12, 0, 8, -65524, 0, 8, -131060, 0, 8, -196596, 0, 8, -262132, 0, 8, 1900555, 0, 8, 1835019, 0, 8, 1769483, 0, 8, 1703947, 0, 8, 1638411, 0, 8, 1572875, 0, 8, 1507339, 0, 8, 1441803, 0, 8, 1376267, 0, 8, 1310731, 0, 8, 1245195, 0, 8, 1179659, 0, 8, 1114123, 0, 8, 1048587, 0, 8, 983051, 0, 8, 917515, 0, 8, 851979, 0, 8, 786443, 0, 8, 720907, 0, 8, 655371, 0, 8, 589835, 0, 8, 524299, 0, 8, 458763, 0, 8, 393227, 0, 8, 327691, 0, 8, 262155, 0, 8, 196619, 0, 8, 131083, 0, 8, 65547, 0, 8, 11, 0, 8, -65525, 0, 8, -131061, 0, 8, -196597, 0, 8, -262133, 0, 8, 1900554, 0, 8, 1835018, 0, 8, 1769482, 0, 8, 1703946, 0, 8, 1638410, 0, 8, 1572874, 0, 8, 1507338, 0, 8, 1441802, 0, 8, 1376266, 0, 8, 1310730, 0, 8, 1245194, 0, 8, 1179658, 0, 8, 1114122, 0, 8, 1048586, 0, 8, 983050, 0, 8, 917514, 0, 8, 851978, 0, 8, 786442, 0, 8, 720906, 0, 8, 655370, 0, 8, 589834, 0, 8, 524298, 0, 8, 458762, 0, 8, 393226, 0, 8, 327690, 0, 8, 262154, 0, 8, 196618, 0, 8, 131082, 0, 8, 65546, 0, 8, 10, 0, 8, -65526, 0, 8, -131062, 0, 8, -196598, 0, 8, -262134, 0, 8, 1900553, 0, 8, 1835017, 0, 8, 1769481, 0, 8, 1703945, 0, 8, 1638409, 0, 8, 1572873, 0, 8, 1507337, 0, 8, 1441801, 0, 8, 1376265, 0, 8, 1310729, 0, 8, 1245193, 0, 8, 1179657, 0, 8, 1114121, 0, 8, 1048585, 0, 8, 983049, 0, 8, 917513, 0, 8, 851977, 0, 8, 786441, 0, 8, 720905, 0, 8, 655369, 0, 8, 589833, 0, 8, 524297, 0, 8, 458761, 0, 8, 393225, 0, 8, 327689, 0, 8, 262153, 0, 8, 196617, 0, 8, 131081, 0, 8, 65545, 0, 8, 9, 0, 8, -65527, 0, 8, -131063, 0, 8, -196599, 0, 8, -262135, 0, 8, 1900552, 0, 8, 1835016, 0, 8, 1769480, 0, 8, 1703944, 0, 8, 1638408, 0, 8, 1572872, 0, 8, 1507336, 0, 8, 1441800, 0, 8, 1376264, 0, 8, 1310728, 0, 8, 1245192, 0, 8, 1179656, 0, 8, 1114120, 0, 8, 1048584, 0, 8, 983048, 0, 8, 917512, 0, 8, 851976, 0, 8, 786440, 0, 8, 720904, 0, 8, 655368, 0, 8, 589832, 0, 8, 524296, 0, 8, 458760, 0, 8, 393224, 0, 8, 327688, 0, 8, 262152, 0, 8, 196616, 0, 8, 131080, 0, 8, 65544, 0, 8, 8, 0, 8, -65528, 0, 8, -131064, 0, 8, -196600, 0, 8, -262136, 0, 8, 1900551, 0, 8, 1835015, 0, 8, 1769479, 0, 8, 1703943, 0, 8, 1638407, 0, 8, 1572871, 0, 8, 1507335, 0, 8, 1441799, 0, 8, 1376263, 0, 8, 1310727, 0, 8, 1245191, 0, 8, 1179655, 0, 8, 1114119, 0, 8, 1048583, 0, 8, 983047, 0, 8, 917511, 0, 8, 851975, 0, 8, 786439, 0, 8, 720903, 0, 8, 655367, 0, 8, 589831, 0, 8, 524295, 0, 8, 458759, 0, 8, 393223, 0, 8, 327687, 0, 8, 262151, 0, 8, 196615, 0, 8, 131079, 0, 8, 65543, 0, 8, 7, 0, 8, -65529, 0, 8, -131065, 0, 8, -196601, 0, 8, -262137, 0, 8, 1900550, 0, 8, 1835014, 0, 8, 1769478, 0, 8, 1703942, 0, 8, 1638406, 0, 8, 1572870, 0, 8, 1507334, 0, 8, 1441798, 0, 8, 1376262, 0, 8, 1310726, 0, 8, 1245190, 0, 8, 1179654, 0, 8, 1114118, 0, 8, 1048582, 0, 8, 983046, 0, 8, 917510, 0, 8, 851974, 0, 8, 786438, 0, 8, 720902, 0, 8, 655366, 0, 8, 589830, 0, 8, 524294, 0, 8, 458758, 0, 8, 393222, 0, 8, 327686, 0, 8, 262150, 0, 8, 196614, 0, 8, 131078, 0, 8, 65542, 0, 8, 6, 0, 8, -65530, 0, 8, -131066, 0, 8, -196602, 0, 8, -262138, 0, 8, 1900549, 0, 8, 1835013, 0, 8, 1769477, 0, 8, 1703941, 0, 8, 1638405, 0, 8, 1572869, 0, 8, 1507333, 0, 8, 1441797, 0, 8, 1376261, 0, 8, 1310725, 0, 8, 1245189, 0, 8, 1179653, 0, 8, 1114117, 0, 8, 1048581, 0, 8, 983045, 0, 8, 917509, 0, 8, 851973, 0, 8, 786437, 0, 8, 720901, 0, 8, 655365, 0, 8, 589829, 0, 8, 524293, 0, 8, 458757, 0, 8, 393221, 0, 8, 327685, 0, 8, 262149, 0, 8, 196613, 0, 8, 131077, 0, 8, 65541, 0, 8, 5, 0, 8, -65531, 0, 8, -131067, 0, 8, -196603, 0, 8, -262139, 0, 8, 1900548, 0, 8, 1835012, 0, 8, 1769476, 0, 8, 1703940, 0, 8, 1638404, 0, 8, 1572868, 0, 8, 1507332, 0, 8, 1441796, 0, 8, 1376260, 0, 8, 1310724, 0, 8, 1245188, 0, 8, 1179652, 0, 8, 1114116, 0, 8, 1048580, 0, 8, 983044, 0, 8, 917508, 0, 8, 851972, 0, 8, 786436, 0, 8, 720900, 0, 8, 655364, 0, 8, 589828, 0, 8, 524292, 0, 8, 458756, 0, 8, 393220, 0, 8, 327684, 0, 8, 262148, 0, 8, 196612, 0, 8, 131076, 0, 8, 65540, 0, 8, 4, 0, 8, -65532, 0, 8, -131068, 0, 8, -196604, 0, 8, -262140, 0, 8, 1900547, 0, 8, 1835011, 0, 8, 1769475, 0, 8, 1703939, 0, 8, 1638403, 0, 8, 1572867, 0, 8, 1507331, 0, 8, 1441795, 0, 8, 1376259, 0, 8, 1310723, 0, 8, 1245187, 0, 8, 1179651, 0, 8, 1114115, 0, 8, 1048579, 0, 8, 983043, 0, 8, 917507, 0, 8, 851971, 0, 8, 786435, 0, 8, 720899, 0, 8, 655363, 0, 8, 589827, 0, 8, 524291, 0, 8, 458755, 0, 8, 393219, 0, 8, 327683, 0, 8, 262147, 0, 8, 196611, 0, 8, 131075, 0, 8, 65539, 0, 8, 3, 0, 8, -65533, 0, 8, -131069, 0, 8, -196605, 0, 8, -262141, 0, 8, 1900546, 0, 8, 1835010, 0, 8, 1769474, 0, 8, 1703938, 0, 8, 1638402, 0, 8, 1572866, 0, 8, 1507330, 0, 8, 1441794, 0, 8, 1376258, 0, 8, 1310722, 0, 8, 1245186, 0, 8, 1179650, 0, 8, 1114114, 0, 8, 1048578, 0, 8, 983042, 0, 8, 917506, 0, 8, 851970, 0, 8, 786434, 0, 8, 720898, 0, 8, 655362, 0, 8, 589826, 0, 8, 524290, 0, 8, 458754, 0, 8, 393218, 0, 8, 327682, 0, 8, 262146, 0, 8, 196610, 0, 8, 131074, 0, 8, 65538, 0, 8, 2, 0, 8, -65534, 0, 8, -131070, 0, 8, -196606, 0, 8, -262142, 0, 8, 1900545, 0, 8, 1835009, 0, 8, 1769473, 0, 8, 1703937, 0, 8, 1638401, 0, 8, 1572865, 0, 8, 1507329, 0, 8, 1441793, 0, 8, 1376257, 0, 8, 1310721, 0, 8, 1245185, 0, 8, 1179649, 0, 8, 1114113, 0, 8, 1048577, 0, 8, 983041, 0, 8, 917505, 0, 8, 851969, 0, 8, 786433, 0, 8, 720897, 0, 8, 655361, 0, 8, 589825, 0, 8, 524289, 0, 8, 458753, 0, 8, 393217, 0, 8, 327681, 0, 8, 262145, 0, 8, 196609, 0, 8, 131073, 0, 8, 65537, 0, 8, 1, 0, 8, -65535, 0, 8, -131071, 0, 8, -196607, 0, 8, -262143, 0, 8, 1900544, 0, 8, 1835008, 0, 8, 1769472, 0, 8, 1703936, 0, 8, 1638400, 0, 8, 1572864, 0, 8, 1507328, 0, 8, 1441792, 0, 8, 1376256, 0, 8, 1310720, 0, 8, 1245184, 0, 8, 1179648, 0, 8, 1114112, 0, 8, 1048576, 0, 8, 983040, 0, 8, 917504, 0, 8, 851968, 0, 8, 786432, 0, 8, 720896, 0, 8, 655360, 0, 8, 589824, 0, 8, 524288, 0, 8, 458752, 0, 8, 393216, 0, 8, 327680, 0, 8, 262144, 0, 8, 196608, 0, 8, 131072, 0, 8, 65536, 0, 8, 0, 0, 8, -65536, 0, 8, -131072, 0, 8, -196608, 0, 8, -262144, 0, 8, 1966079, 0, 8, 1900543, 0, 8, 1835007, 0, 8, 1769471, 0, 8, 1703935, 0, 8, 1638399, 0, 8, 1572863, 0, 8, 1507327, 0, 8, 1441791, 0, 8, 1376255, 0, 8, 1310719, 0, 8, 1245183, 0, 8, 1179647, 0, 8, 1114111, 0, 8, 1048575, 0, 8, 983039, 0, 8, 917503, 0, 8, 851967, 0, 8, 786431, 0, 8, 720895, 0, 8, 655359, 0, 8, 589823, 0, 8, 524287, 0, 8, 458751, 0, 8, 393215, 0, 8, 327679, 0, 8, 262143, 0, 8, 196607, 0, 8, 131071, 0, 8, 65535, 0, 8, -1, 0, 8, -65537, 0, 8, -131073, 0, 8, -196609, 0, 8, 1966078, 0, 8, 1900542, 0, 8, 1835006, 0, 8, 1769470, 0, 8, 1703934, 0, 8, 1638398, 0, 8, 1572862, 0, 8, 1507326, 0, 8, 1441790, 0, 8, 1376254, 0, 8, 1310718, 0, 8, 1245182, 0, 8, 1179646, 0, 8, 1114110, 0, 8, 1048574, 0, 8, 983038, 0, 8, 917502, 0, 8, 851966, 0, 8, 786430, 0, 8, 720894, 0, 8, 655358, 0, 8, 589822, 0, 8, 524286, 0, 8, 458750, 0, 8, 393214, 0, 8, 327678, 0, 8, 262142, 0, 8, 196606, 0, 8, 131070, 0, 8, 65534, 0, 8, -2, 0, 8, -65538, 0, 8, -131074, 0, 8, -196610, 0, 8, 1966077, 0, 8, 1900541, 0, 8, 1835005, 0, 8, 1769469, 0, 8, 1703933, 0, 8, 1638397, 0, 8, 1572861, 0, 8, 1507325, 0, 8, 1441789, 0, 8, 1376253, 0, 8, 1310717, 0, 8, 1245181, 0, 8, 1179645, 0, 8, 1114109, 0, 8, 1048573, 0, 8, 983037, 0, 8, 917501, 0, 8, 851965, 0, 8, 786429, 0, 8, 720893, 0, 8, 655357, 0, 8, 589821, 0, 8, 524285, 0, 8, 458749, 0, 8, 393213, 0, 8, 327677, 0, 8, 262141, 0, 8, 196605, 0, 8, 131069, 0, 8, 65533, 0, 8, -3, 0, 8, -65539, 0, 8, -131075, 0, 8, -196611, 0, 8, 1966076, 0, 8, 1900540, 0, 8, 1835004, 0, 8, 1769468, 0, 8, 1703932, 0, 8, 1638396, 0, 8, 1572860, 0, 8, 1507324, 0, 8, 1441788, 0, 8, 1376252, 0, 8, 1310716, 0, 8, 1245180, 0, 8, 1179644, 0, 8, 1114108, 0, 8, 1048572, 0, 8, 983036, 0, 8, 917500, 0, 8, 851964, 0, 8, 786428, 0, 8, 720892, 0, 8, 655356, 0, 8, 589820, 0, 8, 524284, 0, 8, 458748, 0, 8, 393212, 0, 8, 327676, 0, 8, 262140, 0, 8, 196604, 0, 8, 131068, 0, 8, 65532, 0, 8, -4, 0, 8, -65540, 0, 8, -131076, 0, 8, -196612, 0, 8, 1966075, 0, 8, 1900539, 0, 8, 1835003, 0, 8, 1769467, 0, 8, 1703931, 0, 8, 1638395, 0, 8, 1572859, 0, 8, 1507323, 0, 8, 1441787, 0, 8, 1376251, 0, 8, 1310715, 0, 8, 1245179, 0, 8, 1179643, 0, 8, 1114107, 0, 8, 1048571, 0, 8, 983035, 0, 8, 917499, 0, 8, 851963, 0, 8, 786427, 0, 8, 720891, 0, 8, 655355, 0, 8, 589819, 0, 8, 524283, 0, 8, 458747, 0, 8, 393211, 0, 8, 327675, 0, 8, 262139, 0, 8, 196603, 0, 8, 131067, 0, 8, 65531, 0, 8, -5, 0, 8, -65541, 0, 8, -131077, 0, 8, -196613, 0, 8, -131078, 196608, 3, -262150, 196608, 4, -262148, 131072, 7, -65542, 196608, 3, -196614, 196608, 3, -6, 196608, 3, 65530, 196608, 3, 131066, 196608, 3, 196602, 196608, 3, 262138, 196608, 3, 327674, 196608, 3, 393210, 196608, 3, 458746, 196608, 3, 524282, 196608, 3, 589818, 196608, 3, 655354, 196608, 3, 720890, 196608, 3, 786426, 196608, 3, 851962, 196608, 3, 917498, 196608, 3, 983034, 196608, 3, 1048570, 196608, 3, 1114106, 196608, 3, 1179642, 196608, 3, 1245178, 196608, 3, 1310714, 196608, 3, 1376250, 196608, 3, 1441786, 196608, 3, 1507322, 196608, 3, 1572858, 196608, 3, 1638394, 196608, 3, 1703930, 196608, 3, 1769466, 196608, 3, 1835002, 196608, 3, 1900538, 196608, 3, 1966074, 196608, 3, 2031612, 131072, 2, 2031610, 720896, 2, -262149, 131072, 7, -262147, 131072, 7, 2031613, 131072, 2, 2031611, 131072, 2, -262146, 131072, 7, 2031614, 131072, 2, -262145, 131072, 7, 2031615, 131072, 2, -327680, 131072, 7, 1966080, 131072, 2, -327679, 131072, 7, 1966081, 131072, 2, -327678, 131072, 7, 1966082, 131072, 2, -327677, 131072, 7, 1966083, 131072, 2, -327676, 131072, 7, 1966084, 131072, 2, -327675, 131072, 7, 1966085, 131072, 2, -327674, 131072, 7, 1966086, 131072, 2, -327673, 131072, 7, 1966087, 131072, 2, -327672, 131072, 7, 1966088, 131072, 2, -327671, 131072, 7, 1966089, 196608, 2, -327670, 131072, 7, 1966090, 0, 8, -327669, 131072, 7, 1966091, 0, 8, -327668, 131072, 7, 1966092, 0, 8, -327667, 131072, 7, 1966093, 0, 8, -327666, 131072, 7, 1966094, 0, 8, -327665, 131072, 7, 1966095, 0, 8, -327664, 131072, 7, 1966096, 0, 8, -327663, 131072, 7, 1966097, 0, 8, -327662, 131072, 7, 1966098, 0, 8, -327661, 131072, 7, 1966099, 0, 8, -327660, 131072, 7, 1966100, 0, 8, -327659, 131072, 7, 1966101, 0, 8, -327658, 131072, 7, 1966102, 0, 8, -327657, 131072, 7, 1966103, 0, 8, -327656, 131072, 7, 1966104, 0, 8, -327655, 131072, 7, 1966105, 0, 8, -327654, 131072, 7, 1966106, 0, 8, -327653, 131072, 7, 1966107, 65536, 2, -327652, 131072, 7, 1966108, 131072, 2, -327651, 131072, 7, 1966109, 131072, 2, -327650, 131072, 7, 1966110, 131072, 2, -327649, 131072, 7, 1966111, 131072, 2, -327648, 131072, 7, 1966112, 131072, 2, -327647, 131072, 7, 1966113, 131072, 2, -327646, 131072, 7, 1966114, 131072, 2, -327645, 131072, 7, 1966115, 131072, 2, -327644, 131072, 7, 1966116, 196608, 2, -327643, 131072, 7, 1966117, 0, 8, -327642, 131072, 7, 1966118, 0, 8, -327641, 131072, 7, 1966119, 0, 8, -327640, 131072, 7, 1966120, 0, 8, -327639, 131072, 7, 1966121, 0, 8, -327638, 131072, 7, 1966122, 0, 8, -327637, 131072, 7, 1966123, 0, 8, -327636, 131072, 7, 1966124, 0, 8, -327635, 131072, 7, 1966125, 0, 8, -196562, 65536, 3, -327634, 65536, 4, -131026, 65536, 3, -262098, 65536, 3, -65490, 65536, 3, 46, 65536, 3, 65582, 65536, 3, 131118, 65536, 3, 196654, 65536, 3, 262190, 65536, 3, 327726, 65536, 3, 393262, 65536, 3, 458798, 65536, 3, 524334, 65536, 3, 589870, 65536, 3, 655406, 65536, 7, 720942, 0, 8, 786478, 0, 8, 852014, 0, 8, 917550, 0, 8, 983086, 0, 8, 1048622, 0, 8, 1114158, 0, 8, 1179694, 0, 8, 1245230, 0, 8, 1310766, 0, 8, 1376302, 0, 8, 1441838, 0, 8, 1507374, 0, 8, 1572910, 0, 8, 1638446, 0, 8, 1703982, 0, 8, 1769518, 0, 8, 1835054, 0, 8, 1900590, 0, 8, 1966126, 0, 8, 2949189, 0, 8, 2883653, 0, 8, 2818117, 0, 8, 2752581, 0, 8, 2687045, 0, 8, 2621509, 0, 8, 2555973, 0, 8, 2490437, 0, 8, 2424901, 0, 8, 2359365, 0, 8, 2293829, 0, 8, 2228293, 0, 8, 2162757, 0, 8, 2097221, 0, 8, 2031685, 0, 8, 1966149, 0, 8, 1900613, 0, 8, 1835077, 0, 8, 1769541, 0, 8, 1704005, 0, 8, 1638469, 0, 8, 1572933, 0, 8, 1507397, 0, 8, 1441861, 0, 8, 1376325, 0, 8, 1310789, 0, 8, 1245253, 0, 8, 1179717, 0, 8, 1114181, 0, 8, 1048645, 0, 8, 983109, 0, 8, 917573, 0, 8, 852037, 0, 8, 786501, 0, 8, 720965, 0, 8, 2949188, 0, 8, 2883652, 0, 8, 2818116, 0, 8, 2752580, 0, 8, 2687044, 0, 8, 2621508, 0, 8, 2555972, 0, 8, 2490436, 0, 8, 2424900, 0, 8, 2359364, 0, 8, 2293828, 0, 8, 2228292, 0, 8, 2162756, 0, 8, 2097220, 0, 8, 2031684, 0, 8, 1966148, 0, 8, 1900612, 0, 8, 1835076, 0, 8, 1769540, 0, 8, 1704004, 0, 8, 1638468, 0, 8, 1572932, 0, 8, 1507396, 0, 8, 1441860, 0, 8, 1376324, 0, 8, 1310788, 0, 8, 1245252, 0, 8, 1179716, 0, 8, 1114180, 0, 8, 1048644, 0, 8, 983108, 0, 8, 917572, 0, 8, 852036, 0, 8, 786500, 0, 8, 720964, 0, 8, 2949187, 0, 8, 2883651, 0, 8, 2818115, 0, 8, 2752579, 0, 8, 2687043, 0, 8, 2621507, 0, 8, 2555971, 0, 8, 2490435, 0, 8, 2424899, 0, 8, 2359363, 0, 8, 2293827, 0, 8, 2228291, 0, 8, 2162755, 0, 8, 2097219, 0, 8, 2031683, 0, 8, 1966147, 0, 8, 1900611, 0, 8, 1835075, 0, 8, 1769539, 0, 8, 1704003, 0, 8, 1638467, 0, 8, 1572931, 0, 8, 1507395, 0, 8, 1441859, 0, 8, 1376323, 0, 8, 1310787, 0, 8, 1245251, 0, 8, 1179715, 0, 8, 1114179, 0, 8, 1048643, 0, 8, 983107, 0, 8, 917571, 0, 8, 852035, 0, 8, 786499, 0, 8, 720963, 0, 8, 2949186, 0, 8, 2883650, 0, 8, 2818114, 0, 8, 2752578, 0, 8, 2687042, 0, 8, 2621506, 0, 8, 2555970, 0, 8, 2490434, 0, 8, 2424898, 0, 8, 2359362, 0, 8, 2293826, 0, 8, 2228290, 0, 8, 2162754, 0, 8, 2097218, 0, 8, 2031682, 0, 8, 1966146, 0, 8, 1900610, 0, 8, 1835074, 0, 8, 1769538, 0, 8, 1704002, 0, 8, 1638466, 0, 8, 1572930, 0, 8, 1507394, 0, 8, 1441858, 0, 8, 1376322, 0, 8, 1310786, 0, 8, 1245250, 0, 8, 1179714, 0, 8, 1114178, 0, 8, 1048642, 0, 8, 983106, 0, 8, 917570, 0, 8, 852034, 0, 8, 786498, 0, 8, 720962, 0, 8, 2949185, 0, 8, 2883649, 0, 8, 2818113, 0, 8, 2752577, 0, 8, 2687041, 0, 8, 2621505, 0, 8, 2555969, 0, 8, 2490433, 0, 8, 2424897, 0, 8, 2359361, 0, 8, 2293825, 0, 8, 2228289, 0, 8, 2162753, 0, 8, 2097217, 0, 8, 2031681, 0, 8, 1966145, 0, 8, 1900609, 0, 8, 1835073, 0, 8, 1769537, 0, 8, 1704001, 0, 8, 1638465, 0, 8, 1572929, 0, 8, 1507393, 0, 8, 1441857, 0, 8, 1376321, 0, 8, 1310785, 0, 8, 1245249, 0, 8, 1179713, 0, 8, 1114177, 0, 8, 1048641, 0, 8, 983105, 0, 8, 917569, 0, 8, 852033, 0, 8, 786497, 0, 8, 720961, 0, 8, 2949184, 0, 8, 2883648, 0, 8, 2818112, 0, 8, 2752576, 0, 8, 2687040, 0, 8, 2621504, 0, 8, 2555968, 0, 8, 2490432, 0, 8, 2424896, 0, 8, 2359360, 0, 8, 2293824, 0, 8, 2228288, 0, 8, 2162752, 0, 8, 2097216, 0, 8, 2031680, 0, 8, 1966144, 0, 8, 1900608, 0, 8, 1835072, 0, 8, 1769536, 0, 8, 1704000, 0, 8, 1638464, 0, 8, 1572928, 0, 8, 1507392, 0, 8, 1441856, 0, 8, 1376320, 0, 8, 1310784, 0, 8, 1245248, 0, 8, 1179712, 0, 8, 1114176, 0, 8, 1048640, 0, 8, 983104, 0, 8, 917568, 0, 8, 852032, 0, 8, 786496, 0, 8, 720960, 0, 8, 2949183, 0, 8, 2883647, 0, 8, 2818111, 0, 8, 2752575, 0, 8, 2687039, 0, 8, 2621503, 0, 8, 2555967, 0, 8, 2490431, 0, 8, 2424895, 0, 8, 2359359, 0, 8, 2293823, 0, 8, 2228287, 0, 8, 2162751, 0, 8, 2097215, 0, 8, 2031679, 0, 8, 1966143, 0, 8, 1900607, 0, 8, 1835071, 0, 8, 1769535, 0, 8, 1703999, 0, 8, 1638463, 0, 8, 1572927, 0, 8, 1507391, 0, 8, 1441855, 0, 8, 1376319, 0, 8, 1310783, 0, 8, 1245247, 0, 8, 1179711, 0, 8, 1114175, 0, 8, 1048639, 0, 8, 983103, 0, 8, 917567, 0, 8, 852031, 0, 8, 786495, 0, 8, 720959, 0, 8, 2949182, 0, 8, 2883646, 0, 8, 2818110, 0, 8, 2752574, 0, 8, 2687038, 0, 8, 2621502, 0, 8, 2555966, 0, 8, 2490430, 0, 8, 2424894, 0, 8, 2359358, 0, 8, 2293822, 0, 8, 2228286, 0, 8, 2162750, 0, 8, 2097214, 0, 8, 2031678, 0, 8, 1966142, 0, 8, 1900606, 0, 8, 1835070, 0, 8, 1769534, 0, 8, 1703998, 0, 8, 1638462, 0, 8, 1572926, 0, 8, 1507390, 0, 8, 1441854, 0, 8, 1376318, 0, 8, 1310782, 0, 8, 1245246, 0, 8, 1179710, 0, 8, 1114174, 0, 8, 1048638, 0, 8, 983102, 0, 8, 917566, 0, 8, 852030, 0, 8, 786494, 0, 8, 720958, 0, 8, 2949181, 0, 8, 2883645, 0, 8, 2818109, 0, 8, 2752573, 0, 8, 2687037, 0, 8, 2621501, 0, 8, 2555965, 0, 8, 2490429, 0, 8, 2424893, 0, 8, 2359357, 0, 8, 2293821, 0, 8, 2228285, 0, 8, 2162749, 0, 8, 2097213, 0, 8, 2031677, 0, 8, 1966141, 0, 8, 1900605, 0, 8, 1835069, 0, 8, 1769533, 0, 8, 1703997, 0, 8, 1638461, 0, 8, 1572925, 0, 8, 1507389, 0, 8, 1441853, 0, 8, 1376317, 0, 8, 1310781, 0, 8, 1245245, 0, 8, 1179709, 0, 8, 1114173, 0, 8, 1048637, 0, 8, 983101, 0, 8, 917565, 0, 8, 852029, 0, 8, 786493, 0, 8, 720957, 0, 8, 2949180, 0, 8, 2883644, 0, 8, 2818108, 0, 8, 2752572, 0, 8, 2687036, 0, 8, 2621500, 0, 8, 2555964, 0, 8, 2490428, 0, 8, 2424892, 0, 8, 2359356, 0, 8, 2293820, 0, 8, 2228284, 0, 8, 2162748, 0, 8, 2097212, 0, 8, 2031676, 0, 8, 1966140, 0, 8, 1900604, 0, 8, 1835068, 0, 8, 1769532, 0, 8, 1703996, 0, 8, 1638460, 0, 8, 1572924, 0, 8, 1507388, 0, 8, 1441852, 0, 8, 1376316, 0, 8, 1310780, 0, 8, 1245244, 0, 8, 1179708, 0, 8, 1114172, 0, 8, 1048636, 0, 8, 983100, 0, 8, 917564, 0, 8, 852028, 0, 8, 786492, 0, 8, 720956, 0, 8, 2949179, 0, 8, 2883643, 0, 8, 2818107, 0, 8, 2752571, 0, 8, 2687035, 0, 8, 2621499, 0, 8, 2555963, 0, 8, 2490427, 0, 8, 2424891, 0, 8, 2359355, 0, 8, 2293819, 0, 8, 2228283, 0, 8, 2162747, 0, 8, 2097211, 0, 8, 2031675, 0, 8, 1966139, 0, 8, 1900603, 0, 8, 1835067, 0, 8, 1769531, 0, 8, 1703995, 0, 8, 1638459, 0, 8, 1572923, 0, 8, 1507387, 0, 8, 1441851, 0, 8, 1376315, 0, 8, 1310779, 0, 8, 1245243, 0, 8, 1179707, 0, 8, 1114171, 0, 8, 1048635, 0, 8, 983099, 0, 8, 917563, 0, 8, 852027, 0, 8, 786491, 0, 8, 720955, 0, 8, 2949178, 0, 8, 2883642, 0, 8, 2818106, 0, 8, 2752570, 0, 8, 2687034, 0, 8, 2621498, 0, 8, 2555962, 0, 8, 2490426, 0, 8, 2424890, 0, 8, 2359354, 0, 8, 2293818, 0, 8, 2228282, 0, 8, 2162746, 0, 8, 2097210, 0, 8, 2031674, 0, 8, 1966138, 0, 8, 1900602, 0, 8, 1835066, 0, 8, 1769530, 0, 8, 1703994, 0, 8, 1638458, 0, 8, 1572922, 0, 8, 1507386, 0, 8, 1441850, 0, 8, 1376314, 0, 8, 1310778, 0, 8, 1245242, 0, 8, 1179706, 0, 8, 1114170, 0, 8, 1048634, 0, 8, 983098, 0, 8, 917562, 0, 8, 852026, 0, 8, 786490, 0, 8, 720954, 0, 8, 2949177, 0, 8, 2883641, 0, 8, 2818105, 0, 8, 2752569, 0, 8, 2687033, 0, 8, 2621497, 0, 8, 2555961, 0, 8, 2490425, 0, 8, 2424889, 0, 8, 2359353, 0, 8, 2293817, 0, 8, 2228281, 0, 8, 2162745, 0, 8, 2097209, 0, 8, 2031673, 0, 8, 1966137, 0, 8, 1900601, 0, 8, 1835065, 0, 8, 1769529, 0, 8, 1703993, 0, 8, 1638457, 0, 8, 1572921, 0, 8, 1507385, 0, 8, 1441849, 0, 8, 1376313, 0, 8, 1310777, 0, 8, 1245241, 0, 8, 1179705, 0, 8, 1114169, 0, 8, 1048633, 0, 8, 983097, 0, 8, 917561, 0, 8, 852025, 0, 8, 786489, 0, 8, 720953, 0, 8, 2949176, 0, 8, 2883640, 0, 8, 2818104, 0, 8, 2752568, 0, 8, 2687032, 0, 8, 2621496, 0, 8, 2555960, 0, 8, 2490424, 0, 8, 2424888, 0, 8, 2359352, 0, 8, 2293816, 0, 8, 2228280, 0, 8, 2162744, 0, 8, 2097208, 0, 8, 2031672, 0, 8, 1966136, 0, 8, 1900600, 0, 8, 1835064, 0, 8, 1769528, 0, 8, 1703992, 0, 8, 1638456, 0, 8, 1572920, 0, 8, 1507384, 0, 8, 1441848, 0, 8, 1376312, 0, 8, 1310776, 0, 8, 1245240, 0, 8, 1179704, 0, 8, 1114168, 0, 8, 1048632, 0, 8, 983096, 0, 8, 917560, 0, 8, 852024, 0, 8, 786488, 0, 8, 720952, 0, 8, 2949175, 0, 8, 2883639, 0, 8, 2818103, 0, 8, 2752567, 0, 8, 2687031, 0, 8, 2621495, 0, 8, 2555959, 0, 8, 2490423, 0, 8, 2424887, 0, 8, 2359351, 0, 8, 2293815, 0, 8, 2228279, 0, 8, 2162743, 0, 8, 2097207, 0, 8, 2031671, 0, 8, 1966135, 0, 8, 1900599, 0, 8, 1835063, 0, 8, 1769527, 0, 8, 1703991, 0, 8, 1638455, 0, 8, 1572919, 0, 8, 1507383, 0, 8, 1441847, 0, 8, 1376311, 0, 8, 1310775, 0, 8, 1245239, 0, 8, 1179703, 0, 8, 1114167, 0, 8, 1048631, 0, 8, 983095, 0, 8, 917559, 0, 8, 852023, 0, 8, 786487, 0, 8, 720951, 0, 8, 2949174, 0, 8, 2883638, 0, 8, 2818102, 0, 8, 2752566, 0, 8, 2687030, 0, 8, 2621494, 0, 8, 2555958, 0, 8, 2490422, 0, 8, 2424886, 0, 8, 2359350, 0, 8, 2293814, 0, 8, 2228278, 0, 8, 2162742, 0, 8, 2097206, 0, 8, 2031670, 0, 8, 1966134, 0, 8, 1900598, 0, 8, 1835062, 0, 8, 1769526, 0, 8, 1703990, 0, 8, 1638454, 0, 8, 1572918, 0, 8, 1507382, 0, 8, 1441846, 0, 8, 1376310, 0, 8, 1310774, 0, 8, 1245238, 0, 8, 1179702, 0, 8, 1114166, 0, 8, 1048630, 0, 8, 983094, 0, 8, 917558, 0, 8, 852022, 0, 8, 786486, 0, 8, 720950, 0, 8, 2949173, 0, 8, 2883637, 0, 8, 2818101, 0, 8, 2752565, 0, 8, 2687029, 0, 8, 2621493, 0, 8, 2555957, 0, 8, 2490421, 0, 8, 2424885, 0, 8, 2359349, 0, 8, 2293813, 0, 8, 2228277, 0, 8, 2162741, 0, 8, 2097205, 0, 8, 2031669, 0, 8, 1966133, 0, 8, 1900597, 0, 8, 1835061, 0, 8, 1769525, 0, 8, 1703989, 0, 8, 1638453, 0, 8, 1572917, 0, 8, 1507381, 0, 8, 1441845, 0, 8, 1376309, 0, 8, 1310773, 0, 8, 1245237, 0, 8, 1179701, 0, 8, 1114165, 0, 8, 1048629, 0, 8, 983093, 0, 8, 917557, 0, 8, 852021, 0, 8, 786485, 0, 8, 720949, 0, 8, 2949172, 0, 8, 2883636, 0, 8, 2818100, 0, 8, 2752564, 0, 8, 2687028, 0, 8, 2621492, 0, 8, 2555956, 0, 8, 2490420, 0, 8, 2424884, 0, 8, 2359348, 0, 8, 2293812, 0, 8, 2228276, 0, 8, 2162740, 0, 8, 2097204, 0, 8, 2031668, 0, 8, 1966132, 0, 8, 1900596, 0, 8, 1835060, 0, 8, 1769524, 0, 8, 1703988, 0, 8, 1638452, 0, 8, 1572916, 0, 8, 1507380, 0, 8, 1441844, 0, 8, 1376308, 0, 8, 1310772, 0, 8, 1245236, 0, 8, 1179700, 0, 8, 1114164, 0, 8, 1048628, 0, 8, 983092, 0, 8, 917556, 0, 8, 852020, 0, 8, 786484, 0, 8, 720948, 0, 8, 2949171, 0, 8, 2883635, 0, 8, 2818099, 0, 8, 2752563, 0, 8, 2687027, 0, 8, 2621491, 0, 8, 2555955, 0, 8, 2490419, 0, 8, 2424883, 0, 8, 2359347, 0, 8, 2293811, 0, 8, 2228275, 0, 8, 2162739, 0, 8, 2097203, 0, 8, 2031667, 0, 8, 1966131, 0, 8, 1900595, 0, 8, 1835059, 0, 8, 1769523, 0, 8, 1703987, 0, 8, 1638451, 0, 8, 1572915, 0, 8, 1507379, 0, 8, 1441843, 0, 8, 1376307, 0, 8, 1310771, 0, 8, 1245235, 0, 8, 1179699, 0, 8, 1114163, 0, 8, 1048627, 0, 8, 983091, 0, 8, 917555, 0, 8, 852019, 0, 8, 786483, 0, 8, 720947, 0, 8, 2949170, 0, 8, 2883634, 0, 8, 2818098, 0, 8, 2752562, 0, 8, 2687026, 0, 8, 2621490, 0, 8, 2555954, 0, 8, 2490418, 0, 8, 2424882, 0, 8, 2359346, 0, 8, 2293810, 0, 8, 2228274, 0, 8, 2162738, 0, 8, 2097202, 0, 8, 2031666, 0, 8, 1966130, 0, 8, 1900594, 0, 8, 1835058, 0, 8, 1769522, 0, 8, 1703986, 0, 8, 1638450, 0, 8, 1572914, 0, 8, 1507378, 0, 8, 1441842, 0, 8, 1376306, 0, 8, 1310770, 0, 8, 1245234, 0, 8, 1179698, 0, 8, 1114162, 0, 8, 1048626, 0, 8, 983090, 0, 8, 917554, 0, 8, 852018, 0, 8, 786482, 0, 8, 720946, 0, 8, 2949169, 0, 8, 2883633, 0, 8, 2818097, 0, 8, 2752561, 0, 8, 2687025, 0, 8, 2621489, 0, 8, 2555953, 0, 8, 2490417, 0, 8, 2424881, 0, 8, 2359345, 0, 8, 2293809, 0, 8, 2228273, 0, 8, 2162737, 0, 8, 2097201, 0, 8, 2031665, 0, 8, 1966129, 0, 8, 1900593, 0, 8, 1835057, 0, 8, 1769521, 0, 8, 1703985, 0, 8, 1638449, 0, 8, 1572913, 0, 8, 1507377, 0, 8, 1441841, 0, 8, 1376305, 0, 8, 1310769, 0, 8, 1245233, 0, 8, 1179697, 0, 8, 1114161, 0, 8, 1048625, 0, 8, 983089, 0, 8, 917553, 0, 8, 852017, 0, 8, 786481, 0, 8, 720945, 0, 8, 2949168, 0, 8, 2883632, 0, 8, 2818096, 0, 8, 2752560, 0, 8, 2687024, 0, 8, 2621488, 0, 8, 2555952, 0, 8, 2490416, 0, 8, 2424880, 0, 8, 2359344, 0, 8, 2293808, 0, 8, 2228272, 0, 8, 2162736, 0, 8, 2097200, 0, 8, 2031664, 0, 8, 1966128, 0, 8, 1900592, 0, 8, 1835056, 0, 8, 1769520, 0, 8, 1703984, 0, 8, 1638448, 0, 8, 1572912, 0, 8, 1507376, 0, 8, 1441840, 0, 8, 1376304, 0, 8, 1310768, 0, 8, 1245232, 0, 8, 1179696, 0, 8, 1114160, 0, 8, 1048624, 0, 8, 983088, 0, 8, 917552, 0, 8, 852016, 0, 8, 786480, 0, 8, 720944, 0, 8, 2949167, 0, 8, 2883631, 0, 8, 2818095, 0, 8, 2752559, 0, 8, 2687023, 0, 8, 2621487, 0, 8, 2555951, 0, 8, 2490415, 0, 8, 2424879, 0, 8, 2359343, 0, 8, 2293807, 0, 8, 2228271, 0, 8, 2162735, 0, 8, 2097199, 0, 8, 2031663, 0, 8, 1966127, 0, 8, 1900591, 0, 8, 1835055, 0, 8, 1769519, 0, 8, 1703983, 0, 8, 1638447, 0, 8, 1572911, 0, 8, 1507375, 0, 8, 1441839, 0, 8, 1376303, 0, 8, 1310767, 0, 8, 1245231, 0, 8, 1179695, 0, 8, 1114159, 0, 8, 1048623, 0, 8, 983087, 0, 8, 917551, 0, 8, 852015, 0, 8, 786479, 0, 8, 720943, 0, 8, 2949166, 0, 8, 2883630, 0, 8, 2818094, 0, 8, 2752558, 0, 8, 2687022, 0, 8, 2621486, 0, 8, 2555950, 0, 8, 2490414, 0, 8, 2424878, 0, 8, 2359342, 0, 8, 2293806, 0, 8, 2228270, 0, 8, 2162734, 0, 8, 2097198, 0, 8, 2031662, 0, 8, 2949165, 0, 8, 2883629, 0, 8, 2818093, 0, 8, 2752557, 0, 8, 2687021, 0, 8, 2621485, 0, 8, 2555949, 0, 8, 2490413, 0, 8, 2424877, 0, 8, 2359341, 0, 8, 2293805, 0, 8, 2228269, 0, 8, 2162733, 0, 8, 2097197, 0, 8, 2031661, 0, 8, 2949164, 0, 8, 2883628, 0, 8, 2818092, 0, 8, 2752556, 0, 8, 2687020, 0, 8, 2621484, 0, 8, 2555948, 0, 8, 2490412, 0, 8, 2424876, 0, 8, 2359340, 0, 8, 2293804, 0, 8, 2228268, 0, 8, 2162732, 0, 8, 2097196, 0, 8, 2031660, 0, 8, 2949163, 0, 8, 2883627, 0, 8, 2818091, 0, 8, 2752555, 0, 8, 2687019, 0, 8, 2621483, 0, 8, 2555947, 0, 8, 2490411, 0, 8, 2424875, 0, 8, 2359339, 0, 8, 2293803, 0, 8, 2228267, 0, 8, 2162731, 0, 8, 2097195, 0, 8, 2031659, 0, 8, 2949162, 0, 8, 2883626, 0, 8, 2818090, 0, 8, 2752554, 0, 8, 2687018, 0, 8, 2621482, 0, 8, 2555946, 0, 8, 2490410, 0, 8, 2424874, 0, 8, 2359338, 0, 8, 2293802, 0, 8, 2228266, 0, 8, 2162730, 0, 8, 2097194, 0, 8, 2031658, 0, 8, 2949161, 0, 8, 2883625, 0, 8, 2818089, 0, 8, 2752553, 0, 8, 2687017, 0, 8, 2621481, 0, 8, 2555945, 0, 8, 2490409, 0, 8, 2424873, 0, 8, 2359337, 0, 8, 2293801, 0, 8, 2228265, 0, 8, 2162729, 0, 8, 2097193, 0, 8, 2031657, 0, 8, 2949160, 0, 8, 2883624, 0, 8, 2818088, 0, 8, 2752552, 0, 8, 2687016, 0, 8, 2621480, 0, 8, 2555944, 0, 8, 2490408, 0, 8, 2424872, 0, 8, 2359336, 0, 8, 2293800, 0, 8, 2228264, 0, 8, 2162728, 0, 8, 2097192, 0, 8, 2031656, 0, 8, 2949159, 0, 8, 2883623, 0, 8, 2818087, 0, 8, 2752551, 0, 8, 2687015, 0, 8, 2621479, 0, 8, 2555943, 0, 8, 2490407, 0, 8, 2424871, 0, 8, 2359335, 0, 8, 2293799, 0, 8, 2228263, 0, 8, 2162727, 0, 8, 2097191, 0, 8, 2031655, 0, 8, 2949158, 0, 8, 2883622, 0, 8, 2818086, 0, 8, 2752550, 0, 8, 2687014, 0, 8, 2621478, 0, 8, 2555942, 0, 8, 2490406, 0, 8, 2424870, 0, 8, 2359334, 0, 8, 2293798, 0, 8, 2228262, 0, 8, 2162726, 0, 8, 2097190, 0, 8, 2031654, 0, 8, 2949157, 0, 8, 2883621, 0, 8, 2818085, 0, 8, 2752549, 0, 8, 2687013, 0, 8, 2621477, 0, 8, 2555941, 0, 8, 2490405, 0, 8, 2424869, 0, 8, 2359333, 0, 8, 2293797, 0, 8, 2228261, 0, 8, 2162725, 0, 8, 2097189, 0, 8, 2031653, 0, 8, 2031652, 196608, 3, 2097188, 196608, 3, 2162724, 196608, 3, 2228260, 196608, 3, 2293796, 196608, 3, 2359332, 196608, 3, 2424868, 196608, 3, 2490404, 196608, 3, 2555940, 196608, 3, 2621476, 196608, 3, 2687012, 196608, 3, 2752548, 196608, 3, 2818084, 196608, 3, 2883620, 196608, 3, 2949156, 196608, 3, 3014694, 131072, 2, 3014692, 720896, 2, 3014695, 131072, 2, 3014693, 131072, 2, 3014696, 131072, 2, 3014697, 131072, 2, 3014698, 131072, 2, 3014699, 131072, 2, 3014700, 131072, 2, 3014701, 131072, 2, 3014702, 131072, 2, 655407, 131072, 7, 3014703, 131072, 2, 655408, 131072, 7, 3014704, 131072, 2, 655409, 131072, 7, 3014705, 131072, 2, 655410, 131072, 7, 3014706, 131072, 2, 655411, 131072, 7, 3014707, 131072, 2, 655412, 131072, 7, 3014708, 131072, 2, 655413, 131072, 7, 3014709, 131072, 2, 655414, 131072, 7, 3014710, 131072, 2, 655415, 131072, 7, 3014711, 131072, 2, 655416, 131072, 7, 3014712, 131072, 2, 655417, 131072, 7, 3014713, 131072, 2, 655418, 131072, 7, 3014714, 196608, 2, 655419, 131072, 7, 3014715, 0, 8, 655420, 131072, 7, 3014716, 0, 8, 655421, 131072, 7, 3014717, 0, 8, 655422, 131072, 7, 3014718, 0, 8, 655423, 131072, 7, 3014719, 0, 8, 655424, 196608, 7, 3014720, 0, 8, 655425, 0, 8, 3014721, 0, 8, 655426, 0, 8, 3014722, 0, 8, 655427, 0, 8, 3014723, 0, 8, 655428, 0, 8, 3014724, 0, 8, 655429, 0, 8, 3014725, 0, 8, 786502, 0, 8, 655430, 0, 8, 852038, 0, 8, 720966, 0, 8, 917574, 0, 8, 983110, 0, 8, 1048646, 0, 8, 1114182, 0, 8, 1179718, 0, 8, 1245254, 0, 8, 1310790, 0, 8, 1376326, 0, 8, 1441862, 65536, 2, 1507398, 65536, 3, 1572934, 65536, 3, 1638470, 65536, 3, 1704006, 65536, 3, 1769542, 65536, 3, 1835078, 65536, 3, 1900614, 65536, 3, 1966150, 65536, 3, 2031686, 65536, 3, 2097222, 65536, 3, 2162758, 65536, 3, 2228294, 65536, 3, 2293830, 65536, 3, 2359366, 65536, 3, 2424902, 65536, 3, 2490438, 65536, 3, 2555974, 65536, 3, 2621510, 65536, 3, 2687046, 65536, 7, 2752582, 0, 8, 2818118, 0, 8, 2883654, 0, 8, 2949190, 0, 8, 3014726, 0, 8, 3801114, 0, 8, 3735578, 0, 8, 3670042, 0, 8, 3604506, 0, 8, 3538970, 0, 8, 3473434, 0, 8, 3407898, 0, 8, 3342362, 0, 8, 3276826, 0, 8, 3211290, 0, 8, 3145754, 0, 8, 3080218, 0, 8, 3014682, 0, 8, 2949146, 0, 8, 2883610, 0, 8, 2818074, 0, 8, 2752538, 0, 8, 2687002, 0, 8, 2621466, 0, 8, 2555930, 0, 8, 2490394, 0, 8, 2424858, 0, 8, 2359322, 0, 8, 2293786, 0, 8, 2228250, 0, 8, 2162714, 0, 8, 2097178, 0, 8, 2031642, 0, 8, 3801113, 0, 8, 3735577, 0, 8, 3670041, 0, 8, 3604505, 0, 8, 3538969, 0, 8, 3473433, 0, 8, 3407897, 0, 8, 3342361, 0, 8, 3276825, 0, 8, 3211289, 0, 8, 3145753, 0, 8, 3080217, 0, 8, 3014681, 0, 8, 2949145, 0, 8, 2883609, 0, 8, 2818073, 0, 8, 2752537, 0, 8, 2687001, 0, 8, 2621465, 0, 8, 2555929, 0, 8, 2490393, 0, 8, 2424857, 0, 8, 2359321, 0, 8, 2293785, 0, 8, 2228249, 0, 8, 2162713, 0, 8, 2097177, 0, 8, 2031641, 0, 8, 3801112, 0, 8, 3735576, 0, 8, 3670040, 0, 8, 3604504, 0, 8, 3538968, 0, 8, 3473432, 0, 8, 3407896, 0, 8, 3342360, 0, 8, 3276824, 0, 8, 3211288, 0, 8, 3145752, 0, 8, 3080216, 0, 8, 3014680, 0, 8, 2949144, 0, 8, 2883608, 0, 8, 2818072, 0, 8, 2752536, 0, 8, 2687000, 0, 8, 2621464, 0, 8, 2555928, 0, 8, 2490392, 0, 8, 2424856, 0, 8, 2359320, 0, 8, 2293784, 0, 8, 2228248, 0, 8, 2162712, 0, 8, 2097176, 0, 8, 2031640, 0, 8, 3801111, 0, 8, 3735575, 0, 8, 3670039, 0, 8, 3604503, 0, 8, 3538967, 0, 8, 3473431, 0, 8, 3407895, 0, 8, 3342359, 0, 8, 3276823, 0, 8, 3211287, 0, 8, 3145751, 0, 8, 3080215, 0, 8, 3014679, 0, 8, 2949143, 0, 8, 2883607, 0, 8, 2818071, 0, 8, 2752535, 0, 8, 2686999, 0, 8, 2621463, 0, 8, 2555927, 0, 8, 2490391, 0, 8, 2424855, 0, 8, 2359319, 0, 8, 2293783, 0, 8, 2228247, 0, 8, 2162711, 0, 8, 2097175, 0, 8, 2031639, 0, 8, 3801110, 0, 8, 3735574, 0, 8, 3670038, 0, 8, 3604502, 0, 8, 3538966, 0, 8, 3473430, 0, 8, 3407894, 0, 8, 3342358, 0, 8, 3276822, 0, 8, 3211286, 0, 8, 3145750, 0, 8, 3080214, 0, 8, 3014678, 0, 8, 2949142, 0, 8, 2883606, 0, 8, 2818070, 0, 8, 2752534, 0, 8, 2686998, 0, 8, 2621462, 0, 8, 2555926, 0, 8, 2490390, 0, 8, 2424854, 0, 8, 2359318, 0, 8, 2293782, 0, 8, 2228246, 0, 8, 2162710, 0, 8, 2097174, 0, 8, 2031638, 0, 8, 3801109, 0, 8, 3735573, 0, 8, 3670037, 0, 8, 3604501, 0, 8, 3538965, 0, 8, 3473429, 0, 8, 3407893, 0, 8, 3342357, 0, 8, 3276821, 0, 8, 3211285, 0, 8, 3145749, 0, 8, 3080213, 0, 8, 3014677, 0, 8, 2949141, 0, 8, 2883605, 0, 8, 2818069, 0, 8, 2752533, 0, 8, 2686997, 0, 8, 2621461, 0, 8, 2555925, 0, 8, 2490389, 0, 8, 2424853, 0, 8, 2359317, 0, 8, 2293781, 0, 8, 2228245, 0, 8, 2162709, 0, 8, 2097173, 0, 8, 2031637, 0, 8, 3801108, 0, 8, 3735572, 0, 8, 3670036, 0, 8, 3604500, 0, 8, 3538964, 0, 8, 3473428, 0, 8, 3407892, 0, 8, 3342356, 0, 8, 3276820, 0, 8, 3211284, 0, 8, 3145748, 0, 8, 3080212, 0, 8, 3014676, 0, 8, 2949140, 0, 8, 2883604, 0, 8, 2818068, 0, 8, 2752532, 0, 8, 2686996, 0, 8, 2621460, 0, 8, 2555924, 0, 8, 2490388, 0, 8, 2424852, 0, 8, 2359316, 0, 8, 2293780, 0, 8, 2228244, 0, 8, 2162708, 0, 8, 2097172, 0, 8, 2031636, 0, 8, 3801107, 0, 8, 3735571, 0, 8, 3670035, 0, 8, 3604499, 0, 8, 3538963, 0, 8, 3473427, 0, 8, 3407891, 0, 8, 3342355, 0, 8, 3276819, 0, 8, 3211283, 0, 8, 3145747, 0, 8, 3080211, 0, 8, 3014675, 0, 8, 2949139, 0, 8, 2883603, 0, 8, 2818067, 0, 8, 2752531, 0, 8, 2686995, 0, 8, 2621459, 0, 8, 2555923, 0, 8, 2490387, 0, 8, 2424851, 0, 8, 2359315, 0, 8, 2293779, 0, 8, 2228243, 0, 8, 2162707, 0, 8, 2097171, 0, 8, 2031635, 0, 8, 3801106, 0, 8, 3735570, 0, 8, 3670034, 0, 8, 3604498, 0, 8, 3538962, 0, 8, 3473426, 0, 8, 3407890, 0, 8, 3342354, 0, 8, 3276818, 0, 8, 3211282, 0, 8, 3145746, 0, 8, 3080210, 0, 8, 3014674, 0, 8, 2949138, 0, 8, 2883602, 0, 8, 2818066, 0, 8, 2752530, 0, 8, 2686994, 0, 8, 2621458, 0, 8, 2555922, 0, 8, 2490386, 0, 8, 2424850, 0, 8, 2359314, 0, 8, 2293778, 0, 8, 2228242, 0, 8, 2162706, 0, 8, 2097170, 0, 8, 2031634, 0, 8, 3801105, 0, 8, 3735569, 0, 8, 3670033, 0, 8, 3604497, 0, 8, 3538961, 0, 8, 3473425, 0, 8, 3407889, 0, 8, 3342353, 0, 8, 3276817, 0, 8, 3211281, 0, 8, 3145745, 0, 8, 3080209, 0, 8, 3014673, 0, 8, 2949137, 0, 8, 2883601, 0, 8, 2818065, 0, 8, 2752529, 0, 8, 2686993, 0, 8, 2621457, 0, 8, 2555921, 0, 8, 2490385, 0, 8, 2424849, 0, 8, 2359313, 0, 8, 2293777, 0, 8, 2228241, 0, 8, 2162705, 0, 8, 2097169, 0, 8, 2031633, 0, 8, 3801104, 0, 8, 3735568, 0, 8, 3670032, 0, 8, 3604496, 0, 8, 3538960, 0, 8, 3473424, 0, 8, 3407888, 0, 8, 3342352, 0, 8, 3276816, 0, 8, 3211280, 0, 8, 3145744, 0, 8, 3080208, 0, 8, 3014672, 0, 8, 2949136, 0, 8, 2883600, 0, 8, 2818064, 0, 8, 2752528, 0, 8, 2686992, 0, 8, 2621456, 0, 8, 2555920, 0, 8, 2490384, 0, 8, 2424848, 0, 8, 2359312, 0, 8, 2293776, 0, 8, 2228240, 0, 8, 2162704, 0, 8, 2097168, 0, 8, 2031632, 0, 8, 3801103, 0, 8, 3735567, 0, 8, 3670031, 0, 8, 3604495, 0, 8, 3538959, 0, 8, 3473423, 0, 8, 3407887, 0, 8, 3342351, 0, 8, 3276815, 0, 8, 3211279, 0, 8, 3145743, 0, 8, 3080207, 0, 8, 3014671, 0, 8, 2949135, 0, 8, 2883599, 0, 8, 2818063, 0, 8, 2752527, 0, 8, 2686991, 0, 8, 2621455, 0, 8, 2555919, 0, 8, 2490383, 0, 8, 2424847, 0, 8, 2359311, 0, 8, 2293775, 0, 8, 2228239, 0, 8, 2162703, 0, 8, 2097167, 0, 8, 2031631, 0, 8, 3801102, 0, 8, 3735566, 0, 8, 3670030, 0, 8, 3604494, 0, 8, 3538958, 0, 8, 3473422, 0, 8, 3407886, 0, 8, 3342350, 0, 8, 3276814, 0, 8, 3211278, 0, 8, 3145742, 0, 8, 3080206, 0, 8, 3014670, 0, 8, 2949134, 0, 8, 2883598, 0, 8, 2818062, 0, 8, 2752526, 0, 8, 2686990, 0, 8, 2621454, 0, 8, 2555918, 0, 8, 2490382, 0, 8, 2424846, 0, 8, 2359310, 0, 8, 2293774, 0, 8, 2228238, 0, 8, 2162702, 0, 8, 2097166, 0, 8, 2031630, 0, 8, 3801101, 0, 8, 3735565, 0, 8, 3670029, 0, 8, 3604493, 0, 8, 3538957, 0, 8, 3473421, 0, 8, 3407885, 0, 8, 3342349, 0, 8, 3276813, 0, 8, 3211277, 0, 8, 3145741, 0, 8, 3080205, 0, 8, 3014669, 0, 8, 2949133, 0, 8, 2883597, 0, 8, 2818061, 0, 8, 2752525, 0, 8, 2686989, 0, 8, 2621453, 0, 8, 2555917, 0, 8, 2490381, 0, 8, 2424845, 0, 8, 2359309, 0, 8, 2293773, 0, 8, 2228237, 0, 8, 2162701, 0, 8, 2097165, 0, 8, 2031629, 0, 8, 3801100, 0, 8, 3735564, 0, 8, 3670028, 0, 8, 3604492, 0, 8, 3538956, 0, 8, 3473420, 0, 8, 3407884, 0, 8, 3342348, 0, 8, 3276812, 0, 8, 3211276, 0, 8, 3145740, 0, 8, 3080204, 0, 8, 3014668, 0, 8, 2949132, 0, 8, 2883596, 0, 8, 2818060, 0, 8, 2752524, 0, 8, 2686988, 0, 8, 2621452, 0, 8, 2555916, 0, 8, 2490380, 0, 8, 2424844, 0, 8, 2359308, 0, 8, 2293772, 0, 8, 2228236, 0, 8, 2162700, 0, 8, 2097164, 0, 8, 2031628, 0, 8, 3801099, 0, 8, 3735563, 0, 8, 3670027, 0, 8, 3604491, 0, 8, 3538955, 0, 8, 3473419, 0, 8, 3407883, 0, 8, 3342347, 0, 8, 3276811, 0, 8, 3211275, 0, 8, 3145739, 0, 8, 3080203, 0, 8, 3014667, 0, 8, 2949131, 0, 8, 2883595, 0, 8, 2818059, 0, 8, 2752523, 0, 8, 2686987, 0, 8, 2621451, 0, 8, 2555915, 0, 8, 2490379, 0, 8, 2424843, 0, 8, 2359307, 0, 8, 2293771, 0, 8, 2228235, 0, 8, 2162699, 0, 8, 2097163, 0, 8, 2031627, 0, 8, 3801098, 0, 8, 3735562, 0, 8, 3670026, 0, 8, 3604490, 0, 8, 3538954, 0, 8, 3473418, 0, 8, 3407882, 0, 8, 3342346, 0, 8, 3276810, 0, 8, 3211274, 0, 8, 3145738, 0, 8, 3080202, 0, 8, 3014666, 0, 8, 2949130, 0, 8, 2883594, 0, 8, 2818058, 0, 8, 2752522, 0, 8, 2686986, 0, 8, 2621450, 0, 8, 2555914, 0, 8, 2490378, 0, 8, 2424842, 0, 8, 2359306, 0, 8, 2293770, 0, 8, 2228234, 0, 8, 2162698, 0, 8, 2097162, 0, 8, 2031626, 0, 8, 2031625, 196608, 3, 2097161, 196608, 3, 2162697, 196608, 3, 2228233, 196608, 3, 2293769, 196608, 3, 2359305, 196608, 3, 2424841, 196608, 3, 2490377, 196608, 3, 2555913, 196608, 3, 2621449, 196608, 3, 2686985, 196608, 3, 2752521, 196608, 3, 2818057, 196608, 3, 2883593, 196608, 3, 2949129, 196608, 3, 3014665, 196608, 3, 3080201, 196608, 3, 3145737, 196608, 3, 3211273, 196608, 3, 3276809, 196608, 3, 3342345, 196608, 3, 3407881, 196608, 3, 3473417, 196608, 3, 3538953, 196608, 3, 3604489, 196608, 7, 3670025, 0, 8, 3735561, 0, 8, 3801097, 0, 8, 3866635, 0, 8, 3866633, 0, 8, 3866636, 0, 8, 3866634, 0, 8, 3866637, 0, 8, 3866638, 0, 8, 3866639, 0, 8, 3866640, 0, 8, 3866641, 0, 8, 3866642, 0, 8, 3866643, 0, 8, 3866644, 0, 8, 3866645, 0, 8, 3866646, 0, 8, 3866647, 0, 8, 3866648, 0, 8, 3866649, 0, 8, 3866650, 0, 8, 2031643, 65536, 3, 2097179, 65536, 3, 2162715, 65536, 3, 2228251, 65536, 3, 2293787, 65536, 3, 2359323, 65536, 3, 2424859, 65536, 3, 2490395, 65536, 3, 2555931, 65536, 3, 2621467, 65536, 3, 2687003, 65536, 3, 2752539, 65536, 3, 2818075, 65536, 3, 2883611, 65536, 3, 2949147, 65536, 3, 3014683, 65536, 3, 3080219, 65536, 3, 3145755, 65536, 3, 3211291, 65536, 3, 3276827, 65536, 3, 3342363, 65536, 3, 3407899, 65536, 3, 3473435, 65536, 3, 3538971, 65536, 3, 3604507, 65536, 7, 3670043, 0, 8, 3735579, 0, 8, 3801115, 0, 8, 3866651, 0, 8, 4915231, 0, 8, 4849695, 0, 8, 4784159, 0, 8, 4718623, 0, 8, 4653087, 0, 8, 4587551, 0, 8, 4522015, 0, 8, 4456479, 0, 8, 4390943, 0, 8, 4325407, 0, 8, 4259871, 0, 8, 4194335, 0, 8, 4128799, 0, 8, 4063263, 0, 8, 3997727, 0, 8, 3932191, 0, 8, 3866655, 0, 8, 3801119, 0, 8, 3735583, 0, 8, 3670047, 0, 8, 4915230, 0, 8, 4849694, 0, 8, 4784158, 0, 8, 4718622, 0, 8, 4653086, 0, 8, 4587550, 0, 8, 4522014, 0, 8, 4456478, 0, 8, 4390942, 0, 8, 4325406, 0, 8, 4259870, 0, 8, 4194334, 0, 8, 4128798, 0, 8, 4063262, 0, 8, 3997726, 0, 8, 3932190, 0, 8, 3866654, 0, 8, 3801118, 0, 8, 3735582, 0, 8, 3670046, 0, 8, 4915229, 0, 8, 4849693, 0, 8, 4784157, 0, 8, 4718621, 0, 8, 4653085, 0, 8, 4587549, 0, 8, 4522013, 0, 8, 4456477, 0, 8, 4390941, 0, 8, 4325405, 0, 8, 4259869, 0, 8, 4194333, 0, 8, 4128797, 0, 8, 4063261, 0, 8, 3997725, 0, 8, 3932189, 0, 8, 3866653, 0, 8, 3801117, 0, 8, 3735581, 0, 8, 3670045, 0, 8, 4915228, 0, 8, 4849692, 0, 8, 4784156, 0, 8, 4718620, 0, 8, 4653084, 0, 8, 4587548, 0, 8, 4522012, 0, 8, 4456476, 0, 8, 4390940, 0, 8, 4325404, 0, 8, 4259868, 0, 8, 4194332, 0, 8, 4128796, 0, 8, 4063260, 0, 8, 3997724, 0, 8, 3932188, 0, 8, 3866652, 0, 8, 3801116, 0, 8, 3735580, 0, 8, 3670044, 0, 8, 4915227, 0, 8, 4849691, 0, 8, 4784155, 0, 8, 4718619, 0, 8, 4653083, 0, 8, 4587547, 0, 8, 4522011, 0, 8, 4456475, 0, 8, 4390939, 0, 8, 4325403, 0, 8, 4259867, 0, 8, 4194331, 0, 8, 4128795, 0, 8, 4063259, 0, 8, 3997723, 0, 8, 3932187, 0, 8, 4915226, 0, 8, 4849690, 0, 8, 4784154, 0, 8, 4718618, 0, 8, 4653082, 0, 8, 4587546, 0, 8, 4522010, 0, 8, 4456474, 0, 8, 4390938, 0, 8, 4325402, 0, 8, 4259866, 0, 8, 4194330, 0, 8, 4128794, 0, 8, 4063258, 0, 8, 3997722, 0, 8, 3932186, 0, 8, 4915225, 0, 8, 4849689, 0, 8, 4784153, 0, 8, 4718617, 0, 8, 4653081, 0, 8, 4587545, 0, 8, 4522009, 0, 8, 4456473, 0, 8, 4390937, 0, 8, 4325401, 0, 8, 4259865, 0, 8, 4194329, 0, 8, 4128793, 0, 8, 4063257, 0, 8, 3997721, 0, 8, 3932185, 0, 8, 4915224, 0, 8, 4849688, 0, 8, 4784152, 0, 8, 4718616, 0, 8, 4653080, 0, 8, 4587544, 0, 8, 4522008, 0, 8, 4456472, 0, 8, 4390936, 0, 8, 4325400, 0, 8, 4259864, 0, 8, 4194328, 0, 8, 4128792, 0, 8, 4063256, 0, 8, 3997720, 0, 8, 3932184, 0, 8, 4915223, 0, 8, 4849687, 0, 8, 4784151, 0, 8, 4718615, 0, 8, 4653079, 0, 8, 4587543, 0, 8, 4522007, 0, 8, 4456471, 0, 8, 4390935, 0, 8, 4325399, 0, 8, 4259863, 0, 8, 4194327, 0, 8, 4128791, 0, 8, 4063255, 0, 8, 3997719, 0, 8, 3932183, 0, 8, 4915222, 0, 8, 4849686, 0, 8, 4784150, 0, 8, 4718614, 0, 8, 4653078, 0, 8, 4587542, 0, 8, 4522006, 0, 8, 4456470, 0, 8, 4390934, 0, 8, 4325398, 0, 8, 4259862, 0, 8, 4194326, 0, 8, 4128790, 0, 8, 4063254, 0, 8, 3997718, 0, 8, 3932182, 0, 8, 4915221, 0, 8, 4849685, 0, 8, 4784149, 0, 8, 4718613, 0, 8, 4653077, 0, 8, 4587541, 0, 8, 4522005, 0, 8, 4456469, 0, 8, 4390933, 0, 8, 4325397, 0, 8, 4259861, 0, 8, 4194325, 0, 8, 4128789, 0, 8, 4063253, 0, 8, 3997717, 0, 8, 3932181, 0, 8, 4915220, 0, 8, 4849684, 0, 8, 4784148, 0, 8, 4718612, 0, 8, 4653076, 0, 8, 4587540, 0, 8, 4522004, 0, 8, 4456468, 0, 8, 4390932, 0, 8, 4325396, 0, 8, 4259860, 0, 8, 4194324, 0, 8, 4128788, 0, 8, 4063252, 0, 8, 3997716, 0, 8, 3932180, 0, 8, 4915219, 0, 8, 4849683, 0, 8, 4784147, 0, 8, 4718611, 0, 8, 4653075, 0, 8, 4587539, 0, 8, 4522003, 0, 8, 4456467, 0, 8, 4390931, 0, 8, 4325395, 0, 8, 4259859, 0, 8, 4194323, 0, 8, 4128787, 0, 8, 4063251, 0, 8, 3997715, 0, 8, 3932179, 0, 8, 4915218, 0, 8, 4849682, 0, 8, 4784146, 0, 8, 4718610, 0, 8, 4653074, 0, 8, 4587538, 0, 8, 4522002, 0, 8, 4456466, 0, 8, 4390930, 0, 8, 4325394, 0, 8, 4259858, 0, 8, 4194322, 0, 8, 4128786, 0, 8, 4063250, 0, 8, 3997714, 0, 8, 3932178, 0, 8, 4915217, 0, 8, 4849681, 0, 8, 4784145, 0, 8, 4718609, 0, 8, 4653073, 0, 8, 4587537, 0, 8, 4522001, 0, 8, 4456465, 0, 8, 4390929, 0, 8, 4325393, 0, 8, 4259857, 0, 8, 4194321, 0, 8, 4128785, 0, 8, 4063249, 0, 8, 3997713, 0, 8, 3932177, 0, 8, 4915216, 0, 8, 4849680, 0, 8, 4784144, 0, 8, 4718608, 0, 8, 4653072, 0, 8, 4587536, 0, 8, 4522000, 0, 8, 4456464, 0, 8, 4390928, 0, 8, 4325392, 0, 8, 4259856, 0, 8, 4194320, 0, 8, 4128784, 0, 8, 4063248, 0, 8, 3997712, 0, 8, 3932176, 0, 8, 4915215, 0, 8, 4849679, 0, 8, 4784143, 0, 8, 4718607, 0, 8, 4653071, 0, 8, 4587535, 0, 8, 4521999, 0, 8, 4456463, 0, 8, 4390927, 0, 8, 4325391, 0, 8, 4259855, 0, 8, 4194319, 0, 8, 4128783, 0, 8, 4063247, 0, 8, 3997711, 0, 8, 3932175, 0, 8, 4915214, 0, 8, 4849678, 0, 8, 4784142, 0, 8, 4718606, 0, 8, 4653070, 0, 8, 4587534, 0, 8, 4521998, 0, 8, 4456462, 0, 8, 4390926, 0, 8, 4325390, 0, 8, 4259854, 0, 8, 4194318, 0, 8, 4128782, 0, 8, 4063246, 0, 8, 3997710, 0, 8, 3932174, 0, 8, 4915213, 0, 8, 4849677, 0, 8, 4784141, 0, 8, 4718605, 0, 8, 4653069, 0, 8, 4587533, 0, 8, 4521997, 0, 8, 4456461, 0, 8, 4390925, 0, 8, 4325389, 0, 8, 4259853, 0, 8, 4194317, 0, 8, 4128781, 0, 8, 4063245, 0, 8, 3997709, 0, 8, 3932173, 0, 8, 4915212, 0, 8, 4849676, 0, 8, 4784140, 0, 8, 4718604, 0, 8, 4653068, 0, 8, 4587532, 0, 8, 4521996, 0, 8, 4456460, 0, 8, 4390924, 0, 8, 4325388, 0, 8, 4259852, 0, 8, 4194316, 0, 8, 4128780, 0, 8, 4063244, 0, 8, 3997708, 0, 8, 3932172, 0, 8, 4915211, 0, 8, 4849675, 0, 8, 4784139, 0, 8, 4718603, 0, 8, 4653067, 0, 8, 4587531, 0, 8, 4521995, 0, 8, 4456459, 0, 8, 4390923, 0, 8, 4325387, 0, 8, 4259851, 0, 8, 4194315, 0, 8, 4128779, 0, 8, 4063243, 0, 8, 3997707, 0, 8, 3932171, 0, 8, 4915210, 0, 8, 4849674, 0, 8, 4784138, 0, 8, 4718602, 0, 8, 4653066, 0, 8, 4587530, 0, 8, 4521994, 0, 8, 4456458, 0, 8, 4390922, 0, 8, 4325386, 0, 8, 4259850, 0, 8, 4194314, 0, 8, 4128778, 0, 8, 4063242, 0, 8, 3997706, 0, 8, 3932170, 0, 8, 4915209, 0, 8, 4849673, 0, 8, 4784137, 0, 8, 4718601, 0, 8, 4653065, 0, 8, 4587529, 0, 8, 4521993, 0, 8, 4456457, 0, 8, 4390921, 0, 8, 4325385, 0, 8, 4259849, 0, 8, 4194313, 0, 8, 4128777, 0, 8, 4063241, 0, 8, 3997705, 0, 8, 3932169, 0, 8, 4915208, 0, 8, 4849672, 0, 8, 4784136, 0, 8, 4718600, 0, 8, 4653064, 0, 8, 4587528, 0, 8, 4521992, 0, 8, 4456456, 0, 8, 4390920, 0, 8, 4325384, 0, 8, 4259848, 0, 8, 4194312, 0, 8, 4128776, 0, 8, 4063240, 0, 8, 3997704, 0, 8, 3932168, 0, 8, 3866632, 0, 8, 3801096, 0, 8, 3735560, 0, 8, 3670024, 0, 8, 4915207, 0, 8, 4849671, 0, 8, 4784135, 0, 8, 4718599, 0, 8, 4653063, 0, 8, 4587527, 0, 8, 4521991, 0, 8, 4456455, 0, 8, 4390919, 0, 8, 4325383, 0, 8, 4259847, 0, 8, 4194311, 0, 8, 4128775, 0, 8, 4063239, 0, 8, 3997703, 0, 8, 3932167, 0, 8, 3866631, 0, 8, 3801095, 0, 8, 3735559, 0, 8, 3670023, 0, 8, 4915206, 0, 8, 4849670, 0, 8, 4784134, 0, 8, 4718598, 0, 8, 4653062, 0, 8, 4587526, 0, 8, 4521990, 0, 8, 4456454, 0, 8, 4390918, 0, 8, 4325382, 0, 8, 4259846, 0, 8, 4194310, 0, 8, 4128774, 0, 8, 4063238, 0, 8, 3997702, 0, 8, 3932166, 0, 8, 3866630, 0, 8, 3801094, 0, 8, 3735558, 0, 8, 3670022, 0, 8, 4915205, 0, 8, 4849669, 0, 8, 4784133, 0, 8, 4718597, 0, 8, 4653061, 0, 8, 4587525, 0, 8, 4521989, 0, 8, 4456453, 0, 8, 4390917, 0, 8, 4325381, 0, 8, 4259845, 0, 8, 4194309, 0, 8, 4128773, 0, 8, 4063237, 0, 8, 3997701, 0, 8, 3932165, 0, 8, 3866629, 0, 8, 3801093, 0, 8, 3735557, 0, 8, 3670021, 0, 8, 4915204, 0, 8, 4849668, 0, 8, 4784132, 0, 8, 4718596, 0, 8, 4653060, 0, 8, 4587524, 0, 8, 4521988, 0, 8, 4456452, 0, 8, 4390916, 0, 8, 4325380, 0, 8, 4259844, 0, 8, 4194308, 0, 8, 4128772, 0, 8, 4063236, 0, 8, 3997700, 0, 8, 3932164, 0, 8, 3866628, 0, 8, 3801092, 0, 8, 3735556, 0, 8, 3670020, 0, 8, 4915203, 0, 8, 4849667, 0, 8, 4784131, 0, 8, 4718595, 0, 8, 4653059, 0, 8, 4587523, 0, 8, 4521987, 0, 8, 4456451, 0, 8, 4390915, 0, 8, 4325379, 0, 8, 4259843, 0, 8, 4194307, 0, 8, 4128771, 0, 8, 4063235, 0, 8, 3997699, 0, 8, 3932163, 0, 8, 3866627, 0, 8, 3801091, 0, 8, 3735555, 0, 8, 3670019, 0, 8, 4915202, 0, 8, 4849666, 0, 8, 4784130, 0, 8, 4718594, 0, 8, 4653058, 0, 8, 4587522, 0, 8, 4521986, 0, 8, 4456450, 0, 8, 4390914, 0, 8, 4325378, 0, 8, 4259842, 0, 8, 4194306, 0, 8, 4128770, 0, 8, 4063234, 0, 8, 3997698, 0, 8, 3932162, 0, 8, 3866626, 0, 8, 3801090, 0, 8, 3735554, 0, 8, 3670018, 0, 8, 4915201, 0, 8, 4849665, 0, 8, 4784129, 0, 8, 4718593, 0, 8, 4653057, 0, 8, 4587521, 0, 8, 4521985, 0, 8, 4456449, 0, 8, 4390913, 0, 8, 4325377, 0, 8, 4259841, 0, 8, 4194305, 0, 8, 4128769, 0, 8, 4063233, 0, 8, 3997697, 0, 8, 3932161, 0, 8, 3866625, 0, 8, 3801089, 0, 8, 3735553, 0, 8, 3670017, 0, 8, 4915200, 0, 8, 4849664, 0, 8, 4784128, 0, 8, 4718592, 0, 8, 4653056, 0, 8, 4587520, 0, 8, 4521984, 0, 8, 4456448, 0, 8, 4390912, 0, 8, 4325376, 0, 8, 4259840, 0, 8, 4194304, 0, 8, 4128768, 0, 8, 4063232, 0, 8, 3997696, 0, 8, 3932160, 0, 8, 3866624, 0, 8, 3801088, 0, 8, 3735552, 0, 8, 3670016, 0, 8, 4980735, 0, 8, 4915199, 0, 8, 4849663, 0, 8, 4784127, 0, 8, 4718591, 0, 8, 4653055, 0, 8, 4587519, 0, 8, 4521983, 0, 8, 4456447, 0, 8, 4390911, 0, 8, 4325375, 0, 8, 4259839, 0, 8, 4194303, 0, 8, 4128767, 0, 8, 4063231, 0, 8, 3997695, 0, 8, 3932159, 0, 8, 3866623, 0, 8, 3801087, 0, 8, 3735551, 0, 8, 4980734, 0, 8, 4915198, 0, 8, 4849662, 0, 8, 4784126, 0, 8, 4718590, 0, 8, 4653054, 0, 8, 4587518, 0, 8, 4521982, 0, 8, 4456446, 0, 8, 4390910, 0, 8, 4325374, 0, 8, 4259838, 0, 8, 4194302, 0, 8, 4128766, 0, 8, 4063230, 0, 8, 3997694, 0, 8, 3932158, 0, 8, 3866622, 0, 8, 3801086, 0, 8, 3735550, 0, 8, 4980733, 0, 8, 4915197, 0, 8, 4849661, 0, 8, 4784125, 0, 8, 4718589, 0, 8, 4653053, 0, 8, 4587517, 0, 8, 4521981, 0, 8, 4456445, 0, 8, 4390909, 0, 8, 4325373, 0, 8, 4259837, 0, 8, 4194301, 0, 8, 4128765, 0, 8, 4063229, 0, 8, 3997693, 0, 8, 3932157, 0, 8, 3866621, 0, 8, 3801085, 0, 8, 3735549, 0, 8, 4980732, 0, 8, 4915196, 0, 8, 4849660, 0, 8, 4784124, 0, 8, 4718588, 0, 8, 4653052, 0, 8, 4587516, 0, 8, 4521980, 0, 8, 4456444, 0, 8, 4390908, 0, 8, 4325372, 0, 8, 4259836, 0, 8, 4194300, 0, 8, 4128764, 0, 8, 4063228, 0, 8, 3997692, 0, 8, 3932156, 0, 8, 3866620, 0, 8, 3801084, 0, 8, 3735548, 0, 8, 4980731, 0, 8, 4915195, 0, 8, 4849659, 0, 8, 4784123, 0, 8, 4718587, 0, 8, 4653051, 0, 8, 4587515, 0, 8, 4521979, 0, 8, 4456443, 0, 8, 4390907, 0, 8, 4325371, 0, 8, 4259835, 0, 8, 4194299, 0, 8, 4128763, 0, 8, 4063227, 0, 8, 3997691, 0, 8, 3932155, 0, 8, 3866619, 0, 8, 3801083, 0, 8, 3735547, 0, 8, 3801082, 196608, 3, 3670010, 196608, 4, 3670012, 131072, 7, 3866618, 196608, 3, 3735546, 196608, 3, 3932154, 196608, 3, 3997690, 196608, 3, 4063226, 196608, 3, 4128762, 196608, 3, 4194298, 196608, 3, 4259834, 196608, 3, 4325370, 196608, 3, 4390906, 196608, 3, 4456442, 196608, 3, 4521978, 196608, 3, 4587514, 196608, 3, 4653050, 196608, 3, 4718586, 196608, 3, 4784122, 196608, 3, 4849658, 196608, 3, 4915194, 196608, 3, 4980730, 196608, 3, 5046268, 131072, 2, 5046266, 720896, 2, 3670011, 131072, 7, 3670013, 131072, 7, 5046269, 131072, 2, 5046267, 131072, 2, 3670014, 131072, 7, 5046270, 131072, 2, 3670015, 131072, 7, 5046271, 131072, 2, 3604480, 131072, 7, 4980736, 131072, 2, 3604481, 131072, 7, 4980737, 131072, 2, 3604482, 131072, 7, 4980738, 131072, 2, 3604483, 131072, 7, 4980739, 131072, 2, 3604484, 131072, 7, 4980740, 131072, 2, 3604485, 131072, 7, 4980741, 131072, 2, 3604486, 131072, 7, 4980742, 131072, 2, 3604487, 131072, 7, 4980743, 131072, 2, 3604488, 131072, 7, 4980744, 131072, 2, 4980745, 131072, 2, 4980746, 131072, 2, 4980747, 131072, 2, 4980748, 131072, 2, 4980749, 131072, 2, 4980750, 131072, 2, 4980751, 131072, 2, 4980752, 131072, 2, 4980753, 131072, 2, 4980754, 196608, 2, 4980755, 0, 8, 4980756, 0, 8, 4980757, 0, 8, 4980758, 0, 8, 4980759, 0, 8, 4980760, 0, 8, 4980761, 0, 8, 4980762, 0, 8, 4980763, 0, 8, 3604508, 131072, 7, 4980764, 0, 8, 3604509, 131072, 7, 4980765, 0, 8, 3604510, 131072, 7, 4980766, 0, 8, 3604511, 131072, 7, 4980767, 0, 8, 3735584, 65536, 3, 3604512, 65536, 4, 3801120, 65536, 3, 3670048, 65536, 3, 3866656, 65536, 3, 3932192, 65536, 3, 3997728, 65536, 3, 4063264, 65536, 3, 4128800, 65536, 3, 4194336, 65536, 3, 4259872, 65536, 3, 4325408, 65536, 3, 4390944, 65536, 3, 4456480, 65536, 3, 4522016, 65536, 3, 4587552, 65536, 3, 4653088, 65536, 3, 4718624, 65536, 7, 4784160, 0, 8, 4849696, 0, 8, 4915232, 0, 8, 4980768, 0, 8, 4915288, 0, 8, 4849752, 0, 8, 4784216, 0, 8, 4718680, 0, 8, 4653144, 0, 8, 4587608, 0, 8, 4522072, 0, 8, 3604568, 0, 8, 3539032, 0, 8, 3473496, 0, 8, 3407960, 0, 8, 3342424, 0, 8, 3276888, 0, 8, 3211352, 0, 8, 3145816, 0, 8, 3080280, 0, 8, 3014744, 0, 8, 2949208, 0, 8, 2883672, 0, 8, 2818136, 0, 8, 2752600, 0, 8, 4915287, 0, 8, 4849751, 0, 8, 4784215, 0, 8, 4718679, 0, 8, 4653143, 0, 8, 4587607, 0, 8, 4522071, 0, 8, 4456535, 0, 8, 4390999, 0, 8, 4325463, 0, 8, 4259927, 0, 8, 4194391, 0, 8, 4128855, 0, 8, 4063319, 0, 8, 3997783, 0, 8, 3932247, 0, 8, 3866711, 0, 8, 3801175, 0, 8, 3735639, 0, 8, 3670103, 0, 8, 3604567, 0, 8, 3539031, 0, 8, 3473495, 0, 8, 3407959, 0, 8, 3342423, 0, 8, 3276887, 0, 8, 3211351, 0, 8, 3145815, 0, 8, 3080279, 0, 8, 3014743, 0, 8, 2949207, 0, 8, 2883671, 0, 8, 2818135, 0, 8, 2752599, 0, 8, 4915286, 0, 8, 4849750, 0, 8, 4784214, 0, 8, 4718678, 0, 8, 4653142, 0, 8, 4587606, 0, 8, 4522070, 0, 8, 4456534, 0, 8, 4390998, 0, 8, 4325462, 0, 8, 4259926, 0, 8, 4194390, 0, 8, 4128854, 0, 8, 4063318, 0, 8, 3997782, 0, 8, 3932246, 0, 8, 3866710, 0, 8, 3801174, 0, 8, 3735638, 0, 8, 3670102, 0, 8, 3604566, 0, 8, 3539030, 0, 8, 3473494, 0, 8, 3407958, 0, 8, 3342422, 0, 8, 3276886, 0, 8, 3211350, 0, 8, 3145814, 0, 8, 3080278, 0, 8, 3014742, 0, 8, 2949206, 0, 8, 2883670, 0, 8, 2818134, 0, 8, 2752598, 0, 8, 4915285, 0, 8, 4849749, 0, 8, 4784213, 0, 8, 4718677, 0, 8, 4653141, 0, 8, 4587605, 0, 8, 4522069, 0, 8, 4456533, 0, 8, 4390997, 0, 8, 4325461, 0, 8, 4259925, 0, 8, 4194389, 0, 8, 4128853, 0, 8, 4063317, 0, 8, 3997781, 0, 8, 3932245, 0, 8, 3866709, 0, 8, 3801173, 0, 8, 3735637, 0, 8, 3670101, 0, 8, 3604565, 0, 8, 3539029, 0, 8, 3473493, 0, 8, 3407957, 0, 8, 3342421, 0, 8, 3276885, 0, 8, 3211349, 0, 8, 3145813, 0, 8, 3080277, 0, 8, 3014741, 0, 8, 2949205, 0, 8, 2883669, 0, 8, 2818133, 0, 8, 2752597, 0, 8, 4915284, 0, 8, 4849748, 0, 8, 4784212, 0, 8, 4718676, 0, 8, 4653140, 0, 8, 4587604, 0, 8, 4522068, 0, 8, 4456532, 0, 8, 4390996, 0, 8, 4325460, 0, 8, 4259924, 0, 8, 4194388, 0, 8, 4128852, 0, 8, 4063316, 0, 8, 3997780, 0, 8, 3932244, 0, 8, 3866708, 0, 8, 3801172, 0, 8, 3735636, 0, 8, 3670100, 0, 8, 3604564, 0, 8, 3539028, 0, 8, 3473492, 0, 8, 3407956, 0, 8, 3342420, 0, 8, 3276884, 0, 8, 3211348, 0, 8, 3145812, 0, 8, 3080276, 0, 8, 3014740, 0, 8, 2949204, 0, 8, 2883668, 0, 8, 2818132, 0, 8, 2752596, 0, 8, 4915283, 0, 8, 4849747, 0, 8, 4784211, 0, 8, 4718675, 0, 8, 4653139, 0, 8, 4587603, 0, 8, 4522067, 0, 8, 4456531, 0, 8, 4390995, 0, 8, 4325459, 0, 8, 4259923, 0, 8, 4194387, 0, 8, 4128851, 0, 8, 4063315, 0, 8, 3997779, 0, 8, 3932243, 0, 8, 3866707, 0, 8, 3801171, 0, 8, 3735635, 0, 8, 3670099, 0, 8, 3604563, 0, 8, 3539027, 0, 8, 3473491, 0, 8, 3407955, 0, 8, 3342419, 0, 8, 3276883, 0, 8, 3211347, 0, 8, 3145811, 0, 8, 3080275, 0, 8, 3014739, 0, 8, 2949203, 0, 8, 2883667, 0, 8, 2818131, 0, 8, 2752595, 0, 8, 4915282, 0, 8, 4849746, 0, 8, 4784210, 0, 8, 4718674, 0, 8, 4653138, 0, 8, 4587602, 0, 8, 4522066, 0, 8, 4456530, 0, 8, 4390994, 0, 8, 4325458, 0, 8, 4259922, 0, 8, 4194386, 0, 8, 4128850, 0, 8, 4063314, 0, 8, 3997778, 0, 8, 3932242, 0, 8, 3866706, 0, 8, 3801170, 0, 8, 3735634, 0, 8, 3670098, 0, 8, 3604562, 0, 8, 3539026, 0, 8, 3473490, 0, 8, 3407954, 0, 8, 3342418, 0, 8, 3276882, 0, 8, 3211346, 0, 8, 3145810, 0, 8, 3080274, 0, 8, 3014738, 0, 8, 2949202, 0, 8, 2883666, 0, 8, 2818130, 0, 8, 2752594, 0, 8, 4915281, 0, 8, 4849745, 0, 8, 4784209, 0, 8, 4718673, 0, 8, 4653137, 0, 8, 4587601, 0, 8, 4522065, 0, 8, 4456529, 0, 8, 4390993, 0, 8, 4325457, 0, 8, 4259921, 0, 8, 4194385, 0, 8, 4128849, 0, 8, 4063313, 0, 8, 3997777, 0, 8, 3932241, 0, 8, 3866705, 0, 8, 3801169, 0, 8, 3735633, 0, 8, 3670097, 0, 8, 3604561, 0, 8, 3539025, 0, 8, 3473489, 0, 8, 3407953, 0, 8, 3342417, 0, 8, 3276881, 0, 8, 3211345, 0, 8, 3145809, 0, 8, 3080273, 0, 8, 3014737, 0, 8, 2949201, 0, 8, 2883665, 0, 8, 2818129, 0, 8, 2752593, 0, 8, 4915280, 0, 8, 4849744, 0, 8, 4784208, 0, 8, 4718672, 0, 8, 4653136, 0, 8, 4587600, 0, 8, 4522064, 0, 8, 4456528, 0, 8, 4390992, 0, 8, 4325456, 0, 8, 4259920, 0, 8, 4194384, 0, 8, 4128848, 0, 8, 4063312, 0, 8, 3997776, 0, 8, 3932240, 0, 8, 3866704, 0, 8, 3801168, 0, 8, 3735632, 0, 8, 3670096, 0, 8, 3604560, 0, 8, 3539024, 0, 8, 3473488, 0, 8, 3407952, 0, 8, 3342416, 0, 8, 3276880, 0, 8, 3211344, 0, 8, 3145808, 0, 8, 3080272, 0, 8, 3014736, 0, 8, 2949200, 0, 8, 2883664, 0, 8, 2818128, 0, 8, 2752592, 0, 8, 4915279, 0, 8, 4849743, 0, 8, 4784207, 0, 8, 4718671, 0, 8, 4653135, 0, 8, 4587599, 0, 8, 4522063, 0, 8, 4456527, 0, 8, 4390991, 0, 8, 4325455, 0, 8, 4259919, 0, 8, 4194383, 0, 8, 4128847, 0, 8, 4063311, 0, 8, 3997775, 0, 8, 3932239, 0, 8, 3866703, 0, 8, 3801167, 0, 8, 3735631, 0, 8, 3670095, 0, 8, 3604559, 0, 8, 3539023, 0, 8, 3473487, 0, 8, 3407951, 0, 8, 3342415, 0, 8, 3276879, 0, 8, 3211343, 0, 8, 3145807, 0, 8, 3080271, 0, 8, 3014735, 0, 8, 2949199, 0, 8, 2883663, 0, 8, 2818127, 0, 8, 2752591, 0, 8, 4915278, 0, 8, 4849742, 0, 8, 4784206, 0, 8, 4718670, 0, 8, 4653134, 0, 8, 4587598, 0, 8, 4522062, 0, 8, 4456526, 0, 8, 4390990, 0, 8, 4325454, 0, 8, 4259918, 0, 8, 4194382, 0, 8, 4128846, 0, 8, 4063310, 0, 8, 3997774, 0, 8, 3932238, 0, 8, 3866702, 0, 8, 3801166, 0, 8, 3735630, 0, 8, 3670094, 0, 8, 3604558, 0, 8, 3539022, 0, 8, 3473486, 0, 8, 3407950, 0, 8, 3342414, 0, 8, 3276878, 0, 8, 3211342, 0, 8, 3145806, 0, 8, 3080270, 0, 8, 3014734, 0, 8, 2949198, 0, 8, 2883662, 0, 8, 2818126, 0, 8, 2752590, 0, 8, 4915277, 0, 8, 4849741, 0, 8, 4784205, 0, 8, 4718669, 0, 8, 4653133, 0, 8, 4587597, 0, 8, 4522061, 0, 8, 4456525, 0, 8, 4390989, 0, 8, 4325453, 0, 8, 4259917, 0, 8, 4194381, 0, 8, 4128845, 0, 8, 4063309, 0, 8, 3997773, 0, 8, 3932237, 0, 8, 3866701, 0, 8, 3801165, 0, 8, 3735629, 0, 8, 3670093, 0, 8, 3604557, 0, 8, 3539021, 0, 8, 3473485, 0, 8, 3407949, 0, 8, 3342413, 0, 8, 3276877, 0, 8, 3211341, 0, 8, 3145805, 0, 8, 3080269, 0, 8, 3014733, 0, 8, 2949197, 0, 8, 2883661, 0, 8, 2818125, 0, 8, 2752589, 0, 8, 4915276, 0, 8, 4849740, 0, 8, 4784204, 0, 8, 4718668, 0, 8, 4653132, 0, 8, 4587596, 0, 8, 4522060, 0, 8, 4456524, 0, 8, 4390988, 0, 8, 4325452, 0, 8, 4259916, 0, 8, 4194380, 0, 8, 4128844, 0, 8, 4063308, 0, 8, 3997772, 0, 8, 3932236, 0, 8, 3866700, 0, 8, 3801164, 0, 8, 3735628, 0, 8, 3670092, 0, 8, 3604556, 0, 8, 3539020, 0, 8, 3473484, 0, 8, 3407948, 0, 8, 3342412, 0, 8, 3276876, 0, 8, 3211340, 0, 8, 3145804, 0, 8, 3080268, 0, 8, 3014732, 0, 8, 2949196, 0, 8, 2883660, 0, 8, 2818124, 0, 8, 2752588, 0, 8, 4915275, 0, 8, 4849739, 0, 8, 4784203, 0, 8, 4718667, 0, 8, 4653131, 0, 8, 4587595, 0, 8, 4522059, 0, 8, 4456523, 0, 8, 4390987, 0, 8, 4325451, 0, 8, 4259915, 0, 8, 4194379, 0, 8, 4128843, 0, 8, 4063307, 0, 8, 3997771, 0, 8, 3932235, 0, 8, 3866699, 0, 8, 3801163, 0, 8, 3735627, 0, 8, 3670091, 0, 8, 3604555, 0, 8, 3539019, 0, 8, 3473483, 0, 8, 3407947, 0, 8, 3342411, 0, 8, 3276875, 0, 8, 3211339, 0, 8, 3145803, 0, 8, 3080267, 0, 8, 3014731, 0, 8, 2949195, 0, 8, 2883659, 0, 8, 2818123, 0, 8, 2752587, 0, 8, 4915274, 0, 8, 4849738, 0, 8, 4784202, 0, 8, 4718666, 0, 8, 4653130, 0, 8, 4587594, 0, 8, 4522058, 0, 8, 4456522, 0, 8, 4390986, 0, 8, 4325450, 0, 8, 4259914, 0, 8, 4194378, 0, 8, 4128842, 0, 8, 4063306, 0, 8, 3997770, 0, 8, 3932234, 0, 8, 3866698, 0, 8, 3801162, 0, 8, 3735626, 0, 8, 3670090, 0, 8, 3604554, 0, 8, 3539018, 0, 8, 3473482, 0, 8, 3407946, 0, 8, 3342410, 0, 8, 3276874, 0, 8, 3211338, 0, 8, 3145802, 0, 8, 3080266, 0, 8, 3014730, 0, 8, 2949194, 0, 8, 2883658, 0, 8, 2818122, 0, 8, 2752586, 0, 8, 4915273, 0, 8, 4849737, 0, 8, 4784201, 0, 8, 4718665, 0, 8, 4653129, 0, 8, 4587593, 0, 8, 4522057, 0, 8, 4456521, 0, 8, 4390985, 0, 8, 4325449, 0, 8, 4259913, 0, 8, 4194377, 0, 8, 4128841, 0, 8, 4063305, 0, 8, 3997769, 0, 8, 3932233, 0, 8, 3866697, 0, 8, 3801161, 0, 8, 3735625, 0, 8, 3670089, 0, 8, 3604553, 0, 8, 3539017, 0, 8, 3473481, 0, 8, 3407945, 0, 8, 3342409, 0, 8, 3276873, 0, 8, 3211337, 0, 8, 3145801, 0, 8, 3080265, 0, 8, 3014729, 0, 8, 2949193, 0, 8, 2883657, 0, 8, 2818121, 0, 8, 2752585, 0, 8, 4915272, 0, 8, 4849736, 0, 8, 4784200, 0, 8, 4718664, 0, 8, 4653128, 0, 8, 4587592, 0, 8, 4522056, 0, 8, 4456520, 0, 8, 4390984, 0, 8, 4325448, 0, 8, 4259912, 0, 8, 4194376, 0, 8, 4128840, 0, 8, 4063304, 0, 8, 3997768, 0, 8, 3932232, 0, 8, 3866696, 0, 8, 3801160, 0, 8, 3735624, 0, 8, 3670088, 0, 8, 3604552, 0, 8, 3539016, 0, 8, 3473480, 0, 8, 3407944, 0, 8, 3342408, 0, 8, 3276872, 0, 8, 3211336, 0, 8, 3145800, 0, 8, 3080264, 0, 8, 3014728, 0, 8, 2949192, 0, 8, 2883656, 0, 8, 2818120, 0, 8, 2752584, 0, 8, 4915271, 0, 8, 4849735, 0, 8, 4784199, 0, 8, 4718663, 0, 8, 4653127, 0, 8, 4587591, 0, 8, 4522055, 0, 8, 4456519, 0, 8, 4390983, 0, 8, 4325447, 0, 8, 4259911, 0, 8, 4194375, 0, 8, 4128839, 0, 8, 4063303, 0, 8, 3997767, 0, 8, 3932231, 0, 8, 3866695, 0, 8, 3801159, 0, 8, 3735623, 0, 8, 3670087, 0, 8, 3604551, 0, 8, 3539015, 0, 8, 3473479, 0, 8, 3407943, 0, 8, 3342407, 0, 8, 3276871, 0, 8, 3211335, 0, 8, 3145799, 0, 8, 3080263, 0, 8, 3014727, 0, 8, 2949191, 0, 8, 2883655, 0, 8, 2818119, 0, 8, 2752583, 0, 8, 4915270, 0, 8, 4849734, 0, 8, 4784198, 0, 8, 4718662, 0, 8, 4653126, 0, 8, 4587590, 0, 8, 4522054, 0, 8, 4456518, 0, 8, 4390982, 0, 8, 4325446, 0, 8, 4259910, 0, 8, 4194374, 0, 8, 4128838, 0, 8, 4063302, 0, 8, 3997766, 0, 8, 3932230, 0, 8, 3866694, 0, 8, 3801158, 0, 8, 3735622, 0, 8, 3670086, 0, 8, 3604550, 0, 8, 3539014, 0, 8, 3473478, 0, 8, 3407942, 0, 8, 3342406, 0, 8, 3276870, 0, 8, 3211334, 0, 8, 3145798, 0, 8, 3080262, 0, 8, 4915269, 0, 8, 4849733, 0, 8, 4784197, 0, 8, 4718661, 0, 8, 4653125, 0, 8, 4587589, 0, 8, 4522053, 0, 8, 4456517, 0, 8, 4390981, 0, 8, 4325445, 0, 8, 4259909, 0, 8, 4194373, 0, 8, 4128837, 0, 8, 4063301, 0, 8, 3997765, 0, 8, 3932229, 0, 8, 3866693, 0, 8, 3801157, 0, 8, 3735621, 0, 8, 3670085, 0, 8, 3604549, 0, 8, 3539013, 0, 8, 3473477, 0, 8, 3407941, 0, 8, 3342405, 0, 8, 3276869, 0, 8, 3211333, 0, 8, 3145797, 0, 8, 3080261, 0, 8, 4915268, 0, 8, 4849732, 0, 8, 4784196, 0, 8, 4718660, 0, 8, 4653124, 0, 8, 4587588, 0, 8, 4522052, 0, 8, 4456516, 0, 8, 4390980, 0, 8, 4325444, 0, 8, 4259908, 0, 8, 4194372, 0, 8, 4128836, 0, 8, 4063300, 0, 8, 3997764, 0, 8, 3932228, 0, 8, 3866692, 0, 8, 3801156, 0, 8, 3735620, 0, 8, 3670084, 0, 8, 3604548, 0, 8, 3539012, 0, 8, 3473476, 0, 8, 3407940, 0, 8, 3342404, 0, 8, 3276868, 0, 8, 3211332, 0, 8, 3145796, 0, 8, 3080260, 0, 8, 4915267, 0, 8, 4849731, 0, 8, 4784195, 0, 8, 4718659, 0, 8, 4653123, 0, 8, 4587587, 0, 8, 4522051, 0, 8, 4456515, 0, 8, 4390979, 0, 8, 4325443, 0, 8, 4259907, 0, 8, 4194371, 0, 8, 4128835, 0, 8, 4063299, 0, 8, 3997763, 0, 8, 3932227, 0, 8, 3866691, 0, 8, 3801155, 0, 8, 3735619, 0, 8, 3670083, 0, 8, 3604547, 0, 8, 3539011, 0, 8, 3473475, 0, 8, 3407939, 0, 8, 3342403, 0, 8, 3276867, 0, 8, 3211331, 0, 8, 3145795, 0, 8, 3080259, 0, 8, 4915266, 0, 8, 4849730, 0, 8, 4784194, 0, 8, 4718658, 0, 8, 4653122, 0, 8, 4587586, 0, 8, 4522050, 0, 8, 4456514, 0, 8, 4390978, 0, 8, 4325442, 0, 8, 4259906, 0, 8, 4194370, 0, 8, 4128834, 0, 8, 4063298, 0, 8, 3997762, 0, 8, 3932226, 0, 8, 3866690, 0, 8, 3801154, 0, 8, 3735618, 0, 8, 3670082, 0, 8, 3604546, 0, 8, 3539010, 0, 8, 3473474, 0, 8, 3407938, 0, 8, 3342402, 0, 8, 3276866, 0, 8, 3211330, 0, 8, 3145794, 0, 8, 3080258, 0, 8, 4915265, 0, 8, 4849729, 0, 8, 4784193, 0, 8, 4718657, 0, 8, 4653121, 0, 8, 4587585, 0, 8, 4522049, 0, 8, 4456513, 0, 8, 4390977, 0, 8, 4325441, 0, 8, 4259905, 0, 8, 4194369, 0, 8, 4128833, 0, 8, 4063297, 0, 8, 3997761, 0, 8, 3932225, 0, 8, 3866689, 0, 8, 3801153, 0, 8, 3735617, 0, 8, 3670081, 0, 8, 3604545, 0, 8, 3539009, 0, 8, 3473473, 0, 8, 3407937, 0, 8, 3342401, 0, 8, 3276865, 0, 8, 3211329, 0, 8, 3145793, 0, 8, 3080257, 0, 8, 4915264, 0, 8, 4849728, 0, 8, 4784192, 0, 8, 4718656, 0, 8, 4653120, 0, 8, 4587584, 0, 8, 4522048, 0, 8, 4456512, 0, 8, 4390976, 0, 8, 4325440, 0, 8, 4259904, 0, 8, 4194368, 0, 8, 4128832, 0, 8, 4063296, 0, 8, 3997760, 0, 8, 3932224, 0, 8, 3866688, 0, 8, 3801152, 0, 8, 3735616, 0, 8, 3670080, 0, 8, 3604544, 0, 8, 3539008, 0, 8, 3473472, 0, 8, 3407936, 0, 8, 3342400, 0, 8, 3276864, 0, 8, 3211328, 0, 8, 3145792, 0, 8, 3080256, 0, 8, 4915263, 0, 8, 4849727, 0, 8, 4784191, 0, 8, 4718655, 0, 8, 4653119, 0, 8, 4587583, 0, 8, 4522047, 0, 8, 4456511, 0, 8, 4390975, 0, 8, 4325439, 0, 8, 4259903, 0, 8, 4194367, 0, 8, 4128831, 0, 8, 4063295, 0, 8, 3997759, 0, 8, 3932223, 0, 8, 3866687, 0, 8, 3801151, 0, 8, 3735615, 0, 8, 3670079, 0, 8, 3604543, 0, 8, 3539007, 0, 8, 3473471, 0, 8, 3407935, 0, 8, 3342399, 0, 8, 3276863, 0, 8, 3211327, 0, 8, 3145791, 0, 8, 3080255, 0, 8, 4915262, 0, 8, 4849726, 0, 8, 4784190, 0, 8, 4718654, 0, 8, 4653118, 0, 8, 4587582, 0, 8, 4522046, 0, 8, 4456510, 0, 8, 4390974, 0, 8, 4325438, 0, 8, 4259902, 0, 8, 4194366, 0, 8, 4128830, 0, 8, 4063294, 0, 8, 3997758, 0, 8, 3932222, 0, 8, 3866686, 0, 8, 3801150, 0, 8, 3735614, 0, 8, 3670078, 0, 8, 3604542, 0, 8, 3539006, 0, 8, 3473470, 0, 8, 3407934, 0, 8, 3342398, 0, 8, 3276862, 0, 8, 3211326, 0, 8, 3145790, 0, 8, 3080254, 0, 8, 4915261, 0, 8, 4849725, 0, 8, 4784189, 0, 8, 4718653, 0, 8, 4653117, 0, 8, 4587581, 0, 8, 4522045, 0, 8, 4456509, 0, 8, 4390973, 0, 8, 4325437, 0, 8, 4259901, 0, 8, 4194365, 0, 8, 4128829, 0, 8, 4063293, 0, 8, 3997757, 0, 8, 3932221, 0, 8, 3866685, 0, 8, 3801149, 0, 8, 3735613, 0, 8, 3670077, 0, 8, 3604541, 0, 8, 3539005, 0, 8, 3473469, 0, 8, 3407933, 0, 8, 3342397, 0, 8, 3276861, 0, 8, 3211325, 0, 8, 3145789, 0, 8, 3080253, 0, 8, 4915260, 0, 8, 4849724, 0, 8, 4784188, 0, 8, 4718652, 0, 8, 4653116, 0, 8, 4587580, 0, 8, 4522044, 0, 8, 4456508, 0, 8, 4390972, 0, 8, 4325436, 0, 8, 4259900, 0, 8, 4194364, 0, 8, 4128828, 0, 8, 4063292, 0, 8, 3997756, 0, 8, 3932220, 0, 8, 3866684, 0, 8, 3801148, 0, 8, 3735612, 0, 8, 3670076, 0, 8, 3604540, 0, 8, 3539004, 0, 8, 3473468, 0, 8, 3407932, 0, 8, 3342396, 0, 8, 3276860, 0, 8, 3211324, 0, 8, 3145788, 0, 8, 3080252, 0, 8, 4915259, 0, 8, 4849723, 0, 8, 4784187, 0, 8, 4718651, 0, 8, 4653115, 0, 8, 4587579, 0, 8, 4522043, 0, 8, 4456507, 0, 8, 4390971, 0, 8, 4325435, 0, 8, 4259899, 0, 8, 4194363, 0, 8, 4128827, 0, 8, 4063291, 0, 8, 3997755, 0, 8, 3932219, 0, 8, 3866683, 0, 8, 3801147, 0, 8, 3735611, 0, 8, 3670075, 0, 8, 3604539, 0, 8, 3539003, 0, 8, 3473467, 0, 8, 3407931, 0, 8, 3342395, 0, 8, 3276859, 0, 8, 3211323, 0, 8, 3145787, 0, 8, 3080251, 0, 8, 3080250, 196608, 3, 3145786, 196608, 3, 3211322, 196608, 3, 3276858, 196608, 3, 3342394, 196608, 3, 3407930, 196608, 3, 3473466, 196608, 3, 3539002, 196608, 3, 3604538, 196608, 3, 3670074, 196608, 3, 3735610, 196608, 3, 3801146, 196608, 3, 3866682, 196608, 3, 3932218, 196608, 3, 3997754, 196608, 3, 4063290, 196608, 3, 4128826, 196608, 3, 4194362, 196608, 3, 4259898, 196608, 3, 4325434, 196608, 3, 4390970, 196608, 3, 4456506, 196608, 3, 4522042, 196608, 3, 4587578, 196608, 3, 4653114, 196608, 3, 4718650, 196608, 7, 4784186, 0, 8, 4849722, 0, 8, 4915258, 0, 8, 4980796, 0, 8, 4980794, 0, 8, 4980797, 0, 8, 4980795, 0, 8, 4980798, 0, 8, 4980799, 0, 8, 4980800, 0, 8, 4980801, 0, 8, 4980802, 65536, 2, 4980803, 131072, 2, 4980804, 131072, 2, 4980805, 131072, 2, 4980806, 131072, 2, 2687047, 131072, 7, 4980807, 131072, 2, 2687048, 131072, 7, 4980808, 131072, 2, 2687049, 131072, 7, 4980809, 131072, 2, 2687050, 131072, 7, 4980810, 131072, 2, 2687051, 131072, 7, 4980811, 131072, 2, 2687052, 131072, 7, 4980812, 131072, 2, 2687053, 131072, 7, 4980813, 131072, 2, 2687054, 131072, 7, 4980814, 196608, 2, 2687055, 131072, 7, 4980815, 0, 8, 2687056, 131072, 7, 4980816, 0, 8, 2687057, 131072, 7, 4980817, 0, 8, 2687058, 131072, 7, 4980818, 0, 8, 2687059, 131072, 7, 4980819, 0, 8, 2687060, 131072, 7, 4980820, 0, 8, 2687061, 196608, 7, 4980821, 0, 8, 2687062, 0, 8, 4980822, 0, 8, 2687063, 0, 8, 4980823, 0, 8, 2687064, 0, 8, 4980824, 0, 8, 2818137, 0, 8, 2687065, 0, 8, 2883673, 0, 8, 2752601, 0, 8, 2949209, 0, 8, 3014745, 0, 8, 3080281, 0, 8, 3145817, 0, 8, 3211353, 0, 8, 3276889, 0, 8, 3342425, 0, 8, 3407961, 0, 8, 3473497, 0, 8, 3539033, 0, 8, 3604569, 0, 8, 4522073, 0, 8, 4587609, 0, 8, 4653145, 0, 8, 4718681, 0, 8, 4784217, 0, 8, 4849753, 0, 8, 4915289, 0, 8, 4980825, 0, 8, 589888, 196608, 4, 589890, 0, 8, 589889, 196608, 7, 589891, 0, 8, 1376353, 0, 8, 1310817, 0, 8, 1245281, 0, 8, 1179745, 0, 8, 1114209, 0, 8, 1048673, 0, 8, 983137, 0, 8, 917601, 0, 8, 852065, 0, 8, 786529, 0, 8, 720993, 0, 8, 655457, 0, 8, 589921, 0, 8, 524385, 0, 8, 458849, 0, 8, 393313, 0, 8, 327777, 0, 8, 262241, 0, 8, 196705, 0, 8, 131169, 0, 8, 1376352, 0, 8, 1310816, 0, 8, 1245280, 0, 8, 1179744, 0, 8, 1114208, 0, 8, 1048672, 0, 8, 983136, 0, 8, 917600, 0, 8, 852064, 0, 8, 786528, 0, 8, 720992, 0, 8, 655456, 0, 8, 589920, 0, 8, 524384, 0, 8, 458848, 0, 8, 393312, 0, 8, 327776, 0, 8, 262240, 0, 8, 196704, 0, 8, 131168, 0, 8, 1376351, 0, 8, 1310815, 0, 8, 1245279, 0, 8, 1179743, 0, 8, 1114207, 0, 8, 1048671, 0, 8, 983135, 0, 8, 917599, 0, 8, 852063, 0, 8, 786527, 0, 8, 720991, 0, 8, 655455, 0, 8, 589919, 0, 8, 524383, 0, 8, 458847, 0, 8, 393311, 0, 8, 327775, 0, 8, 262239, 0, 8, 196703, 0, 8, 131167, 0, 8, 1376350, 0, 8, 1310814, 0, 8, 1245278, 0, 8, 1179742, 0, 8, 1114206, 0, 8, 1048670, 0, 8, 983134, 0, 8, 917598, 0, 8, 852062, 0, 8, 786526, 0, 8, 720990, 0, 8, 655454, 0, 8, 589918, 0, 8, 524382, 0, 8, 458846, 0, 8, 393310, 0, 8, 327774, 0, 8, 262238, 0, 8, 196702, 0, 8, 131166, 0, 8, 1376349, 0, 8, 1310813, 0, 8, 1245277, 0, 8, 1179741, 0, 8, 1114205, 0, 8, 1048669, 0, 8, 983133, 0, 8, 917597, 0, 8, 852061, 0, 8, 786525, 0, 8, 720989, 0, 8, 655453, 0, 8, 589917, 0, 8, 524381, 0, 8, 458845, 0, 8, 393309, 0, 8, 327773, 0, 8, 262237, 0, 8, 196701, 0, 8, 131165, 0, 8, 1376348, 0, 8, 1310812, 0, 8, 1245276, 0, 8, 1179740, 0, 8, 1114204, 0, 8, 1048668, 0, 8, 983132, 0, 8, 917596, 0, 8, 852060, 0, 8, 786524, 0, 8, 720988, 0, 8, 655452, 0, 8, 589916, 0, 8, 524380, 0, 8, 458844, 0, 8, 393308, 0, 8, 327772, 0, 8, 262236, 0, 8, 196700, 0, 8, 131164, 0, 8, 1376347, 0, 8, 1310811, 0, 8, 1245275, 0, 8, 1179739, 0, 8, 1114203, 0, 8, 1048667, 0, 8, 983131, 0, 8, 917595, 0, 8, 852059, 0, 8, 786523, 0, 8, 720987, 0, 8, 655451, 0, 8, 589915, 0, 8, 524379, 0, 8, 458843, 0, 8, 393307, 0, 8, 327771, 0, 8, 262235, 0, 8, 196699, 0, 8, 131163, 0, 8, 1376346, 0, 8, 1310810, 0, 8, 1245274, 0, 8, 1179738, 0, 8, 1114202, 0, 8, 1048666, 0, 8, 983130, 0, 8, 917594, 0, 8, 852058, 0, 8, 786522, 0, 8, 720986, 0, 8, 655450, 0, 8, 589914, 0, 8, 524378, 0, 8, 458842, 0, 8, 393306, 0, 8, 327770, 0, 8, 262234, 0, 8, 196698, 0, 8, 131162, 0, 8, 1376345, 0, 8, 1310809, 0, 8, 1245273, 0, 8, 1179737, 0, 8, 1114201, 0, 8, 1048665, 0, 8, 983129, 0, 8, 917593, 0, 8, 852057, 0, 8, 786521, 0, 8, 720985, 0, 8, 655449, 0, 8, 589913, 0, 8, 524377, 0, 8, 458841, 0, 8, 393305, 0, 8, 327769, 0, 8, 262233, 0, 8, 196697, 0, 8, 131161, 0, 8, 1376344, 0, 8, 1310808, 0, 8, 1245272, 0, 8, 1179736, 0, 8, 1114200, 0, 8, 1048664, 0, 8, 983128, 0, 8, 917592, 0, 8, 852056, 0, 8, 786520, 0, 8, 720984, 0, 8, 655448, 0, 8, 589912, 0, 8, 524376, 0, 8, 458840, 0, 8, 393304, 0, 8, 327768, 0, 8, 262232, 0, 8, 196696, 0, 8, 131160, 0, 8, 1376343, 0, 8, 1310807, 0, 8, 1245271, 0, 8, 1179735, 0, 8, 1114199, 0, 8, 1048663, 0, 8, 983127, 0, 8, 917591, 0, 8, 852055, 0, 8, 786519, 0, 8, 720983, 0, 8, 655447, 0, 8, 589911, 0, 8, 524375, 0, 8, 458839, 0, 8, 393303, 0, 8, 327767, 0, 8, 262231, 0, 8, 196695, 0, 8, 131159, 0, 8, 1376342, 0, 8, 1310806, 0, 8, 1245270, 0, 8, 1179734, 0, 8, 1114198, 0, 8, 1048662, 0, 8, 983126, 0, 8, 917590, 0, 8, 852054, 0, 8, 786518, 0, 8, 720982, 0, 8, 655446, 0, 8, 589910, 0, 8, 524374, 0, 8, 458838, 0, 8, 393302, 0, 8, 327766, 0, 8, 262230, 0, 8, 196694, 0, 8, 131158, 0, 8, 1376341, 0, 8, 1310805, 0, 8, 1245269, 0, 8, 1179733, 0, 8, 1114197, 0, 8, 1048661, 0, 8, 983125, 0, 8, 917589, 0, 8, 852053, 0, 8, 786517, 0, 8, 720981, 0, 8, 655445, 0, 8, 589909, 0, 8, 524373, 0, 8, 458837, 0, 8, 393301, 0, 8, 327765, 0, 8, 262229, 0, 8, 196693, 0, 8, 131157, 0, 8, 1376340, 0, 8, 1310804, 0, 8, 1245268, 0, 8, 1179732, 0, 8, 1114196, 0, 8, 1048660, 0, 8, 983124, 0, 8, 917588, 0, 8, 852052, 0, 8, 786516, 0, 8, 720980, 0, 8, 655444, 0, 8, 589908, 0, 8, 524372, 0, 8, 458836, 0, 8, 393300, 0, 8, 327764, 0, 8, 262228, 0, 8, 196692, 0, 8, 131156, 0, 8, 1376339, 0, 8, 1310803, 0, 8, 1245267, 0, 8, 1179731, 0, 8, 1114195, 0, 8, 1048659, 0, 8, 983123, 0, 8, 917587, 0, 8, 852051, 0, 8, 786515, 0, 8, 720979, 0, 8, 655443, 0, 8, 589907, 0, 8, 524371, 0, 8, 458835, 0, 8, 393299, 0, 8, 327763, 0, 8, 262227, 0, 8, 196691, 0, 8, 131155, 0, 8, 1376338, 0, 8, 1310802, 0, 8, 1245266, 0, 8, 1179730, 0, 8, 1114194, 0, 8, 1048658, 0, 8, 983122, 0, 8, 917586, 0, 8, 852050, 0, 8, 786514, 0, 8, 720978, 0, 8, 655442, 0, 8, 589906, 0, 8, 524370, 0, 8, 458834, 0, 8, 393298, 0, 8, 327762, 0, 8, 262226, 0, 8, 196690, 0, 8, 131154, 0, 8, 1376337, 0, 8, 1310801, 0, 8, 1245265, 0, 8, 1179729, 0, 8, 1114193, 0, 8, 1048657, 0, 8, 983121, 0, 8, 917585, 0, 8, 852049, 0, 8, 786513, 0, 8, 720977, 0, 8, 655441, 0, 8, 589905, 0, 8, 524369, 0, 8, 458833, 0, 8, 393297, 0, 8, 327761, 0, 8, 262225, 0, 8, 196689, 0, 8, 131153, 0, 8, 1376336, 0, 8, 1310800, 0, 8, 1245264, 0, 8, 1179728, 0, 8, 1114192, 0, 8, 1048656, 0, 8, 983120, 0, 8, 917584, 0, 8, 852048, 0, 8, 786512, 0, 8, 720976, 0, 8, 655440, 0, 8, 589904, 0, 8, 524368, 0, 8, 458832, 0, 8, 393296, 0, 8, 327760, 0, 8, 262224, 0, 8, 196688, 0, 8, 131152, 0, 8, 1376335, 0, 8, 1310799, 0, 8, 1245263, 0, 8, 1179727, 0, 8, 1114191, 0, 8, 1048655, 0, 8, 983119, 0, 8, 917583, 0, 8, 852047, 0, 8, 786511, 0, 8, 720975, 0, 8, 655439, 0, 8, 589903, 0, 8, 524367, 0, 8, 458831, 0, 8, 393295, 0, 8, 327759, 0, 8, 262223, 0, 8, 196687, 0, 8, 131151, 0, 8, 1376334, 0, 8, 1310798, 0, 8, 1245262, 0, 8, 1179726, 0, 8, 1114190, 0, 8, 1048654, 0, 8, 983118, 0, 8, 917582, 0, 8, 852046, 0, 8, 786510, 0, 8, 720974, 0, 8, 655438, 0, 8, 589902, 0, 8, 524366, 0, 8, 458830, 0, 8, 393294, 0, 8, 327758, 0, 8, 262222, 0, 8, 196686, 0, 8, 131150, 0, 8, 1376333, 0, 8, 1310797, 0, 8, 1245261, 0, 8, 1179725, 0, 8, 1114189, 0, 8, 1048653, 0, 8, 983117, 0, 8, 917581, 0, 8, 852045, 0, 8, 786509, 0, 8, 720973, 0, 8, 655437, 0, 8, 589901, 0, 8, 524365, 0, 8, 458829, 0, 8, 393293, 0, 8, 327757, 0, 8, 262221, 0, 8, 196685, 0, 8, 131149, 0, 8, 1376332, 0, 8, 1310796, 0, 8, 1245260, 0, 8, 1179724, 0, 8, 1114188, 0, 8, 1048652, 0, 8, 983116, 0, 8, 917580, 0, 8, 852044, 0, 8, 786508, 0, 8, 720972, 0, 8, 655436, 0, 8, 589900, 0, 8, 524364, 0, 8, 458828, 0, 8, 393292, 0, 8, 327756, 0, 8, 262220, 0, 8, 196684, 0, 8, 131148, 0, 8, 1376331, 0, 8, 1310795, 0, 8, 1245259, 0, 8, 1179723, 0, 8, 1114187, 0, 8, 1048651, 0, 8, 983115, 0, 8, 917579, 0, 8, 852043, 0, 8, 786507, 0, 8, 720971, 0, 8, 655435, 0, 8, 589899, 0, 8, 524363, 0, 8, 458827, 0, 8, 393291, 0, 8, 327755, 0, 8, 262219, 0, 8, 196683, 0, 8, 131147, 0, 8, 1376330, 0, 8, 1310794, 0, 8, 1245258, 0, 8, 1179722, 0, 8, 1114186, 0, 8, 1048650, 0, 8, 983114, 0, 8, 917578, 0, 8, 852042, 0, 8, 786506, 0, 8, 720970, 0, 8, 655434, 0, 8, 589898, 0, 8, 524362, 0, 8, 458826, 0, 8, 393290, 0, 8, 327754, 0, 8, 262218, 0, 8, 196682, 0, 8, 131146, 0, 8, 1376329, 0, 8, 1310793, 0, 8, 1245257, 0, 8, 1179721, 0, 8, 1114185, 0, 8, 1048649, 0, 8, 983113, 0, 8, 917577, 0, 8, 852041, 0, 8, 786505, 0, 8, 720969, 0, 8, 655433, 0, 8, 589897, 0, 8, 524361, 0, 8, 458825, 0, 8, 393289, 0, 8, 327753, 0, 8, 262217, 0, 8, 196681, 0, 8, 131145, 0, 8, 1376328, 0, 8, 1310792, 0, 8, 1245256, 0, 8, 1179720, 0, 8, 1114184, 0, 8, 1048648, 0, 8, 983112, 0, 8, 917576, 0, 8, 852040, 0, 8, 786504, 0, 8, 720968, 0, 8, 655432, 0, 8, 589896, 0, 8, 524360, 0, 8, 458824, 0, 8, 393288, 0, 8, 327752, 0, 8, 262216, 0, 8, 196680, 0, 8, 131144, 0, 8, 1376327, 0, 8, 1310791, 0, 8, 1245255, 0, 8, 1179719, 0, 8, 1114183, 0, 8, 1048647, 0, 8, 983111, 0, 8, 917575, 0, 8, 852039, 0, 8, 786503, 0, 8, 720967, 0, 8, 655431, 0, 8, 589895, 0, 8, 524359, 0, 8, 458823, 0, 8, 393287, 0, 8, 327751, 0, 8, 262215, 0, 8, 196679, 0, 8, 131143, 0, 8, 589894, 0, 8, 524358, 0, 8, 458822, 0, 8, 393286, 0, 8, 327750, 0, 8, 262214, 0, 8, 196678, 0, 8, 131142, 0, 8, 589893, 0, 8, 524357, 0, 8, 458821, 0, 8, 393285, 0, 8, 327749, 0, 8, 262213, 0, 8, 196677, 0, 8, 131141, 0, 8, 589892, 0, 8, 524356, 0, 8, 458820, 0, 8, 393284, 0, 8, 327748, 0, 8, 262212, 0, 8, 196676, 0, 8, 131140, 0, 8, 524355, 0, 8, 458819, 0, 8, 393283, 0, 8, 327747, 0, 8, 262211, 0, 8, 196675, 0, 8, 131139, 0, 8, 524354, 0, 8, 458818, 0, 8, 393282, 0, 8, 327746, 0, 8, 262210, 0, 8, 196674, 0, 8, 131138, 0, 8, 196673, 196608, 3, 65601, 196608, 4, 65603, 131072, 7, 262209, 196608, 3, 131137, 196608, 3, 327745, 196608, 3, 393281, 196608, 3, 458817, 196608, 3, 524353, 196608, 3, 65602, 131072, 7, 65604, 131072, 7, 65605, 131072, 7, 65606, 131072, 7, 65607, 131072, 7, 1441863, 131072, 2, 65608, 131072, 7, 1441864, 131072, 2, 65609, 131072, 7, 1441865, 131072, 2, 65610, 131072, 7, 1441866, 131072, 2, 65611, 131072, 7, 1441867, 131072, 2, 65612, 131072, 7, 1441868, 131072, 2, 65613, 131072, 7, 1441869, 131072, 2, 65614, 131072, 7, 1441870, 131072, 2, 65615, 131072, 7, 1441871, 131072, 2, 65616, 131072, 7, 1441872, 131072, 2, 65617, 131072, 7, 1441873, 131072, 2, 65618, 131072, 7, 1441874, 131072, 2, 65619, 131072, 7, 1441875, 131072, 2, 65620, 131072, 7, 1441876, 131072, 2, 65621, 131072, 7, 1441877, 196608, 2, 65622, 131072, 7, 1441878, 0, 8, 65623, 131072, 7, 1441879, 0, 8, 65624, 131072, 7, 1441880, 0, 8, 65625, 131072, 7, 1441881, 0, 8, 65626, 131072, 7, 1441882, 0, 8, 65627, 131072, 7, 1441883, 0, 8, 65628, 131072, 7, 1441884, 0, 8, 65629, 131072, 7, 1441885, 0, 8, 65630, 131072, 7, 1441886, 0, 8, 65631, 131072, 7, 1441887, 0, 8, 65632, 131072, 7, 1441888, 0, 8, 65633, 131072, 7, 1441889, 0, 8, 196706, 65536, 3, 65634, 65536, 4, 262242, 65536, 3, 131170, 65536, 3, 327778, 65536, 3, 393314, 65536, 3, 458850, 65536, 3, 524386, 65536, 3, 589922, 65536, 3, 655458, 65536, 3, 720994, 65536, 3, 786530, 65536, 3, 852066, 65536, 7, 917602, 0, 8, 983138, 0, 8, 1048674, 0, 8, 1114210, 0, 8, 1179746, 0, 8, 1245282, 0, 8, 1310818, 0, 8, 1376354, 0, 8, 1441890, 0, 8, 3539069, 0, 8, 3473533, 0, 8, 3407997, 0, 8, 3342461, 0, 8, 3276925, 0, 8, 3211389, 0, 8, 3145853, 0, 8, 3080317, 0, 8, 3014781, 0, 8, 2949245, 0, 8, 2883709, 0, 8, 2818173, 0, 8, 2752637, 0, 8, 2687101, 0, 8, 2621565, 0, 8, 2556029, 0, 8, 2490493, 0, 8, 2424957, 0, 8, 2359421, 0, 8, 2293885, 0, 8, 2228349, 0, 8, 2162813, 0, 8, 2097277, 0, 8, 2031741, 0, 8, 1966205, 0, 8, 1900669, 0, 8, 1835133, 0, 8, 1769597, 0, 8, 1704061, 0, 8, 1638525, 0, 8, 1572989, 0, 8, 1507453, 0, 8, 1441917, 0, 8, 1376381, 0, 8, 1310845, 0, 8, 1245309, 0, 8, 1179773, 0, 8, 1114237, 0, 8, 1048701, 0, 8, 983165, 0, 8, 917629, 0, 8, 3539068, 0, 8, 3473532, 0, 8, 3407996, 0, 8, 3342460, 0, 8, 3276924, 0, 8, 3211388, 0, 8, 3145852, 0, 8, 3080316, 0, 8, 3014780, 0, 8, 2949244, 0, 8, 2883708, 0, 8, 2818172, 0, 8, 2752636, 0, 8, 2687100, 0, 8, 2621564, 0, 8, 2556028, 0, 8, 2490492, 0, 8, 2424956, 0, 8, 2359420, 0, 8, 2293884, 0, 8, 2228348, 0, 8, 2162812, 0, 8, 2097276, 0, 8, 2031740, 0, 8, 1966204, 0, 8, 1900668, 0, 8, 1835132, 0, 8, 1769596, 0, 8, 1704060, 0, 8, 1638524, 0, 8, 1572988, 0, 8, 1507452, 0, 8, 1441916, 0, 8, 1376380, 0, 8, 1310844, 0, 8, 1245308, 0, 8, 1179772, 0, 8, 1114236, 0, 8, 1048700, 0, 8, 983164, 0, 8, 917628, 0, 8, 3539067, 0, 8, 3473531, 0, 8, 3407995, 0, 8, 3342459, 0, 8, 3276923, 0, 8, 3211387, 0, 8, 3145851, 0, 8, 3080315, 0, 8, 3014779, 0, 8, 2949243, 0, 8, 2883707, 0, 8, 2818171, 0, 8, 2752635, 0, 8, 2687099, 0, 8, 2621563, 0, 8, 2556027, 0, 8, 2490491, 0, 8, 2424955, 0, 8, 2359419, 0, 8, 2293883, 0, 8, 2228347, 0, 8, 2162811, 0, 8, 2097275, 0, 8, 2031739, 0, 8, 1966203, 0, 8, 1900667, 0, 8, 1835131, 0, 8, 1769595, 0, 8, 1704059, 0, 8, 1638523, 0, 8, 1572987, 0, 8, 1507451, 0, 8, 1441915, 0, 8, 1376379, 0, 8, 1310843, 0, 8, 1245307, 0, 8, 1179771, 0, 8, 1114235, 0, 8, 1048699, 0, 8, 983163, 0, 8, 917627, 0, 8, 3539066, 0, 8, 3473530, 0, 8, 3407994, 0, 8, 3342458, 0, 8, 3276922, 0, 8, 3211386, 0, 8, 3145850, 0, 8, 3080314, 0, 8, 3014778, 0, 8, 2949242, 0, 8, 2883706, 0, 8, 2818170, 0, 8, 2752634, 0, 8, 2687098, 0, 8, 2621562, 0, 8, 2556026, 0, 8, 2490490, 0, 8, 2424954, 0, 8, 2359418, 0, 8, 2293882, 0, 8, 2228346, 0, 8, 2162810, 0, 8, 2097274, 0, 8, 2031738, 0, 8, 1966202, 0, 8, 1900666, 0, 8, 1835130, 0, 8, 1769594, 0, 8, 1704058, 0, 8, 1638522, 0, 8, 1572986, 0, 8, 1507450, 0, 8, 1441914, 0, 8, 1376378, 0, 8, 1310842, 0, 8, 1245306, 0, 8, 1179770, 0, 8, 1114234, 0, 8, 1048698, 0, 8, 983162, 0, 8, 917626, 0, 8, 3539065, 0, 8, 3473529, 0, 8, 3407993, 0, 8, 3342457, 0, 8, 3276921, 0, 8, 3211385, 0, 8, 3145849, 0, 8, 3080313, 0, 8, 3014777, 0, 8, 2949241, 0, 8, 2883705, 0, 8, 2818169, 0, 8, 2752633, 0, 8, 2687097, 0, 8, 2621561, 0, 8, 2556025, 0, 8, 2490489, 0, 8, 2424953, 0, 8, 2359417, 0, 8, 2293881, 0, 8, 2228345, 0, 8, 2162809, 0, 8, 2097273, 0, 8, 2031737, 0, 8, 1966201, 0, 8, 1900665, 0, 8, 1835129, 0, 8, 1769593, 0, 8, 1704057, 0, 8, 1638521, 0, 8, 1572985, 0, 8, 1507449, 0, 8, 1441913, 0, 8, 1376377, 0, 8, 1310841, 0, 8, 1245305, 0, 8, 1179769, 0, 8, 1114233, 0, 8, 1048697, 0, 8, 983161, 0, 8, 917625, 0, 8, 3539064, 0, 8, 3473528, 0, 8, 3407992, 0, 8, 3342456, 0, 8, 3276920, 0, 8, 3211384, 0, 8, 3145848, 0, 8, 3080312, 0, 8, 3014776, 0, 8, 2949240, 0, 8, 2883704, 0, 8, 2818168, 0, 8, 2752632, 0, 8, 2687096, 0, 8, 2621560, 0, 8, 2556024, 0, 8, 2490488, 0, 8, 2424952, 0, 8, 2359416, 0, 8, 2293880, 0, 8, 2228344, 0, 8, 2162808, 0, 8, 2097272, 0, 8, 2031736, 0, 8, 1966200, 0, 8, 1900664, 0, 8, 1835128, 0, 8, 1769592, 0, 8, 1704056, 0, 8, 1638520, 0, 8, 1572984, 0, 8, 1507448, 0, 8, 1441912, 0, 8, 1376376, 0, 8, 1310840, 0, 8, 1245304, 0, 8, 1179768, 0, 8, 1114232, 0, 8, 1048696, 0, 8, 983160, 0, 8, 917624, 0, 8, 3539063, 0, 8, 3473527, 0, 8, 3407991, 0, 8, 3342455, 0, 8, 3276919, 0, 8, 3211383, 0, 8, 3145847, 0, 8, 3080311, 0, 8, 3014775, 0, 8, 2949239, 0, 8, 2883703, 0, 8, 2818167, 0, 8, 2752631, 0, 8, 2687095, 0, 8, 2621559, 0, 8, 2556023, 0, 8, 2490487, 0, 8, 2424951, 0, 8, 2359415, 0, 8, 2293879, 0, 8, 2228343, 0, 8, 2162807, 0, 8, 2097271, 0, 8, 2031735, 0, 8, 1966199, 0, 8, 1900663, 0, 8, 1835127, 0, 8, 1769591, 0, 8, 1704055, 0, 8, 1638519, 0, 8, 1572983, 0, 8, 1507447, 0, 8, 1441911, 0, 8, 1376375, 0, 8, 1310839, 0, 8, 1245303, 0, 8, 1179767, 0, 8, 1114231, 0, 8, 1048695, 0, 8, 983159, 0, 8, 917623, 0, 8, 3539062, 0, 8, 3473526, 0, 8, 3407990, 0, 8, 3342454, 0, 8, 3276918, 0, 8, 3211382, 0, 8, 3145846, 0, 8, 3080310, 0, 8, 3014774, 0, 8, 2949238, 0, 8, 2883702, 0, 8, 2818166, 0, 8, 2752630, 0, 8, 2687094, 0, 8, 2621558, 0, 8, 2556022, 0, 8, 2490486, 0, 8, 2424950, 0, 8, 2359414, 0, 8, 2293878, 0, 8, 2228342, 0, 8, 2162806, 0, 8, 2097270, 0, 8, 2031734, 0, 8, 1966198, 0, 8, 1900662, 0, 8, 1835126, 0, 8, 1769590, 0, 8, 1704054, 0, 8, 1638518, 0, 8, 1572982, 0, 8, 1507446, 0, 8, 1441910, 0, 8, 1376374, 0, 8, 1310838, 0, 8, 1245302, 0, 8, 1179766, 0, 8, 1114230, 0, 8, 1048694, 0, 8, 983158, 0, 8, 917622, 0, 8, 3539061, 0, 8, 3473525, 0, 8, 3407989, 0, 8, 3342453, 0, 8, 3276917, 0, 8, 3211381, 0, 8, 3145845, 0, 8, 3080309, 0, 8, 3014773, 0, 8, 2949237, 0, 8, 2883701, 0, 8, 2818165, 0, 8, 2752629, 0, 8, 2687093, 0, 8, 2621557, 0, 8, 2556021, 0, 8, 2490485, 0, 8, 2424949, 0, 8, 2359413, 0, 8, 2293877, 0, 8, 2228341, 0, 8, 2162805, 0, 8, 2097269, 0, 8, 2031733, 0, 8, 1966197, 0, 8, 1900661, 0, 8, 1835125, 0, 8, 1769589, 0, 8, 1704053, 0, 8, 1638517, 0, 8, 1572981, 0, 8, 1507445, 0, 8, 1441909, 0, 8, 1376373, 0, 8, 1310837, 0, 8, 1245301, 0, 8, 1179765, 0, 8, 1114229, 0, 8, 1048693, 0, 8, 983157, 0, 8, 917621, 0, 8, 3539060, 0, 8, 3473524, 0, 8, 3407988, 0, 8, 3342452, 0, 8, 3276916, 0, 8, 3211380, 0, 8, 3145844, 0, 8, 3080308, 0, 8, 3014772, 0, 8, 2949236, 0, 8, 2883700, 0, 8, 2818164, 0, 8, 2752628, 0, 8, 2687092, 0, 8, 2621556, 0, 8, 2556020, 0, 8, 2490484, 0, 8, 2424948, 0, 8, 2359412, 0, 8, 2293876, 0, 8, 2228340, 0, 8, 2162804, 0, 8, 2097268, 0, 8, 2031732, 0, 8, 1966196, 0, 8, 1900660, 0, 8, 1835124, 0, 8, 1769588, 0, 8, 1704052, 0, 8, 1638516, 0, 8, 1572980, 0, 8, 1507444, 0, 8, 1441908, 0, 8, 1376372, 0, 8, 1310836, 0, 8, 1245300, 0, 8, 1179764, 0, 8, 1114228, 0, 8, 1048692, 0, 8, 983156, 0, 8, 917620, 0, 8, 3539059, 0, 8, 3473523, 0, 8, 3407987, 0, 8, 3342451, 0, 8, 3276915, 0, 8, 3211379, 0, 8, 3145843, 0, 8, 3080307, 0, 8, 3014771, 0, 8, 2949235, 0, 8, 2883699, 0, 8, 2818163, 0, 8, 2752627, 0, 8, 2687091, 0, 8, 2621555, 0, 8, 2556019, 0, 8, 2490483, 0, 8, 2424947, 0, 8, 2359411, 0, 8, 2293875, 0, 8, 2228339, 0, 8, 2162803, 0, 8, 2097267, 0, 8, 2031731, 0, 8, 1966195, 0, 8, 1900659, 0, 8, 1835123, 0, 8, 1769587, 0, 8, 1704051, 0, 8, 1638515, 0, 8, 1572979, 0, 8, 1507443, 0, 8, 1441907, 0, 8, 1376371, 0, 8, 1310835, 0, 8, 1245299, 0, 8, 1179763, 0, 8, 1114227, 0, 8, 1048691, 0, 8, 983155, 0, 8, 917619, 0, 8, 3539058, 0, 8, 3473522, 0, 8, 3407986, 0, 8, 3342450, 0, 8, 3276914, 0, 8, 3211378, 0, 8, 3145842, 0, 8, 3080306, 0, 8, 3014770, 0, 8, 2949234, 0, 8, 2883698, 0, 8, 2818162, 0, 8, 2752626, 0, 8, 2687090, 0, 8, 2621554, 0, 8, 2556018, 0, 8, 2490482, 0, 8, 2424946, 0, 8, 2359410, 0, 8, 2293874, 0, 8, 2228338, 0, 8, 2162802, 0, 8, 2097266, 0, 8, 2031730, 0, 8, 1966194, 0, 8, 1900658, 0, 8, 1835122, 0, 8, 1769586, 0, 8, 1704050, 0, 8, 1638514, 0, 8, 1572978, 0, 8, 1507442, 0, 8, 1441906, 0, 8, 1376370, 0, 8, 1310834, 0, 8, 1245298, 0, 8, 1179762, 0, 8, 1114226, 0, 8, 1048690, 0, 8, 983154, 0, 8, 917618, 0, 8, 3539057, 0, 8, 3473521, 0, 8, 3407985, 0, 8, 3342449, 0, 8, 3276913, 0, 8, 3211377, 0, 8, 3145841, 0, 8, 3080305, 0, 8, 3014769, 0, 8, 2949233, 0, 8, 2883697, 0, 8, 2818161, 0, 8, 2752625, 0, 8, 2687089, 0, 8, 2621553, 0, 8, 2556017, 0, 8, 2490481, 0, 8, 2424945, 0, 8, 2359409, 0, 8, 2293873, 0, 8, 2228337, 0, 8, 2162801, 0, 8, 2097265, 0, 8, 2031729, 0, 8, 1966193, 0, 8, 1900657, 0, 8, 1835121, 0, 8, 1769585, 0, 8, 1704049, 0, 8, 1638513, 0, 8, 1572977, 0, 8, 1507441, 0, 8, 1441905, 0, 8, 1376369, 0, 8, 1310833, 0, 8, 1245297, 0, 8, 1179761, 0, 8, 1114225, 0, 8, 1048689, 0, 8, 983153, 0, 8, 917617, 0, 8, 3539056, 0, 8, 3473520, 0, 8, 3407984, 0, 8, 3342448, 0, 8, 3276912, 0, 8, 3211376, 0, 8, 3145840, 0, 8, 3080304, 0, 8, 3014768, 0, 8, 2949232, 0, 8, 2883696, 0, 8, 2818160, 0, 8, 2752624, 0, 8, 2687088, 0, 8, 2621552, 0, 8, 2556016, 0, 8, 2490480, 0, 8, 2424944, 0, 8, 2359408, 0, 8, 2293872, 0, 8, 2228336, 0, 8, 2162800, 0, 8, 2097264, 0, 8, 2031728, 0, 8, 1966192, 0, 8, 1900656, 0, 8, 1835120, 0, 8, 1769584, 0, 8, 1704048, 0, 8, 1638512, 0, 8, 1572976, 0, 8, 1507440, 0, 8, 1441904, 0, 8, 1376368, 0, 8, 1310832, 0, 8, 1245296, 0, 8, 1179760, 0, 8, 1114224, 0, 8, 1048688, 0, 8, 983152, 0, 8, 917616, 0, 8, 3539055, 0, 8, 3473519, 0, 8, 3407983, 0, 8, 3342447, 0, 8, 3276911, 0, 8, 3211375, 0, 8, 3145839, 0, 8, 3080303, 0, 8, 3014767, 0, 8, 2949231, 0, 8, 2883695, 0, 8, 2818159, 0, 8, 2752623, 0, 8, 2687087, 0, 8, 2621551, 0, 8, 2556015, 0, 8, 2490479, 0, 8, 2424943, 0, 8, 2359407, 0, 8, 2293871, 0, 8, 2228335, 0, 8, 2162799, 0, 8, 2097263, 0, 8, 2031727, 0, 8, 1966191, 0, 8, 1900655, 0, 8, 1835119, 0, 8, 1769583, 0, 8, 1704047, 0, 8, 1638511, 0, 8, 1572975, 0, 8, 1507439, 0, 8, 1441903, 0, 8, 1376367, 0, 8, 1310831, 0, 8, 1245295, 0, 8, 1179759, 0, 8, 1114223, 0, 8, 1048687, 0, 8, 983151, 0, 8, 917615, 0, 8, 3539054, 0, 8, 3473518, 0, 8, 3407982, 0, 8, 3342446, 0, 8, 3276910, 0, 8, 3211374, 0, 8, 3145838, 0, 8, 3080302, 0, 8, 3014766, 0, 8, 2949230, 0, 8, 2883694, 0, 8, 2818158, 0, 8, 2752622, 0, 8, 2687086, 0, 8, 2621550, 0, 8, 2556014, 0, 8, 2490478, 0, 8, 2424942, 0, 8, 2359406, 0, 8, 2293870, 0, 8, 2228334, 0, 8, 2162798, 0, 8, 2097262, 0, 8, 2031726, 0, 8, 1966190, 0, 8, 1900654, 0, 8, 1835118, 0, 8, 1769582, 0, 8, 1704046, 0, 8, 1638510, 0, 8, 1572974, 0, 8, 1507438, 0, 8, 1441902, 0, 8, 1376366, 0, 8, 1310830, 0, 8, 1245294, 0, 8, 1179758, 0, 8, 1114222, 0, 8, 1048686, 0, 8, 983150, 0, 8, 917614, 0, 8, 3539053, 0, 8, 3473517, 0, 8, 3407981, 0, 8, 3342445, 0, 8, 3276909, 0, 8, 3211373, 0, 8, 3145837, 0, 8, 3080301, 0, 8, 3014765, 0, 8, 2949229, 0, 8, 2883693, 0, 8, 2818157, 0, 8, 2752621, 0, 8, 2687085, 0, 8, 2621549, 0, 8, 2556013, 0, 8, 2490477, 0, 8, 2424941, 0, 8, 2359405, 0, 8, 2293869, 0, 8, 2228333, 0, 8, 2162797, 0, 8, 2097261, 0, 8, 2031725, 0, 8, 1966189, 0, 8, 1900653, 0, 8, 1835117, 0, 8, 1769581, 0, 8, 1704045, 0, 8, 1638509, 0, 8, 1572973, 0, 8, 1507437, 0, 8, 1441901, 0, 8, 1376365, 0, 8, 1310829, 0, 8, 1245293, 0, 8, 1179757, 0, 8, 1114221, 0, 8, 1048685, 0, 8, 983149, 0, 8, 917613, 0, 8, 3539052, 0, 8, 3473516, 0, 8, 3407980, 0, 8, 3342444, 0, 8, 3276908, 0, 8, 3211372, 0, 8, 3145836, 0, 8, 3080300, 0, 8, 3014764, 0, 8, 2949228, 0, 8, 2883692, 0, 8, 2818156, 0, 8, 2752620, 0, 8, 2687084, 0, 8, 2621548, 0, 8, 2556012, 0, 8, 2490476, 0, 8, 2424940, 0, 8, 2359404, 0, 8, 2293868, 0, 8, 2228332, 0, 8, 2162796, 0, 8, 2097260, 0, 8, 2031724, 0, 8, 1966188, 0, 8, 1900652, 0, 8, 1835116, 0, 8, 1769580, 0, 8, 1704044, 0, 8, 1638508, 0, 8, 1572972, 0, 8, 1507436, 0, 8, 1441900, 0, 8, 1376364, 0, 8, 1310828, 0, 8, 1245292, 0, 8, 1179756, 0, 8, 1114220, 0, 8, 1048684, 0, 8, 983148, 0, 8, 917612, 0, 8, 3539051, 0, 8, 3473515, 0, 8, 3407979, 0, 8, 3342443, 0, 8, 3276907, 0, 8, 3211371, 0, 8, 3145835, 0, 8, 3080299, 0, 8, 3014763, 0, 8, 2949227, 0, 8, 2883691, 0, 8, 2818155, 0, 8, 2752619, 0, 8, 2687083, 0, 8, 2621547, 0, 8, 2556011, 0, 8, 2490475, 0, 8, 2424939, 0, 8, 2359403, 0, 8, 2293867, 0, 8, 2228331, 0, 8, 2162795, 0, 8, 2097259, 0, 8, 2031723, 0, 8, 1966187, 0, 8, 1900651, 0, 8, 1835115, 0, 8, 1769579, 0, 8, 1704043, 0, 8, 1638507, 0, 8, 1572971, 0, 8, 1507435, 0, 8, 1441899, 0, 8, 1376363, 0, 8, 1310827, 0, 8, 1245291, 0, 8, 1179755, 0, 8, 1114219, 0, 8, 1048683, 0, 8, 983147, 0, 8, 917611, 0, 8, 3539050, 0, 8, 3473514, 0, 8, 3407978, 0, 8, 3342442, 0, 8, 3276906, 0, 8, 3211370, 0, 8, 3145834, 0, 8, 3080298, 0, 8, 3014762, 0, 8, 2949226, 0, 8, 2883690, 0, 8, 2818154, 0, 8, 2752618, 0, 8, 2687082, 0, 8, 2621546, 0, 8, 2556010, 0, 8, 2490474, 0, 8, 2424938, 0, 8, 2359402, 0, 8, 2293866, 0, 8, 2228330, 0, 8, 2162794, 0, 8, 2097258, 0, 8, 2031722, 0, 8, 1966186, 0, 8, 1900650, 0, 8, 1835114, 0, 8, 1769578, 0, 8, 1704042, 0, 8, 1638506, 0, 8, 1572970, 0, 8, 1507434, 0, 8, 1441898, 0, 8, 1376362, 0, 8, 1310826, 0, 8, 1245290, 0, 8, 1179754, 0, 8, 1114218, 0, 8, 1048682, 0, 8, 983146, 0, 8, 917610, 0, 8, 3539049, 0, 8, 3473513, 0, 8, 3407977, 0, 8, 3342441, 0, 8, 3276905, 0, 8, 3211369, 0, 8, 3145833, 0, 8, 3080297, 0, 8, 3014761, 0, 8, 2949225, 0, 8, 2883689, 0, 8, 2818153, 0, 8, 2752617, 0, 8, 2687081, 0, 8, 2621545, 0, 8, 2556009, 0, 8, 2490473, 0, 8, 2424937, 0, 8, 2359401, 0, 8, 2293865, 0, 8, 2228329, 0, 8, 2162793, 0, 8, 2097257, 0, 8, 2031721, 0, 8, 1966185, 0, 8, 1900649, 0, 8, 1835113, 0, 8, 1769577, 0, 8, 1704041, 0, 8, 1638505, 0, 8, 1572969, 0, 8, 1507433, 0, 8, 1441897, 0, 8, 1376361, 0, 8, 1310825, 0, 8, 1245289, 0, 8, 1179753, 0, 8, 1114217, 0, 8, 1048681, 0, 8, 983145, 0, 8, 917609, 0, 8, 3539048, 0, 8, 3473512, 0, 8, 3407976, 0, 8, 3342440, 0, 8, 3276904, 0, 8, 3211368, 0, 8, 3145832, 0, 8, 3080296, 0, 8, 3014760, 0, 8, 2949224, 0, 8, 2883688, 0, 8, 2818152, 0, 8, 2752616, 0, 8, 2687080, 0, 8, 2621544, 0, 8, 2556008, 0, 8, 2490472, 0, 8, 2424936, 0, 8, 2359400, 0, 8, 2293864, 0, 8, 2228328, 0, 8, 2162792, 0, 8, 2097256, 0, 8, 2031720, 0, 8, 1966184, 0, 8, 1900648, 0, 8, 1835112, 0, 8, 1769576, 0, 8, 1704040, 0, 8, 1638504, 0, 8, 1572968, 0, 8, 1507432, 0, 8, 1441896, 0, 8, 1376360, 0, 8, 1310824, 0, 8, 1245288, 0, 8, 1179752, 0, 8, 1114216, 0, 8, 1048680, 0, 8, 983144, 0, 8, 917608, 0, 8, 3539047, 0, 8, 3473511, 0, 8, 3407975, 0, 8, 3342439, 0, 8, 3276903, 0, 8, 3211367, 0, 8, 3145831, 0, 8, 3080295, 0, 8, 3014759, 0, 8, 2949223, 0, 8, 2883687, 0, 8, 2818151, 0, 8, 2752615, 0, 8, 2687079, 0, 8, 2621543, 0, 8, 2556007, 0, 8, 2490471, 0, 8, 2424935, 0, 8, 2359399, 0, 8, 2293863, 0, 8, 2228327, 0, 8, 2162791, 0, 8, 2097255, 0, 8, 2031719, 0, 8, 1966183, 0, 8, 1900647, 0, 8, 1835111, 0, 8, 1769575, 0, 8, 1704039, 0, 8, 1638503, 0, 8, 1572967, 0, 8, 1507431, 0, 8, 1441895, 0, 8, 1376359, 0, 8, 1310823, 0, 8, 1245287, 0, 8, 1179751, 0, 8, 1114215, 0, 8, 1048679, 0, 8, 983143, 0, 8, 917607, 0, 8, 3539046, 0, 8, 3473510, 0, 8, 3407974, 0, 8, 3342438, 0, 8, 3276902, 0, 8, 3211366, 0, 8, 3145830, 0, 8, 3080294, 0, 8, 3014758, 0, 8, 2949222, 0, 8, 2883686, 0, 8, 2818150, 0, 8, 2752614, 0, 8, 2687078, 0, 8, 2621542, 0, 8, 2556006, 0, 8, 2490470, 0, 8, 2424934, 0, 8, 2359398, 0, 8, 2293862, 0, 8, 2228326, 0, 8, 2162790, 0, 8, 2097254, 0, 8, 2031718, 0, 8, 1966182, 0, 8, 1900646, 0, 8, 1835110, 0, 8, 1769574, 0, 8, 1704038, 0, 8, 1638502, 0, 8, 1572966, 0, 8, 1507430, 0, 8, 1441894, 0, 8, 1376358, 0, 8, 1310822, 0, 8, 1245286, 0, 8, 1179750, 0, 8, 1114214, 0, 8, 1048678, 0, 8, 983142, 0, 8, 917606, 0, 8, 3539045, 0, 8, 3473509, 0, 8, 3407973, 0, 8, 3342437, 0, 8, 3276901, 0, 8, 3211365, 0, 8, 3145829, 0, 8, 3080293, 0, 8, 3014757, 0, 8, 2949221, 0, 8, 2883685, 0, 8, 2818149, 0, 8, 2752613, 0, 8, 2687077, 0, 8, 2621541, 0, 8, 2556005, 0, 8, 2490469, 0, 8, 2424933, 0, 8, 2359397, 0, 8, 2293861, 0, 8, 2228325, 0, 8, 2162789, 0, 8, 2097253, 0, 8, 2031717, 0, 8, 1966181, 0, 8, 1900645, 0, 8, 1835109, 0, 8, 1769573, 0, 8, 1704037, 0, 8, 1638501, 0, 8, 1572965, 0, 8, 1507429, 0, 8, 1441893, 0, 8, 1376357, 0, 8, 1310821, 0, 8, 1245285, 0, 8, 1179749, 0, 8, 1114213, 0, 8, 1048677, 0, 8, 983141, 0, 8, 917605, 0, 8, 3539044, 0, 8, 3473508, 0, 8, 3407972, 0, 8, 3342436, 0, 8, 3276900, 0, 8, 3211364, 0, 8, 3145828, 0, 8, 3080292, 0, 8, 3014756, 0, 8, 2949220, 0, 8, 2883684, 0, 8, 2818148, 0, 8, 2752612, 0, 8, 2687076, 0, 8, 2621540, 0, 8, 2556004, 0, 8, 2490468, 0, 8, 2424932, 0, 8, 2359396, 0, 8, 2293860, 0, 8, 2228324, 0, 8, 2162788, 0, 8, 2097252, 0, 8, 2031716, 0, 8, 1966180, 0, 8, 1900644, 0, 8, 1835108, 0, 8, 1769572, 0, 8, 1704036, 0, 8, 1638500, 0, 8, 1572964, 0, 8, 1507428, 0, 8, 1441892, 0, 8, 1376356, 0, 8, 1310820, 0, 8, 1245284, 0, 8, 1179748, 0, 8, 1114212, 0, 8, 1048676, 0, 8, 983140, 0, 8, 917604, 0, 8, 3539043, 0, 8, 3473507, 0, 8, 3407971, 0, 8, 3342435, 0, 8, 3276899, 0, 8, 3211363, 0, 8, 3145827, 0, 8, 3080291, 0, 8, 3014755, 0, 8, 2949219, 0, 8, 2883683, 0, 8, 2818147, 0, 8, 2752611, 0, 8, 2687075, 0, 8, 2621539, 0, 8, 2556003, 0, 8, 2490467, 0, 8, 2424931, 0, 8, 2359395, 0, 8, 2293859, 0, 8, 2228323, 0, 8, 2162787, 0, 8, 2097251, 0, 8, 2031715, 0, 8, 1966179, 0, 8, 1900643, 0, 8, 1835107, 0, 8, 1769571, 0, 8, 1704035, 0, 8, 1638499, 0, 8, 1572963, 0, 8, 1507427, 0, 8, 1441891, 0, 8, 1376355, 0, 8, 1310819, 0, 8, 1245283, 0, 8, 1179747, 0, 8, 1114211, 0, 8, 1048675, 0, 8, 983139, 0, 8, 917603, 0, 8, 3539042, 0, 8, 3473506, 0, 8, 3407970, 0, 8, 3342434, 0, 8, 3276898, 0, 8, 3211362, 0, 8, 3145826, 0, 8, 3080290, 0, 8, 3014754, 0, 8, 2949218, 0, 8, 2883682, 0, 8, 2818146, 0, 8, 2752610, 0, 8, 2687074, 0, 8, 2621538, 0, 8, 2556002, 0, 8, 2490466, 0, 8, 2424930, 0, 8, 2359394, 0, 8, 2293858, 0, 8, 2228322, 0, 8, 2162786, 0, 8, 2097250, 0, 8, 2031714, 0, 8, 1966178, 0, 8, 1900642, 0, 8, 1835106, 0, 8, 1769570, 0, 8, 1704034, 0, 8, 1638498, 0, 8, 1572962, 0, 8, 1507426, 0, 8, 3539041, 0, 8, 3473505, 0, 8, 3407969, 0, 8, 3342433, 0, 8, 3276897, 0, 8, 3211361, 0, 8, 3145825, 0, 8, 3080289, 0, 8, 3014753, 0, 8, 2949217, 0, 8, 2883681, 0, 8, 2818145, 0, 8, 2752609, 0, 8, 2687073, 0, 8, 2621537, 0, 8, 2556001, 0, 8, 2490465, 0, 8, 2424929, 0, 8, 2359393, 0, 8, 2293857, 0, 8, 2228321, 0, 8, 2162785, 0, 8, 2097249, 0, 8, 2031713, 0, 8, 1966177, 0, 8, 1900641, 0, 8, 1835105, 0, 8, 1769569, 0, 8, 1704033, 0, 8, 1638497, 0, 8, 1572961, 0, 8, 1507425, 0, 8, 3539040, 0, 8, 3473504, 0, 8, 3407968, 0, 8, 3342432, 0, 8, 3276896, 0, 8, 3211360, 0, 8, 3145824, 0, 8, 3080288, 0, 8, 3014752, 0, 8, 2949216, 0, 8, 2883680, 0, 8, 2818144, 0, 8, 2752608, 0, 8, 2687072, 0, 8, 2621536, 0, 8, 2556000, 0, 8, 2490464, 0, 8, 2424928, 0, 8, 2359392, 0, 8, 2293856, 0, 8, 2228320, 0, 8, 2162784, 0, 8, 2097248, 0, 8, 2031712, 0, 8, 1966176, 0, 8, 1900640, 0, 8, 1835104, 0, 8, 1769568, 0, 8, 1704032, 0, 8, 1638496, 0, 8, 1572960, 0, 8, 1507424, 0, 8, 3539039, 0, 8, 3473503, 0, 8, 3407967, 0, 8, 3342431, 0, 8, 3276895, 0, 8, 3211359, 0, 8, 3145823, 0, 8, 3080287, 0, 8, 3014751, 0, 8, 2949215, 0, 8, 2883679, 0, 8, 2818143, 0, 8, 2752607, 0, 8, 2687071, 0, 8, 2621535, 0, 8, 2555999, 0, 8, 2490463, 0, 8, 2424927, 0, 8, 2359391, 0, 8, 2293855, 0, 8, 2228319, 0, 8, 2162783, 0, 8, 2097247, 0, 8, 2031711, 0, 8, 1966175, 0, 8, 1900639, 0, 8, 1835103, 0, 8, 1769567, 0, 8, 1704031, 0, 8, 1638495, 0, 8, 1572959, 0, 8, 1507423, 0, 8, 3539038, 0, 8, 3473502, 0, 8, 3407966, 0, 8, 3342430, 0, 8, 3276894, 0, 8, 3211358, 0, 8, 3145822, 0, 8, 3080286, 0, 8, 3014750, 0, 8, 2949214, 0, 8, 2883678, 0, 8, 2818142, 0, 8, 2752606, 0, 8, 2687070, 0, 8, 2621534, 0, 8, 2555998, 0, 8, 2490462, 0, 8, 2424926, 0, 8, 2359390, 0, 8, 2293854, 0, 8, 2228318, 0, 8, 2162782, 0, 8, 2097246, 0, 8, 2031710, 0, 8, 1966174, 0, 8, 1900638, 0, 8, 1835102, 0, 8, 1769566, 0, 8, 1704030, 0, 8, 1638494, 0, 8, 1572958, 0, 8, 1507422, 0, 8, 3539037, 0, 8, 3473501, 0, 8, 3407965, 0, 8, 3342429, 0, 8, 3276893, 0, 8, 3211357, 0, 8, 3145821, 0, 8, 3080285, 0, 8, 3014749, 0, 8, 2949213, 0, 8, 2883677, 0, 8, 2818141, 0, 8, 2752605, 0, 8, 2687069, 0, 8, 2621533, 0, 8, 2555997, 0, 8, 2490461, 0, 8, 2424925, 0, 8, 2359389, 0, 8, 2293853, 0, 8, 2228317, 0, 8, 2162781, 0, 8, 2097245, 0, 8, 2031709, 0, 8, 1966173, 0, 8, 1900637, 0, 8, 1835101, 0, 8, 1769565, 0, 8, 1704029, 0, 8, 1638493, 0, 8, 1572957, 0, 8, 1507421, 0, 8, 3539036, 0, 8, 3473500, 0, 8, 3407964, 0, 8, 3342428, 0, 8, 3276892, 0, 8, 3211356, 0, 8, 3145820, 0, 8, 3080284, 0, 8, 3014748, 0, 8, 2949212, 0, 8, 2883676, 0, 8, 2818140, 0, 8, 2752604, 0, 8, 2687068, 0, 8, 2621532, 0, 8, 2555996, 0, 8, 2490460, 0, 8, 2424924, 0, 8, 2359388, 0, 8, 2293852, 0, 8, 2228316, 0, 8, 2162780, 0, 8, 2097244, 0, 8, 2031708, 0, 8, 1966172, 0, 8, 1900636, 0, 8, 1835100, 0, 8, 1769564, 0, 8, 1704028, 0, 8, 1638492, 0, 8, 1572956, 0, 8, 1507420, 0, 8, 3539035, 0, 8, 3473499, 0, 8, 3407963, 0, 8, 3342427, 0, 8, 3276891, 0, 8, 3211355, 0, 8, 3145819, 0, 8, 3080283, 0, 8, 3014747, 0, 8, 2949211, 0, 8, 2883675, 0, 8, 2818139, 0, 8, 2752603, 0, 8, 2687067, 0, 8, 2621531, 0, 8, 2555995, 0, 8, 2490459, 0, 8, 2424923, 0, 8, 2359387, 0, 8, 2293851, 0, 8, 2228315, 0, 8, 2162779, 0, 8, 2097243, 0, 8, 2031707, 0, 8, 1966171, 0, 8, 1900635, 0, 8, 1835099, 0, 8, 1769563, 0, 8, 1704027, 0, 8, 1638491, 0, 8, 1572955, 0, 8, 1507419, 0, 8, 3539034, 0, 8, 3473498, 0, 8, 3407962, 0, 8, 3342426, 0, 8, 3276890, 0, 8, 3211354, 0, 8, 3145818, 0, 8, 3080282, 0, 8, 3014746, 0, 8, 2949210, 0, 8, 2883674, 0, 8, 2818138, 0, 8, 2752602, 0, 8, 2687066, 0, 8, 2621530, 0, 8, 2555994, 0, 8, 2490458, 0, 8, 2424922, 0, 8, 2359386, 0, 8, 2293850, 0, 8, 2228314, 0, 8, 2162778, 0, 8, 2097242, 0, 8, 2031706, 0, 8, 1966170, 0, 8, 1900634, 0, 8, 1835098, 0, 8, 1769562, 0, 8, 1704026, 0, 8, 1638490, 0, 8, 1572954, 0, 8, 1507418, 0, 8, 2621529, 0, 8, 2555993, 0, 8, 2490457, 0, 8, 2424921, 0, 8, 2359385, 0, 8, 2293849, 0, 8, 2228313, 0, 8, 2162777, 0, 8, 2097241, 0, 8, 2031705, 0, 8, 1966169, 0, 8, 1900633, 0, 8, 1835097, 0, 8, 1769561, 0, 8, 1704025, 0, 8, 1638489, 0, 8, 1572953, 0, 8, 1507417, 0, 8, 2621528, 0, 8, 2555992, 0, 8, 2490456, 0, 8, 2424920, 0, 8, 2359384, 0, 8, 2293848, 0, 8, 2228312, 0, 8, 2162776, 0, 8, 2097240, 0, 8, 2031704, 0, 8, 1966168, 0, 8, 1900632, 0, 8, 1835096, 0, 8, 1769560, 0, 8, 1704024, 0, 8, 1638488, 0, 8, 1572952, 0, 8, 1507416, 0, 8, 2621527, 0, 8, 2555991, 0, 8, 2490455, 0, 8, 2424919, 0, 8, 2359383, 0, 8, 2293847, 0, 8, 2228311, 0, 8, 2162775, 0, 8, 2097239, 0, 8, 2031703, 0, 8, 1966167, 0, 8, 1900631, 0, 8, 1835095, 0, 8, 1769559, 0, 8, 1704023, 0, 8, 1638487, 0, 8, 1572951, 0, 8, 1507415, 0, 8, 2621526, 0, 8, 2555990, 0, 8, 2490454, 0, 8, 2424918, 0, 8, 2359382, 0, 8, 2293846, 0, 8, 2228310, 0, 8, 2162774, 0, 8, 2097238, 0, 8, 2031702, 0, 8, 1966166, 0, 8, 1900630, 0, 8, 1835094, 0, 8, 1769558, 0, 8, 1704022, 0, 8, 1638486, 0, 8, 1572950, 0, 8, 1507414, 0, 8, 1507413, 196608, 3, 1572949, 196608, 3, 1638485, 196608, 3, 1704021, 196608, 3, 1769557, 196608, 3, 1835093, 196608, 3, 1900629, 196608, 3, 1966165, 196608, 3, 2031701, 196608, 3, 2097237, 196608, 3, 2162773, 196608, 3, 2228309, 196608, 3, 2293845, 196608, 3, 2359381, 196608, 3, 2424917, 196608, 3, 2490453, 196608, 3, 2555989, 196608, 3, 2621525, 196608, 3, 3604570, 0, 8, 3604571, 0, 8, 3604572, 0, 8, 3604573, 0, 8, 3604574, 0, 8, 3604575, 0, 8, 3604576, 0, 8, 3604577, 0, 8, 3604578, 0, 8, 852067, 131072, 7, 3604579, 0, 8, 852068, 131072, 7, 3604580, 0, 8, 852069, 131072, 7, 3604581, 0, 8, 852070, 131072, 7, 3604582, 0, 8, 852071, 131072, 7, 3604583, 0, 8, 852072, 131072, 7, 3604584, 0, 8, 852073, 131072, 7, 3604585, 0, 8, 852074, 131072, 7, 3604586, 0, 8, 852075, 131072, 7, 3604587, 0, 8, 852076, 131072, 7, 3604588, 0, 8, 852077, 131072, 7, 3604589, 0, 8, 852078, 131072, 7, 3604590, 0, 8, 852079, 131072, 7, 3604591, 0, 8, 852080, 131072, 7, 3604592, 0, 8, 852081, 131072, 7, 3604593, 0, 8, 852082, 131072, 7, 3604594, 0, 8, 852083, 131072, 7, 3604595, 0, 8, 852084, 131072, 7, 3604596, 0, 8, 852085, 131072, 7, 3604597, 0, 8, 852086, 131072, 7, 3604598, 0, 8, 852087, 131072, 7, 3604599, 0, 8, 852088, 131072, 7, 3604600, 0, 8, 852089, 131072, 7, 3604601, 65536, 2, 852090, 131072, 7, 3604602, 131072, 2, 852091, 131072, 7, 3604603, 131072, 2, 852092, 131072, 7, 3604604, 131072, 2, 852093, 131072, 7, 3604605, 131072, 2, 983166, 65536, 3, 852094, 65536, 4, 1048702, 65536, 3, 917630, 65536, 3, 1114238, 65536, 3, 1179774, 65536, 3, 1245310, 65536, 3, 1310846, 65536, 3, 1376382, 65536, 3, 1441918, 65536, 3, 1507454, 65536, 3, 1572990, 65536, 3, 1638526, 65536, 3, 1704062, 65536, 3, 1769598, 65536, 3, 1835134, 65536, 3, 1900670, 65536, 3, 1966206, 65536, 3, 2031742, 65536, 3, 2097278, 65536, 3, 2162814, 65536, 3, 2228350, 65536, 3, 2293886, 65536, 3, 2359422, 65536, 3, 2424958, 65536, 3, 2490494, 65536, 3, 2556030, 65536, 3, 2621566, 65536, 3, 2687102, 65536, 3, 2752638, 65536, 3, 2818174, 65536, 3, 2883710, 65536, 3, 2949246, 65536, 3, 3014782, 65536, 3, 3080318, 65536, 3, 3145854, 65536, 3, 3211390, 65536, 3, 3276926, 65536, 3, 3342462, 65536, 3, 3407998, 65536, 3, 3473534, 65536, 3, 3539070, 65536, 3, 3604606, 851968, 2, 5701752, 0, 8, 5636216, 0, 8, 5570680, 0, 8, 5505144, 0, 8, 5439608, 0, 8, 5374072, 0, 8, 5308536, 0, 8, 5243000, 0, 8, 5177464, 0, 8, 5111928, 0, 8, 5046392, 0, 8, 4980856, 0, 8, 4915320, 0, 8, 4849784, 0, 8, 4784248, 0, 8, 4718712, 0, 8, 4653176, 0, 8, 4587640, 0, 8, 4522104, 0, 8, 4456568, 0, 8, 4391032, 0, 8, 4325496, 0, 8, 4259960, 0, 8, 4194424, 0, 8, 4128888, 0, 8, 4063352, 0, 8, 3997816, 0, 8, 3932280, 0, 8, 3866744, 0, 8, 3801208, 0, 8, 3735672, 0, 8, 3670136, 0, 8, 5701751, 0, 8, 5636215, 0, 8, 5570679, 0, 8, 5505143, 0, 8, 5439607, 0, 8, 5374071, 0, 8, 5308535, 0, 8, 5242999, 0, 8, 5177463, 0, 8, 5111927, 0, 8, 5046391, 0, 8, 4980855, 0, 8, 4915319, 0, 8, 4849783, 0, 8, 4784247, 0, 8, 4718711, 0, 8, 4653175, 0, 8, 4587639, 0, 8, 4522103, 0, 8, 4456567, 0, 8, 4391031, 0, 8, 4325495, 0, 8, 4259959, 0, 8, 4194423, 0, 8, 4128887, 0, 8, 4063351, 0, 8, 3997815, 0, 8, 3932279, 0, 8, 3866743, 0, 8, 3801207, 0, 8, 3735671, 0, 8, 3670135, 0, 8, 5701750, 0, 8, 5636214, 0, 8, 5570678, 0, 8, 5505142, 0, 8, 5439606, 0, 8, 5374070, 0, 8, 5308534, 0, 8, 5242998, 0, 8, 5177462, 0, 8, 5111926, 0, 8, 5046390, 0, 8, 4980854, 0, 8, 4915318, 0, 8, 4849782, 0, 8, 4784246, 0, 8, 4718710, 0, 8, 4653174, 0, 8, 4587638, 0, 8, 4522102, 0, 8, 4456566, 0, 8, 4391030, 0, 8, 4325494, 0, 8, 4259958, 0, 8, 4194422, 0, 8, 4128886, 0, 8, 4063350, 0, 8, 3997814, 0, 8, 3932278, 0, 8, 3866742, 0, 8, 3801206, 0, 8, 3735670, 0, 8, 3670134, 0, 8, 5701749, 0, 8, 5636213, 0, 8, 5570677, 0, 8, 5505141, 0, 8, 5439605, 0, 8, 5374069, 0, 8, 5308533, 0, 8, 5242997, 0, 8, 5177461, 0, 8, 5111925, 0, 8, 5046389, 0, 8, 4980853, 0, 8, 4915317, 0, 8, 4849781, 0, 8, 4784245, 0, 8, 4718709, 0, 8, 4653173, 0, 8, 4587637, 0, 8, 4522101, 0, 8, 4456565, 0, 8, 4391029, 0, 8, 4325493, 0, 8, 4259957, 0, 8, 4194421, 0, 8, 4128885, 0, 8, 4063349, 0, 8, 3997813, 0, 8, 3932277, 0, 8, 3866741, 0, 8, 3801205, 0, 8, 3735669, 0, 8, 3670133, 0, 8, 5701748, 0, 8, 5636212, 0, 8, 5570676, 0, 8, 5505140, 0, 8, 5439604, 0, 8, 5374068, 0, 8, 5308532, 0, 8, 5242996, 0, 8, 5177460, 0, 8, 5111924, 0, 8, 5046388, 0, 8, 4980852, 0, 8, 4915316, 0, 8, 4849780, 0, 8, 4784244, 0, 8, 4718708, 0, 8, 4653172, 0, 8, 4587636, 0, 8, 4522100, 0, 8, 4456564, 0, 8, 4391028, 0, 8, 4325492, 0, 8, 4259956, 0, 8, 4194420, 0, 8, 4128884, 0, 8, 4063348, 0, 8, 3997812, 0, 8, 3932276, 0, 8, 3866740, 0, 8, 3801204, 0, 8, 3735668, 0, 8, 3670132, 0, 8, 5701747, 0, 8, 5636211, 0, 8, 5570675, 0, 8, 5505139, 0, 8, 5439603, 0, 8, 5374067, 0, 8, 5308531, 0, 8, 5242995, 0, 8, 5177459, 0, 8, 5111923, 0, 8, 5046387, 0, 8, 4980851, 0, 8, 4915315, 0, 8, 4849779, 0, 8, 4784243, 0, 8, 4718707, 0, 8, 4653171, 0, 8, 4587635, 0, 8, 4522099, 0, 8, 4456563, 0, 8, 4391027, 0, 8, 4325491, 0, 8, 4259955, 0, 8, 4194419, 0, 8, 4128883, 0, 8, 4063347, 0, 8, 3997811, 0, 8, 3932275, 0, 8, 3866739, 0, 8, 3801203, 0, 8, 3735667, 0, 8, 3670131, 0, 8, 5701746, 0, 8, 5636210, 0, 8, 5570674, 0, 8, 5505138, 0, 8, 5439602, 0, 8, 5374066, 0, 8, 5308530, 0, 8, 5242994, 0, 8, 5177458, 0, 8, 5111922, 0, 8, 5046386, 0, 8, 4980850, 0, 8, 4915314, 0, 8, 4849778, 0, 8, 4784242, 0, 8, 4718706, 0, 8, 4653170, 0, 8, 4587634, 0, 8, 4522098, 0, 8, 4456562, 0, 8, 4391026, 0, 8, 4325490, 0, 8, 4259954, 0, 8, 4194418, 0, 8, 4128882, 0, 8, 4063346, 0, 8, 3997810, 0, 8, 3932274, 0, 8, 3866738, 0, 8, 3801202, 0, 8, 3735666, 0, 8, 3670130, 0, 8, 5701745, 0, 8, 5636209, 0, 8, 5570673, 0, 8, 5505137, 0, 8, 5439601, 0, 8, 5374065, 0, 8, 5308529, 0, 8, 5242993, 0, 8, 5177457, 0, 8, 5111921, 0, 8, 5046385, 0, 8, 4980849, 0, 8, 4915313, 0, 8, 4849777, 0, 8, 4784241, 0, 8, 4718705, 0, 8, 4653169, 0, 8, 4587633, 0, 8, 4522097, 0, 8, 4456561, 0, 8, 4391025, 0, 8, 4325489, 0, 8, 4259953, 0, 8, 4194417, 0, 8, 4128881, 0, 8, 4063345, 0, 8, 3997809, 0, 8, 3932273, 0, 8, 3866737, 0, 8, 3801201, 0, 8, 3735665, 0, 8, 3670129, 0, 8, 5701744, 0, 8, 5636208, 0, 8, 5570672, 0, 8, 5505136, 0, 8, 5439600, 0, 8, 5374064, 0, 8, 5308528, 0, 8, 5242992, 0, 8, 5177456, 0, 8, 5111920, 0, 8, 5046384, 0, 8, 4980848, 0, 8, 4915312, 0, 8, 4849776, 0, 8, 4784240, 0, 8, 4718704, 0, 8, 4653168, 0, 8, 4587632, 0, 8, 4522096, 0, 8, 4456560, 0, 8, 4391024, 0, 8, 4325488, 0, 8, 4259952, 0, 8, 4194416, 0, 8, 4128880, 0, 8, 4063344, 0, 8, 3997808, 0, 8, 3932272, 0, 8, 3866736, 0, 8, 3801200, 0, 8, 3735664, 0, 8, 3670128, 0, 8, 5701743, 0, 8, 5636207, 0, 8, 5570671, 0, 8, 5505135, 0, 8, 5439599, 0, 8, 5374063, 0, 8, 5308527, 0, 8, 5242991, 0, 8, 5177455, 0, 8, 5111919, 0, 8, 5046383, 0, 8, 4980847, 0, 8, 4915311, 0, 8, 4849775, 0, 8, 4784239, 0, 8, 4718703, 0, 8, 4653167, 0, 8, 4587631, 0, 8, 4522095, 0, 8, 4456559, 0, 8, 4391023, 0, 8, 4325487, 0, 8, 4259951, 0, 8, 4194415, 0, 8, 4128879, 0, 8, 4063343, 0, 8, 3997807, 0, 8, 3932271, 0, 8, 3866735, 0, 8, 3801199, 0, 8, 3735663, 0, 8, 3670127, 0, 8, 5701742, 0, 8, 5636206, 0, 8, 5570670, 0, 8, 5505134, 0, 8, 5439598, 0, 8, 5374062, 0, 8, 5308526, 0, 8, 5242990, 0, 8, 5177454, 0, 8, 5111918, 0, 8, 5046382, 0, 8, 4980846, 0, 8, 4915310, 0, 8, 4849774, 0, 8, 4784238, 0, 8, 4718702, 0, 8, 4653166, 0, 8, 4587630, 0, 8, 4522094, 0, 8, 4456558, 0, 8, 4391022, 0, 8, 4325486, 0, 8, 4259950, 0, 8, 4194414, 0, 8, 4128878, 0, 8, 4063342, 0, 8, 3997806, 0, 8, 3932270, 0, 8, 3866734, 0, 8, 3801198, 0, 8, 3735662, 0, 8, 3670126, 0, 8, 5701741, 0, 8, 5636205, 0, 8, 5570669, 0, 8, 5505133, 0, 8, 5439597, 0, 8, 5374061, 0, 8, 5308525, 0, 8, 5242989, 0, 8, 5177453, 0, 8, 5111917, 0, 8, 5046381, 0, 8, 4980845, 0, 8, 4915309, 0, 8, 4849773, 0, 8, 4784237, 0, 8, 4718701, 0, 8, 4653165, 0, 8, 4587629, 0, 8, 4522093, 0, 8, 4456557, 0, 8, 4391021, 0, 8, 4325485, 0, 8, 4259949, 0, 8, 4194413, 0, 8, 4128877, 0, 8, 4063341, 0, 8, 3997805, 0, 8, 3932269, 0, 8, 3866733, 0, 8, 3801197, 0, 8, 3735661, 0, 8, 3670125, 0, 8, 5701740, 0, 8, 5636204, 0, 8, 5570668, 0, 8, 5505132, 0, 8, 5439596, 0, 8, 5374060, 0, 8, 5308524, 0, 8, 5242988, 0, 8, 5177452, 0, 8, 5111916, 0, 8, 5046380, 0, 8, 4980844, 0, 8, 4915308, 0, 8, 4849772, 0, 8, 4784236, 0, 8, 4718700, 0, 8, 4653164, 0, 8, 4587628, 0, 8, 4522092, 0, 8, 4456556, 0, 8, 4391020, 0, 8, 4325484, 0, 8, 4259948, 0, 8, 4194412, 0, 8, 4128876, 0, 8, 4063340, 0, 8, 3997804, 0, 8, 3932268, 0, 8, 3866732, 0, 8, 3801196, 0, 8, 3735660, 0, 8, 3670124, 0, 8, 5701739, 0, 8, 5636203, 0, 8, 5570667, 0, 8, 5505131, 0, 8, 5439595, 0, 8, 5374059, 0, 8, 5308523, 0, 8, 5242987, 0, 8, 5177451, 0, 8, 5111915, 0, 8, 5046379, 0, 8, 4980843, 0, 8, 4915307, 0, 8, 4849771, 0, 8, 4784235, 0, 8, 4718699, 0, 8, 4653163, 0, 8, 4587627, 0, 8, 4522091, 0, 8, 4456555, 0, 8, 4391019, 0, 8, 4325483, 0, 8, 4259947, 0, 8, 4194411, 0, 8, 4128875, 0, 8, 4063339, 0, 8, 3997803, 0, 8, 3932267, 0, 8, 3866731, 0, 8, 3801195, 0, 8, 3735659, 0, 8, 3670123, 0, 8, 5701738, 0, 8, 5636202, 0, 8, 5570666, 0, 8, 5505130, 0, 8, 5439594, 0, 8, 5374058, 0, 8, 5308522, 0, 8, 5242986, 0, 8, 5177450, 0, 8, 5111914, 0, 8, 5046378, 0, 8, 4980842, 0, 8, 4915306, 0, 8, 4849770, 0, 8, 4784234, 0, 8, 4718698, 0, 8, 4653162, 0, 8, 4587626, 0, 8, 4522090, 0, 8, 4456554, 0, 8, 4391018, 0, 8, 4325482, 0, 8, 4259946, 0, 8, 4194410, 0, 8, 4128874, 0, 8, 4063338, 0, 8, 3997802, 0, 8, 3932266, 0, 8, 3866730, 0, 8, 3801194, 0, 8, 3735658, 0, 8, 3670122, 0, 8, 5701737, 0, 8, 5636201, 0, 8, 5570665, 0, 8, 5505129, 0, 8, 5439593, 0, 8, 5374057, 0, 8, 5308521, 0, 8, 5242985, 0, 8, 5177449, 0, 8, 5111913, 0, 8, 5046377, 0, 8, 4980841, 0, 8, 4915305, 0, 8, 4849769, 0, 8, 4784233, 0, 8, 4718697, 0, 8, 4653161, 0, 8, 4587625, 0, 8, 4522089, 0, 8, 4456553, 0, 8, 4391017, 0, 8, 4325481, 0, 8, 4259945, 0, 8, 4194409, 0, 8, 4128873, 0, 8, 4063337, 0, 8, 3997801, 0, 8, 3932265, 0, 8, 3866729, 0, 8, 3801193, 0, 8, 3735657, 0, 8, 3670121, 0, 8, 5701736, 0, 8, 5636200, 0, 8, 5570664, 0, 8, 5505128, 0, 8, 5439592, 0, 8, 5374056, 0, 8, 5308520, 0, 8, 5242984, 0, 8, 5177448, 0, 8, 5111912, 0, 8, 5046376, 0, 8, 4980840, 0, 8, 4915304, 0, 8, 4849768, 0, 8, 4784232, 0, 8, 4718696, 0, 8, 4653160, 0, 8, 4587624, 0, 8, 4522088, 0, 8, 4456552, 0, 8, 4391016, 0, 8, 4325480, 0, 8, 4259944, 0, 8, 4194408, 0, 8, 4128872, 0, 8, 4063336, 0, 8, 3997800, 0, 8, 3932264, 0, 8, 3866728, 0, 8, 3801192, 0, 8, 3735656, 0, 8, 3670120, 0, 8, 5701735, 0, 8, 5636199, 0, 8, 5570663, 0, 8, 5505127, 0, 8, 5439591, 0, 8, 5374055, 0, 8, 5308519, 0, 8, 5242983, 0, 8, 5177447, 0, 8, 5111911, 0, 8, 5046375, 0, 8, 4980839, 0, 8, 4915303, 0, 8, 4849767, 0, 8, 4784231, 0, 8, 4718695, 0, 8, 4653159, 0, 8, 4587623, 0, 8, 4522087, 0, 8, 4456551, 0, 8, 4391015, 0, 8, 4325479, 0, 8, 4259943, 0, 8, 4194407, 0, 8, 4128871, 0, 8, 4063335, 0, 8, 3997799, 0, 8, 3932263, 0, 8, 3866727, 0, 8, 3801191, 0, 8, 3735655, 0, 8, 3670119, 0, 8, 5701734, 0, 8, 5636198, 0, 8, 5570662, 0, 8, 5505126, 0, 8, 5439590, 0, 8, 5374054, 0, 8, 5308518, 0, 8, 5242982, 0, 8, 5177446, 0, 8, 5111910, 0, 8, 5046374, 0, 8, 4980838, 0, 8, 4915302, 0, 8, 4849766, 0, 8, 4784230, 0, 8, 4718694, 0, 8, 4653158, 0, 8, 4587622, 0, 8, 4522086, 0, 8, 5701733, 0, 8, 5636197, 0, 8, 5570661, 0, 8, 5505125, 0, 8, 5439589, 0, 8, 5374053, 0, 8, 5308517, 0, 8, 5242981, 0, 8, 5177445, 0, 8, 5111909, 0, 8, 5046373, 0, 8, 4980837, 0, 8, 4915301, 0, 8, 4849765, 0, 8, 4784229, 0, 8, 4718693, 0, 8, 4653157, 0, 8, 4587621, 0, 8, 4522085, 0, 8, 5701732, 0, 8, 5636196, 0, 8, 5570660, 0, 8, 5505124, 0, 8, 5439588, 0, 8, 5374052, 0, 8, 5308516, 0, 8, 5242980, 0, 8, 5177444, 0, 8, 5111908, 0, 8, 5046372, 0, 8, 4980836, 0, 8, 4915300, 0, 8, 4849764, 0, 8, 4784228, 0, 8, 4718692, 0, 8, 4653156, 0, 8, 4587620, 0, 8, 4522084, 0, 8, 5701731, 0, 8, 5636195, 0, 8, 5570659, 0, 8, 5505123, 0, 8, 5439587, 0, 8, 5374051, 0, 8, 5308515, 0, 8, 5242979, 0, 8, 5177443, 0, 8, 5111907, 0, 8, 5046371, 0, 8, 4980835, 0, 8, 4915299, 0, 8, 4849763, 0, 8, 4784227, 0, 8, 4718691, 0, 8, 4653155, 0, 8, 4587619, 0, 8, 4522083, 0, 8, 5701730, 0, 8, 5636194, 0, 8, 5570658, 0, 8, 5505122, 0, 8, 5439586, 0, 8, 5374050, 0, 8, 5308514, 0, 8, 5242978, 0, 8, 5177442, 0, 8, 5111906, 0, 8, 5046370, 0, 8, 4980834, 0, 8, 4915298, 0, 8, 4849762, 0, 8, 4784226, 0, 8, 4718690, 0, 8, 4653154, 0, 8, 4587618, 0, 8, 4522082, 0, 8, 5701729, 0, 8, 5636193, 0, 8, 5570657, 0, 8, 5505121, 0, 8, 5439585, 0, 8, 5374049, 0, 8, 5308513, 0, 8, 5242977, 0, 8, 5177441, 0, 8, 5111905, 0, 8, 5046369, 0, 8, 4980833, 0, 8, 4915297, 0, 8, 4849761, 0, 8, 4784225, 0, 8, 4718689, 0, 8, 4653153, 0, 8, 4587617, 0, 8, 4522081, 0, 8, 5701728, 0, 8, 5636192, 0, 8, 5570656, 0, 8, 5505120, 0, 8, 5439584, 0, 8, 5374048, 0, 8, 5308512, 0, 8, 5242976, 0, 8, 5177440, 0, 8, 5111904, 0, 8, 5046368, 0, 8, 4980832, 0, 8, 4915296, 0, 8, 4849760, 0, 8, 4784224, 0, 8, 4718688, 0, 8, 4653152, 0, 8, 4587616, 0, 8, 4522080, 0, 8, 5701727, 0, 8, 5636191, 0, 8, 5570655, 0, 8, 5505119, 0, 8, 5439583, 0, 8, 5374047, 0, 8, 5308511, 0, 8, 5242975, 0, 8, 5177439, 0, 8, 5111903, 0, 8, 5046367, 0, 8, 4980831, 0, 8, 4915295, 0, 8, 4849759, 0, 8, 4784223, 0, 8, 4718687, 0, 8, 4653151, 0, 8, 4587615, 0, 8, 4522079, 0, 8, 5701726, 0, 8, 5636190, 0, 8, 5570654, 0, 8, 5505118, 0, 8, 5439582, 0, 8, 5374046, 0, 8, 5308510, 0, 8, 5242974, 0, 8, 5177438, 0, 8, 5111902, 0, 8, 5046366, 0, 8, 4980830, 0, 8, 4915294, 0, 8, 4849758, 0, 8, 4784222, 0, 8, 4718686, 0, 8, 4653150, 0, 8, 4587614, 0, 8, 4522078, 0, 8, 5701725, 0, 8, 5636189, 0, 8, 5570653, 0, 8, 5505117, 0, 8, 5439581, 0, 8, 5374045, 0, 8, 5308509, 0, 8, 5242973, 0, 8, 5177437, 0, 8, 5111901, 0, 8, 5046365, 0, 8, 4980829, 0, 8, 4915293, 0, 8, 4849757, 0, 8, 4784221, 0, 8, 4718685, 0, 8, 4653149, 0, 8, 4587613, 0, 8, 4522077, 0, 8, 5701724, 0, 8, 5636188, 0, 8, 5570652, 0, 8, 5505116, 0, 8, 5439580, 0, 8, 5374044, 0, 8, 5308508, 0, 8, 5242972, 0, 8, 5177436, 0, 8, 5111900, 0, 8, 5046364, 0, 8, 4980828, 0, 8, 4915292, 0, 8, 4849756, 0, 8, 4784220, 0, 8, 4718684, 0, 8, 4653148, 0, 8, 4587612, 0, 8, 4522076, 0, 8, 5701723, 0, 8, 5636187, 0, 8, 5570651, 0, 8, 5505115, 0, 8, 5439579, 0, 8, 5374043, 0, 8, 5308507, 0, 8, 5242971, 0, 8, 5177435, 0, 8, 5111899, 0, 8, 5046363, 0, 8, 4980827, 0, 8, 4915291, 0, 8, 4849755, 0, 8, 4784219, 0, 8, 4718683, 0, 8, 4653147, 0, 8, 4587611, 0, 8, 4522075, 0, 8, 5701722, 0, 8, 5636186, 0, 8, 5570650, 0, 8, 5505114, 0, 8, 5439578, 0, 8, 5374042, 0, 8, 5308506, 0, 8, 5242970, 0, 8, 5177434, 0, 8, 5111898, 0, 8, 5046362, 0, 8, 4980826, 0, 8, 4915290, 0, 8, 4849754, 0, 8, 4784218, 0, 8, 4718682, 0, 8, 4653146, 0, 8, 4587610, 0, 8, 4522074, 0, 8, 5701721, 0, 8, 5636185, 0, 8, 5570649, 0, 8, 5505113, 0, 8, 5439577, 0, 8, 5374041, 0, 8, 5308505, 0, 8, 5242969, 0, 8, 5177433, 0, 8, 5111897, 0, 8, 5046361, 0, 8, 5701720, 0, 8, 5636184, 0, 8, 5570648, 0, 8, 5505112, 0, 8, 5439576, 0, 8, 5374040, 0, 8, 5308504, 0, 8, 5242968, 0, 8, 5177432, 0, 8, 5111896, 0, 8, 5046360, 0, 8, 5701719, 0, 8, 5636183, 0, 8, 5570647, 0, 8, 5505111, 0, 8, 5439575, 0, 8, 5374039, 0, 8, 5308503, 0, 8, 5242967, 0, 8, 5177431, 0, 8, 5111895, 0, 8, 5046359, 0, 8, 5701718, 0, 8, 5636182, 0, 8, 5570646, 0, 8, 5505110, 0, 8, 5439574, 0, 8, 5374038, 0, 8, 5308502, 0, 8, 5242966, 0, 8, 5177430, 0, 8, 5111894, 0, 8, 5046358, 0, 8, 5701717, 0, 8, 5636181, 0, 8, 5570645, 0, 8, 5505109, 0, 8, 5439573, 0, 8, 5374037, 0, 8, 5308501, 0, 8, 5242965, 0, 8, 5177429, 0, 8, 5111893, 0, 8, 5046357, 0, 8, 5701716, 0, 8, 5636180, 0, 8, 5570644, 0, 8, 5505108, 0, 8, 5439572, 0, 8, 5374036, 0, 8, 5308500, 0, 8, 5242964, 0, 8, 5177428, 0, 8, 5111892, 0, 8, 5046356, 0, 8, 5701715, 0, 8, 5636179, 0, 8, 5570643, 0, 8, 5505107, 0, 8, 5439571, 0, 8, 5374035, 0, 8, 5308499, 0, 8, 5242963, 0, 8, 5177427, 0, 8, 5111891, 0, 8, 5046355, 0, 8, 5701714, 0, 8, 5636178, 0, 8, 5570642, 0, 8, 5505106, 0, 8, 5439570, 0, 8, 5374034, 0, 8, 5308498, 0, 8, 5242962, 0, 8, 5177426, 0, 8, 5111890, 0, 8, 5046354, 0, 8, 5701713, 0, 8, 5636177, 0, 8, 5570641, 0, 8, 5505105, 0, 8, 5439569, 0, 8, 5374033, 0, 8, 5308497, 0, 8, 5242961, 0, 8, 5177425, 0, 8, 5111889, 0, 8, 5046353, 0, 8, 5701712, 0, 8, 5636176, 0, 8, 5570640, 0, 8, 5505104, 0, 8, 5439568, 0, 8, 5374032, 0, 8, 5308496, 0, 8, 5242960, 0, 8, 5177424, 0, 8, 5111888, 0, 8, 5046352, 0, 8, 5701711, 0, 8, 5636175, 0, 8, 5570639, 0, 8, 5505103, 0, 8, 5439567, 0, 8, 5374031, 0, 8, 5308495, 0, 8, 5242959, 0, 8, 5177423, 0, 8, 5111887, 0, 8, 5046351, 0, 8, 5046350, 196608, 3, 5111886, 196608, 3, 5177422, 196608, 3, 5242958, 196608, 3, 5308494, 196608, 3, 5374030, 196608, 3, 5439566, 196608, 3, 5505102, 196608, 3, 5570638, 196608, 3, 5636174, 196608, 3, 5701710, 196608, 3, 5767248, 131072, 2, 5767246, 720896, 2, 5767249, 131072, 2, 5767247, 131072, 2, 5767250, 131072, 2, 5767251, 131072, 2, 5767252, 131072, 2, 5767253, 131072, 2, 5767254, 131072, 2, 5767255, 131072, 2, 5767256, 131072, 2, 5767257, 131072, 2, 5767258, 131072, 2, 5767259, 131072, 2, 5767260, 131072, 2, 5767261, 131072, 2, 5767262, 131072, 2, 5767263, 131072, 2, 5767264, 131072, 2, 5767265, 131072, 2, 5767266, 131072, 2, 5767267, 131072, 2, 5767268, 131072, 2, 5767269, 131072, 2, 5767270, 131072, 2, 5767271, 131072, 2, 5767272, 131072, 2, 5767273, 131072, 2, 5767274, 131072, 2, 5767275, 131072, 2, 5767276, 131072, 2, 5767277, 131072, 2, 5767278, 131072, 2, 5767279, 131072, 2, 5767280, 131072, 2, 5767281, 131072, 2, 5767282, 131072, 2, 5767283, 131072, 2, 5767284, 131072, 2, 5767285, 131072, 2, 5767286, 131072, 2, 5767287, 131072, 2, 5767288, 131072, 2, 3670137, 65536, 3, 3735673, 65536, 3, 3801209, 65536, 3, 3866745, 65536, 3, 3932281, 65536, 3, 3997817, 65536, 3, 4063353, 65536, 3, 4128889, 65536, 3, 4194425, 65536, 3, 4259961, 65536, 3, 4325497, 65536, 3, 4391033, 65536, 3, 4456569, 65536, 3, 4522105, 65536, 3, 4587641, 65536, 3, 4653177, 65536, 3, 4718713, 65536, 3, 4784249, 65536, 3, 4849785, 65536, 3, 4915321, 65536, 3, 4980857, 65536, 3, 5046393, 65536, 3, 5111929, 65536, 3, 5177465, 65536, 3, 5243001, 65536, 3, 5308537, 65536, 3, 5374073, 65536, 3, 5439609, 65536, 3, 5505145, 65536, 3, 5570681, 65536, 3, 5636217, 65536, 3, 5701753, 65536, 3, 5767289, 851968, 2, 3670104, 65536, 2, 3670105, 131072, 2, 3670106, 131072, 2, 3670107, 131072, 2, 3670108, 131072, 2, 3670109, 131072, 2, 3670110, 131072, 2, 3670111, 131072, 2, 3670112, 131072, 2, 3670113, 131072, 2, 3670114, 131072, 2, 3670115, 131072, 2, 3670116, 131072, 2, 3670117, 131072, 2, 3670118, 196608, 2, 3735654, 196608, 3, 3801190, 196608, 3, 3866726, 196608, 3, 3932262, 196608, 3, 3997798, 196608, 3, 4063334, 196608, 3, 4128870, 196608, 3, 4194406, 196608, 3, 4259942, 196608, 3, 4325478, 196608, 3, 4391014, 196608, 3, 4456550, 196608, 7, 4456536, 65536, 7, 4456537, 131072, 7, 4456538, 131072, 7, 4456539, 131072, 7, 4456540, 131072, 7, 4456541, 131072, 7, 4456542, 131072, 7, 4456543, 131072, 7, 4456544, 131072, 7, 4456545, 131072, 7, 4456546, 131072, 7, 4456547, 131072, 7, 4456548, 131072, 7, 4456549, 131072, 7, 3735640, 65536, 3, 3801176, 65536, 3, 3866712, 65536, 3, 3932248, 65536, 3, 3997784, 65536, 3, 4063320, 65536, 3, 4128856, 65536, 3, 4194392, 65536, 3, 4259928, 65536, 3, 4325464, 65536, 3, 4391000, 65536, 3, 6094913, 0, 8, 6029377, 0, 8, 5963841, 0, 8, 5898305, 0, 8, 5832769, 0, 8, 5767233, 0, 8, 5701697, 0, 8, 5636161, 0, 8, 5570625, 0, 8, 5505089, 0, 8, 5439553, 0, 8, 5374017, 0, 8, 5308481, 0, 8, 5242945, 0, 8, 5177409, 0, 8, 5111873, 0, 8, 5046337, 0, 8, 6094912, 0, 8, 6029376, 0, 8, 5963840, 0, 8, 5898304, 0, 8, 5832768, 0, 8, 5767232, 0, 8, 5701696, 0, 8, 5636160, 0, 8, 5570624, 0, 8, 5505088, 0, 8, 5439552, 0, 8, 5374016, 0, 8, 5308480, 0, 8, 5242944, 0, 8, 5177408, 0, 8, 5111872, 0, 8, 5046336, 0, 8, 6094911, 0, 8, 6029375, 0, 8, 5963839, 0, 8, 5898303, 0, 8, 5832767, 0, 8, 5767231, 0, 8, 5701695, 0, 8, 5636159, 0, 8, 5570623, 0, 8, 5505087, 0, 8, 5439551, 0, 8, 5374015, 0, 8, 5308479, 0, 8, 5242943, 0, 8, 5177407, 0, 8, 5111871, 0, 8, 5046335, 0, 8, 6094910, 0, 8, 6029374, 0, 8, 5963838, 0, 8, 5898302, 0, 8, 5832766, 0, 8, 5767230, 0, 8, 5701694, 0, 8, 5636158, 0, 8, 5570622, 0, 8, 5505086, 0, 8, 5439550, 0, 8, 5374014, 0, 8, 5308478, 0, 8, 5242942, 0, 8, 5177406, 0, 8, 5111870, 0, 8, 5046334, 0, 8, 6094909, 0, 8, 6029373, 0, 8, 5963837, 0, 8, 5898301, 0, 8, 5832765, 0, 8, 5767229, 0, 8, 5701693, 0, 8, 5636157, 0, 8, 5570621, 0, 8, 5505085, 0, 8, 5439549, 0, 8, 5374013, 0, 8, 5308477, 0, 8, 5242941, 0, 8, 5177405, 0, 8, 5111869, 0, 8, 5046333, 0, 8, 6094908, 0, 8, 6029372, 0, 8, 5963836, 0, 8, 5898300, 0, 8, 5832764, 0, 8, 5767228, 0, 8, 5701692, 0, 8, 5636156, 0, 8, 5570620, 0, 8, 5505084, 0, 8, 5439548, 0, 8, 5374012, 0, 8, 5308476, 0, 8, 5242940, 0, 8, 5177404, 0, 8, 5111868, 0, 8, 5046332, 0, 8, 6094907, 0, 8, 6029371, 0, 8, 5963835, 0, 8, 5898299, 0, 8, 5832763, 0, 8, 5767227, 0, 8, 5701691, 0, 8, 5636155, 0, 8, 5570619, 0, 8, 5505083, 0, 8, 5439547, 0, 8, 5374011, 0, 8, 5308475, 0, 8, 5242939, 0, 8, 5177403, 0, 8, 5111867, 0, 8, 5046331, 0, 8, 6094906, 0, 8, 6029370, 0, 8, 5963834, 0, 8, 5898298, 0, 8, 5832762, 0, 8, 5767226, 0, 8, 5701690, 0, 8, 5636154, 0, 8, 5570618, 0, 8, 5505082, 0, 8, 5439546, 0, 8, 5374010, 0, 8, 5308474, 0, 8, 5242938, 0, 8, 5177402, 0, 8, 5111866, 0, 8, 5046330, 0, 8, 6094905, 0, 8, 6029369, 0, 8, 5963833, 0, 8, 5898297, 0, 8, 5832761, 0, 8, 5767225, 0, 8, 5701689, 0, 8, 5636153, 0, 8, 5570617, 0, 8, 5505081, 0, 8, 5439545, 0, 8, 5374009, 0, 8, 5308473, 0, 8, 5242937, 0, 8, 5177401, 0, 8, 5111865, 0, 8, 5046329, 0, 8, 4980793, 0, 8, 4915257, 0, 8, 4849721, 0, 8, 4784185, 0, 8, 6094904, 0, 8, 6029368, 0, 8, 5963832, 0, 8, 5898296, 0, 8, 5832760, 0, 8, 5767224, 0, 8, 5701688, 0, 8, 5636152, 0, 8, 5570616, 0, 8, 5505080, 0, 8, 5439544, 0, 8, 5374008, 0, 8, 5308472, 0, 8, 5242936, 0, 8, 5177400, 0, 8, 5111864, 0, 8, 5046328, 0, 8, 4980792, 0, 8, 4915256, 0, 8, 4849720, 0, 8, 4784184, 0, 8, 6094903, 0, 8, 6029367, 0, 8, 5963831, 0, 8, 5898295, 0, 8, 5832759, 0, 8, 5767223, 0, 8, 5701687, 0, 8, 5636151, 0, 8, 5570615, 0, 8, 5505079, 0, 8, 5439543, 0, 8, 5374007, 0, 8, 5308471, 0, 8, 5242935, 0, 8, 5177399, 0, 8, 5111863, 0, 8, 5046327, 0, 8, 4980791, 0, 8, 4915255, 0, 8, 4849719, 0, 8, 4784183, 0, 8, 6094902, 0, 8, 6029366, 0, 8, 5963830, 0, 8, 5898294, 0, 8, 5832758, 0, 8, 5767222, 0, 8, 5701686, 0, 8, 5636150, 0, 8, 5570614, 0, 8, 5505078, 0, 8, 5439542, 0, 8, 5374006, 0, 8, 5308470, 0, 8, 5242934, 0, 8, 5177398, 0, 8, 5111862, 0, 8, 5046326, 0, 8, 4980790, 0, 8, 4915254, 0, 8, 4849718, 0, 8, 4784182, 0, 8, 6094901, 0, 8, 6029365, 0, 8, 5963829, 0, 8, 5898293, 0, 8, 5832757, 0, 8, 5767221, 0, 8, 5701685, 0, 8, 5636149, 0, 8, 5570613, 0, 8, 5505077, 0, 8, 5439541, 0, 8, 5374005, 0, 8, 5308469, 0, 8, 5242933, 0, 8, 5177397, 0, 8, 5111861, 0, 8, 5046325, 0, 8, 4980789, 0, 8, 4915253, 0, 8, 4849717, 0, 8, 4784181, 0, 8, 6094900, 0, 8, 6029364, 0, 8, 5963828, 0, 8, 5898292, 0, 8, 5832756, 0, 8, 5767220, 0, 8, 5701684, 0, 8, 5636148, 0, 8, 5570612, 0, 8, 5505076, 0, 8, 5439540, 0, 8, 5374004, 0, 8, 5308468, 0, 8, 5242932, 0, 8, 5177396, 0, 8, 5111860, 0, 8, 5046324, 0, 8, 4980788, 0, 8, 4915252, 0, 8, 4849716, 0, 8, 4784180, 0, 8, 6094899, 0, 8, 6029363, 0, 8, 5963827, 0, 8, 5898291, 0, 8, 5832755, 0, 8, 5767219, 0, 8, 5701683, 0, 8, 5636147, 0, 8, 5570611, 0, 8, 5505075, 0, 8, 5439539, 0, 8, 5374003, 0, 8, 5308467, 0, 8, 5242931, 0, 8, 5177395, 0, 8, 5111859, 0, 8, 5046323, 0, 8, 4980787, 0, 8, 4915251, 0, 8, 4849715, 0, 8, 4784179, 0, 8, 6094898, 0, 8, 6029362, 0, 8, 5963826, 0, 8, 5898290, 0, 8, 5832754, 0, 8, 5767218, 0, 8, 5701682, 0, 8, 5636146, 0, 8, 5570610, 0, 8, 5505074, 0, 8, 5439538, 0, 8, 5374002, 0, 8, 5308466, 0, 8, 5242930, 0, 8, 5177394, 0, 8, 5111858, 0, 8, 5046322, 0, 8, 4980786, 0, 8, 4915250, 0, 8, 4849714, 0, 8, 4784178, 0, 8, 6094897, 0, 8, 6029361, 0, 8, 5963825, 0, 8, 5898289, 0, 8, 5832753, 0, 8, 5767217, 0, 8, 5701681, 0, 8, 5636145, 0, 8, 5570609, 0, 8, 5505073, 0, 8, 5439537, 0, 8, 5374001, 0, 8, 5308465, 0, 8, 5242929, 0, 8, 5177393, 0, 8, 5111857, 0, 8, 5046321, 0, 8, 4980785, 0, 8, 4915249, 0, 8, 4849713, 0, 8, 4784177, 0, 8, 6094896, 0, 8, 6029360, 0, 8, 5963824, 0, 8, 5898288, 0, 8, 5832752, 0, 8, 5767216, 0, 8, 5701680, 0, 8, 5636144, 0, 8, 5570608, 0, 8, 5505072, 0, 8, 5439536, 0, 8, 5374000, 0, 8, 5308464, 0, 8, 5242928, 0, 8, 5177392, 0, 8, 5111856, 0, 8, 5046320, 0, 8, 4980784, 0, 8, 4915248, 0, 8, 4849712, 0, 8, 4784176, 0, 8, 6094895, 0, 8, 6029359, 0, 8, 5963823, 0, 8, 5898287, 0, 8, 5832751, 0, 8, 5767215, 0, 8, 5701679, 0, 8, 5636143, 0, 8, 5570607, 0, 8, 5505071, 0, 8, 5439535, 0, 8, 5373999, 0, 8, 5308463, 0, 8, 5242927, 0, 8, 5177391, 0, 8, 5111855, 0, 8, 5046319, 0, 8, 4980783, 0, 8, 4915247, 0, 8, 4849711, 0, 8, 4784175, 0, 8, 6094894, 0, 8, 6029358, 0, 8, 5963822, 0, 8, 5898286, 0, 8, 5832750, 0, 8, 5767214, 0, 8, 5701678, 0, 8, 5636142, 0, 8, 5570606, 0, 8, 5505070, 0, 8, 5439534, 0, 8, 5373998, 0, 8, 5308462, 0, 8, 5242926, 0, 8, 5177390, 0, 8, 5111854, 0, 8, 5046318, 0, 8, 4980782, 0, 8, 4915246, 0, 8, 4849710, 0, 8, 4784174, 0, 8, 6094893, 0, 8, 6029357, 0, 8, 5963821, 0, 8, 5898285, 0, 8, 5832749, 0, 8, 5767213, 0, 8, 5701677, 0, 8, 5636141, 0, 8, 5570605, 0, 8, 5505069, 0, 8, 5439533, 0, 8, 5373997, 0, 8, 5308461, 0, 8, 5242925, 0, 8, 5177389, 0, 8, 5111853, 0, 8, 5046317, 0, 8, 4980781, 0, 8, 4915245, 0, 8, 4849709, 0, 8, 4784173, 0, 8, 6094892, 0, 8, 6029356, 0, 8, 5963820, 0, 8, 5898284, 0, 8, 5832748, 0, 8, 5767212, 0, 8, 5701676, 0, 8, 5636140, 0, 8, 5570604, 0, 8, 5505068, 0, 8, 5439532, 0, 8, 5373996, 0, 8, 5308460, 0, 8, 5242924, 0, 8, 5177388, 0, 8, 5111852, 0, 8, 5046316, 0, 8, 4980780, 0, 8, 4915244, 0, 8, 4849708, 0, 8, 4784172, 0, 8, 6094891, 0, 8, 6029355, 0, 8, 5963819, 0, 8, 5898283, 0, 8, 5832747, 0, 8, 5767211, 0, 8, 5701675, 0, 8, 5636139, 0, 8, 5570603, 0, 8, 5505067, 0, 8, 5439531, 0, 8, 5373995, 0, 8, 5308459, 0, 8, 5242923, 0, 8, 5177387, 0, 8, 5111851, 0, 8, 5046315, 0, 8, 4980779, 0, 8, 4915243, 0, 8, 4849707, 0, 8, 4784171, 0, 8, 6094890, 0, 8, 6029354, 0, 8, 5963818, 0, 8, 5898282, 0, 8, 5832746, 0, 8, 5767210, 0, 8, 5701674, 0, 8, 5636138, 0, 8, 5570602, 0, 8, 5505066, 0, 8, 5439530, 0, 8, 5373994, 0, 8, 5308458, 0, 8, 5242922, 0, 8, 5177386, 0, 8, 5111850, 0, 8, 5046314, 0, 8, 4980778, 0, 8, 4915242, 0, 8, 4849706, 0, 8, 4784170, 0, 8, 6094889, 0, 8, 6029353, 0, 8, 5963817, 0, 8, 5898281, 0, 8, 5832745, 0, 8, 5767209, 0, 8, 5701673, 0, 8, 5636137, 0, 8, 5570601, 0, 8, 5505065, 0, 8, 5439529, 0, 8, 5373993, 0, 8, 5308457, 0, 8, 5242921, 0, 8, 5177385, 0, 8, 5111849, 0, 8, 5046313, 0, 8, 4980777, 0, 8, 4915241, 0, 8, 4849705, 0, 8, 4784169, 0, 8, 6094888, 0, 8, 6029352, 0, 8, 5963816, 0, 8, 5898280, 0, 8, 5832744, 0, 8, 5767208, 0, 8, 5701672, 0, 8, 5636136, 0, 8, 5570600, 0, 8, 5505064, 0, 8, 5439528, 0, 8, 5373992, 0, 8, 5308456, 0, 8, 5242920, 0, 8, 5177384, 0, 8, 5111848, 0, 8, 5046312, 0, 8, 4980776, 0, 8, 4915240, 0, 8, 4849704, 0, 8, 4784168, 0, 8, 6094887, 0, 8, 6029351, 0, 8, 5963815, 0, 8, 5898279, 0, 8, 5832743, 0, 8, 5767207, 0, 8, 5701671, 0, 8, 5636135, 0, 8, 5570599, 0, 8, 5505063, 0, 8, 5439527, 0, 8, 5373991, 0, 8, 5308455, 0, 8, 5242919, 0, 8, 5177383, 0, 8, 5111847, 0, 8, 5046311, 0, 8, 4980775, 0, 8, 4915239, 0, 8, 4849703, 0, 8, 4784167, 0, 8, 6094886, 0, 8, 6029350, 0, 8, 5963814, 0, 8, 5898278, 0, 8, 5832742, 0, 8, 5767206, 0, 8, 5701670, 0, 8, 5636134, 0, 8, 5570598, 0, 8, 5505062, 0, 8, 5439526, 0, 8, 5373990, 0, 8, 5308454, 0, 8, 5242918, 0, 8, 5177382, 0, 8, 5111846, 0, 8, 5046310, 0, 8, 4980774, 0, 8, 4915238, 0, 8, 4849702, 0, 8, 4784166, 0, 8, 6094885, 0, 8, 6029349, 0, 8, 5963813, 0, 8, 5898277, 0, 8, 5832741, 0, 8, 5767205, 0, 8, 5701669, 0, 8, 5636133, 0, 8, 5570597, 0, 8, 5505061, 0, 8, 5439525, 0, 8, 5373989, 0, 8, 5308453, 0, 8, 5242917, 0, 8, 5177381, 0, 8, 5111845, 0, 8, 5046309, 0, 8, 4980773, 0, 8, 4915237, 0, 8, 4849701, 0, 8, 4784165, 0, 8, 6094884, 0, 8, 6029348, 0, 8, 5963812, 0, 8, 5898276, 0, 8, 5832740, 0, 8, 5767204, 0, 8, 5701668, 0, 8, 5636132, 0, 8, 5570596, 0, 8, 5505060, 0, 8, 5439524, 0, 8, 5373988, 0, 8, 5308452, 0, 8, 5242916, 0, 8, 5177380, 0, 8, 5111844, 0, 8, 5046308, 0, 8, 4980772, 0, 8, 4915236, 0, 8, 4849700, 0, 8, 4784164, 0, 8, 6094883, 0, 8, 6029347, 0, 8, 5963811, 0, 8, 5898275, 0, 8, 5832739, 0, 8, 5767203, 0, 8, 5701667, 0, 8, 5636131, 0, 8, 5570595, 0, 8, 5505059, 0, 8, 5439523, 0, 8, 5373987, 0, 8, 5308451, 0, 8, 5242915, 0, 8, 5177379, 0, 8, 5111843, 0, 8, 5046307, 0, 8, 4980771, 0, 8, 4915235, 0, 8, 4849699, 0, 8, 4784163, 0, 8, 6094882, 0, 8, 6029346, 0, 8, 5963810, 0, 8, 5898274, 0, 8, 5832738, 0, 8, 5767202, 0, 8, 5701666, 0, 8, 5636130, 0, 8, 5570594, 0, 8, 5505058, 0, 8, 5439522, 0, 8, 5373986, 0, 8, 5308450, 0, 8, 5242914, 0, 8, 5177378, 0, 8, 5111842, 0, 8, 5046306, 0, 8, 4980770, 0, 8, 4915234, 0, 8, 4849698, 0, 8, 4784162, 0, 8, 6094881, 0, 8, 6029345, 0, 8, 5963809, 0, 8, 5898273, 0, 8, 5832737, 0, 8, 5767201, 0, 8, 5701665, 0, 8, 5636129, 0, 8, 5570593, 0, 8, 5505057, 0, 8, 5439521, 0, 8, 5373985, 0, 8, 5308449, 0, 8, 5242913, 0, 8, 5177377, 0, 8, 5111841, 0, 8, 5046305, 0, 8, 4980769, 0, 8, 4915233, 0, 8, 4849697, 0, 8, 4784161, 0, 8, 6094880, 0, 8, 6029344, 0, 8, 5963808, 0, 8, 5898272, 0, 8, 5832736, 0, 8, 5767200, 0, 8, 5701664, 0, 8, 5636128, 0, 8, 5570592, 0, 8, 5505056, 0, 8, 5439520, 0, 8, 5373984, 0, 8, 5308448, 0, 8, 5242912, 0, 8, 5177376, 0, 8, 5111840, 0, 8, 5046304, 0, 8, 6094879, 0, 8, 6029343, 0, 8, 5963807, 0, 8, 5898271, 0, 8, 5832735, 0, 8, 5767199, 0, 8, 5701663, 0, 8, 5636127, 0, 8, 5570591, 0, 8, 5505055, 0, 8, 5439519, 0, 8, 5373983, 0, 8, 5308447, 0, 8, 5242911, 0, 8, 5177375, 0, 8, 5111839, 0, 8, 5046303, 0, 8, 6094878, 0, 8, 6029342, 0, 8, 5963806, 0, 8, 5898270, 0, 8, 5832734, 0, 8, 5767198, 0, 8, 5701662, 0, 8, 5636126, 0, 8, 5570590, 0, 8, 5505054, 0, 8, 5439518, 0, 8, 5373982, 0, 8, 5308446, 0, 8, 5242910, 0, 8, 5177374, 0, 8, 5111838, 0, 8, 5046302, 0, 8, 6094877, 0, 8, 6029341, 0, 8, 5963805, 0, 8, 5898269, 0, 8, 5832733, 0, 8, 5767197, 0, 8, 5701661, 0, 8, 5636125, 0, 8, 5570589, 0, 8, 5505053, 0, 8, 5439517, 0, 8, 5373981, 0, 8, 5308445, 0, 8, 5242909, 0, 8, 5177373, 0, 8, 5111837, 0, 8, 5046301, 0, 8, 6094876, 0, 8, 6029340, 0, 8, 5963804, 0, 8, 5898268, 0, 8, 5832732, 0, 8, 5767196, 0, 8, 5701660, 0, 8, 5636124, 0, 8, 5570588, 0, 8, 5505052, 0, 8, 5439516, 0, 8, 5373980, 0, 8, 5308444, 0, 8, 5242908, 0, 8, 5177372, 0, 8, 5111836, 0, 8, 5046300, 0, 8, 6094875, 0, 8, 6029339, 0, 8, 5963803, 0, 8, 5898267, 0, 8, 5832731, 0, 8, 5767195, 0, 8, 5701659, 0, 8, 5636123, 0, 8, 5570587, 0, 8, 5505051, 0, 8, 5439515, 0, 8, 5373979, 0, 8, 5308443, 0, 8, 5242907, 0, 8, 5177371, 0, 8, 5111835, 0, 8, 5046299, 0, 8, 6094874, 0, 8, 6029338, 0, 8, 5963802, 0, 8, 5898266, 0, 8, 5832730, 0, 8, 5767194, 0, 8, 5701658, 0, 8, 5636122, 0, 8, 5570586, 0, 8, 5505050, 0, 8, 5439514, 0, 8, 5373978, 0, 8, 5308442, 0, 8, 5242906, 0, 8, 5177370, 0, 8, 5111834, 0, 8, 5046298, 0, 8, 6094873, 0, 8, 6029337, 0, 8, 5963801, 0, 8, 5898265, 0, 8, 5832729, 0, 8, 5767193, 0, 8, 5701657, 0, 8, 5636121, 0, 8, 5570585, 0, 8, 5505049, 0, 8, 5439513, 0, 8, 5373977, 0, 8, 5308441, 0, 8, 5242905, 0, 8, 5177369, 0, 8, 5111833, 0, 8, 5046297, 0, 8, 6094872, 0, 8, 6029336, 0, 8, 5963800, 0, 8, 5898264, 0, 8, 5832728, 0, 8, 5767192, 0, 8, 5701656, 0, 8, 5636120, 0, 8, 5570584, 0, 8, 5505048, 0, 8, 5439512, 0, 8, 5373976, 0, 8, 5308440, 0, 8, 5242904, 0, 8, 5177368, 0, 8, 5111832, 0, 8, 5046296, 0, 8, 6094871, 0, 8, 6029335, 0, 8, 5963799, 0, 8, 5898263, 0, 8, 5832727, 0, 8, 5767191, 0, 8, 5701655, 0, 8, 5636119, 0, 8, 5570583, 0, 8, 5505047, 0, 8, 5439511, 0, 8, 5373975, 0, 8, 5308439, 0, 8, 5242903, 0, 8, 5177367, 0, 8, 5111831, 0, 8, 5046295, 0, 8, 6094870, 0, 8, 6029334, 0, 8, 5963798, 0, 8, 5898262, 0, 8, 5832726, 0, 8, 5767190, 0, 8, 5701654, 0, 8, 5636118, 0, 8, 5570582, 0, 8, 5505046, 0, 8, 5439510, 0, 8, 5373974, 0, 8, 5308438, 0, 8, 5242902, 0, 8, 5177366, 0, 8, 5111830, 0, 8, 5046294, 0, 8, 6094869, 0, 8, 6029333, 0, 8, 5963797, 0, 8, 5898261, 0, 8, 5832725, 0, 8, 5767189, 0, 8, 5701653, 0, 8, 5636117, 0, 8, 5570581, 0, 8, 5505045, 0, 8, 5439509, 0, 8, 5373973, 0, 8, 5308437, 0, 8, 5242901, 0, 8, 5177365, 0, 8, 5111829, 0, 8, 5046293, 0, 8, 6094868, 0, 8, 6029332, 0, 8, 5963796, 0, 8, 5898260, 0, 8, 5832724, 0, 8, 5767188, 0, 8, 5701652, 0, 8, 5636116, 0, 8, 5570580, 0, 8, 5505044, 0, 8, 5439508, 0, 8, 5373972, 0, 8, 5308436, 0, 8, 5242900, 0, 8, 5177364, 0, 8, 5111828, 0, 8, 5046292, 0, 8, 6094867, 0, 8, 6029331, 0, 8, 5963795, 0, 8, 5898259, 0, 8, 5832723, 0, 8, 5767187, 0, 8, 5701651, 0, 8, 5636115, 0, 8, 5570579, 0, 8, 5505043, 0, 8, 5439507, 0, 8, 5373971, 0, 8, 5308435, 0, 8, 5242899, 0, 8, 5177363, 0, 8, 5111827, 0, 8, 5046291, 0, 8, 5046290, 196608, 3, 5111826, 196608, 3, 5177362, 196608, 3, 5242898, 196608, 3, 5308434, 196608, 3, 5373970, 196608, 3, 5439506, 196608, 3, 5505042, 196608, 3, 5570578, 196608, 3, 5636114, 196608, 3, 5701650, 196608, 3, 5767186, 196608, 3, 5832722, 196608, 3, 5898258, 196608, 3, 5963794, 196608, 3, 6029330, 196608, 3, 6094866, 196608, 3, 6160404, 131072, 2, 6160402, 720896, 2, 6160405, 131072, 2, 6160403, 131072, 2, 6160406, 131072, 2, 6160407, 131072, 2, 6160408, 131072, 2, 6160409, 131072, 2, 6160410, 131072, 2, 6160411, 131072, 2, 6160412, 131072, 2, 6160413, 131072, 2, 6160414, 131072, 2, 6160415, 131072, 2, 6160416, 131072, 2, 4718625, 131072, 7, 6160417, 131072, 2, 4718626, 131072, 7, 6160418, 131072, 2, 4718627, 131072, 7, 6160419, 131072, 2, 4718628, 131072, 7, 6160420, 131072, 2, 4718629, 131072, 7, 6160421, 131072, 2, 4718630, 131072, 7, 6160422, 131072, 2, 4718631, 131072, 7, 6160423, 131072, 2, 4718632, 131072, 7, 6160424, 131072, 2, 4718633, 131072, 7, 6160425, 131072, 2, 4718634, 131072, 7, 6160426, 131072, 2, 4718635, 131072, 7, 6160427, 131072, 2, 4718636, 131072, 7, 6160428, 131072, 2, 4718637, 131072, 7, 6160429, 131072, 2, 4718638, 131072, 7, 6160430, 131072, 2, 4718639, 131072, 7, 6160431, 131072, 2, 4718640, 131072, 7, 6160432, 131072, 2, 4718641, 131072, 7, 6160433, 131072, 2, 4718642, 131072, 7, 6160434, 131072, 2, 4718643, 131072, 7, 6160435, 131072, 2, 4718644, 131072, 7, 6160436, 131072, 2, 4718645, 131072, 7, 6160437, 131072, 2, 4718646, 131072, 7, 6160438, 131072, 2, 4718647, 131072, 7, 6160439, 131072, 2, 4718648, 131072, 7, 6160440, 131072, 2, 4718649, 131072, 7, 6160441, 131072, 2, 6160442, 131072, 2, 6160443, 131072, 2, 6160444, 131072, 2, 6160445, 131072, 2, 6160446, 131072, 2, 6160447, 131072, 2, 6160448, 131072, 2, 6160449, 131072, 2, 5046338, 65536, 3, 5111874, 65536, 3, 5177410, 65536, 3, 5242946, 65536, 3, 5308482, 65536, 3, 5374018, 65536, 3, 5439554, 65536, 3, 5505090, 65536, 3, 5570626, 65536, 3, 5636162, 65536, 3, 5701698, 65536, 3, 5767234, 65536, 3, 5832770, 65536, 3, 5898306, 65536, 3, 5963842, 65536, 3, 6029378, 65536, 3, 6094914, 65536, 3, 6160450, 851968, 2) diff --git a/DungeonShooting_Godot/scene/test/TestTerrain2x2.tscn b/DungeonShooting_Godot/scene/test/TestTerrain2x2.tscn new file mode 100644 index 0000000..3244a52 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestTerrain2x2.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=4 format=3 uid="uid://bwxo7kc5ybrou"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_23gwl"] +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +4:0/0 = 0 +5:0/0 = 0 +6:0/0 = 0 +7:0/0 = 0 +8:0/0 = 0 +8:0/0/terrain_set = 0 +8:0/0/terrain = 0 +8:0/0/terrains_peering_bit/bottom_right_corner = 0 +9:0/0 = 0 +10:0/0 = 0 +10:0/0/terrain_set = 0 +10:0/0/terrain = 0 +10:0/0/terrains_peering_bit/bottom_right_corner = 0 +10:0/0/terrains_peering_bit/bottom_left_corner = 0 +11:0/0 = 0 +11:0/0/terrain_set = 0 +11:0/0/terrain = 0 +11:0/0/terrains_peering_bit/bottom_left_corner = 0 +0:1/0 = 0 +1:1/0 = 0 +2:1/0 = 0 +3:1/0 = 0 +4:1/0 = 0 +5:1/0 = 0 +5:1/0/terrain_set = 0 +5:1/0/terrain = 0 +5:1/0/terrains_peering_bit/bottom_right_corner = 0 +5:1/0/terrains_peering_bit/bottom_left_corner = 0 +5:1/0/terrains_peering_bit/top_right_corner = 0 +6:1/0 = 0 +6:1/0/terrain_set = 0 +6:1/0/terrain = 0 +6:1/0/terrains_peering_bit/bottom_right_corner = 0 +6:1/0/terrains_peering_bit/bottom_left_corner = 0 +6:1/0/terrains_peering_bit/top_left_corner = 0 +7:1/0 = 0 +8:1/0 = 0 +8:1/0/terrain_set = 0 +8:1/0/terrain = 0 +8:1/0/terrains_peering_bit/bottom_right_corner = 0 +8:1/0/terrains_peering_bit/top_right_corner = 0 +9:1/0 = 0 +11:1/0 = 0 +0:2/0 = 0 +1:2/0 = 0 +2:2/0 = 0 +3:2/0 = 0 +4:2/0 = 0 +5:2/0 = 0 +5:2/0/terrain_set = 0 +5:2/0/terrain = 0 +5:2/0/terrains_peering_bit/bottom_right_corner = 0 +5:2/0/terrains_peering_bit/top_left_corner = 0 +5:2/0/terrains_peering_bit/top_right_corner = 0 +6:2/0 = 0 +6:2/0/terrain_set = 0 +6:2/0/terrain = 0 +6:2/0/terrains_peering_bit/bottom_left_corner = 0 +6:2/0/terrains_peering_bit/top_left_corner = 0 +6:2/0/terrains_peering_bit/top_right_corner = 0 +7:2/0 = 0 +8:2/0 = 0 +8:2/0/terrain_set = 0 +9:2/0 = 0 +9:2/0/terrain_set = 0 +9:2/0/terrain = 0 +9:2/0/terrains_peering_bit/bottom_right_corner = 0 +9:2/0/terrains_peering_bit/bottom_left_corner = 0 +9:2/0/terrains_peering_bit/top_left_corner = 0 +9:2/0/terrains_peering_bit/top_right_corner = 0 +10:2/0 = 0 +11:2/0 = 0 +11:2/0/terrain_set = 0 +11:2/0/terrain = 0 +11:2/0/terrains_peering_bit/bottom_left_corner = 0 +11:2/0/terrains_peering_bit/top_left_corner = 0 +0:3/0 = 0 +1:3/0 = 0 +2:3/0 = 0 +3:3/0 = 0 +4:3/0 = 0 +5:3/0 = 0 +6:3/0 = 0 +7:3/0 = 0 +8:3/0 = 0 +8:3/0/terrain_set = 0 +8:3/0/terrain = 0 +8:3/0/terrains_peering_bit/top_right_corner = 0 +9:3/0 = 0 +9:3/0/terrain_set = 0 +9:3/0/terrain = 0 +9:3/0/terrains_peering_bit/top_left_corner = 0 +9:3/0/terrains_peering_bit/top_right_corner = 0 +10:3/0 = 0 +11:3/0 = 0 +11:3/0/terrain_set = 0 +11:3/0/terrain = 0 +11:3/0/terrains_peering_bit/top_left_corner = 0 +0:4/0 = 0 +1:4/0 = 0 +2:4/0 = 0 +3:4/0 = 0 +4:4/0 = 0 + +[sub_resource type="TileSet" id="TileSet_ii6g3"] +terrain_set_0/mode = 1 +terrain_set_0/terrain_0/name = "Terrain 0" +terrain_set_0/terrain_0/color = Color(0.501961, 0.345098, 0.25098, 1) +sources/0 = SubResource("TileSetAtlasSource_23gwl") + +[node name="TestTerrain2x2" type="Node2D"] + +[node name="TileMap" type="TileMap" parent="."] +tile_set = SubResource("TileSet_ii6g3") +format = 2 +layer_0/tile_data = PackedInt32Array(-1, 589824, 2, -65536, 589824, 2, -65535, 589824, 2, -65534, 589824, 2, -65533, 589824, 2, 1, 589824, 2, 0, 589824, 2, 65535, 589824, 2, -65529, 589824, 2, -65530, 589824, 2, 7, 589824, 2, -131065, 589824, 2, -196601, 589824, 2, -131066, 589824, 2, -196602, 589824, 2, -131072, 589824, 2, -196608, 589824, 2, -65537, 589824, 2, -131073, 589824, 2, -2, 589824, 2, -65538, 589824, 2, -131074, 327680, 1, -3, 327680, 2, -65539, 589824, 2, -131075, 655360, 0, -4, 524288, 3, -65540, 524288, 1, -131076, 524288, 0, 196606, 327680, 2, 131070, 589824, 2, 65534, 589824, 2, 196605, 524288, 3, 131069, 524288, 1, 65533, 524288, 1, 131075, 589824, 2, 65539, 589824, 2, 196610, 589824, 2, 131074, 589824, 2, 65538, 589824, 2, 196609, 589824, 2, 131073, 589824, 2, 65537, 589824, 2, 196608, 589824, 2, 131072, 589824, 2, 65536, 589824, 2, 131077, 589824, 2, -65528, 589824, 2, -65527, 589824, 2, 9, 589824, 2, 10, 720896, 2, 8, 589824, 2, -65526, 720896, 2, -131069, 589824, 2, -196605, 589824, 2, -196606, 589824, 2, -262142, 655360, 0, -262141, 655360, 0, -131070, 589824, 2, 262146, 589824, 2, 327682, 589824, 2, 393218, 589824, 3, 262145, 589824, 2, 327681, 589824, 2, 393217, 589824, 3, 327683, 589824, 2, 327684, 589824, 2, 327685, 589824, 2, 393221, 589824, 3, 393220, 589824, 3, 393219, 589824, 3, 327680, 589824, 2, 393216, 589824, 3, 458751, 589824, 3, 393215, 589824, 2, 393214, 327680, 1, 393213, 655360, 0, 458750, 589824, 3, 458749, 589824, 3, 393211, 655360, 0, 458747, 589824, 3, 458748, 589824, 3, 393212, 655360, 0, 393210, 655360, 0, 458746, 589824, 3, 393209, 393216, 1, 393208, 327680, 2, 458744, 524288, 3, 458745, 589824, 3, 327673, 720896, 2, 327672, 327680, 1, 262136, 524288, 1, 262137, 720896, 2, 196601, 720896, 2, 196600, 327680, 2, -7, 720896, 2, -8, 524288, 1, 65529, 720896, 2, 65528, 524288, 1, 131065, 720896, 2, 131064, 327680, 1, -65543, 720896, 2, -131079, 720896, 0, -65544, 327680, 2, -131080, 655360, 0, -65545, 589824, 3, -131081, 655360, 0, -65546, 524288, 3, -131082, 524288, 0, 196599, 589824, 3, 131063, 655360, 0, 196598, 524288, 3, 131062, 524288, 0, 393207, 524288, 3, 327671, 524288, 0, -196609, 393216, 1, -262145, 720896, 0, -196610, 524288, 1, -262146, 524288, 0, 131081, 589824, 2, 65545, 589824, 2, 131080, 589824, 2, 65544, 589824, 2, 131079, 589824, 2, 393223, 589824, 3, 327687, 589824, 2, 262151, 589824, 2, 196615, 589824, 2, 393222, 589824, 3, 327686, 589824, 2, 262150, 589824, 2, -131067, 589824, 2, -131064, 589824, 2, 196616, 589824, 2, 262147, 589824, 2, 65541, 589824, 2, 262144, 589824, 2, 3, 589824, 2, -196604, 589824, 2, -196603, 589824, 2, -131068, 589824, 2, -65532, 589824, 2, 4, 589824, 2, 131076, 589824, 2, 196612, 589824, 2, 196613, 589824, 2, 131078, 589824, 2, 65542, 589824, 2, 6, 589824, 2, 5, 589824, 2, 262149, 589824, 2, 262148, 589824, 2, 196614, 589824, 2, 327688, 589824, 2, 262152, 589824, 2, -65531, 589824, 2, -262140, 655360, 0, -262143, 655360, 0, -262144, 655360, 0, -131071, 589824, 2, -196607, 589824, 2, -262139, 655360, 0, -262138, 655360, 0, -262137, 655360, 0, -262136, 655360, 0, -196600, 589824, 2, -131063, 589824, 2, -196599, 589824, 2, -262135, 655360, 0, -131062, 720896, 2, -196598, 720896, 2, -262134, 720896, 0, 65546, 720896, 2, 131082, 720896, 2, 196618, 720896, 2, 262154, 720896, 2, 327690, 720896, 2, 262153, 589824, 2, 196617, 589824, 2, 393224, 589824, 3, 393225, 589824, 3, 327689, 589824, 2, 393226, 720896, 3, 327679, 589824, 2, 262143, 589824, 2, 196607, 589824, 2, 131071, 589824, 2, 327678, 524288, 1, 262142, 524288, 1, 196611, 589824, 2, 2, 589824, 2, 65543, 589824, 2, -655350, 655360, 0, -589814, 589824, 2, -589813, 589824, 2, 65540, 589824, 2, -655349, 655360, 0, -589812, 589824, 2, -589811, 589824, 2, -589810, 589824, 2, -589809, 720896, 2, -655345, 720896, 0, -655346, 655360, 0, -655347, 655360, 0, -655348, 655360, 0, -589815, 589824, 2, -655351, 655360, 0, -655352, 655360, 0, -655353, 655360, 0, -589817, 589824, 2, -589816, 589824, 2, -524278, 589824, 2, -524277, 589824, 2, -458741, 589824, 3, -458742, 589824, 3, -524276, 589824, 2, -524275, 589824, 2, -524279, 589824, 2, -524280, 589824, 2, -524281, 589824, 2, -458744, 589824, 3, -458743, 589824, 3, -458740, 589824, 3, -458739, 589824, 3, -458738, 589824, 3, -524274, 589824, 2, -524273, 720896, 2, -458737, 720896, 3, -458745, 589824, 3, -655354, 524288, 0, -589818, 524288, 1, -524282, 524288, 1, -458746, 524288, 3) diff --git a/DungeonShooting_Godot/scene/test/TestTileLayer.tscn b/DungeonShooting_Godot/scene/test/TestTileLayer.tscn index 43c3ad7..1e47c5b 100644 --- a/DungeonShooting_Godot/scene/test/TestTileLayer.tscn +++ b/DungeonShooting_Godot/scene/test/TestTileLayer.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=13 format=3 uid="uid://d1m4kunwifxax"] -[ext_resource type="Texture2D" uid="uid://dj8nrd5od4fcl" path="res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" id="1"] +[ext_resource type="Texture2D" uid="uid://dj8nrd5od4fcl" path="res://resource/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" id="1"] [ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="2"] [ext_resource type="Texture2D" uid="uid://5geiuvv6hyov" path="res://resource/sprite/weapon/gun2.png" id="3"] [ext_resource type="Texture2D" uid="uid://dto03bc2qbhnj" path="res://resource/sprite/shell/Shell0001.png" id="4"] @@ -8,6 +8,7 @@ + [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ch2b5"] texture = ExtResource("1") margins = Vector2i(80, 144) diff --git a/DungeonShooting_Godot/scene/test/TestTrail.tscn b/DungeonShooting_Godot/scene/test/TestTrail.tscn new file mode 100644 index 0000000..79afee9 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestTrail.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://brum5fmbt1br4"] + +[ext_resource type="Script" path="res://src/test/TestTrail.cs" id="1_mefd0"] +[ext_resource type="PackedScene" uid="uid://ddwikcidm0gsi" path="res://prefab/effect/common/Trail0001.tscn" id="2_t308a"] +[ext_resource type="Texture2D" uid="uid://bn8k07n2y6lmr" path="res://resource/sprite/bullet/normal/bullet0006.png" id="2_w7ffd"] + +[sub_resource type="Gradient" id="Gradient_gds2p"] +resource_local_to_scene = true +offsets = PackedFloat32Array(0.825949, 1) +colors = PackedColorArray(1, 1, 1, 0.705882, 1, 1, 1, 0) + +[node name="TestTrail" type="Node2D"] +script = ExtResource("1_mefd0") + +[node name="Trail" parent="." instance=ExtResource("2_t308a")] +gradient = SubResource("Gradient_gds2p") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_w7ffd") diff --git a/DungeonShooting_Godot/src/config/ExcelConfig.cs b/DungeonShooting_Godot/src/config/ExcelConfig.cs index bf3c620..8bb7fd3 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig.cs @@ -8,13 +8,22 @@ public static partial class ExcelConfig { /// - /// ActivityBase.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 + /// Sound.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 /// - public static List ActivityBase_List { get; private set; } + public static List Sound_List { get; private set; } /// - /// ActivityBase.xlsx表数据集合, 里 Map 形式存储, key 为 Id + /// Sound.xlsx表数据集合, 里 Map 形式存储, key 为 Id /// - public static Dictionary ActivityBase_Map { get; private set; } + public static Dictionary Sound_Map { get; private set; } + + /// + /// WeaponBase.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 + /// + public static List WeaponBase_List { get; private set; } + /// + /// WeaponBase.xlsx表数据集合, 里 Map 形式存储, key 为 Id + /// + public static Dictionary WeaponBase_Map { get; private set; } /// /// ActivityMaterial.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 @@ -53,6 +62,15 @@ public static Dictionary EnemyBase_Map { get; private set; } /// + /// ActivityBase.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 + /// + public static List ActivityBase_List { get; private set; } + /// + /// ActivityBase.xlsx表数据集合, 里 Map 形式存储, key 为 Id + /// + public static Dictionary ActivityBase_Map { get; private set; } + + /// /// LiquidMaterial.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 /// public static List LiquidMaterial_List { get; private set; } @@ -61,24 +79,6 @@ /// public static Dictionary LiquidMaterial_Map { get; private set; } - /// - /// Sound.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 - /// - public static List Sound_List { get; private set; } - /// - /// Sound.xlsx表数据集合, 里 Map 形式存储, key 为 Id - /// - public static Dictionary Sound_Map { get; private set; } - - /// - /// WeaponBase.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 - /// - public static List WeaponBase_List { get; private set; } - /// - /// WeaponBase.xlsx表数据集合, 里 Map 形式存储, key 为 Id - /// - public static Dictionary WeaponBase_Map { get; private set; } - private static bool _init = false; /// @@ -89,35 +89,53 @@ if (_init) return; _init = true; - _InitActivityBaseConfig(); + _InitSoundConfig(); + _InitWeaponBaseConfig(); _InitActivityMaterialConfig(); _InitAiAttackAttrConfig(); _InitBulletBaseConfig(); _InitEnemyBaseConfig(); + _InitActivityBaseConfig(); _InitLiquidMaterialConfig(); - _InitSoundConfig(); - _InitWeaponBaseConfig(); - _InitActivityBaseRef(); - _InitEnemyBaseRef(); _InitWeaponBaseRef(); + _InitEnemyBaseRef(); + _InitActivityBaseRef(); } - private static void _InitActivityBaseConfig() + private static void _InitSoundConfig() { try { - var text = _ReadConfigAsText("res://resource/config/ActivityBase.json"); - ActivityBase_List = new List(JsonSerializer.Deserialize>(text)); - ActivityBase_Map = new Dictionary(); - foreach (var item in ActivityBase_List) + var text = _ReadConfigAsText("res://resource/config/Sound.json"); + Sound_List = JsonSerializer.Deserialize>(text); + Sound_Map = new Dictionary(); + foreach (var item in Sound_List) { - ActivityBase_Map.Add(item.Id, item); + Sound_Map.Add(item.Id, item); } } catch (Exception e) { GD.PrintErr(e.ToString()); - throw new Exception("初始化表'ActivityBase'失败!"); + throw new Exception("初始化表'Sound'失败!"); + } + } + private static void _InitWeaponBaseConfig() + { + try + { + var text = _ReadConfigAsText("res://resource/config/WeaponBase.json"); + WeaponBase_List = new List(JsonSerializer.Deserialize>(text)); + WeaponBase_Map = new Dictionary(); + foreach (var item in WeaponBase_List) + { + WeaponBase_Map.Add(item.Id, item); + } + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化表'WeaponBase'失败!"); } } private static void _InitActivityMaterialConfig() @@ -192,6 +210,24 @@ throw new Exception("初始化表'EnemyBase'失败!"); } } + private static void _InitActivityBaseConfig() + { + try + { + var text = _ReadConfigAsText("res://resource/config/ActivityBase.json"); + ActivityBase_List = new List(JsonSerializer.Deserialize>(text)); + ActivityBase_Map = new Dictionary(); + foreach (var item in ActivityBase_List) + { + ActivityBase_Map.Add(item.Id, item); + } + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化表'ActivityBase'失败!"); + } + } private static void _InitLiquidMaterialConfig() { try @@ -210,81 +246,7 @@ throw new Exception("初始化表'LiquidMaterial'失败!"); } } - private static void _InitSoundConfig() - { - try - { - var text = _ReadConfigAsText("res://resource/config/Sound.json"); - Sound_List = JsonSerializer.Deserialize>(text); - Sound_Map = new Dictionary(); - foreach (var item in Sound_List) - { - Sound_Map.Add(item.Id, item); - } - } - catch (Exception e) - { - GD.PrintErr(e.ToString()); - throw new Exception("初始化表'Sound'失败!"); - } - } - private static void _InitWeaponBaseConfig() - { - try - { - var text = _ReadConfigAsText("res://resource/config/WeaponBase.json"); - WeaponBase_List = new List(JsonSerializer.Deserialize>(text)); - WeaponBase_Map = new Dictionary(); - foreach (var item in WeaponBase_List) - { - WeaponBase_Map.Add(item.Id, item); - } - } - catch (Exception e) - { - GD.PrintErr(e.ToString()); - throw new Exception("初始化表'WeaponBase'失败!"); - } - } - private static void _InitActivityBaseRef() - { - foreach (Ref_ActivityBase item in ActivityBase_List) - { - try - { - if (!string.IsNullOrEmpty(item.__Material)) - { - item.Material = ActivityMaterial_Map[item.__Material]; - } - - } - catch (Exception e) - { - GD.PrintErr(e.ToString()); - throw new Exception("初始化'ActivityBase'引用其他表数据失败, 当前行id: " + item.Id); - } - } - } - private static void _InitEnemyBaseRef() - { - foreach (Ref_EnemyBase item in EnemyBase_List) - { - try - { - if (!string.IsNullOrEmpty(item.__Activity)) - { - item.Activity = ActivityBase_Map[item.__Activity]; - } - - } - catch (Exception e) - { - GD.PrintErr(e.ToString()); - throw new Exception("初始化'EnemyBase'引用其他表数据失败, 当前行id: " + item.Id); - } - } - } private static void _InitWeaponBaseRef() { foreach (Ref_WeaponBase item in WeaponBase_List) @@ -340,11 +302,6 @@ } } - if (!string.IsNullOrEmpty(item.__AiUseAttribute)) - { - item.AiUseAttribute = WeaponBase_Map[item.__AiUseAttribute]; - } - if (!string.IsNullOrEmpty(item.__AiAttackAttr)) { item.AiAttackAttr = AiAttackAttr_Map[item.__AiAttackAttr]; @@ -358,6 +315,44 @@ } } } + private static void _InitEnemyBaseRef() + { + foreach (Ref_EnemyBase item in EnemyBase_List) + { + try + { + if (!string.IsNullOrEmpty(item.__Activity)) + { + item.Activity = ActivityBase_Map[item.__Activity]; + } + + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化'EnemyBase'引用其他表数据失败, 当前行id: " + item.Id); + } + } + } + private static void _InitActivityBaseRef() + { + foreach (Ref_ActivityBase item in ActivityBase_List) + { + try + { + if (!string.IsNullOrEmpty(item.__Material)) + { + item.Material = ActivityMaterial_Map[item.__Material]; + } + + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化'ActivityBase'引用其他表数据失败, 当前行id: " + item.Id); + } + } + } private static string _ReadConfigAsText(string path) { var file = FileAccess.Open(path, FileAccess.ModeFlags.Read); diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityBase.cs index 76d7bfb..d19cfa0 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityBase.cs @@ -23,10 +23,11 @@ /// Shell(弹壳): 7
/// Effect(特效): 8
/// Prop(道具): 9
+ /// Treasure(宝箱): 10
/// Other(其它类型): 99 ///
[JsonInclude] - public int Type; + public ActivityType Type; /// /// 物体名称 @@ -35,6 +36,25 @@ public string Name; /// + /// 物体品质, 用于武器和道具
+ /// 通用物品: 1
+ /// 基础: 2
+ /// 普通: 3
+ /// 稀有: 4
+ /// 史诗: 5
+ /// 传说: 6
+ /// 独一无二: 7 + ///
+ [JsonInclude] + public ActivityQuality Quality; + + /// + /// 商店售价 + /// + [JsonInclude] + public uint Price; + + /// /// 物体简介
/// 一句对物体简短的介绍, 比如拾起物体时弹出的描述 ///
@@ -88,6 +108,8 @@ inst.Id = Id; inst.Type = Type; inst.Name = Name; + inst.Quality = Quality; + inst.Price = Price; inst.Intro = Intro; inst.Details = Details; inst.IsStatic = IsStatic; diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs index f3fa9c6..fe76940 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs @@ -77,7 +77,7 @@ public float FallBounceRotation; /// - /// 动态开关碰撞器,在物体高度大于16时是否关闭碰撞检测 + /// 动态开关碰撞器,在物体高度大于32时是否关闭碰撞检测 /// [JsonInclude] public bool DynamicCollision; diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs index cedad80..99bf73c 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs @@ -25,6 +25,12 @@ public string Remark; /// + /// 血量 + /// + [JsonInclude] + public int Hp; + + /// /// 移动速度 /// [JsonInclude] @@ -43,6 +49,13 @@ public float Friction; /// + /// 单次攻击间隔时间, 秒
+ /// 注意, 敌人攻击后计算间隔时间会使用当前字段值与武器上的TriggerInterval叠加 + ///
+ [JsonInclude] + public float AttackInterval; + + /// /// 是否可以拾起武器 /// [JsonInclude] @@ -67,6 +80,13 @@ public float BackViewRange; /// + /// 掉落金币数量区间, 如果为负数或者0则不会掉落金币
+ /// 格式为[value]或者[min,max] + ///
+ [JsonInclude] + public int[] Gold; + + /// /// 返回浅拷贝出的新对象 /// public EnemyBase Clone() @@ -75,13 +95,16 @@ inst.Id = Id; inst.Activity = Activity; inst.Remark = Remark; + inst.Hp = Hp; inst.MoveSpeed = MoveSpeed; inst.Acceleration = Acceleration; inst.Friction = Friction; + inst.AttackInterval = AttackInterval; inst.CanPickUpWeapon = CanPickUpWeapon; inst.ViewRange = ViewRange; inst.TailAfterViewRange = TailAfterViewRange; inst.BackViewRange = BackViewRange; + inst.Gold = Gold; return inst; } } diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs index e3de8cf..57323b4 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs @@ -70,6 +70,18 @@ public int StandbyAmmoCapacity; /// + /// 换弹是否显示换弹进度 + /// + [JsonInclude] + public bool ShowReloadBar; + + /// + /// 弹夹打空是否自动换弹 + /// + [JsonInclude] + public bool AutoReload; + + /// /// 装弹时间 (单位: 秒) /// [JsonInclude] @@ -259,7 +271,7 @@ public float UpliftAngleRestore; /// - /// 开火特效 + /// 开火特效, 该特效脚本必须实现IEffect接口 /// [JsonInclude] public string FireEffect; @@ -281,18 +293,18 @@ public bool ReloadThrowShell; /// + /// 抛壳数量 + /// + [JsonInclude] + public int ThrowShellCount; + + /// /// 投抛弹壳的延时时间 /// [JsonInclude] public float ThrowShellDelayTime; /// - /// 投抛状态下物体碰撞器大小 - /// - [JsonInclude] - public SerializeVector2 ThrowCollisionSize; - - /// /// 是否可以触发近战攻击 /// [JsonInclude] @@ -368,13 +380,6 @@ public Dictionary OtherSoundMap; /// - /// Ai属性
- /// Ai 使用该武器时的武器数据, 设置该字段, 可让同一把武器在敌人和玩家手上有不同属性
- /// 如果不填则Ai和玩家使用同一种属性 - ///
- public WeaponBase AiUseAttribute; - - /// /// Ai使用该武器开火时的一些额外配置属性
/// 玩家使用的武器不需要填写该字段 ///
@@ -396,6 +401,8 @@ inst.AmmoCapacity = AmmoCapacity; inst.MaxAmmoCapacity = MaxAmmoCapacity; inst.StandbyAmmoCapacity = StandbyAmmoCapacity; + inst.ShowReloadBar = ShowReloadBar; + inst.AutoReload = AutoReload; inst.ReloadTime = ReloadTime; inst.AloneReload = AloneReload; inst.AloneReloadCount = AloneReloadCount; @@ -431,8 +438,8 @@ inst.Bullet = Bullet; inst.Shell = Shell; inst.ReloadThrowShell = ReloadThrowShell; + inst.ThrowShellCount = ThrowShellCount; inst.ThrowShellDelayTime = ThrowShellDelayTime; - inst.ThrowCollisionSize = ThrowCollisionSize; inst.CanMeleeAttack = CanMeleeAttack; inst.MeleeAttackHarmRange = MeleeAttackHarmRange; inst.MeleeAttackRepelRange = MeleeAttackRepelRange; @@ -446,7 +453,6 @@ inst.BeLoadedSound = BeLoadedSound; inst.BeLoadedSoundDelayTime = BeLoadedSoundDelayTime; inst.OtherSoundMap = OtherSoundMap; - inst.AiUseAttribute = AiUseAttribute; inst.AiAttackAttr = AiAttackAttr; return inst; } @@ -481,9 +487,6 @@ public Dictionary __OtherSoundMap; [JsonInclude] - public string __AiUseAttribute; - - [JsonInclude] public string __AiAttackAttr; } diff --git a/DungeonShooting_Godot/src/framework/InfiniteGrid.cs b/DungeonShooting_Godot/src/framework/InfiniteGrid.cs index 09b986f..85713a4 100644 --- a/DungeonShooting_Godot/src/framework/InfiniteGrid.cs +++ b/DungeonShooting_Godot/src/framework/InfiniteGrid.cs @@ -10,8 +10,10 @@ /// /// 遍历网格数据回调 /// - public delegate void EachGridCallback(int x, int y, T data); + public delegate bool EachGridCallback(int x, int y, T data); + private bool _isDirty = false; + private Rect2I _rect = new Rect2I(); private readonly Dictionary> _map = new Dictionary>(); /// @@ -49,6 +51,7 @@ value = new Dictionary(); value.Add(y, data); _map.Add(x, value); + _isDirty = true; } } @@ -91,7 +94,11 @@ { if (_map.TryGetValue(x, out var value)) { - return value.Remove(y); + if (value.Remove(y)) + { + _isDirty = true; + return true; + } } return false; @@ -120,6 +127,7 @@ value = new Dictionary(); value.Add(y + j, data); _map.Add(x + i, value); + _isDirty = true; } } } @@ -140,7 +148,11 @@ { if (_map.TryGetValue(x + i, out var value)) { - value.Remove(y + j); + if (value.Remove(y + j)) + { + _isDirty = true; + } + if (value.Count == 0) { _map.Remove(x + i); @@ -156,6 +168,7 @@ public void Clear() { _map.Clear(); + _isDirty = true; } /// @@ -191,7 +204,7 @@ } /// - /// 遍历网格数据 + /// 遍历网格数据, 回调返回 false 则停止遍历 /// public void ForEach(EachGridCallback cb) { @@ -199,8 +212,51 @@ { foreach (var pair2 in pair1.Value) { - cb(pair1.Key, pair2.Key, pair2.Value); + if (!cb(pair1.Key, pair2.Key, pair2.Value)) + { + return; + } } } } + + /// + /// 获取网格的包围矩形 + /// + public Rect2I GetRect() + { + if (!_isDirty) + { + return _rect; + } + + _isDirty = false; + + var flag = false; + var minX = int.MaxValue; + var minY = int.MaxValue; + var maxX = int.MinValue; + var maxY = int.MinValue; + foreach (var pair1 in _map) + { + var x = pair1.Key; + foreach (var pair2 in pair1.Value) + { + var y = pair2.Key; + minX = Mathf.Min(x, minX); + minY = Mathf.Min(y, minY); + maxX = Mathf.Max(x, maxX); + maxY = Mathf.Max(y, maxY); + flag = true; + } + } + + if (!flag) + { + return new Rect2I(); + } + + _rect = new Rect2I(minX, minY, maxX - minX + 1, maxY - minY + 1); + return _rect; + } } diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityId.cs b/DungeonShooting_Godot/src/framework/activity/ActivityId.cs index f4232b5..44068c1 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityId.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityId.cs @@ -5,75 +5,8 @@ public static class ActivityId { /// - /// 测试单位 - /// - public const string Test = "test"; - /// - /// 角色 - /// - public const string Role = "role"; - /// - /// 敌人 - /// - public const string Enemy = "enemy"; - /// - /// 武器 - /// - public const string Weapon = "weapon"; - /// - /// 子弹 - /// - public const string Bullet = "bullet"; - /// - /// 弹壳 - /// - public const string Shell = "shell"; - /// - /// 特效 - /// - public const string Effect = "effect"; - /// - /// 道具 - /// - public const string Prop = "prop"; - /// - /// 其他类型 - /// - public const string Other = "other"; - - /// /// 根据 ActivityType 中的枚举类型获取类型名称的字符串 /// - public static string GetIdPrefix(ActivityType activityType) - { - switch (activityType) - { - case ActivityType.None: - return ""; - case ActivityType.Test: - return Test; - case ActivityType.Role: - case ActivityType.Player: - return Role; - case ActivityType.Enemy: - return Enemy; - case ActivityType.Weapon: - return Weapon; - case ActivityType.Bullet: - return Bullet; - case ActivityType.Shell: - return Shell; - case ActivityType.Effect: - return Effect; - case ActivityType.Prop: - return Prop; - case ActivityType.Other: - return Other; - } - - return ""; - } - public static string GetTypeName(ActivityType activityType) { switch (activityType) @@ -97,6 +30,8 @@ return "特效"; case ActivityType.Prop: return "道具"; + case ActivityType.Treasure: + return "宝箱"; case ActivityType.Other: return "其他"; } diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityInstance.cs b/DungeonShooting_Godot/src/framework/activity/ActivityInstance.cs new file mode 100644 index 0000000..4fad3a7 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/activity/ActivityInstance.cs @@ -0,0 +1,325 @@ + +using System; +using System.IO; +using Godot; + +/// +/// 用于在预制场景中创建 ActivityObject +/// +[Tool] +public partial class ActivityInstance : Node2D +{ + /// + /// 物体Id + /// + [Export] + public string Id + { + get => _id; + set + { + _id = value; + _dirty = true; + } + } + + /// + /// 默认所在层级 + /// + [Export] + public RoomLayerEnum DefaultLayer { get; set; } = RoomLayerEnum.NormalLayer; + + /// + /// 是否显示阴影 + /// + [Export] + public bool ShowShadow + { + get => _showShadow; + set + { + _showShadow = value; + if (_activityObject != null) + { + if (value) + { + _activityObject.ShowShadowSprite(); + } + else + { + _activityObject.HideShadowSprite(); + } + } + } + } + + /// + /// 阴影偏移 + /// + [Export] + public Vector2 ShowOffset + { + get => _showOffset; + set + { + _showOffset = value; + if (_activityObject != null) + { + _activityObject.ShadowOffset = value; + } + } + } + + /// + /// 初始海拔高度 + /// + [Export] + public float Altitude + { + get => _altitude; + set + { + _altitude = value; + if (_activityObject != null) + { + _activityObject.Altitude = value; + _activityObject.Collision.Position = _collPos; + _activityObject.UpdateShadowSprite((float)GetProcessDeltaTime()); + _activityObject.CalcThrowAnimatedPosition(); + } + } + } + + /// + /// 是否启用垂直运动模拟 + /// + [Export] + public bool VerticalMotion { get; private set; } = true; + + /// + /// 编辑器属性, 物体子碰撞器在编辑器中是否可见 + /// + [Export] + public bool CollisionVisible + { + get => _collisionVisible; + set + { + _collisionVisible = value; + OnChangeCollisionVisible(); + } + } + + private bool _dirty = false; + private bool _collisionVisible = true; + private string _prevId; + private string _id; + private ActivityObject _activityObject; + private Sprite2D _errorSprite; + private bool _showShadow = true; + private Vector2 _showOffset = new Vector2(0, 2); + private float _altitude; + + private Vector2 _collPos; + private bool _createFlag = false; + + private static string _jsonText; + + public override void _Ready() + { +#if TOOLS + if (!Engine.IsEditorHint()) + { +#endif + var world = World.Current; + if (world != null && world.YSortLayer != null && world.NormalLayer != null) + { + DoCreateObject(); + } +#if TOOLS + } +#endif + } + + public override void _Process(double delta) + { +#if TOOLS + if (Engine.IsEditorHint()) + { + if (_dirty || (_activityObject != null && _activityObject.GetParent() != this)) + { + _dirty = false; + + if (_prevId != _id) + { + OnChangeActivityId(_id); + } + else if (string.IsNullOrEmpty(_id)) + { + ShowErrorSprite(); + } + + OnChangeCollisionVisible(); + } + + if (_activityObject != null) + { + _activityObject.Collision.Position = _collPos; + _activityObject.UpdateShadowSprite((float)delta); + _activityObject.CalcThrowAnimatedPosition(); + } + } + else + { +#endif + var world = World.Current; + if (world != null && world.YSortLayer != null && world.NormalLayer != null) + { + DoCreateObject(); + } +#if TOOLS + } +#endif + } + + public override void _EnterTree() + { +#if TOOLS + if (Engine.IsEditorHint()) + { + var children = GetChildren(); + foreach (var child in children) + { + child.QueueFree(); + } + _dirty = true; + _activityObject = null; + _prevId = null; + } +#endif + } + + public override void _ExitTree() + { +#if TOOLS + if (Engine.IsEditorHint() && _activityObject != null) + { + _activityObject.QueueFree(); + _activityObject = null; + } +#endif + } + + private void DoCreateObject() + { + if (_createFlag) + { + return; + } + + _createFlag = true; + var activityObject = ActivityObject.Create(Id); + activityObject.Position = GlobalPosition; + activityObject.Scale = GlobalScale; + activityObject.Rotation = GlobalRotation; + activityObject.Name = Name; + activityObject.Visible = Visible; + activityObject.ShadowOffset = _showOffset; + activityObject.Altitude = _altitude; + activityObject.EnableVerticalMotion = VerticalMotion; + activityObject.PutDown(DefaultLayer, _showShadow); + QueueFree(); + } + + private void OnChangeActivityId(string id) + { + _prevId = id; + + if (_activityObject != null) + { + _activityObject.QueueFree(); + _activityObject = null; + } + + if (string.IsNullOrEmpty(id)) + { + GD.Print("删除物体"); + ShowErrorSprite(); + return; + } + + if (_jsonText == null) + { + _jsonText = File.ReadAllText("resource/config/ActivityBase.json"); + } + var str = $"\"Id\": \"{id}\","; + var index = _jsonText.IndexOf(str, StringComparison.Ordinal); + if (index > -1) + { + const string s = "\"Prefab\": \""; + var startIndex = _jsonText.IndexOf(s, index, StringComparison.Ordinal); + if (startIndex > -1) + { + var endIndex = _jsonText.IndexOf('"', startIndex + s.Length + 1); + if (endIndex > -1) + { + var prefab = _jsonText.Substring(startIndex + s.Length, endIndex - (startIndex + s.Length)); + GD.Print("创建物体: " + id); + var instance = ResourceManager.LoadAndInstantiate(prefab); + _activityObject = instance; + _collPos = instance.Collision.Position - instance.AnimatedSprite.Position - instance.AnimatedSprite.Offset; + Debug.Log("_collPos: " + _collPos); + instance.IsCustomShadowSprite = instance.ShadowSprite.Texture != null; + instance.Altitude = _altitude; + instance.ShadowOffset = _showOffset; + if (_showShadow) + { + instance.ShowShadowSprite(); + } + AddChild(instance); + HideErrorSprite(); + return; + } + } + } + GD.PrintErr($"未找到Id为'{id}'的物体!"); + ShowErrorSprite(); + } + + private void OnChangeCollisionVisible() + { + if (_activityObject != null) + { + Utils.EachNode(_activityObject, node => + { + if (node is CollisionShape2D collisionShape2D) + { + collisionShape2D.Visible = _collisionVisible; + } + else if (node is CollisionPolygon2D collisionPolygon2D) + { + collisionPolygon2D.Visible = _collisionVisible; + } + }); + } + } + + private void ShowErrorSprite() + { + if (_errorSprite == null) + { + _errorSprite = new Sprite2D(); + _errorSprite.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Error_mini_png); + AddChild(_errorSprite); + } + } + + private void HideErrorSprite() + { + if (_errorSprite != null) + { + _errorSprite.QueueFree(); + _errorSprite = null; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index acf87b7..e5b5a58 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -75,7 +75,7 @@ /// 阴影偏移 /// [Export] - public Vector2 ShadowOffset { get; protected set; } = new Vector2(0, 2); + public Vector2 ShadowOffset { get; set; } = new Vector2(0, 2); /// /// 移动控制器 @@ -126,6 +126,11 @@ } /// + /// 下坠逻辑是否执行完成 + /// + public bool IsFallOver => _isFallOver; + + /// /// 是否正在投抛过程中 /// public bool IsThrowing => VerticalSpeed != 0 && !_isFallOver; @@ -161,12 +166,6 @@ private float _verticalSpeed; /// - /// 投抛状态下物体碰撞器大小, 如果 (x, y) 都小于 0, 则默认使用 AnimatedSprite 的默认动画第一帧的大小 - /// - [Export] - public Vector2 ThrowCollisionSize { get; set; } = new Vector2(-1, -1); - - /// /// 是否启用垂直方向上的运动模拟, 默认开启, 如果禁用, 那么下落和投抛效果, 同样 Throw() 函数也将失效 /// public bool EnableVerticalMotion { get; set; } = true; @@ -206,11 +205,11 @@ /// 物体材质数据 /// public ExcelConfig.ActivityMaterial ActivityMaterial { get; private set; } - + /// /// 所在的 World 对象 /// - public World World { get; private set; } + public World World { get; set; } /// /// 是否开启描边 @@ -246,7 +245,7 @@ /// /// 是否是自定义阴影纹理 /// - public bool IsCustomShadowSprite { get; private set; } + public bool IsCustomShadowSprite { get; set; } /// /// 记录绘制液体的笔刷上一次绘制的位置
@@ -254,6 +253,16 @@ ///
public Vector2I? BrushPrevPosition { get; set; } + /// + /// 默认所在层级 + /// + public RoomLayerEnum DefaultLayer { get; set; } + + /// + /// 投抛状态下的碰撞器层级 + /// + public uint ThrowCollisionMask { get; set; } = PhysicsLayer.Wall; + // -------------------------------------------------------------------------------- //是否正在调用组件 Update 函数 @@ -278,9 +287,6 @@ //存储投抛该物体时所产生的数据 private readonly ActivityFallData _fallData = new ActivityFallData(); - //所在层级 - private RoomLayerEnum _currLayer; - //标记字典 private Dictionary _signMap; @@ -296,9 +302,6 @@ //下坠是否已经结束 private bool _isFallOver = true; - //下坠状态碰撞器形状 - private RectangleShape2D _throwRectangleShape; - //投抛移动速率 private ExternalForce _throwForce; @@ -315,6 +318,12 @@ //击退外力 private ExternalForce _repelForce; + //绑定销毁物体集合 + private HashSet _destroySet; + + //挂载的物体集合 + private HashSet _mountObjects; + // -------------------------------------------------------------------------------- //实例索引 @@ -650,9 +659,9 @@ ///
public virtual void PutDown(RoomLayerEnum layer, bool showShadow = true) { - _currLayer = layer; + DefaultLayer = layer; var parent = GetParent(); - var root = GameApplication.Instance.World.GetRoomLayer(layer); + var root = World.Current.GetRoomLayer(layer); if (parent != root) { if (parent != null) @@ -705,17 +714,6 @@ /// 旋转速度 public void Throw(float altitude, float verticalSpeed, Vector2 velocity, float rotateSpeed) { - var parent = GetParent(); - if (parent == null) - { - GameApplication.Instance.World.YSortLayer.AddChild(this); - } - else if (parent != GameApplication.Instance.World.YSortLayer) - { - parent.RemoveChild(this); - GameApplication.Instance.World.YSortLayer.AddChild(this); - } - Altitude = altitude; //Position = Position + new Vector2(0, altitude); VerticalSpeed = verticalSpeed; @@ -1118,8 +1116,8 @@ _altitude += VerticalSpeed * delta; _verticalSpeed -= GameConfig.G * ActivityMaterial.GravityScale * delta; - //当高度大于16时, 显示在所有物体上, 并且关闭碰撞 - if (Altitude >= 16) + //当高度大于32时, 显示在所有物体上, 并且关闭碰撞 + if (Altitude >= 32) { AnimatedSprite.ZIndex = 20; } @@ -1130,7 +1128,7 @@ //动态开关碰撞器 if (ActivityMaterial.DynamicCollision) { - Collision.Disabled = Altitude >= 16; + Collision.Disabled = Altitude >= 32; } //达到最高点 @@ -1363,8 +1361,10 @@ ShadowSprite.GlobalPosition = new Vector2(pos.X + ShadowOffset.X, pos.Y + ShadowOffset.Y + Altitude); } - //计算位置 - private void CalcThrowAnimatedPosition() + /// + /// 计算物体精灵和阴影位置 + /// + public void CalcThrowAnimatedPosition() { if (Scale.Y < 0) { @@ -1387,6 +1387,16 @@ { return; } + + if (_mountObjects != null) + { + foreach (var item in _mountObjects) + { + item.OnUnmount(this); + } + + _mountObjects = null; + } IsDestroyed = true; if (AffiliationArea != null) @@ -1409,6 +1419,16 @@ } _components.Clear(); + + if (_destroySet != null) + { + foreach (var destroy in _destroySet) + { + destroy.Destroy(); + } + + _destroySet = null; + } } /// @@ -1430,6 +1450,19 @@ } /// + /// 获取投抛该物体时所产生的数据, 只在 IsFallOver 为 false 时有效 + /// + public ActivityFallData GetFallData() + { + if (!IsFallOver && !_fallData.UseOrigin) + { + return _fallData; + } + + return null; + } + + /// /// 触发投抛动作 /// private void Throw() @@ -1440,10 +1473,9 @@ { this.AddToActivityRoot(RoomLayerEnum.YSortLayer); } - else if (parent == GameApplication.Instance.World.NormalLayer) + else if (parent != World.Current.YSortLayer) { - parent.RemoveChild(this); - this.AddToActivityRoot(RoomLayerEnum.YSortLayer); + Reparent(World.Current.YSortLayer); } CalcThrowAnimatedPosition(); @@ -1461,7 +1493,7 @@ /// private void SetFallCollision() { - if (_fallData != null && _fallData.UseOrigin) + if (_fallData.UseOrigin) { _fallData.OriginShape = Collision.Shape; _fallData.OriginPosition = Collision.Position; @@ -1476,12 +1508,6 @@ _fallData.OriginCollisionMask = CollisionMask; _fallData.OriginCollisionLayer = CollisionLayer; - if (_throwRectangleShape == null) - { - _throwRectangleShape = new RectangleShape2D(); - } - - Collision.Shape = _throwRectangleShape; Collision.Position = Vector2.Zero; Collision.Rotation = 0; Collision.Scale = Vector2.One; @@ -1490,7 +1516,7 @@ Collision.Position = Vector2.Zero; Collision.Rotation = 0; Collision.Scale = Vector2.One; - CollisionMask = 1; + CollisionMask = ThrowCollisionMask; CollisionLayer = _fallData.OriginCollisionLayer | PhysicsLayer.Throwing; _fallData.UseOrigin = false; } @@ -1501,7 +1527,7 @@ ///
private void RestoreCollision() { - if (_fallData != null && !_fallData.UseOrigin) + if (!_fallData.UseOrigin) { Collision.Shape = _fallData.OriginShape; Collision.Position = _fallData.OriginPosition; @@ -1526,7 +1552,7 @@ private void ThrowOver() { var parent = GetParent(); - var roomLayer = GameApplication.Instance.World.GetRoomLayer(_currLayer); + var roomLayer = World.Current.GetRoomLayer(DefaultLayer); if (parent != roomLayer) { parent.RemoveChild(this); @@ -1546,15 +1572,6 @@ _firstFall = true; _hasResilienceVerticalSpeed = false; _resilienceVerticalSpeed = 0; - - if (ThrowCollisionSize.X < 0 && ThrowCollisionSize.Y < 0) - { - _throwRectangleShape.Size = GetDefaultTexture().GetSize(); - } - else - { - _throwRectangleShape.Size = ThrowCollisionSize; - } Throw(); } @@ -1754,7 +1771,7 @@ /// /// 设置物体朝向 /// - public void SetFace(FaceDirection face) + public void SetForwardDirection(FaceDirection face) { if ((face == FaceDirection.Left && Scale.X > 0) || (face == FaceDirection.Right && Scale.X < 0)) { @@ -1848,4 +1865,83 @@ BrushPrevPosition = pos; } } + + /// + /// 绑定可销毁对象, 绑定的物体会在当前物体销毁时触发销毁 + /// + public void AddDestroyObject(IDestroy destroy) + { + if (_destroySet == null) + { + _destroySet = new HashSet(); + } + + _destroySet.Add(destroy); + } + + /// + /// 移除绑定可销毁对象 + /// + public void RemoveDestroyObject(IDestroy destroy) + { + if (_destroySet == null) + { + return; + } + + _destroySet.Remove(destroy); + } + + /// + /// 绑定挂载对象, 绑定的物体会在当前物体销毁时触发扔出 + /// + public void AddMountObject(IMountItem target) + { + if (_mountObjects == null) + { + _mountObjects = new HashSet(); + } + + if (_mountObjects.Add(target)) + { + target.OnMount(this); + } + } + + /// + /// 移除绑定挂载对象 + /// + public void RemoveMountObject(IMountItem target) + { + if (_mountObjects == null) + { + return; + } + + if (_mountObjects.Remove(target)) + { + target.OnUnmount(this); + } + } + + /// + /// 设置是否启用碰撞层, 该函数是设置下载状态下原碰撞层 + /// + public void SetOriginCollisionLayerValue(uint layer, bool vale) + { + if (vale) + { + if (!Utils.CollisionMaskWithLayer(_fallData.OriginCollisionLayer, layer)) + { + _fallData.OriginCollisionLayer |= layer; + } + } + else + { + if (Utils.CollisionMaskWithLayer(_fallData.OriginCollisionLayer, layer)) + { + _fallData.OriginCollisionLayer ^= layer; + } + } + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Create.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Create.cs index ebc901a..3805d0f 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Create.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Create.cs @@ -9,10 +9,10 @@ ///
public static ActivityObject Create(ExcelConfig.ActivityBase config) { - var world = GameApplication.Instance.World; + var world = World.Current; if (world == null) { - throw new Exception("实例化 ActivityObject 前请先调用 'GameApplication.Instance.CreateNewWorld()' 初始化 World 对象"); + throw new Exception("实例化 ActivityObject 前请先调用 'GameApplication.Instance.DungeonManager.CreateNewWorld()' 初始化 World 对象"); } var instance = ResourceManager.LoadAndInstantiate(config.Prefab); instance._InitNode(config, world); diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs index cace31a..587de4e 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs @@ -73,7 +73,7 @@ { owner = parent.Owner; } - else if (Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) + else if (EditorInterface.Singleton.GetEditedSceneRoot() == this) { owner = this; } diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs index 79056c5..f872352 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs @@ -69,6 +69,31 @@ ///
public const string Id_weapon0009 = "weapon0009"; /// + /// 名称: M1型热能狙击枪
+ /// 简介: + ///
+ public const string Id_weapon0010 = "weapon0010"; + /// + /// 名称: weapon0011
+ /// 简介: + ///
+ public const string Id_weapon0011 = "weapon0011"; + /// + /// 名称: P90
+ /// 简介: + ///
+ public const string Id_weapon0013 = "weapon0013"; + /// + /// 名称: 左轮
+ /// 简介: + ///
+ public const string Id_weapon0014 = "weapon0014"; + /// + /// 名称: 木质短弓
+ /// 简介: + ///
+ public const string Id_weapon0016 = "weapon0016"; + /// /// 名称:
/// 简介: ///
@@ -94,6 +119,26 @@ /// public const string Id_bullet0005 = "bullet0005"; /// + /// 名称: 拖尾子弹
+ /// 简介: + ///
+ public const string Id_bullet0006 = "bullet0006"; + /// + /// 名称:
+ /// 简介: + ///
+ public const string Id_bullet0007 = "bullet0007"; + /// + /// 名称:
+ /// 简介: + ///
+ public const string Id_bullet0008 = "bullet0008"; + /// + /// 名称: 弓箭
+ /// 简介: + ///
+ public const string Id_bullet0009 = "bullet0009"; + /// /// 名称:
/// 简介: ///
@@ -204,6 +249,11 @@ /// public const string Id_prop5001 = "prop5001"; /// + /// 名称: 木质宝箱
+ /// 简介: 木质宝箱 + ///
+ public const string Id_treasure_box0001 = "treasure_box0001"; + /// /// 名称:
/// 简介: 地牢房间的门(东侧) ///
@@ -223,5 +273,20 @@ /// 简介: 地牢房间的门(北侧) /// public const string Id_other_door_n = "other_door_n"; + /// + /// 名称: 金币
+ /// 简介: 获得10金币 + ///
+ public const string Id_gold_10 = "gold_10"; + /// + /// 名称: 银币
+ /// 简介: 获得5金币 + ///
+ public const string Id_gold_5 = "gold_5"; + /// + /// 名称: 铜币
+ /// 简介: 获得1金币 + ///
+ public const string Id_gold_1 = "gold_1"; } } diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityQuality.cs b/DungeonShooting_Godot/src/framework/activity/ActivityQuality.cs new file mode 100644 index 0000000..9d5641d --- /dev/null +++ b/DungeonShooting_Godot/src/framework/activity/ActivityQuality.cs @@ -0,0 +1,39 @@ + +/// +/// 物体品质 +/// +public enum ActivityQuality +{ + /// + /// 未设置 + /// + None = 0, + /// + /// 通用物品 + /// + Common = 1, + /// + /// 基础 + /// + Basic = 2, + /// + /// 普通 + /// + Ordinary = 3, + /// + /// 稀有 + /// + Rare = 4, + /// + /// 史诗 + /// + Epic = 5, + /// + /// 传说 + /// + Legend = 6, + /// + /// 独一无二 + /// + Unique = 7 +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityType.cs b/DungeonShooting_Godot/src/framework/activity/ActivityType.cs index 3a82149..d094992 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityType.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityType.cs @@ -45,6 +45,10 @@ /// Prop, /// + /// 宝箱 + /// + Treasure, + /// /// 其它类型 /// Other = 99, diff --git a/DungeonShooting_Godot/src/framework/activity/CheckInteractiveResult.cs b/DungeonShooting_Godot/src/framework/activity/CheckInteractiveResult.cs index 99b1296..fb38e21 100644 --- a/DungeonShooting_Godot/src/framework/activity/CheckInteractiveResult.cs +++ b/DungeonShooting_Godot/src/framework/activity/CheckInteractiveResult.cs @@ -20,6 +20,14 @@ /// 替换 /// Replace, + /// + /// 打开宝箱 + /// + OpenTreasureBox, + /// + /// 其他互动类型 + /// + Other, } /// diff --git a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs index ef0f435..0f51b39 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs @@ -382,29 +382,32 @@ var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f); newVelocity = finallyEf.Reflect(no); var rotation = newVelocity.Angle(); - - if (Master.ActivityMaterial.RotationType == 1) //跟着反弹角度 - { - Rotation = rotation; - } - else if (Master.ActivityMaterial.RotationType == 2) //跟着反弹角度, 带垂直角度 - { - Rotation = rotation; - AnimatedSprite.Rotation = new Vector2(newVelocity.X, newVelocity.Y - Master.VerticalSpeed).Angle() - rotation; - } - var length = _forceList.Count; - if (length != 0) - { - var v = newVelocity / (length / Master.ActivityMaterial.BounceStrength); - for (var i = 0; i < _forceList.Count; i++) - { - _forceList[i].Velocity = v; - } - } - //调用反弹函数 Master.OnBounce(rotation); + + if (Enable && !Master.IsDestroyed) + { + if (Master.ActivityMaterial.RotationType == 1) //跟着反弹角度 + { + Rotation = rotation; + } + else if (Master.ActivityMaterial.RotationType == 2) //跟着反弹角度, 带垂直角度 + { + Rotation = rotation; + AnimatedSprite.Rotation = new Vector2(newVelocity.X, newVelocity.Y - Master.VerticalSpeed).Angle() - rotation; + } + + var length = _forceList.Count; + if (length != 0) + { + var v = newVelocity / (length / Master.ActivityMaterial.BounceStrength); + for (var i = 0; i < _forceList.Count; i++) + { + _forceList[i].Velocity = v; + } + } + } } else //没有撞到物体 { diff --git a/DungeonShooting_Godot/src/framework/activity/hurt/HurtArea.cs b/DungeonShooting_Godot/src/framework/activity/hurt/HurtArea.cs new file mode 100644 index 0000000..8631faa --- /dev/null +++ b/DungeonShooting_Godot/src/framework/activity/hurt/HurtArea.cs @@ -0,0 +1,29 @@ +using Godot; + +[Tool] +public partial class HurtArea : Area2D, IHurt +{ + public delegate void HurtDelegate(ActivityObject target, int damage, float angle); + + public event HurtDelegate OnHurtEvent; + + public ActivityObject ActivityObject { get; private set; } + + public void InitActivityObject(ActivityObject activityObject) + { + ActivityObject = activityObject; + } + + public override void _Ready() + { + Monitoring = false; + } + + public void Hurt(ActivityObject target, int damage, float angle) + { + if (OnHurtEvent != null) + { + OnHurtEvent(target, damage, angle); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/hurt/IHurt.cs b/DungeonShooting_Godot/src/framework/activity/hurt/IHurt.cs new file mode 100644 index 0000000..fd27abc --- /dev/null +++ b/DungeonShooting_Godot/src/framework/activity/hurt/IHurt.cs @@ -0,0 +1,13 @@ + +using Godot; + +public interface IHurt +{ + /// + /// 受到伤害 + /// + /// 触发伤害的对象, 为 null 表示不存在对象或者对象已经被销毁 + /// 伤害的量 + /// 伤害角度(弧度制) + void Hurt(ActivityObject target, int damage, float angle); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/mount/IMountItem.cs b/DungeonShooting_Godot/src/framework/activity/mount/IMountItem.cs new file mode 100644 index 0000000..bf2c397 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/activity/mount/IMountItem.cs @@ -0,0 +1,16 @@ + +/// +/// 可被 ActivityObject 挂载的物体 +/// +public interface IMountItem +{ + /// + /// 挂载到 ActivityObject 时调用 + /// + void OnMount(ActivityObject target); + + /// + /// 从 ActivityObject 卸载时调用 + /// + void OnUnmount(ActivityObject target); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/DragButtonEnum.cs b/DungeonShooting_Godot/src/framework/common/DragButtonEnum.cs new file mode 100644 index 0000000..329b5e1 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/common/DragButtonEnum.cs @@ -0,0 +1,22 @@ + +using System; + +/// +/// 用于拖拽的鼠标键位 +/// +[Flags] +public enum DragButtonEnum +{ + /// + /// 鼠标左键 + /// + Left = 0b1, + /// + /// 鼠标右键 + /// + Right = 0b10, + /// + /// 鼠标中键 + /// + Middle = 0b100, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/DragState.cs b/DungeonShooting_Godot/src/framework/common/DragState.cs new file mode 100644 index 0000000..04f4fb0 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/common/DragState.cs @@ -0,0 +1,19 @@ + +/// +/// 拖拽状态 +/// +public enum DragState +{ + /// + /// 拖拽开始 + /// + DragStart, + /// + /// 拖拽中 + /// + DragMove, + /// + /// 拖拽结束 + /// + DragEnd +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/NodeExtend.cs b/DungeonShooting_Godot/src/framework/common/NodeExtend.cs index e9988f0..e04437d 100644 --- a/DungeonShooting_Godot/src/framework/common/NodeExtend.cs +++ b/DungeonShooting_Godot/src/framework/common/NodeExtend.cs @@ -8,47 +8,51 @@ public static class NodeExtend { /// - /// 尝试将一个 Node2d 节点转换成一个 ActivityObject 对象, 如果转换失败, 则返回 null + /// 获取 IHurt 绑定的 ActivityObject, 没有则返回 null /// - public static ActivityObject AsActivityObject(this Node2D node2d) + /// + /// + public static ActivityObject GetActivityObject(this IHurt hurt) { - if (node2d is ActivityObject p) + if (hurt is ActivityObject activityObject) { - return p; + return activityObject; } - var parent = node2d.GetParent(); - if (parent != null && parent is ActivityObject p2) + + if (hurt is HurtArea hurtArea) { - return p2; + return hurtArea.ActivityObject; } - return null; - } - - /// - /// 尝试将一个 Node2d 节点转换成一个 ActivityObject 对象, 如果转换失败, 则返回 null - /// - public static T AsActivityObject(this Node2D node2d) where T : ActivityObject - { - if (node2d is T p) - { - return p; - } - var parent = node2d.GetParent(); - if (parent != null && parent is T p2) - { - return p2; - } + return null; } /// + /// 获取 IHurt 节点的坐标 + /// + public static Vector2 GetPosition(this IHurt hurt) + { + if (hurt is ActivityObject role) + { + return role.GetCenterPosition(); + } + + if (hurt is Node2D node2D) + { + return node2D.GlobalPosition; + } + + return Vector2.Zero; + } + + /// /// 将节点插入的房间物体根节点 /// /// 实例 /// 放入的层 public static void AddToActivityRoot(this Node2D node, RoomLayerEnum layer) { - GameApplication.Instance.World.GetRoomLayer(layer).AddChild(node); + GameApplication.Instance.DungeonManager.CurrWorld.GetRoomLayer(layer).AddChild(node); } /// @@ -58,7 +62,7 @@ /// 放入的层 public static void AddToActivityRootDeferred(this Node2D node, RoomLayerEnum layer) { - GameApplication.Instance.World.GetRoomLayer(layer).CallDeferred(Node.MethodName.AddChild, node); + World.Current.GetRoomLayer(layer).CallDeferred(Node.MethodName.AddChild, node); } /// @@ -83,6 +87,21 @@ { return (control.SizeFlagsHorizontal & Control.SizeFlags.Expand) != 0; } + + /// + /// 返回鼠标是否在Ui矩形内 + /// + public static bool IsMouseInRect(this Control control, float border = 0) + { + var pos = control.GetLocalMousePosition(); + if (pos.X < border || pos.Y < border) + { + return false; + } + + var size = control.Size; + return pos.X <= size.X - border && pos.Y <= size.Y - border; + } /// /// 设置是否启用节点 @@ -189,4 +208,107 @@ yield return new WaitForSeconds(delayTime); cb(arg1,arg2, arg3); } + + /// + /// 给Ui节点添加拖拽事件 + /// + /// 需要绑定事件的节点对象 + /// 拖拽回调函数 + public static UiEventBinder AddDragListener(this Control control, Action callback) + { + return AddDragListener(control, DragButtonEnum.Left, callback); + } + + /// + /// 给Ui节点添加拖拽事件 + /// + /// 需要绑定拖拽的节点对象 + /// 可触发拖拽的按钮 + /// 拖拽回调函数 + public static UiEventBinder AddDragListener(this Control control, DragButtonEnum triggerButton, Action callback) + { + var dragFlag = false; + Control.GuiInputEventHandler handler = (ev) => + { + if (!dragFlag) //未开始拖拽 + { + if (ev is InputEventMouseButton mouseButton && mouseButton.Pressed && + CheckDragButton(mouseButton.ButtonIndex, triggerButton)) //按下按钮 + { + control.AcceptEvent(); + dragFlag = true; + callback(DragState.DragStart, Vector2.Zero); + } + } + else //拖拽中 + { + if (ev is InputEventMouseButton mouseButton) + { + if (!mouseButton.Pressed && CheckDragButton(mouseButton.ButtonIndex, triggerButton)) //松开按钮 + { + control.AcceptEvent(); + dragFlag = false; + callback(DragState.DragEnd, Vector2.Zero); + } + } else if (ev is InputEventMouseMotion mouseMotion) //拖拽中 + { + control.AcceptEvent(); + var delta = mouseMotion.Relative; + if (delta != Vector2.Zero) + { + callback(DragState.DragMove, mouseMotion.Relative); + } + } + } + }; + control.GuiInput += handler; + return new UiEventBinder(control, handler); + } + + private static bool CheckDragButton(MouseButton button, DragButtonEnum triggerButton) + { + DragButtonEnum buttonEnum; + switch (button) + { + case MouseButton.Left: + buttonEnum = DragButtonEnum.Left; + break; + case MouseButton.Right: + buttonEnum = DragButtonEnum.Right; + break; + case MouseButton.Middle: + buttonEnum = DragButtonEnum.Middle; + break; + default: return false; + } + + return (buttonEnum & triggerButton) != 0; + } + + /// + /// 给Ui节点添加鼠标滚轮事件 + /// + /// 需要绑定事件的节点对象 + /// 滚轮回调, 参数 -1 表示滚轮向下滚动, 1 表示滚轮向上滚动 + public static UiEventBinder AddMouseWheelListener(this Control control, Action callback) + { + Control.GuiInputEventHandler handler = (ev) => + { + if (ev is InputEventMouseButton mouseButton) + { + if (mouseButton.ButtonIndex == MouseButton.WheelDown) + { + control.AcceptEvent(); + callback(-1); + } + else if (mouseButton.ButtonIndex == MouseButton.WheelUp) + { + control.AcceptEvent(); + callback(1); + } + } + }; + control.GuiInput += handler; + return new UiEventBinder(control, handler); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs index 11acb6f..20e88c5 100644 --- a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs +++ b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs @@ -192,77 +192,73 @@ /// /// 返回指定区域内的随机坐标点, 该函数比较慢, 请谨慎调用 /// - /// 碰撞区域数据 - /// 需要随机点的数量 - public Vector2[] GetRandomPositionInPolygon(List polygonDataList, int count) + public Vector2[] GetRandomPositionInPolygon(List vertices, List polygons, int count) { + if (vertices.Count == 0 || polygons.Count == 0) + { + return Vector2.Zero.MakeArray(count); + } var minX = int.MaxValue; var maxX = int.MinValue; var minY = int.MaxValue; var maxY = int.MinValue; - - var outCount = 0; // 遍历多边形的顶点,找到最小和最大的x、y坐标 - foreach (var navigationPolygonData in polygonDataList) + foreach (var vertex in vertices) { - if (navigationPolygonData.Type == NavigationPolygonType.Out) + if (vertex.X < minX) { - outCount++; + minX = Mathf.CeilToInt(vertex.X); } - foreach (var vertex in navigationPolygonData.GetPoints()) + else if (vertex.X > maxX) { - if (vertex.X < minX) - { - minX = Mathf.CeilToInt(vertex.X); - } - else if (vertex.X > maxX) - { - maxX = Mathf.FloorToInt(vertex.X); - } - if (vertex.Y < minY) - { - minY = Mathf.CeilToInt(vertex.Y); - } - else if (vertex.Y > maxY) - { - maxY = Mathf.FloorToInt(vertex.Y); - } + maxX = Mathf.FloorToInt(vertex.X); + } + if (vertex.Y < minY) + { + minY = Mathf.CeilToInt(vertex.Y); + } + else if (vertex.Y > maxY) + { + maxY = Mathf.FloorToInt(vertex.Y); } } var list = new List(); + var tryCount = 0; while (true) { - var flag = outCount == 0; - var point = new Vector2(RandomRangeInt(minX, maxX), RandomRangeInt(minY, maxY)); - - foreach (var navigationPolygonData in polygonDataList) + if (tryCount >= 2000) //尝试2000次后放弃 { - if (navigationPolygonData.Type == NavigationPolygonType.Out) + while (list.Count < count) { - if (!flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point)) - { - flag = true; - } + list.Add(Vector2.Zero); } - else - { - if (flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point)) - { - flag = false; - } - } + break; } - if (flag) + tryCount++; + var point = new Vector2(RandomRangeInt(minX, maxX), RandomRangeInt(minY, maxY)); + foreach (var ps in polygons) { - list.Add(point); - if (list.Count >= count) + var arr = new List(); + foreach (var i in ps) { - return list.ToArray(); + arr.Add(vertices[i]); + } + + if (Utils.IsPointInPolygon(arr, point)) + { + tryCount = 0; + list.Add(point); + if (list.Count >= count) + { + return list.ToArray(); + } } } } + + return list.ToArray(); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/UiEventBinder.cs b/DungeonShooting_Godot/src/framework/common/UiEventBinder.cs new file mode 100644 index 0000000..37ff894 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/common/UiEventBinder.cs @@ -0,0 +1,26 @@ + +using Godot; + +/// +/// Ui事件绑定数据对象 +/// +public class UiEventBinder +{ + + private Control Control; + private Control.GuiInputEventHandler Callback; + + public UiEventBinder(Control control, Control.GuiInputEventHandler callback) + { + Control = control; + Callback = callback; + } + + /// + /// 解除绑定事件 + /// + public void UnBind() + { + Control.GuiInput -= Callback; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/common/Utils.cs b/DungeonShooting_Godot/src/framework/common/Utils.cs index b102450..07b4751 100644 --- a/DungeonShooting_Godot/src/framework/common/Utils.cs +++ b/DungeonShooting_Godot/src/framework/common/Utils.cs @@ -1,4 +1,8 @@ +using System; +using System.Collections.Generic; +using System.Linq; using Godot; +using UI.TileSetEditorCombination; /// /// 常用函数工具类 @@ -8,9 +12,12 @@ /// /// 默认随机数对象 /// - public static SeedRandom Random { get; } + public static SeedRandom Random { get; private set; } - static Utils() + /// + /// 初始化随机种子 + /// + public static void InitRandom() { Random = new SeedRandom(); Debug.Log("随机种子为: ", Random.Seed); @@ -45,36 +52,6 @@ { return (mask & layer) != 0; } - - /// - /// 使用定的 canvasItem 绘制导航区域, 注意, 该函数只能在 draw 函数中调用 - /// - public static void DrawNavigationPolygon(CanvasItem canvasItem, NavigationPolygonData[] polygonData, float width = 1) - { - for (var i = 0; i < polygonData.Length; i++) - { - var item = polygonData[i]; - var points = item.GetPoints(); - if (points.Length>= 2) - { - var array = new Vector2[points.Length + 1]; - for (var j = 0; j < points.Length; j++) - { - array[j] = points[j]; - } - - array[array.Length - 1] = points[0]; - if (item.Type == NavigationPolygonType.In) - { - canvasItem.DrawPolyline(array, Colors.Orange, width); - } - else - { - canvasItem.DrawPolyline(array, Colors.Orange, width); - } - } - } - } /// /// 将一个任意角度转为0到360度 @@ -96,7 +73,7 @@ /// /// 原数值 /// 吸附步长 - public static float Adsorption(float value, float step) + public static float Adsorption(this float value, float step) { var f = Mathf.Round(value / step); return f * step; @@ -107,7 +84,7 @@ /// /// 原数值 /// 吸附步长 - public static int Adsorption(float value, int step) + public static int Adsorption(this float value, int step) { var f = Mathf.RoundToInt(value / step); return f * step; @@ -118,7 +95,7 @@ /// /// 原数值 /// 吸附步长 - public static Vector2 Adsorption(Vector2 value, Vector2 step) + public static Vector2 Adsorption(this Vector2 value, Vector2 step) { var x = Mathf.Round(value.X / step.X); var y = Mathf.Round(value.Y / step.Y); @@ -130,12 +107,58 @@ /// /// 原数值 /// 吸附步长 - public static Vector2I Adsorption(Vector2 value, Vector2I step) + public static Vector2I Adsorption(this Vector2 value, Vector2I step) { var x = Mathf.RoundToInt(value.X / step.X); var y = Mathf.RoundToInt(value.Y / step.Y); return new Vector2I(x * step.X, y * step.Y); } + + /// + /// 根据步长按照 Floor() 函数吸附值 + /// + /// 原数值 + /// 吸附步长 + public static float FloorAdsorption(this float value, float step) + { + var f = Mathf.Floor(value / step); + return f * step; + } + + /// + /// 根据步长按照 Floor() 函数吸附值 + /// + /// 原数值 + /// 吸附步长 + public static int FloorAdsorption(this float value, int step) + { + var f = Mathf.FloorToInt(value / step); + return f * step; + } + + /// + /// 根据步长按照 Floor() 函数吸附值 + /// + /// 原数值 + /// 吸附步长 + public static Vector2 FloorAdsorption(this Vector2 value, Vector2 step) + { + var x = Mathf.Floor(value.X / step.X); + var y = Mathf.Floor(value.Y / step.Y); + return new Vector2(x * step.X, y * step.Y); + } + + /// + /// 根据步长按照 Floor() 函数吸附值 + /// + /// 原数值 + /// 吸附步长 + public static Vector2I FloorAdsorption(this Vector2 value, Vector2I step) + { + var x = Mathf.FloorToInt(value.X / step.X); + var y = Mathf.FloorToInt(value.Y / step.Y); + return new Vector2I(x * step.X, y * step.Y); + } /// /// 字符串首字母小写 @@ -162,17 +185,6 @@ } /// - /// 返回指定坐标是否在UI节范围点内 - /// - public static bool IsPositionOver(this Control control, Vector2 position) - { - var globalPosition = control.GlobalPosition; - var size = control.Size * control.Scale; - return position.X >= globalPosition.X && position.X <= (globalPosition.X + size.X) && - position.Y >= globalPosition.Y && position.Y <= (globalPosition.Y + size.Y); - } - - /// /// 判断点是否在区域内 /// public static bool IsPositionInRect(Vector2 pos, Rect2 rect2) @@ -290,6 +302,27 @@ return isInside; } + + /// + /// 返回一个点是否在 Polygon 内部 + /// + /// 多边形顶点 + /// 目标点 + public static bool IsPointInPolygon(List polygon, Vector2 point) + { + var isInside = false; + for (int i = 0, j = polygon.Count - 1; i < polygon.Count; j = i++) + { + if ((polygon[i].Y > point.Y) != (polygon[j].Y > point.Y) && + point.X < (polygon[j].X - polygon[i].X) * (point.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) + + polygon[i].X) + { + isInside = !isInside; + } + } + + return isInside; + } /// /// 根据法线翻转向量 @@ -306,4 +339,239 @@ { return ReflectByNormal(Vector2.FromAngle(rotation), normal).Angle(); } + + /// + /// 计算Vector2点所占用的区域 + /// + public static Rect2I CalcRect(IEnumerable cells) + { + var count = cells.Count(); + if (count == 0) + { + return new Rect2I(); + } + //单位: 像素 + var canvasXStart = int.MaxValue; + var canvasYStart = int.MaxValue; + var canvasXEnd = int.MinValue; + var canvasYEnd = int.MinValue; + + foreach (var pos in cells) + { + canvasXStart = Mathf.Min(pos.X, canvasXStart); + canvasYStart = Mathf.Min(pos.Y, canvasYStart); + canvasXEnd = Mathf.Max(pos.X + 1, canvasXEnd); + canvasYEnd = Mathf.Max(pos.Y + 1, canvasYEnd); + } + + return new Rect2I( + canvasXStart, + canvasYStart, + canvasXEnd - canvasXStart, + canvasYEnd - canvasYStart + ); + } + + /// + /// 计算TileSet Cell所占用的区域 + /// + public static Rect2I CalcTileRect(IEnumerable cells) + { + //单位: 像素 + var canvasXStart = int.MaxValue; + var canvasYStart = int.MaxValue; + var canvasXEnd = int.MinValue; + var canvasYEnd = int.MinValue; + + foreach (var pos in cells) + { + canvasXStart = Mathf.Min(pos.X, canvasXStart); + canvasYStart = Mathf.Min(pos.Y, canvasYStart); + canvasXEnd = Mathf.Max(pos.X + GameConfig.TileCellSize, canvasXEnd); + canvasYEnd = Mathf.Max(pos.Y + GameConfig.TileCellSize, canvasYEnd); + } + + return new Rect2I( + canvasXStart, + canvasYStart, + canvasXEnd - canvasXStart, + canvasYEnd - canvasYStart + ); + } + + /// + /// 计算TileSet Cell所占用的区域 + /// + public static Rect2I CalcTileRect(IEnumerable cells) + { + //单位: 像素 + var canvasXStart = float.MaxValue; + var canvasYStart = float.MaxValue; + var canvasXEnd = float.MinValue; + var canvasYEnd = float.MinValue; + + foreach (var pos in cells) + { + canvasXStart = Mathf.Min(pos.X, canvasXStart); + canvasYStart = Mathf.Min(pos.Y, canvasYStart); + canvasXEnd = Mathf.Max(pos.X + GameConfig.TileCellSize, canvasXEnd); + canvasYEnd = Mathf.Max(pos.Y + GameConfig.TileCellSize, canvasYEnd); + } + + return new Rect2I( + (int)canvasXStart, + (int)canvasYStart, + (int)(canvasXEnd - canvasXStart), + (int)(canvasYEnd - canvasYStart) + ); + } + + /// + /// 根据鼠标位置执行单步放大逻辑 + /// + public static bool DoMagnifyByMousePosition(Control control, float maxXScale) + { + var offset = control.GetLocalMousePosition(); + var prevScale = control.Scale; + var newScale = prevScale * 1.1f; + if (newScale.X <= maxXScale) + { + control.Scale = newScale; + var position = control.Position - offset * 0.1f * prevScale; + control.Position = position; + return true; + } + + return false; + } + + /// + /// 根据鼠标位置执行单步放大逻辑 + /// + public static bool DoMagnifyByMousePosition(Node2D node, float maxXScale) + { + var offset = node.GetLocalMousePosition(); + var prevScale = node.Scale; + var newScale = prevScale * 1.1f; + if (newScale.X <= maxXScale) + { + node.Scale = newScale; + var position = node.Position - offset * 0.1f * prevScale; + node.Position = position; + return true; + } + + return false; + } + + /// + /// 根据鼠标位置执行单步缩小逻辑 + /// + public static bool DoShrinkByMousePosition(Control control, float minXScale) + { + var offset = control.GetLocalMousePosition(); + var prevScale = control.Scale; + var newScale = prevScale / 1.1f; + if (newScale.X >= minXScale) + { + control.Scale = newScale; + var position = control.Position + offset * 0.1f * newScale; + control.Position = position; + return true; + } + + return false; + } + + /// + /// 根据鼠标位置执行单步缩小逻辑 + /// + public static bool DoShrinkByMousePosition(Node2D node, float minXScale) + { + var offset = node.GetLocalMousePosition(); + var prevScale = node.Scale; + var newScale = prevScale / 1.1f; + if (newScale.X >= minXScale) + { + node.Scale = newScale; + var position = node.Position + offset * 0.1f * newScale; + node.Position = position; + return true; + } + + return false; + } + + /// + /// 聚焦Ui节点 + /// + /// 需要聚焦的节点 + /// 父节点容器大小 + /// 当前节点容器大小 + public static void DoFocusNode(Control control, Vector2 parentSize, Vector2 selfSize) + { + control.Position = parentSize / 2 - selfSize * 0.5f * control.Scale; + } + + /// + /// 返回鼠标所在的单元格位置, 相对于Ui节点左上角 + /// + public static Vector2I GetMouseCellPosition(CanvasItem control) + { + var pos = control.GetLocalMousePosition() / GameConfig.TileCellSize; + return pos.AsVector2I(); + } + + /// + /// 创建一个数组, 并填充该对象 + /// + public static T[] MakeArray(this T data, int len) + { + var arr = new T[len]; + for (var i = 0; i < len; i++) + { + arr[i] = data; + } + return arr; + } + + /// + /// 根据金币数量获取金币对象id数组 + /// + public static string[] GetGoldList(int gold) + { + var list = new List(); + while (gold > 0) + { + if (gold >= 10) + { + list.Add(ActivityObject.Ids.Id_gold_10); + gold -= 10; + } + else if (gold >= 5) + { + list.Add(ActivityObject.Ids.Id_gold_5); + gold -= 5; + } + else + { + list.Add(ActivityObject.Ids.Id_gold_1); + gold -= 1; + } + } + return list.ToArray(); + } + + /// + /// 遍历节点树 + /// + public static void EachNode(Node node, Action action) + { + action(node); + var childCount = node.GetChildCount(); + for (var i = 0; i < childCount; i++) + { + EachNode(node.GetChild(i), action); + } + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs b/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs index d902fe9..e463ddf 100644 --- a/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs +++ b/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs @@ -23,8 +23,8 @@ for (var i = 0; i < pairs.Length; i++) { var item = pairs[i]; - //try - { + // try + // { var canNext = true; if (item.WaitState == CoroutineData.WaitTypeEnum.WaitForSeconds) //等待秒数 @@ -130,7 +130,7 @@ } } } - } + // } // catch (Exception e) // { // Debug.LogError("执行协程发生异常: \n" + e); diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs index d943e6a..0ebce39 100644 --- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs +++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs @@ -85,12 +85,13 @@ activityObject.AffiliationArea._includeItems.Remove(activityObject); } activityObject.AffiliationArea = this; - _includeItems.Add(activityObject); - - //如果是玩家 - if (activityObject == Player.Current) + if (_includeItems.Add(activityObject)) { - CallDeferred(nameof(OnPlayerInsertRoom)); + //如果是玩家 + if (activityObject == Player.Current) + { + CallDeferred(nameof(OnPlayerInsertRoom)); + } } } diff --git a/DungeonShooting_Godot/src/framework/map/DoorNavigationInfo.cs b/DungeonShooting_Godot/src/framework/map/DoorNavigationInfo.cs deleted file mode 100644 index 21651c2..0000000 --- a/DungeonShooting_Godot/src/framework/map/DoorNavigationInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ - -using Godot; - -/// -/// 房间连接门的站位导航数据 -/// -public class DoorNavigationInfo -{ - public DoorNavigationInfo(RoomDoorInfo doorInfo, NavigationPolygonData openNavigationData, NavigationPolygonData closeNavigationData) - { - DoorInfo = doorInfo; - OpenNavigationData = openNavigationData; - CloseNavigationData = closeNavigationData; - } - - /// - /// 绑定的门对象 - /// - public RoomDoorInfo DoorInfo; - - /// - /// 门开启时导航区域节点 - /// - public NavigationRegion2D OpenNavigationNode; - - /// - /// 门关闭时导航区域节点 - /// - public NavigationRegion2D CloseNavigationNode; - - /// - /// 门开启时导航形状数据 - /// - public NavigationPolygonData OpenNavigationData; - - /// - /// 门关闭时导航形状数据 - /// - public NavigationPolygonData CloseNavigationData; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonConfig.cs b/DungeonShooting_Godot/src/framework/map/DungeonConfig.cs index 92e1b0d..2fc4437 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonConfig.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonConfig.cs @@ -7,25 +7,104 @@ public class DungeonConfig { /// + /// 地牢使用的随机种子 + /// + public int? RandomSeed = null; + + /// /// 地牢组名称 /// public string GroupName; /// + /// 战斗房间数量 + /// + public int BattleRoomCount = 15; + + /// + /// 奖励房间数量 + /// + public int RewardRoomCount = 2; + + /// + /// 商店数量 + /// + public int ShopRoomCount = 1; + + /// + /// 出口房间数量 + /// + public int OutRoomCount = 1; + + /// + /// Boss房间数量 + /// + public int BossRoomCount = 1; + + /// /// 房间数量 /// - public int RoomCount = 20; + public int RoomCount => BattleRoomCount + RewardRoomCount + ShopRoomCount + OutRoomCount + BossRoomCount; + + /// + /// 房间最大层级 + /// + public int MaxLayer = 5; + + /// + /// 房间最小间隔 + /// + public int RoomMinInterval = 2; + + /// + /// 房间最大间隔 + /// + public int RoomMaxInterval = 2; + + /// + /// 房间横轴最小分散程度 + /// + public float RoomHorizontalMinDispersion = -0.6f; + + /// + /// 房间横轴最大分散程度 + /// + public float RoomHorizontalMaxDispersion = 0.6f; /// + /// 房间纵轴最小分散程度 + /// + public float RoomVerticalMinDispersion = -0.6f; + + /// + /// 房间纵轴最大分散程度 + /// + public float RoomVerticalMaxDispersion = 0.6f; + + /// + /// 是否启用区域限制 + /// + public bool EnableLimitRange = true; + + /// + /// 横轴范围 + /// + public int RangeX = 120; + + /// + /// 纵轴范围 + /// + public int RangeY = 120; + + //----------------------- 地牢编辑使用 ------------------------- + /// /// 是否指定了房间 /// public bool HasDesignatedRoom => DesignatedRoom != null && DesignatedRoom.Count > 0; - /// /// 指定房间类型 /// public DungeonRoomType DesignatedType; - /// /// 指定房间列表 /// diff --git a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs index a8e5533..feb8ca2 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs @@ -18,51 +18,56 @@ /// 起始房间 /// public RoomInfo StartRoomInfo { get; private set; } + + /// + /// 战斗房间 + /// + public List BattleRoomInfos { get; } = new List(); /// /// 结束房间 /// - public RoomInfo EndRoomInfo { get; private set; } + public List EndRoomInfos { get; } = new List(); /// /// boss房间 /// - public List BossRoom { get; } = new List(); + public List BossRoomInfos { get; } = new List(); + + /// + /// 奖励房间 + /// + public List RewardRoomInfos { get; } = new List(); + + /// + /// 商店房间 + /// + public List ShopRoomInfos { get; } = new List(); + + /// + /// 地牢配置数据 + /// + public DungeonConfig Config { get; } + /// + /// 所属地牢组 + /// + public DungeonRoomGroup RoomGroup { get; } /// /// 随机数对象 /// - private SeedRandom _random; + public SeedRandom Random; //用于标记地图上的坐标是否被占用 private InfiniteGrid _roomGrid { get; } = new InfiniteGrid(); - //当前房间数量 - private int _count = 0; //房间id private int _id; //下一个房间类型 - private DungeonRoomType _nextRoomType = DungeonRoomType.Battle; + private DungeonRoomType _nextRoomType = DungeonRoomType.None; - //间隔 - private int _roomMinInterval = 5; - private int _roomMaxInterval = 6; - - //房间横轴分散程度 - private float _roomHorizontalMinDispersion = 0f; - private float _roomHorizontalMaxDispersion = 0.5f; - // private float _roomHorizontalMinDispersion = 0f; - // private float _roomHorizontalMaxDispersion = 2f; - - //房间纵轴分散程度 - private float _roomVerticalMinDispersion = 0f; - private float _roomVerticalMaxDispersion = 0.5f; - // private float _roomVerticalMinDispersion = 0f; - // private float _roomVerticalMaxDispersion = 2f; - //区域限制 - private bool _enableLimitRange = true; private int _rangeX = 120; private int _rangeY = 120; @@ -74,28 +79,20 @@ private int _maxTryCount = 10; private int _currMaxLayer = 0; - //地牢配置 - private DungeonConfig _config; - private DungeonRoomGroup _roomGroup; - - private enum GenerateRoomErrorCode - { - NoError, - //超出区域 - OutArea, - //没有合适的位置 - NoSuitableLocation - // //碰到其他房间或过道 - // HasCollision, - // //没有合适的门 - // NoProperDoor, - } + //地牢房间规则处理类 + private DungeonRule _rule; + + //上一个房间 + private RoomInfo prevRoomInfo = null; + private readonly List _tempList = new List(); public DungeonGenerator(DungeonConfig config, SeedRandom seedRandom) { - _config = config; - _random = seedRandom; - _roomGroup = GameApplication.Instance.RoomConfig[config.GroupName]; + Config = config; + Random = seedRandom; + RoomGroup = GameApplication.Instance.RoomConfig[config.GroupName]; + _rangeX = config.RangeX; + _rangeY = config.RangeY; //验证该组是否满足生成地牢的条件 var result = DungeonManager.CheckDungeon(config.GroupName); @@ -104,8 +101,8 @@ throw new Exception("当前组'" + config.GroupName + "'" + result.ErrorMessage + ", 不能生成地牢!"); } - Debug.Log("创建地牢生成器, 随机种子: " + _random.Seed); - _roomGroup.InitWeight(_random); + Debug.Log("创建地牢生成器, 随机种子: " + Random.Seed); + RoomGroup.InitWeight(Random); } /// @@ -155,60 +152,28 @@ /// /// 生成房间 /// - public void Generate() + public bool Generate(DungeonRule rule) { - if (StartRoomInfo != null) return; + if (StartRoomInfo != null) return false; + _rule = rule; - CalcNextRoomType(null); - //用于排除上一级房间 - var excludePrevRoom = new List(); - //上一个房间 - RoomInfo prevRoomInfo = null; - - var chainTryCount = 0; - var chainMaxTryCount = 3; + //最大尝试次数 + var maxTryCount = 1000; + + //当前尝试次数 + var currTryCount = 0; //如果房间数量不够, 就一直生成 - while (_count < _config.RoomCount || EndRoomInfo == null) + while (!_rule.CanOverGenerator()) { - var nextRoomType = GetNextRoomType(); + if (_nextRoomType == DungeonRoomType.None) + { + _nextRoomType = _rule.GetNextRoomType(prevRoomInfo); + } + var nextRoomType = _nextRoomType; //上一个房间 - RoomInfo tempPrevRoomInfo; - if (nextRoomType == DungeonRoomType.Inlet) - { - tempPrevRoomInfo = null; - } - else if (nextRoomType == DungeonRoomType.Boss) - { - tempPrevRoomInfo = FindMaxLayerRoom(excludePrevRoom); - } - else if (nextRoomType == DungeonRoomType.Outlet) - { - tempPrevRoomInfo = prevRoomInfo; - } - else if (nextRoomType == DungeonRoomType.Battle) - { - if (chainTryCount < chainMaxTryCount) - { - if (prevRoomInfo != null && prevRoomInfo.Layer > 6) //层数太高, 下一个房间生成在低层级 - { - tempPrevRoomInfo = RoundRoomLessThanLayer(3); - } - else - { - tempPrevRoomInfo = prevRoomInfo; - } - } - else - { - tempPrevRoomInfo = _random.RandomChoose(RoomInfos); - } - } - else - { - tempPrevRoomInfo = _random.RandomChoose(RoomInfos); - } + var tempPrevRoomInfo = _rule.GetConnectPrevRoom(prevRoomInfo, nextRoomType); //生成下一个房间 var errorCode = GenerateRoom(tempPrevRoomInfo, nextRoomType, out var nextRoom); @@ -222,51 +187,33 @@ } else if (nextRoomType == DungeonRoomType.Boss) //boss房间 { - BossRoom.Add(nextRoom); - excludePrevRoom.Clear(); + BossRoomInfos.Add(nextRoom); } else if (nextRoomType == DungeonRoomType.Outlet) { - EndRoomInfo = nextRoom; + EndRoomInfos.Add(nextRoom); } else if (nextRoomType == DungeonRoomType.Battle) { - chainTryCount = 0; - chainMaxTryCount = _random.RandomRangeInt(1, 3); + BattleRoomInfos.Add(nextRoom); + } + else if (nextRoomType == DungeonRoomType.Reward) + { + RewardRoomInfos.Add(nextRoom); + } + else if (nextRoomType == DungeonRoomType.Shop) + { + ShopRoomInfos.Add(nextRoom); } prevRoomInfo = nextRoom; - CalcNextRoomType(prevRoomInfo); + _rule.GenerateRoomSuccess(tempPrevRoomInfo, nextRoom); + _nextRoomType = _rule.GetNextRoomType(nextRoom); } else //生成失败 { - if (nextRoomType == DungeonRoomType.Boss) - { - //生成boss房间成功 - excludePrevRoom.Add(tempPrevRoomInfo); - if (excludePrevRoom.Count >= RoomInfos.Count) - { - //全都没找到合适的, 那就再来一遍 - excludePrevRoom.Clear(); - } - } - else if (nextRoomType == DungeonRoomType.Outlet) - { - //生成结束房间失败, 那么只能回滚boss房间 - if (prevRoomInfo != null) - { - var bossPrev = prevRoomInfo.Prev; - BossRoom.Remove(prevRoomInfo); - RollbackRoom(prevRoomInfo); - CalcNextRoomType(bossPrev); - prevRoomInfo = null; - } - } - else if (nextRoomType == DungeonRoomType.Battle) - { - chainTryCount++; - } + _rule.GenerateRoomFail(tempPrevRoomInfo, nextRoomType); - Debug.Log("生成第" + (_count + 1) + "个房间失败! 失败原因: " + errorCode); + //Debug.Log("生成第" + (_count + 1) + "个房间失败! 失败原因: " + errorCode); if (errorCode == GenerateRoomErrorCode.OutArea) { _failCount++; @@ -280,15 +227,22 @@ Debug.Log("生成房间失败次数过多, 增大区域"); } } + currTryCount++; + if (currTryCount >= maxTryCount) + { + return false; + } } } _roomGrid.Clear(); Debug.Log("房间总数: " + RoomInfos.Count); + Debug.Log("尝试次数: " + currTryCount); + return true; } //生成房间 - private GenerateRoomErrorCode GenerateRoom(RoomInfo prevRoomInfo, DungeonRoomType roomType, out RoomInfo resultRoomInfo) + private GenerateRoomErrorCode GenerateRoom(RoomInfo prevRoom, DungeonRoomType roomType, out RoomInfo resultRoomInfo) { // if (_count >= _config.RoomCount) // { @@ -297,21 +251,21 @@ // } DungeonRoomSplit roomSplit; - if (_config.HasDesignatedRoom && _config.DesignatedType == roomType) //执行指定了房间 + if (Config.HasDesignatedRoom && Config.DesignatedType == roomType) //执行指定了房间 { - roomSplit = _random.RandomChoose(_config.DesignatedRoom); + roomSplit = Random.RandomChoose(Config.DesignatedRoom); } else //没有指定房间 { //随机选择一个房间 - var list = _roomGroup.GetRoomList(roomType); - if (list.Count == 0) //如果没有指定类型的房间, 就生成战斗房间 + var list = RoomGroup.GetRoomList(roomType); + if (list.Count == 0) //如果没有指定类型的房间, 或者房间数量不够, 就生成战斗房间 { - roomSplit = _roomGroup.GetRandomRoom(DungeonRoomType.Battle); + roomSplit = RoomGroup.GetRandomRoom(DungeonRoomType.Battle); } else { - roomSplit = _roomGroup.GetRandomRoom(roomType); + roomSplit = RoomGroup.GetRandomRoom(roomType); } } @@ -320,9 +274,9 @@ //房间大小 room.Size = new Vector2I((int)roomSplit.RoomInfo.Size.X, (int)roomSplit.RoomInfo.Size.Y); - if (prevRoomInfo != null) //表示这不是第一个房间, 就得判断当前位置下的房间是否被遮挡 + if (prevRoom != null) //表示这不是第一个房间, 就得判断当前位置下的房间是否被遮挡 { - room.Layer = prevRoomInfo.Layer + 1; + room.Layer = prevRoom.Layer + 1; if (_currMaxLayer < room.Layer) { _currMaxLayer = room.Layer; @@ -340,46 +294,37 @@ } for (; tryCount < maxTryCount; tryCount++) { - var direction = _random.RandomRangeInt(0, 3); + //下一个房间方向 + var direction = _rule.GetNextRoomDoorDirection(prevRoom, roomType); //房间间隔 - var space = _random.RandomRangeInt(_roomMinInterval, _roomMaxInterval); + var space = _rule.GetNextRoomInterval(prevRoom, roomType, direction); //中心偏移 - int offset; - if (direction == 0 || direction == 2) - { - offset = _random.RandomRangeInt(-(int)(prevRoomInfo.Size.X * _roomVerticalMinDispersion), - (int)(prevRoomInfo.Size.X * _roomVerticalMaxDispersion)); - } - else - { - offset = _random.RandomRangeInt(-(int)(prevRoomInfo.Size.Y * _roomHorizontalMinDispersion), - (int)(prevRoomInfo.Size.Y * _roomHorizontalMaxDispersion)); - } + var offset = _rule.GetNextRoomOffset(prevRoom, roomType, direction); //计算房间位置 - if (direction == 0) //上 + if (direction == RoomDirection.Up) //上 { - room.Position = new Vector2I(prevRoomInfo.Position.X + offset, - prevRoomInfo.Position.Y - room.Size.Y - space); + room.Position = new Vector2I(prevRoom.Position.X + offset, + prevRoom.Position.Y - room.Size.Y - space); } - else if (direction == 1) //右 + else if (direction == RoomDirection.Right) //右 { - room.Position = new Vector2I(prevRoomInfo.Position.X + prevRoomInfo.Size.Y + space, - prevRoomInfo.Position.Y + offset); + room.Position = new Vector2I(prevRoom.Position.X + prevRoom.Size.Y + space, + prevRoom.Position.Y + offset); } - else if (direction == 2) //下 + else if (direction == RoomDirection.Down) //下 { - room.Position = new Vector2I(prevRoomInfo.Position.X + offset, - prevRoomInfo.Position.Y + prevRoomInfo.Size.Y + space); + room.Position = new Vector2I(prevRoom.Position.X + offset, + prevRoom.Position.Y + prevRoom.Size.Y + space); } - else if (direction == 3) //左 + else if (direction == RoomDirection.Left) //左 { - room.Position = new Vector2I(prevRoomInfo.Position.X - room.Size.X - space, - prevRoomInfo.Position.Y + offset); + room.Position = new Vector2I(prevRoom.Position.X - room.Size.X - space, + prevRoom.Position.Y + offset); } //是否在限制区域内 - if (_enableLimitRange) + if (Config.EnableLimitRange) { if (room.GetHorizontalStart() < -_rangeX || room.GetHorizontalEnd() > _rangeX || room.GetVerticalStart() < -_rangeY || room.GetVerticalEnd() > _rangeY) @@ -391,19 +336,20 @@ } //是否碰到其他房间或者过道 - if (_roomGrid.RectCollision(room.Position - new Vector2I(GameConfig.RoomSpace, GameConfig.RoomSpace), room.Size + new Vector2I(GameConfig.RoomSpace * 2, GameConfig.RoomSpace * 2))) + if (_roomGrid.RectCollision(room.Position - new Vector2I(2, 2), room.Size + new Vector2I(4, 5))) { //碰到其他墙壁, 再一次尝试 continue; //return GenerateRoomErrorCode.HasCollision; } - + _roomGrid.SetRect(room.Position, room.Size, true); //找门, 与上一个房间是否能连通 - if (!ConnectDoor(prevRoomInfo, room)) + if (!ConnectDoor(prevRoom, room)) { _roomGrid.RemoveRect(room.Position, room.Size); + //Debug.Log("链接通道失败"); //房间过道没有连接上, 再一次尝试 continue; //return GenerateRoomErrorCode.NoProperDoor; @@ -423,67 +369,43 @@ room.Layer = 0; _roomGrid.SetRect(room.Position, room.Size, true); } - - if (IsParticipateCounting(room)) - { - _count++; - } _id++; - room.Prev = prevRoomInfo; - if (prevRoomInfo != null) + room.Prev = prevRoom; + if (prevRoom != null) { - prevRoomInfo.Next.Add(room); + prevRoom.Next.Add(room); } resultRoomInfo = room; return GenerateRoomErrorCode.NoError; } - //判断房间是否参与计数 - private bool IsParticipateCounting(RoomInfo roomInfo) + /// + /// 设置上一个房间 + /// + public void SetPrevRoom(RoomInfo roomInfo) { - return roomInfo.RoomType == DungeonRoomType.Battle || roomInfo.RoomType == DungeonRoomType.Boss; + prevRoomInfo = roomInfo; } - //计算下一个房间类型 - private void CalcNextRoomType(RoomInfo prev) - { - if (prev == null) //生成第一个房间 - { - _nextRoomType = DungeonRoomType.Inlet; - } - else if (_count == _config.RoomCount - 1) //最后一个房间是boss房间 - { - _nextRoomType = DungeonRoomType.Boss; - } - else if (_count >= _config.RoomCount) //结束房间 - { - _nextRoomType = DungeonRoomType.Outlet; - } - else if (prev.RoomType == DungeonRoomType.Boss) //生成结束房间 - { - _nextRoomType = DungeonRoomType.Outlet; - } - else - { - _nextRoomType = DungeonRoomType.Battle; - } - } - - //获取下一个房间类型 - private DungeonRoomType GetNextRoomType() - { - return _nextRoomType; - } - - //回滚一个房间 - private bool RollbackRoom(RoomInfo roomInfo) + /// + /// 回滚一个房间 + /// + public bool RollbackRoom(RoomInfo roomInfo) { if (roomInfo.Next.Count > 0) { Debug.LogError("当前房间还有连接的子房间, 不能回滚!"); return false; } + + if (!roomInfo.CanRollback) + { + Debug.LogError("当前房间不能回滚!"); + return false; + } + var prevRoom = roomInfo.Prev; + //退掉占用的房间区域和过道占用区域 _roomGrid.RemoveRect(roomInfo.Position, roomInfo.Size); foreach (var rect2 in roomInfo.AisleArea) @@ -492,7 +414,7 @@ } //roomInfo.Doors[0]. - if (roomInfo.Prev != null) + if (prevRoom != null) { roomInfo.Prev.Next.Remove(roomInfo); } @@ -505,32 +427,54 @@ } RoomInfos.Remove(roomInfo); - roomInfo.Destroy(); - - if (IsParticipateCounting(roomInfo)) + switch (roomInfo.RoomType) { - _count--; + case DungeonRoomType.Battle: + BattleRoomInfos.Remove(roomInfo); + break; + case DungeonRoomType.Inlet: + StartRoomInfo = null; + break; + case DungeonRoomType.Outlet: + EndRoomInfos.Remove(roomInfo); + break; + case DungeonRoomType.Boss: + BossRoomInfos.Remove(roomInfo); + break; + case DungeonRoomType.Reward: + RewardRoomInfos.Remove(roomInfo); + break; + case DungeonRoomType.Shop: + ShopRoomInfos.Remove(roomInfo); + break; + case DungeonRoomType.Event: + break; } - + + roomInfo.Destroy(); _id--; + _nextRoomType = DungeonRoomType.None; + SetPrevRoom(prevRoom); return true; } /// /// 寻找层级最高的房间 /// + /// 指定房间类型, 如果传 None 则表示选择所有类型房间 /// 排除的房间 - private RoomInfo FindMaxLayerRoom(List exclude) + public RoomInfo FindMaxLayerRoom(DungeonRoomType roomType, List exclude = null) { RoomInfo temp = null; foreach (var roomInfo in RoomInfos) { - if (temp == null || roomInfo.Layer > temp.Layer) + if (roomInfo.CanRollback) { - if (exclude == null || !exclude.Contains(roomInfo)) - { - temp = roomInfo; - } + continue; + } + if ((temp == null || roomInfo.Layer > temp.Layer) && (roomType == DungeonRoomType.None || (roomInfo.RoomType & roomType) != DungeonRoomType.None) && (exclude == null || !exclude.Contains(roomInfo))) + { + temp = roomInfo; } } @@ -540,18 +484,83 @@ /// /// 随机抽取层级小于 layer 的房间 /// - private RoomInfo RoundRoomLessThanLayer(int layer) + /// 指定房间类型, 如果传 None 则表示选择所有类型房间 + /// + /// 排除的房间 + public RoomInfo RandomRoomLessThanLayer(DungeonRoomType roomType, int layer, List exclude = null) { - var list = new List(); + _tempList.Clear(); foreach (var roomInfo in RoomInfos) { - if (roomInfo.Layer < layer) + if (roomInfo.CanRollback) { - list.Add(roomInfo); + continue; + } + if (roomInfo.Layer < layer && (roomType == DungeonRoomType.None || (roomInfo.RoomType & roomType) != DungeonRoomType.None) && (exclude == null || !exclude.Contains(roomInfo))) + { + _tempList.Add(roomInfo); } } - return _random.RandomChoose(list); + return Random.RandomChoose(_tempList); + } + + /// + /// 随机抽取层级大于 layer 的房间 + /// + /// 指定房间类型, 如果传 None 则表示选择所有类型房间 + /// + /// 排除的房间 + public RoomInfo RandomRoomGreaterThanLayer(DungeonRoomType roomType, int layer, List exclude = null) + { + _tempList.Clear(); + foreach (var roomInfo in RoomInfos) + { + if (roomInfo.CanRollback) + { + continue; + } + if (roomInfo.Layer > layer && (roomType == DungeonRoomType.None || (roomInfo.RoomType & roomType) != DungeonRoomType.None) && (exclude == null || !exclude.Contains(roomInfo))) + { + _tempList.Add(roomInfo); + } + } + + return Random.RandomChoose(_tempList); + } + + /// + /// 随机抽取房间 + /// + /// 指定房间类型, 如果传 None 则表示选择所有类型房间 + public RoomInfo GetRandomRoom(DungeonRoomType roomType) + { + _tempList.Clear(); + foreach (var roomInfo in RoomInfos) + { + if (roomInfo.CanRollback) + { + continue; + } + + if (roomType == DungeonRoomType.None || (roomInfo.RoomType & roomType) != DungeonRoomType.None) + { + _tempList.Add(roomInfo); + } + } + + return Random.RandomChoose(_tempList); + } + + /// + /// 提交所有可以回滚的房间 + /// + public void SubmitCanRollbackRoom() + { + foreach (var roomInfo in RoomInfos) + { + roomInfo.CanRollback = false; + } } /// @@ -571,16 +580,7 @@ nextRoomDoor.ConnectDoor = roomDoor; //先寻找直通门 - if (_random.RandomBoolean()) - { - //直行通道, 优先横轴 - if (TryConnectHorizontalDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor) - || TryConnectVerticalDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor)) - { - return true; - } - } - else + if (Random.RandomBoolean()) { //直行通道, 优先纵轴 if (TryConnectVerticalDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor) @@ -589,21 +589,34 @@ return true; } } - - //包含拐角的通道 + else + { + //直行通道, 优先横轴 + if (TryConnectHorizontalDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor) + || TryConnectVerticalDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor)) + { + return true; + } + } + + //包含1个拐角的通道 return TryConnectCrossDoor(roomInfo, roomDoor, nextRoomInfo, nextRoomDoor); + //包含2个拐角的通道 (后面再开发) } /// - /// 尝试寻找横轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 + /// 尝试寻找纵轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 /// - private bool TryConnectHorizontalDoor(RoomInfo roomInfo, RoomDoorInfo roomDoor, RoomInfo nextRoomInfo, RoomDoorInfo nextRoomDoor) + private bool TryConnectVerticalDoor(RoomInfo roomInfo, RoomDoorInfo roomDoor, RoomInfo nextRoomInfo, RoomDoorInfo nextRoomDoor) { var overlapX = Mathf.Min(roomInfo.GetHorizontalEnd(), nextRoomInfo.GetHorizontalEnd()) - Mathf.Max(roomInfo.GetHorizontalStart(), nextRoomInfo.GetHorizontalStart()); //这种情况下x轴有重叠 if (overlapX >= 6) { + //填充通通道地板格子 + var floorCell = new HashSet(); + //找到重叠区域 var rangeList = FindPassage(roomInfo, nextRoomInfo, roomInfo.GetVerticalStart() < nextRoomInfo.GetVerticalStart() ? DoorDirection.S : DoorDirection.N); @@ -611,34 +624,56 @@ while (rangeList.Count > 0) { //找到重叠区域 - var range = _random.RandomChooseAndRemove(rangeList); - var x = _random.RandomRangeInt(range.X, range.Y); + var range = Random.RandomChooseAndRemove(rangeList); + var x = Random.RandomRangeInt(range.X, range.Y) + 2; if (roomInfo.GetVerticalStart() < nextRoomInfo.GetVerticalStart()) //room在上, nextRoom在下 { roomDoor.Direction = DoorDirection.S; nextRoomDoor.Direction = DoorDirection.N; - roomDoor.OriginPosition = new Vector2I(x, roomInfo.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2I(x, nextRoomInfo.GetVerticalStart()); + roomDoor.OriginPosition = new Vector2I(x, roomInfo.GetVerticalDoorEnd()); + nextRoomDoor.OriginPosition = new Vector2I(x, nextRoomInfo.GetVerticalDoorStart()); + + var sv = roomInfo.GetVerticalDoorEnd() - 1; + var ev = nextRoomInfo.GetVerticalDoorStart() + 1; + for (var i = sv; i < ev; i++) + { + floorCell.Add(new Vector2I(x + 1, i)); + floorCell.Add(new Vector2I(x + 2, i)); + } } else //room在下, nextRoom在上 { roomDoor.Direction = DoorDirection.N; nextRoomDoor.Direction = DoorDirection.S; - roomDoor.OriginPosition = new Vector2I(x, roomInfo.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2I(x, nextRoomInfo.GetVerticalEnd()); + roomDoor.OriginPosition = new Vector2I(x, roomInfo.GetVerticalDoorStart()); + nextRoomDoor.OriginPosition = new Vector2I(x, nextRoomInfo.GetVerticalDoorEnd()); + + var sv = nextRoomInfo.GetVerticalDoorEnd() - 1; + var ev = roomInfo.GetVerticalDoorStart() + 1; + for (var i = sv; i < ev; i++) + { + floorCell.Add(new Vector2I(x + 1, i)); + floorCell.Add(new Vector2I(x + 2, i)); + } } //判断门之间的通道是否有物体碰到 if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) { //此门不能连通 + floorCell.Clear(); continue; } //没有撞到物体 roomInfo.Doors.Add(roomDoor); nextRoomInfo.Doors.Add(nextRoomDoor); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell);; + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } } @@ -647,15 +682,18 @@ } /// - /// 尝试寻找纵轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 + /// 尝试寻找横轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 /// - private bool TryConnectVerticalDoor(RoomInfo roomInfo, RoomDoorInfo roomDoor, RoomInfo nextRoomInfo, RoomDoorInfo nextRoomDoor) + private bool TryConnectHorizontalDoor(RoomInfo roomInfo, RoomDoorInfo roomDoor, RoomInfo nextRoomInfo, RoomDoorInfo nextRoomDoor) { var overlapY = Mathf.Min(roomInfo.GetVerticalEnd(), nextRoomInfo.GetVerticalEnd()) - Mathf.Max(roomInfo.GetVerticalStart(), nextRoomInfo.GetVerticalStart()); //这种情况下y轴有重叠 if (overlapY >= 6) { + //填充通通道地板格子 + var floorCell = new HashSet(); + //找到重叠区域 var rangeList = FindPassage(roomInfo, nextRoomInfo, roomInfo.GetHorizontalStart() < nextRoomInfo.GetHorizontalStart() ? DoorDirection.E : DoorDirection.W); @@ -663,34 +701,54 @@ while (rangeList.Count > 0) { //找到重叠区域 - var range = _random.RandomChooseAndRemove(rangeList); - var y = _random.RandomRangeInt(range.X, range.Y); + var range = Random.RandomChooseAndRemove(rangeList); + var y = Random.RandomRangeInt(range.X, range.Y) + 3; if (roomInfo.GetHorizontalStart() < nextRoomInfo.GetHorizontalStart()) //room在左, nextRoom在右 { roomDoor.Direction = DoorDirection.E; nextRoomDoor.Direction = DoorDirection.W; - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalEnd(), y); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart(), y); + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorEnd(), y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart(), y); + + var sv = roomInfo.GetHorizontalDoorEnd() - 1; + var ev = nextRoomInfo.GetHorizontalDoorStart() + 1; + for (var i = sv; i < ev; i++) + { + floorCell.Add(new Vector2I(i, y + 2)); + } } else //room在右, nextRoom在左 { roomDoor.Direction = DoorDirection.W; nextRoomDoor.Direction = DoorDirection.E; - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart(), y); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalEnd(), y); + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart(), y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorEnd(), y); + + var sv = nextRoomInfo.GetHorizontalDoorEnd() - 1; + var ev = roomInfo.GetHorizontalDoorStart() + 1; + for (var i = sv; i < ev; i++) + { + floorCell.Add(new Vector2I(i, y + 2)); + } } //判断门之间的通道是否有物体碰到 if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) { //此门不能连通 + floorCell.Clear(); continue; } //没有撞到物体 roomInfo.Doors.Add(roomDoor); nextRoomInfo.Doors.Add(nextRoomDoor); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell);; + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } } @@ -710,7 +768,7 @@ { if (roomInfo.GetVerticalStart() > nextRoomInfo.GetVerticalStart()) { - if (_random.RandomBoolean()) //↑ //→ + if (Random.RandomBoolean()) //↑ //→ { if (!TryConnect_NE_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross) && !TryConnect_WS_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross)) @@ -729,7 +787,7 @@ } else { - if (_random.RandomBoolean()) //↓ //→ + if (Random.RandomBoolean()) //↓ //→ { if (!TryConnect_SE_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross) && !TryConnect_WN_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross)) @@ -751,7 +809,7 @@ { if (roomInfo.GetVerticalStart() > nextRoomInfo.GetVerticalStart()) //→ //↓ { - if (_random.RandomBoolean()) + if (Random.RandomBoolean()) { if (!TryConnect_ES_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross) && !TryConnect_NW_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross)) @@ -770,7 +828,7 @@ } else { - if (_random.RandomBoolean()) //→ //↑ + if (Random.RandomBoolean()) //→ //↑ { if (!TryConnect_EN_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross) && !TryConnect_SW_Door(roomInfo, nextRoomInfo, roomDoor, nextRoomDoor, ref cross)) @@ -850,8 +908,8 @@ if (areaInfo.Direction == DoorDirection.N || areaInfo.Direction == DoorDirection.S) //纵向门 { var num = room1.GetHorizontalStart(); - var p1 = num + areaInfo.Start / GameConfig.TileCellSize; - var p2 = num + areaInfo.End / GameConfig.TileCellSize; + var p1 = num + GetDoorAreaInfoStart(areaInfo) / GameConfig.TileCellSize; + var p2 = num + GetDoorAreaInfoEnd(areaInfo) / GameConfig.TileCellSize; if (room1.Position.X > room2.Position.X) { @@ -893,8 +951,8 @@ else //横向门 { var num = room1.GetVerticalStart(); - var p1 = num + areaInfo.Start / GameConfig.TileCellSize; - var p2 = num + areaInfo.End / GameConfig.TileCellSize; + var p1 = num + GetDoorAreaInfoStart(areaInfo) / GameConfig.TileCellSize; + var p2 = num + GetDoorAreaInfoEnd(areaInfo) / GameConfig.TileCellSize; if (room1.Position.Y > room2.Position.Y) { @@ -946,17 +1004,39 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart() + offset1, roomInfo.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalEnd(), - nextRoomInfo.GetVerticalStart() + offset2); + + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart() + offset1, roomInfo.GetVerticalDoorStart()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorEnd(), nextRoomInfo.GetVerticalDoorStart() + offset2); cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //纵轴地板 + for (var y = cross.Y + 3; y <= roomDoor.OriginPosition.Y; y++) + { + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 2, y)); + } + //横轴地板 + for (var x = nextRoomDoor.OriginPosition.X - 1; x <= cross.X; x++) + { + floorCell.Add(new Vector2I(x, nextRoomDoor.OriginPosition.Y + 2)); + } + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } private bool TryConnect_WS_Door(RoomInfo roomInfo, RoomInfo nextRoomInfo, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { - //ok var offset1 = 0; var offset2 = 0; roomDoor.Direction = DoorDirection.W; //← @@ -966,10 +1046,35 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart(), roomInfo.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart() + offset2, nextRoomInfo.GetVerticalEnd()); + + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart(), roomInfo.GetVerticalDoorStart() + offset1); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart() + offset2, nextRoomInfo.GetVerticalDoorEnd()); cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //横轴地板 + for (var x = cross.X + 3; x <= roomDoor.OriginPosition.X; x++) + { + floorCell.Add(new Vector2I(x, roomDoor.OriginPosition.Y + 2)); + } + //纵轴地板 + for (var y = nextRoomDoor.OriginPosition.Y - 1; y <= cross.Y + 1; y++) + { + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 2, y)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -985,10 +1090,35 @@ return false; } - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart() + offset1, roomInfo.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalEnd(), - nextRoomInfo.GetVerticalStart() + offset2); + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart() + offset1, roomInfo.GetVerticalDoorEnd()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorEnd(), nextRoomInfo.GetVerticalDoorStart() + offset2); cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //纵轴地板 + for (var y = roomDoor.OriginPosition.Y - 1; y <= cross.Y + 1; y++) + { + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 2, y)); + } + + //横轴地板 + for (var x = nextRoomDoor.OriginPosition.X - 1; x <= cross.X; x++) + { + floorCell.Add(new Vector2I(x, nextRoomDoor.OriginPosition.Y + 2)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1004,11 +1134,35 @@ return false; } - roomDoor.OriginPosition = - new Vector2I(roomInfo.GetHorizontalStart(), roomInfo.GetVerticalStart() + offset1); // - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart() + offset2, - nextRoomInfo.GetVerticalStart()); + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart(), roomInfo.GetVerticalDoorStart() + offset1); // + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart() + offset2, nextRoomInfo.GetVerticalDoorStart()); cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //横轴地板 + for (var x = cross.X + 3; x <= roomDoor.OriginPosition.X; x++) + { + floorCell.Add(new Vector2I(x, roomDoor.OriginPosition.Y + 2)); + } + + //纵轴地板 + for (var y = cross.Y + 3; y <= nextRoomDoor.OriginPosition.Y; y++) + { + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 2, y)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1023,11 +1177,36 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalEnd(), roomInfo.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart() + offset2, - nextRoomInfo.GetVerticalEnd()); + + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorEnd(), roomInfo.GetVerticalDoorStart() + offset1); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart() + offset2, nextRoomInfo.GetVerticalDoorEnd()); cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //横轴地板 + for (var x = roomDoor.OriginPosition.X - 1; x <= cross.X; x++) + { + floorCell.Add(new Vector2I(x, roomDoor.OriginPosition.Y + 2)); + } + + //纵轴地板 + for (var y = nextRoomDoor.OriginPosition.Y - 1; y <= cross.Y + 1; y++) + { + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 2, y)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1042,11 +1221,36 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart() + offset1, roomInfo.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart(), - nextRoomInfo.GetVerticalStart() + offset2); + + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart() + offset1, roomInfo.GetVerticalDoorStart()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart(), nextRoomInfo.GetVerticalDoorStart() + offset2); cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //纵轴地板 + for (var y = cross.Y + 3; y <= roomDoor.OriginPosition.Y; y++) + { + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 2, y)); + } + + //横轴地板 + for (var x = cross.X + 3; x <= nextRoomDoor.OriginPosition.X; x++) + { + floorCell.Add(new Vector2I(x, nextRoomDoor.OriginPosition.Y + 2)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1061,11 +1265,36 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalEnd(), - roomInfo.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart() + offset2, nextRoomInfo.GetVerticalStart()); + + offset1 += 1; + offset2 += 2; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorEnd(), roomInfo.GetVerticalDoorStart() + offset1); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart() + offset2, nextRoomInfo.GetVerticalDoorStart()); cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //横轴地板 + for (var x = roomDoor.OriginPosition.X - 1; x <= cross.X; x++) + { + floorCell.Add(new Vector2I(x, roomDoor.OriginPosition.Y + 2)); + } + + //纵轴地板 + for (var y = cross.Y + 3; y <= nextRoomDoor.OriginPosition.Y; y++) + { + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(nextRoomDoor.OriginPosition.X + 2, y)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1080,11 +1309,36 @@ { return false; } - - roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalStart() + offset1, - roomInfo.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalStart(), nextRoomInfo.GetVerticalStart() + offset2); + + offset1 += 1; + offset2 += 1; + roomDoor.OriginPosition = new Vector2I(roomInfo.GetHorizontalDoorStart() + offset1, roomInfo.GetVerticalDoorEnd()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoomInfo.GetHorizontalDoorStart(), nextRoomInfo.GetVerticalDoorStart() + offset2); cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + + var floorCell = new HashSet(); + + //纵轴地板 + for (var y = roomDoor.OriginPosition.Y - 1; y <= cross.Y + 1; y++) + { + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 1, y)); + floorCell.Add(new Vector2I(roomDoor.OriginPosition.X + 2, y)); + } + + //横轴地板 + for (var x = cross.X + 3; x <= nextRoomDoor.OriginPosition.X; x++) + { + floorCell.Add(new Vector2I(x, nextRoomDoor.OriginPosition.Y + 2)); + } + + //交叉点地板 + floorCell.Add(new Vector2I(cross.X + 1, cross.Y + 2)); + floorCell.Add(new Vector2I(cross.X + 2, cross.Y + 2)); + + roomDoor.AisleFloorCell = floorCell; + nextRoomDoor.AisleFloorCell = floorCell; + roomDoor.AisleFloorRect = Utils.CalcRect(floorCell); + nextRoomDoor.AisleFloorRect = roomDoor.AisleFloorRect; return true; } @@ -1117,15 +1371,15 @@ if (direction == DoorDirection.E || direction == DoorDirection.W) //第二个门向← 或者 第二个门向→ { range = CalcOverlapRange( - roomInfo.GetVerticalStart() * GameConfig.TileCellSize + doorAreaInfo1.Start, roomInfo.GetVerticalStart() * GameConfig.TileCellSize + doorAreaInfo1.End, - nextRoomInfo.GetVerticalStart() * GameConfig.TileCellSize + doorAreaInfo2.Start, nextRoomInfo.GetVerticalStart() * GameConfig.TileCellSize + doorAreaInfo2.End + roomInfo.GetVerticalStart() * GameConfig.TileCellSize + GetDoorAreaInfoStart(doorAreaInfo1), roomInfo.GetVerticalStart() * GameConfig.TileCellSize + GetDoorAreaInfoEnd(doorAreaInfo1), + nextRoomInfo.GetVerticalStart() * GameConfig.TileCellSize + GetDoorAreaInfoStart(doorAreaInfo2), nextRoomInfo.GetVerticalStart() * GameConfig.TileCellSize + GetDoorAreaInfoEnd(doorAreaInfo2) ); } else //第二个门向↑ 或者 第二个门向↓ { range = CalcOverlapRange( - roomInfo.GetHorizontalStart() * GameConfig.TileCellSize + doorAreaInfo1.Start, roomInfo.GetHorizontalStart() * GameConfig.TileCellSize + doorAreaInfo1.End, - nextRoomInfo.GetHorizontalStart() * GameConfig.TileCellSize + doorAreaInfo2.Start, nextRoomInfo.GetHorizontalStart() * GameConfig.TileCellSize + doorAreaInfo2.End + roomInfo.GetHorizontalStart() * GameConfig.TileCellSize + GetDoorAreaInfoStart(doorAreaInfo1), roomInfo.GetHorizontalStart() * GameConfig.TileCellSize + GetDoorAreaInfoEnd(doorAreaInfo1), + nextRoomInfo.GetHorizontalStart() * GameConfig.TileCellSize + GetDoorAreaInfoStart(doorAreaInfo2), nextRoomInfo.GetHorizontalStart() * GameConfig.TileCellSize + GetDoorAreaInfoEnd(doorAreaInfo2) ); } //交集范围够生成门 @@ -1205,11 +1459,15 @@ Vector2I collSize; if (point1.X == point2.X) //纵向加宽, 防止贴到其它墙 { + pos.Y += 1; + size.Y -= 3; collPos = new Vector2I(pos.X - GameConfig.RoomSpace, pos.Y); collSize = new Vector2I(size.X + GameConfig.RoomSpace * 2, size.Y); } else //横向加宽, 防止贴到其它墙 { + pos.X += 1; + size.X -= 2; collPos = new Vector2I(pos.X, pos.Y - GameConfig.RoomSpace); collSize = new Vector2I(size.X, size.Y + GameConfig.RoomSpace * 2); } @@ -1227,6 +1485,11 @@ //将两个门间的过道占用数据存入RoomGrid, 该重载加入拐角点 private bool AddCorridorToGridRange(RoomDoorInfo door1, RoomDoorInfo door2, Vector2I cross) { + if (_roomGrid.RectCollision(cross - new Vector2I(1, 2), new Vector2I(GameConfig.CorridorWidth + 2, GameConfig.CorridorWidth + 3))) + { + return false; + } + var point1 = door1.OriginPosition; var point2 = door2.OriginPosition; var pos1 = new Vector2I(Mathf.Min(point1.X, cross.X), Mathf.Min(point1.Y, cross.Y)); @@ -1244,11 +1507,29 @@ Vector2I collSize1; if (point1.X == cross.X) //纵向加宽, 防止贴到其它墙 { + if (door1.Direction == DoorDirection.N) + { + size1.Y -= 2; + } + else + { + pos1.Y += 1; + size1.Y -= 1; + } collPos1 = new Vector2I(pos1.X - GameConfig.RoomSpace, pos1.Y); collSize1 = new Vector2I(size1.X + GameConfig.RoomSpace * 2, size1.Y); } else //横向加宽, 防止贴到其它墙 { + if (door1.Direction == DoorDirection.E) + { + pos1.X += 1; + size1.X -= 1; + } + else + { + size1.X -= 1; + } collPos1 = new Vector2I(pos1.X, pos1.Y - GameConfig.RoomSpace); collSize1 = new Vector2I(size1.X, size1.Y + GameConfig.RoomSpace * 2); } @@ -1262,11 +1543,29 @@ Vector2I collSize2; if (point2.X == cross.X) //纵向加宽, 防止贴到其它墙 { + if (door2.Direction == DoorDirection.N) + { + size2.Y -= 2; + } + else + { + pos2.Y += 1; + size2.Y -= 1; + } collPos2 = new Vector2I(pos2.X - GameConfig.RoomSpace, pos2.Y); collSize2 = new Vector2I(size2.X + GameConfig.RoomSpace * 2, size2.Y); } else //横向加宽, 防止贴到其它墙 { + if (door2.Direction == DoorDirection.E) + { + pos2.X += 1; + size2.X -= 1; + } + else + { + size2.X -= 1; + } collPos2 = new Vector2I(pos2.X, pos2.Y - GameConfig.RoomSpace); collSize2 = new Vector2I(size2.X, size2.Y + GameConfig.RoomSpace * 2); } @@ -1282,4 +1581,14 @@ _roomGrid.SetRect(pos2, size2, true); return true; } + + private int GetDoorAreaInfoStart(DoorAreaInfo areaInfo) + { + return areaInfo.Start; + } + + private int GetDoorAreaInfoEnd(DoorAreaInfo areaInfo) + { + return areaInfo.End; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomType.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomType.cs index b08eec4..64bf354 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonRoomType.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomType.cs @@ -1,35 +1,42 @@  +using System; + /// /// 模板房间类型 /// +[Flags] public enum DungeonRoomType { /// + /// 无 + /// + None = 0, + /// /// 普通战斗房间, 进入该房间时会关上门, 并刷出若干波敌人, 消灭所有敌人后开门 /// - Battle, + Battle = 0b1, /// /// 起始房间, 由上一层地牢的结束房间进入该房间, 每层包含一个起始房间 /// - Inlet, + Inlet = 0b10, /// /// 结束房间, 进入另一层地牢, 每层只是包含一个结束房间 /// - Outlet, + Outlet = 0b100, /// /// boss战房间, 进入房间时会关上没, 刷出boss, 消灭boss后开门 /// - Boss, + Boss = 0b1000, /// /// 奖励房间, 给予玩家武器或者道具奖励的房间 /// - Reward, + Reward = 0b10000, /// /// 商店, 玩家买卖道具装备的房间 /// - Shop, + Shop = 0b100000, /// /// 事件房间, 触发剧情或者解锁NPC的房间 /// - Event, + Event = 0b1000000, } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRule.cs b/DungeonShooting_Godot/src/framework/map/DungeonRule.cs new file mode 100644 index 0000000..91cb309 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/DungeonRule.cs @@ -0,0 +1,64 @@ + +/// +/// 用于自定义地牢房间生成规则 +/// +public abstract class DungeonRule +{ + public DungeonGenerator Generator { get; } + + public DungeonConfig Config { get; } + + public SeedRandom Random { get; } + + public DungeonRoomGroup RoomGroup { get; } + + public DungeonRule(DungeonGenerator generator) + { + Generator = generator; + Config = generator.Config; + Random = generator.Random; + RoomGroup = generator.RoomGroup; + } + + /// + /// 是否可以结束生成了 + /// + public abstract bool CanOverGenerator(); + + /// + /// 获取指定房间类型与之相连的上一个房间对象, prevRoom 可能为 null + /// + public abstract RoomInfo GetConnectPrevRoom(RoomInfo prevRoom, DungeonRoomType nextRoomType); + + /// + /// 计算下一个房间类型, prevRoom 可能为 null + /// + public abstract DungeonRoomType GetNextRoomType(RoomInfo prevRoom); + + /// + /// 执行生成指定房间成功, prevRoom 可能为 null + /// + public abstract void GenerateRoomSuccess(RoomInfo prevRoom, RoomInfo roomInfo); + + /// + /// 执行生成指定类型房间失败, prevRoom 可能为 null + /// + public abstract void GenerateRoomFail(RoomInfo prevRoom, DungeonRoomType roomType); + + //-------------------------- 下面的函数 prevRoom 一定不会为 null -------------------------- + + /// + /// 获取下一个房间的方向, prevRoom 一定不为 null + /// + public abstract RoomDirection GetNextRoomDoorDirection(RoomInfo prevRoom, DungeonRoomType roomType); + + /// + /// 获取下一个房间的间隔距离, prevRoom 一定不为 null + /// + public abstract int GetNextRoomInterval(RoomInfo prevRoom, DungeonRoomType roomType, RoomDirection direction); + + /// + /// 获取下一个房间相对于当前房间的原点偏移 (单位: 格), prevRoom 一定不为 null + /// + public abstract int GetNextRoomOffset(RoomInfo prevRoom, DungeonRoomType roomType, RoomDirection direction); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs index 643a556..1b59921 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs @@ -9,26 +9,10 @@ /// public class DungeonTileMap { - //--------------------- 导航 ------------------------- - - //已经标记过的点 - private readonly HashSet _usePoints = new HashSet(); - - //导航区域数据 - private readonly List _polygonDataList = new List(); - - //连接门的导航区域 - private readonly List _connectNavigationItemList = new List(); //---------------------------------------------------- private TileMap _tileRoot; - //地面地砖在 Atlas 的位置 - private List _floorAtlasCoords; - //生成导航的结果 - private GenerateNavigationResult _generateNavigationResult; - - private InfiniteGrid _tempAisleFloorGrid = new InfiniteGrid(); public DungeonTileMap(TileMap tileRoot) { @@ -36,152 +20,120 @@ } /// - /// 根据 startRoom 和 config 数据自动填充 tileMap 参数中的地图数据, 该函数为协程函数 + /// 根据 startRoom 和 config 数据自动填充 tileMap 参数中的房间数据, 该函数为协程函数 /// - public IEnumerator AutoFillRoomTile(AutoTileConfig config, RoomInfo startRoomInfo, SeedRandom random) + public IEnumerator AutoFillRoomTile(AutoTileConfig config, RoomInfo startRoomInfo, World world) { - _connectNavigationItemList.Clear(); - yield return _AutoFillRoomTile(config, startRoomInfo, random); + yield return _AutoFillRoomTile(config, startRoomInfo, world); } - private IEnumerator _AutoFillRoomTile(AutoTileConfig config, RoomInfo roomInfo, SeedRandom random) + /// + /// 根据 startRoom 和 config 数据自动填充 tileMap 参数中的过道数据, 该函数为协程函数 + /// + public IEnumerator AutoFillAisleTile(AutoTileConfig config, RoomInfo roomInfo, World world) + { + yield return _AutoFillAisleTile(config, roomInfo, world); + } + + private IEnumerator _AutoFillRoomTile(AutoTileConfig config, RoomInfo roomInfo, World world) { foreach (var info in roomInfo.Next) { - yield return _AutoFillRoomTile(config, info, random); + yield return _AutoFillRoomTile(config, info, world); } //铺房间 - if (roomInfo.RoomSplit == null) //自动填充的矩形房间, 现已经弃用 + var rectPos = roomInfo.RoomSplit.RoomInfo.Position.AsVector2I(); + var tileInfo = roomInfo.RoomSplit.TileInfo; + + //---------------------- 生成房间小地图预览 ---------------------- + //先计算范围 + var x = int.MaxValue; + var y = int.MaxValue; + var x2 = int.MinValue; + var y2 = int.MinValue; + for (var i = 0; i < tileInfo.Floor.Count; i += 4) { - FillRect(GameConfig.FloorMapLayer, config.Floor, roomInfo.Position + Vector2.One, - roomInfo.Size - new Vector2(2, 2)); - - FillRect(GameConfig.TopMapLayer, config.IN_LT, roomInfo.Position, Vector2.One); - FillRect(GameConfig.TopMapLayer, config.L, roomInfo.Position + new Vector2(0, 1), - new Vector2(1, roomInfo.Size.Y - 2)); - FillRect(GameConfig.TopMapLayer, config.IN_LB, roomInfo.Position + new Vector2(0, roomInfo.Size.Y - 1), - new Vector2(1, 1)); - FillRect(GameConfig.TopMapLayer, config.B, roomInfo.Position + new Vector2(1, roomInfo.Size.Y - 1), - new Vector2(roomInfo.Size.X - 2, 1)); - FillRect(GameConfig.TopMapLayer, config.IN_RB, - roomInfo.Position + new Vector2(roomInfo.Size.X - 1, roomInfo.Size.Y - 1), - Vector2.One); - FillRect(GameConfig.TopMapLayer, config.R, roomInfo.Position + new Vector2(roomInfo.Size.X - 1, 1), - new Vector2(1, roomInfo.Size.Y - 2)); - FillRect(GameConfig.TopMapLayer, config.IN_RT, roomInfo.Position + new Vector2(roomInfo.Size.X - 1, 0), - Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.T, roomInfo.Position + Vector2.Right, - new Vector2(roomInfo.Size.X - 2, 1)); + var posX = tileInfo.Floor[i]; + var posY = tileInfo.Floor[i + 1]; + x = Mathf.Min(x, posX); + x2 = Mathf.Max(x2, posX); + y = Mathf.Min(y, posY); + y2 = Mathf.Max(y2, posY); } - else + //创建image, 这里留两个像素宽高用于描边 + var image = Image.Create(x2 - x + 3, y2 - y + 3, false, Image.Format.Rgba8); + //image.Fill(Colors.Green); + //填充像素点 + for (var i = 0; i < tileInfo.Floor.Count; i += 4) { - var rectPos = roomInfo.RoomSplit.RoomInfo.Position.AsVector2I(); - var tileInfo = roomInfo.RoomSplit.TileInfo; - - //---------------------- 生成房间小地图预览 ---------------------- - //先计算范围 - var x = int.MaxValue; - var y = int.MaxValue; - var x2 = int.MinValue; - var y2 = int.MinValue; - for (var i = 0; i < tileInfo.Floor.Count; i += 5) - { - var posX = tileInfo.Floor[i]; - var posY = tileInfo.Floor[i + 1]; - x = Mathf.Min(x, posX); - x2 = Mathf.Max(x2, posX); - y = Mathf.Min(y, posY); - y2 = Mathf.Max(y2, posY); - } - //创建image, 这里留两个像素宽高用于描边 - var image = Image.Create(x2 - x + 3, y2 - y + 3, false, Image.Format.Rgba8); - //image.Fill(Colors.Green); - //填充像素点 - for (var i = 0; i < tileInfo.Floor.Count; i += 5) - { - var posX = tileInfo.Floor[i] - x + 1; - var posY = tileInfo.Floor[i + 1] - y + 1; - image.SetPixel(posX, posY, new Color(0, 0, 0, 0.5882353F)); - } - //创建texture - var imageTexture = ImageTexture.CreateFromImage(image); - roomInfo.PreviewTexture = imageTexture; - - //---------------------- 填充tile操作 ---------------------- - //底层 - for (var i = 0; i < tileInfo.Floor.Count; i += 5) - { - var posX = tileInfo.Floor[i]; - var posY = tileInfo.Floor[i + 1]; - var sourceId = tileInfo.Floor[i + 2]; - var atlasCoordsX = tileInfo.Floor[i + 3]; - var atlasCoordsY = tileInfo.Floor[i + 4]; - var pos = new Vector2I(roomInfo.Position.X + posX - rectPos.X, roomInfo.Position.Y + posY - rectPos.Y); - _tileRoot.SetCell(GameConfig.FloorMapLayer, pos, sourceId, new Vector2I(atlasCoordsX, atlasCoordsY)); - } - //中层 - for (var i = 0; i < tileInfo.Middle.Count; i += 5) - { - var posX = tileInfo.Middle[i]; - var posY = tileInfo.Middle[i + 1]; - var sourceId = tileInfo.Middle[i + 2]; - var atlasCoordsX = tileInfo.Middle[i + 3]; - var atlasCoordsY = tileInfo.Middle[i + 4]; - var pos = new Vector2I(roomInfo.Position.X + posX - rectPos.X, roomInfo.Position.Y + posY - rectPos.Y); - _tileRoot.SetCell(GameConfig.MiddleMapLayer, pos, sourceId, new Vector2I(atlasCoordsX, atlasCoordsY)); - } - //顶层 - for (var i = 0; i < tileInfo.Top.Count; i += 5) - { - var posX = tileInfo.Top[i]; - var posY = tileInfo.Top[i + 1]; - var sourceId = tileInfo.Top[i + 2]; - var atlasCoordsX = tileInfo.Top[i + 3]; - var atlasCoordsY = tileInfo.Top[i + 4]; - var pos = new Vector2I(roomInfo.Position.X + posX - rectPos.X, roomInfo.Position.Y + posY - rectPos.Y); - _tileRoot.SetCell(GameConfig.TopMapLayer, pos, sourceId, new Vector2I(atlasCoordsX, atlasCoordsY)); - } - - //寻找可用传送点 - var maxCount = (roomInfo.Size.X - 2) * (roomInfo.Size.Y - 2); - var startPosition = roomInfo.Position + roomInfo.Size / 2; - for (int i = 0; i < maxCount; i++) - { - var pos = SpiralUtil.Screw(i) + startPosition; - if (IsWayTile(GameConfig.FloorMapLayer, pos.X, pos.Y)) - { - roomInfo.Waypoints = pos; - break; - } - } - - //---------------------- 随机选择预设 ---------------------- - RoomPreinstallInfo preinstallInfo; - if (EditorPlayManager.IsPlay && roomInfo.RoomType == GameApplication.Instance.DungeonManager.CurrConfig.DesignatedType) //编辑器模式, 指定预设 - { - preinstallInfo = EditorManager.SelectPreinstall; - } - else //普通模式 - { - if (roomInfo.RoomSplit.Preinstall.Count == 1) - { - preinstallInfo = roomInfo.RoomSplit.Preinstall[0]; - } - else - { - var weights = roomInfo.RoomSplit.Preinstall.Select(info => info.Weight).ToArray(); - var index = random.RandomWeight(weights); - preinstallInfo = roomInfo.RoomSplit.Preinstall[index]; - } - } - - var roomPreinstall = new RoomPreinstall(roomInfo, preinstallInfo); - roomInfo.RoomPreinstall = roomPreinstall; - //执行预处理操作 - roomPreinstall.Pretreatment(random); + var posX = tileInfo.Floor[i] - x + 1; + var posY = tileInfo.Floor[i + 1] - y + 1; + image.SetPixel(posX, posY, new Color(0, 0, 0, 0.5882353F)); } + //创建texture + var imageTexture = ImageTexture.CreateFromImage(image); + roomInfo.PreviewTexture = imageTexture; + //---------------------- 填充tile操作 ---------------------- + var terrainInfo = config.TerrainInfo; + + SetAutoLayerDataFromList(MapLayer.AutoFloorLayer, config.SourceId, roomInfo, tileInfo.Floor, rectPos, terrainInfo); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer1, roomInfo, tileInfo.CustomFloor1, rectPos); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer2, roomInfo, tileInfo.CustomFloor2, rectPos); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer3, roomInfo, tileInfo.CustomFloor3, rectPos); + SetCustomLayerDataFromList(MapLayer.CustomMiddleLayer1, roomInfo, tileInfo.CustomMiddle1, rectPos); + SetCustomLayerDataFromList(MapLayer.CustomMiddleLayer2, roomInfo, tileInfo.CustomMiddle2, rectPos); + SetCustomLayerDataFromList(MapLayer.CustomTopLayer, roomInfo, tileInfo.CustomTop, rectPos); + + //寻找可用传送点 + var maxCount = (roomInfo.Size.X - 2) * (roomInfo.Size.Y - 2); + var startPosition = roomInfo.Position + roomInfo.Size / 2; + for (int i = 0; i < maxCount; i++) + { + var pos = SpiralUtil.Screw(i) + startPosition; + if (IsWayTile(MapLayer.AutoFloorLayer, pos.X, pos.Y)) + { + roomInfo.Waypoints = pos; + break; + } + } + + //---------------------- 随机选择预设 ---------------------- + RoomPreinstallInfo preinstallInfo; + if (EditorPlayManager.IsPlay && roomInfo.RoomType == GameApplication.Instance.DungeonManager.CurrConfig.DesignatedType) //编辑器模式, 指定预设 + { + preinstallInfo = EditorTileMapManager.SelectPreinstall; + } + else //普通模式 + { + if (roomInfo.RoomSplit.Preinstall.Count == 1) + { + preinstallInfo = roomInfo.RoomSplit.Preinstall[0]; + } + else + { + var weights = roomInfo.RoomSplit.Preinstall.Select(info => info.Weight).ToArray(); + var index = world.Random.RandomWeight(weights); + preinstallInfo = roomInfo.RoomSplit.Preinstall[index]; + } + } + + var roomPreinstall = new RoomPreinstall(roomInfo, preinstallInfo); + roomInfo.RoomPreinstall = roomPreinstall; + //执行预处理操作 + roomPreinstall.Pretreatment(world); + } + + + private IEnumerator _AutoFillAisleTile(AutoTileConfig config, RoomInfo roomInfo, World world) + { + foreach (var info in roomInfo.Next) + { + yield return _AutoFillAisleTile(config, info, world); + } + + // yield break; //铺过道 foreach (var doorInfo in roomInfo.Doors) { @@ -190,319 +142,80 @@ { continue; } - - //普通的直线连接 - var doorDir1 = doorInfo.Direction; - var doorDir2 = doorInfo.ConnectDoor.Direction; - if (!doorInfo.HasCross) - { - var rect = doorInfo.GetAisleRect(); - switch (doorDir1) - { - case DoorDirection.E: - FullHorizontalAisle(config, rect); - FullHorizontalAisleLeft(config, rect, doorInfo); - FullHorizontalAisleRight(config, rect, doorInfo.ConnectDoor); - break; - case DoorDirection.W: - FullHorizontalAisle(config, rect); - FullHorizontalAisleLeft(config, rect, doorInfo.ConnectDoor); - FullHorizontalAisleRight(config, rect, doorInfo); - break; - - case DoorDirection.S: - FullVerticalAisle(config, rect); - FullVerticalAisleUp(config, rect, doorInfo); - FullVerticalAisleDown(config, rect, doorInfo.ConnectDoor); - break; - case DoorDirection.N: - FullVerticalAisle(config, rect); - FullVerticalAisleUp(config, rect, doorInfo.ConnectDoor); - FullVerticalAisleDown(config, rect, doorInfo); - break; - } - } - else //带交叉点 - { - //方向, 0横向, 1纵向 - var dir1 = 0; - var dir2 = 0; - var aisleRect = doorInfo.GetCrossAisleRect(); - var rect = aisleRect.Rect1; - var rect2 = aisleRect.Rect2; - - //计算范围 - switch (doorDir1) - { - case DoorDirection.E: //→ - break; - case DoorDirection.W: //← - break; - case DoorDirection.S: //↓ - dir1 = 1; - break; - case DoorDirection.N: //↑ - dir1 = 1; - break; - } - - switch (doorDir2) - { - case DoorDirection.E: //→ - break; - case DoorDirection.W: //← - break; - case DoorDirection.S: //↓ - dir2 = 1; - break; - case DoorDirection.N: //↑ - dir2 = 1; - break; - } - - //填充交叉点 - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, aisleRect.Cross.Position, aisleRect.Cross.Size); + //铺过道 + if (doorInfo.AisleFloorCell != null) + { + yield return 0; - //墙壁, 0横向, 1纵向 - if (dir1 == 0) + //创建image, 这里留两个像素宽高用于描边 + var aisleImage = Image.Create(doorInfo.AisleFloorRect.Size.X, doorInfo.AisleFloorRect.Size.Y, false, Image.Format.Rgba8); + //image.Fill(new Color(0, 1, 0, 0.2f)); + //填充像素点 + foreach (var p in doorInfo.AisleFloorCell) { - FullHorizontalAisle(config, rect); - FullHorizontalAisleLeft(config, rect, doorDir1 == DoorDirection.E ? doorInfo : null); - FullHorizontalAisleRight(config, rect, doorDir1 == DoorDirection.W ? doorInfo : null); + _tileRoot.SetCell(MapLayer.AutoFloorLayer, p, config.Floor.SourceId, config.Floor.AutoTileCoords); + //_tileRoot.SetCell(MapLayer.CustomTopLayer, p, config.Auto_000_010_000.SourceId, config.Auto_000_010_000.AutoTileCoords); + aisleImage.SetPixel(p.X - doorInfo.AisleFloorRect.Position.X, p.Y - doorInfo.AisleFloorRect.Position.Y, new Color(1, 1, 1, 0.5882353F)); } - else - { - FullVerticalAisle(config, rect); - FullVerticalAisleUp(config, rect, doorDir1 == DoorDirection.S ? doorInfo : null); - FullVerticalAisleDown(config, rect, doorDir1 == DoorDirection.N ? doorInfo : null); - } - - if (dir2 == 0) - { - FullHorizontalAisle(config, rect2); - FullHorizontalAisleLeft(config, rect2, doorDir2 == DoorDirection.E ? doorInfo.ConnectDoor : null); - FullHorizontalAisleRight(config, rect2, doorDir2 == DoorDirection.W ? doorInfo.ConnectDoor : null); - } - else - { - FullVerticalAisle(config, rect2); - FullVerticalAisleUp(config, rect2, doorDir2 == DoorDirection.S ? doorInfo.ConnectDoor : null); - FullVerticalAisleDown(config, rect2, doorDir2 == DoorDirection.N ? doorInfo.ConnectDoor : null); - } - - if ((doorDir1 == DoorDirection.N && doorDir2 == DoorDirection.E) || //↑→ - (doorDir2 == DoorDirection.N && doorDir1 == DoorDirection.E)) - { - FillRect(GameConfig.TopMapLayer, config.OUT_RT, - doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1), - Vector2.One); - FillRect(GameConfig.TopMapLayer, config.IN_RT, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0), - Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross, new Vector2(GameConfig.CorridorWidth - 1, 1)); - FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 1), - new Vector2(1, GameConfig.CorridorWidth - 1)); - } - else if ((doorDir1 == DoorDirection.E && doorDir2 == DoorDirection.S) || //→↓ - (doorDir2 == DoorDirection.E && doorDir1 == DoorDirection.S)) - { - FillRect(GameConfig.MiddleMapLayer, config.OUT_RB, doorInfo.Cross, Vector2.One); - FillRect(GameConfig.TopMapLayer, config.IN_RB, - doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, - GameConfig.CorridorWidth - 1), - Vector2.One); - FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0), - new Vector2(1, GameConfig.CorridorWidth - 1)); - FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1), - new Vector2(GameConfig.CorridorWidth - 1, 1)); - } - else if ((doorDir1 == DoorDirection.S && doorDir2 == DoorDirection.W) || //↓← - (doorDir2 == DoorDirection.S && doorDir1 == DoorDirection.W)) - { - FillRect(GameConfig.MiddleMapLayer, config.OUT_LB, - doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0), Vector2.One); - FillRect(GameConfig.TopMapLayer, config.IN_LB, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1), - Vector2.One); - FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross, new Vector2(1, GameConfig.CorridorWidth - 1)); - FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(1, GameConfig.CorridorWidth - 1), - new Vector2(GameConfig.CorridorWidth - 1, 1)); - } - else if ((doorDir1 == DoorDirection.W && doorDir2 == DoorDirection.N) || //←↑ - (doorDir2 == DoorDirection.W && doorDir1 == DoorDirection.N)) - { - FillRect(GameConfig.TopMapLayer, config.OUT_LT, - doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, - GameConfig.CorridorWidth - 1), - Vector2.One); - FillRect(GameConfig.TopMapLayer, config.IN_LT, doorInfo.Cross, Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross + new Vector2(1, 0), - new Vector2(GameConfig.CorridorWidth - 1, 1)); - FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross + new Vector2(0, 1), - new Vector2(1, GameConfig.CorridorWidth - 1)); - } - - //在房间墙上开洞 - switch (doorDir1) - { - case DoorDirection.E: //→ - ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(-1, 1), - new Vector2(1, rect.Size.Y - 2)); - break; - case DoorDirection.W: //← - ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(0, 1), - new Vector2(1, rect.Size.Y - 2)); - break; - case DoorDirection.S: //↓ - ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(1, -1), - new Vector2(rect.Size.X - 2, 1)); - break; - case DoorDirection.N: //↑ - ClearRect(GameConfig.MiddleMapLayer, doorInfo.OriginPosition + new Vector2(1, 2), - new Vector2(rect.Size.X - 2, 1)); - break; - } - - switch (doorDir2) - { - case DoorDirection.E: //→ - ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(-1, 1), - new Vector2(1, rect2.Size.Y - 2)); - break; - case DoorDirection.W: //← - ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(0, 1), - new Vector2(1, rect2.Size.Y - 2)); - break; - case DoorDirection.S: //↓ - ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, -1), - new Vector2(rect2.Size.X - 2, 1)); - break; - case DoorDirection.N: //↑ - ClearRect(GameConfig.MiddleMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, 0), - new Vector2(rect2.Size.X - 2, 1)); - break; - } + //创建texture + var aisleImageTexture = ImageTexture.CreateFromImage(aisleImage); + doorInfo.AislePreviewTexture = aisleImageTexture; + doorInfo.ConnectDoor.AislePreviewTexture = aisleImageTexture; } - - //先计算范围 - var x = int.MaxValue; - var y = int.MaxValue; - var x2 = int.MinValue; - var y2 = int.MinValue; - _tempAisleFloorGrid.ForEach((gx, gy, data) => - { - x = Mathf.Min(x, gx); - x2 = Mathf.Max(x2, gx); - y = Mathf.Min(y, gy); - y2 = Mathf.Max(y2, gy); - }); - //创建image, 这里留两个像素宽高用于描边 - var image = Image.Create(x2 - x + 3, y2 - y + 3, false, Image.Format.Rgba8); - //填充像素点 - _tempAisleFloorGrid.ForEach((gx, gy, data) => - { - var posX = gx - x + 1; - var posY = gy - y + 1; - image.SetPixel(posX, posY, new Color(0, 0, 0, 0.5882353F)); - }); - //创建texture - var imageTexture = ImageTexture.CreateFromImage(image); - doorInfo.AislePreviewTexture = imageTexture; - doorInfo.ConnectDoor.AislePreviewTexture = imageTexture; - - _tempAisleFloorGrid.Clear(); } } - /// - /// 给TileMap添加轮廓, 该函数为协程函数 - /// - /// 描轮廓的Tile - public IEnumerator AddOutlineTile(TileCellInfo tileCellInfo) + + public void GenerateWallAndNavigation(World world, AutoTileConfig config) { - var c = 0; - var rect = _tileRoot.GetUsedRect(); - var endX = rect.End.X + 1; - var endY = rect.End.Y + 1; - for (int x = rect.Position.X - 1; x <= endX; x++) + var navigation = new NavigationRegion2D(); + navigation.Name = "Navigation"; + world.NavigationRoot.AddChild(navigation); + TileMapUtils.GenerateTerrain(_tileRoot, navigation, config); + } + + //设置自动地形层的数据 + private void SetAutoLayerDataFromList(int layer, int sourceId, RoomInfo roomInfo, List data, Vector2I rectPos, TileSetTerrainInfo terrainInfo) + { + for (var i = 0; i < data.Count; i += 4) { - for (int y = rect.Position.Y - 1; y <= endY; y++) - { - if (c++ > 1000) //份帧处理, 不要挤在一帧 - { - c = 0; - yield return 0; - } - var pos = new Vector2I(x, y); - var flag1 = _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, pos) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, pos) != -1 || - _tileRoot.GetCellSourceId(GameConfig.AisleFloorMapLayer, pos) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, pos) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, pos) != tileCellInfo.AutoTileCoord); - if (!flag1) //空地 - { - var posDown = new Vector2I(pos.X, pos.Y + 1); - var posTop = new Vector2I(pos.X, pos.Y - 1); - var posLeft = new Vector2I(pos.X - 1, pos.Y); - var posRight = new Vector2I(pos.X + 1, pos.Y); - - var posLD = new Vector2I(pos.X - 1, pos.Y + 1); - var posLT = new Vector2I(pos.X - 1, pos.Y - 1); - var posRD = new Vector2I(pos.X + 1, pos.Y + 1); - var posRT = new Vector2I(pos.X + 1, pos.Y - 1); - - var flag2 = _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posDown) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posDown) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posDown) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posDown) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posTop) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posTop) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posTop) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posTop) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posLeft) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posLeft) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posLeft) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posLeft) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posRight) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posRight) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posRight) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posRight) != tileCellInfo.AutoTileCoord) || - // - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posLD) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posLD) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posLD) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posLD) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posLT) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posLT) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posLT) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posLT) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posRD) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posRD) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posRD) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posRD) != tileCellInfo.AutoTileCoord) || - - _tileRoot.GetCellSourceId(GameConfig.FloorMapLayer, posRT) != -1 || - _tileRoot.GetCellSourceId(GameConfig.MiddleMapLayer, posRT) != -1 || - (_tileRoot.GetCellSourceId(GameConfig.TopMapLayer, posRT) != -1 && _tileRoot.GetCellAtlasCoords(GameConfig.TopMapLayer, posRT) != tileCellInfo.AutoTileCoord); - - if (flag2) //非空地, 那么说明这个点需要填充 WALL_BLOCK - { - _tileRoot.SetCell(GameConfig.TopMapLayer, pos, tileCellInfo.Id, tileCellInfo.AutoTileCoord); - } - } - } + var posX = data[i]; + var posY = data[i + 1]; + var pos = new Vector2I(roomInfo.Position.X + posX - rectPos.X, roomInfo.Position.Y + posY - rectPos.Y); + var bit = (uint)data[i + 2]; + var type = (byte)data[i + 3]; + var index = terrainInfo.TerrainBitToIndex(bit, type); + var terrainCell = terrainInfo.GetTerrainCell(index, type); + var atlasCoords = terrainInfo.GetPosition(terrainCell); + _tileRoot.SetCell(layer, pos, sourceId, atlasCoords); + } + } + + //设置自定义层的数据 + private void SetCustomLayerDataFromList(int layer, RoomInfo roomInfo, List data, Vector2I rectPos) + { + for (var i = 0; i < data.Count; i += 5) + { + var posX = data[i]; + var posY = data[i + 1]; + var sourceId = data[i + 2]; + var atlasCoordsX = data[i + 3]; + var atlasCoordsY = data[i + 4]; + var pos = new Vector2I(roomInfo.Position.X + posX - rectPos.X, roomInfo.Position.Y + posY - rectPos.Y); + _tileRoot.SetCell(layer, pos, sourceId, new Vector2I(atlasCoordsX, atlasCoordsY)); } } //填充tile区域 - private void FillRect(int layer, TileCellInfo info, Vector2 pos, Vector2 size) + private void FillRect(int layer, TileCellData data, Vector2 pos, Vector2 size) { for (int i = 0; i < size.X; i++) { for (int j = 0; j < size.Y; j++) { var p = new Vector2I((int)pos.X + i, (int)pos.Y + j); - if (layer == GameConfig.AisleFloorMapLayer) - { - _tempAisleFloorGrid.Set(p, true); - } - _tileRoot.SetCell(layer, p, 0, info.AutoTileCoord); + _tileRoot.SetCell(layer, p, data.SourceId, data.AutoTileCoords); } } } @@ -515,876 +228,16 @@ for (int j = 0; j < size.Y; j++) { var p = new Vector2I((int)pos.X + i, (int)pos.Y + j); - if (layer == GameConfig.AisleFloorMapLayer) - { - _tempAisleFloorGrid.Remove(p.X, p.Y); - } _tileRoot.SetCell(layer, p, 0); } } } - - //横向过道 - private void FullHorizontalAisle(AutoTileConfig config, Rect2 rect) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(0, 1), rect.Size - new Vector2(0, 2)); - FillRect(GameConfig.MiddleMapLayer, config.T, rect.Position, new Vector2(rect.Size.X, 1)); - FillRect(GameConfig.TopMapLayer, config.B, rect.Position + new Vector2(0, rect.Size.Y - 1), new Vector2(rect.Size.X, 1)); - } - - //纵向过道 - private void FullVerticalAisle(AutoTileConfig config, Rect2 rect) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(1, 0), rect.Size - new Vector2(2, 0)); - FillRect(GameConfig.TopMapLayer, config.L, rect.Position, new Vector2(1, rect.Size.Y)); - FillRect(GameConfig.TopMapLayer, config.R, rect.Position + new Vector2(rect.Size.X - 1, 0), new Vector2(1, rect.Size.Y)); - } - - //横向过道, 门朝右, 连接方向向左 - private void FullHorizontalAisleLeft(AutoTileConfig config, Rect2 rect, RoomDoorInfo doorInfo = null) - { - //左 - ClearRect(GameConfig.TopMapLayer, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.Y - 2)); - if (doorInfo == null) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(-1, 1), - new Vector2(1, rect.Size.Y - 2)); - } - else - { - ClearRect(GameConfig.TopMapLayer, rect.Position + new Vector2(-1, 0), Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.OUT_LB, rect.Position + new Vector2(-1, 0), Vector2.One); - FillRect(GameConfig.TopMapLayer, config.OUT_LT, rect.Position + new Vector2(-1, 3), Vector2.One); - - FillRect(GameConfig.FloorMapLayer, config.Floor, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.Y - 2)); - //生成门的导航区域 - var x = rect.Position.X * GameConfig.TileCellSize; - var y = rect.Position.Y * GameConfig.TileCellSize; - - var op1 = new Vector2(x - GameConfig.TileCellSize * 1.5f, y + GameConfig.TileCellSize * 1.5f); - var op2 = new Vector2(x + GameConfig.TileCellSize * 0.5f, y + GameConfig.TileCellSize * 1.5f); - var op3 = new Vector2(x + GameConfig.TileCellSize * 0.5f, y + GameConfig.TileCellSize * 3f); - var op4 = new Vector2(x - GameConfig.TileCellSize * 1.5f, y + GameConfig.TileCellSize * 3f); - AddDoorNavigation( - doorInfo, op1, op2, op3, op4, - op1, - new Vector2(op1.X + GameConfig.TileCellSize, op2.Y), - new Vector2(op1.X + GameConfig.TileCellSize, op3.Y), - op4 - ); - } - } - - //横向过道, 门朝左, 连接方向向右 - private void FullHorizontalAisleRight(AutoTileConfig config, Rect2 rect, RoomDoorInfo doorInfo = null) - { - //右 - ClearRect(GameConfig.TopMapLayer, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); - if (doorInfo == null) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); - } - else - { - ClearRect(GameConfig.TopMapLayer, rect.Position + new Vector2(rect.Size.X, 0), Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.OUT_RB, rect.Position + new Vector2(rect.Size.X, 0), Vector2.One); - FillRect(GameConfig.TopMapLayer, config.OUT_RT, rect.Position + new Vector2(rect.Size.X, 3), Vector2.One); - - FillRect(GameConfig.FloorMapLayer, config.Floor, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); - //生成门的导航区域 - var x = rect.Position.X * GameConfig.TileCellSize; - var y = rect.Position.Y * GameConfig.TileCellSize; - - var op1 = new Vector2(x - GameConfig.TileCellSize * 1.5f + (rect.Size.X + 1) * GameConfig.TileCellSize, y + GameConfig.TileCellSize * 1.5f); - var op2 = new Vector2(x + GameConfig.TileCellSize * 0.5f + (rect.Size.X + 1) * GameConfig.TileCellSize, y + GameConfig.TileCellSize * 1.5f); - var op3 = new Vector2(x + GameConfig.TileCellSize * 0.5f + (rect.Size.X + 1) * GameConfig.TileCellSize, y + GameConfig.TileCellSize * 3f); - var op4 = new Vector2(x - GameConfig.TileCellSize * 1.5f + (rect.Size.X + 1) * GameConfig.TileCellSize, y + GameConfig.TileCellSize * 3f); - AddDoorNavigation( - doorInfo, op1, op2, op3, op4, - new Vector2(op2.X - GameConfig.TileCellSize, op1.Y), - op2, - op3, - new Vector2(op2.X - GameConfig.TileCellSize, op4.Y) - ); - } - } - - //纵向过道, 门朝下, 连接方向向上 - private void FullVerticalAisleUp(AutoTileConfig config, Rect2 rect, RoomDoorInfo doorInfo = null) - { - //上 - ClearRect(GameConfig.TopMapLayer, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.X - 2, 1)); - if (doorInfo == null) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(1, -1), - new Vector2(rect.Size.X - 2, 1)); - } - else - { - FillRect(GameConfig.TopMapLayer, config.OUT_RT, rect.Position + new Vector2(0, -1), Vector2.One); - FillRect(GameConfig.TopMapLayer, config.OUT_LT, rect.Position + new Vector2(3, -1), Vector2.One); - - FillRect(GameConfig.FloorMapLayer, config.Floor, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.X - 2, 1)); - //生成门的导航区域 - var x = rect.Position.X * GameConfig.TileCellSize; - var y = rect.Position.Y * GameConfig.TileCellSize; - - var op1 = new Vector2(x + GameConfig.TileCellSize * 1.5f, y - GameConfig.TileCellSize * 1f); - var op2 = new Vector2(x + GameConfig.TileCellSize * 2.5f, y - GameConfig.TileCellSize * 1f); - var op3 = new Vector2(x + GameConfig.TileCellSize * 2.5f, y + GameConfig.TileCellSize * 0.5f); - var op4 = new Vector2(x + GameConfig.TileCellSize * 1.5f, y + GameConfig.TileCellSize * 0.5f); - AddDoorNavigation( - doorInfo, op1, op2, op3, op4, - op1, - op2, - new Vector2(op3.X, op1.Y + GameConfig.TileCellSize), - new Vector2(op4.X, op1.Y + GameConfig.TileCellSize) - ); - } - } - - //纵向过道, 门朝上, 连接方向向下 - private void FullVerticalAisleDown(AutoTileConfig config, Rect2 rect, RoomDoorInfo doorInfo = null) - { - //下 - ClearRect(GameConfig.MiddleMapLayer, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); - if (doorInfo == null) - { - FillRect(GameConfig.AisleFloorMapLayer, config.Floor, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); - } - else - { - FillRect(GameConfig.MiddleMapLayer, config.OUT_RB, rect.Position + new Vector2(0, rect.Size.Y), Vector2.One); - FillRect(GameConfig.MiddleMapLayer, config.OUT_LB, rect.Position + new Vector2(3, rect.Size.Y), Vector2.One); - - FillRect(GameConfig.FloorMapLayer, config.Floor, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); - //生成门的导航区域 - var x = rect.Position.X * GameConfig.TileCellSize; - var y = rect.Position.Y * GameConfig.TileCellSize; - - var op1 = new Vector2(x + GameConfig.TileCellSize * 1.5f, y - GameConfig.TileCellSize * 1f + (rect.Size.Y + 1) * GameConfig.TileCellSize); - var op2 = new Vector2(x + GameConfig.TileCellSize * 2.5f, y - GameConfig.TileCellSize * 1f + (rect.Size.Y + 1) * GameConfig.TileCellSize); - var op3 = new Vector2(x + GameConfig.TileCellSize * 2.5f, y + GameConfig.TileCellSize * 0.5f + (rect.Size.Y + 1) * GameConfig.TileCellSize); - var op4 = new Vector2(x + GameConfig.TileCellSize * 1.5f, y + GameConfig.TileCellSize * 0.5f + (rect.Size.Y + 1) * GameConfig.TileCellSize); - AddDoorNavigation( - doorInfo, op1, op2, op3, op4, - new Vector2(op1.X, op3.Y - GameConfig.TileCellSize), - new Vector2(op2.X, op3.Y - GameConfig.TileCellSize), - op3, - op4 - ); - } - } - - /// - /// 添加房间 - /// - private void AddDoorNavigation(RoomDoorInfo doorInfo, - Vector2 op1, Vector2 op2, Vector2 op3, Vector2 op4, - Vector2 cp1, Vector2 cp2, Vector2 cp3, Vector2 cp4) - { - var openPolygonData = new NavigationPolygonData(); - openPolygonData.Type = NavigationPolygonType.Out; - openPolygonData.SetPoints(new []{ op1, op2, op3, op4 }); - - var closePolygonData = new NavigationPolygonData(); - closePolygonData.Type = NavigationPolygonType.Out; - closePolygonData.SetPoints(new []{ cp1, cp2, cp3, cp4 }); - - _connectNavigationItemList.Add(new DoorNavigationInfo(doorInfo, openPolygonData, closePolygonData)); - } - - /// - /// 计算并动生成导航区域, layer 为需要计算的层级,如果没有设置 floorAtlasCoords,则该 layer 下不为空的地砖都将视为可行走区域 - /// - public void GenerateNavigationPolygon(int layer) - { - _usePoints.Clear(); - _polygonDataList.Clear(); - - try - { - var size = new Vector2(GameConfig.TileCellSize, GameConfig.TileCellSize); - - var rect = _tileRoot.GetUsedRect(); - - var x = rect.Position.X; - var y = rect.Position.Y; - var w = rect.Size.X; - var h = rect.Size.Y; - - for (int j = y; j < h; j++) - { - for (int i = x; i < w; i++) - { - if (IsWayTile(layer, i, j)) - { - if (!_usePoints.Contains(new Vector2I(i, j))) - { - NavigationPolygonData polygonData = null; - - if (!IsWayTile(layer, i, j - 1)) - { - polygonData = CalcOutline(layer, i, j, size); - } - else if (!IsWayTile(layer, i, j + 1)) - { - polygonData = CalcInline(layer, i, j, size); - } - - if (polygonData != null) - { - _polygonDataList.Add(polygonData); - } - } - } - } - } - - _generateNavigationResult = new GenerateNavigationResult(true); - } - catch (NavigationPointException e) - { - _usePoints.Clear(); - _polygonDataList.Clear(); - Debug.Log(e.Message); - _generateNavigationResult = new GenerateNavigationResult(false, e); - } - } - - /// - /// 获取生成导航区域操作的结果, 如果没有调用过 GenerateNavigationPolygon() 函数, 则返回 null - /// - /// - public GenerateNavigationResult GetGenerateNavigationResult() - { - return _generateNavigationResult; - } - - /// - /// 将导航区域挂载到 navigationRoot 上 - /// - public void MountNavigationPolygon(Node2D navigationRoot) - { - //TestData(); - // 在 Godot4.0_rc6 中 如果将所有点都放在 NavigationPolygon 里面, 即使点是对的, 但调用 MakePolygonsFromOutlines 还是可能会报错, 这应该是个bug - - //通过 GenerateNavigationPolygon() 计算出来的导航区域 - for (var i = 0; i < _polygonDataList.Count; i++) - { - var polygonData = _polygonDataList[i]; - CreateNavigationRegion(navigationRoot, polygonData); - } - - //门占用区域的导航区域 - for (var i = 0; i < _connectNavigationItemList.Count; i++) - { - var item = _connectNavigationItemList[i]; - item.CloseNavigationNode = CreateNavigationRegion(navigationRoot, item.CloseNavigationData); - item.OpenNavigationNode = CreateNavigationRegion(navigationRoot, item.OpenNavigationData); - item.CloseNavigationNode.Enabled = false; - item.OpenNavigationNode.Enabled = false; - item.DoorInfo.Navigation = item; - } - } - - //创建导航区域 - private NavigationRegion2D CreateNavigationRegion(Node2D navigationRoot, NavigationPolygonData polygonData) - { - var polygon = new NavigationPolygon(); - polygon.AddOutline(polygonData.GetPoints()); - polygon.MakePolygonsFromOutlines(); - var navigationPolygon = new NavigationRegion2D(); - navigationPolygon.Name = "NavigationRegion" + (navigationRoot.GetChildCount() + 1); - navigationPolygon.NavigationPolygon = polygon; - navigationRoot.AddChild(navigationPolygon); - return navigationPolygon; - } - - /// - /// 获取房间内的导航点数据 - /// - public NavigationPolygonData[] GetPolygonData() - { - return _polygonDataList.ToArray(); - } - - /// - /// 设置导航网格数据 - /// - /// - public void SetPolygonData(List list) - { - _polygonDataList.Clear(); - _polygonDataList.AddRange(list); - _generateNavigationResult = new GenerateNavigationResult(true); - } - - /// - /// 清除生成的导航数据 - /// - public void ClearPolygonData() - { - _polygonDataList.Clear(); - _generateNavigationResult = null; - } - - /// - /// 获取连接门导航数据, 必须要调用 AutoFillRoomTile() 函数才有数据 - /// - public NavigationPolygonData[] GetConnectDoorPolygonData() - { - var array = new NavigationPolygonData[_connectNavigationItemList.Count]; - for (var i = 0; i < _connectNavigationItemList.Count; i++) - { - array[i] = _connectNavigationItemList[i].OpenNavigationData; - } - return array; - } - - /// - /// 设置地面的地砖,将影响导航网格计算 - /// - public void SetFloorAtlasCoords(List floorAtlasCoords) - { - _floorAtlasCoords = floorAtlasCoords; - } /// /// 返回指定位置的Tile是否为可以行走 /// private bool IsWayTile(int layer, int x, int y) { - if (_floorAtlasCoords == null || _floorAtlasCoords.Count == 0) - { - return _tileRoot.GetCellSourceId(layer, new Vector2I(x, y)) != -1; - } - - var result = _tileRoot.GetCellAtlasCoords(layer, new Vector2I(x, y)); - return _floorAtlasCoords.Contains(result); - } - - //计算导航网格外轮廓 - private NavigationPolygonData CalcOutline(int layer, int i, int j, Vector2 size) - { - var polygonData = new NavigationPolygonData(); - polygonData.Type = NavigationPolygonType.Out; - var points = new List(); - // 0:右, 1:下, 2:左, 3:上 - var dir = 0; - var offset = new Vector2(size.X * 0.5f, size.Y * 0.5f); - //找到路, 向右开始找边界 - var startPos = new Vector2I(i, j); - - var tempI = i; - var tempJ = j; - - while (true) - { - switch (dir) - { - case 0: //右 - { - if (IsWayTile(layer, tempI, tempJ - 1)) //先向上找 - { - dir = 3; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempJ--; - break; - } - else if (IsWayTile(layer, tempI + 1, tempJ)) //再向右找 - { - if (points.Count == 0) - { - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempI++; - break; - } - else if (IsWayTile(layer, tempI, tempJ + 1)) //向下找 - { - dir = 1; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempJ++; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 1: //下 - { - if (IsWayTile(layer, tempI + 1, tempJ)) //先向右找 - { - dir = 0; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempI++; - break; - } - else if (IsWayTile(layer, tempI, tempJ + 1)) //再向下找 - { - if (points.Count == 0) - { - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempJ++; - break; - } - else if (IsWayTile(layer, tempI - 1, tempJ)) //向左找 - { - dir = 2; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempI--; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 2: //左 - { - if (IsWayTile(layer, tempI, tempJ + 1)) //先向下找 - { - dir = 1; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempJ++; - break; - } - else if (IsWayTile(layer, tempI - 1, tempJ)) //再向左找 - { - if (points.Count == 0) - { - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempI--; - break; - } - else if (IsWayTile(layer, tempI, tempJ - 1)) //向上找 - { - dir = 3; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempJ--; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 3: //上 - { - if (IsWayTile(layer, tempI - 1, tempJ)) //先向左找 - { - dir = 2; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempI--; - break; - } - else if (IsWayTile(layer, tempI, tempJ - 1)) //再向上找 - { - if (points.Count == 0) - { - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempJ--; - break; - } - else if (IsWayTile(layer, tempI + 1, tempJ)) //向右找 - { - dir = 0; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempI++; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - } - } - } - - //计算导航网格内轮廓 - private NavigationPolygonData CalcInline(int layer, int i, int j, Vector2 size) - { - var polygonData = new NavigationPolygonData(); - polygonData.Type = NavigationPolygonType.In; - var points = new List(); - // 0:右, 1:下, 2:左, 3:上 - var dir = 0; - var offset = new Vector2(size.X * 0.5f, size.Y * 0.5f); - //找到路, 向右开始找边界 - var startPos = new Vector2I(i - 1, j); - PutUsePoint(startPos); - - var tempI = i; - var tempJ = j; - - while (true) - { - switch (dir) - { - case 0: //右 - { - if (IsWayTile(layer, tempI, tempJ + 1)) //向下找 - { - dir = 1; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempJ++; - break; - } - else if (IsWayTile(layer, tempI + 1, tempJ)) //再向右找 - { - if (points.Count == 0) - { - //points.Add(new Vector2((tempI - 1) * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2((tempI - 1) * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempI++; - break; - } - else if (IsWayTile(layer, tempI, tempJ - 1)) //先向上找 - { - dir = 3; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempJ--; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 1: //下 - { - if (IsWayTile(layer, tempI - 1, tempJ)) //向左找 - { - dir = 2; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempI--; - break; - } - else if (IsWayTile(layer, tempI, tempJ + 1)) //再向下找 - { - if (points.Count == 0) - { - points.Add(new Vector2((tempI - 1) * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempJ++; - break; - } - else if (IsWayTile(layer, tempI + 1, tempJ)) //先向右找 - { - dir = 0; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempI++; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 2: //左 - { - if (IsWayTile(layer, tempI, tempJ - 1)) //向上找 - { - dir = 3; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempJ--; - break; - } - else if (IsWayTile(layer, tempI - 1, tempJ)) //再向左找 - { - if (points.Count == 0) - { - points.Add(new Vector2((tempI - 1) * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempI--; - break; - } - else if (IsWayTile(layer, tempI, tempJ + 1)) //先向下找 - { - dir = 1; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempJ++; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - case 3: //上 - { - if (IsWayTile(layer, tempI + 1, tempJ)) //向右找 - { - dir = 0; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - //points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y * 2)); - PutUsePoint(pos); - - tempI++; - break; - } - else if (IsWayTile(layer, tempI, tempJ - 1)) //再向上找 - { - if (points.Count == 0) - { - points.Add(new Vector2((tempI - 1) * size.X + offset.X, tempJ * size.Y + offset.Y)); - } - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - PutUsePoint(new Vector2I(tempI, tempJ)); - tempJ--; - break; - } - else if (IsWayTile(layer, tempI - 1, tempJ)) //先向左找 - { - dir = 2; - - var pos = new Vector2I(tempI, tempJ); - if (points.Count > 1 && pos == startPos) - { - polygonData.SetPoints(points.ToArray()); - return polygonData; - } - - points.Add(new Vector2(tempI * size.X + offset.X, tempJ * size.Y + offset.Y)); - PutUsePoint(pos); - - tempI--; - break; - } - - throw new NavigationPointException(new Vector2I(tempI, tempJ), "生成导航多边形发生错误! 点: " + new Vector2I(tempI, tempJ) + "发生交错!"); - } - } - } - } - - //记录导航网格中已经使用过的坐标 - private void PutUsePoint(Vector2I pos) - { - if (_usePoints.Contains(pos)) - { - throw new NavigationPointException(pos, "生成导航多边形发生错误! 点: " + pos + "发生交错!"); - } - - _usePoints.Add(pos); + return _tileRoot.GetCellSourceId(layer, new Vector2I(x, y)) != -1; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/GenerateRoomErrorCode.cs b/DungeonShooting_Godot/src/framework/map/GenerateRoomErrorCode.cs new file mode 100644 index 0000000..c9e1c3e --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/GenerateRoomErrorCode.cs @@ -0,0 +1,13 @@ + +public enum GenerateRoomErrorCode +{ + NoError, + //超出区域 + OutArea, + //没有合适的位置 + NoSuitableLocation + // //碰到其他房间或过道 + // HasCollision, + // //没有合适的门 + // NoProperDoor, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/MapLayer.cs b/DungeonShooting_Godot/src/framework/map/MapLayer.cs new file mode 100644 index 0000000..10ad947 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/MapLayer.cs @@ -0,0 +1,45 @@ + +public static class MapLayer +{ + /// + /// 自动图块地板层 + /// + public const int AutoFloorLayer = 0; + /// + /// 自定义图块地板层1 + /// + public const int CustomFloorLayer1 = AutoFloorLayer + 1; + /// + /// 自定义图块地板层2 + /// + public const int CustomFloorLayer2 = CustomFloorLayer1 + 1; + /// + /// 自定义图块地板层3 + /// + public const int CustomFloorLayer3 = CustomFloorLayer2 + 1; + /// + /// 自动图块中间层 + /// + public const int AutoMiddleLayer = CustomFloorLayer3 + 1; + /// + /// 自定义图块中间层1 + /// + public const int CustomMiddleLayer1 = AutoMiddleLayer + 1; + /// + /// 自定义图块中间层2 + /// + public const int CustomMiddleLayer2 = CustomMiddleLayer1 + 1; + /// + /// 自动图块顶层 + /// + public const int AutoTopLayer = CustomMiddleLayer2 + 1; + /// + /// 自定义图块顶层 + /// + public const int CustomTopLayer = AutoTopLayer + 1; + + /// + /// 标记数据层, 特殊层, 不会出现在 TileMap 中 + /// + public const int MarkLayer = 9999; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/RandomPool.cs b/DungeonShooting_Godot/src/framework/map/RandomPool.cs new file mode 100644 index 0000000..3328785 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/RandomPool.cs @@ -0,0 +1,145 @@ + +using System.Collections.Generic; +using Config; +using Godot; + +public class RandomPool +{ + /// + /// 随机数生成器 + /// + public SeedRandom Random { get; } + + /// + /// 所属世界 + /// + public World World { get; } + + public RandomPool(World world) + { + World = world; + Random = world.Random; + } + + /// + /// 获取随机武器 + /// + public ExcelConfig.ActivityBase GetRandomWeapon() + { + return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Weapon)); + } + + /// + /// 获取随机敌人 + /// + public ExcelConfig.ActivityBase GetRandomEnemy() + { + return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Enemy)); + } + + /// + /// 获取随机道具 + /// + public ExcelConfig.ActivityBase GetRandomProp() + { + return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Prop)); + } + + /// + /// 填充自动波次数据 + /// + public void FillAutoWave(RoomPreinstall preinstall) + { + if (preinstall.RoomInfo.RoomType == DungeonRoomType.Battle) + { + FillBattleRoom(preinstall); + } + else if (preinstall.RoomInfo.RoomType == DungeonRoomType.Reward) + { + FillRewardRoom(preinstall); + } + } + + //填充战斗房间 + private void FillBattleRoom(RoomPreinstall preinstall) + { + var count = World.Random.RandomRangeInt(3, 10); + var tileInfo = preinstall.RoomInfo.RoomSplit.TileInfo; + var serializeVector2s = tileInfo.NavigationVertices; + var vertices = new List(); + foreach (var sv2 in serializeVector2s) + { + vertices.Add(sv2.AsVector2()); + } + var positionArray = World.Random.GetRandomPositionInPolygon(vertices, tileInfo.NavigationPolygon, count); + var arr = new ActivityType[] { ActivityType.Enemy, ActivityType.Weapon, ActivityType.Prop }; + var weight = new int[] { 15, 2, 1 }; + for (var i = 0; i < count; i++) + { + var tempWave = GetOrCreateWave(preinstall, World.Random.RandomRangeInt(0, 2)); + var index = World.Random.RandomWeight(weight); + var activityType = arr[index]; + + //创建标记 + var mark = CreateMark(activityType, i * 0.3f, preinstall.RoomInfo.ToGlobalPosition(positionArray[i])); + + if (activityType == ActivityType.Enemy) //敌人 + { + mark.Id = GetRandomEnemy().Id; + mark.Attr.Add("Face", "0"); + mark.DerivedAttr = new Dictionary(); + mark.DerivedAttr.Add("Face", World.Random.RandomChoose((int)FaceDirection.Left, (int)FaceDirection.Right).ToString()); //链朝向 + if (World.Random.RandomBoolean(0.8f)) //手持武器 + { + var weapon = GetRandomWeapon(); + var weaponAttribute = Weapon.GetWeaponAttribute(weapon.Id); + mark.Attr.Add("Weapon", weapon.Id); //武器id + mark.Attr.Add("CurrAmmon", weaponAttribute.AmmoCapacity.ToString()); //弹夹弹药量 + mark.Attr.Add("ResidueAmmo", weaponAttribute.AmmoCapacity.ToString()); //剩余弹药量 + } + } + else if (activityType == ActivityType.Weapon) //武器 + { + mark.Id = GetRandomWeapon().Id; + } + else if (activityType == ActivityType.Prop) //道具 + { + mark.Id = GetRandomProp().Id; + } + tempWave.Add(mark); + } + } + + //填充奖励房间 + private void FillRewardRoom(RoomPreinstall preinstall) + { + var wave = GetOrCreateWave(preinstall, 0); + var mark = CreateMark(ActivityType.Treasure, 0, (preinstall.RoomInfo.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize); + mark.Id = "treasure_box0001"; + wave.Add(mark); + } + + private List GetOrCreateWave(RoomPreinstall preinstall,int waveIndex) + { + while (preinstall.WaveList.Count <= waveIndex) + { + preinstall.WaveList.Add(new List()); + } + + return preinstall.WaveList[waveIndex]; + } + + //创建标记 + private ActivityMark CreateMark(ActivityType activityType, float delayTime, Vector2 pos) + { + var mark = new ActivityMark(); + mark.Attr = new Dictionary(); + mark.ActivityType = activityType; + mark.MarkType = SpecialMarkType.Normal; + mark.VerticalSpeed = 0; + mark.Altitude = activityType == ActivityType.Enemy ? 0 : 8; + mark.DelayTime = delayTime; + mark.Position = pos; + return mark; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/RoomDirection.cs b/DungeonShooting_Godot/src/framework/map/RoomDirection.cs new file mode 100644 index 0000000..0befbc9 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/RoomDirection.cs @@ -0,0 +1,11 @@ + +/// +/// 生成房间的方向 +/// +public enum RoomDirection +{ + Up, + Down, + Left, + Right +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/TileCellData.cs b/DungeonShooting_Godot/src/framework/map/TileCellData.cs new file mode 100644 index 0000000..cbeed8d --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/TileCellData.cs @@ -0,0 +1,42 @@ + +using Godot; + +/// +/// 地图cell属性信息 +/// +public class TileCellData +{ + public TileCellData(int sourceId, Vector2I autoTileCoords, uint terrainPeering, byte terrainType, int defaultLayer) + { + SourceId = sourceId; + AutoTileCoords = autoTileCoords; + TerrainPeering = terrainPeering; + TerrainType = terrainType; + DefaultLayer = defaultLayer; + } + + /// + /// 在TileSet中的图块id, 也就是sourceId + /// + public int SourceId; + + /// + /// 如果是图块集, 该属性就表示在图块集的位置 + /// + public Vector2I AutoTileCoords; + + /// + /// 地形掩码, 0 表示没有配置地形 + /// + public uint TerrainPeering; + + /// + /// 默认存放层级 + /// + public int DefaultLayer; + + /// + /// 地形类型 + /// + public byte TerrainType; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/TileCellInfo.cs b/DungeonShooting_Godot/src/framework/map/TileCellInfo.cs deleted file mode 100644 index bd120a6..0000000 --- a/DungeonShooting_Godot/src/framework/map/TileCellInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using Godot; - -/// -/// 地图cell属性信息 -/// -public class TileCellInfo -{ - public TileCellInfo(int id, Vector2I autoTileCoord) - { - Id = id; - AutoTileCoord = autoTileCoord; - } - - /// - /// 在TileSet中的图块id, 也就是sourceId - /// - public int Id; - - /// - /// 如果是图块集, 该属性就表示在图块集的位置 - /// - public Vector2I AutoTileCoord; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/TileMapUtils.cs b/DungeonShooting_Godot/src/framework/map/TileMapUtils.cs new file mode 100644 index 0000000..5c3a869 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/TileMapUtils.cs @@ -0,0 +1,231 @@ + +using System.Collections.Generic; +using System.Linq; +using Godot; +using Godot.Collections; + +public static class TileMapUtils +{ + public const int MainSource = 0; + public const int MainTerrainSet = 0; + public const int MainTerrain = 0; + + /// + /// 生成自动图块和地形, 并烘焙好导航网格 + /// + public static Rect2I GenerateTerrain(TileMap tileMap, NavigationRegion2D navigationRegion, AutoTileConfig autoTileConfig) + { + var list = new List(); + var xStart = int.MaxValue; + var yStart = int.MaxValue; + var xEnd = int.MinValue; + var yEnd = int.MinValue; + + var temp = tileMap.GetUsedCells(MapLayer.AutoFloorLayer); + var autoCellLayerGrid = temp.ToHashSet(); + foreach (var (x, y) in autoCellLayerGrid) + { + //计算范围 + if (x < xStart) + xStart = x; + else if (x > xEnd) + xEnd = x; + + if (y < yStart) + yStart = y; + else if (y > yEnd) + yEnd = y; + + //填充墙壁 + if (!autoCellLayerGrid.Contains(new Vector2I(x, y - 1))) + { + var left = autoCellLayerGrid.Contains(new Vector2I(x - 1, y - 1)); + var right = autoCellLayerGrid.Contains(new Vector2I(x + 1, y - 1)); + if (left && right) + { + var tileCellData1 = autoTileConfig.Wall_Vertical_SingleTop; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 2), tileCellData1.SourceId, tileCellData1.AutoTileCoords); + var tileCellData2 = autoTileConfig.Wall_Vertical_SingleBottom; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 1), tileCellData2.SourceId, tileCellData2.AutoTileCoords); + } + else if (left) + { + var tileCellData1 = autoTileConfig.Wall_Vertical_LeftTop; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 2), tileCellData1.SourceId, tileCellData1.AutoTileCoords); + var tileCellData2 = autoTileConfig.Wall_Vertical_LeftBottom; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 1), tileCellData2.SourceId, tileCellData2.AutoTileCoords); + } + else if (right) + { + var tileCellData1 = autoTileConfig.Wall_Vertical_RightTop; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 2), tileCellData1.SourceId, tileCellData1.AutoTileCoords); + var tileCellData2 = autoTileConfig.Wall_Vertical_RightBottom; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 1), tileCellData2.SourceId, tileCellData2.AutoTileCoords); + } + else + { + var tileCellData1 = autoTileConfig.Wall_Vertical_CenterTop; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 2), tileCellData1.SourceId, tileCellData1.AutoTileCoords); + var tileCellData2 = autoTileConfig.Wall_Vertical_CenterBottom; + tileMap.SetCell(MapLayer.AutoFloorLayer, new Vector2I(x, y - 1), tileCellData2.SourceId, tileCellData2.AutoTileCoords); + } + } + } + + //绘制临时边界 + var temp1 = new List(); + for (var x = xStart - 3; x <= xEnd + 3; x++) + { + var p1 = new Vector2I(x, yStart - 5); + var p2 = new Vector2I(x, yEnd + 3); + temp1.Add(p1); + temp1.Add(p2); + //上横 + tileMap.SetCell(MapLayer.AutoFloorLayer, p1, autoTileConfig.TopMask.SourceId, autoTileConfig.TopMask.AutoTileCoords); + //下横 + tileMap.SetCell(MapLayer.AutoFloorLayer, p2, autoTileConfig.TopMask.SourceId, autoTileConfig.TopMask.AutoTileCoords); + } + for (var y = yStart - 5; y <= yEnd + 3; y++) + { + var p1 = new Vector2I(xStart - 3, y); + var p2 = new Vector2I(xEnd + 3, y); + temp1.Add(p1); + temp1.Add(p2); + //左竖 + tileMap.SetCell(MapLayer.AutoFloorLayer, p1, autoTileConfig.TopMask.SourceId, autoTileConfig.TopMask.AutoTileCoords); + //右竖 + tileMap.SetCell(MapLayer.AutoFloorLayer, p2, autoTileConfig.TopMask.SourceId, autoTileConfig.TopMask.AutoTileCoords); + } + + //计算需要绘制的图块 + var temp2 = new List(); + for (var x = xStart - 2; x <= xEnd + 2; x++) + { + for (var y = yStart - 4; y <= yEnd + 2; y++) + { + if (!autoCellLayerGrid.Contains(new Vector2I(x, y)) && !autoCellLayerGrid.Contains(new Vector2I(x, y + 1)) && !autoCellLayerGrid.Contains(new Vector2I(x, y + 2))) + { + list.Add(new Vector2I(x, y)); + if (!IsMaskCollisionGround(autoCellLayerGrid, x, y)) + { + temp2.Add(new Vector2I(x, y)); + } + } + } + } + var arr = new Array(list); + //绘制自动图块 + tileMap.SetCellsTerrainConnect(MapLayer.AutoFloorLayer, arr, MainTerrainSet, MainTerrain, false); + + //擦除临时边界 + for (var i = 0; i < temp1.Count; i++) + { + tileMap.EraseCell(MapLayer.AutoFloorLayer, temp1[i]); + } + + //计算区域 + var rect = Utils.CalcRect(autoCellLayerGrid); + if (rect.Size != Vector2I.Zero) + { + rect.Position -= new Vector2I(2, 3); + rect.Size += new Vector2I(4, 5); + } + + //开始绘制导航网格 + GenerateNavigation(navigationRegion, rect.Position, rect.Size); + + //擦除临时边界2 + for (var i = 0; i < temp2.Count; i++) + { + tileMap.EraseCell(MapLayer.AutoFloorLayer, temp2[i]); + } + + //将墙壁移动到指定层 + MoveTerrainCell(tileMap, autoTileConfig, autoCellLayerGrid, rect.Position, rect.Size); + return rect; + } + + private static bool IsMaskCollisionGround(HashSet autoCellLayerGrid, int x, int y) + { + for (var i = -2; i <= 2; i++) + { + for (var j = -2; j <= 4; j++) + { + if (autoCellLayerGrid.Contains(new Vector2I(x + i, y + j))) + { + return true; + } + } + } + + return false; + } + + //生成导航网格 + private static void GenerateNavigation(NavigationRegion2D navigationRegion, Vector2I currRoomPosition, Vector2I currRoomSize) + { + var navigationPolygon = navigationRegion.NavigationPolygon; + if (navigationPolygon != null) + { + navigationPolygon.Clear(); + navigationPolygon.ClearPolygons(); + navigationPolygon.ClearOutlines(); + } + else + { + navigationPolygon = ResourceManager.Load(ResourcePath.resource_navigation_NavigationPolygon_tres); + navigationRegion.NavigationPolygon = navigationPolygon; + } + + var endPos = currRoomPosition + currRoomSize; + navigationPolygon.AddOutline(new [] + { + currRoomPosition * GameConfig.TileCellSize, + new Vector2(endPos.X, currRoomPosition.Y) * GameConfig.TileCellSize, + endPos * GameConfig.TileCellSize, + new Vector2(currRoomPosition.X, endPos.Y) * GameConfig.TileCellSize + }); + navigationRegion.BakeNavigationPolygon(false); + } + + + //将自动生成的图块从 MapLayer.AutoFloorLayer 移动到指定图层中 + private static void MoveTerrainCell(TileMap tileMap, AutoTileConfig autoTileConfig, HashSet autoCellLayerGrid, Vector2I currRoomPosition, Vector2I currRoomSize) + { + tileMap.ClearLayer(MapLayer.AutoTopLayer); + tileMap.ClearLayer(MapLayer.AutoMiddleLayer); + + var x = currRoomPosition.X; + var y = currRoomPosition.Y - 1; + var w = currRoomSize.X; + var h = currRoomSize.Y + 1; + + for (var i = 0; i < w; i++) + { + for (var j = 0; j < h; j++) + { + var pos = new Vector2I(x + i, y + j); + if (!autoCellLayerGrid.Contains(pos) && tileMap.GetCellSourceId(MapLayer.AutoFloorLayer, pos) != -1) + { + var atlasCoords = tileMap.GetCellAtlasCoords(MapLayer.AutoFloorLayer, pos); + var layer = autoTileConfig.GetLayer(atlasCoords); + if (layer == MapLayer.AutoMiddleLayer) + { + layer = MapLayer.AutoMiddleLayer; + } + else if (layer == MapLayer.AutoTopLayer) + { + layer = MapLayer.AutoTopLayer; + } + else + { + Debug.LogError($"异常图块: {pos}, 这个图块的图集坐标'{atlasCoords}'不属于'MiddleMapLayer'和'TopMapLayer'!"); + continue; + } + tileMap.EraseCell(MapLayer.AutoFloorLayer, pos); + tileMap.SetCell(layer, pos, MainSource, atlasCoords); + } + } + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs b/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs index e2061fb..828937c 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMask.cs @@ -108,9 +108,9 @@ private void HandlerTransition(Vector2I position, Vector2I size, Image image) { - var tileMap = GameApplication.Instance.World.TileRoot; + var tileMap = World.Current.TileRoot; var autoConfig = GameApplication.Instance.DungeonManager.AutoTileConfig; - var wallCoord = autoConfig.WALL_BLOCK.AutoTileCoord; + var wallCoords = autoConfig.TopMask.AutoTileCoords; var (x, y) = position; var (width, height) = size; x -= 1; @@ -123,7 +123,7 @@ { var pos = new Vector2I(i + x, j + y); //说明是外层墙壁 - if (tileMap.GetCellAtlasCoords(GameConfig.TopMapLayer, pos) == wallCoord) + if (tileMap.GetCellAtlasCoords(MapLayer.AutoTopLayer, pos) == wallCoords) { var left = IsEmptyCell(tileMap, new Vector2I(pos.X - 1, pos.Y)); var right = IsEmptyCell(tileMap, new Vector2I(pos.X + 1, pos.Y)); @@ -223,25 +223,24 @@ private bool IsEmptyCell(TileMap tileMap, Vector2I pos) { - return tileMap.GetCellSourceId(GameConfig.TopMapLayer, pos) == -1 && - tileMap.GetCellSourceId(GameConfig.MiddleMapLayer, pos) == -1; + return tileMap.GetCellSourceId(MapLayer.AutoTopLayer, pos) == -1 && + tileMap.GetCellSourceId(MapLayer.AutoMiddleLayer, pos) == -1; } //判断是否是墙壁 private bool IsNotWallCell(TileMap tileMap, Vector2I pos, Vector2I wallCoord) { - return tileMap.GetCellAtlasCoords(GameConfig.TopMapLayer, pos) != wallCoord && - tileMap.GetCellAtlasCoords(GameConfig.MiddleMapLayer, pos) != wallCoord && - (tileMap.GetCellSourceId(GameConfig.TopMapLayer, pos) != -1 || - tileMap.GetCellSourceId(GameConfig.MiddleMapLayer, pos) != -1); + return tileMap.GetCellAtlasCoords(MapLayer.AutoTopLayer, pos) != wallCoord && + tileMap.GetCellAtlasCoords(MapLayer.AutoMiddleLayer, pos) != wallCoord && + (tileMap.GetCellSourceId(MapLayer.AutoTopLayer, pos) != -1 || + tileMap.GetCellSourceId(MapLayer.AutoMiddleLayer, pos) != -1); } //判断是否是任意类型的图块 private bool IsAnyCell(TileMap tileMap, Vector2I pos) { - return tileMap.GetCellSourceId(GameConfig.FloorMapLayer, pos) != -1 || - tileMap.GetCellSourceId(GameConfig.MiddleMapLayer, pos) != -1 || - tileMap.GetCellSourceId(GameConfig.TopMapLayer, pos) != -1 || - tileMap.GetCellSourceId(GameConfig.AisleFloorMapLayer, pos) != -1; + return tileMap.GetCellSourceId(MapLayer.AutoFloorLayer, pos) != -1 || + tileMap.GetCellSourceId(MapLayer.AutoMiddleLayer, pos) != -1 || + tileMap.GetCellSourceId(MapLayer.AutoTopLayer, pos) != -1; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs b/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs index bff2c40..8b5f06c 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs @@ -90,48 +90,50 @@ } //Debug.Log("RefreshRoomFog: " + roomInfo.Id); var fogMask = roomInfo.RoomFogMask; - - if (!fogMask.IsExplored) //未探索该区域 + if (fogMask != null) { - fogMask.IsExplored = true; - fogMask.TransitionAlpha(0, 1); - - //小地图亮起该房间 - roomInfo.PreviewSprite.Visible = true; - - //刷新预览区域 - foreach (var roomInfoDoor in roomInfo.Doors) + if (!fogMask.IsExplored) //未探索该区域 { - if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + fogMask.IsExplored = true; + fogMask.TransitionAlpha(0, 1); + + //小地图亮起该房间 + roomInfo.PreviewSprite.Visible = true; + + //刷新预览区域 + foreach (var roomInfoDoor in roomInfo.Doors) { - _RefreshAisleFog(roomInfoDoor); - } - else //未探索 - { - //显示预览过道 - roomInfoDoor.PreviewRoomFogMask.SetActive(false); - roomInfoDoor.PreviewAisleFogMask.SetActive(true); - roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(0, 1); + if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + { + _RefreshAisleFog(roomInfoDoor); + } + else //未探索 + { + //显示预览过道 + roomInfoDoor.PreviewRoomFogMask.SetActive(false); + roomInfoDoor.PreviewAisleFogMask.SetActive(true); + roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(0, 1); + } } } - } - else //已经探索过 - { - //变亮 - fogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 1); - - foreach (var roomInfoDoor in roomInfo.Doors) + else //已经探索过 { - if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + //变亮 + fogMask.TransitionAlpha(GameConfig.DarkFogAlpha, 1); + + foreach (var roomInfoDoor in roomInfo.Doors) { - _RefreshAisleFog(roomInfoDoor); - } - else //未探索 - { - //显示预览过道 - roomInfoDoor.PreviewRoomFogMask.SetActive(false); - roomInfoDoor.PreviewAisleFogMask.SetActive(true); - roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1); + if (roomInfoDoor.AisleFogMask.IsExplored) //探索过, 执行过道刷新逻辑 + { + _RefreshAisleFog(roomInfoDoor); + } + else //未探索 + { + //显示预览过道 + roomInfoDoor.PreviewRoomFogMask.SetActive(false); + roomInfoDoor.PreviewAisleFogMask.SetActive(true); + roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1); + } } } } diff --git a/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs b/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs index 104fd66..6c00338 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/PreviewFogMask.cs @@ -16,7 +16,11 @@ private static bool _initTexture; private static Texture2D _previewAisle; + private static Texture2D _previewAisle_ew; + private static Texture2D _previewAisle_s; private static Texture2D _previewRoom; + private static Texture2D _previewRoom_n; + private static Texture2D _previewRoom_ew; /// /// 房间门 @@ -44,6 +48,10 @@ _initTexture = true; _previewAisle = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition_png); _previewRoom = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition2_png); + _previewRoom_n = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition3_png); + _previewRoom_ew = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition4_png); + _previewAisle_ew = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition5_png); + _previewAisle_s = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_map_PreviewTransition6_png); } /// @@ -60,14 +68,14 @@ { if (fogType == PreviewFogType.Aisle) { - Texture = _previewAisle; - Position = globalPosition + new Vector2(GameConfig.TileCellSize, 0); + Texture = _previewAisle_ew; + Position = globalPosition + new Vector2(GameConfig.TileCellSize, -GameConfig.TileCellSize * 0.5f); RotationDegrees = 90; } else { - Texture = _previewRoom; - Position = globalPosition + new Vector2(-GameConfig.TileCellSize, 0); + Texture = _previewRoom_ew; + Position = globalPosition + new Vector2(-GameConfig.TileCellSize, -GameConfig.TileCellSize * 0.5f); RotationDegrees = 270; } } @@ -75,14 +83,14 @@ { if (fogType == PreviewFogType.Aisle) { - Texture = _previewAisle; - Position = globalPosition + new Vector2(-GameConfig.TileCellSize, 0); + Texture = _previewAisle_ew; + Position = globalPosition + new Vector2(-GameConfig.TileCellSize, -GameConfig.TileCellSize * 0.5f); RotationDegrees = 270; } else { - Texture = _previewRoom; - Position = globalPosition + new Vector2(GameConfig.TileCellSize, 0); + Texture = _previewRoom_ew; + Position = globalPosition + new Vector2(GameConfig.TileCellSize, -GameConfig.TileCellSize * 0.5f); RotationDegrees = 90; } } @@ -91,13 +99,13 @@ if (fogType == PreviewFogType.Aisle) { Texture = _previewAisle; - Position = globalPosition + new Vector2(0, -GameConfig.TileCellSize); + Position = globalPosition + new Vector2(0, -GameConfig.TileCellSize * 3); RotationDegrees = 0; } else { - Texture = _previewRoom; - Position = globalPosition + new Vector2(0, GameConfig.TileCellSize); + Texture = _previewRoom_n; + Position = globalPosition; RotationDegrees = 180; } } @@ -105,8 +113,8 @@ { if (fogType == PreviewFogType.Aisle) { - Texture = _previewAisle; - Position = globalPosition; + Texture = _previewAisle_s; + Position = globalPosition + new Vector2(0, GameConfig.TileCellSize * 0.5f); RotationDegrees = 180; } else diff --git a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs index e3ab686..43a47cb 100644 --- a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs +++ b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs @@ -45,6 +45,7 @@ spriteData.Destroy(); } data.Clear(); + return true; }); _grid.Clear(); QueueFree(); diff --git a/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs b/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs index 75550b7..1b1ab92 100644 --- a/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs +++ b/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs @@ -201,6 +201,7 @@ brush.PixelWidth, Mathf.Abs(Mathf.Sin(offset.Angle() - rotation + Mathf.Pi * 0.5f)) ); + maxL = Mathf.Max(1, maxL); var len = offset.Length(); if (len > maxL) //距离太大了, 需要补间 { diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/ActivityMark.cs b/DungeonShooting_Godot/src/framework/map/preinstall/ActivityMark.cs index 9516ece..b1e974b 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/ActivityMark.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/ActivityMark.cs @@ -10,7 +10,7 @@ public string Id { get; set; } /// - /// 刷新位置 + /// 刷新位置, 单位: 像素 /// public Vector2 Position { get; set; } @@ -20,7 +20,7 @@ public Dictionary Attr { get; set; } /// - /// 衍生属性, 可随意修改值 + /// 衍生属性, 可随意修改值, 通常用于存储随机出来的数据 /// public Dictionary DerivedAttr { get; set; } diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/PreinstallMarkManager.cs b/DungeonShooting_Godot/src/framework/map/preinstall/PreinstallMarkManager.cs new file mode 100644 index 0000000..45501bf --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/preinstall/PreinstallMarkManager.cs @@ -0,0 +1,112 @@ + +using System.Collections.Generic; +using Config; + + +public static class PreinstallMarkManager +{ + /// + /// 随机武器 + /// + public static readonly RandomActivityBase RandomWeapon = new RandomActivityBase() + { + Id = "$RandomGun", + Name = "随机武器", + Type = ActivityType.Other, + Icon = ResourcePath.resource_sprite_ui_commonIcon_Dice_png, + ShowInMapEditor = true + }; + + /// + /// 随机敌人 + /// + public static readonly RandomActivityBase RandomEnemy = new RandomActivityBase() + { + Id = "$RandomEnemy", + Name = "随机敌人", + Type = ActivityType.Other, + Icon = ResourcePath.resource_sprite_ui_commonIcon_Dice_png, + ShowInMapEditor = true + }; + + /// + /// 随机道具 + /// + public static readonly RandomActivityBase RandomProp = new RandomActivityBase() + { + Id = "$RandomProp", + Name = "随机道具", + Type = ActivityType.Other, + Icon = ResourcePath.resource_sprite_ui_commonIcon_Dice_png, + ShowInMapEditor = true + }; + + private static Dictionary> _cache = new Dictionary>(); + + private static bool _init = false; + + public static void Init() + { + if (_init)return; + _init = true; + foreach (var activityBase in ExcelConfig.ActivityBase_List) + { + var type = (ActivityType)activityBase.Type; + if (!_cache.TryGetValue(type, out var list)) + { + list = new List(); + _cache.Add(type, list); + } + list.Add(activityBase); + } + } + + /// + /// 根据id获取标记配置, 该函数会自动匹配随机标记 + /// + public static ExcelConfig.ActivityBase GetMarkConfig(string id) + { + if (RandomWeapon.Id == id) + { + return RandomWeapon; + } + else if (RandomEnemy.Id == id) + { + return RandomEnemy; + } + else if (RandomProp.Id == id) + { + return RandomProp; + } + + ExcelConfig.ActivityBase_Map.TryGetValue(id, out var activityBase); + return activityBase; + } + + public static List GetMarkConfigsByType(ActivityType type) + { + if (!_cache.TryGetValue(type, out var arr)) + { + arr = new List(); + _cache.Add(type, arr); + } + return arr; + } + + /// + /// 获取特殊标记名称 + /// + public static string GetSpecialName(SpecialMarkType type) + { + if (type == SpecialMarkType.BirthPoint) + { + return "出生标记"; + } + else if (type == SpecialMarkType.OutPoint) + { + return "出口标记"; + } + + return string.Empty; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/RandomActivityBase.cs b/DungeonShooting_Godot/src/framework/map/preinstall/RandomActivityBase.cs new file mode 100644 index 0000000..77d16ac --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/preinstall/RandomActivityBase.cs @@ -0,0 +1,9 @@ + +using Config; + +/// +/// 用于随机生成的物体标记 +/// +public class RandomActivityBase : ExcelConfig.ActivityBase +{ +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs index fdc3258..827259a 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs @@ -80,7 +80,7 @@ /// /// 预处理操作 /// - public void Pretreatment(SeedRandom random) + public void Pretreatment(World world) { if (_runPretreatment) { @@ -111,37 +111,67 @@ else { var tempArray = markInfo.MarkList.Select(item => item.Weight).ToArray(); - var index = random.RandomWeight(tempArray); + var index = world.Random.RandomWeight(tempArray); markInfoItem = markInfo.MarkList[index]; } - - mark.Id = markInfoItem.Id; + + var activityBase = PreinstallMarkManager.GetMarkConfig(markInfoItem.Id); mark.Attr = markInfoItem.Attr; - mark.DerivedAttr = new Dictionary(); mark.VerticalSpeed = markInfoItem.VerticalSpeed; mark.Altitude = markInfoItem.Altitude; - mark.ActivityType = (ActivityType)ExcelConfig.ActivityBase_Map[markInfoItem.Id].Type; - - if (mark.ActivityType == ActivityType.Enemy) //敌人类型 + + if (activityBase is RandomActivityBase) //随机物体 { - _hsaEnemy = true; - if (!mark.Attr.TryGetValue("Face", out var face) || face == "0") //随机方向 + if (markInfoItem.Id == PreinstallMarkManager.RandomWeapon.Id) //随机武器 { - mark.DerivedAttr.Add("Face", - random.RandomChoose( - ((int)FaceDirection.Left).ToString(), - ((int)FaceDirection.Right).ToString() - ) - ); + mark.Id = world.RandomPool.GetRandomWeapon()?.Id; + mark.ActivityType = ActivityType.Weapon; } - else //指定方向 + else if (markInfoItem.Id == PreinstallMarkManager.RandomEnemy.Id) //随机敌人 { - mark.DerivedAttr.Add("Face", face); + mark.Id = world.RandomPool.GetRandomEnemy()?.Id; + mark.ActivityType = ActivityType.Enemy; + } + else if (markInfoItem.Id == PreinstallMarkManager.RandomProp.Id) //随机道具 + { + mark.Id = world.RandomPool.GetRandomProp()?.Id; + mark.ActivityType = ActivityType.Prop; + } + else //非随机物体 + { + Debug.LogError("未知的随机物体:" + markInfoItem.Id); + continue; + } + } + else + { + mark.Id = markInfoItem.Id; + mark.ActivityType = (ActivityType)activityBase.Type; + if (mark.ActivityType == ActivityType.Enemy) //敌人类型 + { + mark.DerivedAttr = new Dictionary(); + if (!mark.Attr.TryGetValue("Face", out var face) || face == "0") //随机方向 + { + mark.DerivedAttr.Add("Face", + world.Random.RandomChoose( + ((int)FaceDirection.Left).ToString(), + ((int)FaceDirection.Right).ToString() + ) + ); + } + else //指定方向 + { + mark.DerivedAttr.Add("Face", face); + } } } } else if (markInfo.SpecialMarkType == SpecialMarkType.BirthPoint) //玩家出生标记 { + + } + else if (markInfo.SpecialMarkType == SpecialMarkType.OutPoint) //出口标记 + { } else @@ -156,18 +186,42 @@ var pos = markInfo.Position.AsVector2(); var birthRect = markInfo.Size.AsVector2(); var tempPos = new Vector2( - random.RandomRangeInt((int)(pos.X - birthRect.X / 2), (int)(pos.X + birthRect.X / 2)), - random.RandomRangeInt((int)(pos.Y - birthRect.Y / 2), (int)(pos.Y + birthRect.Y / 2)) + world.Random.RandomRangeInt((int)(pos.X - birthRect.X / 2), (int)(pos.X + birthRect.X / 2)), + world.Random.RandomRangeInt((int)(pos.Y - birthRect.Y / 2), (int)(pos.Y + birthRect.Y / 2)) ); - //var offset = RoomInfo.RoomSplit.RoomInfo.Position.AsVector2I(); - //mark.Position = RoomInfo.GetWorldPosition() + tempPos - offset; mark.Position = RoomInfo.ToGlobalPosition(tempPos); wave.Add(mark); } - - //排序操作 + } + + //自动填充操作 + if (RoomPreinstallInfo.AutoFill) + { + world.RandomPool.FillAutoWave(this); + } + + //排序操作 + foreach (var wave in WaveList) + { wave.Sort((a, b) => (int)(a.DelayTime * 1000 - b.DelayTime * 1000)); } + //判断是否有敌人 + CheckHasEnemy(); + } + + private void CheckHasEnemy() + { + foreach (var marks in WaveList) + { + foreach (var activityMark in marks) + { + if (activityMark.ActivityType == ActivityType.Enemy) + { + _hsaEnemy = true; + return; + } + } + } } /// @@ -372,7 +426,7 @@ //获取物体默认所在层级 private RoomLayerEnum GetDefaultLayer(ActivityMark activityMark) { - if (activityMark.ActivityType == ActivityType.Player || activityMark.ActivityType == ActivityType.Enemy) + if (activityMark.ActivityType == ActivityType.Player || activityMark.ActivityType == ActivityType.Enemy || activityMark.ActivityType == ActivityType.Treasure) { return RoomLayerEnum.YSortLayer; } @@ -423,6 +477,10 @@ //初始化物体属性 private void InitAttr(ActivityObject activityObject, ActivityMark activityMark) { + if (activityMark.Attr == null) + { + return; + } if (activityMark.ActivityType == ActivityType.Weapon) //武器类型 { var weapon = (Weapon)activityObject; @@ -438,7 +496,7 @@ else if (activityMark.ActivityType == ActivityType.Enemy) //敌人类型 { var role = (Role)activityObject; - if (role is Enemy enemy && activityMark.Attr.TryGetValue("Weapon", out var weaponId)) //使用的武器 + if (role.WeaponPack.Capacity > 0 && role is Enemy enemy && activityMark.Attr.TryGetValue("Weapon", out var weaponId)) //使用的武器 { if (!string.IsNullOrEmpty(weaponId)) { @@ -455,7 +513,7 @@ } } - if (activityMark.DerivedAttr.TryGetValue("Face", out var face)) //脸朝向, 应该只有 -1 和 1 + if (activityMark.DerivedAttr != null && activityMark.DerivedAttr.TryGetValue("Face", out var face)) //脸朝向, 应该只有 -1 和 1 { var faceDir = int.Parse(face); role.Face = (FaceDirection)faceDir; diff --git a/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs b/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs index 5af5be5..385cff3 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs @@ -12,4 +12,8 @@ /// 玩家出生点 /// BirthPoint, + /// + /// 地牢出口 + /// + OutPoint, } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs index a420fe5..c346f93 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs @@ -1,5 +1,6 @@ using System; +using System.Collections.Generic; using Godot; /// @@ -40,6 +41,16 @@ public Vector2I OriginPosition; /// + /// 地板所占的地板格子, 单位: 格, 使用时不需要加上 OriginPosition + /// + public HashSet AisleFloorCell; + + /// + /// 地板所占的矩形, 单位: 格, 使用时不需要加上 OriginPosition + /// + public Rect2I AisleFloorRect; + + /// /// 与下一道门是否有交叉点 /// public bool HasCross; @@ -50,16 +61,6 @@ public Vector2I Cross; /// - /// 占位导航网格 - /// - public DoorNavigationInfo Navigation; - - /// - /// 连接过道使用的导航网格 (暂未用到) - /// - public NavigationPolygonData AisleNavigation; - - /// /// 连接过道使用预览纹理, 用于小地图 /// public ImageTexture AislePreviewTexture; diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomErrorType.cs b/DungeonShooting_Godot/src/framework/map/room/RoomErrorType.cs new file mode 100644 index 0000000..510c27b --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/room/RoomErrorType.cs @@ -0,0 +1,27 @@ + +/// +/// 房间错误类型 +/// +public enum RoomErrorType +{ + /// + /// 没有错误 + /// + None = 0, + /// + /// 空房间 + /// + Empty = 1, + /// + /// 地图绘制错误 + /// + TileError = 2, + /// + /// 门区域绘制错误 + /// + DoorAreaError = 3, + /// + /// 没有预设 + /// + NoPreinstallError = 4 +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs index f1269ca..0d0e3b2 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -8,13 +8,19 @@ /// public class RoomInfo : IDestroy { + public RoomInfo(int id, DungeonRoomType type) + { + Id = id; + RoomType = type; + } + public RoomInfo(int id, DungeonRoomType type, DungeonRoomSplit roomSplit) { Id = id; RoomType = type; RoomSplit = roomSplit; } - + /// /// 房间 id /// @@ -31,7 +37,7 @@ public int Layer; /// - /// 生成该房间使用的配置数据 + /// 生成该房间使用的配置数据, 可能为 null /// public DungeonRoomSplit RoomSplit; @@ -106,7 +112,7 @@ public Rect2I OuterRect { get; private set; } /// - /// 画布占用区域 + /// 画布占用区域, 单位: 像素 /// public Rect2I CanvasRect { get; private set; } @@ -135,6 +141,11 @@ /// public Vector2I Waypoints { get; set; } + /// + /// 在 DungeonGenerator 中是否可以回滚, 如果可以回滚, 那么当前房间就只会有一个 NextRoom + /// + public bool CanRollback { get; set; } = false; + public bool IsDestroyed { get; private set; } private bool _openDoorFlag = true; @@ -260,6 +271,10 @@ /// public Vector2I GetOffsetPosition() { + if (RoomSplit == null) + { + return Vector2I.Zero; + } return RoomSplit.RoomInfo.Position.AsVector2I() * GameConfig.TileCellSize; } @@ -302,6 +317,38 @@ { return Position.Y; } + + /// + /// 获取房间门横轴结束位置, 单位: 格 + /// + public int GetHorizontalDoorEnd() + { + return Position.X + Size.X - 1; + } + + /// + /// 获取房间门纵轴结束位置, 单位: 格 + /// + public int GetVerticalDoorEnd() + { + return Position.Y + Size.Y - 1; + } + + /// + /// 获取房间门横轴开始位置, 单位: 格 + /// + public int GetHorizontalDoorStart() + { + return Position.X + 1; + } + + /// + /// 获取房间门纵轴开始位置, 单位: 格 + /// + public int GetVerticalDoorStart() + { + return Position.Y + 2; + } /// /// 获取房间宽度, 单位: 像素 @@ -415,7 +462,7 @@ /// public void OnFirstEnter() { - if (RoomPreinstall.IsRunWave) + if (RoomPreinstall == null || RoomPreinstall.IsRunWave) { return; } diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/DoorAreaInfo.cs deleted file mode 100644 index fe428b0..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/DoorAreaInfo.cs +++ /dev/null @@ -1,82 +0,0 @@ - -using System.Text.Json.Serialization; -using Godot; - -/// -/// 用于描述门生成区域 -/// -public class DoorAreaInfo : IClone -{ - /// - /// 门方向 - /// - [JsonInclude] - public DoorDirection Direction; - /// - /// 起始位置, 相对 tilemap 的横/纵轴原点, 单位: 像素 - /// - [JsonInclude] - public int Start = 0; - /// - /// 结束位置, 相对 tilemap 的横/纵轴原点, 单位: 像素 - /// - [JsonInclude] - public int End = 16; - - /// - /// 起始点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 - /// - public Vector2I StartPosition; - /// - /// 结束点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 - /// - public Vector2I EndPosition; - - public DoorAreaInfo() - { - } - - public DoorAreaInfo(DoorDirection direction, int start, int end) - { - Direction = direction; - Start = start; - End = end; - } - - /// - /// 自动计算 startPosition 和 endPosition - /// - public void CalcPosition(Vector2I rootPosition, Vector2I rootSize) - { - switch (Direction) - { - case DoorDirection.E: - StartPosition = new Vector2I(rootPosition.X, rootPosition.Y + Start); - EndPosition = new Vector2I(rootPosition.X, rootPosition.Y + End); - break; - case DoorDirection.W: - StartPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + Start); - EndPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + End); - break; - case DoorDirection.S: - StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y + rootSize.Y); - EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y + rootSize.Y); - break; - case DoorDirection.N: - StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y); - EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y); - break; - } - } - - public DoorAreaInfo Clone() - { - var data = new DoorAreaInfo(); - data.Start = Start; - data.End = End; - data.Direction = Direction; - return data; - } - - -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomGroup.cs b/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomGroup.cs deleted file mode 100644 index 142ca79..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomGroup.cs +++ /dev/null @@ -1,207 +0,0 @@ - -using System; -using System.Collections.Generic; -using System.Text.Json.Serialization; -using Godot; - -/// -/// 房间组数据 -/// -public class DungeonRoomGroup : IClone -{ - /// - /// 组名称 - /// - [JsonInclude] - public string GroupName; - - /// - /// 普通战斗房间, 进入该房间时会关上门, 并刷出若干波敌人, 消灭所有敌人后开门 - /// - [JsonInclude] - public List BattleList = new List(); - - /// - /// 起始房间, 由上一层地牢的结束房间进入该房间, 每层包含一个起始房间 - /// - [JsonInclude] - public List InletList = new List(); - - /// - /// 结束房间, 进入另一层地牢, 每层只是包含一个结束房间 - /// - [JsonInclude] - public List OutletList = new List(); - - /// - /// boss战房间, 进入房间时会关上没, 刷出boss, 消灭boss后开门 - /// - [JsonInclude] - public List BossList = new List(); - - /// - /// 奖励房间, 给予玩家武器或者道具奖励的房间 - /// - [JsonInclude] - public List RewardList = new List(); - - /// - /// 商店, 玩家买卖道具装备的房间 - /// - [JsonInclude] - public List ShopList = new List(); - - /// - /// 事件房间, 触发剧情或者解锁NPC的房间 - /// - [JsonInclude] - public List EventList = new List(); - - /// - /// 组包住 - /// - [JsonInclude] - public string Remark; - - private bool _init = false; - private Dictionary _weightRandomMap; - private List _readyBattleList; - - /// - /// 获取所有房间数据 - /// - public List GetAllRoomList() - { - var list = new List(); - list.AddRange(BattleList); - list.AddRange(InletList); - list.AddRange(OutletList); - list.AddRange(BossList); - list.AddRange(ShopList); - list.AddRange(RewardList); - list.AddRange(EventList); - return list; - } - - /// - /// 获取指定类型房间集合 - /// - public List GetRoomList(DungeonRoomType roomType) - { - switch (roomType) - { - case DungeonRoomType.Battle: return BattleList; - case DungeonRoomType.Inlet: return InletList; - case DungeonRoomType.Outlet: return OutletList; - case DungeonRoomType.Boss: return BossList; - case DungeonRoomType.Reward: return RewardList; - case DungeonRoomType.Shop: return ShopList; - case DungeonRoomType.Event: return EventList; - } - - return null; - } - - /// - /// 移除一个房间, 返回是否移除成功 - /// - public bool RemoveRoom(DungeonRoomSplit roomSplit) - { - if (BattleList.Remove(roomSplit)) - { - return true; - } - if (InletList.Remove(roomSplit)) - { - return true; - } - if (OutletList.Remove(roomSplit)) - { - return true; - } - if (BossList.Remove(roomSplit)) - { - return true; - } - if (RewardList.Remove(roomSplit)) - { - return true; - } - if (ShopList.Remove(roomSplit)) - { - return true; - } - if (EventList.Remove(roomSplit)) - { - return true; - } - - return false; - } - - /// - /// 初始化权重处理 - /// - public void InitWeight(SeedRandom random) - { - if (_init) - { - return; - } - - _init = true; - _weightRandomMap = new Dictionary(); - - foreach (var roomType in Enum.GetValues()) - { - InitAdRewardWeight(roomType, random); - } - } - - private void InitAdRewardWeight(DungeonRoomType roomType, SeedRandom random) - { - var dungeonRoomSplits = GetRoomList(roomType); - var weightRandom = new WeightRandom(random); - _weightRandomMap.Add(roomType, weightRandom); - - var list = new List(); - foreach (var roomSplit in dungeonRoomSplits) - { - list.Add(roomSplit.RoomInfo.Weight); - } - weightRandom.InitAdRewardWeight(list.ToArray()); - } - - /// - /// 根据房间类型和权重获取随机房间 - /// - public DungeonRoomSplit GetRandomRoom(DungeonRoomType roomType) - { - if (!_init) - { - Debug.LogError("未调用DungeonRoomGroup.InitWeight()来初始化权重!"); - return null; - } - - if (_weightRandomMap.TryGetValue(roomType, out var weightRandom)) - { - return GetRoomList(roomType)[weightRandom.GetRandomIndex()]; - } - - return null; - } - - public DungeonRoomGroup Clone() - { - var inst = new DungeonRoomGroup(); - inst.GroupName = GroupName; - inst.BattleList.AddRange(BattleList); - inst.InletList.AddRange(InletList); - inst.OutletList.AddRange(OutletList); - inst.BossList.AddRange(BossList); - inst.ShopList.AddRange(ShopList); - inst.RewardList.AddRange(RewardList); - inst.EventList.AddRange(EventList); - return inst; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomInfo.cs deleted file mode 100644 index 1a6dd9a..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomInfo.cs +++ /dev/null @@ -1,92 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -/// -/// 房间配置数据 -/// -public class DungeonRoomInfo -{ - /// - /// 房间位置, 在tile坐标系中的位置, 单位: 格 - /// - [JsonInclude] - public SerializeVector2 Position; - - /// - /// 房间大小, 在tile坐标系中占用的格子, 单位: 格 - /// - [JsonInclude] - public SerializeVector2 Size; - - /// - /// 房间连通门 - /// - [JsonInclude] - public List DoorAreaInfos; - - /// - /// 当前房间所属分组的名称 - /// - [JsonInclude] - public string GroupName; - - /// - /// 房间类型 - /// - [JsonInclude] - public DungeonRoomType RoomType = DungeonRoomType.Battle; - - /// - /// 房间名称 - /// - [JsonInclude] - public string RoomName; - - /// - /// 房间权重, 值越大, 生成地牢是越容易出现该房间 - /// - [JsonInclude] - public int Weight = ResourceManager.DefaultWeight; - - /// - /// 房间备注 - /// - [JsonInclude] - public string Remark; - - private List _completionDoorArea; - - /// - /// 获取门区域配置数据, 如果该函数会自动填充未配置的数据 - /// - public List GetCompletionDoorArea() - { - if (_completionDoorArea == null) - { - //需要处理 DoorAreaInfos 长度为 0 的房间, 并为其配置默认值 - _completionDoorArea = new List(DoorAreaInfos); - if (_completionDoorArea.Count == 0) - { - _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.N, GameConfig.TileCellSize, ((int)Size.X - 1) * GameConfig.TileCellSize)); - _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.S, GameConfig.TileCellSize, ((int)Size.X - 1) * GameConfig.TileCellSize)); - _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.W, GameConfig.TileCellSize, ((int)Size.Y - 1) * GameConfig.TileCellSize)); - _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.E, GameConfig.TileCellSize, ((int)Size.Y - 1) * GameConfig.TileCellSize)); - } - } - - return _completionDoorArea; - } - - /// - /// 清除门区域配置数据, 再次调用 GetCompletionDoorArea() 会重新计算 DoorAreaInfo 数据 - /// - public void ClearCompletionDoorArea() - { - if (_completionDoorArea != null) - { - _completionDoorArea.Clear(); - _completionDoorArea = null; - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomSplit.cs deleted file mode 100644 index bc44b94..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/DungeonRoomSplit.cs +++ /dev/null @@ -1,203 +0,0 @@ - -using System.Collections.Generic; -using System.IO; -using System.Text.Json; -using System.Text.Json.Serialization; -using Godot; - -/// -/// 房间配置文件相关信息, 将会在 RoomConfig.json 中汇总 -/// -public class DungeonRoomSplit -{ - /// - /// 房间异常类型 - /// - [JsonInclude] - public RoomErrorType ErrorType; - - /// - /// 该房间的文件夹路径 - /// - [JsonInclude] - public string Path; - - /// - /// 房间配置路径 - /// - [JsonIgnore] - public string RoomPath => Path + "/RoomInfo.json"; - - /// - /// 房间地块配置数据 - /// - [JsonIgnore] - public string TilePath => Path + "/TileInfo.json"; - - /// - /// 房间预设配置数据 - /// - [JsonIgnore] - public string PreinstallPath => Path + "/Preinstall.json"; - - /// - /// 预览图路径 - /// - [JsonIgnore] - public string PreviewPath => Path + "/Preview.png"; - - /// - /// 房间配置数据, 第一次获取会在资源中加载数据 - /// - [JsonIgnore] - public DungeonRoomInfo RoomInfo - { - get - { - if (_roomInfo == null && RoomPath != null) - { - ReloadRoomInfo(); - } - - return _roomInfo; - } - set => _roomInfo = value; - } - - private DungeonRoomInfo _roomInfo; - - /// - /// 房间地块配置数据 - /// - [JsonIgnore] - public DungeonTileInfo TileInfo - { - get - { - if (_tileInfo == null && TilePath != null) - { - ReloadTileInfo(); - } - - return _tileInfo; - } - set => _tileInfo = value; - } - - private DungeonTileInfo _tileInfo; - - /// - /// 房间预设数据 - /// - [JsonIgnore] - public List Preinstall - { - get - { - if (_preinstall == null && PreinstallPath != null) - { - ReloadPreinstall(); - } - - return _preinstall; - } - set => _preinstall = value; - } - - private List _preinstall; - - /// - /// 预览图 - /// - [JsonIgnore] - public Texture2D PreviewImage - { - get - { - if (_previewImage == null) - { - ReloadPreviewImage(); - } - - return _previewImage; - } - set - { - if (_previewImage != null) - { - _previewImage.Dispose(); - } - - _previewImage = value; - } - } - - private Texture2D _previewImage; - - /// - /// 重新加载房间数据 - /// - public void ReloadRoomInfo() - { - var asText = ResourceManager.LoadText("res://" + RoomPath); - _roomInfo = JsonSerializer.Deserialize(asText); - } - - /// - /// 重新加载房间地块配置数据 - /// - public void ReloadTileInfo() - { - var asText = ResourceManager.LoadText("res://" + TilePath); - _tileInfo = JsonSerializer.Deserialize(asText); - } - - /// - /// 重新加载房间预设数据 - /// - public void ReloadPreinstall() - { - var asText = ResourceManager.LoadText("res://" + PreinstallPath); - _preinstall = JsonSerializer.Deserialize>(asText); - } - - /// - /// 重新加载预览图片 - /// - public void ReloadPreviewImage() - { - if (_previewImage != null) - { - _previewImage.Dispose(); - } - - if (File.Exists(PreviewPath)) - { - var bytes = File.ReadAllBytes(PreviewPath); - - var image = Image.Create(GameConfig.PreviewImageSize, GameConfig.PreviewImageSize, false, Image.Format.Rgb8); - image.LoadPngFromBuffer(bytes); - _previewImage = ImageTexture.CreateFromImage(image); - } - } - - public override bool Equals(object obj) - { - if (obj == null) - { - return false; - } - - if (obj is DungeonRoomSplit roomSplit) - { - return roomSplit.Path == Path; - } - - return this == obj; - } - - public override int GetHashCode() - { - return Path.GetHashCode(); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs deleted file mode 100644 index c4003b4..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -public class DungeonTileInfo -{ - /// - /// 导航数据 - /// - [JsonInclude] - public List NavigationList; - - /// - /// 底层数据, 五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 - /// - [JsonInclude] - public List Floor; - - /// - /// 中层数据, 五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 - /// - [JsonInclude] - public List Middle; - - /// - /// 顶层数据, 五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 - /// - [JsonInclude] - public List Top; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/MarkInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/MarkInfo.cs deleted file mode 100644 index 41bdd08..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/MarkInfo.cs +++ /dev/null @@ -1,50 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -/// -/// 标记数据 -/// -public class MarkInfo -{ - /// - /// 所在坐标 - /// - [JsonInclude] - public SerializeVector2 Position; - - /// - /// 区域大小 - /// - [JsonInclude] - public SerializeVector2 Size; - - /// - /// 特殊标记类型 - /// - [JsonInclude] - public SpecialMarkType SpecialMarkType = SpecialMarkType.Normal; - - /// - /// 延时时间, 单位: 秒 - /// - [JsonInclude] - public float DelayTime; - - /// - /// 标记列表数据 - /// - [JsonInclude] - public List MarkList; - - /// - /// 从指定 MarkInfo 克隆数据, 浅拷贝 - /// - public void CloneFrom(MarkInfo mark) - { - Position = mark.Position; - Size = mark.Size; - DelayTime = mark.DelayTime; - MarkList = mark.MarkList; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/MarkInfoItem.cs b/DungeonShooting_Godot/src/framework/map/serialize/MarkInfoItem.cs deleted file mode 100644 index 6e38c93..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/MarkInfoItem.cs +++ /dev/null @@ -1,45 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -/// -/// 标记项数据 -/// -public class MarkInfoItem -{ - /// - /// 物体Id - /// - [JsonInclude] - public string Id; - - /// - /// 权重 - /// - [JsonInclude] - public int Weight; - - /// - /// 额外属性 - /// - [JsonInclude] - public Dictionary Attr; - - /// - /// 物体初始海拔高度 - /// - [JsonInclude] - public int Altitude; - - /// - /// 物体初始纵轴速度 - /// - [JsonInclude] - public float VerticalSpeed; - - /// - /// 所属标记类型 - /// - [JsonIgnore] - public SpecialMarkType SpecialMarkType = SpecialMarkType.Normal; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/NavigationPolygonData.cs b/DungeonShooting_Godot/src/framework/map/serialize/NavigationPolygonData.cs deleted file mode 100644 index 460e2b2..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/NavigationPolygonData.cs +++ /dev/null @@ -1,81 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; -using Godot; - -public enum NavigationPolygonType -{ - /// - /// 外轮廓 - /// - Out, - /// - /// 内轮廓 - /// - In, -} - -/// -/// 描述导航多边形数据 -/// -public class NavigationPolygonData -{ - /// - /// 导航轮廓类型 - /// - [JsonInclude] - public NavigationPolygonType Type; - - /// - /// 多边形的顶点, 两个为一组, 单位: 像素, 需要获取转为 Vector2[] 的值请调用 GetPoints() 函数 - /// - [JsonInclude] - public List Points; - - private Vector2[] _pointVector2Array; - - public NavigationPolygonData() - { - } - - public NavigationPolygonData(NavigationPolygonType type) - { - Type = type; - } - - /// - /// 读取所有的坐标点, 单位: 像素 - /// - public Vector2[] GetPoints() - { - if (_pointVector2Array == null) - { - if (Points == null) - { - return null; - } - - _pointVector2Array = new Vector2[Points.Count / 2]; - for (var i = 0; i < Points.Count; i += 2) - { - _pointVector2Array[i / 2] = new Vector2(Points[i], Points[i + 1]); - } - } - - return _pointVector2Array; - } - - /// - /// 设置所有的坐标点 - /// - public void SetPoints(Vector2[] array) - { - _pointVector2Array = array; - Points = new List(); - foreach (var pos in array) - { - Points.Add(pos.X); - Points.Add(pos.Y); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/RoomErrorType.cs b/DungeonShooting_Godot/src/framework/map/serialize/RoomErrorType.cs deleted file mode 100644 index 510c27b..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/RoomErrorType.cs +++ /dev/null @@ -1,27 +0,0 @@ - -/// -/// 房间错误类型 -/// -public enum RoomErrorType -{ - /// - /// 没有错误 - /// - None = 0, - /// - /// 空房间 - /// - Empty = 1, - /// - /// 地图绘制错误 - /// - TileError = 2, - /// - /// 门区域绘制错误 - /// - DoorAreaError = 3, - /// - /// 没有预设 - /// - NoPreinstallError = 4 -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/RoomPreinstallInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/RoomPreinstallInfo.cs deleted file mode 100644 index 7f35576..0000000 --- a/DungeonShooting_Godot/src/framework/map/serialize/RoomPreinstallInfo.cs +++ /dev/null @@ -1,62 +0,0 @@ - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -/// -/// 房间预设数据 -/// -public class RoomPreinstallInfo -{ - /// - /// 预设名称 - /// - [JsonInclude] - public string Name; - - /// - /// 预设权重 - /// - [JsonInclude] - public int Weight; - - /// - /// 预设备注 - /// - [JsonInclude] - public string Remark; - - /// - /// 波数数据 - /// - [JsonInclude] - public List> WaveList; - - /// - /// 初始化波数据 - /// - public void InitWaveList() - { - WaveList = new List> - { - new List() - }; - } - - /// - /// 初始化特殊标记 - /// - public void InitSpecialMark(DungeonRoomType roomType) - { - if (roomType == DungeonRoomType.Inlet) //初始房间 - { - var preloading = WaveList[0]; - //玩家标记 - var markInfo = new MarkInfo(); - markInfo.Position = new SerializeVector2(); - markInfo.Size = new SerializeVector2(); - markInfo.SpecialMarkType = SpecialMarkType.BirthPoint; - markInfo.MarkList = new List(); - preloading.Add(markInfo); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/DoorAreaInfo.cs new file mode 100644 index 0000000..fe428b0 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/DoorAreaInfo.cs @@ -0,0 +1,82 @@ + +using System.Text.Json.Serialization; +using Godot; + +/// +/// 用于描述门生成区域 +/// +public class DoorAreaInfo : IClone +{ + /// + /// 门方向 + /// + [JsonInclude] + public DoorDirection Direction; + /// + /// 起始位置, 相对 tilemap 的横/纵轴原点, 单位: 像素 + /// + [JsonInclude] + public int Start = 0; + /// + /// 结束位置, 相对 tilemap 的横/纵轴原点, 单位: 像素 + /// + [JsonInclude] + public int End = 16; + + /// + /// 起始点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 + /// + public Vector2I StartPosition; + /// + /// 结束点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 + /// + public Vector2I EndPosition; + + public DoorAreaInfo() + { + } + + public DoorAreaInfo(DoorDirection direction, int start, int end) + { + Direction = direction; + Start = start; + End = end; + } + + /// + /// 自动计算 startPosition 和 endPosition + /// + public void CalcPosition(Vector2I rootPosition, Vector2I rootSize) + { + switch (Direction) + { + case DoorDirection.E: + StartPosition = new Vector2I(rootPosition.X, rootPosition.Y + Start); + EndPosition = new Vector2I(rootPosition.X, rootPosition.Y + End); + break; + case DoorDirection.W: + StartPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + Start); + EndPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + End); + break; + case DoorDirection.S: + StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y + rootSize.Y); + EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y + rootSize.Y); + break; + case DoorDirection.N: + StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y); + EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y); + break; + } + } + + public DoorAreaInfo Clone() + { + var data = new DoorAreaInfo(); + data.Start = Start; + data.End = End; + data.Direction = Direction; + return data; + } + + +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomGroup.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomGroup.cs new file mode 100644 index 0000000..b6d55f2 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomGroup.cs @@ -0,0 +1,214 @@ + +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Godot; + +/// +/// 房间组数据 +/// +public class DungeonRoomGroup : IClone +{ + /// + /// 组名称 + /// + [JsonInclude] + public string GroupName; + + /// + /// 图块集 + /// + [JsonInclude] + public string TileSet; + + /// + /// 普通战斗房间, 进入该房间时会关上门, 并刷出若干波敌人, 消灭所有敌人后开门 + /// + [JsonInclude] + public List BattleList = new List(); + + /// + /// 起始房间, 由上一层地牢的结束房间进入该房间, 每层包含一个起始房间 + /// + [JsonInclude] + public List InletList = new List(); + + /// + /// 结束房间, 进入另一层地牢, 每层只是包含一个结束房间 + /// + [JsonInclude] + public List OutletList = new List(); + + /// + /// boss战房间, 进入房间时会关上没, 刷出boss, 消灭boss后开门 + /// + [JsonInclude] + public List BossList = new List(); + + /// + /// 奖励房间, 给予玩家武器或者道具奖励的房间 + /// + [JsonInclude] + public List RewardList = new List(); + + /// + /// 商店, 玩家买卖道具装备的房间 + /// + [JsonInclude] + public List ShopList = new List(); + + /// + /// 事件房间, 触发剧情或者解锁NPC的房间 + /// + [JsonInclude] + public List EventList = new List(); + + /// + /// 组包住 + /// + [JsonInclude] + public string Remark; + + private bool _init = false; + private Dictionary _weightRandomMap; + + /// + /// 获取所有房间数据 + /// + public List GetAllRoomList() + { + var list = new List(); + list.AddRange(BattleList); + list.AddRange(InletList); + list.AddRange(OutletList); + list.AddRange(BossList); + list.AddRange(ShopList); + list.AddRange(RewardList); + list.AddRange(EventList); + return list; + } + + /// + /// 获取指定类型房间集合 + /// + public List GetRoomList(DungeonRoomType roomType) + { + switch (roomType) + { + case DungeonRoomType.Battle: return BattleList; + case DungeonRoomType.Inlet: return InletList; + case DungeonRoomType.Outlet: return OutletList; + case DungeonRoomType.Boss: return BossList; + case DungeonRoomType.Reward: return RewardList; + case DungeonRoomType.Shop: return ShopList; + case DungeonRoomType.Event: return EventList; + } + + return null; + } + + /// + /// 移除一个房间, 返回是否移除成功 + /// + public bool RemoveRoom(DungeonRoomSplit roomSplit) + { + if (BattleList.Remove(roomSplit)) + { + return true; + } + if (InletList.Remove(roomSplit)) + { + return true; + } + if (OutletList.Remove(roomSplit)) + { + return true; + } + if (BossList.Remove(roomSplit)) + { + return true; + } + if (RewardList.Remove(roomSplit)) + { + return true; + } + if (ShopList.Remove(roomSplit)) + { + return true; + } + if (EventList.Remove(roomSplit)) + { + return true; + } + + return false; + } + + /// + /// 初始化权重处理 + /// + public void InitWeight(SeedRandom random) + { + if (_init) + { + return; + } + + _init = true; + _weightRandomMap = new Dictionary(); + + foreach (var roomType in Enum.GetValues()) + { + if (roomType == DungeonRoomType.None) continue; + InitAdRewardWeight(roomType, random); + } + } + + private void InitAdRewardWeight(DungeonRoomType roomType, SeedRandom random) + { + var dungeonRoomSplits = GetRoomList(roomType); + var weightRandom = new WeightRandom(random); + _weightRandomMap.Add(roomType, weightRandom); + + var list = new List(); + foreach (var roomSplit in dungeonRoomSplits) + { + list.Add(roomSplit.RoomInfo.Weight); + } + weightRandom.InitAdRewardWeight(list.ToArray()); + } + + /// + /// 根据房间类型和权重获取随机房间 + /// + public DungeonRoomSplit GetRandomRoom(DungeonRoomType roomType) + { + if (!_init) + { + Debug.LogError("未调用DungeonRoomGroup.InitWeight()来初始化权重!"); + return null; + } + + if (_weightRandomMap.TryGetValue(roomType, out var weightRandom)) + { + return GetRoomList(roomType)[weightRandom.GetRandomIndex()]; + } + + return null; + } + + public DungeonRoomGroup Clone() + { + var inst = new DungeonRoomGroup(); + inst.GroupName = GroupName; + inst.TileSet = TileSet; + inst.BattleList.AddRange(BattleList); + inst.InletList.AddRange(InletList); + inst.OutletList.AddRange(OutletList); + inst.BossList.AddRange(BossList); + inst.ShopList.AddRange(ShopList); + inst.RewardList.AddRange(RewardList); + inst.EventList.AddRange(EventList); + return inst; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomInfo.cs new file mode 100644 index 0000000..a5a220f --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomInfo.cs @@ -0,0 +1,99 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +/// +/// 房间配置数据 +/// +public class DungeonRoomInfo +{ + /// + /// 房间位置, 在tile坐标系中的位置, 单位: 格 + /// + [JsonInclude] + public SerializeVector2 Position; + + /// + /// 房间大小, 在tile坐标系中占用的格子, 单位: 格 + /// + [JsonInclude] + public SerializeVector2 Size; + + /// + /// 房间连通门 + /// + [JsonInclude] + public List DoorAreaInfos; + + /// + /// 当前房间所属分组的名称 + /// + [JsonInclude] + public string GroupName; + + /// + /// 房间类型 + /// + [JsonInclude] + public DungeonRoomType RoomType = DungeonRoomType.Battle; + + /// + /// 房间名称 + /// + [JsonInclude] + public string RoomName; + + /// + /// 房间权重, 值越大, 生成地牢是越容易出现该房间 + /// + [JsonInclude] + public int Weight = ResourceManager.DefaultWeight; + + /// + /// 房间备注 + /// + [JsonInclude] + public string Remark; + + private List _completionDoorArea; + + /// + /// 获取门区域配置数据, 如果该函数会自动填充未配置的数据 + /// + public List GetCompletionDoorArea() + { + if (_completionDoorArea == null) + { + //需要处理 DoorAreaInfos 长度为 0 的房间, 并为其配置默认值 + _completionDoorArea = new List(DoorAreaInfos); + if (_completionDoorArea.Count == 0) + { + _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.N, 0, ((int)Size.X - 4) * GameConfig.TileCellSize)); + _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.S, 0, ((int)Size.X - 4) * GameConfig.TileCellSize)); + _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.W, 0, ((int)Size.Y - 5) * GameConfig.TileCellSize)); + _completionDoorArea.Add(new DoorAreaInfo(DoorDirection.E, 0, ((int)Size.Y - 5) * GameConfig.TileCellSize)); + } + } + + return _completionDoorArea; + } + + /// + /// 清除门区域配置数据, 再次调用 GetCompletionDoorArea() 会重新计算 DoorAreaInfo 数据 + /// + public void ClearCompletionDoorArea() + { + if (_completionDoorArea != null) + { + _completionDoorArea.Clear(); + _completionDoorArea = null; + } + } + + public void InitData() + { + Size = new SerializeVector2(); + Position = new SerializeVector2(); + DoorAreaInfos = new List(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomSplit.cs new file mode 100644 index 0000000..bc44b94 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonRoomSplit.cs @@ -0,0 +1,203 @@ + +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using Godot; + +/// +/// 房间配置文件相关信息, 将会在 RoomConfig.json 中汇总 +/// +public class DungeonRoomSplit +{ + /// + /// 房间异常类型 + /// + [JsonInclude] + public RoomErrorType ErrorType; + + /// + /// 该房间的文件夹路径 + /// + [JsonInclude] + public string Path; + + /// + /// 房间配置路径 + /// + [JsonIgnore] + public string RoomPath => Path + "/RoomInfo.json"; + + /// + /// 房间地块配置数据 + /// + [JsonIgnore] + public string TilePath => Path + "/TileInfo.json"; + + /// + /// 房间预设配置数据 + /// + [JsonIgnore] + public string PreinstallPath => Path + "/Preinstall.json"; + + /// + /// 预览图路径 + /// + [JsonIgnore] + public string PreviewPath => Path + "/Preview.png"; + + /// + /// 房间配置数据, 第一次获取会在资源中加载数据 + /// + [JsonIgnore] + public DungeonRoomInfo RoomInfo + { + get + { + if (_roomInfo == null && RoomPath != null) + { + ReloadRoomInfo(); + } + + return _roomInfo; + } + set => _roomInfo = value; + } + + private DungeonRoomInfo _roomInfo; + + /// + /// 房间地块配置数据 + /// + [JsonIgnore] + public DungeonTileInfo TileInfo + { + get + { + if (_tileInfo == null && TilePath != null) + { + ReloadTileInfo(); + } + + return _tileInfo; + } + set => _tileInfo = value; + } + + private DungeonTileInfo _tileInfo; + + /// + /// 房间预设数据 + /// + [JsonIgnore] + public List Preinstall + { + get + { + if (_preinstall == null && PreinstallPath != null) + { + ReloadPreinstall(); + } + + return _preinstall; + } + set => _preinstall = value; + } + + private List _preinstall; + + /// + /// 预览图 + /// + [JsonIgnore] + public Texture2D PreviewImage + { + get + { + if (_previewImage == null) + { + ReloadPreviewImage(); + } + + return _previewImage; + } + set + { + if (_previewImage != null) + { + _previewImage.Dispose(); + } + + _previewImage = value; + } + } + + private Texture2D _previewImage; + + /// + /// 重新加载房间数据 + /// + public void ReloadRoomInfo() + { + var asText = ResourceManager.LoadText("res://" + RoomPath); + _roomInfo = JsonSerializer.Deserialize(asText); + } + + /// + /// 重新加载房间地块配置数据 + /// + public void ReloadTileInfo() + { + var asText = ResourceManager.LoadText("res://" + TilePath); + _tileInfo = JsonSerializer.Deserialize(asText); + } + + /// + /// 重新加载房间预设数据 + /// + public void ReloadPreinstall() + { + var asText = ResourceManager.LoadText("res://" + PreinstallPath); + _preinstall = JsonSerializer.Deserialize>(asText); + } + + /// + /// 重新加载预览图片 + /// + public void ReloadPreviewImage() + { + if (_previewImage != null) + { + _previewImage.Dispose(); + } + + if (File.Exists(PreviewPath)) + { + var bytes = File.ReadAllBytes(PreviewPath); + + var image = Image.Create(GameConfig.PreviewImageSize, GameConfig.PreviewImageSize, false, Image.Format.Rgb8); + image.LoadPngFromBuffer(bytes); + _previewImage = ImageTexture.CreateFromImage(image); + } + } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + + if (obj is DungeonRoomSplit roomSplit) + { + return roomSplit.Path == Path; + } + + return this == obj; + } + + public override int GetHashCode() + { + return Path.GetHashCode(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonTileInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonTileInfo.cs new file mode 100644 index 0000000..9e97d81 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/DungeonTileInfo.cs @@ -0,0 +1,73 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +public class DungeonTileInfo +{ + /// + /// 导航顶点数据 + /// + [JsonInclude] + public List NavigationVertices; + + /// + /// 导航多边形数据 + /// + [JsonInclude] + public List NavigationPolygon; + + /// + /// 底层数据, 四个一组, 分别是: 地图x坐标, 地图y坐标, Terrain 的 bit, Terrain 的 type + /// + [JsonInclude] + public List Floor; + + /// + /// 自定义底层1, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomFloor1; + + /// + /// 自定义底层2, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomFloor2; + + /// + /// 自定义底层3, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomFloor3; + + /// + /// 自定义中层1, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomMiddle1; + + /// + /// 自定义中层2, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomMiddle2; + + /// + /// 自定义顶层, 数据五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 + /// + [JsonInclude] + public List CustomTop; + + public void InitData() + { + NavigationVertices = new List(); + NavigationPolygon = new List(); + Floor = new List(); + CustomFloor1 = new List(); + CustomFloor2 = new List(); + CustomFloor3 = new List(); + CustomMiddle1 = new List(); + CustomMiddle2 = new List(); + CustomTop = new List(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/LayerData.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/LayerData.cs new file mode 100644 index 0000000..65476ae --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/LayerData.cs @@ -0,0 +1,23 @@ + +using System.Text.Json.Serialization; + +/// +/// 层级数据 +/// +public class LayerData +{ + /// + /// 层级名称 + /// + [JsonInclude] public string Name; + + /// + /// 层级 + /// + [JsonInclude] public uint Layer; + + /// + /// 是否可见(仅在编辑器中) + /// + [JsonInclude] public bool Visible; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfo.cs new file mode 100644 index 0000000..41bdd08 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfo.cs @@ -0,0 +1,50 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +/// +/// 标记数据 +/// +public class MarkInfo +{ + /// + /// 所在坐标 + /// + [JsonInclude] + public SerializeVector2 Position; + + /// + /// 区域大小 + /// + [JsonInclude] + public SerializeVector2 Size; + + /// + /// 特殊标记类型 + /// + [JsonInclude] + public SpecialMarkType SpecialMarkType = SpecialMarkType.Normal; + + /// + /// 延时时间, 单位: 秒 + /// + [JsonInclude] + public float DelayTime; + + /// + /// 标记列表数据 + /// + [JsonInclude] + public List MarkList; + + /// + /// 从指定 MarkInfo 克隆数据, 浅拷贝 + /// + public void CloneFrom(MarkInfo mark) + { + Position = mark.Position; + Size = mark.Size; + DelayTime = mark.DelayTime; + MarkList = mark.MarkList; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfoItem.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfoItem.cs new file mode 100644 index 0000000..6e38c93 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/MarkInfoItem.cs @@ -0,0 +1,45 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +/// +/// 标记项数据 +/// +public class MarkInfoItem +{ + /// + /// 物体Id + /// + [JsonInclude] + public string Id; + + /// + /// 权重 + /// + [JsonInclude] + public int Weight; + + /// + /// 额外属性 + /// + [JsonInclude] + public Dictionary Attr; + + /// + /// 物体初始海拔高度 + /// + [JsonInclude] + public int Altitude; + + /// + /// 物体初始纵轴速度 + /// + [JsonInclude] + public float VerticalSpeed; + + /// + /// 所属标记类型 + /// + [JsonIgnore] + public SpecialMarkType SpecialMarkType = SpecialMarkType.Normal; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/room/RoomPreinstallInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/room/RoomPreinstallInfo.cs new file mode 100644 index 0000000..2cb7c7f --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/room/RoomPreinstallInfo.cs @@ -0,0 +1,77 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +/// +/// 房间预设数据 +/// +public class RoomPreinstallInfo +{ + /// + /// 预设名称 + /// + [JsonInclude] + public string Name; + + /// + /// 预设权重 + /// + [JsonInclude] + public int Weight; + + /// + /// 预设备注 + /// + [JsonInclude] + public string Remark; + + /// + /// 是否自动填充数据 + /// + [JsonInclude] + public bool AutoFill; + + /// + /// 波数数据 + /// + [JsonInclude] + public List> WaveList; + + /// + /// 初始化波数据 + /// + public void InitWaveList() + { + WaveList = new List> + { + new List() + }; + } + + /// + /// 初始化特殊标记 + /// + public void InitSpecialMark(DungeonRoomType roomType) + { + var type = SpecialMarkType.Normal; + if (roomType == DungeonRoomType.Inlet) //初始房间 + { + type = SpecialMarkType.BirthPoint; + } + else if (roomType == DungeonRoomType.Outlet) //结束房间 + { + type = SpecialMarkType.OutPoint; + } + + if (type != SpecialMarkType.Normal) + { + var preloading = WaveList[0]; + var markInfo = new MarkInfo(); + markInfo.Position = new SerializeVector2(); + markInfo.Size = new SerializeVector2(); + markInfo.SpecialMarkType = type; + markInfo.MarkList = new List(); + preloading.Add(markInfo); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileCombinationInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileCombinationInfo.cs new file mode 100644 index 0000000..5f3e619 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileCombinationInfo.cs @@ -0,0 +1,54 @@ + +using System.Text.Json.Serialization; + +/// +/// 组合图块数据 +/// +public class TileCombinationInfo : IClone +{ + /// + /// 组合唯一Id + /// + [JsonInclude] + public string Id; + /// + /// 组合名称 + /// + [JsonInclude] + public string Name; + /// + /// 组合图块数据, 在纹理中的坐标, 单位: 像素 + /// + [JsonInclude] + public SerializeVector2[] Cells; + /// + /// 组合图块数据, 显示位置, 单位: 像素 + /// + [JsonInclude] + public SerializeVector2[] Positions; + + public TileCombinationInfo Clone() + { + var combinationInfo = new TileCombinationInfo(); + combinationInfo.Id = Id; + combinationInfo.Name = Name; + if (Cells != null) + { + combinationInfo.Cells = new SerializeVector2[Cells.Length]; + for (int i = 0; i < Cells.Length; i++) + { + combinationInfo.Cells[i] = Cells[i].Clone(); + } + } + + if (Positions != null) + { + combinationInfo.Positions = new SerializeVector2[Positions.Length]; + for (int i = 0; i < Positions.Length; i++) + { + combinationInfo.Positions[i] = Positions[i].Clone(); + } + } + return combinationInfo; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetInfo.cs new file mode 100644 index 0000000..926df8f --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetInfo.cs @@ -0,0 +1,63 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +/// +/// 图块集数据 +/// +public class TileSetInfo : IClone, IDestroy +{ + [JsonIgnore] + public bool IsDestroyed { get; private set; } + + /// + /// 图块集名称 + /// + [JsonInclude] + public string Name; + + /// + /// 资源集合 + /// + [JsonInclude] + public List Sources; + + /// + /// 初始化默认数据 + /// + public void InitData() + { + Sources = new List(); + } + + public TileSetInfo Clone() + { + var tileSetInfo = new TileSetInfo(); + tileSetInfo.Name = Name; + if (Sources != null) + { + tileSetInfo.Sources = new List(); + foreach (var source in Sources) + { + tileSetInfo.Sources.Add(source.Clone()); + } + } + return tileSetInfo; + } + + public void Destroy() + { + if (IsDestroyed) return; + IsDestroyed = true; + + if (Sources != null) + { + foreach (var tileSetSourceInfo in Sources) + { + tileSetSourceInfo.Destroy(); + } + + Sources = null; + } + } +} \ 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 new file mode 100644 index 0000000..c083d70 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSourceInfo.cs @@ -0,0 +1,110 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Godot; + +/// +/// 图集资源数据 +/// +public class TileSetSourceInfo : IClone, IDestroy +{ + [JsonIgnore] + public bool IsDestroyed { get; private set; } + + /// + /// 资源名称 + /// + [JsonInclude] + public string Name; + + /// + /// 资源路径 + /// + [JsonInclude] + public string SourcePath; + + /// + /// 地形配置数据 + /// + [JsonInclude] + public List Terrain; + + /// + /// 组合数据 + /// + [JsonInclude] + public List Combination; + + [JsonIgnore] + private Image _sourceImage; + + /// + /// 初始化默认数据 + /// + public void InitData() + { + Terrain = new List(); + Combination = new List(); + } + + /// + /// 获取资源图像数据 + /// + public Image GetSourceImage() + { + if (_sourceImage == null && string.IsNullOrEmpty(SourcePath)) + { + return null; + } + return _sourceImage ??= Image.LoadFromFile(SourcePath); + } + + /// + /// 设置图像资源 + /// + public void SetSourceImage(Image image) + { + if (_sourceImage != null) + { + _sourceImage.Dispose(); + } + _sourceImage = image; + } + + public TileSetSourceInfo Clone() + { + var tileSetSourceInfo = new TileSetSourceInfo(); + tileSetSourceInfo.Name = Name; + tileSetSourceInfo.Terrain = new List(); + foreach (var item in Terrain) + { + tileSetSourceInfo.Terrain.Add(item.Clone()); + } + tileSetSourceInfo.Combination = new List(); + foreach (var combination in Combination) + { + tileSetSourceInfo.Combination.Add(combination.Clone()); + } + tileSetSourceInfo.SourcePath = SourcePath; + if (_sourceImage != null) + { + tileSetSourceInfo._sourceImage = (Image)_sourceImage.Duplicate(); + } + + return tileSetSourceInfo; + } + + public void Destroy() + { + if (IsDestroyed) return; + IsDestroyed = true; + if (_sourceImage != null) + { + _sourceImage.Dispose(); + _sourceImage = null; + } + + Terrain = null; + Combination = null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs new file mode 100644 index 0000000..a769406 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs @@ -0,0 +1,343 @@ + +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; +using Godot; + +public class TileSetSplit : IDestroy +{ + [JsonIgnore] + public bool IsDestroyed { get; private set; } + + /// + /// 路径 + /// + [JsonInclude] + public string Path; + + /// + /// 备注 + /// + [JsonInclude] + public string Remark; + + /// + /// 图块集路径 + /// + [JsonIgnore] + public string TileSetPath => Path + "/TileSet.json"; + + /// + /// 图块集信息 + /// + [JsonIgnore] + public TileSetInfo TileSetInfo + { + get + { + if (_tileSetInfo == null && TileSetPath != null) + { + ReloadTileSetInfo(); + } + + return _tileSetInfo; + } + } + + private TileSetInfo _tileSetInfo; + private TileSet _tileSet; + + /// + /// 设置图块集信息 + /// + public void SetTileSetInfo(TileSetInfo info) + { + if (_tileSetInfo != null) + { + _tileSetInfo.Destroy(); + } + + if (_tileSet != null) + { + _tileSet.Dispose(); + _tileSet = null; + } + _tileSetInfo = info; + } + + /// + /// 重新加载图块集信息 + /// + public void ReloadTileSetInfo() + { + var asText = ResourceManager.LoadText("res://" + TileSetPath); + _tileSetInfo = JsonSerializer.Deserialize(asText); + + if (_tileSet != null) + { + _tileSet.Dispose(); + _tileSet = null; + } + } + + /// + /// 获取由该对象生成的Godot.TileSet对象 + /// + public TileSet GetTileSet() + { + if (_tileSet != null) + { + return _tileSet; + } + + if (TileSetInfo == null) + { + return null; + } + + //检查是否有异常 + _tileSet = new TileSet(); + if (_tileSetInfo.Sources != null) + { + //TileSet网格大小 + _tileSet.TileSize = GameConfig.TileCellSizeVector2I; + //物理层 0 + _tileSet.AddPhysicsLayer(); + _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall); + _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.None); + + var terrainSetIndex = 0; + + //Source资源 + for (var sourceIndex = 0; sourceIndex < _tileSetInfo.Sources.Count; sourceIndex++) + { + var tileSetSourceInfo = _tileSetInfo.Sources[sourceIndex]; + var terrainList = tileSetSourceInfo.Terrain; + + var tileSetAtlasSource = new TileSetAtlasSource(); + _tileSet.AddSource(tileSetAtlasSource); + + //纹理 + var image = tileSetSourceInfo.GetSourceImage(); + if (image != null) + { + tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(image); + + var size = image.GetSize() / GameConfig.TileCellSize; + //创建cell + for (var i = 0; i < size.X; i++) + { + for (var j = 0; j < size.Y; j++) + { + tileSetAtlasSource.CreateTile(new Vector2I(i, j)); + } + } + } + + for (var i = 0; i < terrainList.Count; i++) + { + var terrainInfo = terrainList[i]; + //地形层 + _tileSet.AddTerrainSet(); + _tileSet.AddTerrain(terrainSetIndex); + //_tileSet.SetTerrainName(terrainSetIndex, 0, terrainInfo.Name); + + if (terrainInfo.TerrainType == 0) //3x3地形 + { + _tileSet.SetTerrainSetMode(terrainSetIndex, TileSet.TerrainMode.CornersAndSides); + } + else //2x2地形 + { + _tileSet.SetTerrainSetMode(terrainSetIndex, TileSet.TerrainMode.Corners); + } + + //初始化地形 + tileSetAtlasSource.InitTerrain(terrainInfo, terrainSetIndex, 0); + if (sourceIndex == 0 && i == 0) + { + InitMainSourceData(terrainInfo, tileSetAtlasSource); + } + + terrainSetIndex++; + } + } + } + + return _tileSet; + } + + private static void InitMainSourceData(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource) + { + //ySort + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 39); + // + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 39); + // + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 39); + // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 39); + + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 23); + + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 1), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 1), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 1), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 1), 7); + + //碰撞器 + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 0), true); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 1), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 2), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 4), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 1), false); + } + + /// + /// 设置地图块的 Y 排序原点。 + /// + private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, int ySortOrigin) + { + var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type); + var cellData = terrainInfo.GetTerrainCell(index, type); + if (cellData != null) + { + var pos = terrainInfo.GetPosition(cellData); + var tileData = tileSetAtlasSource.GetTileData(pos, 0); + tileData.YSortOrigin = ySortOrigin; + } + } + + /// + /// 设置Atlas源碰撞信息, isHalf: 是否半块 + /// + private static void SetAtlasSourceCollision(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, bool isHalf) + { + if (isHalf) //暂时让半块不设置碰撞信息 + { + return; + } + var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type); + var cellData = terrainInfo.GetTerrainCell(index, type); + if (cellData != null) + { + var pos = terrainInfo.GetPosition(cellData); + var tileData = tileSetAtlasSource.GetTileData(pos, 0); + tileData.AddCollisionPolygon(0); + // if (isHalf) + // { + // tileData.SetCollisionPolygonPoints(0, 0, new[] + // { + // new Vector2(-8, 7), + // new Vector2(8, 7), + // new Vector2(8, 8), + // new Vector2(-8, 8) + // }); + // } + // else + { + tileData.SetCollisionPolygonPoints(0, 0, new [] + { + new Vector2(-8, -8), + new Vector2(8, -8), + new Vector2(8, 8), + new Vector2(-8, 8) + }); + } + } + } + + public void Destroy() + { + if (IsDestroyed) return; + IsDestroyed = true; + + if (_tileSetInfo != null) + { + _tileSetInfo.Destroy(); + } + + if (_tileSet != null) + { + _tileSet.Dispose(); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs new file mode 100644 index 0000000..1dda3bf --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs @@ -0,0 +1,470 @@ + +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Godot; +using static TerrainPeering; + +/// +/// 地形配置数据, 数据都为 int 数组, 下标0和1分别代表x和y, 单位: 像素 +/// +public class TileSetTerrainInfo : IClone +{ + public const byte TerrainLayerType = 1; + public const byte MiddleLayerType = 2; + public const byte FloorLayerType = 3; + + /// + /// 地形名称 + /// + [JsonInclude] + public string Name; + + //type = 3 + /// + /// 地板 (1块) type = 3 + /// + [JsonInclude] public Dictionary F; + + /// + /// 侧方墙壁 (8块) type = 2 + /// + [JsonInclude] public Dictionary M; + + /// + /// 自动平铺地形 (47块/13块) type = 1 + /// + [JsonInclude] public Dictionary T; + + /// + /// 地形类型, 0: 3x3地形, 1: 2x2地形 + /// + [JsonInclude] + public byte TerrainType; + + /// + /// 地形是否准备好了, 调用 RefreshReady() 刷新 + /// + [JsonInclude] + public bool Ready; + + public void InitData() + { + TerrainType = 0; + F = new Dictionary(); + M = new Dictionary(); + T = new Dictionary(); + } + + public TileSetTerrainInfo Clone() + { + var terrainInfo = new TileSetTerrainInfo(); + terrainInfo.InitData(); + terrainInfo.Name = Name; + terrainInfo.Ready = Ready; + 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] }); + } + terrainInfo.TerrainType = TerrainType; + return terrainInfo; + } + + /// + /// 刷新这个TileSet地形是否可以正常使用了 + /// + public void RefreshReady(int sourceIndex, int terrainIndex) + { + if (TerrainType == 0) + { + if (sourceIndex == 0 && terrainIndex == 0) + { + Ready = T != null && T.Count == 47 && M != null && M.Count == 8 && F != null && F.Count == 1; + } + else + { + Ready = T != null && T.Count == 47; + } + } + else + { + Ready = T != null && T.Count == 13; + } + } + + /// + /// 将存储的坐标数据转换成 Vector2I 对象, 返回的 Vector2I 单位: 格 + /// + public Vector2I GetPosition(int[] ints) + { + return new Vector2I(ints[0] / GameConfig.TileCellSize, ints[1] / GameConfig.TileCellSize); + } + + /// + /// 将地形掩码中的坐标转换为索引。 + /// + /// 地形坐标 + /// 地形类型 + public int TerrainCoordsToIndex(Vector2I bitCoords, byte type) + { + if (type == TerrainLayerType) + { + return bitCoords.Y * GameConfig.TerrainBit3x3.X + bitCoords.X; + } + else if (type == MiddleLayerType) + { + return bitCoords.Y * GameConfig.TerrainBitMiddle.X + bitCoords.X; + } + else if (type == FloorLayerType) + { + return bitCoords.Y * GameConfig.TerrainBitFloor.X + bitCoords.X; + } + return -1; + } + + /// + /// 将地掩码值转换为索引值 + /// + /// 地形掩码值 + /// 地形类型 + public int TerrainBitToIndex(uint bit, byte type) + { + if (type == TerrainLayerType) //顶部墙壁 + { + if (TerrainType == 0) //47格 + { + switch (bit) + { + case Center | Bottom: return 0; + case Center | Right | Bottom: return 1; + case Left | Center | Right | Bottom: return 2; + case Left | Center | Bottom: return 3; + case LeftTop | Top | Left | Center | Right | Bottom: return 4; + case Left | Center | Right | Bottom | RightBottom: return 5; + case Left | Center | Right | LeftBottom | Bottom: return 6; + case Top | RightTop | Left | Center | Right | Bottom: return 7; + case Center | Right | Bottom | RightBottom: return 8; + case Top | Left | Center | Right | LeftBottom | Bottom | RightBottom: return 9; + case Left | Center | Right | LeftBottom | Bottom | RightBottom: return 10; + case Left | Center | LeftBottom | Bottom: return 11; + case Top | Center | Bottom: return 12; + case Top | Center | Right | Bottom: return 13; + case Top | Left | Center | Right | Bottom: return 14; + case Top | Left | Center | Bottom: return 15; + case Top | Center | Right | Bottom | RightBottom: return 16; + case Top | RightTop | Left | Center | Right | LeftBottom | Bottom | RightBottom: return 17; + case LeftTop | Top | Left | Center | Right | LeftBottom | Bottom | RightBottom: return 18; + case Top | Left | Center | LeftBottom | Bottom: return 19; + case Top | RightTop | Center | Right | Bottom | RightBottom: return 20; + case Top | RightTop | Left | Center | Right | LeftBottom | Bottom: return 21; + case LeftTop | Top | Left | Center | Right | LeftBottom | Bottom: return 23; + case Top | Center: return 24; + case Top | Center | Right: return 25; + case Top | Left | Center | Right: return 26; + case Top | Left | Center: return 27; + case Top | RightTop | Center | Right | Bottom: return 28; + case LeftTop | Top | RightTop | Left | Center | Right | Bottom | RightBottom: return 29; + case LeftTop | Top | RightTop | Left | Center | Right | LeftBottom | Bottom: return 30; + case LeftTop | Top | Left | Center | Bottom: return 31; + case Top | RightTop | Left | Center | Right | Bottom | RightBottom: return 32; + case LeftTop | Top | RightTop | Left | Center | Right | LeftBottom | Bottom | RightBottom: return 33; + case LeftTop | Top | Left | Center | Right | Bottom | RightBottom: return 34; + case LeftTop | Top | Left | Center | LeftBottom | Bottom: return 35; + case Center: return 36; + case Center | Right: return 37; + case Left | Center | Right: return 38; + case Left | Center: return 39; + case Top | Left | Center | Right | LeftBottom | Bottom: return 40; + case Top | RightTop | Left | Center | Right: return 41; + case LeftTop | Top | Left | Center | Right: return 42; + case Top | Left | Center | Right | Bottom | RightBottom: return 43; + case Top | RightTop | Center | Right: return 44; + case LeftTop | Top | RightTop | Left | Center | Right: return 45; + case LeftTop | Top | RightTop | Left | Center | Right | Bottom: return 46; + case LeftTop | Top | Left | Center: return 47; + } + } + else if (TerrainType == 1) //13格 + { + switch (bit) + { + //第一排 + case Center | RightBottom: return 0; + case Center | RightBottom | LeftBottom: return 1; + case Center | LeftBottom: return 2; + case Center | LeftTop | RightTop | LeftBottom: return 3; + case Center | LeftTop | RightTop | RightBottom: return 4; + //第二排 + case Center | RightTop | RightBottom: return 5; + case Center | LeftTop | LeftBottom | RightTop | RightBottom: return 6; + case Center | LeftTop | LeftBottom: return 7; + case Center | LeftTop | LeftBottom | RightBottom: return 8; + case Center | RightTop | LeftBottom | RightBottom: return 9; + //第三排 + case Center | RightTop: return 10; + case Center | LeftTop | RightTop: return 11; + case Center | LeftTop: return 12; + } + } + } + else if (type == MiddleLayerType) + { + if (bit < 8) + { + return (int)bit; + } + } + else if (type == FloorLayerType) + { + if (bit == 0) + { + return 0; + } + } + + return -1; + } + + /// + /// 根据给定的索引和类型计算地形掩码值。 + /// + /// 用于确定地形掩码的索引。 + /// 要计算地形位值的图层类型。 + /// + public uint IndexToTerrainBit(int index, byte type) + { + if (type == TerrainLayerType) //顶部墙壁 + { + if (TerrainType == 0) //47格 + { + switch (index) + { + case 0: return Center | Bottom; + case 1: return Center | Right | Bottom; + case 2: return Left | Center | Right | Bottom; + case 3: return Left | Center | Bottom; + case 4: return LeftTop | Top | Left | Center | Right | Bottom; + case 5: return Left | Center | Right | Bottom | RightBottom; + case 6: return Left | Center | Right | LeftBottom | Bottom; + case 7: return Top | RightTop | Left | Center | Right | Bottom; + case 8: return Center | Right | Bottom | RightBottom; + case 9: return Top | Left | Center | Right | LeftBottom | Bottom | RightBottom; + case 10: return Left | Center | Right | LeftBottom | Bottom | RightBottom; + case 11: return Left | Center | LeftBottom | Bottom; + case 12: return Top | Center | Bottom; + case 13: return Top | Center | Right | Bottom; + case 14: return Top | Left | Center | Right | Bottom; + case 15: return Top | Left | Center | Bottom; + case 16: return Top | Center | Right | Bottom | RightBottom; + case 17: return Top | RightTop | Left | Center | Right | LeftBottom | Bottom | RightBottom; + case 18: return LeftTop | Top | Left | Center | Right | LeftBottom | Bottom | RightBottom; + case 19: return Top | Left | Center | LeftBottom | Bottom; + case 20: return Top | RightTop | Center | Right | Bottom | RightBottom; + case 21: return Top | RightTop | Left | Center | Right | LeftBottom | Bottom; + case 23: return LeftTop | Top | Left | Center | Right | LeftBottom | Bottom; + case 24: return Top | Center; + case 25: return Top | Center | Right; + case 26: return Top | Left | Center | Right; + case 27: return Top | Left | Center; + case 28: return Top | RightTop | Center | Right | Bottom; + case 29: return LeftTop | Top | RightTop | Left | Center | Right | Bottom | RightBottom; + case 30: return LeftTop | Top | RightTop | Left | Center | Right | LeftBottom | Bottom; + case 31: return LeftTop | Top | Left | Center | Bottom; + case 32: return Top | RightTop | Left | Center | Right | Bottom | RightBottom; + case 33: return LeftTop | Top | RightTop | Left | Center | Right | LeftBottom | Bottom | RightBottom; + case 34: return LeftTop | Top | Left | Center | Right | Bottom | RightBottom; + case 35: return LeftTop | Top | Left | Center | LeftBottom | Bottom; + case 36: return Center; + case 37: return Center | Right; + case 38: return Left | Center | Right; + case 39: return Left | Center; + case 40: return Top | Left | Center | Right | LeftBottom | Bottom; + case 41: return Top | RightTop | Left | Center | Right; + case 42: return LeftTop | Top | Left | Center | Right; + case 43: return Top | Left | Center | Right | Bottom | RightBottom; + case 44: return Top | RightTop | Center | Right; + case 45: return LeftTop | Top | RightTop | Left | Center | Right; + case 46: return LeftTop | Top | RightTop | Left | Center | Right | Bottom; + case 47: return LeftTop | Top | Left | Center; + } + } + else if (TerrainType == 1) //13格 + { + switch (index) + { + //第一排 + case 0: return Center | RightBottom; + case 1: return Center | RightBottom | LeftBottom; + case 2: return Center | LeftBottom; + case 3: return Center | LeftTop | RightTop | LeftBottom; + case 4: return Center | LeftTop | RightTop | RightBottom; + //第二排 + case 5: return Center | RightTop | RightBottom; + case 6: return Center | LeftTop | LeftBottom | RightTop | RightBottom; + case 7: return Center | LeftTop | LeftBottom; + case 8: return Center | LeftTop | LeftBottom | RightBottom; + case 9: return Center | RightTop | LeftBottom | RightBottom; + //第三排 + case 10: return Center | RightTop; + case 11: return Center | LeftTop | RightTop; + case 12: return Center | LeftTop; + } + } + } + else if (type == MiddleLayerType) + { + if (index >= 0 && index < 8) + { + return (uint)index; + } + } + + return None; + } + + /// + /// 将地形掩码存入 TileSetTerrainInfo 中 + /// + public void SetTerrainCell(int index, byte type, int[] cellData) + { + if (type == TerrainLayerType) //顶部墙壁 + { + var terrainBit = IndexToTerrainBit(index, type); + if (terrainBit != None) + { + T[terrainBit] = cellData; + } + } + else if (type == MiddleLayerType) //侧方墙壁 + { + 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; + + case 4: M[4] = cellData; break; + case 5: M[5] = cellData; break; + case 6: M[6] = cellData; break; + case 7: M[7] = cellData; break; + } + } + else if (type == FloorLayerType) //地板 + { + F[0] = cellData; + } + } + + /// + /// 移除地形掩码 + /// + public void RemoveTerrainCell(int index, byte type) + { + if (type == TerrainLayerType) //顶部墙壁 + { + var terrainBit = IndexToTerrainBit(index, type); + if (terrainBit != None) + { + T.Remove(terrainBit); + } + } + else if (type == MiddleLayerType) //侧方墙壁 + { + switch (index) + { + case 0: M.Remove(0); break; + case 1: M.Remove(1); break; + case 2: M.Remove(2); break; + case 3: M.Remove(3); break; + + case 4: M.Remove(4); break; + case 5: M.Remove(5); break; + case 6: M.Remove(6); break; + case 7: M.Remove(7); break; + } + } + else if (type == FloorLayerType) //地板 + { + F.Remove(0); + } + } + + /// + /// 获取指定索引的地形掩码存储的数据 + /// + public int[] GetTerrainCell(int index, byte type) + { + if (type == TerrainLayerType) //顶部墙壁 + { + var terrainBit = IndexToTerrainBit(index, type); + if (terrainBit != None) + { + if (T.TryGetValue(terrainBit, out var cellData)) + { + return cellData; + } + } + } + else if (type == MiddleLayerType) //侧方墙壁 + { + 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; + case 4: + { + if (M.TryGetValue(4, out var cellData)) return cellData; + } + break; + case 5: + { + if (M.TryGetValue(5, out var cellData)) return cellData; + } + break; + case 6: + { + if (M.TryGetValue(6, out var cellData)) return cellData; + } + break; + case 7: + { + if (M.TryGetValue(7, out var cellData)) return cellData; + } + break; + } + } + else if (type == FloorLayerType) //地板 + { + 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 new file mode 100644 index 0000000..fc314ec --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/tileSet/TerrainPeering.cs @@ -0,0 +1,153 @@ + +using Godot; + +/// +/// 地形掩码 +/// +public static class TerrainPeering +{ + /// + /// 无 + /// + public const uint None = 0; + /// + /// 左上 + /// + public const uint LeftTop = 0b1; + /// + /// 上 + /// + public const uint Top = 0b10; + /// + /// 右上 + /// + public const uint RightTop = 0b100; + /// + /// 左 + /// + public const uint Left = 0b1000; + /// + /// 中心 + /// + public const uint Center = 0b10000; + /// + /// 右 + /// + public const uint Right = 0b100000; + /// + /// 左下 + /// + public const uint LeftBottom = 0b1000000; + /// + /// 下 + /// + public const uint Bottom = 0b10000000; + /// + /// 右下 + /// + public const uint RightBottom = 0b100000000; + + /// + /// 获取地形掩码值 + /// + public static uint GetTerrainPeeringValue(this TileData tileData) + { + if (tileData.Terrain != -1 && tileData.TerrainSet != -1) + { + var value = Center; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner) >= 0) + value |= LeftTop; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopSide) >= 0) + value |= Top; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner) >= 0) + value |= RightTop; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide) >= 0) + value |= Left; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.RightSide) >= 0) + value |= Right; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner) >= 0) + value |= LeftBottom; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide) >= 0) + value |= Bottom; + if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner) >= 0) + value |= RightBottom; + return value; + } + + return None; + } + + /// + /// 将地形掩码数据设置到 TileSetAtlasSource 中 + /// + public static void InitTerrain(this TileSetAtlasSource atlasSource, TileSetTerrainInfo terrainInfo, int terrainSet, int terrain) + { + foreach (var keyValuePair in terrainInfo.T) + { + var pos = terrainInfo.GetPosition(keyValuePair.Value); + var tileData = atlasSource.GetTileData(pos, 0); + if (tileData == null) + { + continue; + } + tileData.TerrainSet = terrainSet; + tileData.Terrain = terrain; + + var bit = keyValuePair.Key; + if (terrainInfo.TerrainType == 0) //3x3地形 + { + 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); + } + } + else //2x2地形 + { + if ((bit & LeftTop) != 0) + { + tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner, 0); + } + if ((bit & RightTop) != 0) + { + tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner, 0); + } + if ((bit & LeftBottom) != 0) + { + tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner, 0); + } + if ((bit & RightBottom) != 0) + { + tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner, 0); + } + } + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/serialize/SerializeVector2.cs b/DungeonShooting_Godot/src/framework/serialize/SerializeVector2.cs index 4e0a888..df09b4c 100644 --- a/DungeonShooting_Godot/src/framework/serialize/SerializeVector2.cs +++ b/DungeonShooting_Godot/src/framework/serialize/SerializeVector2.cs @@ -5,7 +5,7 @@ /// /// 可序列化的 Vector2 对象 /// -public class SerializeVector2 +public class SerializeVector2 : IClone { public SerializeVector2(float x, float y) { @@ -56,4 +56,10 @@ { return new Vector2I((int)X, (int)Y); } + + + public SerializeVector2 Clone() + { + return new SerializeVector2(this); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/ui/UiBase.cs b/DungeonShooting_Godot/src/framework/ui/UiBase.cs index 17e6d7e..5987af6 100644 --- a/DungeonShooting_Godot/src/framework/ui/UiBase.cs +++ b/DungeonShooting_Godot/src/framework/ui/UiBase.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using Godot; @@ -8,6 +9,19 @@ public abstract partial class UiBase : Control, IDestroy, ICoroutine { /// + /// Ui显示事件 + /// + public event Action OnShowUiEvent; + /// + /// Ui隐藏事件 + /// + public event Action OnHideUiEvent; + /// + /// Ui销毁事件 + /// + public event Action OnDestroyUiEvent; + + /// /// 当前 UI 所属层级 /// [Export] @@ -42,12 +56,23 @@ /// public IUiNode ParentNode { get; private set; } + /// + /// 是否是嵌套的子 Ui + /// + public bool IsNestedUi => ParentUi != null; + //开启的协程 private List _coroutineList; //嵌套打开的Ui列表 private HashSet _nestedUiSet; + //嵌套模式下是否打开Ui + private bool _nestedOpen; //当前Ui包含的 IUiNodeScript 接口, 关闭Ui是需要调用 IUiNodeScript.OnDestroy() private HashSet _nodeScripts; + //存放事件集合的对象 + private EventFactory _eventFactory; + //存放的IUiGrid对象 + private List _uiGrids; public UiBase(string uiName) { @@ -113,16 +138,24 @@ return; } + _nestedOpen = true; IsOpen = true; Visible = true; OnShowUi(); + if (OnShowUiEvent != null) + { + OnShowUiEvent(); + } //子Ui调用显示 if (_nestedUiSet != null) { foreach (var uiBase in _nestedUiSet) { - uiBase.ShowUi(); + if (uiBase._nestedOpen || uiBase.Visible) + { + uiBase.ShowUi(); + } } } } @@ -142,16 +175,25 @@ return; } + _nestedOpen = false; IsOpen = false; Visible = false; OnHideUi(); + if (OnHideUiEvent != null) + { + OnHideUiEvent(); + } //子Ui调用隐藏 if (_nestedUiSet != null) { foreach (var uiBase in _nestedUiSet) { - uiBase.HideUi(); + if (uiBase._nestedOpen) + { + uiBase.HideUi(); + uiBase._nestedOpen = true; + } } } } @@ -170,6 +212,19 @@ HideUi(); IsDestroyed = true; OnDestroyUi(); + if (OnDestroyUiEvent != null) + { + OnDestroyUiEvent(); + } + + if (_uiGrids != null) + { + foreach (var uiGrid in _uiGrids) + { + uiGrid.Destroy(); + } + _uiGrids.Clear(); + } //子Ui调用销毁 if (_nestedUiSet != null) @@ -196,10 +251,73 @@ { ParentUi.RecordNestedUi(this, null, UiManager.RecordType.Close); } - + + RemoveAllEventListener(); QueueFree(); } + /// + /// 添加监听事件, 所有事件会在当前 ui 销毁时自动销毁 + /// + /// 事件类型 + /// 回调函数 + public void AddEventListener(EventEnum eventType, Action callback) + { + if (_eventFactory == null) + { + _eventFactory = new EventFactory(); + } + _eventFactory.AddEventListener(eventType, callback); + } + + /// + /// 移除所有的监听事件 + /// + public void RemoveAllEventListener() + { + if (_eventFactory != null) + { + _eventFactory.RemoveAllEventListener(); + } + } + + /// + /// 创建一个UiGrid对象, 该Ui对象会在Ui销毁时自动销毁 + /// + /// 模板对象 + /// 模板对象类型 + /// 存放的数据类型 + /// Cell处理类 + public UiGrid CreateUiGrid(TNode template) where TNode : IUiCellNode where TCell : UiCell + { + var uiGrid = new UiGrid(template, typeof(TCell)); + if (_uiGrids == null) + { + _uiGrids = new List(); + } + _uiGrids.Add(uiGrid); + return uiGrid; + } + + /// + /// 创建一个UiGrid对象, 该Ui对象会在Ui销毁时自动销毁 + /// + /// 模板对象 + /// 父节点 + /// 模板对象类型 + /// 存放的数据类型 + /// Cell处理类 + public UiGrid CreateUiGrid(TNode template, Node parent) where TNode : IUiCellNode where TCell : UiCell + { + var uiGrid = new UiGrid(template, parent, typeof(TCell)); + if (_uiGrids == null) + { + _uiGrids = new List(); + } + _uiGrids.Add(uiGrid); + return uiGrid; + } + public sealed override void _Process(double delta) { if (!IsOpen) @@ -220,6 +338,7 @@ { var packedScene = ResourceManager.Load("res://" + GameConfig.UiPrefabDir + uiName + ".tscn"); var uiBase = packedScene.Instantiate(); + uiBase.Visible = false; uiBase.PrevUi = prevUi; AddChild(uiBase); RecordNestedUi(uiBase, null, UiManager.RecordType.Open); diff --git a/DungeonShooting_Godot/src/framework/ui/UiNode.cs b/DungeonShooting_Godot/src/framework/ui/UiNode.cs index f6e49c0..b5718be 100644 --- a/DungeonShooting_Godot/src/framework/ui/UiNode.cs +++ b/DungeonShooting_Godot/src/framework/ui/UiNode.cs @@ -43,6 +43,7 @@ { var packedScene = ResourceManager.Load("res://" + GameConfig.UiPrefabDir + uiName + ".tscn"); var uiBase = packedScene.Instantiate(); + uiBase.Visible = false; uiBase.PrevUi = prevUi; Instance.AddChild(uiBase); UiPanel.RecordNestedUi(uiBase, this, UiManager.RecordType.Open); diff --git a/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs b/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs index 31b88a3..3a1e5fc 100644 --- a/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs +++ b/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs @@ -195,6 +195,7 @@ } OnDestroy(); + CellNode.GetUiInstance().QueueFree(); IsDestroyed = true; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/ui/grid/UiGrid.cs b/DungeonShooting_Godot/src/framework/ui/grid/UiGrid.cs index bc51bd0..092102b 100644 --- a/DungeonShooting_Godot/src/framework/ui/grid/UiGrid.cs +++ b/DungeonShooting_Godot/src/framework/ui/grid/UiGrid.cs @@ -11,6 +11,11 @@ /// 传给Cell的数据类型 public class UiGrid : IUiGrid where TUiCellNode : IUiCellNode { + /// + /// 选中Cell的时的回调, 参数为 Cell 索引 + /// + public event Action SelectEvent; + public bool IsDestroyed { get; private set; } public int SelectIndex @@ -48,6 +53,11 @@ var uiCell = _cellList[newIndex]; uiCell.OnSelect(); } + + if (SelectEvent != null) + { + SelectEvent(newIndex); + } } } } @@ -65,6 +75,9 @@ public int Count => _cellList.Count; + /// + /// Godot 原生网格容器 + /// public GridContainer GridContainer { get; private set; } //模板对象 @@ -94,6 +107,25 @@ //选中的cell索引 private int _selectIndex = -1; + public UiGrid(TUiCellNode template, Node parent, Type cellType) + { + GridContainer = new UiGridContainer(OnReady, OnProcess); + GridContainer.Ready += OnReady; + _template = template; + _cellType = cellType; + parent.AddChild(GridContainer); + var uiInstance = _template.GetUiInstance(); + uiInstance.GetParent()?.RemoveChild(uiInstance); + if (uiInstance is Control control) + { + _size = control.Size; + if (control.CustomMinimumSize == Vector2.Zero) + { + control.CustomMinimumSize = _size; + } + } + } + public UiGrid(TUiCellNode template, Type cellType) { GridContainer = new UiGridContainer(OnReady, OnProcess); @@ -240,6 +272,47 @@ return _cellList[index]; } + + /// + /// 根据自定义回调查询数据 + /// + public UiCell Find(Func, bool> func) + { + foreach (var uiCell in _cellList) + { + if (func(uiCell)) + { + return uiCell; + } + } + + return null; + } + + /// + /// 遍历所有 Cell + /// + public void ForEach(Action> callback) + { + foreach (var uiCell in _cellList) + { + callback(uiCell); + } + } + + /// + /// 遍历所有 Cell, 回调函数返回 false 跳出循环 + /// + public void ForEach(Func, bool> callback) + { + foreach (var uiCell in _cellList) + { + if (!callback(uiCell)) + { + return; + } + } + } /// /// 设置当前网格组件中的所有 Cell 数据, 性能较低 @@ -274,15 +347,17 @@ } /// - /// 添加单条 Cell 数据 + /// 添加单条 Cell 数据, select 为是否立即选中 /// - public void Add(TData data) + public void Add(TData data, bool select = false) { - //取消选中 - SelectIndex = -1; var cell = GetCellInstance(); GridContainer.AddChild(cell.CellNode.GetUiInstance()); cell.SetData(data); + if (select) + { + SelectIndex = Count - 1; + } } /// @@ -420,6 +495,7 @@ _cellList = null; _cellPool = null; + _template.GetUiInstance().QueueFree(); GridContainer.QueueFree(); } @@ -439,7 +515,7 @@ } //调用 cell 更新 - var uiCells = _cellPool.ToArray(); + var uiCells = _cellList.ToArray(); for (var i = 0; i < uiCells.Length; i++) { var item = uiCells[i]; diff --git a/DungeonShooting_Godot/src/game/AnimatorNames.cs b/DungeonShooting_Godot/src/game/AnimatorNames.cs deleted file mode 100644 index bf3d97d..0000000 --- a/DungeonShooting_Godot/src/game/AnimatorNames.cs +++ /dev/null @@ -1,93 +0,0 @@ - -using Godot; - -/// -/// 预制动画名称 -/// -public static class AnimatorNames -{ - /// - /// 默认动画 - /// - public static readonly StringName Default = "default"; - /// - /// 静止不动 - /// - public static readonly StringName Idle = "idle"; - /// - /// 奔跑 - /// - public static readonly StringName Run = "run"; - /// - /// 倒退奔跑 - /// - public static readonly StringName ReverseRun = "reverseRun"; - /// - /// 翻滚 - /// - public static readonly StringName Roll = "roll"; - /// - /// 武器泛光动画 - /// - public static readonly StringName Floodlight = "floodlight"; - /// - /// 开门动画 - /// - public static readonly StringName OpenDoor = "openDoor"; - /// - /// 关门动画 - /// - public static readonly StringName CloseDoor = "closeDoor"; - /// - /// 开火 - /// - public static readonly StringName Fire = "fire"; - /// - /// 换弹 - /// - public static readonly StringName Reloading = "reloading"; - /// - /// 子弹上膛 - /// - public static readonly StringName BeLoaded = "beLoaded"; - /// - /// ui入场 - /// - public static readonly StringName In = "in"; - /// - /// ui出场 - /// - public static readonly StringName Out = "out"; - /// - /// 显示动画 - /// - public static readonly StringName Show = "show"; - /// - /// 播放特效 - /// - public static readonly StringName Play = "play"; - /// - /// 物体移动 - /// - public static readonly StringName Move = "move"; - /// - /// 攻击 - /// - public static readonly StringName Attack = "attack"; - /// - /// 惊讶动作 - /// - public static readonly StringName Astonished = "astonished"; - /// - /// 通知动作 - /// - public static readonly StringName Notify = "notify"; - /// - /// 疑惑动作 - /// - public static readonly StringName Query = "query"; - /// - /// 重置动画 - /// - public static readonly StringName Reset = "RESET"; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/GameApplication.cs b/DungeonShooting_Godot/src/game/GameApplication.cs index 3f57200..5670489 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -15,22 +15,22 @@ /// /// 游戏渲染视口 /// - [Export] public SubViewport SubViewport; + public SubViewport SubViewport; /// /// SubViewportContainer 组件 /// - [Export] public SubViewportContainer SubViewportContainer; + public SubViewportContainer SubViewportContainer; /// /// 场景根节点 /// - [Export] public Node2D SceneRoot; + public Node2D SceneRoot; /// /// 全局根节点 /// - [Export] public Node2D GlobalNodeRoot; + public Node2D GlobalNodeRoot; /// /// 游戏目标帧率 @@ -43,11 +43,6 @@ public Cursor Cursor { get; private set; } /// - /// 游戏世界 - /// - public World World { get; private set; } - - /// /// 地牢管理器 /// public DungeonManager DungeonManager { get; private set; } @@ -57,6 +52,11 @@ /// public Dictionary RoomConfig { get; private set; } + /// + /// TileSet配置 + /// + public Dictionary TileSetConfig { get; private set; } + // /// // /// 房间配置数据, key: 模板房间资源路径 // /// @@ -83,30 +83,51 @@ public GameApplication() { Instance = this; - TargetFps = (int)DisplayServer.ScreenGetRefreshRate(); + //TargetFps = 20; + TargetFps = Mathf.RoundToInt(DisplayServer.ScreenGetRefreshRate()); + + Utils.InitRandom(); //初始化配置表 ExcelConfig.Init(); + PreinstallMarkManager.Init(); //初始化房间配置数据 InitRoomConfig(); + //初始化TileSet配置数据 + InitTileSetConfig(); //初始化武器数据 Weapon.InitWeaponAttribute(); //初始化敌人数据 Enemy.InitEnemyAttribute(); DungeonConfig = new DungeonConfig(); - DungeonConfig.GroupName = RoomConfig.FirstOrDefault().Key; - DungeonConfig.RoomCount = 20; + DungeonConfig.GroupName = "Test1"; + DungeonConfig.RandomSeed = null; + DungeonConfig.BattleRoomCount = 15; + // DungeonConfig.BossRoomCount = 0; + // DungeonConfig.RewardRoomCount = 0; + // DungeonConfig.ShopRoomCount = 0; + // DungeonConfig.OutRoomCount = 0; + // DungeonConfig.RoomHorizontalMinDispersion = -1; + // DungeonConfig.RoomHorizontalMaxDispersion = 1; + // DungeonConfig.RoomVerticalMinDispersion = -1; + // DungeonConfig.RoomVerticalMaxDispersion = 1; + // DungeonConfig.EnableLimitRange = false; } - + public override void _EnterTree() { + SubViewport = GetNode("ViewCanvas/SubViewportContainer/SubViewport"); + SubViewportContainer = GetNode("ViewCanvas/SubViewportContainer"); + SceneRoot = GetNode("ViewCanvas/SubViewportContainer/SubViewport/SceneRoot"); + GlobalNodeRoot = GetNode("GlobalNodeRoot"); + //背景颜色 RenderingServer.SetDefaultClearColor(new Color(0, 0, 0, 1)); //随机化种子 //GD.Randomize(); //固定帧率 - Engine.MaxFps = TargetFps; + //Engine.MaxFps = TargetFps; //调试绘制开关 ActivityObject.IsDebug = false; //Engine.TimeScale = 0.2f; @@ -130,6 +151,7 @@ SceneRoot.AddChild(DungeonManager); MapProjectManager.Init(); + EditorTileSetManager.Init(); BottomTipsPanel.Init(); //打开主菜单Ui UiManager.Open_Main(); @@ -141,44 +163,10 @@ var newDelta = (float)delta; InputManager.Update(newDelta); SoundManager.Update(newDelta); - DragUiManager.Update(newDelta); //协程更新 ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta); } - - /// - /// 创建新的 World 对象, 相当于清理房间 - /// - public World CreateNewWorld() - { - if (World != null) - { - ClearWorld(); - World.QueueFree(); - } - World = ResourceManager.LoadAndInstantiate(ResourcePath.scene_World_tscn); - SceneRoot.AddChild(World); - return World; - } - - /// - /// 销毁 World 对象, 相当于清理房间 - /// - public void DestroyWorld() - { - //销毁所有物体 - if (World != null) - { - ClearWorld(); - World.QueueFree(); - } - - //销毁池中所有物体 - ObjectPool.DisposeAllItem(); - - World = null; - } /// /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标 @@ -260,6 +248,20 @@ } } + //初始化TileSet配置 + private void InitTileSetConfig() + { + //加载房间配置信息 + var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile); + TileSetConfig = JsonSerializer.Deserialize>(asText); + + //加载所有数据 + foreach (var tileSetSplit in TileSetConfig) + { + tileSetSplit.Value.ReloadTileSetInfo(); + } + } + //窗体大小改变 private void OnWindowSizeChanged() { @@ -290,27 +292,4 @@ AddChild(cursorLayer); cursorLayer.AddChild(Cursor); } - - //清理世界 - private void ClearWorld() - { - var childCount = World.NormalLayer.GetChildCount(); - for (var i = 0; i < childCount; i++) - { - var c = World.NormalLayer.GetChild(i); - if (c is IDestroy destroy) - { - destroy.Destroy(); - } - } - childCount = World.YSortLayer.GetChildCount(); - for (var i = 0; i < childCount; i++) - { - var c = World.YSortLayer.GetChild(i); - if (c is IDestroy destroy) - { - destroy.Destroy(); - } - } - } } diff --git a/DungeonShooting_Godot/src/game/GameConfig.cs b/DungeonShooting_Godot/src/game/GameConfig.cs index c116698..1874314 100644 --- a/DungeonShooting_Godot/src/game/GameConfig.cs +++ b/DungeonShooting_Godot/src/game/GameConfig.cs @@ -39,10 +39,18 @@ /// public const string RoomTileDir = "resource/map/tileMaps/"; /// + /// 房间TileSet路径 + /// + public const string RoomTileSetDir = "resource/map/tileSet/"; + /// /// 房间组配置文件名称 /// public const string RoomGroupConfigFile = "GroupConfig.json"; /// + /// TileSet配置文件 + /// + public const string TileSetConfigFile = "TileSetConfig.json"; + /// /// ui预制体路径 /// public const string UiPrefabDir = "prefab/ui/"; @@ -50,23 +58,6 @@ /// ui代码根路径 /// public const string UiCodeDir = "src/game/ui/"; - - /// - /// TileMap 地板的层级 - /// - public const int FloorMapLayer = 0; - /// - /// TileMap 中层的层级 - /// - public const int MiddleMapLayer = 1; - /// - /// TileMap 上层的层级 - /// - public const int TopMapLayer = 2; - /// - /// 连接房间的过道的地板层级 - /// - public const int AisleFloorMapLayer = 3; /// /// 配置层级的自定义数据名称 @@ -87,4 +78,31 @@ /// 迷雾过渡时间 /// public const float FogTransitionTime = 0.3f; + + /// + /// 导航网格代理收缩半径 + /// + public const float NavigationAgentRadius = 6f; + + /// + /// 寻路导航单格步长 + /// + public const float NavigationCellSize = 4; + + /// + /// 地形掩码纹理大小, 顶部墙壁/47格地形 + /// + public static readonly Vector2I TerrainBit3x3 = new Vector2I(12, 4); + /// + /// 地形掩码纹理大小, 13格地形 + /// + public static readonly Vector2I TerrainBit2x2 = new Vector2I(5, 3); + /// + /// 地形掩码纹理大小, 侧方墙壁 + /// + public static readonly Vector2I TerrainBitMiddle = new Vector2I(4, 2); + /// + /// 地形掩码纹理大小, 地板 + /// + public static readonly Vector2I TerrainBitFloor = new Vector2I(1, 1); } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/PhysicsLayer.cs b/DungeonShooting_Godot/src/game/PhysicsLayer.cs deleted file mode 100644 index f181de2..0000000 --- a/DungeonShooting_Godot/src/game/PhysicsLayer.cs +++ /dev/null @@ -1,46 +0,0 @@ -/// -/// 物理碰撞层 -/// -public class PhysicsLayer -{ - /// - /// 无任何层级 - /// - public const uint None = 0; - /// - /// 墙壁 - /// - public const uint Wall = 0b1; - /// - /// 子弹 - /// - public const uint Bullet = 0b10; - /// - /// 道具 - /// - public const uint Prop = 0b100; - /// - /// 玩家 - /// - public const uint Player = 0b1000; - /// - /// 敌人 - /// - public const uint Enemy = 0b10000; - /// - /// 归属区域判断层级 - /// - public const uint Affiliation = 0b100000; - /// - /// 在手上 - /// - public const uint OnHand = 0b1000000; - /// - /// 各种碎屑,包括弹壳,敌人死亡碎片,爆炸碎片等 - /// - public const uint Debris = 0b10000000; - /// - /// 投抛中 - /// - public const uint Throwing = 0b100000000; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ShaderParamNames.cs b/DungeonShooting_Godot/src/game/ShaderParamNames.cs deleted file mode 100644 index e09a4c7..0000000 --- a/DungeonShooting_Godot/src/game/ShaderParamNames.cs +++ /dev/null @@ -1,32 +0,0 @@ - -using Godot; - -/// -/// Shader 中的参数名称 -/// -public static class ShaderParamNames -{ - /// - /// 灰度 - /// - public static readonly StringName Grey = "grey"; - /// - /// 轮廓颜色 - /// - public static readonly StringName OutlineColor = "outline_color"; - /// - /// 是否显示轮廓 - /// - public static readonly StringName ShowOutline = "show_outline"; - - /// - /// 快速设置一个材质的 shader 材质参数 - /// - public static void SetShaderMaterialParameter(this Material material, StringName param, Variant value) - { - if (material is ShaderMaterial shaderMaterial) - { - shaderMaterial.SetShaderParameter(param, value); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/SignNames.cs b/DungeonShooting_Godot/src/game/SignNames.cs deleted file mode 100644 index 1e5cf00..0000000 --- a/DungeonShooting_Godot/src/game/SignNames.cs +++ /dev/null @@ -1,11 +0,0 @@ - -/// -/// 标记名称 -/// -public class SignNames -{ - /// - /// Ai 对武器的标记名称, 一旦有该标记, Ai AiFindAmmoState 状态下寻找可用武器将忽略该武器 - /// - public const string AiFindWeaponSign = "AiFindWeaponSign"; -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/World.cs b/DungeonShooting_Godot/src/game/World.cs new file mode 100644 index 0000000..421110e --- /dev/null +++ b/DungeonShooting_Godot/src/game/World.cs @@ -0,0 +1,169 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Godot; + +/// +/// 游戏世界 +/// +public partial class World : CanvasModulate, ICoroutine +{ + /// + /// 当前的游戏世界对象 + /// + public static World Current => GameApplication.Instance?.DungeonManager?.CurrWorld; + + /// + /// //对象根节点 + /// + public Node2D NormalLayer; + + /// + /// 对象根节点, 带y轴排序功能 + /// + public Node2D YSortLayer; + + /// + /// 地图根节点 + /// + public TileMap TileRoot; + + public Node2D StaticSpriteRoot; + public Node2D AffiliationAreaRoot; + public Node2D FogMaskRoot; + public Node2D NavigationRoot; + + /// + /// 是否暂停 + /// + public bool Pause + { + get => _pause; + set + { + if (_pause != value) + { + _pause = value; + if (value) + { + ProcessMode = ProcessModeEnum.WhenPaused; + } + else + { + ProcessMode = ProcessModeEnum.Inherit; + } + } + } + } + + /// + /// 所有被扔在地上的武器 + /// + public HashSet Weapon_UnclaimedWeapons { get; } = new HashSet(); + + /// + /// 记录所有存活的敌人 + /// + public List Enemy_InstanceList { get; } = new List(); + + /// + /// 随机数对象 + /// + public SeedRandom Random { get; private set; } + + /// + /// 随机对象池 + /// + public RandomPool RandomPool { get; private set; } + + private bool _pause = false; + private List _coroutineList; + + public override void _Ready() + { + //TileRoot.YSortEnabled = false; + NormalLayer = GetNode("TileRoot/NormalLayer"); + YSortLayer = GetNode("TileRoot/YSortLayer"); + TileRoot = GetNode("TileRoot"); + StaticSpriteRoot = GetNode("TileRoot/StaticSpriteRoot"); + FogMaskRoot = GetNode("TileRoot/FogMaskRoot"); + NavigationRoot = GetNode("TileRoot/NavigationRoot"); + AffiliationAreaRoot = GetNode("TileRoot/AffiliationAreaRoot"); + } + + public override void _Process(double delta) + { + //协程更新 + ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, (float)delta); + } + + /// + /// 获取指定层级根节点 + /// + public Node2D GetRoomLayer(RoomLayerEnum layerEnum) + { + switch (layerEnum) + { + case RoomLayerEnum.NormalLayer: + return NormalLayer; + case RoomLayerEnum.YSortLayer: + return YSortLayer; + } + + return null; + } + + /// + /// 通知其他敌人发现目标了 + /// + /// 发送通知的角色 + /// 目标 + public void NotifyEnemyTarget(Role self, ActivityObject target) + { + foreach (var role in Enemy_InstanceList) + { + if (role != self && !role.IsDestroyed && role.AffiliationArea == self.AffiliationArea) + { + //将未发现目标的敌人状态置为惊讶状态 + var controller = role.StateController; + //延时通知效果 + role.CallDelay(Utils.Random.RandomRangeFloat(0.2f, 1f), () => + { + if (controller.CurrState == AIStateEnum.AiNormal) + { + controller.ChangeState(AIStateEnum.AiLeaveFor, target); + } + }); + } + } + } + + public long StartCoroutine(IEnumerator able) + { + return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able); + } + + public void StopCoroutine(long coroutineId) + { + ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId); + } + + public bool IsCoroutineOver(long coroutineId) + { + return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId); + } + + public void StopAllCoroutine() + { + ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList); + } + + /// + /// 初始化随机池 + /// + public void InitRandomPool(SeedRandom random) + { + Random = random; + RandomPool = new RandomPool(this); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/box/TreasureBox.cs b/DungeonShooting_Godot/src/game/activity/box/TreasureBox.cs new file mode 100644 index 0000000..ff8883c --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/box/TreasureBox.cs @@ -0,0 +1,42 @@ +using Godot; + +/// +/// 宝箱 +/// +[Tool] +public partial class TreasureBox : ActivityObject, IHurt +{ + public bool IsOpen { get; private set; } + + public override void OnInit() + { + AnimatedSprite.AnimationFinished += OnAnimationFinished; + } + + public override CheckInteractiveResult CheckInteractive(ActivityObject master) + { + return new CheckInteractiveResult(this, !IsOpen, CheckInteractiveResult.InteractiveType.OpenTreasureBox); + } + + public override void Interactive(ActivityObject master) + { + if (IsOpen) + { + return; + } + + IsOpen = true; + AnimatedSprite.Play(AnimatorNames.Open); + } + + private void OnAnimationFinished() + { + var weapon = Create(World.RandomPool.GetRandomProp()); + weapon.Throw(Position, 2, 95, new Vector2(0, 11), 0); + } + + public void Hurt(ActivityObject target, int damage, float angle) + { + PlayHitAnimation(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs b/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs index 637b9b3..17edff3 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs @@ -70,6 +70,7 @@ CollisionShape = GetNode("CollisionShape2D"); CircleShape = (CircleShape2D)CollisionShape.Shape; AnimationPlayer.AnimationFinished += OnAnimationFinish; + AreaEntered += OnArea2dEntered; BodyEntered += OnBodyEntered; } @@ -133,34 +134,45 @@ private void OnBodyEntered(Node2D node) { - var o = node.AsActivityObject(); - if (o != null) + if (node is IHurt hurt) { - var temp = o.Position - Position; - var len = temp.Length(); - var angle = temp.Angle(); - - if (len <= _hitRadius) //在伤害半径内 + HandlerCollision(hurt); + } + else if (node is Bullet bullet) //是子弹 + { + if (bullet is BoomBullet boomBullet) //如果是爆炸子弹, 则直接销毁 { - if (o is Role role) //是角色 - { - role.CallDeferred(nameof(role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, _harm, angle); - } - else if (o is Bullet bullet) //是子弹 - { - if (bullet is BoomBullet boomBullet) //如果是爆炸子弹, 则直接销毁 - { - boomBullet.PlayBoom(); - } - bullet.Destroy(); - return; - } + boomBullet.PlayBoom(); } - - if (len <= _repelledRadius) //击退半径内 + bullet.Destroy(); + } + } + + private void OnArea2dEntered(Area2D other) + { + if (other is IHurt hurt) + { + HandlerCollision(hurt); + } + } + + private void HandlerCollision(IHurt hurt) + { + var temp = hurt.GetPosition() - Position; + var len = temp.Length(); + var angle = temp.Angle(); + + if (len <= _hitRadius) //在伤害半径内 + { + hurt.Hurt(BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, _harm, angle); + } + + if (len <= _repelledRadius) //击退半径内 + { + var o = hurt.GetActivityObject(); + if (o != null) { var repelled = (_repelledRadius - len) / _repelledRadius * _maxRepelled; - //o.MoveController.SetAllVelocity(Vector2.Zero); o.AddRepelForce(Vector2.FromAngle(angle) * repelled); } } diff --git a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs index 785f4a8..abd503c 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs @@ -37,6 +37,7 @@ } public BulletData BulletData { get; private set; } + public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal; public bool IsDestroyed { get; private set; } @@ -45,7 +46,6 @@ //开启的协程 private List _coroutineList; private float _pixelScale; - private float _speed = 2000; private Tween _tween; private bool _init = false; @@ -53,7 +53,7 @@ { InitData(data, attackLayer, LaserDefaultWidth); } - + public void InitData(BulletData data, uint attackLayer, float width) { if (!_init) @@ -65,10 +65,12 @@ _pixelScale = 1f / LineSprite.Texture.GetHeight(); AreaEntered += OnArea2dEntered; + BodyEntered += OnBodyEntered; _init = true; } - + + ZIndex = 1; BulletData = data; AttackLayer = attackLayer; @@ -77,7 +79,7 @@ //计算射线最大距离, 也就是撞到墙壁的距离 var targetPosition = data.Position + Vector2.FromAngle(data.Rotation) * data.MaxDistance; - var parameters = PhysicsRayQueryParameters2D.Create(data.Position, targetPosition, PhysicsLayer.Wall); + var parameters = PhysicsRayQueryParameters2D.Create(data.Position + new Vector2(0, data.Altitude), targetPosition + new Vector2(0, data.Altitude), PhysicsLayer.Wall); var result = GetWorld2D().DirectSpaceState.IntersectRay(parameters); float distance; var doRebound = false; //是否需要执行反弹 @@ -86,7 +88,7 @@ if (result != null && result.TryGetValue("position", out var point)) //撞到墙壁 { doRebound = true; - reboundPosition = (Vector2)point; + reboundPosition = (Vector2)point - new Vector2(0, data.Altitude); reboundNormal = (Vector2)result["normal"]; distance = Position.DistanceTo(reboundPosition.Value); } @@ -111,7 +113,7 @@ } //激光飞行时间 - var time = distance / _speed; + var time = distance / data.FlySpeed; _tween = CreateTween(); _tween.SetParallel(); @@ -136,8 +138,9 @@ _tween.Chain(); _tween.TweenCallback(Callable.From(() => { + State = BulletStateEnum.MaxDistance; _tween = null; - DoReclaim(); + LogicalFinish(); })); _tween.Play(); @@ -192,22 +195,38 @@ } } } + + private void OnBodyEntered(Node2D body) + { + if (body is IHurt hurt) + { + HandlerCollision(hurt); + } + } private void OnArea2dEntered(Area2D other) { - var role = other.AsActivityObject(); - if (role != null) + if (other is IHurt hurt) { - //击退 - if (BulletData.Repel != 0) - { - role.AddRepelForce(Vector2.FromAngle(Rotation) * BulletData.Repel); - } - //造成伤害 - role.CallDeferred(nameof(Role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); + HandlerCollision(hurt); } } + private void HandlerCollision(IHurt hurt) + { + if (BulletData.Repel != 0) + { + var o = hurt.GetActivityObject(); + if (o != null && o is not Player) //目标不是玩家才会触发击退 + { + o.AddRepelForce(Vector2.FromAngle(Rotation) * BulletData.Repel); + } + } + + //造成伤害 + hurt.Hurt(BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); + } + public long StartCoroutine(IEnumerator able) { return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able); @@ -228,13 +247,14 @@ ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList); } - public void DoReclaim() + public void LogicalFinish() { ObjectPool.Reclaim(this); } public virtual void OnReclaim() { + State = BulletStateEnum.Normal; if (Particles2D != null) { foreach (var particles2D in Particles2D) diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs new file mode 100644 index 0000000..3f1ad52 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs @@ -0,0 +1,160 @@ + +using Godot; + +/// +/// 弓箭 +/// +[Tool] +public partial class Arrow : Bullet, IMountItem +{ + [Export, ExportFillNode] + public AnimatedSprite2D HalfSprite { get; set; } + + public override void InitData(BulletData data, uint attackLayer) + { + base.InitData(data, attackLayer); + SetEnableMovement(true); + EnableVerticalMotion = false; + DefaultLayer = RoomLayerEnum.NormalLayer; + } + + public override CheckInteractiveResult CheckInteractive(ActivityObject master) + { + if (master is Role role) //如果角色有弓箭武器, 则可以拾起地上的箭 + { + var index = role.WeaponPack.FindIndex((weapon, index) => + { + return weapon.ActivityBase.Id == Ids.Id_weapon0016; + }); + if (index >= 0) + { + var weapon = role.WeaponPack.GetItem(index); + weapon.SetResidueAmmo(weapon.ResidueAmmo + 1); + ObjectPool.Reclaim(this); + } + } + return base.CheckInteractive(master); + } + + public override void OnPlayDisappearEffect() + { + } + + protected override void OnArea2dEntered(Area2D other) + { + if (Velocity.Length() >= BulletData.FlySpeed / 2f) + { + base.OnArea2dEntered(other); + } + } + + protected override void OnBodyEntered(Node2D body) + { + if (Velocity.Length() >= BulletData.FlySpeed / 2f) + { + base.OnBodyEntered(body); + } + } + + public override void OnCollisionTarget(IHurt hurt) + { + base.OnCollisionTarget(hurt); + if (CurrentPenetration > BulletData.Penetration) + { + var activityObject = hurt.GetActivityObject(); + if (activityObject != null) + { + CallDeferred(nameof(OnBindTarget), activityObject); + } + } + } + + public override void OnMoveCollision(KinematicCollision2D collision) + { + if (Velocity.Length() >= BulletData.FlySpeed / 2f) + { + base.OnMoveCollision(collision); + } + } + + protected override void OnThrowOver() + { + SetOriginCollisionLayerValue(PhysicsLayer.Prop, true); + if (!Utils.CollisionMaskWithLayer(CollisionLayer, PhysicsLayer.Prop)) + { + CollisionLayer |= PhysicsLayer.Prop; + } + } + + public override void LogicalFinish() + { + if (State == BulletStateEnum.CollisionTarget) //碰撞到目标, 直接冻结 + { + SetEnableMovement(false); + var slideCollision = GetLastSlideCollision(); + if (slideCollision != null) + { + Position -= slideCollision.GetTravel(); + } + } + else if (State == BulletStateEnum.MaxDistance) //到达最大动力距离, 则开始下坠 + { + EnableVerticalMotion = true; + } + else if (State == BulletStateEnum.FallToGround) //落地, 啥也不干 + { + + } + else + { + //Debug.Log("碰撞速度: " + Velocity.Length()); + base.LogicalFinish(); + } + } + + //将弓箭挂载到目标物体上 + private void OnBindTarget(ActivityObject activityObject) + { + if (activityObject.IsDestroyed) //目标已经销毁 + { + OnUnmount(activityObject); + } + else + { + Altitude = Mathf.Max(1, -activityObject.ToLocal(GlobalPosition).Y); + activityObject.AddMountObject(this); + } + } + + public void OnMount(ActivityObject target) + { + Reparent(target); + AnimatedSprite.Play(AnimatorNames.HalfEnd); + HalfSprite.Visible = true; + RefreshBulletColor(false); + EnableVerticalMotion = false; + } + + public void OnUnmount(ActivityObject target) + { + AnimatedSprite.Play(AnimatorNames.Default); + HalfSprite.Visible = false; + SetEnableMovement(true); + EnableVerticalMotion = true; + MoveController.ClearForce(); + MoveController.BasisVelocity = Vector2.Zero; + ShadowOffset = new Vector2(0, 1); + Throw(Mathf.Max(3, Altitude), Utils.Random.RandomRangeInt(50, 80), Vector2.Zero, Utils.Random.RandomRangeInt(-30, 30)); + InheritVelocity(target); + } + + public override void OnLeavePool() + { + SetOriginCollisionLayerValue(PhysicsLayer.Prop, false); + if (Utils.CollisionMaskWithLayer(CollisionLayer, PhysicsLayer.Prop)) + { + CollisionLayer ^= PhysicsLayer.Prop; + } + base.OnLeavePool(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs index 1a763f3..79174e7 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs @@ -10,19 +10,20 @@ public override void OnLimeOver() { PlayBoom(); - DoReclaim(); + LogicalFinish(); } public override void OnMaxDistance() { PlayBoom(); - DoReclaim(); + LogicalFinish(); } - public override void OnCollisionTarget(ActivityObject o) + public override void OnCollisionTarget(IHurt o) { + State = BulletStateEnum.CollisionTarget; PlayBoom(); - DoReclaim(); + LogicalFinish(); } public override void OnMoveCollision(KinematicCollision2D lastSlideCollision) @@ -30,8 +31,9 @@ CurrentBounce++; if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { + State = BulletStateEnum.MoveCollision; PlayBoom(); - DoReclaim(); + LogicalFinish(); } else { @@ -53,7 +55,7 @@ public void PlayBoom() { var explode = ObjectManager.GetPoolItem(ResourcePath.prefab_bullet_explode_Explode0001_tscn); - var pos = Position; + var pos = CollisionArea.GlobalPosition; explode.Position = pos; explode.RotationDegrees = Utils.Random.RandomRangeInt(0, 360); explode.AddToActivityRootDeferred(RoomLayerEnum.YSortLayer); diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs index bf0a0dc..02be8c1 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs @@ -42,6 +42,9 @@ set => CollisionArea.CollisionMask = value; } + /// + /// 子弹使用的数据 + /// public BulletData BulletData { get; private set; } /// @@ -54,11 +57,20 @@ /// public int CurrentPenetration { get; protected set; } = 0; + /// + /// 是否是敌人使用的子弹 + /// + public bool IsEnemyBullet { get; private set; } = false; + + /// + /// 子弹状态 + /// + public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal; + //当前子弹已经飞行的距离 private float CurrFlyDistance = 0; private bool _init = false; - private bool _isEnemyBullet = false; public override void OnInit() { @@ -72,6 +84,7 @@ if (!_init) { CollisionArea.AreaEntered += OnArea2dEntered; + CollisionArea.BodyEntered += OnBodyEntered; _init = true; } @@ -107,20 +120,16 @@ MoveController.AddForce(new Vector2(data.FlySpeed, 0).Rotated(Rotation)); //如果子弹会对玩家造成伤害, 则显示红色描边 - if (Player.Current.CollisionWithMask(attackLayer)) + if (Player.Current != null && Player.Current.CollisionWithMask(attackLayer)) { - if (!_isEnemyBullet) + if (!IsEnemyBullet) { - _isEnemyBullet = true; - ShowOutline = true; - SetBlendSchedule(1); + RefreshBulletColor(true); } } - else if (_isEnemyBullet) + else if (IsEnemyBullet) { - _isEnemyBullet = false; - ShowOutline = false; - SetBlendSchedule(0); + RefreshBulletColor(false); } PutDown(RoomLayerEnum.YSortLayer); @@ -132,7 +141,11 @@ //过期销毁 if (data.LifeTime > 0) { - this.CallDelay(data.LifeTime, OnLimeOver); + this.CallDelay(data.LifeTime, () => + { + State = BulletStateEnum.LimeOver; + OnLimeOver(); + }); } if (Particles2D != null) @@ -144,44 +157,61 @@ } } + /// + /// 刷新子弹的颜色 + /// + /// 是否是敌人使用的子弹 + public virtual void RefreshBulletColor(bool isEnemyBullet) + { + IsEnemyBullet = isEnemyBullet; + if (isEnemyBullet) + { + ShowOutline = true; + SetBlendSchedule(1); + } + else + { + ShowOutline = false; + SetBlendSchedule(0); + } + } + public override void OnMoveCollision(KinematicCollision2D collision) { CurrentBounce++; if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { + State = BulletStateEnum.MoveCollision; //创建粒子特效 OnPlayCollisionEffect(collision); - DoReclaim(); + LogicalFinish(); } } /// /// 碰到目标 /// - public virtual void OnCollisionTarget(ActivityObject o) + public virtual void OnCollisionTarget(IHurt hurt) { - if (o is Role role) + OnPlayDisappearEffect(); + if (BulletData.Repel != 0) { - OnPlayDisappearEffect(); - - //击退 - if (role is not Player) //目标不是玩家才会触发击退 + var o = hurt.GetActivityObject(); + if (o != null && o is not Player) //目标不是玩家才会触发击退 { - if (BulletData.Repel != 0) - { - role.AddRepelForce(Velocity.Normalized() * BulletData.Repel); - } + o.AddRepelForce(Velocity.Normalized() * BulletData.Repel); } - - //造成伤害 - role.CallDeferred(nameof(Role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); + } - //穿透次数 - CurrentPenetration++; - if (CurrentPenetration > BulletData.Penetration) - { - DoReclaim(); - } + //造成伤害 + hurt.Hurt(BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); + + //穿透次数 + CurrentPenetration++; + if (CurrentPenetration > BulletData.Penetration) + { + State = BulletStateEnum.CollisionTarget; + CallDeferred(nameof(LogicalFinish)); } } @@ -191,7 +221,7 @@ public virtual void OnMaxDistance() { OnPlayDisappearEffect(); - DoReclaim(); + LogicalFinish(); } /// @@ -200,14 +230,15 @@ public virtual void OnLimeOver() { OnPlayDisappearEffect(); - DoReclaim(); + LogicalFinish(); } protected override void OnFallToGround() { + State = BulletStateEnum.FallToGround; //落地销毁 OnPlayDisappearEffect(); - DoReclaim(); + LogicalFinish(); } /// @@ -259,7 +290,7 @@ /// - /// 播放子弹消失特效 + /// 播放子弹撞墙消失特效 /// public void PlayCollisionEffect(KinematicCollision2D collision, string path) { @@ -276,34 +307,56 @@ { if (ActivityMaterial.DynamicCollision) { - //子弹高度大于 16 关闭碰撞检测 - CollisionShape2D.Disabled = Altitude >= 16; + //子弹高度大于 32 关闭碰撞检测 + CollisionShape2D.Disabled = Altitude >= 32; } //距离太大, 自动销毁 - CurrFlyDistance += BulletData.FlySpeed * delta; - if (CurrFlyDistance >= BulletData.MaxDistance) + if (MoveController.Enable) { - OnMaxDistance(); + //CurrFlyDistance += Velocity.Length() * delta; + CurrFlyDistance += BulletData.FlySpeed * delta; + if (CurrFlyDistance >= BulletData.MaxDistance) + { + State = BulletStateEnum.MaxDistance; + OnMaxDistance(); + } } } - - private void OnArea2dEntered(Area2D other) + + protected virtual void OnBodyEntered(Node2D body) { if (IsDestroyed) { return; } - var activityObject = other.AsActivityObject(); - OnCollisionTarget(activityObject); + + if (body is IHurt hurt) + { + OnCollisionTarget(hurt); + } } - public virtual void DoReclaim() + protected virtual void OnArea2dEntered(Area2D other) + { + if (IsDestroyed) + { + return; + } + + if (other is IHurt hurt) + { + OnCollisionTarget(hurt); + } + } + + public virtual void LogicalFinish() { ObjectPool.Reclaim(this); } public virtual void OnReclaim() { + State = BulletStateEnum.Normal; Visible = false; if (Particles2D != null) { @@ -333,4 +386,15 @@ OnLeavePoolEvent(); } } + + /// + /// 设置是否启用移动逻辑 + /// + public void SetEnableMovement(bool v) + { + MoveController.Enable = v; + CollisionArea.Monitoring = v; + CollisionArea.Monitorable = v; + Collision.Disabled = !v; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs new file mode 100644 index 0000000..7b21719 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs @@ -0,0 +1,31 @@ + +/// +/// 子弹逻辑完成条件 +/// +public enum BulletStateEnum +{ + /// + /// 正常飞行状态 + /// + Normal, + /// + /// 移动并撞到物体 + /// + MoveCollision, + /// + /// 飞行到最大距离 + /// + MaxDistance, + /// + /// 子弹生命周期结束 + /// + LimeOver, + /// + /// 落地 + /// + FallToGround, + /// + /// 碰撞到攻击目标物体 + /// + CollisionTarget, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/ColorBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/ColorBullet.cs new file mode 100644 index 0000000..142ec28 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/ColorBullet.cs @@ -0,0 +1,31 @@ + +using Godot; + +/// +/// 随机颜色子弹 +/// +[Tool] +public partial class ColorBullet : Bullet +{ + public override void OnInit() + { + base.OnInit(); + SetRandomColor(); + } + + public override void OnLeavePool() + { + base.OnLeavePool(); + SetRandomColor(); + } + + private void SetRandomColor() + { + //随机颜色 + var color = new Color(Utils.Random.RandomRangeFloat(0, 1), Utils.Random.RandomRangeFloat(0, 1), Utils.Random.RandomRangeFloat(0, 1)); + color.R += 0.6f; + color.G += 0.6f; + color.B += 0.6f; + Modulate = color; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs index 9611387..a642541 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs @@ -21,12 +21,18 @@ /// 子弹数据 /// BulletData BulletData { get; } + + /// + /// 子弹状态 + /// + BulletStateEnum State { get; } + /// /// 初始化子弹数据 /// void InitData(BulletData data, uint attackLayer); /// - /// 执行子弹回收操作 + /// 子弹运行逻辑执行完成 /// - void DoReclaim(); + void LogicalFinish(); } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/TrailBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/TrailBullet.cs new file mode 100644 index 0000000..67f6da9 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/TrailBullet.cs @@ -0,0 +1,38 @@ + +using Godot; + +[Tool] +public partial class TrailBullet : Bullet +{ + private static Color TerrainColor = new Color(0xf5 / 255f + 0.8f, 0x7e / 255f + 0.45f, 0x7a / 255f + 0.45f, 0.7f); + private static Color EnemyTerrainColor = new Color(1.5f, 0, 0, 0.7f); + private Trail trail; + + public override void InitData(BulletData data, uint attackLayer) + { + base.InitData(data, attackLayer); + + trail = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_common_Trail0001_tscn); + trail.SetTarget(AnimatedSprite); + trail.AddPoint(trail.Target.GlobalPosition); + trail.AddToActivityRoot(RoomLayerEnum.YSortLayer); + trail.ZIndex = 1; + + if (IsEnemyBullet) + { + trail.SetColor(EnemyTerrainColor); + } + else + { + trail.SetColor(TerrainColor); + } + } + + + public override void OnReclaim() + { + base.OnReclaim(); + trail.SetTarget(null); + trail = null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/currency/Gold.cs b/DungeonShooting_Godot/src/game/activity/currency/Gold.cs new file mode 100644 index 0000000..b991fb6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/currency/Gold.cs @@ -0,0 +1,73 @@ + +using Godot; + +/// +/// 金币类 +/// +[Tool] +public partial class Gold : ActivityObject, IPoolItem +{ + /// + /// 金币数量 + /// + [Export] + public int GoldCount { get; set; } = 1; + + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + + private float _maxSpeed = 250; + private float _speed = 0; + private Role _moveTarget; + + public override void OnInit() + { + DefaultLayer = RoomLayerEnum.YSortLayer; + } + + protected override void OnThrowOver() + { + var current = Player.Current; + if (current != null) + { + this.CallDelay(0.3f, () => + { + _moveTarget = current; + MoveController.Enable = false; + }); + } + } + + protected override void Process(float delta) + { + if (_moveTarget != null && !_moveTarget.IsDestroyed) + { + var position = Position; + var targetPosition = _moveTarget.Position; + if (position.DistanceSquaredTo(targetPosition) < 3 * 3) + { + _moveTarget.AddGold(GoldCount); + ObjectPool.Reclaim(this); + } + else + { + _speed = Mathf.MoveToward(_speed, _maxSpeed, _maxSpeed * delta); + Position = position.MoveToward(targetPosition, _speed * delta); + } + } + } + + public void OnReclaim() + { + GetParent().RemoveChild(this); + _moveTarget = null; + } + + public void OnLeavePool() + { + _speed = 0; + MoveController.Enable = true; + MoveController.ClearForce(); + MoveController.SetAllVelocity(Vector2.Zero); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/Prop.cs b/DungeonShooting_Godot/src/game/activity/prop/Prop.cs index c79dfc0..90fb6e7 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/Prop.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/Prop.cs @@ -21,6 +21,11 @@ /// public abstract void OnRemoveItem(); + public override void OnInit() + { + ThrowCollisionMask = PhysicsLayer.Wall; + } + /// /// 如果道具放入了角色背包中, 则每帧调用 /// diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5000.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5000.cs index 2770ac7..bdc2ce4 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5000.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5000.cs @@ -9,6 +9,7 @@ { public override void OnInit() { + base.OnInit(); AutoDestroy = true; MaxCount = 10; Superposition = true; diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs index 2bac5e6..43770cb 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs @@ -9,6 +9,7 @@ { public override void OnInit() { + base.OnInit(); Superposition = true; AutoDestroy = true; MaxCount = 10; diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index 2facc09..7ca7b05 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -1,6 +1,7 @@  using System.Collections; using System.Collections.Generic; +using Config; using Godot; /// @@ -21,13 +22,13 @@ /// /// 默认攻击对象层级 /// - public const uint DefaultAttackLayer = PhysicsLayer.Player | PhysicsLayer.Enemy | PhysicsLayer.Wall; + public const uint DefaultAttackLayer = PhysicsLayer.Player | PhysicsLayer.Enemy | PhysicsLayer.Obstacle; /// /// 伤害区域 /// [Export, ExportFillNode] - public Area2D HurtArea { get; set; } + public HurtArea HurtArea { get; set; } /// /// 伤害区域碰撞器 @@ -43,7 +44,7 @@ /// /// 攻击目标的碰撞器所属层级, 数据源自于: /// - public uint AttackLayer { get; set; } = PhysicsLayer.Wall; + public uint AttackLayer { get; set; } = PhysicsLayer.Wall | PhysicsLayer.Obstacle; /// /// 该角色敌对目标的碰撞器所属层级, 数据源自于: @@ -93,7 +94,7 @@ /// /// 脸的朝向 /// - public FaceDirection Face { get => _face; set => SetFace(value); } + public FaceDirection Face { get => _face; set => _SetFace(value); } private FaceDirection _face; /// @@ -273,13 +274,20 @@ { if (value) //无敌状态 { - HurtArea.CollisionLayer = _currentLayer; + if (HurtArea != null) + { + HurtArea.CollisionLayer = _currentLayer; + } + _flashingInvincibleTimer = -1; _flashingInvincibleFlag = false; } else //正常状态 { - HurtArea.CollisionLayer = _currentLayer; + if (HurtArea != null) + { + HurtArea.CollisionLayer = _currentLayer; + } SetBlendModulate(new Color(1, 1, 1, 1)); } } @@ -463,9 +471,15 @@ _startScale = Scale; + HurtArea.InitActivityObject(this); HurtArea.CollisionLayer = CollisionLayer; - HurtArea.CollisionMask = 0; + HurtArea.CollisionMask = PhysicsLayer.None; _currentLayer = HurtArea.CollisionLayer; + //CollisionLayer = PhysicsLayer.None; + HurtArea.OnHurtEvent += (target, damage, angle) => + { + CallDeferred(nameof(HurtHandler), target, damage, angle); + }; Face = FaceDirection.Right; @@ -485,6 +499,7 @@ WeaponPack.ChangeActiveItemEvent += OnChangeActiveItem; //近战区域进入物体 MeleeAttackArea.BodyEntered += OnMeleeAttackBodyEntered; + MeleeAttackArea.AreaEntered += OnMeleeAttackAreaEntered; } protected override void Process(float delta) @@ -787,14 +802,14 @@ activeItem.Use(); } } - + /// /// 受到伤害, 如果是在碰撞信号处理函数中调用该函数, 请使用 CallDeferred 来延时调用, 否则很有可能导致报错 /// /// 触发伤害的对象, 为 null 表示不存在对象或者对象已经被销毁 /// 伤害的量 /// 伤害角度(弧度制) - public virtual void Hurt(ActivityObject target, int damage, float angle) + protected virtual void HurtHandler(ActivityObject target, int damage, float angle) { //受伤闪烁, 无敌状态 if (Invincible) @@ -878,7 +893,7 @@ /// /// 设置脸的朝向 /// - private void SetFace(FaceDirection face) + private void _SetFace(FaceDirection face) { if (_face != face) { @@ -947,6 +962,10 @@ /// public bool IsEnemyWithPlayer() { + if (Player.Current == null) + { + return false; + } return CollisionWithMask(Player.Current.EnemyLayer); } @@ -1035,9 +1054,14 @@ { weapon.AffiliationArea.RemoveItem(weapon); } + + weapon.World = World; }); } + /// + /// 调整角色的朝向, 使其看向目标点 + /// public virtual void LookTargetPosition(Vector2 pos) { LookPosition = pos; @@ -1236,6 +1260,16 @@ }); } } + + /// + /// 添加金币 + /// + public virtual void AddGold(int goldCount) + { + RoleState.Gold += goldCount; + //播放音效 + SoundManager.PlaySoundByConfig(ExcelConfig.Sound_Map["gold"], Position, this); + } /// /// 切换当前使用的武器的回调 @@ -1255,6 +1289,20 @@ } } + private void OnMeleeAttackAreaEntered(Area2D area) + { + var activeWeapon = WeaponPack.ActiveItem; + if (activeWeapon == null) + { + return; + } + + if (area is IHurt hurt) + { + HandlerCollision(hurt, activeWeapon); + } + } + /// /// 近战区域碰到敌人 /// @@ -1265,38 +1313,41 @@ { return; } - var activityObject = body.AsActivityObject(); - if (activityObject != null) + + if (body is IHurt hurt) { - if (activityObject is Role role) //攻击角色 + HandlerCollision(hurt, activeWeapon); + } + else if (body is Bullet bullet) //攻击子弹 + { + var attackLayer = bullet.AttackLayer; + if (CollisionWithMask(attackLayer)) //是攻击玩家的子弹 { - var damage = Utils.Random.RandomConfigRange(activeWeapon.Attribute.MeleeAttackHarmRange); - damage = RoleState.CalcDamage(damage); - - //击退 - if (role is not Player) //目标不是玩家才会触发击退 - { - var attr = IsAi ? activeWeapon.AiUseAttribute : activeWeapon.PlayerUseAttribute; - var repel = Utils.Random.RandomConfigRange(attr.MeleeAttackRepelRange); - var position = role.GlobalPosition - MountPoint.GlobalPosition; - var v2 = position.Normalized() * repel; - role.AddRepelForce(v2); - } - - role.CallDeferred(nameof(Hurt), this, damage, (role.GetCenterPosition() - GlobalPosition).Angle()); - } - else if (activityObject is Bullet bullet) //攻击子弹 - { - var attackLayer = bullet.AttackLayer; - if (CollisionWithMask(attackLayer)) //是攻击玩家的子弹 - { - bullet.OnPlayDisappearEffect(); - bullet.Destroy(); - } + bullet.OnPlayDisappearEffect(); + bullet.Destroy(); } } } - + + private void HandlerCollision(IHurt hurt, Weapon activeWeapon) + { + var damage = Utils.Random.RandomConfigRange(activeWeapon.Attribute.MeleeAttackHarmRange); + damage = RoleState.CalcDamage(damage); + + var o = hurt.GetActivityObject(); + var pos = hurt.GetPosition(); + if (o != null && o is not Player) //不是玩家才能被击退 + { + var attr = IsAi ? activeWeapon.AiUseAttribute : activeWeapon.PlayerUseAttribute; + var repel = Utils.Random.RandomConfigRange(attr.MeleeAttackRepelRange); + var position = pos - MountPoint.GlobalPosition; + var v2 = position.Normalized() * repel; + o.AddRepelForce(v2); + } + + hurt.Hurt(this, damage, (pos - GlobalPosition).Angle()); + } + protected override void OnDestroy() { //销毁道具 diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs index 2af6bf3..f974546 100644 --- a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs @@ -7,6 +7,11 @@ public class RoleState { /// + /// 金币数量 + /// + public int Gold = 0; + + /// /// 是否可以拾起武器 /// public bool CanPickUpWeapon = false; diff --git a/DungeonShooting_Godot/src/game/activity/role/SubLine.cs b/DungeonShooting_Godot/src/game/activity/role/SubLine.cs index 5f9dd84..4839685 100644 --- a/DungeonShooting_Godot/src/game/activity/role/SubLine.cs +++ b/DungeonShooting_Godot/src/game/activity/role/SubLine.cs @@ -28,7 +28,7 @@ AddChild(_line2D); _rayCast2D = new RayCast2D(); - _rayCast2D.CollisionMask = PhysicsLayer.Wall; + _rayCast2D.CollisionMask = PhysicsLayer.Wall | PhysicsLayer.Obstacle; AddChild(_rayCast2D); Master.WeaponPack.ChangeActiveItemEvent += OnChangeWeapon; diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs index 47aa18d..33bf27b 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs @@ -1,15 +1,3 @@ -#region 基础敌人设计思路 -/* -敌人有三种状态: -状态1: 未发现玩家, 视野不可穿墙, 该状态下敌人移动比较规律, 移动速度较慢, 一旦玩家进入视野或者听到玩家枪声, 立刻切换至状态3, 该房间的敌人不能再回到状态1 -状态2: 发现有玩家, 但不知道在哪, 视野不可穿墙, 该情况下敌人移动速度明显加快, 移动不规律, 一旦玩家进入视野或者听到玩家枪声, 立刻切换至状态3 -状态3: 明确知道玩家的位置, 视野允许穿墙, 移动速度与状态2一致, 进入该状态时, 敌人之间会相互告知玩家所在位置, 并朝着玩家位置开火, - 如果有墙格挡, 则有一定概率继续开火, 一旦玩家立刻敌人视野超哥一段时间, 敌人自动切换为状态2 - -敌人状态1只存在于少数房间内, 比如特殊房间, 大部分情况下敌人应该是状态2, 或者玩家进入房间时就被敌人发现 -*/ -#endregion - using System; using System.Collections.Generic; @@ -134,7 +122,7 @@ StateController = AddComponent>(); - AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Player; + AttackLayer = PhysicsLayer.Obstacle | PhysicsLayer.Player; EnemyLayer = PhysicsLayer.Player; Camp = CampEnum.Camp2; @@ -156,6 +144,8 @@ //默认状态 StateController.ChangeStateInstant(AIStateEnum.AiNormal); + + //NavigationAgent2D.VelocityComputed += OnVelocityComputed; } protected override RoleState OnCreateRoleState() @@ -165,6 +155,8 @@ var enemyBase = GetEnemyAttribute(ActivityBase.Id).Clone(); _enemyAttribute = enemyBase; + MaxHp = enemyBase.Hp; + Hp = enemyBase.Hp; roleState.CanPickUpWeapon = enemyBase.CanPickUpWeapon; roleState.MoveSpeed = enemyBase.MoveSpeed; roleState.Acceleration = enemyBase.Acceleration; @@ -172,6 +164,9 @@ roleState.ViewRange = enemyBase.ViewRange; roleState.TailAfterViewRange = enemyBase.TailAfterViewRange; roleState.BackViewRange = enemyBase.BackViewRange; + roleState.AttackInterval = enemyBase.AttackInterval; + + roleState.Gold = Mathf.Max(0, Utils.Random.RandomConfigRange(enemyBase.Gold)); return roleState; } @@ -199,7 +194,7 @@ blood.Position = effPos - new Vector2(0, 12); blood.AddToActivityRoot(RoomLayerEnum.NormalLayer); blood.PlayEffect(); - + var realVelocity = GetRealVelocity(); //创建敌人碎片 var count = Utils.Random.RandomRangeInt(3, 6); @@ -210,6 +205,9 @@ debris.MoveController.AddForce(Velocity + realVelocity); } + //创建金币 + CreateGold(); + //派发敌人死亡信号 EventManager.EmitEvent(EventEnum.OnEnemyDie, this); Destroy(); @@ -249,6 +247,24 @@ } } + /// + /// 创建散落的金币 + /// + protected void CreateGold() + { + var goldList = Utils.GetGoldList(RoleState.Gold); + foreach (var id in goldList) + { + var o = ObjectManager.GetActivityObject(id); + o.Position = Position; + o.Throw(0, + Utils.Random.RandomRangeInt(50, 110), + new Vector2(Utils.Random.RandomRangeInt(-20, 20), Utils.Random.RandomRangeInt(-20, 20)), + 0 + ); + } + } + public override bool IsAllWeaponTotalAmmoEmpty() { if (!_enemyAttribute.CanPickUpWeapon) @@ -534,6 +550,11 @@ /// public void DoMove() { + // //计算移动 + // NavigationAgent2D.MaxSpeed = EnemyRoleState.MoveSpeed; + // var nextPos = NavigationAgent2D.GetNextPathPosition(); + // NavigationAgent2D.Velocity = (nextPos - Position - NavigationPoint.Position).Normalized() * RoleState.MoveSpeed; + AnimatedSprite.Play(AnimatorNames.Run); //计算移动 var nextPos = NavigationAgent2D.GetNextPathPosition(); @@ -569,4 +590,13 @@ StateController.Enable = false; this.CallDelay(0.7f, () => StateController.Enable = true); } + + // private void OnVelocityComputed(Vector2 velocity) + // { + // if (Mathf.Abs(velocity.X) >= 0.01f && Mathf.Abs(velocity.Y) >= 0.01f) + // { + // AnimatedSprite.Play(AnimatorNames.Run); + // BasisVelocity = velocity; + // } + // } } diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs index 174b52e..ef3618a 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs @@ -15,4 +15,9 @@ /// 背后的视野半径, 单位像素 /// public float BackViewRange = 50; + + /// + /// 攻击间隔时间, 秒 + /// + public float AttackInterval = 0; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs index db8f51d..ed3d271 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs @@ -14,6 +14,7 @@ { base.OnInit(); NoWeaponAttack = true; + WeaponPack.SetCapacity(0); AnimationPlayer.AnimationFinished += OnAnimationFinished; _brushData = LiquidBrushManager.GetBrush("0002"); @@ -41,7 +42,7 @@ public virtual void OnAttack() { //攻击特效 - var effect = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_weapon_ShotFire3_tscn); + var effect = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_weapon_ShotFire0003_tscn); var node = (Node2D)effect; node.GlobalPosition = FirePoint.GlobalPosition; node.Rotation = MountPoint.Rotation; @@ -66,9 +67,12 @@ var debris = Create(Ids.Id_enemy_dead0002); debris.PutDown(effPos, RoomLayerEnum.NormalLayer); debris.MoveController.AddForce(Velocity + realVelocity); - debris.SetFace(Face); + debris.SetForwardDirection(Face); debris.BrushPrevPosition = BrushPrevPosition; + //创建金币 + CreateGold(); + //派发敌人死亡信号 EventManager.EmitEvent(EventEnum.OnEnemyDie, this); Destroy(); @@ -78,7 +82,7 @@ { if (name == AnimatorNames.Attack) { - AttackTimer = 3f; + AttackTimer = EnemyRoleState.AttackInterval; } } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAttackState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAttackState.cs index 6b70f5e..ca847b3 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAttackState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAttackState.cs @@ -51,7 +51,7 @@ if (weapon != null) { _hasWeapon = true; - if (!weapon.TriggerIsReady()) + if (Master.IsAttack || !weapon.TriggerIsReady()) { throw new Exception("进入 AIAdvancedStateEnum.AiAttack 状态时角色武器还无法触动扳机!"); } @@ -136,7 +136,7 @@ else //攻击状态 { //触发扳机 - AttackState = weapon.AiTriggerAttackState(); + AttackState = weapon.AiTriggerAttackState(AttackState); if (AttackState == AiAttackEnum.LockingTime) //锁定玩家状态 { @@ -206,6 +206,11 @@ { MoveHandler(delta); } + + if (AttackState == AiAttackEnum.AttackInterval) //触发攻击完成 + { + Master.AttackTimer = weapon.Attribute.TriggerInterval + Master.EnemyRoleState.AttackInterval; + } } } } diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs index c6ae3d6..d0f1bde 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs @@ -112,7 +112,7 @@ { ChangeState(AIStateEnum.AiSurround); } - else if (weapon.TriggerIsReady()) //可以攻击 + else if (!Master.IsAttack && weapon.TriggerIsReady()) //可以攻击 { //攻击状态 ChangeState(AIStateEnum.AiAttack); diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs index 2d3c914..da694dd 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs @@ -143,7 +143,7 @@ { ChangeState(AIStateEnum.AiFollowUp); } - else if (weapon.TriggerIsReady()) //可以攻击 + else if (!Master.IsAttack && weapon.TriggerIsReady()) //可以攻击 { //发起攻击 ChangeState(AIStateEnum.AiAttack); diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index fc93bb3..91eb784 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -48,7 +48,7 @@ IsAi = false; StateController = AddComponent>(); - AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Enemy; + AttackLayer = PhysicsLayer.Obstacle | PhysicsLayer.Enemy; EnemyLayer = EnemyLayer = PhysicsLayer.Enemy; Camp = CampEnum.Camp1; @@ -61,18 +61,7 @@ ActivePropsPack.SetCapacity(1); // debug用 - // RoleState.Acceleration = 3000; - // RoleState.Friction = 3000; - // RoleState.MoveSpeed = 500; - // CollisionLayer = 0; - // CollisionMask = 0; - // GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f); - //GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f); - // this.CallDelay(0.5f, () => - // { - // var weapon = Create(Ids.Id_weapon0009); - // PickUpWeapon(weapon); - // }); + //DebugSet(); //注册状态机 StateController.Register(new PlayerIdleState()); @@ -86,6 +75,41 @@ _brushData2 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0001"]); } + private void DebugSet() + { + if (World is Hall) + { + return; + } + RoleState.Acceleration = 3000; + RoleState.Friction = 3000; + RoleState.MoveSpeed = 500; + CollisionLayer = PhysicsLayer.None; + CollisionMask = PhysicsLayer.None; + //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f); + // this.CallDelay(0.5f, () => + // { + // PickUpWeapon(Create(Ids.Id_weapon0009)); + // PickUpWeapon(Create(Ids.Id_weapon0008)); + // PickUpWeapon(Create(Ids.Id_weapon0007)); + // PickUpWeapon(Create(Ids.Id_weapon0006)); + // }); + World.Color = new Color(1, 1, 1, 1); //关闭迷雾 + //显示房间小地图 + this.CallDelay(1, () => + { + GameApplication.Instance.DungeonManager.StartRoomInfo.EachRoom(info => + { + info.PreviewSprite.Visible = true; + foreach (var roomDoorInfo in info.Doors) + { + roomDoorInfo.AislePreviewSprite.Visible = true; + } + }); + }); + + } + protected override RoleState OnCreateRoleState() { var roleState = new PlayerRoleState(); @@ -200,14 +224,14 @@ { //Hurt(1000, 0); Hp = 0; - Hurt(this, 1000, 0); + HurtHandler(this, 1000, 0); } else if (Input.IsKeyPressed(Key.O)) //测试用, 消灭房间内所有敌人 { var enemyList = AffiliationArea.FindIncludeItems(o => o.CollisionWithMask(PhysicsLayer.Enemy)); foreach (var enemy in enemyList) { - ((Enemy)enemy).Hurt(this, 1000, 0); + ((Enemy)enemy).HurtArea.Hurt(this, 1000, 0); } } // //测试用 @@ -318,7 +342,7 @@ MoveController.ClearForce(); //暂停游戏 - GameApplication.Instance.World.Pause = true; + World.Current.Pause = true; //弹出结算面板 GameApplication.Instance.Cursor.SetGuiMode(true); UiManager.Open_Settlement(); @@ -384,4 +408,10 @@ // base.DebugDraw(); // DrawArc(GetLocalMousePosition(), 25, 0, Mathf.Pi * 2f, 20, Colors.Red, 1); // } + + public override void AddGold(int goldCount) + { + base.AddGold(goldCount); + EventManager.EmitEvent(EventEnum.OnPlayerGoldChange, RoleState.Gold); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs b/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs index f52b21d..c9e2f7d 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs @@ -14,5 +14,5 @@ /// /// 翻滚冷却时间 /// - public float RollCoolingTime = 0.4f; + public float RollCoolingTime = 0.2f; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/weapon/AiAttackEnum.cs b/DungeonShooting_Godot/src/game/activity/weapon/AiAttackEnum.cs index 9ee4dc5..ac8e343 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/AiAttackEnum.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/AiAttackEnum.cs @@ -40,4 +40,8 @@ /// 成功触发攻击 /// Attack, + /// + /// 攻击蓄力中 + /// + AttackCharge, } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index 34008d9..1945689 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -214,7 +214,8 @@ private Vector2 _gripOffset; //碰撞器位置 - private Vector2 _collPoint; + private Vector2 _collPoint1; + private Vector2 _collPoint2; //换弹计时器 private float _reloadTimer = 0; @@ -240,6 +241,15 @@ //换弹投抛弹壳记录 private bool _reloadShellFlag = false; + //抖动强度 + private float _shakeStrength = 0; + + //抖动间隔 + private float _shakeInterval = 1 / 60f; + + //抖动计时器 + private float _shakeTimer = 0; + // ---------------------------------------------- private uint _tempLayer; @@ -294,10 +304,11 @@ AnimationPlayer.AnimationFinished += OnAnimationPlayerFinished; _gripPoint = AnimatedSprite.Position; _gripOffset = AnimatedSprite.Offset; - _collPoint = Collision.Position; + _collPoint1 = Collision.Position; + _collPoint2 = _collPoint1 - AnimatedSprite.Offset - AnimatedSprite.Position; AnimatedSprite.Position = Vector2.Zero; AnimatedSprite.Offset = Vector2.Zero; - Collision.Position = Vector2.Zero; + Collision.Position = _collPoint2; } /// @@ -307,12 +318,13 @@ { _playerWeaponAttribute = attribute; SetCurrentWeaponAttribute(attribute); - if (attribute.AiUseAttribute != null) + if (ExcelConfig.WeaponBase_Map.TryGetValue(attribute.Id + "_ai", out var aiAttr)) { - _aiWeaponAttribute = attribute.AiUseAttribute; + _aiWeaponAttribute = aiAttr; } else { + Debug.LogError("警告: 未找到 AI 武器属性: " + attribute.Id); _aiWeaponAttribute = attribute; } @@ -325,8 +337,6 @@ CurrAmmo = Attribute.AmmoCapacity; //剩余弹药量 ResidueAmmo = Mathf.Min(Attribute.StandbyAmmoCapacity + CurrAmmo, Attribute.MaxAmmoCapacity) - CurrAmmo; - - ThrowCollisionSize = attribute.ThrowCollisionSize.AsVector2(); } /// @@ -378,6 +388,31 @@ } /// + /// 结束蓄力时调用 + /// 注意, 该函数仅在 Attribute.LooseShoot == false 时才能被调用 + /// + protected virtual void OnEndCharge() + { + } + + /// + /// 蓄力完成时调用 + /// + protected virtual void OnChargeFinish() + { + } + + /// + /// 蓄力时每帧调用 + /// 注意, 该函数仅在 Attribute.LooseShoot == false 时才能被调用 + /// + /// + /// 蓄力时长 + protected virtual void OnChargeProcess(float delta, float charge) + { + } + + /// /// 当换弹时调用, 如果设置单独装弹, 则每装一次弹调用一次该函数 /// protected virtual void OnReload() @@ -459,6 +494,24 @@ protected override void Process(float delta) { + //抖动 AnimatedSprite + if (_shakeStrength != 0) + { + _shakeTimer += delta; + if (_shakeTimer >= _shakeInterval) + { + _shakeTimer = 0; + AnimatedSprite.Offset = new Vector2( + Utils.Random.RandomRangeFloat(-_shakeStrength, _shakeStrength), + Utils.Random.RandomRangeFloat(-_shakeStrength, _shakeStrength) + ); + } + } + else + { + _shakeTimer = 0; + } + //未开火时间 _noAttackTime += delta; @@ -620,6 +673,12 @@ { BeLoaded(); } + + //子弹换弹 + if (CurrAmmo <= 0 && Attribute.AutoReload) + { + Reload(); + } } } else if (_delayedTime > 0) //攻击延时 @@ -636,7 +695,14 @@ { if (_looseShootFlag) //蓄力时长 { + var pv = _chargeTime; _chargeTime += delta; + OnChargeProcess(delta, _chargeTime); + //蓄力完成 + if (pv < Attribute.MinChargeTime && _chargeTime >= Attribute.MinChargeTime) + { + OnChargeFinish(); + } } _downTimer += delta; @@ -706,12 +772,28 @@ } /// + /// 设置抖动强度 + /// + public void SetShake(float strength) + { + _shakeStrength = strength; + } + + /// + /// 设置抖动间隔 + /// + public void SetShakeInterval(float interval) + { + _shakeInterval = interval; + } + + /// /// 返回武器是否在地上 /// /// public bool IsInGround() { - return Master == null && GetParent() == GameApplication.Instance.World.NormalLayer; + return Master == null && GetParent() == World.Current.NormalLayer; } /// @@ -901,6 +983,15 @@ } /// + /// 获取蓄力是否结束 + /// 注意, 该函数仅在 Attribute.LooseShoot == false 时有正确的返回值, 否则返回 false + /// + public bool IsChargeFinish() + { + return _chargeTime >= Attribute.MinChargeTime; + } + + /// /// 获取延时射击倒计时, 单位: 秒 /// public float GetDelayedAttackTime() @@ -986,6 +1077,7 @@ _continuousCount = 0; } _chargeTime = 0; + OnEndCharge(); } OnUpTrigger(); @@ -1500,23 +1592,30 @@ //抛弹逻辑 private void ThrowShellHandler(float speedScale) { - if (Attribute.Shell == null) + var attribute = Attribute; + if (attribute.Shell == null) { return; } //创建一个弹壳 - if (Attribute.ThrowShellDelayTime > 0) + if (attribute.ThrowShellDelayTime > 0) { - this.CallDelay(Attribute.ThrowShellDelayTime, () => + this.CallDelay(attribute.ThrowShellDelayTime, () => { _reloadShellFlag = true; - FireManager.ThrowShell(this, Attribute.Shell, speedScale); + for (var i = 0; i < attribute.ThrowShellCount; i++) + { + FireManager.ThrowShell(this, attribute.Shell, speedScale); + } }); } - else if (Attribute.ThrowShellDelayTime == 0) + else if (attribute.ThrowShellDelayTime == 0) { _reloadShellFlag = true; - FireManager.ThrowShell(this, Attribute.Shell, speedScale); + for (var i = 0; i < attribute.ThrowShellCount; i++) + { + FireManager.ThrowShell(this, attribute.Shell, speedScale); + } } } @@ -1915,7 +2014,7 @@ //精灵位置, 旋转中心点 AnimatedSprite.Position = Vector2.Zero; AnimatedSprite.Offset = Vector2.Zero; - Collision.Position = Vector2.Zero; + Collision.Position = _collPoint2; //清除 Ai 拾起标记 RemoveSign(SignNames.AiFindWeaponSign); //停止换弹 @@ -1945,7 +2044,7 @@ //Collision.Disabled = true; AnimatedSprite.Position = _gripPoint; AnimatedSprite.Offset = _gripOffset; - Collision.Position = _collPoint; + Collision.Position = _collPoint1; //修改层级 _tempLayer = CollisionLayer; CollisionLayer = PhysicsLayer.OnHand; @@ -2032,8 +2131,22 @@ /// /// Ai调用, 触发扣动扳机, 并返回攻击状态 /// - public AiAttackEnum AiTriggerAttackState() + public AiAttackEnum AiTriggerAttackState(AiAttackEnum prevState) { + var chargeFinish = false; + if (prevState == AiAttackEnum.AttackCharge) //蓄力中 + { + var enemy = (Enemy)Master; + if (!IsChargeFinish()) + { + enemy.Attack(); + return prevState; + } + + chargeFinish = true; + enemy.LockingTime = 0; + } + AiAttackEnum flag; if (IsTotalAmmoEmpty()) //当前武器弹药打空 { @@ -2070,7 +2183,7 @@ { flag = AiAttackEnum.AttackInterval; } - else if (_continuousCount >= 1) //连发中 + else if (_continuousCount >= 1 && (!chargeFinish || _continuousCount >= 2)) //连发中 { flag = AiAttackEnum.Attack; } @@ -2087,7 +2200,7 @@ { flag = AiAttackEnum.Attack; enemy.Attack(); - if (_attackFlag) + if (_attackFlag) //成功触发攻击 { enemy.LockingTime = 0; } @@ -2098,18 +2211,26 @@ { flag = AiAttackEnum.Attack; enemy.Attack(); - if (_attackFlag) + if (_attackFlag) //成功触发攻击 { enemy.LockingTime = 0; } } else //单发 { - flag = AiAttackEnum.Attack; - enemy.Attack(); - if (_attackFlag) + if (Attribute.LooseShoot && Attribute.MinChargeTime > 0) //松发并蓄力攻击 { - enemy.LockingTime = 0; + flag = AiAttackEnum.AttackCharge; + enemy.Attack(); + } + else + { + flag = AiAttackEnum.Attack; + enemy.Attack(); + if (_attackFlag && _attackTimer > 0) //成功触发攻击 + { + enemy.LockingTime = 0; + } } } } diff --git a/DungeonShooting_Godot/src/game/activity/weapon/bow/Bow.cs b/DungeonShooting_Godot/src/game/activity/weapon/bow/Bow.cs new file mode 100644 index 0000000..9371e39 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/weapon/bow/Bow.cs @@ -0,0 +1,90 @@ +using Godot; + +/// +/// 弓箭 +/// +[Tool] +public partial class Bow : Weapon +{ + /// + /// 弓箭挂载点 + /// + [Export, ExportFillNode] + public Marker2D ArrowPoint { get; set; } + + //正在使用的弓箭 + private Arrow _activeArrow; + + public override void OnInit() + { + base.OnInit(); + _activeArrow = (Arrow)FireManager.ShootBullet(this, 0, Attribute.Bullet); + _activeArrow.Pickup(); + _activeArrow.MoveController.Enable = false; + _activeArrow.CollisionArea.Monitoring = false; + _activeArrow.Collision.Disabled = true; + _activeArrow.Position = Vector2.Zero; + _activeArrow.RefreshBulletColor(false); + ArrowPoint.AddChild(_activeArrow); + } + + protected override void Process(float delta) + { + base.Process(delta); + _activeArrow.ShadowOffset = ShadowOffset + new Vector2(0, Altitude); + _activeArrow.Visible = !IsTotalAmmoEmpty(); + } + + protected override void OnPickUp(Role master) + { + _activeArrow.RefreshBulletColor(master.IsEnemyWithPlayer()); + } + + protected override void OnRemove(Role master) + { + _activeArrow.RefreshBulletColor(false); + } + + protected override void OnBeginCharge() + { + //拉弓开始蓄力 + AnimationPlayer.Play(AnimatorNames.Pull); + } + + protected override void OnChargeFinish() + { + //蓄力完成 + SetShake(0.7f); + } + + protected override void OnEndCharge() + { + //结束蓄力 + SetShake(0); + AnimationPlayer.Play(AnimatorNames.Reset); + } + + protected override void OnFire() + { + if (Master.IsPlayer()) + { + //创建抖动 + GameCamera.Main.DirectionalShake(Vector2.Right.Rotated(GlobalRotation) * Attribute.CameraShake); + } + } + + protected override void OnShoot(float fireRotation) + { + FireManager.ShootBullet(this, fireRotation, Attribute.Bullet); + } + + protected override void OnDestroy() + { + base.OnDestroy(); + if (_activeArrow != null) + { + _activeArrow.Destroy(); + _activeArrow = null; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs index 3d386d0..63ada44 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs @@ -39,6 +39,7 @@ _hitArea.Monitoring = false; _hitArea.Monitorable = false; _hitArea.BodyEntered += OnBodyEntered; + _hitArea.AreaEntered += OnArea2dEntered; //禁用自动播放动画 IsAutoPlaySpriteFrames = false; @@ -82,7 +83,7 @@ if (IsActive) //被使用 { //播放挥刀特效 - SpecialEffectManager.Play( + SpecialEffectManager.PlaySpriteFrames( Master, ResourcePath.resource_spriteFrames_weapon_Weapon0004_hit_tres, "default", Master.MountPoint.Position, @@ -123,56 +124,77 @@ private void OnBodyEntered(Node2D body) { - //Debug.Log("碰到物体: " + body.Name); - var activityObject = body.AsActivityObject(); - if (activityObject != null) + if (body is IHurt hurt) { - if (activityObject is Role role) //碰到角色 + HandlerCollision(hurt); + } + else if (body is Bullet bullet) //攻击子弹 + { + var attackLayer = bullet.AttackLayer; + if (TriggerRole != null && TriggerRole.CollisionWithMask(attackLayer)) //是攻击玩家的子弹 { - var damage = Utils.Random.RandomConfigRange(Attribute.Bullet.HarmRange); - //计算子弹造成的伤害 - if (TriggerRole != null) + //反弹子弹 + bullet.OnPlayDisappearEffect(); + var scale = -1f; + var weapon = bullet.BulletData.Weapon; + if (weapon != null) { - damage = TriggerRole.RoleState.CalcDamage(damage); + scale /= weapon.AiUseAttribute.AiAttackAttr.BulletSpeedScale; } - //击退 - var attr = GetUseAttribute(TriggerRole); - var repel = Utils.Random.RandomConfigRange(attr.Bullet.RepelRange); - //计算击退 - if (TriggerRole != null) - { - repel = TriggerRole.RoleState.CalcBulletRepel(repel); - } - if (repel != 0) - { - Vector2 position; - if (TriggerRole != null) - { - position = role.GlobalPosition - TriggerRole.MountPoint.GlobalPosition; - } - else - { - position = role.GlobalPosition - GlobalPosition; - } - var v2 = position.Normalized() * repel; - role.AddRepelForce(v2); - } - - //造成伤害 - role.CallDeferred(nameof(Role.Hurt), TriggerRole, damage, (role.GetCenterPosition() - GlobalPosition).Angle()); - } - else if (activityObject is Bullet bullet) //攻击子弹 - { - var attackLayer = bullet.AttackLayer; - if (TriggerRole != null && TriggerRole.CollisionWithMask(attackLayer)) //是攻击玩家的子弹 - { - //反弹子弹 - bullet.OnPlayDisappearEffect(); - bullet.MoveController.ScaleAllVelocity(-1); - bullet.Rotation += Mathf.Pi; - bullet.AttackLayer = TriggerRole.AttackLayer; - } + bullet.MoveController.ScaleAllVelocity(scale); + bullet.Rotation += Mathf.Pi; + bullet.AttackLayer = TriggerRole.AttackLayer; + bullet.RefreshBulletColor(false); } } } + + private void OnArea2dEntered(Area2D area) + { + if (area is IHurt hurt) + { + HandlerCollision(hurt); + } + } + + private void HandlerCollision(IHurt hurt) + { + var damage = Utils.Random.RandomConfigRange(Attribute.Bullet.HarmRange); + //计算子弹造成的伤害 + if (TriggerRole != null) + { + damage = TriggerRole.RoleState.CalcDamage(damage); + } + //击退 + var attr = GetUseAttribute(TriggerRole); + var repel = Utils.Random.RandomConfigRange(attr.Bullet.RepelRange); + //计算击退 + if (TriggerRole != null) + { + repel = TriggerRole.RoleState.CalcBulletRepel(repel); + } + + var globalPosition = GlobalPosition; + if (repel != 0) + { + var o = hurt.GetActivityObject(); + if (o != null && o is not Player) //不是玩家才能被击退 + { + Vector2 position; + if (TriggerRole != null) + { + position = o.GlobalPosition - TriggerRole.MountPoint.GlobalPosition; + } + else + { + position = o.GlobalPosition - globalPosition; + } + var v2 = position.Normalized() * repel; + o.AddRepelForce(v2); + } + } + + //造成伤害 + hurt.Hurt(TriggerRole, damage, (hurt.GetPosition() - globalPosition).Angle()); + } } diff --git a/DungeonShooting_Godot/src/game/camera/GameCamera.cs b/DungeonShooting_Godot/src/game/camera/GameCamera.cs index 1c0ea3b..9ae3e69 100644 --- a/DungeonShooting_Godot/src/game/camera/GameCamera.cs +++ b/DungeonShooting_Godot/src/game/camera/GameCamera.cs @@ -86,7 +86,7 @@ var newDelta = (float)delta; _Shake(newDelta); - var world = GameApplication.Instance.World; + var world = World.Current; if (world != null && !world.Pause && _followTarget != null) { var mousePosition = InputManager.CursorPosition; @@ -196,12 +196,20 @@ if (EnableShake) { var distance = _CalculateDistanceSquared(delta); - distance = new Vector2(Mathf.Sqrt(distance.X), Mathf.Sqrt(distance.Y)); - var offset = Offset; - _shakeOffset += _processDirection + new Vector2( - (float)GD.RandRange(-distance.X, distance.X) - offset.X, - (float)GD.RandRange(-distance.Y, distance.Y) - offset.Y - ); + if (distance == Vector2.Zero) + { + _shakeOffset += _processDirection - Offset / 2f; + } + else + { + distance = new Vector2(Mathf.Sqrt(Mathf.Abs(distance.X)), Mathf.Sqrt(Mathf.Abs(distance.Y))); + var offset = Offset; + _shakeOffset += _processDirection + new Vector2( + (float)GD.RandRange(-distance.X, distance.X) - offset.X, + (float)GD.RandRange(-distance.Y, distance.Y) - offset.Y + ); + } + _processDistanceSquared = Vector2.Zero; _processDirection = _processDirection.Lerp(Vector2.Zero, RecoveryCoefficient * delta); } @@ -220,10 +228,10 @@ foreach (var keyValuePair in _shakeMap) { var shakeData = keyValuePair.Value; - var tempLenght = shakeData.Value.LengthSquared(); - if (tempLenght > length) + var tempLength = shakeData.Value.LengthSquared(); + if (tempLength > length) { - length = tempLenght; + length = tempLength; temp = shakeData.Value; if (shakeData.Decline) { diff --git a/DungeonShooting_Godot/src/game/common/ui/EditorGridBg.cs b/DungeonShooting_Godot/src/game/common/ui/EditorGridBg.cs new file mode 100644 index 0000000..44aa66a --- /dev/null +++ b/DungeonShooting_Godot/src/game/common/ui/EditorGridBg.cs @@ -0,0 +1,137 @@ +using Godot; + +/// +/// 通用Ui网格背景组件, 包含可拖拽的容器根节点 +/// +public abstract partial class EditorGridBg : ColorRect, IUiNodeScript +{ + /// + /// 可拖拽容器根节点 + /// + public Control ContainerRoot { get; private set; } + /// + /// 显示网格的节点 + /// + public ColorRect Grid { get; private set; } + /// + /// 当前对象绑定的Ui节点 + /// + public IUiNode UiNode { get; private set; } + + private ShaderMaterial _gridMaterial; + private bool _dragMoveFlag = false; + + /// + /// 初始化节点数据 + /// + /// 可拖拽容器根节点 + /// 当前对象绑定的Ui节点 + public void InitNode(Control containerRoot, ColorRect grid = null) + { + ContainerRoot = containerRoot; + if (grid != null) + { + Grid = grid; + grid.MouseFilter = MouseFilterEnum.Ignore; + _gridMaterial = ResourceManager.Load(ResourcePath.resource_material_Grid_tres, false); + grid.Material = _gridMaterial; + } + } + + public virtual void SetUiNode(IUiNode uiNode) + { + UiNode = uiNode; + this.AddDragListener(DragButtonEnum.Middle, OnDrag); + Resized += RefreshGridTrans; + //打开Ui时刷新网格 + UiNode.GetUiPanel().OnShowUiEvent += RefreshGridTrans; + } + + public virtual void OnDestroy() + { + + } + + public override void _GuiInput(InputEvent @event) + { + if (@event is InputEventMouseButton mouseButton) + { + AcceptEvent(); + if (mouseButton.ButtonIndex == MouseButton.WheelDown) + { + //缩小 + if (Utils.DoShrinkByMousePosition(ContainerRoot, 0.4f)) + { + SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X); + } + } + else if (mouseButton.ButtonIndex == MouseButton.WheelUp) + { + //放大 + if (Utils.DoMagnifyByMousePosition(ContainerRoot, 20)) + { + SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X); + } + } + } + } + + //拖拽回调 + private void OnDrag(DragState state, Vector2 pos) + { + if (state == DragState.DragStart) + { + if (this.IsMouseInRect()) + { + _dragMoveFlag = true; + } + } + else if (state == DragState.DragMove) + { + if (_dragMoveFlag) + { + ContainerRoot.Position += pos; + RefreshGridTrans(); + } + } + else + { + _dragMoveFlag = false; + } + } + + + /// + /// 刷新背景网格位置和缩放 + /// + public void RefreshGridTrans() + { + if (_gridMaterial != null) + { + _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Size, Size); + SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X); + } + } + + //设置网格位置和缩放 + private void SetGridTransform(Vector2 pos, float scale) + { + if (_gridMaterial != null) + { + _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.GridSize, GameConfig.TileCellSize * scale); + _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Offset, -pos); + } + } + + /// + /// 设置网格颜色 + /// + public void SetLineColor(Color color) + { + if (_gridMaterial != null) + { + _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Color, color); + } + } + +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/common/ui/EditorMaskBrush.cs b/DungeonShooting_Godot/src/game/common/ui/EditorMaskBrush.cs new file mode 100644 index 0000000..5b70200 --- /dev/null +++ b/DungeonShooting_Godot/src/game/common/ui/EditorMaskBrush.cs @@ -0,0 +1,59 @@ +using Godot; +using UI.TileSetEditor; + +/// +/// 地图编辑器通用遮罩笔刷 +/// +public partial class EditorMaskBrush : Control +{ + /// + /// 绑定的地图纹理节点 + /// + public TextureRect TileTexture { get; private set; } + + /// + /// 绑定的 TileSetEditorPanel Ui + /// + public TileSetEditorPanel TileSetEditorPanel { get; private set; } + + /// + /// 初始化笔刷数绑定的节点 + /// + public void Init(TextureRect tileTexture, TileSetEditorPanel tileSetEditorPanel) + { + TileTexture = tileTexture; + TileSetEditorPanel = tileSetEditorPanel; + } + + public override void _Process(double delta) + { + QueueRedraw(); + } + + public override void _Draw() + { + if (TileTexture == null) + { + return; + } + //绘制texture区域 + if (TileTexture.Texture != null) + { + DrawRect( + new Rect2(Vector2.Zero, TileSetEditorPanel.CellHorizontal * GameConfig.TileCellSize, TileSetEditorPanel.CellVertical * GameConfig.TileCellSize), + new Color(1, 1, 0, 0.5f), false, + 2f / TileTexture.Scale.X + ); + } + + //绘制鼠标悬停区域 + if (TileTexture.IsMouseInRect()) + { + var pos = Utils.GetMouseCellPosition(TileTexture) * GameConfig.TileCellSize; + DrawRect( + new Rect2(pos,GameConfig.TileCellSizeVector2I), + Colors.Green, false, 3f / TileTexture.Scale.X + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/DragBinder.cs b/DungeonShooting_Godot/src/game/data/DragBinder.cs deleted file mode 100644 index 4622dea..0000000 --- a/DungeonShooting_Godot/src/game/data/DragBinder.cs +++ /dev/null @@ -1,30 +0,0 @@ - -using System; -using Godot; - -/// -/// 拖拽绑定数据对象, 通过 DragUiManager 创建 -/// -public class DragBinder -{ - public Control Control; - public bool MouseEntered; - public bool Dragging; - public Vector2 PrevPosition; - public Action Callback; - - public void OnMouseEntered() - { - MouseEntered = true; - } - - public void OnMouseExited() - { - MouseEntered = false; - } - - public void UnBind() - { - DragUiManager.UnBindDrag(this); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/DragState.cs b/DungeonShooting_Godot/src/game/data/DragState.cs deleted file mode 100644 index 04f4fb0..0000000 --- a/DungeonShooting_Godot/src/game/data/DragState.cs +++ /dev/null @@ -1,19 +0,0 @@ - -/// -/// 拖拽状态 -/// -public enum DragState -{ - /// - /// 拖拽开始 - /// - DragStart, - /// - /// 拖拽中 - /// - DragMove, - /// - /// 拖拽结束 - /// - DragEnd -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/DungeonGroupData.cs b/DungeonShooting_Godot/src/game/data/DungeonGroupData.cs new file mode 100644 index 0000000..c04107e --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/DungeonGroupData.cs @@ -0,0 +1,23 @@ + +public class DungeonGroupData +{ + /// + /// 名称 + /// + public string Name; + /// + /// 地图集 + /// + public string TileSet; + /// + /// 备注 + /// + public string Remark; + + public DungeonGroupData(string name, string tileSet, string remark) + { + Name = name; + TileSet = tileSet; + Remark = remark; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/EditorInfoData.cs b/DungeonShooting_Godot/src/game/data/EditorInfoData.cs new file mode 100644 index 0000000..e1d0dc6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/EditorInfoData.cs @@ -0,0 +1,18 @@ + +public class EditorInfoData +{ + /// + /// 名称 + /// + public string Name; + /// + /// 备注 + /// + public string Remark; + + public EditorInfoData(string name, string remark) + { + Name = name; + Remark = remark; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/FormItemData.cs b/DungeonShooting_Godot/src/game/data/FormItemData.cs new file mode 100644 index 0000000..f6fa43e --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/FormItemData.cs @@ -0,0 +1,20 @@ + +using Godot; + +public class FormItemData where T : Control +{ + /// + /// 显示文本 + /// + public string Label; + /// + /// 挂载的节点 + /// + public T UiNode; + + public FormItemData(string label, T uiNode) + { + Label = label; + UiNode = uiNode; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs b/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs new file mode 100644 index 0000000..4230b71 --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs @@ -0,0 +1,71 @@ + +using System.IO; +using Godot; + +/// +/// 导入的组合图块数据 +/// +public class ImportCombinationData +{ + /// + /// 预览图 + /// + public ImageTexture PreviewTexture { get; set; } + /// + /// 组合图块数据 + /// + public TileCombinationInfo CombinationInfo { get; set; } + + private static Image MissingImage; + + public ImportCombinationData(ImageTexture previewTexture, TileCombinationInfo combinationInfo) + { + PreviewTexture = previewTexture; + CombinationInfo = combinationInfo; + } + + /// + /// 更新组合预览图 + /// + public void UpdatePreviewTexture(Image src) + { + using (var image = GetPreviewTexture(src, CombinationInfo.Cells, CombinationInfo.Positions)) + { + PreviewTexture.SetImage(image); + } + } + + /// + /// 获取组合图块预览图数据 + /// + /// 地块纹理 + /// 图块在地块中的位置 + /// 图块位置 + public static Image GetPreviewTexture(Image src, SerializeVector2[] cells, SerializeVector2[] positions) + { + var srcSize = src.GetSize(); + var rect = Utils.CalcTileRect(positions); + var rectSize = rect.Size; + var image = Image.Create(rectSize.X + 4, rectSize.Y + 4, false, Image.Format.Rgba8); + for (var i = 0; i < cells.Length; i++) + { + var cell = cells[i].AsVector2I(); + var pos = positions[i].AsVector2I(); + //判断是否超出纹理范围 + if (cell.X + GameConfig.TileCellSize > srcSize.X || cell.Y + GameConfig.TileCellSize > srcSize.Y) //超出范围 + { + if (MissingImage == null) + { + MissingImage = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Missing_png).GetImage(); + MissingImage.Convert(Image.Format.Rgba8); + } + image.BlendRect(MissingImage, new Rect2I(Vector2I.Zero, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2)); + } + else + { + image.BlendRect(src, new Rect2I(cell, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2)); + } + } + return image; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/TerrainData.cs b/DungeonShooting_Godot/src/game/data/TerrainData.cs new file mode 100644 index 0000000..0e9829e --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/TerrainData.cs @@ -0,0 +1,24 @@ + + +public class TerrainData +{ + /// + /// TileSetTerrainInfo 的 index + /// + public int TerrainIndex; + /// + /// Terrain 数据 + /// + public TileSetTerrainInfo TerrainInfo; + /// + /// 对应在 Godot.TileSet 中的 TerrainSet Index + /// + public int TerrainSetIndex; + + public TerrainData(int terrainIndex, TileSetTerrainInfo terrainInfo, int terrainSetIndex) + { + TerrainIndex = terrainIndex; + TerrainInfo = terrainInfo; + TerrainSetIndex = terrainSetIndex; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/TileMapLayerData.cs b/DungeonShooting_Godot/src/game/data/TileMapLayerData.cs new file mode 100644 index 0000000..da99d2c --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/TileMapLayerData.cs @@ -0,0 +1,23 @@ + +public class TileMapLayerData +{ + /// + /// 显示文本 + /// + public string Title; + /// + /// Map 层级索引 + /// + public int Layer; + /// + /// 是否锁定 + /// + public bool IsLock; + + public TileMapLayerData(string title, int layer, bool isLock) + { + Title = title; + Layer = layer; + IsLock = isLock; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/property/AnimatorNames.cs b/DungeonShooting_Godot/src/game/data/property/AnimatorNames.cs new file mode 100644 index 0000000..88ae1af --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/property/AnimatorNames.cs @@ -0,0 +1,107 @@ + +using Godot; + +/// +/// 预制动画名称 +/// +public static class AnimatorNames +{ + /// + /// 默认动画 + /// + public static readonly StringName Default = "default"; + /// + /// 静止不动 + /// + public static readonly StringName Idle = "idle"; + /// + /// 奔跑 + /// + public static readonly StringName Run = "run"; + /// + /// 倒退奔跑 + /// + public static readonly StringName ReverseRun = "reverseRun"; + /// + /// 翻滚 + /// + public static readonly StringName Roll = "roll"; + /// + /// 武器泛光动画 + /// + public static readonly StringName Floodlight = "floodlight"; + /// + /// 开门动画 + /// + public static readonly StringName OpenDoor = "openDoor"; + /// + /// 关门动画 + /// + public static readonly StringName CloseDoor = "closeDoor"; + /// + /// 开火 + /// + public static readonly StringName Fire = "fire"; + /// + /// 换弹 + /// + public static readonly StringName Reloading = "reloading"; + /// + /// 子弹上膛 + /// + public static readonly StringName BeLoaded = "beLoaded"; + /// + /// ui入场 + /// + public static readonly StringName In = "in"; + /// + /// ui出场 + /// + public static readonly StringName Out = "out"; + /// + /// 显示动画 + /// + public static readonly StringName Show = "show"; + /// + /// 播放特效 + /// + public static readonly StringName Play = "play"; + /// + /// 物体移动 + /// + public static readonly StringName Move = "move"; + /// + /// 攻击 + /// + public static readonly StringName Attack = "attack"; + /// + /// 惊讶动作 + /// + public static readonly StringName Astonished = "astonished"; + /// + /// 通知动作 + /// + public static readonly StringName Notify = "notify"; + /// + /// 疑惑动作 + /// + public static readonly StringName Query = "query"; + /// + /// 重置动画 + /// + public static readonly StringName Reset = "RESET"; + + /// + /// 打开宝箱 + /// + public static readonly StringName Open = "open"; + + /// + /// 拉弓 + /// + public static readonly StringName Pull = "pull"; + + + public static readonly StringName HalfStart = "half_start"; + public static readonly StringName HalfEnd = "half_end"; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/property/InputAction.cs b/DungeonShooting_Godot/src/game/data/property/InputAction.cs new file mode 100644 index 0000000..66ad19e --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/property/InputAction.cs @@ -0,0 +1,38 @@ + +using Godot; + +/// +/// 输入事件名称 +/// +public static class InputAction +{ + /// + /// 鼠标左键 + /// + public static readonly StringName MouseLeft = "mouse_left"; + /// + /// 鼠标右键 + /// + public static readonly StringName MouseRight = "mouse_right"; + /// + /// 鼠标中建 + /// + public static readonly StringName mouseMiddle = "mouse_middle"; + + public static readonly StringName MoveLeft = "move_left"; + public static readonly StringName MoveRight = "move_right"; + public static readonly StringName MoveUp = "move_up"; + public static readonly StringName MoveDown = "move_down"; + public static readonly StringName ExchangeWeapon = "exchangeWeapon"; + public static readonly StringName ThrowWeapon = "throwWeapon"; + public static readonly StringName Interactive = "interactive"; + public static readonly StringName Reload = "reload"; + public static readonly StringName Fire = "fire"; + public static readonly StringName MeleeAttack = "meleeAttack"; + public static readonly StringName Roll = "roll"; + public static readonly StringName UseActiveProp = "useActiveProp"; + public static readonly StringName ExchangeProp = "exchangeProp"; + public static readonly StringName RemoveProp = "removeProp"; + public static readonly StringName Map = "map"; + public static readonly StringName Menu = "menu"; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/property/PhysicsLayer.cs b/DungeonShooting_Godot/src/game/data/property/PhysicsLayer.cs new file mode 100644 index 0000000..d1675e4 --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/property/PhysicsLayer.cs @@ -0,0 +1,50 @@ +/// +/// 物理碰撞层 +/// +public class PhysicsLayer +{ + /// + /// 无任何层级 + /// + public const uint None = 0; + /// + /// 墙壁 + /// + public const uint Wall = 0b1; + /// + /// 子弹 + /// + public const uint Bullet = 0b10; + /// + /// 道具 + /// + public const uint Prop = 0b100; + /// + /// 玩家 + /// + public const uint Player = 0b1000; + /// + /// 敌人 + /// + public const uint Enemy = 0b10000; + /// + /// 归属区域判断层级 + /// + public const uint Affiliation = 0b100000; + /// + /// 在手上 + /// + public const uint OnHand = 0b1000000; + /// + /// 各种碎屑,包括弹壳,敌人死亡碎片,爆炸碎片等 + /// + public const uint Debris = 0b10000000; + /// + /// 投抛中 + /// + public const uint Throwing = 0b100000000; + /// + /// 障碍物 + /// + public const uint Obstacle = 0b1000000000; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/property/ShaderParamNames.cs b/DungeonShooting_Godot/src/game/data/property/ShaderParamNames.cs new file mode 100644 index 0000000..e6e924c --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/property/ShaderParamNames.cs @@ -0,0 +1,52 @@ + +using Godot; + +/// +/// Shader 中的参数名称 +/// +public static class ShaderParamNames +{ + /// + /// 灰度 + /// + public static readonly StringName Grey = "grey"; + /// + /// 轮廓颜色 + /// + public static readonly StringName OutlineColor = "outline_color"; + /// + /// 是否显示轮廓 + /// + public static readonly StringName ShowOutline = "show_outline"; + /// + /// 纹理大小 + /// + public static readonly StringName Size = "size"; + /// + /// 线段宽度 + /// + public static readonly StringName LineWidth = "line_width"; + /// + /// 偏移 + /// + public static readonly StringName Offset = "offset"; + /// + /// 网格大小 + /// + public static readonly StringName GridSize = "grid_size"; + /// + /// 颜色 + /// + public static readonly StringName Color = "color"; + + /// + /// 快速设置一个材质的 shader 材质参数 + /// + public static void SetShaderMaterialParameter(this Material material, StringName param, Variant value) + { + if (material is ShaderMaterial shaderMaterial) + { + shaderMaterial.SetShaderParameter(param, value); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/property/SignNames.cs b/DungeonShooting_Godot/src/game/data/property/SignNames.cs new file mode 100644 index 0000000..1e5cf00 --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/property/SignNames.cs @@ -0,0 +1,11 @@ + +/// +/// 标记名称 +/// +public class SignNames +{ + /// + /// Ai 对武器的标记名称, 一旦有该标记, Ai AiFindAmmoState 状态下寻找可用武器将忽略该武器 + /// + public const string AiFindWeaponSign = "AiFindWeaponSign"; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs index c05b1c4..efffc2f 100644 --- a/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs +++ b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs @@ -28,6 +28,7 @@ public virtual void PlayEffect() { + ZIndex = 1; Emitting = true; Restart(); if (Particles2D != null) diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs index 7dd66e6..04ae923 100644 --- a/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs +++ b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs @@ -33,6 +33,7 @@ public virtual void PlayEffect() { + ZIndex = 1; if (Particles2D != null) { foreach (var gpuParticles2D in Particles2D) diff --git a/DungeonShooting_Godot/src/game/effects/Trail.cs b/DungeonShooting_Godot/src/game/effects/Trail.cs new file mode 100644 index 0000000..91825a5 --- /dev/null +++ b/DungeonShooting_Godot/src/game/effects/Trail.cs @@ -0,0 +1,124 @@ +using Godot; + +/// +/// 拖尾效果 +/// +public partial class Trail : Line2D, IPoolItem +{ + /// + /// 拖尾效果固定更新帧率 + /// + public const int TrailUpdateFrame = 20; + + /// + /// 拖尾最大点数 + /// + public int MaxLength { get; set; } = 20; + /// + /// 拖尾绑定的物体 + /// + public Node2D Target { get; private set; } + + public bool IsDestroyed { get; private set; } + + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + + private double _time = 0; + private IPoolItem _targetPoolItem; + + /// + /// 设置拖尾跟随的物体 + /// + public void SetTarget(Node2D target) + { + Target = target; + if (target is IPoolItem poolItem) + { + _targetPoolItem = poolItem; + } + else + { + _targetPoolItem = null; + } + + if (target != null) + { + ClearPoints(); + } + + _time = 1f / TrailUpdateFrame; + } + + public void SetColor(Color color) + { + Gradient.SetColor(0, color); + color.A = 0; + Gradient.SetColor(1, color); + } + + public override void _Process(double delta) + { + if (_targetPoolItem != null && _targetPoolItem.IsRecycled) //目标物体被回收 + { + SetTarget(null); + } + + _time += delta; + var v = 1f / TrailUpdateFrame; + if (_time >= v) //执行更新点 + { + _time %= v; + + var pointCount = GetPointCount(); + if (Target != null) //没有被回收 + { + AddPoint(Target.GlobalPosition, 0); + if (pointCount > MaxLength) + { + RemovePoint(pointCount); + } + } + else //被回收了, + { + if (pointCount > 0) + { + RemovePoint(pointCount - 1); + } + + if (pointCount <= 1) //没有点了, 执行回收 + { + ObjectPool.Reclaim(this); + } + } + } + else if (Target != null && GetPointCount() >= 2) //没有被回收, 更新第一个点 + { + SetPointPosition(0, Target.GlobalPosition); + } + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + QueueFree(); + } + public void OnReclaim() + { + GetParent().CallDeferred(Node.MethodName.RemoveChild, this); + Target = null; + _targetPoolItem = null; + } + + public void OnLeavePool() + { + ClearPoints(); + _time = 0; + ZIndex = 0; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0001.cs b/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0001.cs index ff7ca48..31908e4 100644 --- a/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0001.cs +++ b/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0001.cs @@ -22,14 +22,14 @@ { var frameCount = AnimatedSprite.SpriteFrames.GetFrameCount(AnimatorNames.Default); AnimatedSprite.Frame = Utils.Random.RandomRangeInt(0, frameCount - 1); - + Throw( Utils.Random.RandomRangeInt(0, 16), Utils.Random.RandomRangeInt(10, 60), new Vector2(Utils.Random.RandomRangeInt(-25, 25), Utils.Random.RandomRangeInt(-25, 25)), Utils.Random.RandomRangeInt(-360, 360) ); - + StartCoroutine(EmitParticles()); _brushData = LiquidBrushManager.GetBrush("0003"); } diff --git a/DungeonShooting_Godot/src/game/event/EventEnum.cs b/DungeonShooting_Godot/src/game/event/EventEnum.cs index b08d418..afe09d8 100644 --- a/DungeonShooting_Godot/src/game/event/EventEnum.cs +++ b/DungeonShooting_Godot/src/game/event/EventEnum.cs @@ -47,6 +47,10 @@ /// OnPlayerMaxShieldChange, /// + /// 玩家金币发生改变, 参数为玩家金币值 + /// + OnPlayerGoldChange, + /// /// 玩家拾起武器, 参数为 /// OnPlayerPickUpWeapon, @@ -80,17 +84,21 @@ /// OnCreateGroupFinish, /// + /// 删除地牢组完成时调用, 参数为 + /// + OnDeleteGroupFinish, + /// /// 创建地牢房间完成时调用, 参数为 /// OnCreateRoomFinish, /// /// 标记房间数据脏了, 也就是数据有修改 /// - OnEditorDirty, + OnTileMapDirty, /// /// 编辑器触发保存, 参数为> /// - OnEditorSave, + OnTileMapSave, /// /// 选中拖拽工具 /// @@ -147,4 +155,61 @@ /// 设置标记显示状态, 参数 /// OnSetMarkVisible, + /// + /// 选中TileMap编辑器中的层级, 参数为选择的层级索引, 参数 + /// + OnSelectTileLayer, + + /// + /// 保存TileSet, 参数为 + /// + OnTileSetSave, + /// + /// 标记TileSet脏了, 无参数 + /// + OnTileSetDirty, + /// + /// 创建TileSet资源, 参数为 + /// + OnCreateTileSetSource, + /// + /// 选中TileSet资源, 参数为, 参数为 null 表示取消选中 + /// + OnSelectTileSetSource, + /// + /// 删除TileSet资源, 参数为 + /// + OnDeleteTileSetSource, + /// + /// 设置TileSet纹理, 参数 + /// + OnSetTileTexture, + /// + /// 设置TileSet编辑器的背景颜色, 参数为 + /// + OnSetTileSetBgColor, + /// + /// 选中组合模式下的Cell图块, 参数为 + /// + OnSelectCombinationCell, + /// + /// 移除组合模式下的Cell图块, 参数为 + /// + OnRemoveCombinationCell, + /// + /// 清除组合模式下的Cell图块 + /// + OnClearCombinationCell, + /// + /// 导入组合, 参数为 + /// + OnImportCombination, + /// + /// 移除组合, 参数为 + /// + OnRemoveCombination, + /// + /// 修改组合名称, 参数为 + /// + OnUpdateCombination, } diff --git a/DungeonShooting_Godot/src/game/hall/DungeonEntrance.cs b/DungeonShooting_Godot/src/game/hall/DungeonEntrance.cs new file mode 100644 index 0000000..65a156c --- /dev/null +++ b/DungeonShooting_Godot/src/game/hall/DungeonEntrance.cs @@ -0,0 +1,38 @@ +using Godot; + +/// +/// 地牢入口节点 +/// +public partial class DungeonEntrance : Area2D +{ + public override void _Ready() + { + BodyEntered += OnBodyEntered; + } + + private void OnBodyEntered(Node2D body) + { + if (body is Player) + { + // 验证该组是否满足生成地牢的条件 + var config = GameApplication.Instance.DungeonConfig; + var result = DungeonManager.CheckDungeon(config.GroupName); + if (result.HasError) + { + UiManager.Destroy_Loading(); + EditorWindowManager.ShowTips("警告", "当前组'" + config.GroupName + "'" + result.ErrorMessage + ", 不能生成地牢!"); + } + else + { + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.ExitHall(true, () => + { + GameApplication.Instance.DungeonManager.LoadDungeon(config, () => + { + UiManager.Destroy_Loading(); + }); + }); + } + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/hall/Hall.cs b/DungeonShooting_Godot/src/game/hall/Hall.cs new file mode 100644 index 0000000..e8ffde4 --- /dev/null +++ b/DungeonShooting_Godot/src/game/hall/Hall.cs @@ -0,0 +1,22 @@ + +using Godot; + +/// +/// 游戏大厅 +/// +public partial class Hall : World +{ + /// + /// 玩家出生标记 + /// + [Export] + public Marker2D BirthMark; + + [Export] + public Sprite2D BgSprite; + + /// + /// 房间数据, 该数据时虚拟出来的, 并不是配置文件读取出来的 + /// + public RoomInfo RoomInfo { get; set; } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/DragUiManager.cs b/DungeonShooting_Godot/src/game/manager/DragUiManager.cs deleted file mode 100644 index e6f25ec..0000000 --- a/DungeonShooting_Godot/src/game/manager/DragUiManager.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using Godot; - -public static class DragUiManager -{ - private static readonly List _list = new List(); - private static readonly List _removeList = new List(); - private static readonly List _addList = new List(); - - public static DragBinder BindDrag(Control control, Action callback) - { - var binder = new DragBinder(); - binder.Control = control; - control.MouseEntered += binder.OnMouseEntered; - control.MouseExited += binder.OnMouseExited; - binder.Callback = callback; - _addList.Add(binder); - return binder; - } - - public static void UnBindDrag(DragBinder binder) - { - if (!_removeList.Contains(binder)) - { - _removeList.Add(binder); - } - } - - public static void Update(float delta) - { - //更新拖拽位置 - if (_list.Count > 0) - { - foreach (var dragBinder in _list) - { - if (dragBinder.Dragging && !Input.IsMouseButtonPressed(MouseButton.Left)) //松开鼠标, 结束拖拽 - { - dragBinder.Dragging = false; - dragBinder.Callback(DragState.DragEnd, Vector2.Zero); - } - else if (!dragBinder.Dragging) //开始拖拽 - { - if (dragBinder.MouseEntered && Input.IsMouseButtonPressed(MouseButton.Left)) - { - dragBinder.Dragging = true; - dragBinder.PrevPosition = dragBinder.Control.GetGlobalMousePosition(); - dragBinder.Callback(DragState.DragStart, Vector2.Zero); - } - } - else //拖拽更新 - { - var mousePos = dragBinder.Control.GetGlobalMousePosition(); - if (mousePos != dragBinder.PrevPosition) - { - var deltaPosition = mousePos - dragBinder.PrevPosition; - dragBinder.PrevPosition = mousePos; - dragBinder.Callback(DragState.DragMove, deltaPosition); - } - } - } - } - - //移除绑定 - if (_removeList.Count > 0) - { - foreach (var binder in _removeList) - { - if (_list.Remove(binder)) - { - binder.Control.MouseEntered -= binder.OnMouseEntered; - binder.Control.MouseExited -= binder.OnMouseExited; - } - } - _removeList.Clear(); - } - - //添加绑定 - if (_addList.Count > 0) - { - _list.AddRange(_addList); - _addList.Clear(); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/EditorManager.cs b/DungeonShooting_Godot/src/game/manager/EditorManager.cs deleted file mode 100644 index e6bc977..0000000 --- a/DungeonShooting_Godot/src/game/manager/EditorManager.cs +++ /dev/null @@ -1,184 +0,0 @@ - -using System.Collections.Generic; - -public static class EditorManager -{ - /// - /// 当前使用的地牢组 - /// - public static DungeonRoomGroup SelectDungeonGroup { get; private set; } - - /// - /// 当使用的地牢房间 - /// - public static DungeonRoomSplit SelectRoom { get; private set; } - - /// - /// 当前使用的预设索引 - /// - public static int SelectPreinstallIndex { get; private set; } = -1; - - /// - /// 当前使用的预设 - /// - public static RoomPreinstallInfo SelectPreinstall - { - get - { - if (SelectPreinstallIndex < 0 || SelectPreinstallIndex >= SelectRoom.Preinstall.Count) - { - return null; - } - - return SelectRoom.Preinstall[SelectPreinstallIndex]; - } - } - - /// - /// 当前选中的波索引 - /// - public static int SelectWaveIndex { get; private set; } = -1; - - /// - /// 当前选中的波 - /// - public static List SelectWave - { - get - { - var preinstall = SelectPreinstall; - if (preinstall == null) - { - return null; - } - - if (SelectWaveIndex < 0 || SelectWaveIndex > preinstall.WaveList.Count) - { - return null; - } - - return preinstall.WaveList[SelectWaveIndex]; - } - } - - /// - /// 当前选中的标记 - /// - public static MarkInfo SelectMark { get; private set; } - - public static void SetSelectDungeonGroup(DungeonRoomGroup roomGroup) - { - if (SelectDungeonGroup != roomGroup) - { - SelectDungeonGroup = roomGroup; - EventManager.EmitEvent(EventEnum.OnSelectGroup, SelectDungeonGroup); - } - } - - public static void SetSelectRoom(DungeonRoomSplit roomSplit) - { - if (!ReferenceEquals(SelectRoom, roomSplit)) - { - SelectRoom = roomSplit; - EventManager.EmitEvent(EventEnum.OnSelectRoom, SelectRoom); - } - } - - /// - /// 选中预设 - /// - /// 预设索引 - public static void SetSelectPreinstallIndex(int index) - { - if (SelectRoom == null) - { - if (SelectPreinstallIndex != -1) - { - SelectPreinstallIndex = -1; - EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); - } - } - else if (index < 0 || SelectRoom.Preinstall == null || index >= SelectRoom.Preinstall.Count) - { - if (SelectPreinstallIndex != -1) - { - SelectPreinstallIndex = -1; - EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); - } - } - else if (SelectPreinstallIndex != index) - { - SelectPreinstallIndex = index; - EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); - } - } - - /// - /// 选中波数 - /// - /// 波数索引 - public static void SetSelectWaveIndex(int index) - { - if (SelectPreinstall == null) - { - if (SelectWaveIndex != -1) - { - SelectWaveIndex = -1; - EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); - } - } - else if (SelectWaveIndex != index) - { - if (index < 0 || SelectPreinstall.WaveList == null || index >= SelectPreinstall.WaveList.Count) - { - if (SelectWaveIndex != -1) - { - SelectWaveIndex = -1; - EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); - } - } - else - { - if (SelectWaveIndex != index) - { - SelectWaveIndex = index; - EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); - } - } - } - } - - /// - /// 选中某个标记 - /// - public static void SetSelectMark(MarkInfo markInfo) - { - if (SelectMark != markInfo) - { - SelectMark = markInfo; - EventManager.EmitEvent(EventEnum.OnSelectMark, markInfo); - } - } - - /// - /// 根据 RoomErrorType 枚举获取房间错误信息 - /// - public static string GetRoomErrorTypeMessage(RoomErrorType errorType) - { - switch (errorType) - { - case RoomErrorType.None: - return ""; - case RoomErrorType.Empty: - return "房间没有绘制地块"; - case RoomErrorType.TileError: - return "房间地块存在绘制错误"; - case RoomErrorType.DoorAreaError: - return "房间至少要有两个不同方向的门区域"; - case RoomErrorType.NoPreinstallError: - return "房间没有预设"; - } - - return null; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/EditorPlayManager.cs b/DungeonShooting_Godot/src/game/manager/EditorPlayManager.cs index e9d9088..1fdf611 100644 --- a/DungeonShooting_Godot/src/game/manager/EditorPlayManager.cs +++ b/DungeonShooting_Godot/src/game/manager/EditorPlayManager.cs @@ -6,10 +6,10 @@ /// /// 是否正在播放 /// - public static bool IsPlay { get; private set; } + public static bool IsPlay { get; set; } private static DungeonConfig _config; - + public static void Play(UiBase prevUi) { if (IsPlay) @@ -19,12 +19,16 @@ IsPlay = true; _config = new DungeonConfig(); - _config.GroupName = EditorManager.SelectDungeonGroup.GroupName; - _config.DesignatedType = EditorManager.SelectRoom.RoomInfo.RoomType; + _config.GroupName = EditorTileMapManager.SelectDungeonGroup.GroupName; + _config.DesignatedType = EditorTileMapManager.SelectRoom.RoomInfo.RoomType; _config.DesignatedRoom = new List(); - _config.DesignatedRoom.Add(EditorManager.SelectRoom); - GameApplication.Instance.DungeonManager.EditorPlayDungeon(prevUi, _config); - } + _config.DesignatedRoom.Add(EditorTileMapManager.SelectRoom); + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.EditorPlayDungeon(prevUi, _config, () => + { + UiManager.Destroy_Loading(); + }); +} public static void Exit() { @@ -34,7 +38,11 @@ } IsPlay = false; - GameApplication.Instance.DungeonManager.EditorExitDungeon(); + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.EditorExitDungeon(false, () => + { + UiManager.Destroy_Loading(); + }); } public static void Restart() @@ -43,10 +51,13 @@ { return; } - - GameApplication.Instance.DungeonManager.ExitDungeon(() => + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.ExitDungeon(false, () => { - GameApplication.Instance.DungeonManager.EditorPlayDungeon(_config); + GameApplication.Instance.DungeonManager.EditorPlayDungeon(_config, () => + { + UiManager.Destroy_Loading(); + }); }); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/EditorTileMapManager.cs b/DungeonShooting_Godot/src/game/manager/EditorTileMapManager.cs new file mode 100644 index 0000000..067c83e --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/EditorTileMapManager.cs @@ -0,0 +1,184 @@ + +using System.Collections.Generic; + +public static class EditorTileMapManager +{ + /// + /// 当前使用的地牢组 + /// + public static DungeonRoomGroup SelectDungeonGroup { get; private set; } + + /// + /// 当使用的地牢房间 + /// + public static DungeonRoomSplit SelectRoom { get; private set; } + + /// + /// 当前使用的预设索引 + /// + public static int SelectPreinstallIndex { get; private set; } = -1; + + /// + /// 当前使用的预设 + /// + public static RoomPreinstallInfo SelectPreinstall + { + get + { + if (SelectPreinstallIndex < 0 || SelectPreinstallIndex >= SelectRoom.Preinstall.Count) + { + return null; + } + + return SelectRoom.Preinstall[SelectPreinstallIndex]; + } + } + + /// + /// 当前选中的波索引 + /// + public static int SelectWaveIndex { get; private set; } = -1; + + /// + /// 当前选中的波 + /// + public static List SelectWave + { + get + { + var preinstall = SelectPreinstall; + if (preinstall == null) + { + return null; + } + + if (SelectWaveIndex < 0 || SelectWaveIndex > preinstall.WaveList.Count) + { + return null; + } + + return preinstall.WaveList[SelectWaveIndex]; + } + } + + /// + /// 当前选中的标记 + /// + public static MarkInfo SelectMark { get; private set; } + + public static void SetSelectDungeonGroup(DungeonRoomGroup roomGroup) + { + if (SelectDungeonGroup != roomGroup) + { + SelectDungeonGroup = roomGroup; + EventManager.EmitEvent(EventEnum.OnSelectGroup, SelectDungeonGroup); + } + } + + public static void SetSelectRoom(DungeonRoomSplit roomSplit) + { + if (!ReferenceEquals(SelectRoom, roomSplit)) + { + SelectRoom = roomSplit; + EventManager.EmitEvent(EventEnum.OnSelectRoom, SelectRoom); + } + } + + /// + /// 选中预设 + /// + /// 预设索引 + public static void SetSelectPreinstallIndex(int index) + { + if (SelectRoom == null) + { + if (SelectPreinstallIndex != -1) + { + SelectPreinstallIndex = -1; + EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); + } + } + else if (index < 0 || SelectRoom.Preinstall == null || index >= SelectRoom.Preinstall.Count) + { + if (SelectPreinstallIndex != -1) + { + SelectPreinstallIndex = -1; + EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); + } + } + else if (SelectPreinstallIndex != index) + { + SelectPreinstallIndex = index; + EventManager.EmitEvent(EventEnum.OnSelectPreinstall, SelectPreinstall); + } + } + + /// + /// 选中波数 + /// + /// 波数索引 + public static void SetSelectWaveIndex(int index) + { + if (SelectPreinstall == null) + { + if (SelectWaveIndex != -1) + { + SelectWaveIndex = -1; + EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); + } + } + else if (SelectWaveIndex != index) + { + if (index < 0 || SelectPreinstall.WaveList == null || index >= SelectPreinstall.WaveList.Count) + { + if (SelectWaveIndex != -1) + { + SelectWaveIndex = -1; + EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); + } + } + else + { + if (SelectWaveIndex != index) + { + SelectWaveIndex = index; + EventManager.EmitEvent(EventEnum.OnSelectWave, SelectWave); + } + } + } + } + + /// + /// 选中某个标记 + /// + public static void SetSelectMark(MarkInfo markInfo) + { + if (SelectMark != markInfo) + { + SelectMark = markInfo; + EventManager.EmitEvent(EventEnum.OnSelectMark, markInfo); + } + } + + /// + /// 根据 RoomErrorType 枚举获取房间错误信息 + /// + public static string GetRoomErrorTypeMessage(RoomErrorType errorType) + { + switch (errorType) + { + case RoomErrorType.None: + return ""; + case RoomErrorType.Empty: + return "房间没有绘制地块"; + case RoomErrorType.TileError: + return "房间地块存在绘制错误"; + case RoomErrorType.DoorAreaError: + return "房间至少要有两个不同方向的门区域"; + case RoomErrorType.NoPreinstallError: + return "房间没有预设"; + } + + return null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs b/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs new file mode 100644 index 0000000..430ec3b --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/EditorTileSetManager.cs @@ -0,0 +1,110 @@ + +using System.IO; +using System.Text.Json; +using Godot; + +public static class EditorTileSetManager +{ + + /// + /// 扫描路径 + /// + public static string CustomTileSetPath { get; private set; } + + private static bool _init; + + public static void Init() + { + if (_init) + { + return; + } + + _init = true; +#if TOOLS + CustomTileSetPath = GameConfig.RoomTileSetDir; +#else + CustomTileSetPath = GameConfig.RoomTileSetDir; +#endif + EventManager.AddEventListener(EventEnum.OnTileSetSave, OnTileSetSave); + } + + /// + /// 保存TileSetConfig数据 + /// + public static void SaveTileSetConfig() + { + var options = new JsonSerializerOptions(); + options.WriteIndented = true; + var jsonText = JsonSerializer.Serialize(GameApplication.Instance.TileSetConfig, options); + File.WriteAllText(GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile, jsonText); + } + + /// + /// 保存TileSetInfo数据 + /// + public static void SaveTileSetInfo(TileSetInfo tileSetInfo) + { + var dir = CustomTileSetPath + tileSetInfo.Name; + if (Directory.Exists(dir)) + { + //删除多余文件 + if (tileSetInfo.Sources == null) + { + Directory.Delete(dir, true); + Directory.CreateDirectory(dir); + } + else + { + var directoryInfo = new DirectoryInfo(dir); + var fileInfos = directoryInfo.GetFiles(); + foreach (var fileInfo in fileInfos) + { + if (fileInfo.Name.EndsWith(".png")) + { + var name = fileInfo.Name.Substring(0, fileInfo.Name.Length - 4); + if (tileSetInfo.Sources.FindIndex(info => info.Name == name) < 0) + { + fileInfo.Delete(); + } + } + } + } + } + else + { + Directory.CreateDirectory(dir); + } + + var path = dir + "/TileSet.json"; + + //保存json + var options = new JsonSerializerOptions(); + options.WriteIndented = true; + var jsonText = JsonSerializer.Serialize(tileSetInfo, options); + File.WriteAllText(path, jsonText); + + //保存资源 + if (tileSetInfo.Sources != null) + { + foreach (var sourceInfo in tileSetInfo.Sources) + { + var image = sourceInfo.GetSourceImage(); + if (image != null) + { + image.SavePng(dir + "/" + sourceInfo.Name + ".png"); + } + } + } + } + + //保存图块集 + private static void OnTileSetSave(object o) + { + if (o is TileSetSplit tileSetSplit) + { + var tileSetInfo = tileSetSplit.TileSetInfo; + SaveTileSetInfo(tileSetInfo); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs b/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs index a87a109..e64a4ef 100644 --- a/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs +++ b/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs @@ -1,19 +1,85 @@  using System; +using System.Collections; using System.Collections.Generic; +using System.IO; +using System.Linq; using Config; using Godot; +using UI.EditorColorPicker; +using UI.EditorDungeonGroup; +using UI.EditorForm; +using UI.EditorImportCombination; +using UI.EditorInfo; +using UI.EditorInput; +using UI.EditorTileImage; using UI.EditorTips; using UI.EditorWindow; -using UI.MapEditorCreateGroup; using UI.MapEditorCreateMark; using UI.MapEditorCreatePreinstall; using UI.MapEditorCreateRoom; using UI.MapEditorSelectObject; +/// +/// 通用弹窗管理类 +/// public static class EditorWindowManager { /// + /// 打开颜色选择器弹窗 + /// + /// 位置 + /// 当前选中的颜色 + /// 颜色改变时回调 + /// 关闭时回调 + public static void ShowColorPicker(Vector2 position, Color color, ColorPicker.ColorChangedEventHandler onChangeColor, Action onClose = null) + { + var window = CreateWindowInstance(); + var colorPickerPanel = window.OpenBody(UiManager.UiNames.EditorColorPicker); + window.SetWindowTitle("颜色选择器"); + window.SetWindowSize(new Vector2I(298, 720)); + window.S_Window.Instance.Position = new Vector2I((int)(position.X - 298f * 0.5f), (int)(position.Y + 80)); + colorPickerPanel.S_ColorPicker.Instance.Color = color; + colorPickerPanel.S_ColorPicker.Instance.ColorChanged += onChangeColor; + if (onClose != null) + { + window.CloseEvent += onClose; + } + } + + /// + /// 显示打开文件窗口 + /// + /// 过滤文件后缀 + /// 关闭回调, 回调参数为选择的文件路径, 如果选择文件, 则回调参数为null + public static void ShowOpenFileDialog(string[] filters, Action onClose) + { + var fileDialog = new FileDialog(); + fileDialog.UseNativeDialog = true; + fileDialog.ModeOverridesTitle = false; + fileDialog.FileMode = FileDialog.FileModeEnum.OpenFile; + fileDialog.Access = FileDialog.AccessEnum.Filesystem; + fileDialog.Filters = filters; + fileDialog.FileSelected += (path) => + { + onClose(path); + fileDialog.QueueFree(); + }; + fileDialog.Canceled += () => + { + onClose(null); + fileDialog.QueueFree(); + }; + fileDialog.Confirmed += () => + { + onClose(null); + fileDialog.QueueFree(); + }; + UiManager.GetUiLayer(UiLayer.Pop).AddChild(fileDialog); + fileDialog.Popup(); + } + + /// /// 弹出通用提示面板 /// /// 标题 @@ -45,7 +111,7 @@ /// 显示内容 /// 关闭时的回调, 参数如果为 true 表示点击了确定 /// 所属父级Ui - public static void ShowConfirm(string title, string message, Action onClose, UiBase parentUi = null) + public static EditorWindowPanel ShowConfirm(string title, string message, Action onClose, UiBase parentUi = null) { var window = CreateWindowInstance(parentUi); window.SetWindowTitle(title); @@ -66,6 +132,59 @@ ); var body = window.OpenBody(UiManager.UiNames.EditorTips); body.SetMessage(message); + return window; + } + + /// + /// 弹出延时询问窗口 + /// + /// 标题 + /// 显示内容 + /// 延时时间 + /// 关闭时的回调, 参数如果为 true 表示点击了确定 + /// 所属父级Ui + public static void ShowDelayConfirm(string title, string message, float delayTime, Action onClose, UiBase parentUi = null) + { + var window = ShowConfirm(title, message, onClose, parentUi); + if (delayTime > 0) + { + var uiCell = (CustomButtonCell)window.ButtonGrid.GetCell(0); + window.StartCoroutine(DelayTimeLabel(delayTime, uiCell.CellNode.L_Button.Instance)); + } + } + + /// + /// 弹出通用输入框 + /// + /// 标题 + /// 显示内容 + /// 输入框默认值 + /// 关闭时回调,参数1为输入框内容,参数2为 true 表示点击了确定,如果点击了确定但是回调函数返回 false 则不会关闭窗口 + /// 所属父级Ui + public static void ShowInput(string title, string message, string value, Func onClose, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle(title); + window.SetWindowSize(new Vector2I(450, 230)); + var body = window.OpenBody(UiManager.UiNames.EditorInput); + window.CloseEvent += () => + { + onClose(body.GetValue(), false); + }; + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + if (onClose(body.GetValue(), true)) + { + window.CloseWindow(false); + } + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + body.Init(message, value); } /// @@ -82,6 +201,7 @@ { var window = CreateWindowInstance(parentUi); window.SetWindowTitle(title); + window.SetWindowSize(new Vector2I(550, 350)); window.CloseEvent += () => { onClose(-1); @@ -117,17 +237,67 @@ var window = CreateWindowInstance(parentUi); window.SetWindowTitle("创建地牢组"); window.SetWindowSize(new Vector2I(700, 500)); - var body = window.OpenBody(UiManager.UiNames.MapEditorCreateGroup); + var body = window.OpenBody(UiManager.UiNames.EditorDungeonGroup); window.SetButtonList( new EditorWindowPanel.ButtonData("确定", () => { //获取填写的数据, 并创建ui - var groupInfo = body.GetGroupInfo(); - if (groupInfo != null) + var infoData = body.GetData(); + //组名 + var groupName = infoData.Name; + + //检查名称是否合规 + if (string.IsNullOrEmpty(groupName)) { - window.CloseWindow(); - onCreateGroup(groupInfo); + ShowTips("错误", "组名称不能为空!"); + return; } + + //验证是否有同名组 + var path = MapProjectManager.CustomMapPath + groupName; + var dir = new DirectoryInfo(path); + if (dir.Exists && dir.GetDirectories().Length > 0) + { + ShowTips("错误", $"已经有相同路径的房间了!"); + return; + } + + var group = new DungeonRoomGroup(); + group.GroupName = groupName; + group.TileSet = infoData.TileSet; + group.Remark = infoData.Remark; + window.CloseWindow(); + onCreateGroup(group); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 打开创建地牢组弹窗 + /// + /// 原数据 + /// 提交时回调 + /// 所属父级Ui + public static void ShowEditGroup(DungeonRoomGroup group, Action onEditGroup, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("编辑地牢组"); + window.SetWindowSize(new Vector2I(700, 500)); + var body = window.OpenBody(UiManager.UiNames.EditorDungeonGroup); + body.InitData(group); + body.SetEditMode(); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + var infoData = body.GetData(); + group.Remark = infoData.Remark; + group.TileSet = infoData.TileSet; + window.CloseWindow(); + onEditGroup(group); }), new EditorWindowPanel.ButtonData("取消", () => { @@ -367,7 +537,303 @@ }; } - private static EditorWindowPanel CreateWindowInstance(UiBase parentUi) + /// + /// 显示导入组合确认弹窗 + /// + /// 组合名称 + /// 预览纹理背景颜色 + /// 显示纹理 + /// 确定时回调 + /// 取消时回调 + /// 所属父级Ui + public static void ShowImportCombination(string showName, Color color, Texture2D texture, Action onAccept, Action onCancel, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.S_Window.Instance.Size = new Vector2I(750, 650); + window.SetWindowTitle("导入组合"); + var body = window.OpenBody(UiManager.UiNames.EditorImportCombination); + body.InitData(showName, color, texture); + var accept = false; + if (onCancel != null) + { + window.CloseEvent += () => + { + if (!accept) onCancel(); + }; + } + + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + accept = true; + var selectObject = body.GetName(); + window.CloseWindow(); + onAccept(selectObject); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示编辑组合弹窗 + /// + /// 组合名称 + /// 预览纹理背景颜色 + /// 显示纹理 + /// 确定时回调 + /// 删除时回调 + /// 所属父级Ui + public static void ShowEditCombination(string showName, Color color, Texture2D texture, Action onAccept, Action onDelete, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.S_Window.Instance.Size = new Vector2I(750, 650); + window.SetWindowTitle("编辑组合"); + var body = window.OpenBody(UiManager.UiNames.EditorImportCombination); + body.InitData(showName, color, texture); + window.SetButtonList( + new EditorWindowPanel.ButtonData("删除", () => + { + ShowConfirm("提示", "您确定要删除该组合吗,该操作不能取消!", (flag) => + { + if (flag) + { + window.CloseWindow(); + onDelete(); + } + }, window); + }), + new EditorWindowPanel.ButtonData("保存", () => + { + var selectObject = body.GetName(); + window.CloseWindow(); + onAccept(selectObject); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示创建TileSet的面板 + /// + /// 创建完成回调, 第一个参数为TileSet名称, 第二个参数数据数据 + /// 所属父级Ui + public static void ShowCreateTileSet(Action onCreateTileSet, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("创建TileSet"); + window.SetWindowSize(new Vector2I(700, 500)); + var body = window.OpenBody(UiManager.UiNames.EditorInfo); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + //获取填写的数据, 并创建ui + var infoData = body.GetInfoData(); + //名称 + var name = infoData.Name; + + //检查名称是否合规 + if (string.IsNullOrEmpty(name)) + { + ShowTips("错误", "名称不能为空!"); + return; + } + + //验证是否有同名组 + var path = EditorTileSetManager.CustomTileSetPath + name; + var dir = new DirectoryInfo(path); + if (dir.Exists && dir.GetFiles().Length > 0) + { + ShowTips("错误", $"已经有相同名称的TileSet了!"); + return; + } + + var tileSetSplit = new TileSetSplit(); + tileSetSplit.Remark = infoData.Remark; + tileSetSplit.Path = EditorTileSetManager.CustomTileSetPath + name; + window.CloseWindow(); + onCreateTileSet(infoData.Name, tileSetSplit); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示编辑TileSet的面板 + /// + /// 原数据 + /// 创建完成回调, 第一个参数为TileSet名称, 第二个参数数据数据 + /// 所属父级Ui + public static void ShowEditTileSet(TileSetSplit tileSetSplit, Action onCreateTileSet, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("编辑TileSet"); + window.SetWindowSize(new Vector2I(700, 500)); + var body = window.OpenBody(UiManager.UiNames.EditorInfo); + body.InitData(new EditorInfoData(tileSetSplit.TileSetInfo.Name, tileSetSplit.Remark)); + body.SetNameInputEnable(false); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + //获取填写的数据, 并创建ui + var infoData = body.GetInfoData(); + tileSetSplit.Remark = infoData.Remark; + window.CloseWindow(); + onCreateTileSet(tileSetSplit); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示创建地形的面板 + /// + /// 创建地形时所在的TileSource + /// 创建完成回调 + /// 所属父级Ui + public static void ShowCreateTerrain(TileSetSourceInfo sourceInfo, Action onCreate, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("创建Terrain"); + window.SetWindowSize(new Vector2I(600, 350)); + var body = window.OpenBody(UiManager.UiNames.EditorForm); + + //第一项 + var item1 = new FormItemData("地形名称", new LineEdit() + { + PlaceholderText = "请输入名称" + }); + //第二项 + var option = new OptionButton(); + option.AddItem("3x3掩码(47格)"); + option.AddItem("2x2掩码(13格)"); + option.Selected = 0; + var item2 = new FormItemData("掩码类型", option); + + body.AddItem(item1); + body.AddItem(item2); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + var text = item1.UiNode.Text; + if (string.IsNullOrEmpty(text)) + { + ShowTips("错误", $"名称不允许为空!"); + return; + } + + if (sourceInfo.Terrain.FindIndex(info => info.Name == text) >= 0) + { + ShowTips("错误", $"已经有相同名称的Terrain了!"); + return; + } + + var terrainInfo = new TileSetTerrainInfo(); + terrainInfo.InitData(); + terrainInfo.Name = text; + terrainInfo.TerrainType = (byte)option.Selected; + + window.CloseWindow(); + onCreate(terrainInfo); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示编辑地形的MainBu + /// + /// 创建地形时所在的TileSource + /// 创建完成回调 + /// 所属父级Ui + public static void ShowEditTerrain(TileSetSourceInfo sourceInfo, Action onCreate, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("创建Terrain"); + window.SetWindowSize(new Vector2I(600, 350)); + var body = window.OpenBody(UiManager.UiNames.EditorForm); + + //第一项 + var item1 = new FormItemData("地形名称", new LineEdit() + { + PlaceholderText = "请输入名称" + }); + //第二项 + var option = new OptionButton(); + option.AddItem("3x3掩码(47格)"); + option.AddItem("2x2掩码(13格)"); + option.Selected = 0; + var item2 = new FormItemData("掩码类型", option); + + body.AddItem(item1); + body.AddItem(item2); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + var text = item1.UiNode.Text; + if (sourceInfo.Terrain.FindIndex(info => info.Name == text) >= 0) + { + ShowTips("错误", $"已经有相同名称的Terrain了!"); + return; + } + + var terrainInfo = new TileSetTerrainInfo(); + terrainInfo.InitData(); + terrainInfo.Name = text; + terrainInfo.TerrainType = (byte)option.Selected; + + window.CloseWindow(); + onCreate(terrainInfo); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + /// + /// 显示导入纹理的面板 + /// + /// 初始纹理 + /// 点击确定后的回调 + /// 所属父级Ui + public static void ShowImportTileImage(Image image, Action onCreate, UiBase parentUi = null) + { + var window = CreateWindowInstance(parentUi); + window.SetWindowTitle("导入纹理"); + window.SetWindowSize(new Vector2I(1400, 800)); + var body = window.OpenBody(UiManager.UiNames.EditorTileImage); + body.InitData(image); + window.SetButtonList( + new EditorWindowPanel.ButtonData("确定", () => + { + var img = body.GetImage(); + window.CloseWindow(); + onCreate(img); + }), + new EditorWindowPanel.ButtonData("取消", () => + { + window.CloseWindow(); + }) + ); + } + + private static EditorWindowPanel CreateWindowInstance(UiBase parentUi = null) { if (parentUi != null) { @@ -376,4 +842,18 @@ return UiManager.Open_EditorWindow(); } + + private static IEnumerator DelayTimeLabel(float time, Button button) + { + var text = button.Text; + button.Disabled = true; + for (float i = time; i >= 0; i -= 1) + { + button.Text = $"{text}({(int)i}秒)"; + yield return new WaitForSeconds(1); + } + + button.Text = text; + button.Disabled = false; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/FireManager.cs b/DungeonShooting_Godot/src/game/manager/FireManager.cs index 65e7fa8..375765e 100644 --- a/DungeonShooting_Godot/src/game/manager/FireManager.cs +++ b/DungeonShooting_Godot/src/game/manager/FireManager.cs @@ -272,6 +272,7 @@ BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), LifeTime = Utils.Random.RandomConfigRange(bullet.LifeTimeRange), Position = weapon.FirePoint.GlobalPosition, + FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), }; var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); diff --git a/DungeonShooting_Godot/src/game/manager/InputManager.cs b/DungeonShooting_Godot/src/game/manager/InputManager.cs index 5442ed0..0025645 100644 --- a/DungeonShooting_Godot/src/game/manager/InputManager.cs +++ b/DungeonShooting_Godot/src/game/manager/InputManager.cs @@ -86,24 +86,24 @@ /// public static void Update(float delta) { - MoveAxis = Input.GetVector("move_left", "move_right", "move_up", "move_down"); + MoveAxis = Input.GetVector(InputAction.MoveLeft, InputAction.MoveRight, InputAction.MoveUp, InputAction.MoveDown); var application = GameApplication.Instance; if (application != null) { CursorPosition = application.GlobalToViewPosition(application.GetGlobalMousePosition()); } - ExchangeWeapon = Input.IsActionJustPressed("exchangeWeapon"); - ThrowWeapon = Input.IsActionJustPressed("throwWeapon"); - Interactive = Input.IsActionJustPressed("interactive"); - Reload = Input.IsActionJustPressed("reload"); - Fire = Input.IsActionPressed("fire"); - MeleeAttack = Input.IsActionJustPressed("meleeAttack"); - Roll = Input.IsActionJustPressed("roll"); - UseActiveProp = Input.IsActionJustPressed("useActiveProp"); - RemoveProp = Input.IsActionJustPressed("removeProp"); - ExchangeProp = Input.IsActionJustPressed("exchangeProp"); - Map = Input.IsActionPressed("map"); - Menu = Input.IsActionJustPressed("menu"); + ExchangeWeapon = Input.IsActionJustPressed(InputAction.ExchangeWeapon); + ThrowWeapon = Input.IsActionJustPressed(InputAction.ThrowWeapon); + Interactive = Input.IsActionJustPressed(InputAction.Interactive); + Reload = Input.IsActionJustPressed(InputAction.Reload); + Fire = Input.IsActionPressed(InputAction.Fire); + MeleeAttack = Input.IsActionJustPressed(InputAction.MeleeAttack); + Roll = Input.IsActionJustPressed(InputAction.Roll); + UseActiveProp = Input.IsActionJustPressed(InputAction.UseActiveProp); + RemoveProp = Input.IsActionJustPressed(InputAction.RemoveProp); + ExchangeProp = Input.IsActionJustPressed(InputAction.ExchangeProp); + Map = Input.IsActionPressed(InputAction.Map); + Menu = Input.IsActionJustPressed(InputAction.Menu); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/MapLayerManager.cs b/DungeonShooting_Godot/src/game/manager/MapLayerManager.cs new file mode 100644 index 0000000..047f359 --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/MapLayerManager.cs @@ -0,0 +1,62 @@ + +using Godot; + +public static class MapLayerManager +{ + public static void InitMapLayer(TileMap tileMap) + { + //删除之前的层级 + var layersCount = tileMap.GetLayersCount(); + for (var i = layersCount - 1; i > 0; i--) + { + tileMap.RemoveLayer(layersCount); + } + tileMap.AddLayer(MapLayer.AutoFloorLayer); + tileMap.SetLayerZIndex(MapLayer.AutoFloorLayer, -10); + tileMap.SetLayerNavigationEnabled(MapLayer.AutoFloorLayer, false); + tileMap.SetLayerName(MapLayer.AutoFloorLayer, nameof(MapLayer.AutoFloorLayer)); + + tileMap.AddLayer(MapLayer.CustomFloorLayer1); + tileMap.SetLayerZIndex(MapLayer.CustomFloorLayer1, -10); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomFloorLayer1, false); + tileMap.SetLayerName(MapLayer.CustomFloorLayer1, nameof(MapLayer.CustomFloorLayer1)); + + tileMap.AddLayer(MapLayer.CustomFloorLayer2); + tileMap.SetLayerZIndex(MapLayer.CustomFloorLayer2, -10); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomFloorLayer2, false); + tileMap.SetLayerName(MapLayer.CustomFloorLayer2, nameof(MapLayer.CustomFloorLayer2)); + + tileMap.AddLayer(MapLayer.CustomFloorLayer3); + tileMap.SetLayerZIndex(MapLayer.CustomFloorLayer3, -10); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomFloorLayer3, false); + tileMap.SetLayerName(MapLayer.CustomFloorLayer3, nameof(MapLayer.CustomFloorLayer3)); + + tileMap.AddLayer(MapLayer.AutoMiddleLayer); + tileMap.SetLayerZIndex(MapLayer.AutoMiddleLayer, 2); + tileMap.SetLayerNavigationEnabled(MapLayer.AutoMiddleLayer, false); + tileMap.SetLayerYSortEnabled(MapLayer.AutoMiddleLayer, true); + tileMap.SetLayerName(MapLayer.AutoMiddleLayer, nameof(MapLayer.AutoMiddleLayer)); + + tileMap.AddLayer(MapLayer.CustomMiddleLayer1); + tileMap.SetLayerZIndex(MapLayer.CustomMiddleLayer1, 2); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomMiddleLayer1, false); + tileMap.SetLayerYSortEnabled(MapLayer.CustomMiddleLayer1, true); + tileMap.SetLayerName(MapLayer.CustomMiddleLayer1, nameof(MapLayer.CustomMiddleLayer1)); + + tileMap.AddLayer(MapLayer.CustomMiddleLayer2); + tileMap.SetLayerZIndex(MapLayer.CustomMiddleLayer2, 2); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomMiddleLayer2, false); + tileMap.SetLayerYSortEnabled(MapLayer.CustomMiddleLayer2, true); + tileMap.SetLayerName(MapLayer.CustomMiddleLayer2, nameof(MapLayer.CustomMiddleLayer2)); + + tileMap.AddLayer(MapLayer.AutoTopLayer); + tileMap.SetLayerZIndex(MapLayer.AutoTopLayer, 10); + tileMap.SetLayerNavigationEnabled(MapLayer.AutoTopLayer, false); + tileMap.SetLayerName(MapLayer.AutoTopLayer, nameof(MapLayer.AutoTopLayer)); + + tileMap.AddLayer(MapLayer.CustomTopLayer); + tileMap.SetLayerZIndex(MapLayer.CustomTopLayer, 10); + tileMap.SetLayerNavigationEnabled(MapLayer.CustomTopLayer, false); + tileMap.SetLayerName(MapLayer.CustomTopLayer, nameof(MapLayer.CustomTopLayer)); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/MapProjectManager.cs b/DungeonShooting_Godot/src/game/manager/MapProjectManager.cs index 40d59dd..42ed8cb 100644 --- a/DungeonShooting_Godot/src/game/manager/MapProjectManager.cs +++ b/DungeonShooting_Godot/src/game/manager/MapProjectManager.cs @@ -33,7 +33,7 @@ CustomMapPath = GameConfig.RoomTileDir; //CustomMapPath = ""; #endif - EventManager.AddEventListener(EventEnum.OnEditorSave, OnRoomSave); + EventManager.AddEventListener(EventEnum.OnTileMapSave, OnRoomSave); } //房间保存时回调 @@ -128,6 +128,33 @@ } /// + /// 根据名称删除地牢组 + /// + public static void DeleteGroup(string name) + { + if (GroupMap.Remove(name)) + { + try + { + //删除文件 + var path = CustomMapPath + name; + if (Directory.Exists(path)) + { + Directory.Delete(path, true); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + //将组数据保存为json + SaveGroupMap(); + //删除地牢组事件 + EventManager.EmitEvent(EventEnum.OnDeleteGroupFinish, name); + } + } + + /// /// 创建地牢房间 /// public static void CreateRoom(DungeonRoomSplit roomSplit) @@ -150,6 +177,7 @@ preinstallInfo.Name = "Preinstall1"; preinstallInfo.Weight = 100; preinstallInfo.Remark = ""; + preinstallInfo.AutoFill = true; preinstallInfo.InitWaveList(); preinstallInfo.InitSpecialMark(roomSplit.RoomInfo.RoomType); roomSplit.Preinstall.Add(preinstallInfo); diff --git a/DungeonShooting_Godot/src/game/manager/NameManager.cs b/DungeonShooting_Godot/src/game/manager/NameManager.cs deleted file mode 100644 index e823f5b..0000000 --- a/DungeonShooting_Godot/src/game/manager/NameManager.cs +++ /dev/null @@ -1,36 +0,0 @@ - -public class NameManager -{ - /// - /// 获取物体属性名称字符串 - /// - public static string GetActivityTypeName(int type) - { - switch ((ActivityType)type) - { - case ActivityType.None: - return ""; - case ActivityType.Test: - return "测试"; - case ActivityType.Role: - case ActivityType.Player: - return "角色"; - case ActivityType.Enemy: - return "敌人"; - case ActivityType.Weapon: - return "武器"; - case ActivityType.Bullet: - return "子弹"; - case ActivityType.Shell: - return "弹壳"; - case ActivityType.Effect: - return "特效"; - case ActivityType.Prop: - return "道具"; - case ActivityType.Other: - return "其他"; - } - - return ""; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/ObjectManager.cs b/DungeonShooting_Godot/src/game/manager/ObjectManager.cs index 27206a3..fc62066 100644 --- a/DungeonShooting_Godot/src/game/manager/ObjectManager.cs +++ b/DungeonShooting_Godot/src/game/manager/ObjectManager.cs @@ -51,6 +51,18 @@ return item; } + public static T GetActivityObject(string id) where T : ActivityObject, IPoolItem + { + var item = ObjectPool.GetItem(id); + if (item == null) + { + item = ActivityObject.Create(id); + item.Logotype = id; + } + + return item; + } + public static Bullet GetBullet(string id) { var bullet = ObjectPool.GetItem(id); diff --git a/DungeonShooting_Godot/src/game/manager/ResourceManager.cs b/DungeonShooting_Godot/src/game/manager/ResourceManager.cs index 97facb8..89a8e0d 100644 --- a/DungeonShooting_Godot/src/game/manager/ResourceManager.cs +++ b/DungeonShooting_Godot/src/game/manager/ResourceManager.cs @@ -182,6 +182,10 @@ { return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_BirthMark_png); } + else if (markInfo.SpecialMarkType == SpecialMarkType.OutPoint) //出口标记 + { + return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_BirthMark_png); + } else if (markInfo.MarkList != null) //普通标记 { if (markInfo.MarkList.Count > 1) //多个物体 @@ -191,9 +195,13 @@ else if (markInfo.MarkList.Count == 1) //单个物体 { var id = markInfo.MarkList[0].Id; - if (id != null && ExcelConfig.ActivityBase_Map.TryGetValue(id, out var activityBase)) + if (id != null) { - return LoadTexture2D(activityBase.Icon); + var activityBase = PreinstallMarkManager.GetMarkConfig(id); + if (activityBase != null) + { + return LoadTexture2D(activityBase.Icon); + } } } } diff --git a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs index 6472a8d..4860057 100644 --- a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs +++ b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs @@ -3,426 +3,530 @@ /// public class ResourcePath { - public const string default_bus_layout_tres = "res://default_bus_layout.tres"; - public const string default_env_tres = "res://default_env.tres"; public const string icon_png = "res://icon.png"; - public const string excel_DungeonShooting_ExcelTool_deps_json = "res://excel/DungeonShooting_ExcelTool.deps.json"; - public const string excel_DungeonShooting_ExcelTool_runtimeconfig_json = "res://excel/DungeonShooting_ExcelTool.runtimeconfig.json"; + public const string default_env_tres = "res://default_env.tres"; + public const string default_bus_layout_tres = "res://default_bus_layout.tres"; public const string prefab_Cursor_tscn = "res://prefab/Cursor.tscn"; - public const string prefab_bullet_explode_Explode0001_tscn = "res://prefab/bullet/explode/Explode0001.tscn"; + public const string prefab_ui_Main_tscn = "res://prefab/ui/Main.tscn"; + public const string prefab_ui_TileSetEditorCombination_tscn = "res://prefab/ui/TileSetEditorCombination.tscn"; + public const string prefab_ui_MapEditorMapTile_tscn = "res://prefab/ui/MapEditorMapTile.tscn"; + public const string prefab_ui_MapEditorMapLayer_tscn = "res://prefab/ui/MapEditorMapLayer.tscn"; + public const string prefab_ui_MapEditor_tscn = "res://prefab/ui/MapEditor.tscn"; + public const string prefab_ui_PauseMenu_tscn = "res://prefab/ui/PauseMenu.tscn"; + public const string prefab_ui_MapEditorMapMark_tscn = "res://prefab/ui/MapEditorMapMark.tscn"; + public const string prefab_ui_MapEditorCreateMark_tscn = "res://prefab/ui/MapEditorCreateMark.tscn"; + public const string prefab_ui_MapEditorCreateRoom_tscn = "res://prefab/ui/MapEditorCreateRoom.tscn"; + public const string prefab_ui_EditorImportCombination_tscn = "res://prefab/ui/EditorImportCombination.tscn"; + public const string prefab_ui_EditorInfo_tscn = "res://prefab/ui/EditorInfo.tscn"; + public const string prefab_ui_Debugger_tscn = "res://prefab/ui/Debugger.tscn"; + public const string prefab_ui_MapEditorCreatePreinstall_tscn = "res://prefab/ui/MapEditorCreatePreinstall.tscn"; + public const string prefab_ui_BottomTips_tscn = "res://prefab/ui/BottomTips.tscn"; + public const string prefab_ui_EditorTileImage_tscn = "res://prefab/ui/EditorTileImage.tscn"; + public const string prefab_ui_EditorDungeonGroup_tscn = "res://prefab/ui/EditorDungeonGroup.tscn"; + public const string prefab_ui_EditorForm_tscn = "res://prefab/ui/EditorForm.tscn"; + public const string prefab_ui_Setting_tscn = "res://prefab/ui/Setting.tscn"; + public const string prefab_ui_Loading_tscn = "res://prefab/ui/Loading.tscn"; + public const string prefab_ui_MapEditorTools_tscn = "res://prefab/ui/MapEditorTools.tscn"; + public const string prefab_ui_TileSetEditor_tscn = "res://prefab/ui/TileSetEditor.tscn"; + public const string prefab_ui_EditorWindow_tscn = "res://prefab/ui/EditorWindow.tscn"; + public const string prefab_ui_EditorInput_tscn = "res://prefab/ui/EditorInput.tscn"; + public const string prefab_ui_RoomMap_tscn = "res://prefab/ui/RoomMap.tscn"; + public const string prefab_ui_EditorTools_tscn = "res://prefab/ui/EditorTools.tscn"; + public const string prefab_ui_TileSetEditorImport_tscn = "res://prefab/ui/TileSetEditorImport.tscn"; + public const string prefab_ui_MapEditorSelectObject_tscn = "res://prefab/ui/MapEditorSelectObject.tscn"; + public const string prefab_ui_Settlement_tscn = "res://prefab/ui/Settlement.tscn"; + public const string prefab_ui_MapEditorProject_tscn = "res://prefab/ui/MapEditorProject.tscn"; + public const string prefab_ui_TileSetEditorProject_tscn = "res://prefab/ui/TileSetEditorProject.tscn"; + public const string prefab_ui_EditorManager_tscn = "res://prefab/ui/EditorManager.tscn"; + public const string prefab_ui_EditorTips_tscn = "res://prefab/ui/EditorTips.tscn"; + public const string prefab_ui_TileSetEditorTerrain_tscn = "res://prefab/ui/TileSetEditorTerrain.tscn"; + public const string prefab_ui_EditorColorPicker_tscn = "res://prefab/ui/EditorColorPicker.tscn"; + public const string prefab_ui_RoomUI_tscn = "res://prefab/ui/RoomUI.tscn"; + public const string prefab_prop_PropTemplate_tscn = "res://prefab/prop/PropTemplate.tscn"; + public const string prefab_prop_buff_BuffProp0003_tscn = "res://prefab/prop/buff/BuffProp0003.tscn"; + public const string prefab_prop_buff_BuffProp0014_tscn = "res://prefab/prop/buff/BuffProp0014.tscn"; + public const string prefab_prop_buff_BuffProp0002_tscn = "res://prefab/prop/buff/BuffProp0002.tscn"; + public const string prefab_prop_buff_BuffProp0009_tscn = "res://prefab/prop/buff/BuffProp0009.tscn"; + public const string prefab_prop_buff_BuffProp0005_tscn = "res://prefab/prop/buff/BuffProp0005.tscn"; + public const string prefab_prop_buff_BuffProp0013_tscn = "res://prefab/prop/buff/BuffProp0013.tscn"; + public const string prefab_prop_buff_BuffProp0012_tscn = "res://prefab/prop/buff/BuffProp0012.tscn"; + public const string prefab_prop_buff_BuffProp0004_tscn = "res://prefab/prop/buff/BuffProp0004.tscn"; + public const string prefab_prop_buff_BuffProp0008_tscn = "res://prefab/prop/buff/BuffProp0008.tscn"; + public const string prefab_prop_buff_BuffProp0011_tscn = "res://prefab/prop/buff/BuffProp0011.tscn"; + public const string prefab_prop_buff_BuffProp0007_tscn = "res://prefab/prop/buff/BuffProp0007.tscn"; + public const string prefab_prop_buff_BuffProp0006_tscn = "res://prefab/prop/buff/BuffProp0006.tscn"; + public const string prefab_prop_buff_BuffProp0010_tscn = "res://prefab/prop/buff/BuffProp0010.tscn"; + public const string prefab_prop_buff_BuffProp0001_tscn = "res://prefab/prop/buff/BuffProp0001.tscn"; + public const string prefab_prop_active_ActiveProp5001_tscn = "res://prefab/prop/active/ActiveProp5001.tscn"; + public const string prefab_prop_active_ActiveProp5000_tscn = "res://prefab/prop/active/ActiveProp5000.tscn"; + public const string prefab_weapon_Weapon0008_tscn = "res://prefab/weapon/Weapon0008.tscn"; + public const string prefab_weapon_Weapon0004_tscn = "res://prefab/weapon/Weapon0004.tscn"; + public const string prefab_weapon_Weapon0005_tscn = "res://prefab/weapon/Weapon0005.tscn"; + public const string prefab_weapon_Weapon0013_tscn = "res://prefab/weapon/Weapon0013.tscn"; + public const string prefab_weapon_Weapon0009_tscn = "res://prefab/weapon/Weapon0009.tscn"; + public const string prefab_weapon_WeaponTemplate_tscn = "res://prefab/weapon/WeaponTemplate.tscn"; + public const string prefab_weapon_Weapon0014_tscn = "res://prefab/weapon/Weapon0014.tscn"; + public const string prefab_weapon_Weapon0002_tscn = "res://prefab/weapon/Weapon0002.tscn"; + public const string prefab_weapon_Weapon0003_tscn = "res://prefab/weapon/Weapon0003.tscn"; + public const string prefab_weapon_Weapon0016_tscn = "res://prefab/weapon/Weapon0016.tscn"; + public const string prefab_weapon_Weapon0001_tscn = "res://prefab/weapon/Weapon0001.tscn"; + public const string prefab_weapon_Weapon0006_tscn = "res://prefab/weapon/Weapon0006.tscn"; + public const string prefab_weapon_Weapon0010_tscn = "res://prefab/weapon/Weapon0010.tscn"; + public const string prefab_weapon_Weapon0011_tscn = "res://prefab/weapon/Weapon0011.tscn"; + public const string prefab_weapon_Weapon0007_tscn = "res://prefab/weapon/Weapon0007.tscn"; + public const string prefab_role_Enemy0001_tscn = "res://prefab/role/Enemy0001.tscn"; + public const string prefab_role_Enemy0002_tscn = "res://prefab/role/Enemy0002.tscn"; + public const string prefab_role_Role0001_tscn = "res://prefab/role/Role0001.tscn"; + public const string prefab_role_template_RoleTemplate_tscn = "res://prefab/role/template/RoleTemplate.tscn"; + public const string prefab_role_template_EnemyTemplate_tscn = "res://prefab/role/template/EnemyTemplate.tscn"; + public const string prefab_box_TreasureBox0001_tscn = "res://prefab/box/TreasureBox0001.tscn"; + public const string prefab_test_MoveComponent_tscn = "res://prefab/test/MoveComponent.tscn"; + public const string prefab_shell_Shell0002_tscn = "res://prefab/shell/Shell0002.tscn"; + public const string prefab_shell_Shell0003_tscn = "res://prefab/shell/Shell0003.tscn"; + public const string prefab_shell_Shell0004_tscn = "res://prefab/shell/Shell0004.tscn"; + public const string prefab_shell_Shell0001_tscn = "res://prefab/shell/Shell0001.tscn"; + public const string prefab_effect_Blood_tscn = "res://prefab/effect/Blood.tscn"; + public const string prefab_effect_weapon_MeleeAttack1_tscn = "res://prefab/effect/weapon/MeleeAttack1.tscn"; + public const string prefab_effect_weapon_ShotFire0001_tscn = "res://prefab/effect/weapon/ShotFire0001.tscn"; + public const string prefab_effect_weapon_ShotFire0003_tscn = "res://prefab/effect/weapon/ShotFire0003.tscn"; + public const string prefab_effect_weapon_ShotFire0002_tscn = "res://prefab/effect/weapon/ShotFire0002.tscn"; + public const string prefab_effect_weapon_MeleeAttack2_tscn = "res://prefab/effect/weapon/MeleeAttack2.tscn"; + public const string prefab_effect_weapon_ShotFire0004_tscn = "res://prefab/effect/weapon/ShotFire0004.tscn"; + public const string prefab_effect_enemy_EnemyBlood0001_tscn = "res://prefab/effect/enemy/EnemyBlood0001.tscn"; + public const string prefab_effect_enemy_EnemyDead0001_tscn = "res://prefab/effect/enemy/EnemyDead0001.tscn"; + public const string prefab_effect_enemy_EnemyDead0002_tscn = "res://prefab/effect/enemy/EnemyDead0002.tscn"; + public const string prefab_effect_common_Effect1_tscn = "res://prefab/effect/common/Effect1.tscn"; + public const string prefab_effect_common_Trail0001_tscn = "res://prefab/effect/common/Trail0001.tscn"; + public const string prefab_effect_bullet_BulletSmoke0002_tscn = "res://prefab/effect/bullet/BulletSmoke0002.tscn"; + public const string prefab_effect_bullet_BulletDisappear0002_tscn = "res://prefab/effect/bullet/BulletDisappear0002.tscn"; + public const string prefab_effect_bullet_BulletDisappear0001_tscn = "res://prefab/effect/bullet/BulletDisappear0001.tscn"; + public const string prefab_effect_bullet_BulletSmoke0001_tscn = "res://prefab/effect/bullet/BulletSmoke0001.tscn"; + public const string prefab_map_RoomDoor_S_tscn = "res://prefab/map/RoomDoor_S.tscn"; + public const string prefab_map_RoomDoor_E_tscn = "res://prefab/map/RoomDoor_E.tscn"; + public const string prefab_map_RoomDoor_W_tscn = "res://prefab/map/RoomDoor_W.tscn"; + public const string prefab_map_RoomDoor_N_tscn = "res://prefab/map/RoomDoor_N.tscn"; public const string prefab_bullet_laser_Laser0001_tscn = "res://prefab/bullet/laser/Laser0001.tscn"; + public const string prefab_bullet_laser_Laser0002_tscn = "res://prefab/bullet/laser/Laser0002.tscn"; + public const string prefab_bullet_normal_Bullet0006_tscn = "res://prefab/bullet/normal/Bullet0006.tscn"; + public const string prefab_bullet_normal_Bullet0007_tscn = "res://prefab/bullet/normal/Bullet0007.tscn"; public const string prefab_bullet_normal_Bullet0001_tscn = "res://prefab/bullet/normal/Bullet0001.tscn"; public const string prefab_bullet_normal_Bullet0002_tscn = "res://prefab/bullet/normal/Bullet0002.tscn"; public const string prefab_bullet_normal_Bullet0003_tscn = "res://prefab/bullet/normal/Bullet0003.tscn"; public const string prefab_bullet_normal_Bullet0004_tscn = "res://prefab/bullet/normal/Bullet0004.tscn"; + public const string prefab_bullet_normal_Bullet0008_tscn = "res://prefab/bullet/normal/Bullet0008.tscn"; + public const string prefab_bullet_normal_Bullet0009_tscn = "res://prefab/bullet/normal/Bullet0009.tscn"; public const string prefab_bullet_normal_Bullet0005_tscn = "res://prefab/bullet/normal/Bullet0005.tscn"; - public const string prefab_effect_Blood_tscn = "res://prefab/effect/Blood.tscn"; - public const string prefab_effect_bullet_BulletDisappear0001_tscn = "res://prefab/effect/bullet/BulletDisappear0001.tscn"; - public const string prefab_effect_bullet_BulletDisappear0002_tscn = "res://prefab/effect/bullet/BulletDisappear0002.tscn"; - public const string prefab_effect_bullet_BulletSmoke0001_tscn = "res://prefab/effect/bullet/BulletSmoke0001.tscn"; - public const string prefab_effect_bullet_BulletSmoke0002_tscn = "res://prefab/effect/bullet/BulletSmoke0002.tscn"; - public const string prefab_effect_common_Effect1_tscn = "res://prefab/effect/common/Effect1.tscn"; - public const string prefab_effect_enemy_EnemyBlood0001_tscn = "res://prefab/effect/enemy/EnemyBlood0001.tscn"; - public const string prefab_effect_enemy_EnemyDead0001_tscn = "res://prefab/effect/enemy/EnemyDead0001.tscn"; - public const string prefab_effect_enemy_EnemyDead0002_tscn = "res://prefab/effect/enemy/EnemyDead0002.tscn"; - public const string prefab_effect_weapon_MeleeAttack1_tscn = "res://prefab/effect/weapon/MeleeAttack1.tscn"; - public const string prefab_effect_weapon_MeleeAttack2_tscn = "res://prefab/effect/weapon/MeleeAttack2.tscn"; - public const string prefab_effect_weapon_ShotFire_tscn = "res://prefab/effect/weapon/ShotFire.tscn"; - public const string prefab_effect_weapon_ShotFire2_tscn = "res://prefab/effect/weapon/ShotFire2.tscn"; - public const string prefab_effect_weapon_ShotFire3_tscn = "res://prefab/effect/weapon/ShotFire3.tscn"; - public const string prefab_map_RoomDoor_E_tscn = "res://prefab/map/RoomDoor_E.tscn"; - public const string prefab_map_RoomDoor_N_tscn = "res://prefab/map/RoomDoor_N.tscn"; - public const string prefab_map_RoomDoor_S_tscn = "res://prefab/map/RoomDoor_S.tscn"; - public const string prefab_map_RoomDoor_W_tscn = "res://prefab/map/RoomDoor_W.tscn"; - public const string prefab_prop_PropTemplate_tscn = "res://prefab/prop/PropTemplate.tscn"; - public const string prefab_prop_active_ActiveProp5000_tscn = "res://prefab/prop/active/ActiveProp5000.tscn"; - public const string prefab_prop_active_ActiveProp5001_tscn = "res://prefab/prop/active/ActiveProp5001.tscn"; - public const string prefab_prop_buff_BuffProp0001_tscn = "res://prefab/prop/buff/BuffProp0001.tscn"; - public const string prefab_prop_buff_BuffProp0002_tscn = "res://prefab/prop/buff/BuffProp0002.tscn"; - public const string prefab_prop_buff_BuffProp0003_tscn = "res://prefab/prop/buff/BuffProp0003.tscn"; - public const string prefab_prop_buff_BuffProp0004_tscn = "res://prefab/prop/buff/BuffProp0004.tscn"; - public const string prefab_prop_buff_BuffProp0005_tscn = "res://prefab/prop/buff/BuffProp0005.tscn"; - public const string prefab_prop_buff_BuffProp0006_tscn = "res://prefab/prop/buff/BuffProp0006.tscn"; - public const string prefab_prop_buff_BuffProp0007_tscn = "res://prefab/prop/buff/BuffProp0007.tscn"; - public const string prefab_prop_buff_BuffProp0008_tscn = "res://prefab/prop/buff/BuffProp0008.tscn"; - public const string prefab_prop_buff_BuffProp0009_tscn = "res://prefab/prop/buff/BuffProp0009.tscn"; - public const string prefab_prop_buff_BuffProp0010_tscn = "res://prefab/prop/buff/BuffProp0010.tscn"; - public const string prefab_prop_buff_BuffProp0011_tscn = "res://prefab/prop/buff/BuffProp0011.tscn"; - public const string prefab_prop_buff_BuffProp0012_tscn = "res://prefab/prop/buff/BuffProp0012.tscn"; - public const string prefab_prop_buff_BuffProp0013_tscn = "res://prefab/prop/buff/BuffProp0013.tscn"; - public const string prefab_prop_buff_BuffProp0014_tscn = "res://prefab/prop/buff/BuffProp0014.tscn"; - public const string prefab_role_Enemy0001_tscn = "res://prefab/role/Enemy0001.tscn"; - public const string prefab_role_Enemy0002_tscn = "res://prefab/role/Enemy0002.tscn"; - public const string prefab_role_Role0001_tscn = "res://prefab/role/Role0001.tscn"; - public const string prefab_role_template_EnemyTemplate_tscn = "res://prefab/role/template/EnemyTemplate.tscn"; - public const string prefab_role_template_RoleTemplate_tscn = "res://prefab/role/template/RoleTemplate.tscn"; - public const string prefab_shell_Shell0001_tscn = "res://prefab/shell/Shell0001.tscn"; - public const string prefab_shell_Shell0002_tscn = "res://prefab/shell/Shell0002.tscn"; - public const string prefab_shell_Shell0003_tscn = "res://prefab/shell/Shell0003.tscn"; - public const string prefab_shell_Shell0004_tscn = "res://prefab/shell/Shell0004.tscn"; - public const string prefab_test_MoveComponent_tscn = "res://prefab/test/MoveComponent.tscn"; - public const string prefab_ui_BottomTips_tscn = "res://prefab/ui/BottomTips.tscn"; - public const string prefab_ui_Debugger_tscn = "res://prefab/ui/Debugger.tscn"; - public const string prefab_ui_EditorTips_tscn = "res://prefab/ui/EditorTips.tscn"; - public const string prefab_ui_EditorTools_tscn = "res://prefab/ui/EditorTools.tscn"; - public const string prefab_ui_EditorWindow_tscn = "res://prefab/ui/EditorWindow.tscn"; - public const string prefab_ui_Loading_tscn = "res://prefab/ui/Loading.tscn"; - public const string prefab_ui_Main_tscn = "res://prefab/ui/Main.tscn"; - public const string prefab_ui_MapEditor_tscn = "res://prefab/ui/MapEditor.tscn"; - public const string prefab_ui_MapEditorCreateGroup_tscn = "res://prefab/ui/MapEditorCreateGroup.tscn"; - public const string prefab_ui_MapEditorCreateMark_tscn = "res://prefab/ui/MapEditorCreateMark.tscn"; - public const string prefab_ui_MapEditorCreatePreinstall_tscn = "res://prefab/ui/MapEditorCreatePreinstall.tscn"; - public const string prefab_ui_MapEditorCreateRoom_tscn = "res://prefab/ui/MapEditorCreateRoom.tscn"; - public const string prefab_ui_MapEditorMapLayer_tscn = "res://prefab/ui/MapEditorMapLayer.tscn"; - public const string prefab_ui_MapEditorMapMark_tscn = "res://prefab/ui/MapEditorMapMark.tscn"; - public const string prefab_ui_MapEditorProject_tscn = "res://prefab/ui/MapEditorProject.tscn"; - public const string prefab_ui_MapEditorSelectObject_tscn = "res://prefab/ui/MapEditorSelectObject.tscn"; - public const string prefab_ui_MapEditorTileSet_tscn = "res://prefab/ui/MapEditorTileSet.tscn"; - public const string prefab_ui_MapEditorTools_tscn = "res://prefab/ui/MapEditorTools.tscn"; - public const string prefab_ui_PauseMenu_tscn = "res://prefab/ui/PauseMenu.tscn"; - public const string prefab_ui_RoomMap_tscn = "res://prefab/ui/RoomMap.tscn"; - public const string prefab_ui_RoomUI_tscn = "res://prefab/ui/RoomUI.tscn"; - public const string prefab_ui_Setting_tscn = "res://prefab/ui/Setting.tscn"; - public const string prefab_ui_Settlement_tscn = "res://prefab/ui/Settlement.tscn"; - public const string prefab_weapon_Weapon0001_tscn = "res://prefab/weapon/Weapon0001.tscn"; - public const string prefab_weapon_Weapon0002_tscn = "res://prefab/weapon/Weapon0002.tscn"; - public const string prefab_weapon_Weapon0003_tscn = "res://prefab/weapon/Weapon0003.tscn"; - public const string prefab_weapon_Weapon0004_tscn = "res://prefab/weapon/Weapon0004.tscn"; - public const string prefab_weapon_Weapon0005_tscn = "res://prefab/weapon/Weapon0005.tscn"; - public const string prefab_weapon_Weapon0006_tscn = "res://prefab/weapon/Weapon0006.tscn"; - public const string prefab_weapon_Weapon0007_tscn = "res://prefab/weapon/Weapon0007.tscn"; - public const string prefab_weapon_Weapon0008_tscn = "res://prefab/weapon/Weapon0008.tscn"; - public const string prefab_weapon_Weapon0009_tscn = "res://prefab/weapon/Weapon0009.tscn"; - public const string prefab_weapon_WeaponTemplate_tscn = "res://prefab/weapon/WeaponTemplate.tscn"; - public const string resource_config_ActivityBase_json = "res://resource/config/ActivityBase.json"; - public const string resource_config_ActivityMaterial_json = "res://resource/config/ActivityMaterial.json"; - public const string resource_config_AiAttackAttr_json = "res://resource/config/AiAttackAttr.json"; - public const string resource_config_BulletBase_json = "res://resource/config/BulletBase.json"; - public const string resource_config_EnemyBase_json = "res://resource/config/EnemyBase.json"; + public const string prefab_bullet_explode_Explode0001_tscn = "res://prefab/bullet/explode/Explode0001.tscn"; + public const string prefab_currency_Gold1_tscn = "res://prefab/currency/Gold1.tscn"; + public const string prefab_currency_GoldTemplate_tscn = "res://prefab/currency/GoldTemplate.tscn"; + public const string prefab_currency_Gold10_tscn = "res://prefab/currency/Gold10.tscn"; + public const string prefab_currency_Gold5_tscn = "res://prefab/currency/Gold5.tscn"; + public const string scene_Main_tscn = "res://scene/Main.tscn"; + public const string scene_Hall_tscn = "res://scene/Hall.tscn"; + public const string scene_Dungeon_tscn = "res://scene/Dungeon.tscn"; + public const string scene_test_TestPerfectPixel_tscn = "res://scene/test/TestPerfectPixel.tscn"; + public const string scene_test_TestNewTileMap_tscn = "res://scene/test/TestNewTileMap.tscn"; + public const string scene_test_TestMask_tscn = "res://scene/test/TestMask.tscn"; + public const string scene_test_TestGridData_tscn = "res://scene/test/TestGridData.tscn"; + public const string scene_test_TestNavigationPolygon_tscn = "res://scene/test/TestNavigationPolygon.tscn"; + public const string scene_test_TestRoomFog_tscn = "res://scene/test/TestRoomFog.tscn"; + public const string scene_test_TestMask2_tscn = "res://scene/test/TestMask2.tscn"; + public const string scene_test_TestTrail_tscn = "res://scene/test/TestTrail.tscn"; + public const string scene_test_TestOptimizeSprite_tscn = "res://scene/test/TestOptimizeSprite.tscn"; + public const string scene_test_TestPerfectPixelScene_tscn = "res://scene/test/TestPerfectPixelScene.tscn"; + public const string scene_test_TestOutline_tscn = "res://scene/test/TestOutline.tscn"; + public const string scene_test_TestTerrain2x2_tscn = "res://scene/test/TestTerrain2x2.tscn"; + public const string scene_test_TestNewTerrain_tscn = "res://scene/test/TestNewTerrain.tscn"; + public const string scene_test_TestCreateSector_tscn = "res://scene/test/TestCreateSector.tscn"; + public const string scene_test_TestTileLayer_tscn = "res://scene/test/TestTileLayer.tscn"; + public const string scene_test_TestNavigation2_tscn = "res://scene/test/TestNavigation2.tscn"; + public const string scene_test_TestLoadTileSetConfig_tscn = "res://scene/test/TestLoadTileSetConfig.tscn"; + public const string scene_test_TestDrawSprite_tscn = "res://scene/test/TestDrawSprite.tscn"; + public const string resource_spriteFrames_prop_buff_BuffProp0009_tres = "res://resource/spriteFrames/prop/buff/BuffProp0009.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0013_tres = "res://resource/spriteFrames/prop/buff/BuffProp0013.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0005_tres = "res://resource/spriteFrames/prop/buff/BuffProp0005.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0004_tres = "res://resource/spriteFrames/prop/buff/BuffProp0004.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0012_tres = "res://resource/spriteFrames/prop/buff/BuffProp0012.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0008_tres = "res://resource/spriteFrames/prop/buff/BuffProp0008.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0003_tres = "res://resource/spriteFrames/prop/buff/BuffProp0003.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0002_tres = "res://resource/spriteFrames/prop/buff/BuffProp0002.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0014_tres = "res://resource/spriteFrames/prop/buff/BuffProp0014.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0001_tres = "res://resource/spriteFrames/prop/buff/BuffProp0001.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0007_tres = "res://resource/spriteFrames/prop/buff/BuffProp0007.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0011_tres = "res://resource/spriteFrames/prop/buff/BuffProp0011.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0010_tres = "res://resource/spriteFrames/prop/buff/BuffProp0010.tres"; + public const string resource_spriteFrames_prop_buff_BuffProp0006_tres = "res://resource/spriteFrames/prop/buff/BuffProp0006.tres"; + public const string resource_spriteFrames_prop_active_ActiveProp5001_tres = "res://resource/spriteFrames/prop/active/ActiveProp5001.tres"; + public const string resource_spriteFrames_prop_active_ActiveProp5000_tres = "res://resource/spriteFrames/prop/active/ActiveProp5000.tres"; + public const string resource_spriteFrames_weapon_Weapon0002_tres = "res://resource/spriteFrames/weapon/Weapon0002.tres"; + public const string resource_spriteFrames_weapon_Weapon0014_tres = "res://resource/spriteFrames/weapon/Weapon0014.tres"; + public const string resource_spriteFrames_weapon_Weapon0004_hit_tres = "res://resource/spriteFrames/weapon/Weapon0004_hit.tres"; + public const string resource_spriteFrames_weapon_Weapon0003_tres = "res://resource/spriteFrames/weapon/Weapon0003.tres"; + public const string resource_spriteFrames_weapon_Weapon0008_tres = "res://resource/spriteFrames/weapon/Weapon0008.tres"; + public const string resource_spriteFrames_weapon_Weapon0004_tres = "res://resource/spriteFrames/weapon/Weapon0004.tres"; + public const string resource_spriteFrames_weapon_Weapon0013_tres = "res://resource/spriteFrames/weapon/Weapon0013.tres"; + public const string resource_spriteFrames_weapon_Weapon0005_tres = "res://resource/spriteFrames/weapon/Weapon0005.tres"; + public const string resource_spriteFrames_weapon_Weapon0009_tres = "res://resource/spriteFrames/weapon/Weapon0009.tres"; + public const string resource_spriteFrames_weapon_Weapon0010_tres = "res://resource/spriteFrames/weapon/Weapon0010.tres"; + public const string resource_spriteFrames_weapon_Weapon0006_tres = "res://resource/spriteFrames/weapon/Weapon0006.tres"; + public const string resource_spriteFrames_weapon_Weapon0007_tres = "res://resource/spriteFrames/weapon/Weapon0007.tres"; + public const string resource_spriteFrames_weapon_Weapon0011_tres = "res://resource/spriteFrames/weapon/Weapon0011.tres"; + public const string resource_spriteFrames_weapon_Weapon0016_tres = "res://resource/spriteFrames/weapon/Weapon0016.tres"; + public const string resource_spriteFrames_weapon_Weapon0001_tres = "res://resource/spriteFrames/weapon/Weapon0001.tres"; + public const string resource_spriteFrames_role_Enemy0001_tres = "res://resource/spriteFrames/role/Enemy0001.tres"; + public const string resource_spriteFrames_role_Role_tip_tres = "res://resource/spriteFrames/role/Role_tip.tres"; + public const string resource_spriteFrames_role_Enemy0002_tres = "res://resource/spriteFrames/role/Enemy0002.tres"; + public const string resource_spriteFrames_role_Role0001_tres = "res://resource/spriteFrames/role/Role0001.tres"; + public const string resource_spriteFrames_shell_Shell0004_tres = "res://resource/spriteFrames/shell/Shell0004.tres"; + public const string resource_spriteFrames_shell_Shell0002_tres = "res://resource/spriteFrames/shell/Shell0002.tres"; + public const string resource_spriteFrames_shell_Shell0003_tres = "res://resource/spriteFrames/shell/Shell0003.tres"; + public const string resource_spriteFrames_shell_Shell0001_tres = "res://resource/spriteFrames/shell/Shell0001.tres"; + public const string resource_spriteFrames_other_RoomDoor_E_Down_tres = "res://resource/spriteFrames/other/RoomDoor_E_Down.tres"; + public const string resource_spriteFrames_other_RoomDoor_N_tres = "res://resource/spriteFrames/other/RoomDoor_N.tres"; + public const string resource_spriteFrames_other_RoomDoor_E_Up_tres = "res://resource/spriteFrames/other/RoomDoor_E_Up.tres"; + public const string resource_spriteFrames_bullet_Bullet0001_tres = "res://resource/spriteFrames/bullet/Bullet0001.tres"; + public const string resource_spriteFrames_bullet_Bullet0006_tres = "res://resource/spriteFrames/bullet/Bullet0006.tres"; + public const string resource_spriteFrames_bullet_Collision0001_tres = "res://resource/spriteFrames/bullet/Collision0001.tres"; + public const string resource_spriteFrames_bullet_Bullet0007_tres = "res://resource/spriteFrames/bullet/Bullet0007.tres"; + public const string resource_spriteFrames_bullet_Bullet0004_tres = "res://resource/spriteFrames/bullet/Bullet0004.tres"; + public const string resource_spriteFrames_bullet_Bullet0008_tres = "res://resource/spriteFrames/bullet/Bullet0008.tres"; + public const string resource_spriteFrames_bullet_Collision0002_tres = "res://resource/spriteFrames/bullet/Collision0002.tres"; + public const string resource_spriteFrames_bullet_Bullet0009_tres = "res://resource/spriteFrames/bullet/Bullet0009.tres"; + public const string resource_spriteFrames_bullet_Bullet0005_tres = "res://resource/spriteFrames/bullet/Bullet0005.tres"; + public const string resource_spriteFrames_bullet_Bullet0002_tres = "res://resource/spriteFrames/bullet/Bullet0002.tres"; + public const string resource_spriteFrames_bullet_Bullet0003_tres = "res://resource/spriteFrames/bullet/Bullet0003.tres"; public const string resource_config_LiquidMaterial_json = "res://resource/config/LiquidMaterial.json"; - public const string resource_config_Sound_json = "res://resource/config/Sound.json"; + public const string resource_config_ActivityBase_json = "res://resource/config/ActivityBase.json"; + public const string resource_config_EnemyBase_json = "res://resource/config/EnemyBase.json"; + public const string resource_config_BulletBase_json = "res://resource/config/BulletBase.json"; + public const string resource_config_AiAttackAttr_json = "res://resource/config/AiAttackAttr.json"; + public const string resource_config_ActivityMaterial_json = "res://resource/config/ActivityMaterial.json"; public const string resource_config_WeaponBase_json = "res://resource/config/WeaponBase.json"; + public const string resource_config_Sound_json = "res://resource/config/Sound.json"; + public const string resource_navigation_NavigationPolygon_tres = "res://resource/navigation/NavigationPolygon.tres"; public const string resource_curve_Curve1_tres = "res://resource/curve/Curve1.tres"; - public const string resource_font_DinkieBitmap7pxDemo_ttf = "res://resource/font/DinkieBitmap-7pxDemo.ttf"; + public const string resource_theme_theme1_tres = "res://resource/theme/theme1.tres"; + public const string resource_theme_mainTheme_tres = "res://resource/theme/mainTheme.tres"; + public const string resource_sprite_ui_GUI_png = "res://resource/sprite/ui/GUI.png"; + public const string resource_sprite_ui_font_bg_png = "res://resource/sprite/ui/font_bg.png"; + public const string resource_sprite_ui_roomMap_MapBar_png = "res://resource/sprite/ui/roomMap/MapBar.png"; + public const string resource_sprite_ui_roomUI_ReloadBar_png = "res://resource/sprite/ui/roomUI/ReloadBar.png"; + public const string resource_sprite_ui_roomUI_Cooldown_png = "res://resource/sprite/ui/roomUI/Cooldown.png"; + public const string resource_sprite_ui_roomUI_icon_replace_png = "res://resource/sprite/ui/roomUI/icon_replace.png"; + public const string resource_sprite_ui_roomUI_Shield_full_png = "res://resource/sprite/ui/roomUI/Shield_full.png"; + public const string resource_sprite_ui_roomUI_Panel2_png = "res://resource/sprite/ui/roomUI/Panel2.png"; + public const string resource_sprite_ui_roomUI_icon_pickup_png = "res://resource/sprite/ui/roomUI/icon_pickup.png"; + public const string resource_sprite_ui_roomUI_icon_bullet_png = "res://resource/sprite/ui/roomUI/icon_bullet.png"; + public const string resource_sprite_ui_roomUI_ReloadBarBlock_png = "res://resource/sprite/ui/roomUI/ReloadBarBlock.png"; + public const string resource_sprite_ui_roomUI_Life_half_png = "res://resource/sprite/ui/roomUI/Life_half.png"; + public const string resource_sprite_ui_roomUI_Life_empty_png = "res://resource/sprite/ui/roomUI/Life_empty.png"; + public const string resource_sprite_ui_roomUI_Panel_png = "res://resource/sprite/ui/roomUI/Panel.png"; + public const string resource_sprite_ui_roomUI_ChargeProgressBar_png = "res://resource/sprite/ui/roomUI/ChargeProgressBar.png"; + public const string resource_sprite_ui_roomUI_ChargeProgress_png = "res://resource/sprite/ui/roomUI/ChargeProgress.png"; + public const string resource_sprite_ui_roomUI_Life_full_png = "res://resource/sprite/ui/roomUI/Life_full.png"; + public const string resource_sprite_ui_roomUI_Shield_empty_png = "res://resource/sprite/ui/roomUI/Shield_empty.png"; + public const string resource_sprite_ui_commonIcon_Delete2_png = "res://resource/sprite/ui/commonIcon/Delete2.png"; + public const string resource_sprite_ui_commonIcon_WaveCell_png = "res://resource/sprite/ui/commonIcon/WaveCell.png"; + public const string resource_sprite_ui_commonIcon_Add_png = "res://resource/sprite/ui/commonIcon/Add.png"; + public const string resource_sprite_ui_commonIcon_AreaTool_png = "res://resource/sprite/ui/commonIcon/AreaTool.png"; + public const string resource_sprite_ui_commonIcon_CenterTool_png = "res://resource/sprite/ui/commonIcon/CenterTool.png"; + public const string resource_sprite_ui_commonIcon_Error_mini_png = "res://resource/sprite/ui/commonIcon/Error_mini.png"; + public const string resource_sprite_ui_commonIcon_Import_png = "res://resource/sprite/ui/commonIcon/Import.png"; + public const string resource_sprite_ui_commonIcon_BirthMark_png = "res://resource/sprite/ui/commonIcon/BirthMark.png"; + public const string resource_sprite_ui_commonIcon_Gold_10_png = "res://resource/sprite/ui/commonIcon/Gold_10.png"; + public const string resource_sprite_ui_commonIcon_Lock_png = "res://resource/sprite/ui/commonIcon/Lock.png"; + public const string resource_sprite_ui_commonIcon_Visible_png = "res://resource/sprite/ui/commonIcon/Visible.png"; + public const string resource_sprite_ui_commonIcon_DragTool_png = "res://resource/sprite/ui/commonIcon/DragTool.png"; + public const string resource_sprite_ui_commonIcon_Unknown_png = "res://resource/sprite/ui/commonIcon/Unknown.png"; + public const string resource_sprite_ui_commonIcon_Down_png = "res://resource/sprite/ui/commonIcon/Down.png"; + public const string resource_sprite_ui_commonIcon_PenTool_png = "res://resource/sprite/ui/commonIcon/PenTool.png"; + public const string resource_sprite_ui_commonIcon_DoorTool_png = "res://resource/sprite/ui/commonIcon/DoorTool.png"; + public const string resource_sprite_ui_commonIcon_Search_png = "res://resource/sprite/ui/commonIcon/Search.png"; + public const string resource_sprite_ui_commonIcon_Block_png = "res://resource/sprite/ui/commonIcon/Block.png"; + public const string resource_sprite_ui_commonIcon_UnknownActivity_png = "res://resource/sprite/ui/commonIcon/UnknownActivity.png"; + public const string resource_sprite_ui_commonIcon_Dice_png = "res://resource/sprite/ui/commonIcon/Dice.png"; + public const string resource_sprite_ui_commonIcon_Delete_png = "res://resource/sprite/ui/commonIcon/Delete.png"; + public const string resource_sprite_ui_commonIcon_Select_png = "res://resource/sprite/ui/commonIcon/Select.png"; + public const string resource_sprite_ui_commonIcon_MarkCell_png = "res://resource/sprite/ui/commonIcon/MarkCell.png"; + public const string resource_sprite_ui_commonIcon_Unlock_png = "res://resource/sprite/ui/commonIcon/Unlock.png"; + public const string resource_sprite_ui_commonIcon_Success_mini_png = "res://resource/sprite/ui/commonIcon/Success_mini.png"; + public const string resource_sprite_ui_commonIcon_Edit_png = "res://resource/sprite/ui/commonIcon/Edit.png"; + public const string resource_sprite_ui_commonIcon_MarkCell_placeholder_png = "res://resource/sprite/ui/commonIcon/MarkCell_placeholder.png"; + public const string resource_sprite_ui_commonIcon_Mark_png = "res://resource/sprite/ui/commonIcon/Mark.png"; + public const string resource_sprite_ui_commonIcon_PackageMark_png = "res://resource/sprite/ui/commonIcon/PackageMark.png"; + public const string resource_sprite_ui_commonIcon_Play_png = "res://resource/sprite/ui/commonIcon/Play.png"; + public const string resource_sprite_ui_commonIcon_Select2_png = "res://resource/sprite/ui/commonIcon/Select2.png"; + public const string resource_sprite_ui_commonIcon_Setting_png = "res://resource/sprite/ui/commonIcon/Setting.png"; + public const string resource_sprite_ui_commonIcon_Back_png = "res://resource/sprite/ui/commonIcon/Back.png"; + public const string resource_sprite_ui_commonIcon_Right_png = "res://resource/sprite/ui/commonIcon/Right.png"; + public const string resource_sprite_ui_commonIcon_Save_png = "res://resource/sprite/ui/commonIcon/Save.png"; + public const string resource_sprite_ui_commonIcon_Hide_png = "res://resource/sprite/ui/commonIcon/Hide.png"; + public const string resource_sprite_ui_commonIcon_Missing_png = "res://resource/sprite/ui/commonIcon/Missing.png"; + public const string resource_sprite_ui_sursors_CursorCenter_png = "res://resource/sprite/ui/sursors/CursorCenter.png"; + public const string resource_sprite_ui_sursors_Cursors_png = "res://resource/sprite/ui/sursors/Cursors.png"; + public const string resource_sprite_ui_sursors_Cursors_Ui_png = "res://resource/sprite/ui/sursors/Cursors_Ui.png"; + public const string resource_sprite_ui_mapEditorTools_DoorDragButton_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton.png"; + public const string resource_sprite_ui_mapEditorTools_DoorDragButton_hover_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton_hover.png"; + public const string resource_sprite_ui_mapEditorTools_DoorDragButton_down_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton_down.png"; + public const string resource_sprite_ui_mapEditorProject_CellBg_png = "res://resource/sprite/ui/mapEditorProject/CellBg.png"; + public const string resource_sprite_ui_keyboard_e_png = "res://resource/sprite/ui/keyboard/e.png"; + public const string resource_sprite_prop_buff_BuffProp0003_png = "res://resource/sprite/prop/buff/BuffProp0003.png"; + public const string resource_sprite_prop_buff_BuffProp0002_png = "res://resource/sprite/prop/buff/BuffProp0002.png"; + public const string resource_sprite_prop_buff_BuffProp0014_png = "res://resource/sprite/prop/buff/BuffProp0014.png"; + public const string resource_sprite_prop_buff_BuffProp0001_png = "res://resource/sprite/prop/buff/BuffProp0001.png"; + public const string resource_sprite_prop_buff_BuffProp0011_png = "res://resource/sprite/prop/buff/BuffProp0011.png"; + public const string resource_sprite_prop_buff_BuffProp0005_png = "res://resource/sprite/prop/buff/BuffProp0005.png"; + public const string resource_sprite_prop_buff_BuffProp0004_png = "res://resource/sprite/prop/buff/BuffProp0004.png"; + public const string resource_sprite_prop_buff_BuffProp0010_png = "res://resource/sprite/prop/buff/BuffProp0010.png"; + public const string resource_sprite_prop_buff_BuffProp0006_png = "res://resource/sprite/prop/buff/BuffProp0006.png"; + public const string resource_sprite_prop_buff_BuffProp0012_png = "res://resource/sprite/prop/buff/BuffProp0012.png"; + public const string resource_sprite_prop_buff_BuffProp0013_png = "res://resource/sprite/prop/buff/BuffProp0013.png"; + public const string resource_sprite_prop_buff_BuffProp0007_png = "res://resource/sprite/prop/buff/BuffProp0007.png"; + public const string resource_sprite_prop_buff_BuffProp0009_png = "res://resource/sprite/prop/buff/BuffProp0009.png"; + public const string resource_sprite_prop_buff_BuffProp0008_png = "res://resource/sprite/prop/buff/BuffProp0008.png"; + public const string resource_sprite_prop_buff_BuffProp0001export_png = "res://resource/sprite/prop/buff/BuffProp0001-export.png"; + public const string resource_sprite_prop_active_ActiveProp5001_png = "res://resource/sprite/prop/active/ActiveProp5001.png"; + public const string resource_sprite_prop_active_ActiveProp5000_png = "res://resource/sprite/prop/active/ActiveProp5000.png"; + public const string resource_sprite_weapon_weapon0014_Weapon0014_png = "res://resource/sprite/weapon/weapon0014/Weapon0014.png"; + public const string resource_sprite_weapon_weapon0013_weapon0014export_png = "res://resource/sprite/weapon/weapon0013/weapon0014-export.png"; + public const string resource_sprite_weapon_weapon0013_weapon0014_png = "res://resource/sprite/weapon/weapon0013/weapon0014.png"; + public const string resource_sprite_weapon_weapon0013_weapon0013_png = "res://resource/sprite/weapon/weapon0013/weapon0013.png"; + public const string resource_sprite_weapon_weapon0022_weapon0022_png = "res://resource/sprite/weapon/weapon0022/weapon0022.png"; + public const string resource_sprite_weapon_weapon0040_weapon00401_png = "res://resource/sprite/weapon/weapon0040/weapon0040,1.png"; + public const string resource_sprite_weapon_weapon0040_weapon0040_png = "res://resource/sprite/weapon/weapon0040/weapon0040.png"; + public const string resource_sprite_weapon_weapon0023_weapon0023_png = "res://resource/sprite/weapon/weapon0023/weapon0023.png"; + public const string resource_sprite_weapon_weapon0012_bow_png = "res://resource/sprite/weapon/weapon0012/bow.png"; + public const string resource_sprite_weapon_weapon0041_weapon0041_png = "res://resource/sprite/weapon/weapon0041/weapon0041.png"; + public const string resource_sprite_weapon_weapon0046_weapon0046_png = "res://resource/sprite/weapon/weapon0046/weapon0046.png"; + public const string resource_sprite_weapon_weapon31_weapon0031_png = "res://resource/sprite/weapon/weapon31/weapon0031.png"; + public const string resource_sprite_weapon_weapon0008_Weapon0008_png = "res://resource/sprite/weapon/weapon0008/Weapon0008.png"; + public const string resource_sprite_weapon_weapon0008_Weapon0008_reloading_png = "res://resource/sprite/weapon/weapon0008/Weapon0008_reloading.png"; + public const string resource_sprite_weapon_weapon0037_weapon0037_png = "res://resource/sprite/weapon/weapon0037/weapon0037.png"; + public const string resource_sprite_weapon_weapon0030_weapon0030_png = "res://resource/sprite/weapon/weapon0030/weapon0030.png"; + public const string resource_sprite_weapon_weapon0039_weapon00391_png = "res://resource/sprite/weapon/weapon0039/weapon0039(1).png"; + public const string resource_sprite_weapon_weapon0039_weapon0039_png = "res://resource/sprite/weapon/weapon0039/weapon0039.png"; + public const string resource_sprite_weapon_weapon0006_Weapon0006_png = "res://resource/sprite/weapon/weapon0006/Weapon0006.png"; + public const string resource_sprite_weapon_weapon0001_Weapon0001_png = "res://resource/sprite/weapon/weapon0001/Weapon0001.png"; + public const string resource_sprite_weapon_weapon0038_weapon0038_1_png = "res://resource/sprite/weapon/weapon0038/weapon0038.1.png"; + public const string resource_sprite_weapon_weapon0038_weapon0038_png = "res://resource/sprite/weapon/weapon0038/weapon0038.png"; + public const string resource_sprite_weapon_weapon0007_Weapon0007_png = "res://resource/sprite/weapon/weapon0007/Weapon0007.png"; + public const string resource_sprite_weapon_weapon0009_weapon0009_png = "res://resource/sprite/weapon/weapon0009/weapon0009.png"; + public const string resource_sprite_weapon_weapon0009_Weapon0009_reload_png = "res://resource/sprite/weapon/weapon0009/Weapon0009_reload.png"; + public const string resource_sprite_weapon_weapon0036_weapon0036_png = "res://resource/sprite/weapon/weapon0036/weapon0036.png"; + public const string resource_sprite_weapon_weapon0043_weapon0043_png = "res://resource/sprite/weapon/weapon0043/weapon0043.png"; + public const string resource_sprite_weapon_weapon0044_weapon0044_png = "res://resource/sprite/weapon/weapon0044/weapon0044.png"; + public const string resource_sprite_weapon_weapon0010_Weapon0010_reloading_png = "res://resource/sprite/weapon/weapon0010/Weapon0010_reloading.png"; + public const string resource_sprite_weapon_weapon0010_Weapon0010_png = "res://resource/sprite/weapon/weapon0010/Weapon0010.png"; + public const string resource_sprite_weapon_weapon0017_seapon0017t_png = "res://resource/sprite/weapon/weapon0017/seapon0017t.png"; + public const string resource_sprite_weapon_weapon0021_weapon0021_png = "res://resource/sprite/weapon/weapon0021/weapon0021.png"; + public const string resource_sprite_weapon_weapon0019_weapon0019_png = "res://resource/sprite/weapon/weapon0019/weapon0019.png"; + public const string resource_sprite_weapon_weapon0045_weapon0045_png = "res://resource/sprite/weapon/weapon0045/weapon0045.png"; + public const string resource_sprite_weapon_weapon0045_子弹_png = "res://resource/sprite/weapon/weapon0045/子弹.png"; + public const string resource_sprite_weapon_weapon0042_weapon0042_png = "res://resource/sprite/weapon/weapon0042/weapon0042.png"; + public const string resource_sprite_weapon_weapon0018_weapon0018_png = "res://resource/sprite/weapon/weapon0018/weapon0018.png"; + public const string resource_sprite_weapon_weapon0020_weapon0020_png = "res://resource/sprite/weapon/weapon0020/weapon0020.png"; + public const string resource_sprite_weapon_weapon0020_weapon0020export_png = "res://resource/sprite/weapon/weapon0020/weapon0020-export.png"; + public const string resource_sprite_weapon_weapon0016_weapon0016_pull_png = "res://resource/sprite/weapon/weapon0016/weapon0016_pull.png"; + public const string resource_sprite_weapon_weapon0016_weapon0016_png = "res://resource/sprite/weapon/weapon0016/weapon0016.png"; + public const string resource_sprite_weapon_weapon0011_Weapon0011_png = "res://resource/sprite/weapon/weapon0011/Weapon0011.png"; + public const string resource_sprite_weapon_weapon29_weapon0029_png = "res://resource/sprite/weapon/weapon29/weapon0029.png"; + public const string resource_sprite_weapon_weapon0033_weapon0033_png = "res://resource/sprite/weapon/weapon0033/weapon0033.png"; + public const string resource_sprite_weapon_weapon0034_weapon0034_png = "res://resource/sprite/weapon/weapon0034/weapon0034.png"; + public const string resource_sprite_weapon_weapon0002_Weapon0002_reloading_png = "res://resource/sprite/weapon/weapon0002/Weapon0002_reloading.png"; + public const string resource_sprite_weapon_weapon0002_Weapon0002_png = "res://resource/sprite/weapon/weapon0002/Weapon0002.png"; + public const string resource_sprite_weapon_weapon0005_Weapon0005_png = "res://resource/sprite/weapon/weapon0005/Weapon0005.png"; + public const string resource_sprite_weapon_weapon0004_KnifeHit1_png = "res://resource/sprite/weapon/weapon0004/KnifeHit1.png"; + public const string resource_sprite_weapon_weapon0004_Weapon0004_png = "res://resource/sprite/weapon/weapon0004/Weapon0004.png"; + public const string resource_sprite_weapon_weapon0003_Weapon0003_png = "res://resource/sprite/weapon/weapon0003/Weapon0003.png"; + public const string resource_sprite_weapon_weapon0035_weapon0035_png = "res://resource/sprite/weapon/weapon0035/weapon0035.png"; + public const string resource_sprite_weapon_weapon0032_weapon0032_png = "res://resource/sprite/weapon/weapon0032/weapon0032.png"; + public const string resource_sprite_role_role10_png = "res://resource/sprite/role/role10.png"; + public const string resource_sprite_role_role4_png = "res://resource/sprite/role/role4.png"; + public const string resource_sprite_role_role5_png = "res://resource/sprite/role/role5.png"; + public const string resource_sprite_role_role7_png = "res://resource/sprite/role/role7.png"; + public const string resource_sprite_role_role6_png = "res://resource/sprite/role/role6.png"; + public const string resource_sprite_role_role3_png = "res://resource/sprite/role/role3.png"; + public const string resource_sprite_role_scarecrow0001_png = "res://resource/sprite/role/scarecrow0001.png"; + public const string resource_sprite_role_role8_png = "res://resource/sprite/role/role8.png"; + public const string resource_sprite_role_role9_png = "res://resource/sprite/role/role9.png"; + public const string resource_sprite_role_enemy0002_Enemy0002_png = "res://resource/sprite/role/enemy0002/Enemy0002.png"; + public const string resource_sprite_role_enemy0002_Enemy0002_dead_png = "res://resource/sprite/role/enemy0002/Enemy0002_dead.png"; + public const string resource_sprite_role_enemy0002_Enemy0002_attack_png = "res://resource/sprite/role/enemy0002/Enemy0002_attack.png"; + public const string resource_sprite_role_enemy0002_Enemy0002_run_png = "res://resource/sprite/role/enemy0002/Enemy0002_run.png"; + public const string resource_sprite_role_enemy0002_Enemy0002_idle_png = "res://resource/sprite/role/enemy0002/Enemy0002_idle.png"; + public const string resource_sprite_role_role0001_Role0001_head_png = "res://resource/sprite/role/role0001/Role0001_head.png"; + public const string resource_sprite_role_role0001_Role0001_Icon_png = "res://resource/sprite/role/role0001/Role0001_Icon.png"; + public const string resource_sprite_role_role0001_Role0001_png = "res://resource/sprite/role/role0001/Role0001.png"; + public const string resource_sprite_role_role0001_idle_Sprite0002_png = "res://resource/sprite/role/role0001/idle/Sprite-0002.png"; + public const string resource_sprite_role_role0001_idle_Sprite0003_png = "res://resource/sprite/role/role0001/idle/Sprite-0003.png"; + public const string resource_sprite_role_role0001_idle_Sprite0007_png = "res://resource/sprite/role/role0001/idle/Sprite-0007.png"; + public const string resource_sprite_role_role0001_idle_Sprite0006_png = "res://resource/sprite/role/role0001/idle/Sprite-0006.png"; + public const string resource_sprite_role_role0001_idle_Sprite0004_png = "res://resource/sprite/role/role0001/idle/Sprite-0004.png"; + public const string resource_sprite_role_role0001_idle_Sprite0005_png = "res://resource/sprite/role/role0001/idle/Sprite-0005.png"; + public const string resource_sprite_role_role0001_idle_Sprite0008_png = "res://resource/sprite/role/role0001/idle/Sprite-0008.png"; + public const string resource_sprite_role_role0001_roll_Sprite0015_png = "res://resource/sprite/role/role0001/roll/Sprite-0015.png"; + public const string resource_sprite_role_role0001_roll_Sprite0014_png = "res://resource/sprite/role/role0001/roll/Sprite-0014.png"; + public const string resource_sprite_role_role0001_roll_Sprite0016_png = "res://resource/sprite/role/role0001/roll/Sprite-0016.png"; + public const string resource_sprite_role_role0001_roll_Sprite0017_png = "res://resource/sprite/role/role0001/roll/Sprite-0017.png"; + public const string resource_sprite_role_role0001_roll_Sprite0013_png = "res://resource/sprite/role/role0001/roll/Sprite-0013.png"; + public const string resource_sprite_role_role0001_roll_Sprite0012_png = "res://resource/sprite/role/role0001/roll/Sprite-0012.png"; + public const string resource_sprite_role_role0001_roll_Sprite0010_png = "res://resource/sprite/role/role0001/roll/Sprite-0010.png"; + public const string resource_sprite_role_role0001_roll_Sprite0011_png = "res://resource/sprite/role/role0001/roll/Sprite-0011.png"; + public const string resource_sprite_role_role0001_roll_Sprite0008_png = "res://resource/sprite/role/role0001/roll/Sprite-0008.png"; + public const string resource_sprite_role_role0001_roll_Sprite0009_png = "res://resource/sprite/role/role0001/roll/Sprite-0009.png"; + public const string resource_sprite_role_role0001_roll_Sprite0018_png = "res://resource/sprite/role/role0001/roll/Sprite-0018.png"; + public const string resource_sprite_role_role0001_run_Sprite0002_png = "res://resource/sprite/role/role0001/run/Sprite-0002.png"; + public const string resource_sprite_role_role0001_run_Sprite0003_png = "res://resource/sprite/role/role0001/run/Sprite-0003.png"; + public const string resource_sprite_role_role0001_run_Sprite0007_png = "res://resource/sprite/role/role0001/run/Sprite-0007.png"; + public const string resource_sprite_role_role0001_run_Sprite0006_png = "res://resource/sprite/role/role0001/run/Sprite-0006.png"; + public const string resource_sprite_role_role0001_run_Sprite0004_png = "res://resource/sprite/role/role0001/run/Sprite-0004.png"; + public const string resource_sprite_role_role0001_run_Sprite0005_png = "res://resource/sprite/role/role0001/run/Sprite-0005.png"; + public const string resource_sprite_role_role0001_run_Sprite0008_png = "res://resource/sprite/role/role0001/run/Sprite-0008.png"; + public const string resource_sprite_role_common_Role_astonished_png = "res://resource/sprite/role/common/Role_astonished.png"; + public const string resource_sprite_role_common_Role_query_png = "res://resource/sprite/role/common/Role_query.png"; + public const string resource_sprite_role_common_Role_shadow1_png = "res://resource/sprite/role/common/Role_shadow1.png"; + public const string resource_sprite_role_common_Role_notify_png = "res://resource/sprite/role/common/Role_notify.png"; + public const string resource_sprite_role_enemy0001_enemy0001_png = "res://resource/sprite/role/enemy0001/enemy0001.png"; + public const string resource_sprite_role_enemy0001_enemy0001_Icon_png = "res://resource/sprite/role/enemy0001/enemy0001_Icon.png"; + public const string resource_sprite_role_enemy0001_enemy0001_Debris_png = "res://resource/sprite/role/enemy0001/enemy0001_Debris.png"; + public const string resource_sprite_box_TreasureBox0001_icon_png = "res://resource/sprite/box/TreasureBox0001_icon.png"; + public const string resource_sprite_box_TreasureBox0001_png = "res://resource/sprite/box/TreasureBox0001.png"; + public const string resource_sprite_shootFire_ShotFire0001_png = "res://resource/sprite/shootFire/ShotFire0001.png"; + public const string resource_sprite_shootFire_ShotFire0002_png = "res://resource/sprite/shootFire/ShotFire0002.png"; + public const string resource_sprite_shootFire_ShotFire0003_png = "res://resource/sprite/shootFire/ShotFire0003.png"; + public const string resource_sprite_shell_Shell0001_png = "res://resource/sprite/shell/Shell0001.png"; + public const string resource_sprite_shell_Shell0003_png = "res://resource/sprite/shell/Shell0003.png"; + public const string resource_sprite_shell_Shell0002_png = "res://resource/sprite/shell/Shell0002.png"; + public const string resource_sprite_shell_Shell0004_png = "res://resource/sprite/shell/Shell0004.png"; + public const string resource_sprite_common_debug_arrows_png = "res://resource/sprite/common/debug_arrows.png"; + public const string resource_sprite_common_Circle_png = "res://resource/sprite/common/Circle.png"; + public const string resource_sprite_common_MeleeAttack1_png = "res://resource/sprite/common/MeleeAttack1.png"; + public const string resource_sprite_common_Circle2_png = "res://resource/sprite/common/Circle2.png"; + public const string resource_sprite_common_Smoke_png = "res://resource/sprite/common/Smoke.png"; + public const string resource_sprite_common_Effect1_png = "res://resource/sprite/common/Effect1.png"; + public const string resource_sprite_common_Smoke2_png = "res://resource/sprite/common/Smoke2.png"; + public const string resource_sprite_common_Smoke3_png = "res://resource/sprite/common/Smoke3.png"; + public const string resource_sprite_common_Smoke4_png = "res://resource/sprite/common/Smoke4.png"; + public const string resource_sprite_map_PreviewMap_png = "res://resource/sprite/map/PreviewMap.png"; + public const string resource_sprite_map_PreviewTransition_png = "res://resource/sprite/map/PreviewTransition.png"; + public const string resource_sprite_map_TerrainMask_png = "res://resource/sprite/map/TerrainMask.png"; + public const string resource_sprite_map_TerrainMask3_png = "res://resource/sprite/map/TerrainMask3.png"; + public const string resource_sprite_map_TerrainMask2_png = "res://resource/sprite/map/TerrainMask2.png"; + public const string resource_sprite_map_WallTransition3_png = "res://resource/sprite/map/WallTransition3.png"; + public const string resource_sprite_map_door_open_png = "res://resource/sprite/map/door_open.png"; + public const string resource_sprite_map_TerrainMask4_png = "res://resource/sprite/map/TerrainMask4.png"; + public const string resource_sprite_map_WallTransition2_png = "res://resource/sprite/map/WallTransition2.png"; + public const string resource_sprite_map_PreviewMapShadow_png = "res://resource/sprite/map/PreviewMapShadow.png"; + public const string resource_sprite_map_WallTransition1_png = "res://resource/sprite/map/WallTransition1.png"; + public const string resource_sprite_map_door_up_png = "res://resource/sprite/map/door_up.png"; + public const string resource_sprite_map_PreviewTransition2_png = "res://resource/sprite/map/PreviewTransition2.png"; + public const string resource_sprite_map_PreviewTransition3_png = "res://resource/sprite/map/PreviewTransition3.png"; + public const string resource_sprite_map_PreviewTransition6_png = "res://resource/sprite/map/PreviewTransition6.png"; + public const string resource_sprite_map_door_close_png = "res://resource/sprite/map/door_close.png"; + public const string resource_sprite_map_PreviewTransition4_png = "res://resource/sprite/map/PreviewTransition4.png"; + public const string resource_sprite_map_PreviewTransition5_png = "res://resource/sprite/map/PreviewTransition5.png"; + public const string resource_sprite_bullet_laser_Laser0001_png = "res://resource/sprite/bullet/laser/Laser0001.png"; + public const string resource_sprite_bullet_normal_bullet0009_png = "res://resource/sprite/bullet/normal/bullet0009.png"; + public const string resource_sprite_bullet_normal_bullet0008_png = "res://resource/sprite/bullet/normal/bullet0008.png"; + public const string resource_sprite_bullet_normal_bullet2_png = "res://resource/sprite/bullet/normal/bullet2.png"; + public const string resource_sprite_bullet_normal_bullet0006_png = "res://resource/sprite/bullet/normal/bullet0006.png"; + public const string resource_sprite_bullet_normal_bullet0007_png = "res://resource/sprite/bullet/normal/bullet0007.png"; + public const string resource_sprite_bullet_normal_bullet0005_png = "res://resource/sprite/bullet/normal/bullet0005.png"; + public const string resource_sprite_bullet_normal_bullet0004_png = "res://resource/sprite/bullet/normal/bullet0004.png"; + public const string resource_sprite_bullet_normal_bullet0001_png = "res://resource/sprite/bullet/normal/bullet0001.png"; + public const string resource_sprite_bullet_normal_bullet0003_png = "res://resource/sprite/bullet/normal/bullet0003.png"; + public const string resource_sprite_bullet_normal_bullet0002_png = "res://resource/sprite/bullet/normal/bullet0002.png"; + public const string resource_sprite_bullet_collision_Collision0001_png = "res://resource/sprite/bullet/collision/Collision0001.png"; + public const string resource_sprite_bullet_collision_Collision0002_png = "res://resource/sprite/bullet/collision/Collision0002.png"; + public const string resource_sprite_brush_Brush4_png = "res://resource/sprite/brush/Brush4.png"; + public const string resource_sprite_brush_Brush5_png = "res://resource/sprite/brush/Brush5.png"; + public const string resource_sprite_brush_Brush1_png = "res://resource/sprite/brush/Brush1.png"; + public const string resource_sprite_brush_Brush2_png = "res://resource/sprite/brush/Brush2.png"; + public const string resource_sprite_brush_Brush3_png = "res://resource/sprite/brush/Brush3.png"; + public const string resource_sprite_explode_Explode_pit0001_png = "res://resource/sprite/explode/Explode_pit0001.png"; + public const string resource_sprite_explode_Explode_line0001_png = "res://resource/sprite/explode/Explode_line0001.png"; + public const string resource_sprite_explode_Explode_circle0001_png = "res://resource/sprite/explode/Explode_circle0001.png"; + public const string resource_sprite_explode_Explode_circle0003_png = "res://resource/sprite/explode/Explode_circle0003.png"; + public const string resource_sprite_explode_Explode_circle0002_png = "res://resource/sprite/explode/Explode_circle0002.png"; + public const string resource_sprite_hall_HallBg_png = "res://resource/sprite/hall/HallBg.png"; + public const string resource_sprite_currency_Gold_10_png = "res://resource/sprite/currency/Gold_10.png"; + public const string resource_sprite_currency_Gold_1_png = "res://resource/sprite/currency/Gold_1.png"; + public const string resource_sprite_currency_Gold_5_png = "res://resource/sprite/currency/Gold_5.png"; + public const string resource_sprite_currency_Gold_shadow_png = "res://resource/sprite/currency/Gold_shadow.png"; public const string resource_font_DinkieBitmap9pxDemo_ttf = "res://resource/font/DinkieBitmap-9pxDemo.ttf"; public const string resource_font_DinkieBitmap9pxItalicDemo_ttf = "res://resource/font/DinkieBitmap-9pxItalicDemo.ttf"; public const string resource_font_VonwaonBitmap12px_ttf = "res://resource/font/VonwaonBitmap-12px.ttf"; public const string resource_font_VonwaonBitmap16px_ttf = "res://resource/font/VonwaonBitmap-16px.ttf"; - public const string resource_map_tileSet_TileSet_old_tres = "res://resource/map/tileSet/TileSet_old.tres"; - public const string resource_map_tileSet_map1_TileSet1_tres = "res://resource/map/tileSet/map1/TileSet1.tres"; - public const string resource_map_tileSet_map1_website_txt = "res://resource/map/tileSet/map1/website.txt"; - public const string resource_map_tileSprite_map1_16x16dungeoniiwallreconfigv04spritesheet_png = "res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png"; - public const string resource_material_Blend_gdshader = "res://resource/material/Blend.gdshader"; - public const string resource_material_Blend_tres = "res://resource/material/Blend.tres"; - public const string resource_material_Mask_gdshader = "res://resource/material/Mask.gdshader"; - public const string resource_material_OffsetVertex_gdshader = "res://resource/material/OffsetVertex.gdshader"; - public const string resource_material_Outline_gdshader = "res://resource/material/Outline.gdshader"; - public const string resource_material_Outline_tres = "res://resource/material/Outline.tres"; - public const string resource_material_Outline2_gdshader = "res://resource/material/Outline2.gdshader"; - public const string resource_material_Outline2_tres = "res://resource/material/Outline2.tres"; - public const string resource_material_Sawtooth_gdshader = "res://resource/material/Sawtooth.gdshader"; - public const string resource_material_Sawtooth_tres = "res://resource/material/Sawtooth.tres"; - public const string resource_material_SmokeParticleMaterial_tres = "res://resource/material/SmokeParticleMaterial.tres"; - public const string resource_sound_bgm_Intro_ogg = "res://resource/sound/bgm/Intro.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0001_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0001.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0002_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0002.ogg"; + public const string resource_font_DinkieBitmap7pxDemo_ttf = "res://resource/font/DinkieBitmap-7pxDemo.ttf"; + public const string resource_sound_sfx_common_gold_ogg = "res://resource/sound/sfx/common/gold.ogg"; + public const string resource_sound_sfx_explosion_Explosion0003_ogg = "res://resource/sound/sfx/explosion/Explosion0003.ogg"; + public const string resource_sound_sfx_explosion_Explosion0002_ogg = "res://resource/sound/sfx/explosion/Explosion0002.ogg"; + public const string resource_sound_sfx_explosion_Explosion0001_ogg = "res://resource/sound/sfx/explosion/Explosion0001.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0017_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0017.ogg"; public const string resource_sound_sfx_beLoaded_BeLoaded0003_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0003.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0004_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0004.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0005_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0005.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0006_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0006.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0007_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0007.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0008_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0008.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0009_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0009.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0010_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0010.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0011_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0011.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0012_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0012.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0013_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0013.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0002_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0002.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0016_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0016.ogg"; public const string resource_sound_sfx_beLoaded_BeLoaded0014_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0014.ogg"; public const string resource_sound_sfx_beLoaded_BeLoaded0015_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0015.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0016_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0016.ogg"; - public const string resource_sound_sfx_beLoaded_BeLoaded0017_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0017.ogg"; - public const string resource_sound_sfx_collision_Collision0001_ogg = "res://resource/sound/sfx/collision/Collision0001.ogg"; - public const string resource_sound_sfx_explosion_Explosion0001_ogg = "res://resource/sound/sfx/explosion/Explosion0001.ogg"; - public const string resource_sound_sfx_explosion_Explosion0002_ogg = "res://resource/sound/sfx/explosion/Explosion0002.ogg"; - public const string resource_sound_sfx_explosion_Explosion0003_ogg = "res://resource/sound/sfx/explosion/Explosion0003.ogg"; - public const string resource_sound_sfx_reloading_Reloading0001_ogg = "res://resource/sound/sfx/reloading/Reloading0001.ogg"; - public const string resource_sound_sfx_reloading_Reloading0002_ogg = "res://resource/sound/sfx/reloading/Reloading0002.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0001_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0001.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0005_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0005.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0011_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0011.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0010_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0010.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0004_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0004.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0012_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0012.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0006_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0006.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0007_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0007.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0013_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0013.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0009_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0009.ogg"; + public const string resource_sound_sfx_beLoaded_BeLoaded0008_ogg = "res://resource/sound/sfx/beLoaded/BeLoaded0008.ogg"; public const string resource_sound_sfx_reloading_Reloading0003_ogg = "res://resource/sound/sfx/reloading/Reloading0003.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0001_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0001.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0002_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0002.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0003_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0003.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0004_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0004.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0005_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0005.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0006_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0006.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0007_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0007.ogg"; + public const string resource_sound_sfx_reloading_Reloading0002_ogg = "res://resource/sound/sfx/reloading/Reloading0002.ogg"; + public const string resource_sound_sfx_reloading_Reloading0001_ogg = "res://resource/sound/sfx/reloading/Reloading0001.ogg"; public const string resource_sound_sfx_reloading_Reloading_begin0008_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0008.ogg"; public const string resource_sound_sfx_reloading_Reloading_begin0009_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0009.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0010_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0010.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0011_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0011.ogg"; - public const string resource_sound_sfx_reloading_Reloading_begin0012_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0012.ogg"; + public const string resource_sound_sfx_reloading_Reloading_finish0004_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0004.ogg"; + public const string resource_sound_sfx_reloading_Reloading_finish0005_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0005.ogg"; public const string resource_sound_sfx_reloading_Reloading_finish0001_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0001.ogg"; public const string resource_sound_sfx_reloading_Reloading_finish0002_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0002.ogg"; public const string resource_sound_sfx_reloading_Reloading_finish0003_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0003.ogg"; - public const string resource_sound_sfx_reloading_Reloading_finish0004_ogg = "res://resource/sound/sfx/reloading/Reloading_finish0004.ogg"; - public const string resource_sound_sfx_shooting_Shooting0001_ogg = "res://resource/sound/sfx/shooting/Shooting0001.ogg"; - public const string resource_sound_sfx_shooting_Shooting0002_ogg = "res://resource/sound/sfx/shooting/Shooting0002.ogg"; - public const string resource_sound_sfx_shooting_Shooting0003_ogg = "res://resource/sound/sfx/shooting/Shooting0003.ogg"; - public const string resource_sound_sfx_shooting_Shooting0004_ogg = "res://resource/sound/sfx/shooting/Shooting0004.ogg"; - public const string resource_sound_sfx_shooting_Shooting0005_ogg = "res://resource/sound/sfx/shooting/Shooting0005.ogg"; - public const string resource_sound_sfx_shooting_Shooting0006_ogg = "res://resource/sound/sfx/shooting/Shooting0006.ogg"; - public const string resource_sound_sfx_shooting_Shooting0007_ogg = "res://resource/sound/sfx/shooting/Shooting0007.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0001_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0001.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0002_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0002.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0003_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0003.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0007_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0007.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0013_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0013.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0012_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0012.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0006_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0006.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0010_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0010.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0004_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0004.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0005_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0005.ogg"; + public const string resource_sound_sfx_reloading_Reloading_begin0011_ogg = "res://resource/sound/sfx/reloading/Reloading_begin0011.ogg"; + public const string resource_sound_sfx_collision_Collision0001_ogg = "res://resource/sound/sfx/collision/Collision0001.ogg"; public const string resource_sound_sfx_shooting_Shooting0008_ogg = "res://resource/sound/sfx/shooting/Shooting0008.ogg"; public const string resource_sound_sfx_shooting_Shooting0009_ogg = "res://resource/sound/sfx/shooting/Shooting0009.ogg"; + public const string resource_sound_sfx_shooting_Shooting0002_ogg = "res://resource/sound/sfx/shooting/Shooting0002.ogg"; + public const string resource_sound_sfx_shooting_Shooting0003_ogg = "res://resource/sound/sfx/shooting/Shooting0003.ogg"; + public const string resource_sound_sfx_shooting_Shooting0001_ogg = "res://resource/sound/sfx/shooting/Shooting0001.ogg"; + public const string resource_sound_sfx_shooting_Shooting0004_ogg = "res://resource/sound/sfx/shooting/Shooting0004.ogg"; public const string resource_sound_sfx_shooting_Shooting0010_ogg = "res://resource/sound/sfx/shooting/Shooting0010.ogg"; public const string resource_sound_sfx_shooting_Shooting0011_ogg = "res://resource/sound/sfx/shooting/Shooting0011.ogg"; - public const string resource_sprite_brush_Brush1_png = "res://resource/sprite/brush/Brush1.png"; - public const string resource_sprite_brush_Brush2_png = "res://resource/sprite/brush/Brush2.png"; - public const string resource_sprite_brush_Brush3_png = "res://resource/sprite/brush/Brush3.png"; - public const string resource_sprite_brush_Brush4_png = "res://resource/sprite/brush/Brush4.png"; - public const string resource_sprite_brush_Brush5_png = "res://resource/sprite/brush/Brush5.png"; - public const string resource_sprite_bullet_collision_Collision0001_png = "res://resource/sprite/bullet/collision/Collision0001.png"; - public const string resource_sprite_bullet_collision_Collision0002_png = "res://resource/sprite/bullet/collision/Collision0002.png"; - public const string resource_sprite_bullet_laser_Laser0001_png = "res://resource/sprite/bullet/laser/Laser0001.png"; - public const string resource_sprite_bullet_normal_arrow_png = "res://resource/sprite/bullet/normal/arrow.png"; - public const string resource_sprite_bullet_normal_bullet0001_png = "res://resource/sprite/bullet/normal/bullet0001.png"; - public const string resource_sprite_bullet_normal_bullet0002_png = "res://resource/sprite/bullet/normal/bullet0002.png"; - public const string resource_sprite_bullet_normal_bullet0003_png = "res://resource/sprite/bullet/normal/bullet0003.png"; - public const string resource_sprite_bullet_normal_bullet0004_png = "res://resource/sprite/bullet/normal/bullet0004.png"; - public const string resource_sprite_bullet_normal_bullet0005_png = "res://resource/sprite/bullet/normal/bullet0005.png"; - public const string resource_sprite_bullet_normal_bullet2_png = "res://resource/sprite/bullet/normal/bullet2.png"; - public const string resource_sprite_common_Circle_png = "res://resource/sprite/common/Circle.png"; - public const string resource_sprite_common_Circle2_png = "res://resource/sprite/common/Circle2.png"; - public const string resource_sprite_common_debug_arrows_png = "res://resource/sprite/common/debug_arrows.png"; - public const string resource_sprite_common_Effect1_png = "res://resource/sprite/common/Effect1.png"; - public const string resource_sprite_common_MeleeAttack1_png = "res://resource/sprite/common/MeleeAttack1.png"; - public const string resource_sprite_common_Smoke_png = "res://resource/sprite/common/Smoke.png"; - public const string resource_sprite_common_Smoke2_png = "res://resource/sprite/common/Smoke2.png"; - public const string resource_sprite_common_Smoke3_png = "res://resource/sprite/common/Smoke3.png"; - public const string resource_sprite_common_Smoke4_png = "res://resource/sprite/common/Smoke4.png"; - public const string resource_sprite_explode_Explode_circle0001_png = "res://resource/sprite/explode/Explode_circle0001.png"; - public const string resource_sprite_explode_Explode_circle0002_png = "res://resource/sprite/explode/Explode_circle0002.png"; - public const string resource_sprite_explode_Explode_circle0003_png = "res://resource/sprite/explode/Explode_circle0003.png"; - public const string resource_sprite_explode_Explode_line0001_png = "res://resource/sprite/explode/Explode_line0001.png"; - public const string resource_sprite_explode_Explode_pit0001_png = "res://resource/sprite/explode/Explode_pit0001.png"; - public const string resource_sprite_map_door_png = "res://resource/sprite/map/door.png"; - public const string resource_sprite_map_door1_down_png = "res://resource/sprite/map/door1_down.png"; - public const string resource_sprite_map_PreviewTransition_png = "res://resource/sprite/map/PreviewTransition.png"; - public const string resource_sprite_map_PreviewTransition2_png = "res://resource/sprite/map/PreviewTransition2.png"; - public const string resource_sprite_map_WallTransition1_png = "res://resource/sprite/map/WallTransition1.png"; - public const string resource_sprite_map_WallTransition2_png = "res://resource/sprite/map/WallTransition2.png"; - public const string resource_sprite_map_WallTransition3_png = "res://resource/sprite/map/WallTransition3.png"; - public const string resource_sprite_prop_active_ActiveProp5000_png = "res://resource/sprite/prop/active/ActiveProp5000.png"; - public const string resource_sprite_prop_active_ActiveProp5001_png = "res://resource/sprite/prop/active/ActiveProp5001.png"; - public const string resource_sprite_prop_buff_BuffProp0001_png = "res://resource/sprite/prop/buff/BuffProp0001.png"; - public const string resource_sprite_prop_buff_BuffProp0002_png = "res://resource/sprite/prop/buff/BuffProp0002.png"; - public const string resource_sprite_prop_buff_BuffProp0003_png = "res://resource/sprite/prop/buff/BuffProp0003.png"; - public const string resource_sprite_prop_buff_BuffProp0004_png = "res://resource/sprite/prop/buff/BuffProp0004.png"; - public const string resource_sprite_prop_buff_BuffProp0005_png = "res://resource/sprite/prop/buff/BuffProp0005.png"; - public const string resource_sprite_prop_buff_BuffProp0006_png = "res://resource/sprite/prop/buff/BuffProp0006.png"; - public const string resource_sprite_prop_buff_BuffProp0007_png = "res://resource/sprite/prop/buff/BuffProp0007.png"; - public const string resource_sprite_prop_buff_BuffProp0008_png = "res://resource/sprite/prop/buff/BuffProp0008.png"; - public const string resource_sprite_prop_buff_BuffProp0009_png = "res://resource/sprite/prop/buff/BuffProp0009.png"; - public const string resource_sprite_prop_buff_BuffProp0010_png = "res://resource/sprite/prop/buff/BuffProp0010.png"; - public const string resource_sprite_prop_buff_BuffProp0011_png = "res://resource/sprite/prop/buff/BuffProp0011.png"; - public const string resource_sprite_prop_buff_BuffProp0012_png = "res://resource/sprite/prop/buff/BuffProp0012.png"; - public const string resource_sprite_prop_buff_BuffProp0013_png = "res://resource/sprite/prop/buff/BuffProp0013.png"; - public const string resource_sprite_prop_buff_BuffProp0014_png = "res://resource/sprite/prop/buff/BuffProp0014.png"; - public const string resource_sprite_role_role10_png = "res://resource/sprite/role/role10.png"; - public const string resource_sprite_role_role3_png = "res://resource/sprite/role/role3.png"; - public const string resource_sprite_role_role4_png = "res://resource/sprite/role/role4.png"; - public const string resource_sprite_role_role5_png = "res://resource/sprite/role/role5.png"; - public const string resource_sprite_role_role6_png = "res://resource/sprite/role/role6.png"; - public const string resource_sprite_role_role7_png = "res://resource/sprite/role/role7.png"; - public const string resource_sprite_role_role8_png = "res://resource/sprite/role/role8.png"; - public const string resource_sprite_role_role9_png = "res://resource/sprite/role/role9.png"; - public const string resource_sprite_role_common_Role_astonished_png = "res://resource/sprite/role/common/Role_astonished.png"; - public const string resource_sprite_role_common_Role_notify_png = "res://resource/sprite/role/common/Role_notify.png"; - public const string resource_sprite_role_common_Role_query_png = "res://resource/sprite/role/common/Role_query.png"; - public const string resource_sprite_role_common_Role_shadow1_png = "res://resource/sprite/role/common/Role_shadow1.png"; - public const string resource_sprite_role_enemy0001_enemy0001_png = "res://resource/sprite/role/enemy0001/enemy0001.png"; - public const string resource_sprite_role_enemy0001_enemy0001_Debris_png = "res://resource/sprite/role/enemy0001/enemy0001_Debris.png"; - public const string resource_sprite_role_enemy0001_enemy0001_Icon_png = "res://resource/sprite/role/enemy0001/enemy0001_Icon.png"; - public const string resource_sprite_role_enemy0002_Enemy0002_png = "res://resource/sprite/role/enemy0002/Enemy0002.png"; - public const string resource_sprite_role_enemy0002_Enemy0002_attack_png = "res://resource/sprite/role/enemy0002/Enemy0002_attack.png"; - public const string resource_sprite_role_enemy0002_Enemy0002_dead_png = "res://resource/sprite/role/enemy0002/Enemy0002_dead.png"; - public const string resource_sprite_role_enemy0002_Enemy0002_idle_png = "res://resource/sprite/role/enemy0002/Enemy0002_idle.png"; - public const string resource_sprite_role_enemy0002_Enemy0002_run_png = "res://resource/sprite/role/enemy0002/Enemy0002_run.png"; - public const string resource_sprite_role_role0001_Role0001_png = "res://resource/sprite/role/role0001/Role0001.png"; - public const string resource_sprite_role_role0001_Role0001_head_png = "res://resource/sprite/role/role0001/Role0001_head.png"; - public const string resource_sprite_role_role0001_Role0001_Icon_png = "res://resource/sprite/role/role0001/Role0001_Icon.png"; - public const string resource_sprite_role_role0001_idle_Sprite0002_png = "res://resource/sprite/role/role0001/idle/Sprite-0002.png"; - public const string resource_sprite_role_role0001_idle_Sprite0003_png = "res://resource/sprite/role/role0001/idle/Sprite-0003.png"; - public const string resource_sprite_role_role0001_idle_Sprite0004_png = "res://resource/sprite/role/role0001/idle/Sprite-0004.png"; - public const string resource_sprite_role_role0001_idle_Sprite0005_png = "res://resource/sprite/role/role0001/idle/Sprite-0005.png"; - public const string resource_sprite_role_role0001_idle_Sprite0006_png = "res://resource/sprite/role/role0001/idle/Sprite-0006.png"; - public const string resource_sprite_role_role0001_idle_Sprite0007_png = "res://resource/sprite/role/role0001/idle/Sprite-0007.png"; - public const string resource_sprite_role_role0001_idle_Sprite0008_png = "res://resource/sprite/role/role0001/idle/Sprite-0008.png"; - public const string resource_sprite_role_role0001_roll_Sprite0008_png = "res://resource/sprite/role/role0001/roll/Sprite-0008.png"; - public const string resource_sprite_role_role0001_roll_Sprite0009_png = "res://resource/sprite/role/role0001/roll/Sprite-0009.png"; - public const string resource_sprite_role_role0001_roll_Sprite0010_png = "res://resource/sprite/role/role0001/roll/Sprite-0010.png"; - public const string resource_sprite_role_role0001_roll_Sprite0011_png = "res://resource/sprite/role/role0001/roll/Sprite-0011.png"; - public const string resource_sprite_role_role0001_roll_Sprite0012_png = "res://resource/sprite/role/role0001/roll/Sprite-0012.png"; - public const string resource_sprite_role_role0001_roll_Sprite0013_png = "res://resource/sprite/role/role0001/roll/Sprite-0013.png"; - public const string resource_sprite_role_role0001_roll_Sprite0014_png = "res://resource/sprite/role/role0001/roll/Sprite-0014.png"; - public const string resource_sprite_role_role0001_roll_Sprite0015_png = "res://resource/sprite/role/role0001/roll/Sprite-0015.png"; - public const string resource_sprite_role_role0001_roll_Sprite0016_png = "res://resource/sprite/role/role0001/roll/Sprite-0016.png"; - public const string resource_sprite_role_role0001_roll_Sprite0017_png = "res://resource/sprite/role/role0001/roll/Sprite-0017.png"; - public const string resource_sprite_role_role0001_roll_Sprite0018_png = "res://resource/sprite/role/role0001/roll/Sprite-0018.png"; - public const string resource_sprite_role_role0001_run_Sprite0002_png = "res://resource/sprite/role/role0001/run/Sprite-0002.png"; - public const string resource_sprite_role_role0001_run_Sprite0003_png = "res://resource/sprite/role/role0001/run/Sprite-0003.png"; - public const string resource_sprite_role_role0001_run_Sprite0004_png = "res://resource/sprite/role/role0001/run/Sprite-0004.png"; - public const string resource_sprite_role_role0001_run_Sprite0005_png = "res://resource/sprite/role/role0001/run/Sprite-0005.png"; - public const string resource_sprite_role_role0001_run_Sprite0006_png = "res://resource/sprite/role/role0001/run/Sprite-0006.png"; - public const string resource_sprite_role_role0001_run_Sprite0007_png = "res://resource/sprite/role/role0001/run/Sprite-0007.png"; - public const string resource_sprite_role_role0001_run_Sprite0008_png = "res://resource/sprite/role/role0001/run/Sprite-0008.png"; - public const string resource_sprite_shell_Shell0001_png = "res://resource/sprite/shell/Shell0001.png"; - public const string resource_sprite_shell_Shell0002_png = "res://resource/sprite/shell/Shell0002.png"; - public const string resource_sprite_shell_Shell0003_png = "res://resource/sprite/shell/Shell0003.png"; - public const string resource_sprite_shell_Shell0004_png = "res://resource/sprite/shell/Shell0004.png"; - public const string resource_sprite_shootFire_ShotFire0001_png = "res://resource/sprite/shootFire/ShotFire0001.png"; - public const string resource_sprite_shootFire_ShotFire0002_png = "res://resource/sprite/shootFire/ShotFire0002.png"; - public const string resource_sprite_ui_font_bg_png = "res://resource/sprite/ui/font_bg.png"; - public const string resource_sprite_ui_GUI_png = "res://resource/sprite/ui/GUI.png"; - public const string resource_sprite_ui_commonIcon_Add_png = "res://resource/sprite/ui/commonIcon/Add.png"; - public const string resource_sprite_ui_commonIcon_AreaTool_png = "res://resource/sprite/ui/commonIcon/AreaTool.png"; - public const string resource_sprite_ui_commonIcon_Back_png = "res://resource/sprite/ui/commonIcon/Back.png"; - public const string resource_sprite_ui_commonIcon_BirthMark_png = "res://resource/sprite/ui/commonIcon/BirthMark.png"; - public const string resource_sprite_ui_commonIcon_Block_png = "res://resource/sprite/ui/commonIcon/Block.png"; - public const string resource_sprite_ui_commonIcon_CenterTool_png = "res://resource/sprite/ui/commonIcon/CenterTool.png"; - public const string resource_sprite_ui_commonIcon_Delete_png = "res://resource/sprite/ui/commonIcon/Delete.png"; - public const string resource_sprite_ui_commonIcon_DoorTool_png = "res://resource/sprite/ui/commonIcon/DoorTool.png"; - public const string resource_sprite_ui_commonIcon_Down_png = "res://resource/sprite/ui/commonIcon/Down.png"; - public const string resource_sprite_ui_commonIcon_DragTool_png = "res://resource/sprite/ui/commonIcon/DragTool.png"; - public const string resource_sprite_ui_commonIcon_Edit_png = "res://resource/sprite/ui/commonIcon/Edit.png"; - public const string resource_sprite_ui_commonIcon_Error_mini_png = "res://resource/sprite/ui/commonIcon/Error_mini.png"; - public const string resource_sprite_ui_commonIcon_Hide_png = "res://resource/sprite/ui/commonIcon/Hide.png"; - public const string resource_sprite_ui_commonIcon_Lock_png = "res://resource/sprite/ui/commonIcon/Lock.png"; - public const string resource_sprite_ui_commonIcon_Mark_png = "res://resource/sprite/ui/commonIcon/Mark.png"; - public const string resource_sprite_ui_commonIcon_MarkCell_png = "res://resource/sprite/ui/commonIcon/MarkCell.png"; - public const string resource_sprite_ui_commonIcon_MarkCell_placeholder_png = "res://resource/sprite/ui/commonIcon/MarkCell_placeholder.png"; - public const string resource_sprite_ui_commonIcon_PackageMark_png = "res://resource/sprite/ui/commonIcon/PackageMark.png"; - public const string resource_sprite_ui_commonIcon_PenTool_png = "res://resource/sprite/ui/commonIcon/PenTool.png"; - public const string resource_sprite_ui_commonIcon_Play_png = "res://resource/sprite/ui/commonIcon/Play.png"; - public const string resource_sprite_ui_commonIcon_Right_png = "res://resource/sprite/ui/commonIcon/Right.png"; - public const string resource_sprite_ui_commonIcon_Save_png = "res://resource/sprite/ui/commonIcon/Save.png"; - public const string resource_sprite_ui_commonIcon_Search_png = "res://resource/sprite/ui/commonIcon/Search.png"; - public const string resource_sprite_ui_commonIcon_Select_png = "res://resource/sprite/ui/commonIcon/Select.png"; - public const string resource_sprite_ui_commonIcon_Select2_png = "res://resource/sprite/ui/commonIcon/Select2.png"; - public const string resource_sprite_ui_commonIcon_Setting_png = "res://resource/sprite/ui/commonIcon/Setting.png"; - public const string resource_sprite_ui_commonIcon_Unknown_png = "res://resource/sprite/ui/commonIcon/Unknown.png"; - public const string resource_sprite_ui_commonIcon_UnknownActivity_png = "res://resource/sprite/ui/commonIcon/UnknownActivity.png"; - public const string resource_sprite_ui_commonIcon_Unlock_png = "res://resource/sprite/ui/commonIcon/Unlock.png"; - public const string resource_sprite_ui_commonIcon_Visible_png = "res://resource/sprite/ui/commonIcon/Visible.png"; - public const string resource_sprite_ui_commonIcon_WaveCell_png = "res://resource/sprite/ui/commonIcon/WaveCell.png"; - public const string resource_sprite_ui_keyboard_e_png = "res://resource/sprite/ui/keyboard/e.png"; - public const string resource_sprite_ui_mapEditorProject_CellBg_png = "res://resource/sprite/ui/mapEditorProject/CellBg.png"; - public const string resource_sprite_ui_mapEditorTools_DoorDragButton_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton.png"; - public const string resource_sprite_ui_mapEditorTools_DoorDragButton_down_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton_down.png"; - public const string resource_sprite_ui_mapEditorTools_DoorDragButton_hover_png = "res://resource/sprite/ui/mapEditorTools/DoorDragButton_hover.png"; - public const string resource_sprite_ui_roomMap_MapBar_png = "res://resource/sprite/ui/roomMap/MapBar.png"; - public const string resource_sprite_ui_roomUI_ChargeProgress_png = "res://resource/sprite/ui/roomUI/ChargeProgress.png"; - public const string resource_sprite_ui_roomUI_ChargeProgressBar_png = "res://resource/sprite/ui/roomUI/ChargeProgressBar.png"; - public const string resource_sprite_ui_roomUI_Cooldown_png = "res://resource/sprite/ui/roomUI/Cooldown.png"; - public const string resource_sprite_ui_roomUI_icon_bullet_png = "res://resource/sprite/ui/roomUI/icon_bullet.png"; - public const string resource_sprite_ui_roomUI_icon_pickup_png = "res://resource/sprite/ui/roomUI/icon_pickup.png"; - public const string resource_sprite_ui_roomUI_icon_replace_png = "res://resource/sprite/ui/roomUI/icon_replace.png"; - public const string resource_sprite_ui_roomUI_Life_empty_png = "res://resource/sprite/ui/roomUI/Life_empty.png"; - public const string resource_sprite_ui_roomUI_Life_full_png = "res://resource/sprite/ui/roomUI/Life_full.png"; - public const string resource_sprite_ui_roomUI_Life_half_png = "res://resource/sprite/ui/roomUI/Life_half.png"; - public const string resource_sprite_ui_roomUI_Panel_png = "res://resource/sprite/ui/roomUI/Panel.png"; - public const string resource_sprite_ui_roomUI_Panel2_png = "res://resource/sprite/ui/roomUI/Panel2.png"; - public const string resource_sprite_ui_roomUI_ReloadBar_png = "res://resource/sprite/ui/roomUI/ReloadBar.png"; - public const string resource_sprite_ui_roomUI_ReloadBarBlock_png = "res://resource/sprite/ui/roomUI/ReloadBarBlock.png"; - public const string resource_sprite_ui_roomUI_Shield_empty_png = "res://resource/sprite/ui/roomUI/Shield_empty.png"; - public const string resource_sprite_ui_roomUI_Shield_full_png = "res://resource/sprite/ui/roomUI/Shield_full.png"; - public const string resource_sprite_ui_sursors_CursorCenter_png = "res://resource/sprite/ui/sursors/CursorCenter.png"; - public const string resource_sprite_ui_sursors_Cursors_png = "res://resource/sprite/ui/sursors/Cursors.png"; - public const string resource_sprite_ui_sursors_Cursors_Ui_png = "res://resource/sprite/ui/sursors/Cursors_Ui.png"; - public const string resource_sprite_weapon_bow_png = "res://resource/sprite/weapon/bow.png"; - public const string resource_sprite_weapon_gun1_png = "res://resource/sprite/weapon/gun1.png"; - public const string resource_sprite_weapon_gun2_png = "res://resource/sprite/weapon/gun2.png"; - public const string resource_sprite_weapon_gun3_png = "res://resource/sprite/weapon/gun3.png"; - public const string resource_sprite_weapon_gun4_png = "res://resource/sprite/weapon/gun4.png"; - public const string resource_sprite_weapon_gun5_png = "res://resource/sprite/weapon/gun5.png"; - public const string resource_sprite_weapon_gun6_png = "res://resource/sprite/weapon/gun6.png"; - public const string resource_sprite_weapon_gun7_png = "res://resource/sprite/weapon/gun7.png"; - public const string resource_sprite_weapon_gun8_png = "res://resource/sprite/weapon/gun8.png"; - public const string resource_sprite_weapon_weapon0001_Weapon0001_png = "res://resource/sprite/weapon/weapon0001/Weapon0001.png"; - public const string resource_sprite_weapon_weapon0002_Weapon0002_png = "res://resource/sprite/weapon/weapon0002/Weapon0002.png"; - public const string resource_sprite_weapon_weapon0002_Weapon0002_reloading_png = "res://resource/sprite/weapon/weapon0002/Weapon0002_reloading.png"; - public const string resource_sprite_weapon_weapon0003_Weapon0003_png = "res://resource/sprite/weapon/weapon0003/Weapon0003.png"; - public const string resource_sprite_weapon_weapon0004_KnifeHit1_png = "res://resource/sprite/weapon/weapon0004/KnifeHit1.png"; - public const string resource_sprite_weapon_weapon0004_Weapon0004_png = "res://resource/sprite/weapon/weapon0004/Weapon0004.png"; - public const string resource_sprite_weapon_weapon0005_Weapon0005_png = "res://resource/sprite/weapon/weapon0005/Weapon0005.png"; - public const string resource_sprite_weapon_weapon0006_Weapon0006_png = "res://resource/sprite/weapon/weapon0006/Weapon0006.png"; - public const string resource_sprite_weapon_weapon0007_Weapon0007_png = "res://resource/sprite/weapon/weapon0007/Weapon0007.png"; - public const string resource_sprite_weapon_weapon0008_Weapon0008_png = "res://resource/sprite/weapon/weapon0008/Weapon0008.png"; - public const string resource_sprite_weapon_weapon0008_Weapon0008_reloading_png = "res://resource/sprite/weapon/weapon0008/Weapon0008_reloading.png"; - public const string resource_sprite_weapon_weapon0009_weapon0009_png = "res://resource/sprite/weapon/weapon0009/weapon0009.png"; - public const string resource_sprite_weapon_weapon0009_Weapon0009_reload_png = "res://resource/sprite/weapon/weapon0009/Weapon0009_reload.png"; - public const string resource_spriteFrames_bullet_Bullet0001_tres = "res://resource/spriteFrames/bullet/Bullet0001.tres"; - public const string resource_spriteFrames_bullet_Bullet0002_tres = "res://resource/spriteFrames/bullet/Bullet0002.tres"; - public const string resource_spriteFrames_bullet_Bullet0003_tres = "res://resource/spriteFrames/bullet/Bullet0003.tres"; - public const string resource_spriteFrames_bullet_Bullet0004_tres = "res://resource/spriteFrames/bullet/Bullet0004.tres"; - public const string resource_spriteFrames_bullet_Bullet0005_tres = "res://resource/spriteFrames/bullet/Bullet0005.tres"; - public const string resource_spriteFrames_bullet_Collision0001_tres = "res://resource/spriteFrames/bullet/Collision0001.tres"; - public const string resource_spriteFrames_bullet_Collision0002_tres = "res://resource/spriteFrames/bullet/Collision0002.tres"; - public const string resource_spriteFrames_other_RoomDoor_E_Down_tres = "res://resource/spriteFrames/other/RoomDoor_E_Down.tres"; - public const string resource_spriteFrames_other_RoomDoor_E_Up_tres = "res://resource/spriteFrames/other/RoomDoor_E_Up.tres"; - public const string resource_spriteFrames_other_RoomDoor_N_tres = "res://resource/spriteFrames/other/RoomDoor_N.tres"; - public const string resource_spriteFrames_other_RoomDoor_S_tres = "res://resource/spriteFrames/other/RoomDoor_S.tres"; - public const string resource_spriteFrames_other_RoomDoor_W_Down_tres = "res://resource/spriteFrames/other/RoomDoor_W_Down.tres"; - public const string resource_spriteFrames_other_RoomDoor_W_Up_tres = "res://resource/spriteFrames/other/RoomDoor_W_Up.tres"; - public const string resource_spriteFrames_prop_active_ActiveProp5000_tres = "res://resource/spriteFrames/prop/active/ActiveProp5000.tres"; - public const string resource_spriteFrames_prop_active_ActiveProp5001_tres = "res://resource/spriteFrames/prop/active/ActiveProp5001.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0001_tres = "res://resource/spriteFrames/prop/buff/BuffProp0001.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0002_tres = "res://resource/spriteFrames/prop/buff/BuffProp0002.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0003_tres = "res://resource/spriteFrames/prop/buff/BuffProp0003.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0004_tres = "res://resource/spriteFrames/prop/buff/BuffProp0004.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0005_tres = "res://resource/spriteFrames/prop/buff/BuffProp0005.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0006_tres = "res://resource/spriteFrames/prop/buff/BuffProp0006.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0007_tres = "res://resource/spriteFrames/prop/buff/BuffProp0007.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0008_tres = "res://resource/spriteFrames/prop/buff/BuffProp0008.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0009_tres = "res://resource/spriteFrames/prop/buff/BuffProp0009.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0010_tres = "res://resource/spriteFrames/prop/buff/BuffProp0010.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0011_tres = "res://resource/spriteFrames/prop/buff/BuffProp0011.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0012_tres = "res://resource/spriteFrames/prop/buff/BuffProp0012.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0013_tres = "res://resource/spriteFrames/prop/buff/BuffProp0013.tres"; - public const string resource_spriteFrames_prop_buff_BuffProp0014_tres = "res://resource/spriteFrames/prop/buff/BuffProp0014.tres"; - public const string resource_spriteFrames_role_Enemy0001_tres = "res://resource/spriteFrames/role/Enemy0001.tres"; - public const string resource_spriteFrames_role_Enemy0002_tres = "res://resource/spriteFrames/role/Enemy0002.tres"; - public const string resource_spriteFrames_role_Role0001_tres = "res://resource/spriteFrames/role/Role0001.tres"; - public const string resource_spriteFrames_role_Role_tip_tres = "res://resource/spriteFrames/role/Role_tip.tres"; - public const string resource_spriteFrames_shell_Shell0001_tres = "res://resource/spriteFrames/shell/Shell0001.tres"; - public const string resource_spriteFrames_shell_Shell0002_tres = "res://resource/spriteFrames/shell/Shell0002.tres"; - public const string resource_spriteFrames_shell_Shell0003_tres = "res://resource/spriteFrames/shell/Shell0003.tres"; - public const string resource_spriteFrames_shell_Shell0004_tres = "res://resource/spriteFrames/shell/Shell0004.tres"; - public const string resource_spriteFrames_weapon_Weapon0001_tres = "res://resource/spriteFrames/weapon/Weapon0001.tres"; - public const string resource_spriteFrames_weapon_Weapon0002_tres = "res://resource/spriteFrames/weapon/Weapon0002.tres"; - public const string resource_spriteFrames_weapon_Weapon0003_tres = "res://resource/spriteFrames/weapon/Weapon0003.tres"; - public const string resource_spriteFrames_weapon_Weapon0004_tres = "res://resource/spriteFrames/weapon/Weapon0004.tres"; - public const string resource_spriteFrames_weapon_Weapon0004_hit_tres = "res://resource/spriteFrames/weapon/Weapon0004_hit.tres"; - public const string resource_spriteFrames_weapon_Weapon0005_tres = "res://resource/spriteFrames/weapon/Weapon0005.tres"; - public const string resource_spriteFrames_weapon_Weapon0006_tres = "res://resource/spriteFrames/weapon/Weapon0006.tres"; - public const string resource_spriteFrames_weapon_Weapon0007_tres = "res://resource/spriteFrames/weapon/Weapon0007.tres"; - public const string resource_spriteFrames_weapon_Weapon0008_tres = "res://resource/spriteFrames/weapon/Weapon0008.tres"; - public const string resource_spriteFrames_weapon_Weapon0009_tres = "res://resource/spriteFrames/weapon/Weapon0009.tres"; - public const string resource_theme_mainTheme_tres = "res://resource/theme/mainTheme.tres"; - public const string resource_theme_theme1_tres = "res://resource/theme/theme1.tres"; - public const string scene_Main_tscn = "res://scene/Main.tscn"; - public const string scene_World_tscn = "res://scene/World.tscn"; - public const string scene_test_TestCreateSector_tscn = "res://scene/test/TestCreateSector.tscn"; - public const string scene_test_TestDrawSprite_tscn = "res://scene/test/TestDrawSprite.tscn"; - public const string scene_test_TestGridData_tscn = "res://scene/test/TestGridData.tscn"; - public const string scene_test_TestMask_tscn = "res://scene/test/TestMask.tscn"; - public const string scene_test_TestMask2_tscn = "res://scene/test/TestMask2.tscn"; - public const string scene_test_TestNavigation2_tscn = "res://scene/test/TestNavigation2.tscn"; - public const string scene_test_TestNavigationPolygon_tscn = "res://scene/test/TestNavigationPolygon.tscn"; - public const string scene_test_TestNewTileMap_tscn = "res://scene/test/TestNewTileMap.tscn"; - public const string scene_test_TestOptimizeSprite_tscn = "res://scene/test/TestOptimizeSprite.tscn"; - public const string scene_test_TestOutline_tscn = "res://scene/test/TestOutline.tscn"; - public const string scene_test_TestPerfectPixel_tscn = "res://scene/test/TestPerfectPixel.tscn"; - public const string scene_test_TestPerfectPixelScene_tscn = "res://scene/test/TestPerfectPixelScene.tscn"; - public const string scene_test_TestRoomFog_tscn = "res://scene/test/TestRoomFog.tscn"; - public const string scene_test_TestTileLayer_tscn = "res://scene/test/TestTileLayer.tscn"; + public const string resource_sound_sfx_shooting_Shooting0005_ogg = "res://resource/sound/sfx/shooting/Shooting0005.ogg"; + public const string resource_sound_sfx_shooting_Shooting0013_ogg = "res://resource/sound/sfx/shooting/Shooting0013.ogg"; + public const string resource_sound_sfx_shooting_Shooting0007_ogg = "res://resource/sound/sfx/shooting/Shooting0007.ogg"; + public const string resource_sound_sfx_shooting_Shooting0006_ogg = "res://resource/sound/sfx/shooting/Shooting0006.ogg"; + public const string resource_sound_sfx_shooting_Shooting0012_ogg = "res://resource/sound/sfx/shooting/Shooting0012.ogg"; + public const string resource_sound_bgm_Intro_ogg = "res://resource/sound/bgm/Intro.ogg"; + public const string resource_material_Blend_gdshader = "res://resource/material/Blend.gdshader"; + public const string resource_material_Grid_gdshader = "res://resource/material/Grid.gdshader"; + public const string resource_material_OffsetVertex_gdshader = "res://resource/material/OffsetVertex.gdshader"; + public const string resource_material_Blend_tres = "res://resource/material/Blend.tres"; + public const string resource_material_Outline2_tres = "res://resource/material/Outline2.tres"; + public const string resource_material_Mask_gdshader = "res://resource/material/Mask.gdshader"; + public const string resource_material_GodRays_gdshader = "res://resource/material/GodRays.gdshader"; + public const string resource_material_Sawtooth_tres = "res://resource/material/Sawtooth.tres"; + public const string resource_material_Sawtooth_gdshader = "res://resource/material/Sawtooth.gdshader"; + public const string resource_material_Outline2_gdshader = "res://resource/material/Outline2.gdshader"; + public const string resource_material_Grid_tres = "res://resource/material/Grid.tres"; + public const string resource_material_SmokeParticleMaterial_tres = "res://resource/material/SmokeParticleMaterial.tres"; + public const string resource_material_Outline_tres = "res://resource/material/Outline.tres"; + public const string resource_material_Outline_gdshader = "res://resource/material/Outline.gdshader"; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/SpecialEffectManager.cs b/DungeonShooting_Godot/src/game/manager/SpecialEffectManager.cs index 0d74206..5e5330e 100644 --- a/DungeonShooting_Godot/src/game/manager/SpecialEffectManager.cs +++ b/DungeonShooting_Godot/src/game/manager/SpecialEffectManager.cs @@ -51,7 +51,7 @@ /// 层级 /// 播放速度 /// 循环次数, 到达该次数特效停止播放 - public static void Play(Node root, string path, string animName, Vector2 pos, float rotation, Vector2 scale, Vector2 offset, int zIndex = 0, float speed = 1, int loopCount = 1) + public static void PlaySpriteFrames(Node root, string path, string animName, Vector2 pos, float rotation, Vector2 scale, Vector2 offset, int zIndex = 0, float speed = 1, int loopCount = 1) { var spriteFrames = ResourceManager.Load(path); var specialEffect = new SpecialEffect(); diff --git a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs index 0cc8c3f..750f5a7 100644 --- a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs +++ b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs @@ -7,27 +7,39 @@ { public const string BottomTips = "BottomTips"; public const string Debugger = "Debugger"; + public const string EditorColorPicker = "EditorColorPicker"; + public const string EditorDungeonGroup = "EditorDungeonGroup"; + public const string EditorForm = "EditorForm"; + public const string EditorImportCombination = "EditorImportCombination"; + public const string EditorInfo = "EditorInfo"; + public const string EditorInput = "EditorInput"; + public const string EditorManager = "EditorManager"; + public const string EditorTileImage = "EditorTileImage"; public const string EditorTips = "EditorTips"; public const string EditorTools = "EditorTools"; public const string EditorWindow = "EditorWindow"; public const string Loading = "Loading"; public const string Main = "Main"; public const string MapEditor = "MapEditor"; - public const string MapEditorCreateGroup = "MapEditorCreateGroup"; public const string MapEditorCreateMark = "MapEditorCreateMark"; public const string MapEditorCreatePreinstall = "MapEditorCreatePreinstall"; public const string MapEditorCreateRoom = "MapEditorCreateRoom"; public const string MapEditorMapLayer = "MapEditorMapLayer"; public const string MapEditorMapMark = "MapEditorMapMark"; + public const string MapEditorMapTile = "MapEditorMapTile"; public const string MapEditorProject = "MapEditorProject"; public const string MapEditorSelectObject = "MapEditorSelectObject"; - public const string MapEditorTileSet = "MapEditorTileSet"; public const string MapEditorTools = "MapEditorTools"; public const string PauseMenu = "PauseMenu"; public const string RoomMap = "RoomMap"; public const string RoomUI = "RoomUI"; public const string Setting = "Setting"; public const string Settlement = "Settlement"; + public const string TileSetEditor = "TileSetEditor"; + public const string TileSetEditorCombination = "TileSetEditorCombination"; + public const string TileSetEditorImport = "TileSetEditorImport"; + public const string TileSetEditorProject = "TileSetEditorProject"; + public const string TileSetEditorTerrain = "TileSetEditorTerrain"; } /// @@ -127,6 +139,390 @@ } /// + /// 创建 EditorColorPicker, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorColorPicker.EditorColorPickerPanel Create_EditorColorPicker() + { + return CreateUi(UiNames.EditorColorPicker); + } + + /// + /// 打开 EditorColorPicker, 并返回UI实例 + /// + public static UI.EditorColorPicker.EditorColorPickerPanel Open_EditorColorPicker() + { + return OpenUi(UiNames.EditorColorPicker); + } + + /// + /// 隐藏 EditorColorPicker 的所有实例 + /// + public static void Hide_EditorColorPicker() + { + var uiInstance = Get_EditorColorPicker_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorColorPicker 的所有实例 + /// + public static void Destroy_EditorColorPicker() + { + var uiInstance = Get_EditorColorPicker_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorColorPicker 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorColorPicker.EditorColorPickerPanel[] Get_EditorColorPicker_Instance() + { + return GetUiInstance(nameof(UI.EditorColorPicker.EditorColorPicker)); + } + + /// + /// 创建 EditorDungeonGroup, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorDungeonGroup.EditorDungeonGroupPanel Create_EditorDungeonGroup() + { + return CreateUi(UiNames.EditorDungeonGroup); + } + + /// + /// 打开 EditorDungeonGroup, 并返回UI实例 + /// + public static UI.EditorDungeonGroup.EditorDungeonGroupPanel Open_EditorDungeonGroup() + { + return OpenUi(UiNames.EditorDungeonGroup); + } + + /// + /// 隐藏 EditorDungeonGroup 的所有实例 + /// + public static void Hide_EditorDungeonGroup() + { + var uiInstance = Get_EditorDungeonGroup_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorDungeonGroup 的所有实例 + /// + public static void Destroy_EditorDungeonGroup() + { + var uiInstance = Get_EditorDungeonGroup_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorDungeonGroup 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorDungeonGroup.EditorDungeonGroupPanel[] Get_EditorDungeonGroup_Instance() + { + return GetUiInstance(nameof(UI.EditorDungeonGroup.EditorDungeonGroup)); + } + + /// + /// 创建 EditorForm, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorForm.EditorFormPanel Create_EditorForm() + { + return CreateUi(UiNames.EditorForm); + } + + /// + /// 打开 EditorForm, 并返回UI实例 + /// + public static UI.EditorForm.EditorFormPanel Open_EditorForm() + { + return OpenUi(UiNames.EditorForm); + } + + /// + /// 隐藏 EditorForm 的所有实例 + /// + public static void Hide_EditorForm() + { + var uiInstance = Get_EditorForm_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorForm 的所有实例 + /// + public static void Destroy_EditorForm() + { + var uiInstance = Get_EditorForm_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorForm 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorForm.EditorFormPanel[] Get_EditorForm_Instance() + { + return GetUiInstance(nameof(UI.EditorForm.EditorForm)); + } + + /// + /// 创建 EditorImportCombination, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorImportCombination.EditorImportCombinationPanel Create_EditorImportCombination() + { + return CreateUi(UiNames.EditorImportCombination); + } + + /// + /// 打开 EditorImportCombination, 并返回UI实例 + /// + public static UI.EditorImportCombination.EditorImportCombinationPanel Open_EditorImportCombination() + { + return OpenUi(UiNames.EditorImportCombination); + } + + /// + /// 隐藏 EditorImportCombination 的所有实例 + /// + public static void Hide_EditorImportCombination() + { + var uiInstance = Get_EditorImportCombination_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorImportCombination 的所有实例 + /// + public static void Destroy_EditorImportCombination() + { + var uiInstance = Get_EditorImportCombination_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorImportCombination 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorImportCombination.EditorImportCombinationPanel[] Get_EditorImportCombination_Instance() + { + return GetUiInstance(nameof(UI.EditorImportCombination.EditorImportCombination)); + } + + /// + /// 创建 EditorInfo, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorInfo.EditorInfoPanel Create_EditorInfo() + { + return CreateUi(UiNames.EditorInfo); + } + + /// + /// 打开 EditorInfo, 并返回UI实例 + /// + public static UI.EditorInfo.EditorInfoPanel Open_EditorInfo() + { + return OpenUi(UiNames.EditorInfo); + } + + /// + /// 隐藏 EditorInfo 的所有实例 + /// + public static void Hide_EditorInfo() + { + var uiInstance = Get_EditorInfo_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorInfo 的所有实例 + /// + public static void Destroy_EditorInfo() + { + var uiInstance = Get_EditorInfo_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorInfo 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorInfo.EditorInfoPanel[] Get_EditorInfo_Instance() + { + return GetUiInstance(nameof(UI.EditorInfo.EditorInfo)); + } + + /// + /// 创建 EditorInput, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorInput.EditorInputPanel Create_EditorInput() + { + return CreateUi(UiNames.EditorInput); + } + + /// + /// 打开 EditorInput, 并返回UI实例 + /// + public static UI.EditorInput.EditorInputPanel Open_EditorInput() + { + return OpenUi(UiNames.EditorInput); + } + + /// + /// 隐藏 EditorInput 的所有实例 + /// + public static void Hide_EditorInput() + { + var uiInstance = Get_EditorInput_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorInput 的所有实例 + /// + public static void Destroy_EditorInput() + { + var uiInstance = Get_EditorInput_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorInput 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorInput.EditorInputPanel[] Get_EditorInput_Instance() + { + return GetUiInstance(nameof(UI.EditorInput.EditorInput)); + } + + /// + /// 创建 EditorManager, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorManager.EditorManagerPanel Create_EditorManager() + { + return CreateUi(UiNames.EditorManager); + } + + /// + /// 打开 EditorManager, 并返回UI实例 + /// + public static UI.EditorManager.EditorManagerPanel Open_EditorManager() + { + return OpenUi(UiNames.EditorManager); + } + + /// + /// 隐藏 EditorManager 的所有实例 + /// + public static void Hide_EditorManager() + { + var uiInstance = Get_EditorManager_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorManager 的所有实例 + /// + public static void Destroy_EditorManager() + { + var uiInstance = Get_EditorManager_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorManager 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorManager.EditorManagerPanel[] Get_EditorManager_Instance() + { + return GetUiInstance(nameof(UI.EditorManager.EditorManager)); + } + + /// + /// 创建 EditorTileImage, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.EditorTileImage.EditorTileImagePanel Create_EditorTileImage() + { + return CreateUi(UiNames.EditorTileImage); + } + + /// + /// 打开 EditorTileImage, 并返回UI实例 + /// + public static UI.EditorTileImage.EditorTileImagePanel Open_EditorTileImage() + { + return OpenUi(UiNames.EditorTileImage); + } + + /// + /// 隐藏 EditorTileImage 的所有实例 + /// + public static void Hide_EditorTileImage() + { + var uiInstance = Get_EditorTileImage_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 EditorTileImage 的所有实例 + /// + public static void Destroy_EditorTileImage() + { + var uiInstance = Get_EditorTileImage_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 EditorTileImage 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.EditorTileImage.EditorTileImagePanel[] Get_EditorTileImage_Instance() + { + return GetUiInstance(nameof(UI.EditorTileImage.EditorTileImage)); + } + + /// /// 创建 EditorTips, 并返回UI实例, 该函数不会打开 Ui /// public static UI.EditorTips.EditorTipsPanel Create_EditorTips() @@ -415,54 +811,6 @@ } /// - /// 创建 MapEditorCreateGroup, 并返回UI实例, 该函数不会打开 Ui - /// - public static UI.MapEditorCreateGroup.MapEditorCreateGroupPanel Create_MapEditorCreateGroup() - { - return CreateUi(UiNames.MapEditorCreateGroup); - } - - /// - /// 打开 MapEditorCreateGroup, 并返回UI实例 - /// - public static UI.MapEditorCreateGroup.MapEditorCreateGroupPanel Open_MapEditorCreateGroup() - { - return OpenUi(UiNames.MapEditorCreateGroup); - } - - /// - /// 隐藏 MapEditorCreateGroup 的所有实例 - /// - public static void Hide_MapEditorCreateGroup() - { - var uiInstance = Get_MapEditorCreateGroup_Instance(); - foreach (var uiPanel in uiInstance) - { - uiPanel.HideUi(); - } - } - - /// - /// 销毁 MapEditorCreateGroup 的所有实例 - /// - public static void Destroy_MapEditorCreateGroup() - { - var uiInstance = Get_MapEditorCreateGroup_Instance(); - foreach (var uiPanel in uiInstance) - { - uiPanel.Destroy(); - } - } - - /// - /// 获取所有 MapEditorCreateGroup 的实例, 如果没有实例, 则返回一个空数组 - /// - public static UI.MapEditorCreateGroup.MapEditorCreateGroupPanel[] Get_MapEditorCreateGroup_Instance() - { - return GetUiInstance(nameof(UI.MapEditorCreateGroup.MapEditorCreateGroup)); - } - - /// /// 创建 MapEditorCreateMark, 并返回UI实例, 该函数不会打开 Ui /// public static UI.MapEditorCreateMark.MapEditorCreateMarkPanel Create_MapEditorCreateMark() @@ -703,6 +1051,54 @@ } /// + /// 创建 MapEditorMapTile, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.MapEditorMapTile.MapEditorMapTilePanel Create_MapEditorMapTile() + { + return CreateUi(UiNames.MapEditorMapTile); + } + + /// + /// 打开 MapEditorMapTile, 并返回UI实例 + /// + public static UI.MapEditorMapTile.MapEditorMapTilePanel Open_MapEditorMapTile() + { + return OpenUi(UiNames.MapEditorMapTile); + } + + /// + /// 隐藏 MapEditorMapTile 的所有实例 + /// + public static void Hide_MapEditorMapTile() + { + var uiInstance = Get_MapEditorMapTile_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 MapEditorMapTile 的所有实例 + /// + public static void Destroy_MapEditorMapTile() + { + var uiInstance = Get_MapEditorMapTile_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 MapEditorMapTile 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.MapEditorMapTile.MapEditorMapTilePanel[] Get_MapEditorMapTile_Instance() + { + return GetUiInstance(nameof(UI.MapEditorMapTile.MapEditorMapTile)); + } + + /// /// 创建 MapEditorProject, 并返回UI实例, 该函数不会打开 Ui /// public static UI.MapEditorProject.MapEditorProjectPanel Create_MapEditorProject() @@ -799,54 +1195,6 @@ } /// - /// 创建 MapEditorTileSet, 并返回UI实例, 该函数不会打开 Ui - /// - public static UI.MapEditorTileSet.MapEditorTileSetPanel Create_MapEditorTileSet() - { - return CreateUi(UiNames.MapEditorTileSet); - } - - /// - /// 打开 MapEditorTileSet, 并返回UI实例 - /// - public static UI.MapEditorTileSet.MapEditorTileSetPanel Open_MapEditorTileSet() - { - return OpenUi(UiNames.MapEditorTileSet); - } - - /// - /// 隐藏 MapEditorTileSet 的所有实例 - /// - public static void Hide_MapEditorTileSet() - { - var uiInstance = Get_MapEditorTileSet_Instance(); - foreach (var uiPanel in uiInstance) - { - uiPanel.HideUi(); - } - } - - /// - /// 销毁 MapEditorTileSet 的所有实例 - /// - public static void Destroy_MapEditorTileSet() - { - var uiInstance = Get_MapEditorTileSet_Instance(); - foreach (var uiPanel in uiInstance) - { - uiPanel.Destroy(); - } - } - - /// - /// 获取所有 MapEditorTileSet 的实例, 如果没有实例, 则返回一个空数组 - /// - public static UI.MapEditorTileSet.MapEditorTileSetPanel[] Get_MapEditorTileSet_Instance() - { - return GetUiInstance(nameof(UI.MapEditorTileSet.MapEditorTileSet)); - } - - /// /// 创建 MapEditorTools, 并返回UI实例, 该函数不会打开 Ui /// public static UI.MapEditorTools.MapEditorToolsPanel Create_MapEditorTools() @@ -1134,4 +1482,244 @@ return GetUiInstance(nameof(UI.Settlement.Settlement)); } + /// + /// 创建 TileSetEditor, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.TileSetEditor.TileSetEditorPanel Create_TileSetEditor() + { + return CreateUi(UiNames.TileSetEditor); + } + + /// + /// 打开 TileSetEditor, 并返回UI实例 + /// + public static UI.TileSetEditor.TileSetEditorPanel Open_TileSetEditor() + { + return OpenUi(UiNames.TileSetEditor); + } + + /// + /// 隐藏 TileSetEditor 的所有实例 + /// + public static void Hide_TileSetEditor() + { + var uiInstance = Get_TileSetEditor_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 TileSetEditor 的所有实例 + /// + public static void Destroy_TileSetEditor() + { + var uiInstance = Get_TileSetEditor_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 TileSetEditor 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.TileSetEditor.TileSetEditorPanel[] Get_TileSetEditor_Instance() + { + return GetUiInstance(nameof(UI.TileSetEditor.TileSetEditor)); + } + + /// + /// 创建 TileSetEditorCombination, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.TileSetEditorCombination.TileSetEditorCombinationPanel Create_TileSetEditorCombination() + { + return CreateUi(UiNames.TileSetEditorCombination); + } + + /// + /// 打开 TileSetEditorCombination, 并返回UI实例 + /// + public static UI.TileSetEditorCombination.TileSetEditorCombinationPanel Open_TileSetEditorCombination() + { + return OpenUi(UiNames.TileSetEditorCombination); + } + + /// + /// 隐藏 TileSetEditorCombination 的所有实例 + /// + public static void Hide_TileSetEditorCombination() + { + var uiInstance = Get_TileSetEditorCombination_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 TileSetEditorCombination 的所有实例 + /// + public static void Destroy_TileSetEditorCombination() + { + var uiInstance = Get_TileSetEditorCombination_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 TileSetEditorCombination 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.TileSetEditorCombination.TileSetEditorCombinationPanel[] Get_TileSetEditorCombination_Instance() + { + return GetUiInstance(nameof(UI.TileSetEditorCombination.TileSetEditorCombination)); + } + + /// + /// 创建 TileSetEditorImport, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.TileSetEditorImport.TileSetEditorImportPanel Create_TileSetEditorImport() + { + return CreateUi(UiNames.TileSetEditorImport); + } + + /// + /// 打开 TileSetEditorImport, 并返回UI实例 + /// + public static UI.TileSetEditorImport.TileSetEditorImportPanel Open_TileSetEditorImport() + { + return OpenUi(UiNames.TileSetEditorImport); + } + + /// + /// 隐藏 TileSetEditorImport 的所有实例 + /// + public static void Hide_TileSetEditorImport() + { + var uiInstance = Get_TileSetEditorImport_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 TileSetEditorImport 的所有实例 + /// + public static void Destroy_TileSetEditorImport() + { + var uiInstance = Get_TileSetEditorImport_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 TileSetEditorImport 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.TileSetEditorImport.TileSetEditorImportPanel[] Get_TileSetEditorImport_Instance() + { + return GetUiInstance(nameof(UI.TileSetEditorImport.TileSetEditorImport)); + } + + /// + /// 创建 TileSetEditorProject, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.TileSetEditorProject.TileSetEditorProjectPanel Create_TileSetEditorProject() + { + return CreateUi(UiNames.TileSetEditorProject); + } + + /// + /// 打开 TileSetEditorProject, 并返回UI实例 + /// + public static UI.TileSetEditorProject.TileSetEditorProjectPanel Open_TileSetEditorProject() + { + return OpenUi(UiNames.TileSetEditorProject); + } + + /// + /// 隐藏 TileSetEditorProject 的所有实例 + /// + public static void Hide_TileSetEditorProject() + { + var uiInstance = Get_TileSetEditorProject_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 TileSetEditorProject 的所有实例 + /// + public static void Destroy_TileSetEditorProject() + { + var uiInstance = Get_TileSetEditorProject_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 TileSetEditorProject 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.TileSetEditorProject.TileSetEditorProjectPanel[] Get_TileSetEditorProject_Instance() + { + return GetUiInstance(nameof(UI.TileSetEditorProject.TileSetEditorProject)); + } + + /// + /// 创建 TileSetEditorTerrain, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.TileSetEditorTerrain.TileSetEditorTerrainPanel Create_TileSetEditorTerrain() + { + return CreateUi(UiNames.TileSetEditorTerrain); + } + + /// + /// 打开 TileSetEditorTerrain, 并返回UI实例 + /// + public static UI.TileSetEditorTerrain.TileSetEditorTerrainPanel Open_TileSetEditorTerrain() + { + return OpenUi(UiNames.TileSetEditorTerrain); + } + + /// + /// 隐藏 TileSetEditorTerrain 的所有实例 + /// + public static void Hide_TileSetEditorTerrain() + { + var uiInstance = Get_TileSetEditorTerrain_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 TileSetEditorTerrain 的所有实例 + /// + public static void Destroy_TileSetEditorTerrain() + { + var uiInstance = Get_TileSetEditorTerrain_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 TileSetEditorTerrain 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.TileSetEditorTerrain.TileSetEditorTerrainPanel[] Get_TileSetEditorTerrain_Instance() + { + return GetUiInstance(nameof(UI.TileSetEditorTerrain.TileSetEditorTerrain)); + } + } diff --git a/DungeonShooting_Godot/src/game/room/AutoTileConfig.cs b/DungeonShooting_Godot/src/game/room/AutoTileConfig.cs index 968d8f3..c021338 100644 --- a/DungeonShooting_Godot/src/game/room/AutoTileConfig.cs +++ b/DungeonShooting_Godot/src/game/room/AutoTileConfig.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; +using System.Linq; using Godot; /// @@ -7,58 +8,468 @@ /// public class AutoTileConfig { - public TileCellInfo IN_LT = new TileCellInfo(0, new Vector2I(3, 3)); - public TileCellInfo IN_LB = new TileCellInfo(0, new Vector2I(11, 2)); - public TileCellInfo IN_RT = new TileCellInfo(0, new Vector2I(1, 3)); - public TileCellInfo IN_RB = new TileCellInfo(0, new Vector2I(13, 2)); - public TileCellInfo R = new TileCellInfo(0, new Vector2I(1, 3)); - public TileCellInfo L = new TileCellInfo(0, new Vector2I(3, 3)); - public TileCellInfo T = new TileCellInfo(0, new Vector2I(2, 7)); - public TileCellInfo B = new TileCellInfo(0, new Vector2I(2, 2)); - public TileCellInfo Floor = new TileCellInfo(0, new Vector2I(0, 8)); + public TileCellData Floor; + public TileCellData TopMask; + public TileCellData Wall_Bottom; + public TileCellData Wall_Left; + public TileCellData Wall_Right; + public TileCellData Wall_Top; + public TileCellData Wall_Out_LB; + public TileCellData Wall_Out_LT; + public TileCellData Wall_Out_RB; + public TileCellData Wall_Out_RT; + public TileCellData Wall_In_LT; + public TileCellData Wall_In_LB; + public TileCellData Wall_In_RT; + public TileCellData Wall_In_RB; - public TileCellInfo OUT_LT = new TileCellInfo(0, new Vector2I(1, 2)); - public TileCellInfo OUT_LB = new TileCellInfo(0, new Vector2I(1, 7)); - public TileCellInfo OUT_RT = new TileCellInfo(0, new Vector2I(3, 2)); - public TileCellInfo OUT_RB = new TileCellInfo(0, new Vector2I(3, 7)); + public TileCellData Wall_Vertical_LeftTop; + public TileCellData Wall_Vertical_CenterTop; + public TileCellData Wall_Vertical_RightTop; + public TileCellData Wall_Vertical_SingleTop; - public TileCellInfo WALL_BLOCK = new TileCellInfo(0, new Vector2I(2, 3)); + public TileCellData Wall_Vertical_LeftBottom; + public TileCellData Wall_Vertical_CenterBottom; + public TileCellData Wall_Vertical_RightBottom; + public TileCellData Wall_Vertical_SingleBottom; - private List _middleLayerAtlasCoords = new List() + //----------------------------- 所有自动图块数据 ----------------------------- + //----------------------------- 命名规则: Auto_ + LT + T + RT + _ + L + C + R + _ + LB + B + RB + //第一列 + public TileCellData Auto_000_010_010; + public TileCellData Auto_010_010_010; + public TileCellData Auto_010_010_000; + public TileCellData Auto_000_010_000; + //第二列 + public TileCellData Auto_000_011_010; + public TileCellData Auto_010_011_010; + public TileCellData Auto_010_011_000; + public TileCellData Auto_000_011_000; + //第三列 + public TileCellData Auto_000_111_010; + public TileCellData Auto_010_111_010; + public TileCellData Auto_010_111_000; + public TileCellData Auto_000_111_000; + //第四列 + public TileCellData Auto_000_110_010; + public TileCellData Auto_010_110_010; + public TileCellData Auto_010_110_000; + public TileCellData Auto_000_110_000; + //第五列 + public TileCellData Auto_110_111_010; + public TileCellData Auto_010_011_011; + public TileCellData Auto_011_011_010; + public TileCellData Auto_010_111_110; + //第六列 + public TileCellData Auto_000_111_011; + public TileCellData Auto_011_111_111; + public TileCellData Auto_111_111_011; + public TileCellData Auto_011_111_000; + //第七列 + public TileCellData Auto_000_111_110; + public TileCellData Auto_110_111_111; + public TileCellData Auto_111_111_110; + public TileCellData Auto_110_111_000; + //第八列 + public TileCellData Auto_011_111_010; + public TileCellData Auto_010_110_110; + public TileCellData Auto_110_110_010; + public TileCellData Auto_010_111_011; + //第九列 + public TileCellData Auto_000_011_011; + public TileCellData Auto_011_011_011; + public TileCellData Auto_011_111_011; + public TileCellData Auto_011_011_000; + //第十列 + public TileCellData Auto_010_111_111; + public TileCellData Auto_110_111_011; + public TileCellData Auto_111_111_111; + public TileCellData Auto_111_111_000; + //第十一列 + public TileCellData Auto_000_111_111; + public TileCellData Auto_011_111_110; + public TileCellData Auto_111_111_010; + //第十二列 + public TileCellData Auto_000_110_110; + public TileCellData Auto_110_111_110; + public TileCellData Auto_110_110_110; + public TileCellData Auto_110_110_000; + + //------------------------------------------------------------------------- + + /// + /// 所属资源Id + /// + public int SourceId { get; private set; } + + /// + /// 原地形配置数据 + /// + public TileSetTerrainInfo TerrainInfo { get; private set; } + + private Dictionary _mapping = new Dictionary(); + + public AutoTileConfig(int sourceId, TileSetTerrainInfo terrainInfo) { - new Vector2I(1, 6), - new Vector2I(2, 6), - new Vector2I(3, 6), - new Vector2I(1, 7), - new Vector2I(2, 7), - new Vector2I(3, 7), - }; - - private List _topLayerAtlasCoords = new List() - { - new Vector2I(1, 4), - new Vector2I(1, 3), - new Vector2I(1, 2), - new Vector2I(2, 2), - new Vector2I(3, 2), - new Vector2I(3, 3), - new Vector2I(3, 4), - new Vector2I(11, 2), - new Vector2I(13, 2), - }; + SourceId = sourceId; + TerrainInfo = terrainInfo; + if (terrainInfo.T != null) + { + foreach (var keyValuePair in terrainInfo.T) + { + HandlerTileData(keyValuePair.Key, sourceId, terrainInfo.GetPosition(keyValuePair.Value)); + } + } + + if (terrainInfo.M != null) + { + int[] data; + if (terrainInfo.M.TryGetValue(0, out data)) + { + Wall_Vertical_SingleTop = new TileCellData(sourceId, terrainInfo.GetPosition(data), 0, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(1, out data)) + { + Wall_Vertical_LeftTop = new TileCellData(sourceId, terrainInfo.GetPosition(data), 1, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(2, out data)) + { + Wall_Vertical_CenterTop = new TileCellData(sourceId, terrainInfo.GetPosition(data), 2, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(3, out data)) + { + Wall_Vertical_RightTop = new TileCellData(sourceId, terrainInfo.GetPosition(data), 3, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + + if (terrainInfo.M.TryGetValue(4, out data)) + { + Wall_Vertical_SingleBottom= new TileCellData(sourceId, terrainInfo.GetPosition(data), 4, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(5, out data)) + { + Wall_Vertical_LeftBottom = new TileCellData(sourceId, terrainInfo.GetPosition(data), 5, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(6, out data)) + { + Wall_Vertical_CenterBottom = new TileCellData(sourceId, terrainInfo.GetPosition(data), 6, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + if (terrainInfo.M.TryGetValue(7, out data)) + { + Wall_Vertical_RightBottom = new TileCellData(sourceId, terrainInfo.GetPosition(data), 7, TileSetTerrainInfo.MiddleLayerType, MapLayer.AutoMiddleLayer); + } + } + + if (terrainInfo.F != null) + { + if (terrainInfo.F.TryGetValue(0, out var data)) + { + Floor = new TileCellData(sourceId, terrainInfo.GetPosition(data), 0, TileSetTerrainInfo.FloorLayerType, MapLayer.AutoFloorLayer); + } + } + + TopMask = Auto_111_111_111; + Wall_Bottom = Auto_000_111_111; + Wall_Left = Auto_110_110_110; + Wall_Right = Auto_011_011_011; + Wall_Top = Auto_111_111_000; + + Wall_Out_LB = Auto_011_011_000; + Wall_Out_LT = Auto_000_011_011; + Wall_Out_RB = Auto_110_110_000; + Wall_Out_RT = Auto_000_110_110; + + Wall_In_LT = Auto_111_111_110; + Wall_In_LB = Auto_110_111_111; + Wall_In_RT = Auto_111_111_011; + Wall_In_RB = Auto_011_111_111; + + HandlerMapping(); + HandlerOtherCellMapping(); + } public int GetLayer(Vector2I atlasCoords) { - var layer = GameConfig.FloorMapLayer; - if (_middleLayerAtlasCoords.Contains(atlasCoords)) + if (_mapping.TryGetValue(atlasCoords, out var tile)) { - layer = GameConfig.MiddleMapLayer; - } - else if (_topLayerAtlasCoords.Contains(atlasCoords)) - { - layer = GameConfig.TopMapLayer; + return tile.DefaultLayer; } - return layer; + return MapLayer.AutoFloorLayer; + } + + public TileCellData GetCellData(Vector2I atlasCoords) + { + _mapping.TryGetValue(atlasCoords, out var tile); + return tile; + } + + private void HandlerTileData(uint peeringValue, int sourceId, Vector2I pos) + { + switch (peeringValue) + { + //第一列 + case TerrainPeering.Center | TerrainPeering.Bottom: + Auto_000_010_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Bottom: + Auto_010_010_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Center: + Auto_010_010_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Center: + Auto_000_010_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第二列 + case TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom: + Auto_000_011_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom: + Auto_010_011_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right: + Auto_010_011_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Center | TerrainPeering.Right: + Auto_000_011_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第三列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom: + Auto_000_111_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.Bottom: + Auto_010_111_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right: + Auto_010_111_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right: + Auto_000_111_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第四列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Bottom: + Auto_000_110_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Bottom: + Auto_010_110_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center: + Auto_010_110_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Left | TerrainPeering.Center: + Auto_000_110_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第五列 + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.Bottom: + Auto_110_111_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom | + TerrainPeering.RightBottom: + Auto_010_011_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.Bottom: + Auto_011_011_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_010_111_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第六列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom | + TerrainPeering.RightBottom: + Auto_000_111_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_011_111_111 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | + TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_111_111_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right: + Auto_011_111_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第七列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.LeftBottom | + TerrainPeering.Bottom: + Auto_000_111_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_110_111_111 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | + TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_111_111_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right: + Auto_110_111_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第八列 + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.Bottom: + Auto_011_111_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.LeftBottom | + TerrainPeering.Bottom: + Auto_010_110_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Bottom: + Auto_110_110_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_010_111_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第九列 + case TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_000_011_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_011_011_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_011_111_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Center | TerrainPeering.Right: + Auto_011_011_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第十列 + case TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | + TerrainPeering.LeftBottom | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_010_111_111 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_110_111_011 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | + TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom | + TerrainPeering.RightBottom: + Auto_111_111_111 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | + TerrainPeering.Center | TerrainPeering.Right: + Auto_111_111_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第十一列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.LeftBottom | + TerrainPeering.Bottom | TerrainPeering.RightBottom: + Auto_000_111_111 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_011_111_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.RightTop | TerrainPeering.Left | + TerrainPeering.Center | TerrainPeering.Right | TerrainPeering.Bottom: + Auto_111_111_010 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + //第十二列 + case TerrainPeering.Left | TerrainPeering.Center | TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_000_110_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.Right | TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_110_111_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center | + TerrainPeering.LeftBottom | TerrainPeering.Bottom: + Auto_110_110_110 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + case TerrainPeering.LeftTop | TerrainPeering.Top | TerrainPeering.Left | TerrainPeering.Center: + Auto_110_110_000 = new TileCellData(sourceId, pos, peeringValue, TileSetTerrainInfo.TerrainLayerType, MapLayer.AutoTopLayer); + break; + + default: + Debug.LogError("未知PeeringValue: " + peeringValue); + break; + } + } + + + private void HandlerMapping() + { + //第一列 + _mapping.Add(Auto_000_010_010.AutoTileCoords, Auto_000_010_010); + _mapping.Add(Auto_010_010_010.AutoTileCoords, Auto_010_010_010); + _mapping.Add(Auto_010_010_000.AutoTileCoords, Auto_010_010_000); + _mapping.Add(Auto_000_010_000.AutoTileCoords, Auto_000_010_000); + //第二列 + _mapping.Add(Auto_000_011_010.AutoTileCoords, Auto_000_011_010); + _mapping.Add(Auto_010_011_010.AutoTileCoords, Auto_010_011_010); + _mapping.Add(Auto_010_011_000.AutoTileCoords, Auto_010_011_000); + _mapping.Add(Auto_000_011_000.AutoTileCoords, Auto_000_011_000); + //第三列 + _mapping.Add(Auto_000_111_010.AutoTileCoords, Auto_000_111_010); + _mapping.Add(Auto_010_111_010.AutoTileCoords, Auto_010_111_010); + _mapping.Add(Auto_010_111_000.AutoTileCoords, Auto_010_111_000); + _mapping.Add(Auto_000_111_000.AutoTileCoords, Auto_000_111_000); + //第四列 + _mapping.Add(Auto_000_110_010.AutoTileCoords, Auto_000_110_010); + _mapping.Add(Auto_010_110_010.AutoTileCoords, Auto_010_110_010); + _mapping.Add(Auto_010_110_000.AutoTileCoords, Auto_010_110_000); + _mapping.Add(Auto_000_110_000.AutoTileCoords, Auto_000_110_000); + //第五列 + _mapping.Add(Auto_110_111_010.AutoTileCoords, Auto_110_111_010); + _mapping.Add(Auto_010_011_011.AutoTileCoords, Auto_010_011_011); + _mapping.Add(Auto_011_011_010.AutoTileCoords, Auto_011_011_010); + _mapping.Add(Auto_010_111_110.AutoTileCoords, Auto_010_111_110); + //第六列 + _mapping.Add(Auto_000_111_011.AutoTileCoords, Auto_000_111_011); + _mapping.Add(Auto_011_111_111.AutoTileCoords, Auto_011_111_111); + _mapping.Add(Auto_111_111_011.AutoTileCoords, Auto_111_111_011); + _mapping.Add(Auto_011_111_000.AutoTileCoords, Auto_011_111_000); + //第七列 + _mapping.Add(Auto_000_111_110.AutoTileCoords, Auto_000_111_110); + _mapping.Add(Auto_110_111_111.AutoTileCoords, Auto_110_111_111); + _mapping.Add(Auto_111_111_110.AutoTileCoords, Auto_111_111_110); + _mapping.Add(Auto_110_111_000.AutoTileCoords, Auto_110_111_000); + //第八列 + _mapping.Add(Auto_011_111_010.AutoTileCoords, Auto_011_111_010); + _mapping.Add(Auto_010_110_110.AutoTileCoords, Auto_010_110_110); + _mapping.Add(Auto_110_110_010.AutoTileCoords, Auto_110_110_010); + _mapping.Add(Auto_010_111_011.AutoTileCoords, Auto_010_111_011); + //第九列 + _mapping.Add(Auto_000_011_011.AutoTileCoords, Auto_000_011_011); + _mapping.Add(Auto_011_011_011.AutoTileCoords, Auto_011_011_011); + _mapping.Add(Auto_011_111_011.AutoTileCoords, Auto_011_111_011); + _mapping.Add(Auto_011_011_000.AutoTileCoords, Auto_011_011_000); + //第十列 + _mapping.Add(Auto_010_111_111.AutoTileCoords, Auto_010_111_111); + _mapping.Add(Auto_110_111_011.AutoTileCoords, Auto_110_111_011); + _mapping.Add(Auto_111_111_111.AutoTileCoords, Auto_111_111_111); + _mapping.Add(Auto_111_111_000.AutoTileCoords, Auto_111_111_000); + //第十一列 + _mapping.Add(Auto_000_111_111.AutoTileCoords, Auto_000_111_111); + _mapping.Add(Auto_011_111_110.AutoTileCoords, Auto_011_111_110); + _mapping.Add(Auto_111_111_010.AutoTileCoords, Auto_111_111_010); + //第十二列 + _mapping.Add(Auto_000_110_110.AutoTileCoords, Auto_000_110_110); + _mapping.Add(Auto_110_111_110.AutoTileCoords, Auto_110_111_110); + _mapping.Add(Auto_110_110_110.AutoTileCoords, Auto_110_110_110); + _mapping.Add(Auto_110_110_000.AutoTileCoords, Auto_110_110_000); + } + + private void HandlerOtherCellMapping() + { + _mapping.Add(Floor.AutoTileCoords, Floor); + _mapping.Add(Wall_Vertical_LeftTop.AutoTileCoords, Wall_Vertical_LeftTop); + _mapping.Add(Wall_Vertical_RightTop.AutoTileCoords, Wall_Vertical_RightTop); + _mapping.Add(Wall_Vertical_CenterTop.AutoTileCoords, Wall_Vertical_CenterTop); + _mapping.Add(Wall_Vertical_SingleTop.AutoTileCoords, Wall_Vertical_SingleTop); + _mapping.Add(Wall_Vertical_LeftBottom.AutoTileCoords, Wall_Vertical_LeftBottom); + _mapping.Add(Wall_Vertical_CenterBottom.AutoTileCoords, Wall_Vertical_CenterBottom); + _mapping.Add(Wall_Vertical_RightBottom.AutoTileCoords, Wall_Vertical_RightBottom); + _mapping.Add(Wall_Vertical_SingleBottom.AutoTileCoords, Wall_Vertical_SingleBottom); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs b/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs new file mode 100644 index 0000000..21e909a --- /dev/null +++ b/DungeonShooting_Godot/src/game/room/DefaultDungeonRule.cs @@ -0,0 +1,212 @@ + +using System.Collections.Generic; +using Godot; + +/// +/// 默认实现地牢房间规则 +/// +public class DefaultDungeonRule : DungeonRule +{ + //用于排除上一级房间 + private List excludePrevRoom = new List(); + + //战斗房间尝试链接次数 + private int battleTryCount = 0; + private int battleMaxTryCount = 3; + + //结束房间尝试链接次数 + private int outletTryCount = 0; + //奖励房间绑定的上一个房间 + private List rewardBindRoom = new List(); + + private readonly RoomDirection[] _roomDirections = new []{ RoomDirection.Up, RoomDirection.Down, RoomDirection.Left, RoomDirection.Right }; + + public DefaultDungeonRule(DungeonGenerator generator) : base(generator) + { + } + + public override bool CanOverGenerator() + { + return Generator.BattleRoomInfos.Count >= Config.BattleRoomCount && Generator.EndRoomInfos.Count >= Config.OutRoomCount; + } + + public override RoomInfo GetConnectPrevRoom(RoomInfo prevRoom, DungeonRoomType nextRoomType) + { + if (nextRoomType == DungeonRoomType.Inlet) + { + return null; + } + else if (nextRoomType == DungeonRoomType.Boss) + { + return Generator.FindMaxLayerRoom(DungeonRoomType.Battle | DungeonRoomType.Shop, excludePrevRoom); + } + else if (nextRoomType == DungeonRoomType.Outlet || nextRoomType == DungeonRoomType.Shop || nextRoomType == DungeonRoomType.Event) + { + return prevRoom; + } + else if (nextRoomType == DungeonRoomType.Reward) + { + if (Generator.BattleRoomInfos.Count == 0) + { + return prevRoom; + } + + foreach (var temp in rewardBindRoom) + { + if (!excludePrevRoom.Contains(temp)) + { + excludePrevRoom.Add(temp); + } + } + + return Generator.FindMaxLayerRoom(DungeonRoomType.Battle | DungeonRoomType.Shop | DungeonRoomType.Event, excludePrevRoom); + } + else if (nextRoomType == DungeonRoomType.Battle) + { + if (battleTryCount < battleMaxTryCount) + { + if (prevRoom == null || prevRoom.Layer >= Config.MaxLayer - 1) //层数太高, 下一个房间生成在低层级 + { + return Generator.RandomRoomLessThanLayer(DungeonRoomType.Battle | DungeonRoomType.Shop | DungeonRoomType.Event | DungeonRoomType.Inlet, Mathf.Max(1, Config.MaxLayer / 2)); + } + + return prevRoom; + } + return Generator.GetRandomRoom(DungeonRoomType.Battle | DungeonRoomType.Shop | DungeonRoomType.Event | DungeonRoomType.Inlet); + } + + return Generator.GetRandomRoom(DungeonRoomType.None); + } + + public override DungeonRoomType GetNextRoomType(RoomInfo prevRoom) + { + if (Generator.StartRoomInfo == null) //生成第一个房间 + { + return DungeonRoomType.Inlet; + } + + if (prevRoom != null) + { + if (prevRoom.RoomType == DungeonRoomType.Boss) //boss房间后生成结束房间 + { + return DungeonRoomType.Outlet; + } + + if (Generator.RewardRoomInfos.Count < Config.RewardRoomCount) + { + if (Generator.BattleRoomInfos.Count == Config.BattleRoomCount / (Config.RewardRoomCount + 1) * (Generator.RewardRoomInfos.Count + 1)) //奖励房间 + { + return DungeonRoomType.Reward; + } + } + if (Generator.ShopRoomInfos.Count < Config.ShopRoomCount) + { + if (Generator.BattleRoomInfos.Count == Config.BattleRoomCount / (Config.ShopRoomCount + 1) * (Generator.ShopRoomInfos.Count + 1)) //商店 + { + return DungeonRoomType.Shop; + } + } + } + + if (Generator.BattleRoomInfos.Count >= Config.BattleRoomCount) //战斗房间已满 + { + if (Generator.BossRoomInfos.Count < Config.BossRoomCount) //最后一个房间是boss房间 + { + if (RoomGroup.BossList.Count == 0) //没有预设boss房间 + { + return DungeonRoomType.Battle; + } + //生成boss房间 + return DungeonRoomType.Boss; + } + } + return DungeonRoomType.Battle; + } + + public override void GenerateRoomSuccess(RoomInfo prevRoom, RoomInfo roomInfo) + { + if (roomInfo.RoomType == DungeonRoomType.Boss) //boss房间 + { + roomInfo.CanRollback = true; + excludePrevRoom.Clear(); + } + else if (roomInfo.RoomType == DungeonRoomType.Battle) + { + battleTryCount = 0; + battleMaxTryCount = Random.RandomRangeInt(1, 3); + } + else if (roomInfo.RoomType == DungeonRoomType.Outlet) + { + outletTryCount = 0; + Generator.SubmitCanRollbackRoom(); + } + else if (roomInfo.RoomType == DungeonRoomType.Reward) + { + rewardBindRoom.Add(prevRoom); + excludePrevRoom.Clear(); + } + + if (prevRoom != null && prevRoom.CanRollback) + { + roomInfo.CanRollback = true; + } + } + + public override void GenerateRoomFail(RoomInfo prevRoom, DungeonRoomType roomType) + { + if (roomType == DungeonRoomType.Boss || roomType == DungeonRoomType.Reward) + { + //生成房间失败 + excludePrevRoom.Add(prevRoom); + if (excludePrevRoom.Count >= Generator.RoomInfos.Count) + { + //全都没找到合适的, 那就再来一遍 + excludePrevRoom.Clear(); + } + } + else if (roomType == DungeonRoomType.Outlet) + { + outletTryCount++; + if (outletTryCount >= 3 && prevRoom != null) //生成结束房间失败, 那么只能回滚boss房间 + { + outletTryCount = 0; + Generator.RollbackRoom(prevRoom); + } + } + else if (roomType == DungeonRoomType.Battle) + { + battleTryCount++; + } + } + + public override RoomDirection GetNextRoomDoorDirection(RoomInfo prevRoom, DungeonRoomType roomType) + { + return Random.RandomChoose(_roomDirections); + } + + public override int GetNextRoomInterval(RoomInfo prevRoom, DungeonRoomType roomType, RoomDirection direction) + { + return Random.RandomRangeInt(Config.RoomMinInterval, Config.RoomMaxInterval); + } + + public override int GetNextRoomOffset(RoomInfo prevRoom, DungeonRoomType roomType, RoomDirection direction) + { + //为什么最后的值要减4或者5? 因为这个值是房间地板向外扩充的格子数量 + + if (roomType == DungeonRoomType.Outlet) + { + if (direction == RoomDirection.Up || direction == RoomDirection.Down) + { + return (int)(prevRoom.Size.X * 0.5f - 4); + } + return (int)(prevRoom.Size.Y * 0.5f - 5); + } + if (direction == RoomDirection.Up || direction == RoomDirection.Down) + { + return Random.RandomRangeInt((int)(prevRoom.Size.X * Config.RoomVerticalMinDispersion), + (int)(prevRoom.Size.X * Config.RoomVerticalMaxDispersion)) + (int)(prevRoom.Size.X * 0.5f - 4); + } + return Random.RandomRangeInt((int)(prevRoom.Size.Y * Config.RoomHorizontalMinDispersion), + (int)(prevRoom.Size.Y * Config.RoomHorizontalMaxDispersion)) + (int)(prevRoom.Size.Y * 0.5f - 5); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/Dungeon.cs b/DungeonShooting_Godot/src/game/room/Dungeon.cs new file mode 100644 index 0000000..fc52182 --- /dev/null +++ b/DungeonShooting_Godot/src/game/room/Dungeon.cs @@ -0,0 +1,22 @@ + +using Godot; + +/// +/// 地牢类 +/// +public partial class Dungeon : World +{ + public override void _Ready() + { + base._Ready(); + Color = Colors.Black; + } + + /// + /// 初始化 TileMap 中的层级 + /// + public void InitLayer() + { + MapLayerManager.InitMapLayer(TileRoot); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 6444ff1..8892971 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -1,8 +1,6 @@  using System; using System.Collections; -using System.Collections.Generic; -using System.Linq; using Godot; /// @@ -39,22 +37,20 @@ /// 当前使用的配置 /// public DungeonConfig CurrConfig { get; private set; } - + /// - /// 当前使用的世界对象 + /// 当前玩家所在游戏世界对象 /// - public World World { get; private set; } + public World CurrWorld { get; private set; } /// /// 自动图块配置 /// public AutoTileConfig AutoTileConfig { get; private set; } - + private UiBase _prevUi; private DungeonTileMap _dungeonTileMap; private DungeonGenerator _dungeonGenerator; - //房间内所有静态导航网格数据 - private List _roomStaticNavigationList; //用于检查房间敌人的计时器 private float _checkEnemyTimer = 0; @@ -70,6 +66,80 @@ } /// + /// 创建新的 World 对象, 相当于清理房间 + /// + public World CreateNewWorld(SeedRandom random, string scenePath) + { + if (CurrWorld != null) + { + ClearWorld(); + CurrWorld.QueueFree(); + } + CurrWorld = ResourceManager.LoadAndInstantiate(scenePath); + GameApplication.Instance.SceneRoot.AddChild(CurrWorld); + CurrWorld.InitRandomPool(random); + return CurrWorld; + } + + /// + /// 销毁 World 对象, 相当于清理房间 + /// + public void DestroyWorld() + { + //销毁所有物体 + if (CurrWorld != null) + { + ClearWorld(); + CurrWorld.QueueFree(); + } + + //销毁池中所有物体 + ObjectPool.DisposeAllItem(); + + CurrWorld = null; + } + + + //清理世界 + private void ClearWorld() + { + var childCount = CurrWorld.NormalLayer.GetChildCount(); + for (var i = 0; i < childCount; i++) + { + var c = CurrWorld.NormalLayer.GetChild(i); + if (c is IDestroy destroy) + { + destroy.Destroy(); + } + } + childCount = CurrWorld.YSortLayer.GetChildCount(); + for (var i = 0; i < childCount; i++) + { + var c = CurrWorld.YSortLayer.GetChild(i); + if (c is IDestroy destroy) + { + destroy.Destroy(); + } + } + } + + /// + /// 进入大厅 + /// + public void LoadHall(Action finish = null) + { + GameApplication.Instance.StartCoroutine(RunLoadHallCoroutine(finish)); + } + + /// + /// 退出大厅 + /// + public void ExitHall(bool keepPlayer, Action finish = null) + { + GameApplication.Instance.StartCoroutine(RunExitHallCoroutine(keepPlayer, finish)); + } + + /// /// 加载地牢 /// public void LoadDungeon(DungeonConfig config, Action finish = null) @@ -82,23 +152,23 @@ /// /// 重启地牢 /// - public void RestartDungeon(DungeonConfig config) + public void RestartDungeon(bool keepPlayer, DungeonConfig config, Action finish = null) { IsEditorMode = false; CurrConfig = config; - ExitDungeon(() => + ExitDungeon(keepPlayer, () => { - LoadDungeon(CurrConfig); + LoadDungeon(CurrConfig, finish); }); } /// /// 退出地牢 /// - public void ExitDungeon(Action finish = null) + public void ExitDungeon(bool keepPlayer, Action finish = null) { IsInDungeon = false; - GameApplication.Instance.StartCoroutine(RunExitDungeonCoroutine(finish)); + GameApplication.Instance.StartCoroutine(RunExitDungeonCoroutine(keepPlayer, finish)); } //------------------------------------------------------------------------------------- @@ -107,7 +177,8 @@ /// 在编辑器模式下进入地牢 /// /// 地牢配置 - public void EditorPlayDungeon(DungeonConfig config) + /// 执行完成回调 + public void EditorPlayDungeon(DungeonConfig config, Action finish = null) { IsEditorMode = true; CurrConfig = config; @@ -115,15 +186,16 @@ { _prevUi.HideUi(); } - GameApplication.Instance.StartCoroutine(RunLoadDungeonCoroutine(null)); + GameApplication.Instance.StartCoroutine(RunLoadDungeonCoroutine(finish)); } - + /// /// 在编辑器模式下进入地牢 /// /// 记录上一个Ui /// 地牢配置 - public void EditorPlayDungeon(UiBase prevUi, DungeonConfig config) + /// 执行完成回调 + public void EditorPlayDungeon(UiBase prevUi, DungeonConfig config, Action finish = null) { IsEditorMode = true; CurrConfig = config; @@ -132,16 +204,16 @@ { _prevUi.HideUi(); } - GameApplication.Instance.StartCoroutine(RunLoadDungeonCoroutine(null)); + GameApplication.Instance.StartCoroutine(RunLoadDungeonCoroutine(finish)); } /// /// 在编辑器模式下退出地牢, 并且打开上一个Ui /// - public void EditorExitDungeon() + public void EditorExitDungeon(bool keepPlayer, Action finish = null) { IsInDungeon = false; - GameApplication.Instance.StartCoroutine(RunExitDungeonCoroutine(() => + GameApplication.Instance.StartCoroutine(RunExitDungeonCoroutine(keepPlayer, () => { IsEditorMode = false; //显示上一个Ui @@ -149,6 +221,10 @@ { _prevUi.ShowUi(); } + if (finish != null) + { + finish(); + } })); } @@ -158,7 +234,7 @@ { if (IsInDungeon) { - if (World.Pause) //已经暂停 + if (CurrWorld.Pause) //已经暂停 { return; } @@ -166,7 +242,7 @@ //暂停游戏 if (InputManager.Menu) { - World.Pause = true; + CurrWorld.Pause = true; //鼠标改为Ui鼠标 GameApplication.Instance.Cursor.SetGuiMode(true); //打开暂停Ui @@ -191,42 +267,203 @@ } } + //执行加载大厅流程 + private IEnumerator RunLoadHallCoroutine(Action finish) + { + yield return 0; + + var hall = (Hall)CreateNewWorld(Utils.Random, ResourcePath.scene_Hall_tscn); + yield return 0; + + //创建房间数据 + var roomInfo = new RoomInfo(0, DungeonRoomType.None, null); + roomInfo.Size = hall.BgSprite.Texture.GetSize().AsVector2I() / GameConfig.TileCellSize + new Vector2I(10, 10); + roomInfo.Position = hall.BgSprite.Position.AsVector2I() - new Vector2I(5, 5) * GameConfig.TileCellSize; + hall.RoomInfo = roomInfo; + yield return 0; + + //创建归属区域 + var affiliation = new AffiliationArea(); + affiliation.Name = "AffiliationArea_Hall"; + affiliation.Init(roomInfo, new Rect2I(roomInfo.Position, roomInfo.Size * GameConfig.TileCellSize)); + roomInfo.AffiliationArea = affiliation; + hall.AffiliationAreaRoot.AddChild(affiliation); + yield return 0; + + //静态渲染精灵根节点, 用于放置sprite + var spriteRoot = new RoomStaticSprite(roomInfo); + spriteRoot.Name = "SpriteRoot"; + roomInfo.StaticSprite = spriteRoot; + hall.StaticSpriteRoot.AddChild(spriteRoot); + yield return 0; + + //静态精灵画布 + var canvasSprite = new ImageCanvas(roomInfo.Size.X * GameConfig.TileCellSize, roomInfo.Size.Y * GameConfig.TileCellSize); + canvasSprite.Position = roomInfo.Position; + roomInfo.StaticImageCanvas = canvasSprite; + roomInfo.StaticSprite.AddChild(canvasSprite); + yield return 0; + + //液体画布 + var liquidCanvas = new LiquidCanvas(roomInfo, roomInfo.Size.X * GameConfig.TileCellSize, roomInfo.Size.Y * GameConfig.TileCellSize); + liquidCanvas.Position = roomInfo.Position; + roomInfo.LiquidCanvas = liquidCanvas; + roomInfo.StaticSprite.AddChild(liquidCanvas); + yield return 0; + + //创建玩家 + var player = Player.Current; + if (player == null) + { + player = ActivityObject.Create(ActivityObject.Ids.Id_role0001); + player.Name = "Player"; + } + player.World = CurrWorld; + player.Position = hall.BirthMark.Position; + player.PutDown(RoomLayerEnum.YSortLayer); + Player.SetCurrentPlayer(player); + affiliation.InsertItem(player); + player.WeaponPack.PickupItem(ActivityObject.Create(ActivityObject.Ids.Id_weapon0001)); + yield return 0; + player.Collision.Disabled = false; + + GameApplication.Instance.Cursor.SetGuiMode(false); + yield return 0; + + IsInDungeon = true; + //打开游戏中的ui + UiManager.Open_RoomUI(); + + if (finish != null) + { + finish(); + } + } + + //执行退出大厅流程 + private IEnumerator RunExitHallCoroutine(bool keepPlayer, Action finish) + { + IsInDungeon = false; + yield return 0; + + CurrWorld.Pause = true; + yield return 0; + + var hall = (Hall)CurrWorld; + hall.RoomInfo.Destroy(); + yield return 0; + + UiManager.Destroy_RoomUI(); + yield return 0; + if (!keepPlayer) + { + Player.SetCurrentPlayer(null); + } + else + { + var player = Player.Current; + player.AffiliationArea?.RemoveItem(player); + player.GetParent().RemoveChild(player); + player.World = null; + player.Collision.Disabled = true; + } + + DestroyWorld(); + yield return 0; + FogMaskHandler.ClearRecordRoom(); + LiquidBrushManager.ClearData(); + BrushImageData.ClearBrushData(); + QueueRedraw(); + + //鼠标还原 + GameApplication.Instance.Cursor.SetGuiMode(true); + yield return 0; + + if (finish != null) + { + finish(); + } + } + + //执行加载地牢协程 private IEnumerator RunLoadDungeonCoroutine(Action finish) { - //打开 loading UI - UiManager.Open_Loading(); - yield return 0; - //创建世界场景 - World = GameApplication.Instance.CreateNewWorld(); yield return 0; //生成地牢房间 - var random = new SeedRandom(205371406); - _dungeonGenerator = new DungeonGenerator(CurrConfig, random); - _dungeonGenerator.Generate(); - yield return 0; + //最多尝试10次 + const int maxCount = 10; + for (var i = 0; i < maxCount; i++) + { + SeedRandom random; + if (CurrConfig.RandomSeed != null) + { + random = new SeedRandom(CurrConfig.RandomSeed.Value); + } + else + { + random = new SeedRandom(); + } + + var dungeonGenerator = new DungeonGenerator(CurrConfig, random); + var rule = new DefaultDungeonRule(dungeonGenerator); + if (!dungeonGenerator.Generate(rule)) //生成房间失败 + { + dungeonGenerator.EachRoom(DisposeRoomInfo); + if (i == maxCount - 1) + { + if (IsEditorMode) //在编辑器模式下打开的Ui + { + EditorPlayManager.IsPlay = false; + IsEditorMode = false; + //显示上一个Ui + if (_prevUi != null) + { + _prevUi.ShowUi(); + //尝试关闭加载Ui + UiManager.Destroy_Loading(); + } + } + else //正常关闭Ui + { + UiManager.Open_Main(); + //尝试关闭加载Ui + UiManager.Destroy_Loading(); + } + EditorWindowManager.ShowTips("错误", "生成房间尝试次数过多,生成地牢房间失败,请加大房间门连接区域,或者修改地牢生成规则!"); + yield break; + } + else + { + yield return 0; + } + } + else //生成成功! + { + _dungeonGenerator = dungeonGenerator; + break; + } + } + + yield return 0; + //创建世界场景 + var dungeon = (Dungeon)CreateNewWorld(_dungeonGenerator.Random, ResourcePath.scene_Dungeon_tscn); + dungeon.InitLayer(); + yield return 0; + var group = GameApplication.Instance.RoomConfig[CurrConfig.GroupName]; + var tileSetSplit = GameApplication.Instance.TileSetConfig[group.TileSet]; + CurrWorld.TileRoot.TileSet = tileSetSplit.GetTileSet(); //填充地牢 - AutoTileConfig = new AutoTileConfig(); - _dungeonTileMap = new DungeonTileMap(World.TileRoot); - yield return _dungeonTileMap.AutoFillRoomTile(AutoTileConfig, _dungeonGenerator.StartRoomInfo, random); - yield return _dungeonTileMap.AddOutlineTile(AutoTileConfig.WALL_BLOCK); - - //生成寻路网格, 这一步操作只生成过道的导航 - _dungeonTileMap.GenerateNavigationPolygon(GameConfig.AisleFloorMapLayer); + AutoTileConfig = new AutoTileConfig(0, tileSetSplit.TileSetInfo.Sources[0].Terrain[0]); + _dungeonTileMap = new DungeonTileMap(CurrWorld.TileRoot); + yield return _dungeonTileMap.AutoFillRoomTile(AutoTileConfig, _dungeonGenerator.StartRoomInfo, CurrWorld); + yield return _dungeonTileMap.AutoFillAisleTile(AutoTileConfig, _dungeonGenerator.StartRoomInfo, CurrWorld); + //yield return _dungeonTileMap.AddOutlineTile(AutoTileConfig.WALL_BLOCK); yield return 0; - //将导航网格绑定到 DoorInfo 上 - //BindAisleNavigation(StartRoomInfo, _dungeonTileMap.GetPolygonData()); - //yield return 0; - //挂载过道导航区域 - _dungeonTileMap.MountNavigationPolygon(World.TileRoot); + //生成墙壁, 生成导航网格 + _dungeonTileMap.GenerateWallAndNavigation(CurrWorld, AutoTileConfig); yield return 0; - //过道导航区域数据 - _roomStaticNavigationList = new List(); - _roomStaticNavigationList.AddRange(_dungeonTileMap.GetPolygonData()); - yield return 0; - //门导航区域数据 - _roomStaticNavigationList.AddRange(_dungeonTileMap.GetConnectDoorPolygonData()); //初始化所有房间 yield return _dungeonGenerator.EachRoomCoroutine(InitRoom); @@ -239,15 +476,24 @@ //初始房间创建玩家标记 var playerBirthMark = StartRoomInfo.RoomPreinstall.GetPlayerBirthMark(); //创建玩家 - var player = ActivityObject.Create(ActivityObject.Ids.Id_role0001); + var player = Player.Current; + if (player == null) + { + player = ActivityObject.Create(ActivityObject.Ids.Id_role0001); + player.Name = "Player"; + } if (playerBirthMark != null) { - //player.Position = new Vector2(50, 50); player.Position = playerBirthMark.Position; } - player.Name = "Player"; + + player.World = CurrWorld; player.PutDown(RoomLayerEnum.YSortLayer); Player.SetCurrentPlayer(player); + StartRoomInfo.AffiliationArea.InsertItem(player); + yield return 0; + player.Collision.Disabled = false; + GameApplication.Instance.Cursor.SetGuiMode(false); //打开游戏中的ui UiManager.Open_RoomUI(); @@ -257,8 +503,6 @@ IsInDungeon = true; QueueRedraw(); yield return 0; - //关闭 loading UI - UiManager.Destroy_Loading(); if (finish != null) { finish(); @@ -266,26 +510,33 @@ } //执行退出地牢流程 - private IEnumerator RunExitDungeonCoroutine(Action finish) + private IEnumerator RunExitDungeonCoroutine(bool keepPlayer, Action finish) { - //打开 loading UI - UiManager.Open_Loading(); yield return 0; - World.Pause = true; + CurrWorld.Pause = true; yield return 0; - _dungeonGenerator.EachRoom(DisposeRoomInfo); + _dungeonGenerator?.EachRoom(DisposeRoomInfo); yield return 0; _dungeonTileMap = null; AutoTileConfig = null; _dungeonGenerator = null; - _roomStaticNavigationList.Clear(); - _roomStaticNavigationList = null; - UiManager.Hide_RoomUI(); + UiManager.Destroy_RoomUI(); yield return 0; - Player.SetCurrentPlayer(null); - World = null; - GameApplication.Instance.DestroyWorld(); + if (!keepPlayer) + { + Player.SetCurrentPlayer(null); + } + else + { + var player = Player.Current; + player.AffiliationArea?.RemoveItem(player); + player.GetParent().RemoveChild(player); + player.World = null; + player.Collision.Disabled = true; + } + + DestroyWorld(); yield return 0; FogMaskHandler.ClearRecordRoom(); LiquidBrushManager.ClearData(); @@ -296,68 +547,16 @@ //派发退出地牢事件 EventManager.EmitEvent(EventEnum.OnExitDungeon); yield return 0; - //关闭 loading UI - UiManager.Destroy_Loading(); if (finish != null) { finish(); } } - //将导航网格绑定到 DoorInfo 上 - private void BindAisleNavigation(RoomInfo startRoom, NavigationPolygonData[] polygonDatas) - { - var list = polygonDatas.ToList(); - startRoom.EachRoom(roomInfo => - { - if (roomInfo.Doors != null) - { - foreach (var roomInfoDoor in roomInfo.Doors) - { - if (roomInfoDoor.IsForward) - { - var flag = false; - var doorPosition = roomInfoDoor.GetWorldOriginPosition(); - for (var i = 0; i < list.Count; i++) - { - var data = list[i]; - var points = data.GetPoints(); - if (InLength(points, doorPosition, 32) && InLength(points, roomInfoDoor.GetWorldEndPosition(), 32)) - { - roomInfoDoor.AisleNavigation = data; - roomInfoDoor.ConnectDoor.AisleNavigation = data; - - flag = true; - list.RemoveAt(i); - } - } - - //Debug.Log(roomInfo.Id + ", 是否找到连接过道: " + flag); - } - } - } - }); - } - - private bool InLength(Vector2[] points, Vector2 targetPoint, float len) - { - foreach (var point in points) - { - if (point.DistanceSquaredTo(targetPoint) <= len * len) - { - return true; - } - } - - return false; - } - // 初始化房间 private void InitRoom(RoomInfo roomInfo) { roomInfo.CalcRange(); - //挂载房间导航区域 - MountNavFromRoomInfo(roomInfo); //创建门 CreateDoor(roomInfo); //创建房间归属区域 @@ -373,36 +572,6 @@ //创建房间/过道预览sprite CreatePreviewSprite(roomInfo); } - - //挂载房间导航区域 - private void MountNavFromRoomInfo(RoomInfo roomInfo) - { - var polygonArray = roomInfo.RoomSplit.TileInfo.NavigationList; - var polygon = new NavigationPolygon(); - var offset = roomInfo.GetOffsetPosition(); - for (var i = 0; i < polygonArray.Count; i++) - { - var navigationPolygonData = polygonArray[i]; - var tempPosArray = navigationPolygonData.GetPoints(); - var polygonPointArray = new Vector2[tempPosArray.Length]; - //这里的位置需要加上房间位置 - for (var j = 0; j < tempPosArray.Length; j++) - { - polygonPointArray[j] = tempPosArray[j] + roomInfo.GetWorldPosition() - offset; - } - polygon.AddOutline(polygonPointArray); - - //存入汇总列表 - var polygonData = new NavigationPolygonData(navigationPolygonData.Type); - polygonData.SetPoints(polygonPointArray); - _roomStaticNavigationList.Add(polygonData); - } - polygon.MakePolygonsFromOutlines(); - var navigationPolygon = new NavigationRegion2D(); - navigationPolygon.Name = "NavigationRegion" + (GetChildCount() + 1); - navigationPolygon.NavigationPolygon = polygon; - World.TileRoot.AddChild(navigationPolygon); - } //创建门 private void CreateDoor(RoomInfo roomInfo) @@ -415,29 +584,25 @@ case DoorDirection.E: door = ActivityObject.Create(ActivityObject.Ids.Id_other_door_e); door.Position = (doorInfo.OriginPosition + new Vector2(0.5f, 2)) * GameConfig.TileCellSize; - door.ZIndex = GameConfig.TopMapLayer; break; case DoorDirection.W: door = ActivityObject.Create(ActivityObject.Ids.Id_other_door_w); door.Position = (doorInfo.OriginPosition + new Vector2(-0.5f, 2)) * GameConfig.TileCellSize; - door.ZIndex = GameConfig.TopMapLayer; break; case DoorDirection.S: door = ActivityObject.Create(ActivityObject.Ids.Id_other_door_s); door.Position = (doorInfo.OriginPosition + new Vector2(2f, 1.5f)) * GameConfig.TileCellSize; - door.ZIndex = GameConfig.TopMapLayer; break; case DoorDirection.N: door = ActivityObject.Create(ActivityObject.Ids.Id_other_door_n); door.Position = (doorInfo.OriginPosition + new Vector2(2f, -0.5f)) * GameConfig.TileCellSize; - door.ZIndex = GameConfig.MiddleMapLayer; break; default: return; } doorInfo.Door = door; door.Init(doorInfo); - door.PutDown(RoomLayerEnum.NormalLayer, false); + door.PutDown(RoomLayerEnum.YSortLayer, false); } } @@ -447,11 +612,11 @@ var affiliation = new AffiliationArea(); affiliation.Name = "AffiliationArea" + roomInfo.Id; affiliation.Init(roomInfo, new Rect2I( - roomInfo.GetWorldPosition() + GameConfig.TileCellSizeVector2I, - (roomInfo.Size - new Vector2I(2, 2)) * GameConfig.TileCellSize)); + roomInfo.GetWorldPosition() + new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 3), + (roomInfo.Size - new Vector2I(4, 5)) * GameConfig.TileCellSize)); roomInfo.AffiliationArea = affiliation; - World.AffiliationAreaRoot.AddChild(affiliation); + CurrWorld.AffiliationAreaRoot.AddChild(affiliation); } //创建 RoomStaticSprite @@ -491,9 +656,10 @@ { var roomFog = new FogMask(); roomFog.Name = "FogMask" + roomFog.IsDestroyed; - roomFog.InitFog(roomInfo.Position, roomInfo.Size); + roomFog.InitFog(roomInfo.Position + new Vector2I(1, 0), roomInfo.Size - new Vector2I(2, 1)); + //roomFog.InitFog(roomInfo.Position + new Vector2I(1, 1), roomInfo.Size - new Vector2I(2, 2)); - World.FogMaskRoot.AddChild(roomFog); + CurrWorld.FogMaskRoot.AddChild(roomFog); roomInfo.RoomFogMask = roomFog; //生成通道迷雾 @@ -516,7 +682,7 @@ else { calcRect.Position += new Vector2I(0, 2); - calcRect.Size -= new Vector2I(0, 4); + calcRect.Size -= new Vector2I(0, 5); } } else @@ -525,47 +691,75 @@ calcRect = aisleRect.CalcAisleRect(); fogAreaRect = calcRect; - switch (roomDoorInfo.Direction) + if (roomDoorInfo.Direction == DoorDirection.E) { - case DoorDirection.E: + if (roomDoorInfo.ConnectDoor.Direction == DoorDirection.N) //→↑ + { calcRect.Position += new Vector2I(2, 0); - calcRect.Size -= new Vector2I(2, 0); - break; - case DoorDirection.W: - calcRect.Size -= new Vector2I(2, 0); - break; - case DoorDirection.S: - calcRect.Position += new Vector2I(0, 2); - calcRect.Size -= new Vector2I(0, 2); - break; - case DoorDirection.N: - calcRect.Size -= new Vector2I(0, 2); - break; + calcRect.Size -= new Vector2I(2, 4); + } + else //→↓ + { + calcRect.Position += new Vector2I(2, 3); + calcRect.Size -= new Vector2I(2, 3); + } } - - switch (roomDoorInfo.ConnectDoor.Direction) + else if (roomDoorInfo.Direction == DoorDirection.W) { - case DoorDirection.E: - calcRect.Position += new Vector2I(2, 0); - calcRect.Size -= new Vector2I(2, 0); - break; - case DoorDirection.W: - calcRect.Size -= new Vector2I(2, 0); - break; - case DoorDirection.S: + if (roomDoorInfo.ConnectDoor.Direction == DoorDirection.N) //←↑ + { + calcRect.Size -= new Vector2I(2, 4); + } + else //←↓ + { + calcRect.Position += new Vector2I(0, 3); + calcRect.Size -= new Vector2I(2, 3); + } + } + else if (roomDoorInfo.Direction == DoorDirection.N) + { + if (roomDoorInfo.ConnectDoor.Direction == DoorDirection.E) //↑→ + { + calcRect.Position += new Vector2I(2, -1); + calcRect.Size -= new Vector2I(2, 2); + } + else //↑← + { + calcRect.Position += new Vector2I(0, -1); + calcRect.Size -= new Vector2I(2, 2); + } + } + else if (roomDoorInfo.Direction == DoorDirection.S) + { + if (roomDoorInfo.ConnectDoor.Direction == DoorDirection.E) //↓→ + { + calcRect.Position += new Vector2I(2, 2); + calcRect.Size -= new Vector2I(2, 1); + } + else //↓← + { calcRect.Position += new Vector2I(0, 2); - calcRect.Size -= new Vector2I(0, 2); - break; - case DoorDirection.N: - calcRect.Size -= new Vector2I(0, 2); - break; + calcRect.Size -= new Vector2I(2, 1); + } } } //过道迷雾遮罩 var aisleFog = new FogMask(); - aisleFog.InitFog(calcRect.Position, calcRect.Size); - World.FogMaskRoot.AddChild(aisleFog); + var calcRectSize = calcRect.Size; + var calcRectPosition = calcRect.Position; + if (roomDoorInfo.Direction == DoorDirection.N || roomDoorInfo.Direction == DoorDirection.S) + { + calcRectSize.Y -= 1; + } + else + { + calcRectPosition.Y -= 1; + calcRectSize.Y += 1; + } + + aisleFog.InitFog(calcRectPosition, calcRectSize); + CurrWorld.FogMaskRoot.AddChild(aisleFog); roomDoorInfo.AisleFogMask = aisleFog; roomDoorInfo.ConnectDoor.AisleFogMask = aisleFog; @@ -579,7 +773,7 @@ ); roomDoorInfo.AisleFogArea = fogArea; roomDoorInfo.ConnectDoor.AisleFogArea = fogArea; - World.AffiliationAreaRoot.AddChild(fogArea); + CurrWorld.AffiliationAreaRoot.AddChild(fogArea); } //预览迷雾区域 @@ -587,13 +781,13 @@ roomDoorInfo.PreviewRoomFogMask = previewRoomFog; previewRoomFog.Init(roomDoorInfo, PreviewFogMask.PreviewFogType.Room); previewRoomFog.SetActive(false); - World.FogMaskRoot.AddChild(previewRoomFog); + CurrWorld.FogMaskRoot.AddChild(previewRoomFog); var previewAisleFog = new PreviewFogMask(); roomDoorInfo.PreviewAisleFogMask = previewAisleFog; previewAisleFog.Init(roomDoorInfo, PreviewFogMask.PreviewFogType.Aisle); previewAisleFog.SetActive(false); - World.FogMaskRoot.AddChild(previewAisleFog); + CurrWorld.FogMaskRoot.AddChild(previewAisleFog); } } @@ -603,7 +797,7 @@ var sprite = new TextureRect(); //sprite.Centered = false; sprite.Texture = roomInfo.PreviewTexture; - sprite.Position = roomInfo.Position; + sprite.Position = roomInfo.Position + new Vector2I(1, 3); var material = ResourceManager.Load(ResourcePath.resource_material_Outline2_tres, false); material.SetShaderParameter("outline_color", new Color(1, 1, 1, 0.9f)); material.SetShaderParameter("scale", 0.5f); @@ -621,86 +815,20 @@ //aisleSprite.Centered = false; aisleSprite.Texture = doorInfo.AislePreviewTexture; //调整过道预览位置 - - if (!doorInfo.HasCross) //不含交叉点 + if (doorInfo.Direction == DoorDirection.N || doorInfo.Direction == DoorDirection.S || + doorInfo.ConnectDoor.Direction == DoorDirection.N || doorInfo.ConnectDoor.Direction == DoorDirection.S) { - if (doorInfo.Direction == DoorDirection.N) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, doorInfo.AislePreviewTexture.GetHeight() - 1); - } - else if (doorInfo.Direction == DoorDirection.S) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, 1); - } - else if (doorInfo.Direction == DoorDirection.E) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, 0); - } - else if (doorInfo.Direction == DoorDirection.W) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 1, 0); - } + aisleSprite.Position = doorInfo.AisleFloorRect.Position + new Vector2I(0, 1); } - else //包含交叉点 + else { - if (doorInfo.Direction == DoorDirection.S) - { - if (doorInfo.ConnectDoor.Direction == DoorDirection.E) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 4, 1); - } - else if (doorInfo.ConnectDoor.Direction == DoorDirection.W) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, 1); - } - else - { - aisleSprite.Position = doorInfo.OriginPosition; - } - } - else if (doorInfo.Direction == DoorDirection.N) - { - if (doorInfo.ConnectDoor.Direction == DoorDirection.W) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, doorInfo.AislePreviewTexture.GetHeight() - 1); - } - else - { - aisleSprite.Position = doorInfo.OriginPosition; - } - } - else if (doorInfo.Direction == DoorDirection.W) - { - if (doorInfo.ConnectDoor.Direction == DoorDirection.N) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 1, 0); - } - else - { - aisleSprite.Position = doorInfo.OriginPosition; - } - } - else if (doorInfo.Direction == DoorDirection.E) - { - if (doorInfo.ConnectDoor.Direction == DoorDirection.S) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, doorInfo.AislePreviewTexture.GetHeight() - 4); - } - else if (doorInfo.ConnectDoor.Direction == DoorDirection.N) - { - aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, 0); - } - else - { - aisleSprite.Position = doorInfo.OriginPosition; - } - } + aisleSprite.Position = doorInfo.AisleFloorRect.Position; } - var aisleSpriteMaterial = ResourceManager.Load(ResourcePath.resource_material_Outline2_tres, false); - aisleSpriteMaterial.SetShaderParameter("outline_color", new Color(1, 1, 1, 0.9f)); - aisleSpriteMaterial.SetShaderParameter("scale", 0.5f); - aisleSprite.Material = aisleSpriteMaterial; + // var aisleSpriteMaterial = ResourceManager.Load(ResourcePath.resource_material_Outline2_tres, false); + // aisleSpriteMaterial.SetShaderParameter("outline_color", new Color(1, 1, 1, 0.9f)); + // aisleSpriteMaterial.SetShaderParameter("scale", 0.5f); + // aisleSprite.Material = aisleSpriteMaterial; doorInfo.AislePreviewSprite = aisleSprite; doorInfo.ConnectDoor.AislePreviewSprite = aisleSprite; } @@ -719,7 +847,7 @@ if (room.IsSeclusion) { var playerAffiliationArea = Player.Current.AffiliationArea; - foreach (var enemy in World.Enemy_InstanceList) + foreach (var enemy in CurrWorld.Enemy_InstanceList) { //不与玩家处于同一个房间 if (!enemy.IsDestroyed && enemy.AffiliationArea != playerAffiliationArea) @@ -757,7 +885,7 @@ private void OnCheckEnemy() { var activeRoom = ActiveRoomInfo; - if (activeRoom != null) + if (activeRoom != null && activeRoom.RoomPreinstall != null) { if (activeRoom.RoomPreinstall.IsRunWave) //正在生成标记 { @@ -786,22 +914,17 @@ { if (ActivityObject.IsDebug) { - if (_dungeonTileMap != null && _roomStaticNavigationList != null) + StartRoomInfo?.EachRoom(info => { - //绘制ai寻路区域 - Utils.DrawNavigationPolygon(this, _roomStaticNavigationList.ToArray()); - } - // StartRoomInfo?.EachRoom(info => - // { - // DrawRect(new Rect2(info.Waypoints * GameConfig.TileCellSize, new Vector2(16, 16)), Colors.Red); - // }); + DrawRect(new Rect2(info.Waypoints * GameConfig.TileCellSize, new Vector2(16, 16)), Colors.Red); + }); //绘制房间区域 - // if (_dungeonGenerator != null) - // { - // DrawRoomInfo(StartRoom); - // } + if (_dungeonGenerator != null) + { + DrawRoomInfo(StartRoomInfo); + } //绘制边缘线 - + } } diff --git a/DungeonShooting_Godot/src/game/room/RoomDoor.cs b/DungeonShooting_Godot/src/game/room/RoomDoor.cs index 4d15411..c8b8674 100644 --- a/DungeonShooting_Godot/src/game/room/RoomDoor.cs +++ b/DungeonShooting_Godot/src/game/room/RoomDoor.cs @@ -37,6 +37,7 @@ { _animatedDown = GetNode("AnimatedSpriteDown"); } + OpenDoorHandler(); } @@ -52,7 +53,7 @@ { AnimatedSprite.Play(AnimatorNames.OpenDoor); } - + if (_animatedDown != null && _animatedDown.SpriteFrames.HasAnimation(AnimatorNames.OpenDoor)) { _animatedDown.Play(AnimatorNames.OpenDoor); @@ -67,49 +68,20 @@ IsClose = true; //Visible = true; Collision.Disabled = false; - if (_door.Navigation != null) - { - _door.Navigation.OpenNavigationNode.Enabled = false; - _door.Navigation.OpenNavigationNode.Visible = false; - _door.Navigation.CloseNavigationNode.Enabled = true; - _door.Navigation.CloseNavigationNode.Visible = true; - } if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.CloseDoor)) { AnimatedSprite.Play(AnimatorNames.CloseDoor); } - if (_animatedDown != null && _animatedDown.SpriteFrames.HasAnimation(AnimatorNames.CloseDoor)) + if (_animatedDown != null) { - _animatedDown.Play(AnimatorNames.CloseDoor); + _animatedDown.Visible = false; } - //调整门的层级 - switch (Direction) + if (Direction == DoorDirection.E || Direction == DoorDirection.W) { - case DoorDirection.E: - ZIndex = GameConfig.TopMapLayer; - if (_animatedDown != null) - { - _animatedDown.ZIndex = GameConfig.TopMapLayer; - } - - break; - case DoorDirection.W: - ZIndex = GameConfig.TopMapLayer; - if (_animatedDown != null) - { - _animatedDown.ZIndex = GameConfig.TopMapLayer; - } - - break; - case DoorDirection.S: - ZIndex = GameConfig.TopMapLayer; - break; - case DoorDirection.N: - ZIndex = GameConfig.MiddleMapLayer; - break; + ZIndex = MapLayer.CustomMiddleLayer2; } } @@ -118,6 +90,15 @@ if (!IsClose && waitDisabledCollision) //开门动画播放完成 { waitDisabledCollision = false; + if (_animatedDown != null) + { + _animatedDown.Visible = true; + } + + if (Direction == DoorDirection.E || Direction == DoorDirection.W) + { + ZIndex = 0; + } OpenDoorHandler(); } } @@ -125,41 +106,7 @@ private void OpenDoorHandler() { Collision.Disabled = true; - if (_door.Navigation != null) - { - _door.Navigation.OpenNavigationNode.Enabled = true; - _door.Navigation.OpenNavigationNode.Visible = true; - _door.Navigation.CloseNavigationNode.Enabled = false; - _door.Navigation.CloseNavigationNode.Visible = false; - } //调整门的层级 - //ZIndex = GameConfig.FloorMapLayer; - - //调整门的层级 - switch (Direction) - { - case DoorDirection.E: - ZIndex = GameConfig.MiddleMapLayer; - if (_animatedDown != null) - { - _animatedDown.ZIndex = GameConfig.TopMapLayer; - } - - break; - case DoorDirection.W: - ZIndex = GameConfig.MiddleMapLayer; - if (_animatedDown != null) - { - _animatedDown.ZIndex = GameConfig.TopMapLayer; - } - - break; - case DoorDirection.S: - ZIndex = GameConfig.TopMapLayer; - break; - case DoorDirection.N: - ZIndex = GameConfig.MiddleMapLayer; - break; - } + //ZIndex = MapLayer.AutoFloorLayer; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/World.cs b/DungeonShooting_Godot/src/game/room/World.cs deleted file mode 100644 index 35673f9..0000000 --- a/DungeonShooting_Godot/src/game/room/World.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using Godot; - -/// -/// 游戏世界 -/// -public partial class World : CanvasModulate, ICoroutine -{ - /// - /// 当前的游戏世界对象 - /// - public static World Current => GameApplication.Instance.World; - - /// - /// //对象根节点 - /// - [Export] public Node2D NormalLayer; - - /// - /// 对象根节点, 带y轴排序功能 - /// - [Export] public Node2D YSortLayer; - - /// - /// 地图根节点 - /// - [Export] public TileMap TileRoot; - - [Export] public Node2D StaticSpriteRoot; - [Export] public Node2D AffiliationAreaRoot; - [Export] public Node2D FogMaskRoot; - - /// - /// 是否暂停 - /// - public bool Pause - { - get => _pause; - set - { - if (_pause != value) - { - _pause = value; - if (value) - { - ProcessMode = ProcessModeEnum.WhenPaused; - } - else - { - ProcessMode = ProcessModeEnum.Inherit; - } - } - } - } - - /// - /// 所有被扔在地上的武器 - /// - public HashSet Weapon_UnclaimedWeapons { get; } = new HashSet(); - - /// - /// 记录所有存活的敌人 - /// - public List Enemy_InstanceList { get; } = new List(); - - private bool _pause = false; - private List _coroutineList; - - public override void _Ready() - { - Color = Colors.Black; - - //临时处理, 加载TileSet - var tileSet = ResourceManager.Load(ResourcePath.resource_map_tileSet_map1_TileSet1_tres); - var tileSetAtlasSource = (TileSetAtlasSource)tileSet.GetSource(0); - tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(Image.LoadFromFile("resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png")); - TileRoot.TileSet = tileSet; - TileRoot.YSortEnabled = false; - } - - public override void _Process(double delta) - { - //协程更新 - ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, (float)delta); - } - - /// - /// 获取指定层级根节点 - /// - public Node2D GetRoomLayer(RoomLayerEnum layerEnum) - { - switch (layerEnum) - { - case RoomLayerEnum.NormalLayer: - return NormalLayer; - case RoomLayerEnum.YSortLayer: - return YSortLayer; - } - - return null; - } - - /// - /// 通知其他敌人发现目标了 - /// - /// 发送通知的角色 - /// 目标 - public void NotifyEnemyTarget(Role self, ActivityObject target) - { - foreach (var role in Enemy_InstanceList) - { - if (role != self && !role.IsDestroyed && role.AffiliationArea == self.AffiliationArea) - { - //将未发现目标的敌人状态置为惊讶状态 - var controller = role.StateController; - //延时通知效果 - role.CallDelay(Utils.Random.RandomRangeFloat(0.2f, 1f), () => - { - if (controller.CurrState == AIStateEnum.AiNormal) - { - controller.ChangeState(AIStateEnum.AiLeaveFor, target); - } - }); - } - } - } - - public long StartCoroutine(IEnumerator able) - { - return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able); - } - - public void StopCoroutine(long coroutineId) - { - ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId); - } - - public bool IsCoroutineOver(long coroutineId) - { - return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId); - } - - public void StopAllCoroutine() - { - ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPicker.cs b/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPicker.cs new file mode 100644 index 0000000..f882f90 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPicker.cs @@ -0,0 +1,46 @@ +namespace UI.EditorColorPicker; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorColorPicker : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorColorPicker.ColorPicker + /// + public ColorPicker L_ColorPicker + { + get + { + if (_L_ColorPicker == null) _L_ColorPicker = new ColorPicker((EditorColorPickerPanel)this, GetNode("ColorPicker")); + return _L_ColorPicker; + } + } + private ColorPicker _L_ColorPicker; + + + public EditorColorPicker() : base(nameof(EditorColorPicker)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorColorPicker.ColorPicker + /// + public class ColorPicker : UiNode + { + public ColorPicker(EditorColorPickerPanel uiPanel, Godot.ColorPicker node) : base(uiPanel, node) { } + public override ColorPicker Clone() => new (UiPanel, (Godot.ColorPicker)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorColorPicker.ColorPicker + /// + public ColorPicker S_ColorPicker => L_ColorPicker; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPickerPanel.cs b/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPickerPanel.cs new file mode 100644 index 0000000..2d8e4dc --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorColorPicker/EditorColorPickerPanel.cs @@ -0,0 +1,18 @@ +using Godot; + +namespace UI.EditorColorPicker; + +public partial class EditorColorPickerPanel : EditorColorPicker +{ + + public override void OnCreateUi() + { + + } + + public override void OnDestroyUi() + { + + } + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroup.cs b/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroup.cs new file mode 100644 index 0000000..993b655 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroup.cs @@ -0,0 +1,306 @@ +namespace UI.EditorDungeonGroup; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorDungeonGroup : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((EditorDungeonGroupPanel)this, GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + + public EditorDungeonGroup() : base(nameof(EditorDungeonGroup)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer.NameLabel + /// + public class NameLabel : UiNode + { + public NameLabel(EditorDungeonGroupPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public class NameInput : UiNode + { + public NameInput(EditorDungeonGroupPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override NameInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.NameLabel + /// + public NameLabel L_NameLabel + { + get + { + if (_L_NameLabel == null) _L_NameLabel = new NameLabel(UiPanel, Instance.GetNode("NameLabel")); + return _L_NameLabel; + } + } + private NameLabel _L_NameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.NameInput + /// + public NameInput L_NameInput + { + get + { + if (_L_NameInput == null) _L_NameInput = new NameInput(UiPanel, Instance.GetNode("NameInput")); + return _L_NameInput; + } + } + private NameInput _L_NameInput; + + public HBoxContainer(EditorDungeonGroupPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer2.NameLabel + /// + public class NameLabel_1 : UiNode + { + public NameLabel_1(EditorDungeonGroupPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer2.TileSetOption + /// + public class TileSetOption : UiNode + { + public TileSetOption(EditorDungeonGroupPanel uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } + public override TileSetOption Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.NameLabel + /// + public NameLabel_1 L_NameLabel + { + get + { + if (_L_NameLabel == null) _L_NameLabel = new NameLabel_1(UiPanel, Instance.GetNode("NameLabel")); + return _L_NameLabel; + } + } + private NameLabel_1 _L_NameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.TileSetOption + /// + public TileSetOption L_TileSetOption + { + get + { + if (_L_TileSetOption == null) _L_TileSetOption = new TileSetOption(UiPanel, Instance.GetNode("TileSetOption")); + return _L_TileSetOption; + } + } + private TileSetOption _L_TileSetOption; + + public HBoxContainer2(EditorDungeonGroupPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel + /// + public class RemarkNameLabel : UiNode + { + public RemarkNameLabel(EditorDungeonGroupPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override RemarkNameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput + /// + public class RemarkInput : UiNode + { + public RemarkInput(EditorDungeonGroupPanel uiPanel, Godot.TextEdit node) : base(uiPanel, node) { } + public override RemarkInput Clone() => new (UiPanel, (Godot.TextEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5 + /// + public class HBoxContainer5 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.RemarkNameLabel + /// + public RemarkNameLabel L_RemarkNameLabel + { + get + { + if (_L_RemarkNameLabel == null) _L_RemarkNameLabel = new RemarkNameLabel(UiPanel, Instance.GetNode("RemarkNameLabel")); + return _L_RemarkNameLabel; + } + } + private RemarkNameLabel _L_RemarkNameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.RemarkInput + /// + public RemarkInput L_RemarkInput + { + get + { + if (_L_RemarkInput == null) _L_RemarkInput = new RemarkInput(UiPanel, Instance.GetNode("RemarkInput")); + return _L_RemarkInput; + } + } + private RemarkInput _L_RemarkInput; + + public HBoxContainer5(EditorDungeonGroupPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.HBoxContainer5 + /// + public HBoxContainer5 L_HBoxContainer5 + { + get + { + if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNode("HBoxContainer5")); + return _L_HBoxContainer5; + } + } + private HBoxContainer5 _L_HBoxContainer5; + + public VBoxContainer(EditorDungeonGroupPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorDungeonGroup.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorDungeonGroup.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public MarginContainer(EditorDungeonGroupPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public NameInput S_NameInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_NameInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_MarginContainer.L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer2.TileSetOption + /// + public TileSetOption S_TileSetOption => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_TileSetOption; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel + /// + public RemarkNameLabel S_RemarkNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkNameLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput + /// + public RemarkInput S_RemarkInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer.HBoxContainer5 + /// + public HBoxContainer5 S_HBoxContainer5 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_MarginContainer.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorDungeonGroup.MarginContainer + /// + public MarginContainer S_MarginContainer => L_MarginContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroupPanel.cs b/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroupPanel.cs new file mode 100644 index 0000000..ca58fe6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorDungeonGroup/EditorDungeonGroupPanel.cs @@ -0,0 +1,61 @@ +using Godot; + +namespace UI.EditorDungeonGroup; + +public partial class EditorDungeonGroupPanel : EditorDungeonGroup +{ + + public override void OnCreateUi() + { + var optionButton = S_TileSetOption.Instance; + foreach (var keyValuePair in GameApplication.Instance.TileSetConfig) + { + optionButton.AddItem(keyValuePair.Key); + } + + optionButton.Selected = 0; + } + + public override void OnDestroyUi() + { + + } + + /// + /// 初始化数据 + /// + public void InitData(DungeonRoomGroup dungeonRoomGroup) + { + S_NameInput.Instance.Text = dungeonRoomGroup.GroupName; + var optionButton = S_TileSetOption.Instance; + var count = optionButton.ItemCount; + for (int i = 0; i < count; i++) + { + if (optionButton.GetItemText(i) == dungeonRoomGroup.TileSet) + { + optionButton.Selected = i; + break; + } + } + + S_RemarkInput.Instance.Text = dungeonRoomGroup.Remark; + } + + /// + /// 获取数据 + /// + public DungeonGroupData GetData() + { + var data = new DungeonGroupData(S_NameInput.Instance.Text, S_TileSetOption.Instance.Text, S_RemarkInput.Instance.Text); + return data; + } + + /// + /// 设置为编辑模式, 禁用部分属性 + /// + public void SetEditMode() + { + S_NameInput.Instance.Editable = false; + S_TileSetOption.Instance.Disabled = true; + } +} diff --git a/DungeonShooting_Godot/src/game/ui/editorForm/EditorForm.cs b/DungeonShooting_Godot/src/game/ui/editorForm/EditorForm.cs new file mode 100644 index 0000000..59f6b34 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorForm/EditorForm.cs @@ -0,0 +1,154 @@ +namespace UI.EditorForm; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorForm : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorForm.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((EditorFormPanel)this, GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + + public EditorForm() : base(nameof(EditorForm)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer.Item.NameLabel + /// + public class NameLabel : UiNode + { + public NameLabel(EditorFormPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer.Item + /// + public class Item : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer.NameLabel + /// + public NameLabel L_NameLabel + { + get + { + if (_L_NameLabel == null) _L_NameLabel = new NameLabel(UiPanel, Instance.GetNode("NameLabel")); + return _L_NameLabel; + } + } + private NameLabel _L_NameLabel; + + public Item(EditorFormPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override Item Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer.Item + /// + public Item L_Item + { + get + { + if (_L_Item == null) _L_Item = new Item(UiPanel, Instance.GetNode("Item")); + return _L_Item; + } + } + private Item _L_Item; + + public VBoxContainer(EditorFormPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorForm.MarginContainer.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorForm.MarginContainer.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public ScrollContainer(EditorFormPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorForm.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorForm.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public MarginContainer(EditorFormPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer.Item.NameLabel + /// + public NameLabel S_NameLabel => L_MarginContainer.L_ScrollContainer.L_VBoxContainer.L_Item.L_NameLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer.Item + /// + public Item S_Item => L_MarginContainer.L_ScrollContainer.L_VBoxContainer.L_Item; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_MarginContainer.L_ScrollContainer.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorForm.MarginContainer.ScrollContainer + /// + public ScrollContainer S_ScrollContainer => L_MarginContainer.L_ScrollContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorForm.MarginContainer + /// + public MarginContainer S_MarginContainer => L_MarginContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorForm/EditorFormPanel.cs b/DungeonShooting_Godot/src/game/ui/editorForm/EditorFormPanel.cs new file mode 100644 index 0000000..b581d22 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorForm/EditorFormPanel.cs @@ -0,0 +1,27 @@ +using Godot; + +namespace UI.EditorForm; + +/// +/// 最基础的表单显示Ui +/// +public partial class EditorFormPanel : EditorForm +{ + public override void OnCreateUi() + { + S_Item.Instance.Visible = false; + } + + /// + /// 添加表单元素 + /// + public void AddItem(FormItemData item) where T : Control + { + var itemNode = S_Item.CloneAndPut(); + itemNode.Instance.Visible = true; + itemNode.L_NameLabel.Instance.Text = item.Label + ":"; + itemNode.AddChild(item.UiNode); + item.UiNode.SetHorizontalExpand(true); + item.UiNode.SizeFlagsStretchRatio = 80; + } +} diff --git a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs new file mode 100644 index 0000000..eb89df8 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs @@ -0,0 +1,262 @@ +namespace UI.EditorImportCombination; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorImportCombination : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((EditorImportCombinationPanel)this, GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + + public EditorImportCombination() : base(nameof(EditorImportCombination)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer.NameLabel + /// + public class NameLabel : UiNode + { + public NameLabel(EditorImportCombinationPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public class NameInput : UiNode + { + public NameInput(EditorImportCombinationPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override NameInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.NameLabel + /// + public NameLabel L_NameLabel + { + get + { + if (_L_NameLabel == null) _L_NameLabel = new NameLabel(UiPanel, Instance.GetNode("NameLabel")); + return _L_NameLabel; + } + } + private NameLabel _L_NameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.NameInput + /// + public NameInput L_NameInput + { + get + { + if (_L_NameInput == null) _L_NameInput = new NameInput(UiPanel, Instance.GetNode("NameInput")); + return _L_NameInput; + } + } + private NameInput _L_NameInput; + + public HBoxContainer(EditorImportCombinationPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewLabel + /// + public class PreviewLabel : UiNode + { + public PreviewLabel(EditorImportCombinationPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override PreviewLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg.PreviewTexture + /// + public class PreviewTexture : UiNode + { + public PreviewTexture(EditorImportCombinationPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override PreviewTexture Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg + /// + public class PreviewBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewTexture + /// + public PreviewTexture L_PreviewTexture + { + get + { + if (_L_PreviewTexture == null) _L_PreviewTexture = new PreviewTexture(UiPanel, Instance.GetNode("PreviewTexture")); + return _L_PreviewTexture; + } + } + private PreviewTexture _L_PreviewTexture; + + public PreviewBg(EditorImportCombinationPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override PreviewBg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.PreviewLabel + /// + public PreviewLabel L_PreviewLabel + { + get + { + if (_L_PreviewLabel == null) _L_PreviewLabel = new PreviewLabel(UiPanel, Instance.GetNode("PreviewLabel")); + return _L_PreviewLabel; + } + } + private PreviewLabel _L_PreviewLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.PreviewBg + /// + public PreviewBg L_PreviewBg + { + get + { + if (_L_PreviewBg == null) _L_PreviewBg = new PreviewBg(UiPanel, Instance.GetNode("PreviewBg")); + return _L_PreviewBg; + } + } + private PreviewBg _L_PreviewBg; + + public HBoxContainer2(EditorImportCombinationPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + public VBoxContainer(EditorImportCombinationPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorImportCombination.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public MarginContainer(EditorImportCombinationPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer.NameLabel + /// + public NameLabel S_NameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_NameLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public NameInput S_NameInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_NameInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_MarginContainer.L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewLabel + /// + public PreviewLabel S_PreviewLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg.PreviewTexture + /// + public PreviewTexture S_PreviewTexture => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewBg.L_PreviewTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg + /// + public PreviewBg S_PreviewBg => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_MarginContainer.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer + /// + public MarginContainer S_MarginContainer => L_MarginContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs new file mode 100644 index 0000000..5fc6c8c --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs @@ -0,0 +1,58 @@ +using Godot; + +namespace UI.EditorImportCombination; + +public partial class EditorImportCombinationPanel : EditorImportCombination +{ + public override void OnShowUi() + { + //监听拖拽 + S_PreviewBg.Instance.AddDragListener(DragButtonEnum.Left | DragButtonEnum.Right | DragButtonEnum.Middle, OnDragPreview); + //监听鼠标滚轮 + S_PreviewBg.Instance.AddMouseWheelListener(OnMouseCallback); + } + + //拖拽纹理 + private void OnDragPreview(DragState state, Vector2 delta) + { + if (state == DragState.DragMove) + { + S_PreviewTexture.Instance.Position += delta; + } + } + + //缩放/放大纹理 + private void OnMouseCallback(int value) + { + if (value < 0) //缩小 + { + Utils.DoShrinkByMousePosition(S_PreviewTexture.Instance, 0.2f); + } + else //放大 + { + Utils.DoMagnifyByMousePosition(S_PreviewTexture.Instance, 20); + } + } + + /// + /// 初始化页面数据 + /// + /// 显示名称 + /// 预览纹理背景颜色 + /// 显示预览纹理 + public void InitData(string name, Color bgColor, Texture2D texture) + { + S_PreviewBg.Instance.Color = bgColor; + S_NameInput.Instance.Text = name; + S_PreviewTexture.Instance.Texture = texture; + } + + /// + /// 获取输入框内的名称 + /// + public string GetName() + { + return S_NameInput.Instance.Text; + } + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfo.cs b/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfo.cs new file mode 100644 index 0000000..be72937 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfo.cs @@ -0,0 +1,235 @@ +namespace UI.EditorInfo; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorInfo : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((EditorInfoPanel)this, GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + + public EditorInfo() : base(nameof(EditorInfo)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer.NameLabel + /// + public class NameLabel : UiNode + { + public NameLabel(EditorInfoPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public class NameInput : UiNode + { + public NameInput(EditorInfoPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override NameInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.NameLabel + /// + public NameLabel L_NameLabel + { + get + { + if (_L_NameLabel == null) _L_NameLabel = new NameLabel(UiPanel, Instance.GetNode("NameLabel")); + return _L_NameLabel; + } + } + private NameLabel _L_NameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.NameInput + /// + public NameInput L_NameInput + { + get + { + if (_L_NameInput == null) _L_NameInput = new NameInput(UiPanel, Instance.GetNode("NameInput")); + return _L_NameInput; + } + } + private NameInput _L_NameInput; + + public HBoxContainer(EditorInfoPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel + /// + public class RemarkNameLabel : UiNode + { + public RemarkNameLabel(EditorInfoPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override RemarkNameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput + /// + public class RemarkInput : UiNode + { + public RemarkInput(EditorInfoPanel uiPanel, Godot.TextEdit node) : base(uiPanel, node) { } + public override RemarkInput Clone() => new (UiPanel, (Godot.TextEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5 + /// + public class HBoxContainer5 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.RemarkNameLabel + /// + public RemarkNameLabel L_RemarkNameLabel + { + get + { + if (_L_RemarkNameLabel == null) _L_RemarkNameLabel = new RemarkNameLabel(UiPanel, Instance.GetNode("RemarkNameLabel")); + return _L_RemarkNameLabel; + } + } + private RemarkNameLabel _L_RemarkNameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.RemarkInput + /// + public RemarkInput L_RemarkInput + { + get + { + if (_L_RemarkInput == null) _L_RemarkInput = new RemarkInput(UiPanel, Instance.GetNode("RemarkInput")); + return _L_RemarkInput; + } + } + private RemarkInput _L_RemarkInput; + + public HBoxContainer5(EditorInfoPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.MarginContainer.HBoxContainer5 + /// + public HBoxContainer5 L_HBoxContainer5 + { + get + { + if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNode("HBoxContainer5")); + return _L_HBoxContainer5; + } + } + private HBoxContainer5 _L_HBoxContainer5; + + public VBoxContainer(EditorInfoPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInfo.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInfo.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public MarginContainer(EditorInfoPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer.NameLabel + /// + public NameLabel S_NameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_NameLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer.NameInput + /// + public NameInput S_NameInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_NameInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_MarginContainer.L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel + /// + public RemarkNameLabel S_RemarkNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkNameLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput + /// + public RemarkInput S_RemarkInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer.HBoxContainer5 + /// + public HBoxContainer5 S_HBoxContainer5 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_MarginContainer.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInfo.MarginContainer + /// + public MarginContainer S_MarginContainer => L_MarginContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfoPanel.cs b/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfoPanel.cs new file mode 100644 index 0000000..e31d364 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorInfo/EditorInfoPanel.cs @@ -0,0 +1,31 @@ +using System.IO; + +namespace UI.EditorInfo; + +public partial class EditorInfoPanel : EditorInfo +{ + /// + /// 初始化数据 + /// + public void InitData(EditorInfoData infoData) + { + S_NameInput.Instance.Text = infoData.Name; + S_RemarkInput.Instance.Text = infoData.Remark; + } + + /// + /// 获取填写的数据 + /// + public EditorInfoData GetInfoData() + { + return new EditorInfoData(S_NameInput.Instance.Text, S_RemarkInput.Instance.Text); + } + + /// + /// 是否可以编辑名称输入框 + /// + public void SetNameInputEnable(bool v) + { + S_NameInput.Instance.Editable = v; + } +} diff --git a/DungeonShooting_Godot/src/game/ui/editorInput/EditorInput.cs b/DungeonShooting_Godot/src/game/ui/editorInput/EditorInput.cs new file mode 100644 index 0000000..43d0256 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorInput/EditorInput.cs @@ -0,0 +1,100 @@ +namespace UI.EditorInput; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorInput : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInput.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer((EditorInputPanel)this, GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + + public EditorInput() : base(nameof(EditorInput)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: EditorInput.VBoxContainer.Label + /// + public class Label : UiNode + { + public Label(EditorInputPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInput.VBoxContainer.LineEdit + /// + public class LineEdit : UiNode + { + public LineEdit(EditorInputPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override LineEdit Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorInput.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInput.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorInput.LineEdit + /// + public LineEdit L_LineEdit + { + get + { + if (_L_LineEdit == null) _L_LineEdit = new LineEdit(UiPanel, Instance.GetNode("LineEdit")); + return _L_LineEdit; + } + } + private LineEdit _L_LineEdit; + + public VBoxContainer(EditorInputPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInput.VBoxContainer.Label + /// + public Label S_Label => L_VBoxContainer.L_Label; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInput.VBoxContainer.LineEdit + /// + public LineEdit S_LineEdit => L_VBoxContainer.L_LineEdit; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorInput.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_VBoxContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorInput/EditorInputPanel.cs b/DungeonShooting_Godot/src/game/ui/editorInput/EditorInputPanel.cs new file mode 100644 index 0000000..f503c89 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorInput/EditorInputPanel.cs @@ -0,0 +1,32 @@ +using Godot; + +namespace UI.EditorInput; + +public partial class EditorInputPanel : EditorInput +{ + + public override void OnCreateUi() + { + + } + + public override void OnDestroyUi() + { + + } + + public void Init(string labelText, string value = null) + { + S_Label.Instance.Text = labelText; + if (value != null) + { + S_LineEdit.Instance.Text = value; + } + } + + public string GetValue() + { + return S_LineEdit.Instance.Text; + } + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs new file mode 100644 index 0000000..6edd3bd --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs @@ -0,0 +1,313 @@ +namespace UI.EditorManager; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorManager : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg + /// + public Bg L_Bg + { + get + { + if (_L_Bg == null) _L_Bg = new Bg((EditorManagerPanel)this, GetNode("Bg")); + return _L_Bg; + } + } + private Bg _L_Bg; + + + public EditorManager() : base(nameof(EditorManager)) + { + } + + public sealed override void OnInitNestedUi() + { + + var inst1 = L_Bg.L_VBoxContainer.L_TabContainer.L_Map; + RecordNestedUi(inst1.L_MapEditorProject.Instance, inst1, UiManager.RecordType.Open); + inst1.L_MapEditorProject.Instance.OnCreateUi(); + inst1.L_MapEditorProject.Instance.OnInitNestedUi(); + + var inst2 = L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet; + RecordNestedUi(inst2.L_TileSetEditorProject.Instance, inst2, UiManager.RecordType.Open); + inst2.L_TileSetEditorProject.Instance.OnCreateUi(); + inst2.L_TileSetEditorProject.Instance.OnInitNestedUi(); + + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.Head.Back + /// + public class Back : UiNode + { + public Back(EditorManagerPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Back Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.Head.Title + /// + public class Title : UiNode + { + public Title(EditorManagerPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Title Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.Head + /// + public class Head : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Back + /// + public Back L_Back + { + get + { + if (_L_Back == null) _L_Back = new Back(UiPanel, Instance.GetNode("Back")); + return _L_Back; + } + } + private Back _L_Back; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Title + /// + public Title L_Title + { + get + { + if (_L_Title == null) _L_Title = new Title(UiPanel, Instance.GetNode("Title")); + return _L_Title; + } + } + private Title _L_Title; + + public Head(EditorManagerPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Head Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.TabContainer.Map.MapEditorProject + /// + public class MapEditorProject : UiNode + { + public MapEditorProject(EditorManagerPanel uiPanel, UI.MapEditorProject.MapEditorProjectPanel node) : base(uiPanel, node) { } + public override MapEditorProject Clone() + { + var uiNode = new MapEditorProject(UiPanel, (UI.MapEditorProject.MapEditorProjectPanel)Instance.Duplicate()); + UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); + uiNode.Instance.OnCreateUi(); + uiNode.Instance.OnInitNestedUi(); + return uiNode; + } + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.TabContainer.Map + /// + public class Map : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.MapEditorProject + /// + public MapEditorProject L_MapEditorProject + { + get + { + if (_L_MapEditorProject == null) _L_MapEditorProject = new MapEditorProject(UiPanel, Instance.GetNode("MapEditorProject")); + return _L_MapEditorProject; + } + } + private MapEditorProject _L_MapEditorProject; + + public Map(EditorManagerPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override Map Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet.TileSetEditorProject + /// + public class TileSetEditorProject : UiNode + { + public TileSetEditorProject(EditorManagerPanel uiPanel, UI.TileSetEditorProject.TileSetEditorProjectPanel node) : base(uiPanel, node) { } + public override TileSetEditorProject Clone() + { + var uiNode = new TileSetEditorProject(UiPanel, (UI.TileSetEditorProject.TileSetEditorProjectPanel)Instance.Duplicate()); + UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); + uiNode.Instance.OnCreateUi(); + uiNode.Instance.OnInitNestedUi(); + return uiNode; + } + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet + /// + public class TileSet : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSetEditorProject + /// + public TileSetEditorProject L_TileSetEditorProject + { + get + { + if (_L_TileSetEditorProject == null) _L_TileSetEditorProject = new TileSetEditorProject(UiPanel, Instance.GetNode("TileSetEditorProject")); + return _L_TileSetEditorProject; + } + } + private TileSetEditorProject _L_TileSetEditorProject; + + public TileSet(EditorManagerPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override TileSet Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer.TabContainer + /// + public class TabContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Map + /// + public Map L_Map + { + get + { + if (_L_Map == null) _L_Map = new Map(UiPanel, Instance.GetNode("Map")); + return _L_Map; + } + } + private Map _L_Map; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TileSet + /// + public TileSet L_TileSet + { + get + { + if (_L_TileSet == null) _L_TileSet = new TileSet(UiPanel, Instance.GetNode("TileSet")); + return _L_TileSet; + } + } + private TileSet _L_TileSet; + + public TabContainer(EditorManagerPanel uiPanel, Godot.TabContainer node) : base(uiPanel, node) { } + public override TabContainer Clone() => new (UiPanel, (Godot.TabContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.Head + /// + public Head L_Head + { + get + { + if (_L_Head == null) _L_Head = new Head(UiPanel, Instance.GetNode("Head")); + return _L_Head; + } + } + private Head _L_Head; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.Bg.TabContainer + /// + public TabContainer L_TabContainer + { + get + { + if (_L_TabContainer == null) _L_TabContainer = new TabContainer(UiPanel, Instance.GetNode("TabContainer")); + return _L_TabContainer; + } + } + private TabContainer _L_TabContainer; + + public VBoxContainer(EditorManagerPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorManager.Bg + /// + public class Bg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorManager.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public Bg(EditorManagerPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Bg Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Head.Back + /// + public Back S_Back => L_Bg.L_VBoxContainer.L_Head.L_Back; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Head.Title + /// + public Title S_Title => L_Bg.L_VBoxContainer.L_Head.L_Title; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.Head + /// + public Head S_Head => L_Bg.L_VBoxContainer.L_Head; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.Map.MapEditorProject + /// + public MapEditorProject S_MapEditorProject => L_Bg.L_VBoxContainer.L_TabContainer.L_Map.L_MapEditorProject; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.Map + /// + public Map S_Map => L_Bg.L_VBoxContainer.L_TabContainer.L_Map; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet.TileSetEditorProject + /// + public TileSetEditorProject S_TileSetEditorProject => L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet.L_TileSetEditorProject; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet + /// + public TileSet S_TileSet => L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer.TabContainer + /// + public TabContainer S_TabContainer => L_Bg.L_VBoxContainer.L_TabContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_Bg.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorManager.Bg + /// + public Bg S_Bg => L_Bg; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs new file mode 100644 index 0000000..dcf9a2f --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs @@ -0,0 +1,28 @@ +using Godot; + +namespace UI.EditorManager; + +public partial class EditorManagerPanel : EditorManager +{ + + public override void OnCreateUi() + { + if (PrevUi != null) + { + S_Back.Instance.Pressed += OpenPrevUi; + } + else + { + S_Back.Instance.Visible = false; + } + + S_TabContainer.Instance.SetTabTitle(0, "地牢房间"); + S_TabContainer.Instance.SetTabTitle(1, "图块集"); + } + + public override void OnDestroyUi() + { + + } + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImage.cs b/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImage.cs new file mode 100644 index 0000000..35dcabb --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImage.cs @@ -0,0 +1,710 @@ +namespace UI.EditorTileImage; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class EditorTileImage : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer((EditorTileImagePanel)this, GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + + public EditorTileImage() : base(nameof(EditorTileImage)) + { + } + + public sealed override void OnInitNestedUi() + { + _ = L_HBoxContainer.L_Left.L_Bg; + _ = L_HBoxContainer.L_Left.L_Bg.L_TextureRoot.L_Brush; + + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot.TileSprite + /// + public class TileSprite : UiNode + { + public TileSprite(EditorTileImagePanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override TileSprite Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot.Brush + /// + public class Brush : UiNode + { + public Brush(EditorTileImagePanel uiPanel, UI.EditorTileImage.RectBrush node) : base(uiPanel, node) { } + public override Brush Clone() => new (UiPanel, (UI.EditorTileImage.RectBrush)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot + /// + public class TextureRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.TileSprite + /// + public TileSprite L_TileSprite + { + get + { + if (_L_TileSprite == null) _L_TileSprite = new TileSprite(UiPanel, Instance.GetNode("TileSprite")); + return _L_TileSprite; + } + } + private TileSprite _L_TileSprite; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.Brush + /// + public Brush L_Brush + { + get + { + if (_L_Brush == null) _L_Brush = new Brush(UiPanel, Instance.GetNode("Brush")); + return _L_Brush; + } + } + private Brush _L_Brush; + + public TextureRoot(EditorTileImagePanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override TextureRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left.Bg.FocusBtn + /// + public class FocusBtn : UiNode + { + public FocusBtn(EditorTileImagePanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left.Bg + /// + public class Bg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.TextureRoot + /// + public TextureRoot L_TextureRoot + { + get + { + if (_L_TextureRoot == null) _L_TextureRoot = new TextureRoot(UiPanel, Instance.GetNode("TextureRoot")); + return _L_TextureRoot; + } + } + private TextureRoot _L_TextureRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.FocusBtn + /// + public FocusBtn L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn _L_FocusBtn; + + public Bg(EditorTileImagePanel uiPanel, UI.EditorTileImage.ImageBg node) : base(uiPanel, node) { } + public override Bg Clone() => new (UiPanel, (UI.EditorTileImage.ImageBg)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Left + /// + public class Left : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Bg + /// + public Bg L_Bg + { + get + { + if (_L_Bg == null) _L_Bg = new Bg(UiPanel, Instance.GetNode("Bg")); + return _L_Bg; + } + } + private Bg _L_Bg; + + public Left(EditorTileImagePanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Left Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer.Label + /// + public class Label : UiNode + { + public Label(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer.StartX + /// + public class StartX : UiNode + { + public StartX(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override StartX Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer + /// + public class HBoxContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.StartX + /// + public StartX L_StartX + { + get + { + if (_L_StartX == null) _L_StartX = new StartX(UiPanel, Instance.GetNode("StartX")); + return _L_StartX; + } + } + private StartX _L_StartX; + + public HBoxContainer_1(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer_1 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer2.Label + /// + public class Label_1 : UiNode + { + public Label_1(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer2.StartY + /// + public class StartY : UiNode + { + public StartY(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override StartY Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label_1 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_1(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_1 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.StartY + /// + public StartY L_StartY + { + get + { + if (_L_StartY == null) _L_StartY = new StartY(UiPanel, Instance.GetNode("StartY")); + return _L_StartY; + } + } + private StartY _L_StartY; + + public HBoxContainer2(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer3.Label + /// + public class Label_2 : UiNode + { + public Label_2(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_2 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer3.OffsetX + /// + public class OffsetX : UiNode + { + public OffsetX(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override OffsetX Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer3 + /// + public class HBoxContainer3 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label_2 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_2(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_2 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.OffsetX + /// + public OffsetX L_OffsetX + { + get + { + if (_L_OffsetX == null) _L_OffsetX = new OffsetX(UiPanel, Instance.GetNode("OffsetX")); + return _L_OffsetX; + } + } + private OffsetX _L_OffsetX; + + public HBoxContainer3(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer3 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer4.Label + /// + public class Label_3 : UiNode + { + public Label_3(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_3 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer4.OffsetY + /// + public class OffsetY : UiNode + { + public OffsetY(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override OffsetY Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer4 + /// + public class HBoxContainer4 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label_3 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_3(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_3 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.OffsetY + /// + public OffsetY L_OffsetY + { + get + { + if (_L_OffsetY == null) _L_OffsetY = new OffsetY(UiPanel, Instance.GetNode("OffsetY")); + return _L_OffsetY; + } + } + private OffsetY _L_OffsetY; + + public HBoxContainer4(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer4 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer5.Label + /// + public class Label_4 : UiNode + { + public Label_4(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_4 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer5.HCount + /// + public class HCount : UiNode + { + public HCount(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override HCount Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer5 + /// + public class HBoxContainer5 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label_4 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_4(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_4 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HCount + /// + public HCount L_HCount + { + get + { + if (_L_HCount == null) _L_HCount = new HCount(UiPanel, Instance.GetNode("HCount")); + return _L_HCount; + } + } + private HCount _L_HCount; + + public HBoxContainer5(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer6.Label + /// + public class Label_5 : UiNode + { + public Label_5(EditorTileImagePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_5 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer6.VCount + /// + public class VCount : UiNode + { + public VCount(EditorTileImagePanel uiPanel, Godot.SpinBox node) : base(uiPanel, node) { } + public override VCount Clone() => new (UiPanel, (Godot.SpinBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer6 + /// + public class HBoxContainer6 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.Label + /// + public Label_5 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_5(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_5 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.VCount + /// + public VCount L_VCount + { + get + { + if (_L_VCount == null) _L_VCount = new VCount(UiPanel, Instance.GetNode("VCount")); + return _L_VCount; + } + } + private VCount _L_VCount; + + public HBoxContainer6(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer6 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer + /// + public HBoxContainer_1 L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer_1(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer_1 _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer3 + /// + public HBoxContainer3 L_HBoxContainer3 + { + get + { + if (_L_HBoxContainer3 == null) _L_HBoxContainer3 = new HBoxContainer3(UiPanel, Instance.GetNode("HBoxContainer3")); + return _L_HBoxContainer3; + } + } + private HBoxContainer3 _L_HBoxContainer3; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer4 + /// + public HBoxContainer4 L_HBoxContainer4 + { + get + { + if (_L_HBoxContainer4 == null) _L_HBoxContainer4 = new HBoxContainer4(UiPanel, Instance.GetNode("HBoxContainer4")); + return _L_HBoxContainer4; + } + } + private HBoxContainer4 _L_HBoxContainer4; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer5 + /// + public HBoxContainer5 L_HBoxContainer5 + { + get + { + if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNode("HBoxContainer5")); + return _L_HBoxContainer5; + } + } + private HBoxContainer5 _L_HBoxContainer5; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.HBoxContainer6 + /// + public HBoxContainer6 L_HBoxContainer6 + { + get + { + if (_L_HBoxContainer6 == null) _L_HBoxContainer6 = new HBoxContainer6(UiPanel, Instance.GetNode("HBoxContainer6")); + return _L_HBoxContainer6; + } + } + private HBoxContainer6 _L_HBoxContainer6; + + public VBoxContainer(EditorTileImagePanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer.Right + /// + public class Right : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public Right(EditorTileImagePanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Right Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTileImage.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.Left + /// + public Left L_Left + { + get + { + if (_L_Left == null) _L_Left = new Left(UiPanel, Instance.GetNode("Left")); + return _L_Left; + } + } + private Left _L_Left; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTileImage.Right + /// + public Right L_Right + { + get + { + if (_L_Right == null) _L_Right = new Right(UiPanel, Instance.GetNode("Right")); + return _L_Right; + } + } + private Right _L_Right; + + public HBoxContainer(EditorTileImagePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot.TileSprite + /// + public TileSprite S_TileSprite => L_HBoxContainer.L_Left.L_Bg.L_TextureRoot.L_TileSprite; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot.Brush + /// + public Brush S_Brush => L_HBoxContainer.L_Left.L_Bg.L_TextureRoot.L_Brush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.TextureRoot + /// + public TextureRoot S_TextureRoot => L_HBoxContainer.L_Left.L_Bg.L_TextureRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg.FocusBtn + /// + public FocusBtn S_FocusBtn => L_HBoxContainer.L_Left.L_Bg.L_FocusBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left.Bg + /// + public Bg S_Bg => L_HBoxContainer.L_Left.L_Bg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Left + /// + public Left S_Left => L_HBoxContainer.L_Left; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer.StartX + /// + public StartX S_StartX => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer.L_StartX; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer2.StartY + /// + public StartY S_StartY => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer2.L_StartY; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer3.OffsetX + /// + public OffsetX S_OffsetX => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer3.L_OffsetX; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer3 + /// + public HBoxContainer3 S_HBoxContainer3 => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer3; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer4.OffsetY + /// + public OffsetY S_OffsetY => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer4.L_OffsetY; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer4 + /// + public HBoxContainer4 S_HBoxContainer4 => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer4; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer5.HCount + /// + public HCount S_HCount => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer5.L_HCount; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer5 + /// + public HBoxContainer5 S_HBoxContainer5 => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer5; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer6.VCount + /// + public VCount S_VCount => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer6.L_VCount; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer.HBoxContainer6 + /// + public HBoxContainer6 S_HBoxContainer6 => L_HBoxContainer.L_Right.L_VBoxContainer.L_HBoxContainer6; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_HBoxContainer.L_Right.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTileImage.HBoxContainer.Right + /// + public Right S_Right => L_HBoxContainer.L_Right; + +} diff --git a/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImagePanel.cs b/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImagePanel.cs new file mode 100644 index 0000000..3cb8860 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorTileImage/EditorTileImagePanel.cs @@ -0,0 +1,139 @@ +using Godot; + +namespace UI.EditorTileImage; + +public partial class EditorTileImagePanel : EditorTileImage +{ + /// + /// 起始X + /// + public int StartXValue { get; private set; } + /// + /// 起始Y + /// + public int StartYValue { get; private set; } + /// + /// 间距X + /// + public int OffsetXValue { get; private set; } + /// + /// 间距Y + /// + public int OffsetYValue { get; private set; } + /// + /// 横轴数量 + /// + public int HCountValue { get; private set; } + /// + /// 纵轴数量 + /// + public int VCountValue { get; private set; } + /// + /// 纹理大小 + /// + public Vector2I ImageSize { get; private set; } + /// + /// 使用的Image对象 + /// + public Image UseImage { get; private set; } + + private ImageTexture _texture; + + public override void OnCreateUi() + { + S_StartX.Instance.ValueChanged += (v) => + { + StartXValue = (int)v; + RefreshHVMaxCount(); + }; + S_StartY.Instance.ValueChanged += (v) => + { + StartYValue = (int)v; + RefreshHVMaxCount(); + }; + S_OffsetX.Instance.ValueChanged += (v) => + { + OffsetXValue = (int)v; + RefreshHVMaxCount(); + }; + S_OffsetY.Instance.ValueChanged += (v) => + { + OffsetYValue = (int)v; + RefreshHVMaxCount(); + }; + S_HCount.Instance.ValueChanged += (v) => + { + HCountValue = (int)v; + }; + S_VCount.Instance.ValueChanged += (v) => + { + VCountValue = (int)v; + }; + } + + public override void OnDestroyUi() + { + if (UseImage != null) + { + UseImage.Dispose(); + UseImage = null; + } + + if (_texture != null) + { + _texture.Dispose(); + _texture = null; + } + } + + /// + /// 初始化Ui数据 + /// + public void InitData(Image image) + { + UseImage = image; + ImageSize = image.GetSize(); + _texture = ImageTexture.CreateFromImage(image); + S_TileSprite.Instance.Texture = _texture; + S_Bg.Instance.DoFocus(); + S_TextureRoot.Instance.Size = image.GetSize(); + + RefreshHVMaxCount(); + S_HCount.Instance.Value = S_HCount.Instance.MaxValue; + S_VCount.Instance.Value = S_VCount.Instance.MaxValue; + } + + /// + /// 获取处理后的图像 + /// + public Image GetImage() + { + var image = Image.Create(HCountValue * GameConfig.TileCellSize, VCountValue * GameConfig.TileCellSize, false, Image.Format.Rgba8); + var start = new Vector2I(StartXValue, StartYValue); + for (int i = 0; i < HCountValue; i++) + { + for (int j = 0; j < VCountValue; j++) + { + var offset = new Vector2I(i * (OffsetXValue + GameConfig.TileCellSize), j * (OffsetYValue + GameConfig.TileCellSize)); + image.BlitRect(UseImage, + new Rect2I( + start + offset, + GameConfig.TileCellSizeVector2I + ), + new Vector2I(i * GameConfig.TileCellSize, j * GameConfig.TileCellSize) + ); + } + } + + return image; + } + + //更新最大计数的水平和垂直方向的值 + private void RefreshHVMaxCount() + { + var hv = Mathf.FloorToInt(((float)ImageSize.X - StartXValue + OffsetXValue) / (GameConfig.TileCellSize + OffsetXValue)); + var vv = Mathf.FloorToInt(((float)ImageSize.Y - StartYValue + OffsetYValue) / (GameConfig.TileCellSize + OffsetYValue)); + S_HCount.Instance.MaxValue = hv; + S_VCount.Instance.MaxValue = vv; + } +} diff --git a/DungeonShooting_Godot/src/game/ui/editorTileImage/ImageBg.cs b/DungeonShooting_Godot/src/game/ui/editorTileImage/ImageBg.cs new file mode 100644 index 0000000..0a8adf6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorTileImage/ImageBg.cs @@ -0,0 +1,31 @@ +using Godot; + +namespace UI.EditorTileImage; + +public partial class ImageBg : EditorGridBg +{ + public new EditorTileImage.Bg UiNode => (EditorTileImage.Bg)base.UiNode; + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + InitNode(UiNode.L_TextureRoot.Instance); + var arr = UiManager.Get_TileSetEditor_Instance(); + if (arr.Length > 0) + { + UiNode.Instance.Color = arr[0].BgColor; + } + //聚焦按钮点击 + UiNode.L_FocusBtn.Instance.Pressed += DoFocus; + } + + /// + /// 聚焦 + /// + public void DoFocus() + { + var texture = UiNode.L_TextureRoot.L_TileSprite.Instance.Texture; + Utils.DoFocusNode(ContainerRoot, Size, texture != null ? texture.GetSize() : Vector2.Zero); + RefreshGridTrans(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/editorTileImage/RectBrush.cs b/DungeonShooting_Godot/src/game/ui/editorTileImage/RectBrush.cs new file mode 100644 index 0000000..7d17e7a --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/editorTileImage/RectBrush.cs @@ -0,0 +1,56 @@ +using Godot; + +namespace UI.EditorTileImage; + +public partial class RectBrush : Control, IUiNodeScript +{ + private Control _parent; + private EditorTileImage.Brush UiNode; + + public void SetUiNode(IUiNode uiNode) + { + UiNode = (EditorTileImage.Brush)uiNode; + _parent = GetParent(); + } + + public void OnDestroy() + { + + } + public override void _Process(double delta) + { + if (UiNode.UiPanel.UseImage != null) + { + QueueRedraw(); + } + } + + public override void _Draw() + { + var panel = UiNode.UiPanel; + if (panel.UseImage != null) + { + var sx = _parent.Scale.X; + var size = panel.ImageSize; + var lineWidth = 2f / sx; + var lineWidthHalf = new Vector2(lineWidth / 2f, lineWidth / 2f); + DrawRect(new Rect2(Vector2.Zero, size), Colors.Yellow, false, lineWidth); + + var start = new Vector2(panel.StartXValue, panel.StartYValue); + for (int i = 0; i < panel.HCountValue; i++) + { + for (int j = 0; j < panel.VCountValue; j++) + { + var offset = new Vector2(i * (panel.OffsetXValue + GameConfig.TileCellSize), j * (panel.OffsetYValue + GameConfig.TileCellSize)); + DrawRect( + new Rect2( + start + offset + lineWidthHalf, + new Vector2(GameConfig.TileCellSize, GameConfig.TileCellSize) - new Vector2(lineWidth, lineWidth) + ), + new Color(0, 1, 0, 0.5f), false, lineWidth + ); + } + } + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs index 07195e8..d19a1d9 100644 --- a/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs @@ -15,7 +15,7 @@ /// Godot编辑器扩展工具 /// [Tool] -public partial class EditorToolsPanel : EditorTools +public partial class EditorToolsPanel : EditorTools, ISerializationListener { #if TOOLS @@ -81,6 +81,15 @@ container.L_HBoxContainer7.L_Button.Instance.Pressed -= ExportExcel; container.L_HBoxContainer8.L_Button.Instance.Pressed -= OpenExportExcelFolder; } + + public void OnBeforeSerialize() + { + OnHideUi(); + } + public void OnAfterDeserialize() + { + OnShowUi(); + } /// /// Tips 关闭信号回调 @@ -201,7 +210,7 @@ { if (Plugin.Plugin.Instance != null) { - var root = Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot(); + var root = EditorInterface.Singleton.GetEditedSceneRoot(); if (root != null && Plugin.Plugin.Instance.CheckIsUi(root)) { if (UiGenerator.GenerateUiCodeFromEditor(root)) @@ -309,10 +318,19 @@ /// private void OpenExportExcelFolder() { - var path = Environment.CurrentDirectory + "\\excel"; - System.Diagnostics.Process.Start("explorer.exe", path); + var path = Environment.CurrentDirectory + "/excel"; + var osName = OS.GetName(); + GD.Print("打开excel文件夹: " + path); + if (osName == "Windows") + { + System.Diagnostics.Process.Start("explorer.exe", path); + } + else + { + System.Diagnostics.Process.Start("open", path); + } } - + /// /// 在编辑器中打开一个提示窗口 /// @@ -344,5 +362,11 @@ public override void OnHideUi() { } + public void OnBeforeSerialize() + { + } + public void OnAfterDeserialize() + { + } #endif } diff --git a/DungeonShooting_Godot/src/game/ui/editorWindow/CustomButtonCell.cs b/DungeonShooting_Godot/src/game/ui/editorWindow/CustomButtonCell.cs index a03439e..67f2284 100644 --- a/DungeonShooting_Godot/src/game/ui/editorWindow/CustomButtonCell.cs +++ b/DungeonShooting_Godot/src/game/ui/editorWindow/CustomButtonCell.cs @@ -12,11 +12,6 @@ CellNode.L_Button.Instance.Text = data.Text; } - public override void OnDestroy() - { - CellNode.L_Button.Instance.Pressed -= OnClick; - } - public override void OnClick() { if (Data.Callback != null) diff --git a/DungeonShooting_Godot/src/game/ui/editorWindow/EditorWindowPanel.cs b/DungeonShooting_Godot/src/game/ui/editorWindow/EditorWindowPanel.cs index 6e1761b..d6054cd 100644 --- a/DungeonShooting_Godot/src/game/ui/editorWindow/EditorWindowPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/editorWindow/EditorWindowPanel.cs @@ -29,7 +29,10 @@ /// public event Action CloseEvent; - private UiGrid _uiGrid; + /// + /// 设置按钮列表 + /// + public UiGrid ButtonGrid { get; private set; } public override void OnCreateUi() { @@ -42,14 +45,14 @@ /// public void SetButtonList(params ButtonData[] buttons) { - if (_uiGrid == null) + if (ButtonGrid == null) { S_CustomButton.Instance.Visible = true; - _uiGrid = new UiGrid(S_CustomButton, typeof(CustomButtonCell)); - _uiGrid.SetHorizontalExpand(true); + ButtonGrid = CreateUiGrid(S_CustomButton); + ButtonGrid.SetHorizontalExpand(true); } - _uiGrid.SetColumns(buttons.Length); - _uiGrid.SetDataList(buttons); + ButtonGrid.SetColumns(buttons.Length); + ButtonGrid.SetDataList(buttons); } /// @@ -102,6 +105,10 @@ /// 是否派发关闭窗口的事件 public void CloseWindow(bool triggerEvent = true) { + if (IsDestroyed) + { + return; + } if (triggerEvent && CloseEvent != null) { CloseEvent(); diff --git a/DungeonShooting_Godot/src/game/ui/main/MainPanel.cs b/DungeonShooting_Godot/src/game/ui/main/MainPanel.cs index c0008e9..b6473d1 100644 --- a/DungeonShooting_Godot/src/game/ui/main/MainPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/main/MainPanel.cs @@ -19,18 +19,12 @@ //点击开始游戏 private void OnStartGameClick() { - //验证该组是否满足生成地牢的条件 - var config = GameApplication.Instance.DungeonConfig; - var result = DungeonManager.CheckDungeon(config.GroupName); - if (result.HasError) + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.LoadHall(() => { - EditorWindowManager.ShowTips("警告", "当前组'" + config.GroupName + "'" + result.ErrorMessage + ", 不能生成地牢!"); - } - else - { - GameApplication.Instance.DungeonManager.LoadDungeon(config); - HideUi(); - } + UiManager.Destroy_Loading(); + }); + HideUi(); } //退出游戏 @@ -42,7 +36,7 @@ //点击开发者工具 private void OnToolsClick() { - OpenNextUi(UiManager.UiNames.MapEditorProject); + OpenNextUi(UiManager.UiNames.EditorManager); } //点击设置按钮 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs index 4d94396..0873589 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs @@ -25,27 +25,27 @@ public sealed override void OnInitNestedUi() { - _ = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap; + _ = L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap; - var inst1 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer; - RecordNestedUi(inst1.L_MapEditorTools.Instance, inst1, UiManager.RecordType.Open); - inst1.L_MapEditorTools.Instance.OnCreateUi(); - inst1.L_MapEditorTools.Instance.OnInitNestedUi(); + var inst1 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_LayerPanel; + RecordNestedUi(inst1.L_MapEditorMapLayer.Instance, inst1, UiManager.RecordType.Open); + inst1.L_MapEditorMapLayer.Instance.OnCreateUi(); + inst1.L_MapEditorMapLayer.Instance.OnInitNestedUi(); - var inst2 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapMark; - RecordNestedUi(inst2.L_MapEditorMapMark.Instance, inst2, UiManager.RecordType.Open); - inst2.L_MapEditorMapMark.Instance.OnCreateUi(); - inst2.L_MapEditorMapMark.Instance.OnInitNestedUi(); + var inst2 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer; + RecordNestedUi(inst2.L_MapEditorTools.Instance, inst2, UiManager.RecordType.Open); + inst2.L_MapEditorTools.Instance.OnCreateUi(); + inst2.L_MapEditorTools.Instance.OnInitNestedUi(); - var inst3 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapLayer; - RecordNestedUi(inst3.L_MapEditorMapLayer.Instance, inst3, UiManager.RecordType.Open); - inst3.L_MapEditorMapLayer.Instance.OnCreateUi(); - inst3.L_MapEditorMapLayer.Instance.OnInitNestedUi(); + var inst3 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapTile; + RecordNestedUi(inst3.L_MapEditorMapTile.Instance, inst3, UiManager.RecordType.Open); + inst3.L_MapEditorMapTile.Instance.OnCreateUi(); + inst3.L_MapEditorMapTile.Instance.OnInitNestedUi(); - var inst4 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapTileSet; - RecordNestedUi(inst4.L_MapEditorTileSet.Instance, inst4, UiManager.RecordType.Open); - inst4.L_MapEditorTileSet.Instance.OnCreateUi(); - inst4.L_MapEditorTileSet.Instance.OnInitNestedUi(); + var inst4 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapMark; + RecordNestedUi(inst4.L_MapEditorMapMark.Instance, inst4, UiManager.RecordType.Open); + inst4.L_MapEditorMapMark.Instance.OnCreateUi(); + inst4.L_MapEditorMapMark.Instance.OnInitNestedUi(); } @@ -169,7 +169,54 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell.ErrorCellAnimationPlayer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.LayerPanel.MapEditorMapLayer + /// + public class MapEditorMapLayer : UiNode + { + public MapEditorMapLayer(MapEditorPanel uiPanel, UI.MapEditorMapLayer.MapEditorMapLayerPanel node) : base(uiPanel, node) { } + public override MapEditorMapLayer Clone() + { + var uiNode = new MapEditorMapLayer(UiPanel, (UI.MapEditorMapLayer.MapEditorMapLayerPanel)Instance.Duplicate()); + UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); + uiNode.Instance.OnCreateUi(); + uiNode.Instance.OnInitNestedUi(); + return uiNode; + } + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.LayerPanel + /// + public class LayerPanel : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.MapEditorMapLayer + /// + public MapEditorMapLayer L_MapEditorMapLayer + { + get + { + if (_L_MapEditorMapLayer == null) _L_MapEditorMapLayer = new MapEditorMapLayer(UiPanel, Instance.GetNode("MapEditorMapLayer")); + return _L_MapEditorMapLayer; + } + } + private MapEditorMapLayer _L_MapEditorMapLayer; + + public LayerPanel(MapEditorPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override LayerPanel Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.NavigationRegion + /// + public class NavigationRegion : UiNode + { + public NavigationRegion(MapEditorPanel uiPanel, Godot.NavigationRegion2D node) : base(uiPanel, node) { } + public override NavigationRegion Clone() => new (UiPanel, (Godot.NavigationRegion2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell.ErrorCellAnimationPlayer /// public class ErrorCellAnimationPlayer : UiNode { @@ -178,12 +225,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell /// public class ErrorCell : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCellAnimationPlayer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCellAnimationPlayer /// public ErrorCellAnimationPlayer L_ErrorCellAnimationPlayer { @@ -200,7 +247,7 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.Brush + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.Brush /// public class Brush : UiNode { @@ -209,12 +256,25 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap /// public class TileMap : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.ErrorCell + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.NavigationRegion + /// + public NavigationRegion L_NavigationRegion + { + get + { + if (_L_NavigationRegion == null) _L_NavigationRegion = new NavigationRegion(UiPanel, Instance.GetNode("NavigationRegion")); + return _L_NavigationRegion; + } + } + private NavigationRegion _L_NavigationRegion; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.ErrorCell /// public ErrorCell L_ErrorCell { @@ -227,7 +287,7 @@ private ErrorCell _L_ErrorCell; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.Brush + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.Brush /// public Brush L_Brush { @@ -244,7 +304,7 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer.MapEditorTools + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer.MapEditorTools /// public class MapEditorTools : UiNode { @@ -260,12 +320,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer /// public class CanvasLayer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.MapEditorTools + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.MapEditorTools /// public MapEditorTools L_MapEditorTools { @@ -282,12 +342,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport /// public class SubViewport : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.TileMap + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.TileMap /// public TileMap L_TileMap { @@ -300,7 +360,7 @@ private TileMap _L_TileMap; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.CanvasLayer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.CanvasLayer /// public CanvasLayer L_CanvasLayer { @@ -317,12 +377,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView /// public class MapView : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.SubViewport + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.SubViewport /// public SubViewport L_SubViewport { @@ -339,7 +399,7 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView2 + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView2 /// public class MapView2 : UiNode { @@ -348,12 +408,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer /// public class MarginContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MapView + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MapView /// public MapView L_MapView { @@ -366,7 +426,7 @@ private MapView _L_MapView; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MapView2 + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MapView2 /// public MapView2 L_MapView2 { @@ -383,12 +443,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left /// public class Left : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.MarginContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.MarginContainer /// public MarginContainer L_MarginContainer { @@ -405,7 +465,80 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapMark.MapEditorMapMark + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.LayerPanel + /// + public LayerPanel L_LayerPanel + { + get + { + if (_L_LayerPanel == null) _L_LayerPanel = new LayerPanel(UiPanel, Instance.GetNode("LayerPanel")); + return _L_LayerPanel; + } + } + private LayerPanel _L_LayerPanel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Left + /// + public Left L_Left + { + get + { + if (_L_Left == null) _L_Left = new Left(UiPanel, Instance.GetNode("Left")); + return _L_Left; + } + } + private Left _L_Left; + + public HBoxContainer(MapEditorPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapTile.MapEditorMapTile + /// + public class MapEditorMapTile : UiNode + { + public MapEditorMapTile(MapEditorPanel uiPanel, UI.MapEditorMapTile.MapEditorMapTilePanel node) : base(uiPanel, node) { } + public override MapEditorMapTile Clone() + { + var uiNode = new MapEditorMapTile(UiPanel, (UI.MapEditorMapTile.MapEditorMapTilePanel)Instance.Duplicate()); + UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); + uiNode.Instance.OnCreateUi(); + uiNode.Instance.OnInitNestedUi(); + return uiNode; + } + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapTile + /// + public class MapTile : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapEditorMapTile + /// + public MapEditorMapTile L_MapEditorMapTile + { + get + { + if (_L_MapEditorMapTile == null) _L_MapEditorMapTile = new MapEditorMapTile(UiPanel, Instance.GetNode("MapEditorMapTile")); + return _L_MapEditorMapTile; + } + } + private MapEditorMapTile _L_MapEditorMapTile; + + public MapTile(MapEditorPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MapTile Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapMark.MapEditorMapMark /// public class MapEditorMapMark : UiNode { @@ -421,12 +554,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapMark + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapMark /// public class MapMark : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapEditorMapMark + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapEditorMapMark /// public MapEditorMapMark L_MapEditorMapMark { @@ -443,88 +576,25 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapLayer.MapEditorMapLayer - /// - public class MapEditorMapLayer : UiNode - { - public MapEditorMapLayer(MapEditorPanel uiPanel, UI.MapEditorMapLayer.MapEditorMapLayerPanel node) : base(uiPanel, node) { } - public override MapEditorMapLayer Clone() - { - var uiNode = new MapEditorMapLayer(UiPanel, (UI.MapEditorMapLayer.MapEditorMapLayerPanel)Instance.Duplicate()); - UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); - uiNode.Instance.OnCreateUi(); - uiNode.Instance.OnInitNestedUi(); - return uiNode; - } - } - - /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapLayer - /// - public class MapLayer : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapEditorMapLayer - /// - public MapEditorMapLayer L_MapEditorMapLayer - { - get - { - if (_L_MapEditorMapLayer == null) _L_MapEditorMapLayer = new MapEditorMapLayer(UiPanel, Instance.GetNode("MapEditorMapLayer")); - return _L_MapEditorMapLayer; - } - } - private MapEditorMapLayer _L_MapEditorMapLayer; - - public MapLayer(MapEditorPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } - public override MapLayer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapTileSet.MapEditorTileSet - /// - public class MapEditorTileSet : UiNode - { - public MapEditorTileSet(MapEditorPanel uiPanel, UI.MapEditorTileSet.MapEditorTileSetPanel node) : base(uiPanel, node) { } - public override MapEditorTileSet Clone() - { - var uiNode = new MapEditorTileSet(UiPanel, (UI.MapEditorTileSet.MapEditorTileSetPanel)Instance.Duplicate()); - UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); - uiNode.Instance.OnCreateUi(); - uiNode.Instance.OnInitNestedUi(); - return uiNode; - } - } - - /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapTileSet - /// - public class MapTileSet : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapEditorTileSet - /// - public MapEditorTileSet L_MapEditorTileSet - { - get - { - if (_L_MapEditorTileSet == null) _L_MapEditorTileSet = new MapEditorTileSet(UiPanel, Instance.GetNode("MapEditorTileSet")); - return _L_MapEditorTileSet; - } - } - private MapEditorTileSet _L_MapEditorTileSet; - - public MapTileSet(MapEditorPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } - public override MapTileSet Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer /// public class TabContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.MapMark + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.MapTile + /// + public MapTile L_MapTile + { + get + { + if (_L_MapTile == null) _L_MapTile = new MapTile(UiPanel, Instance.GetNode("MapTile")); + return _L_MapTile; + } + } + private MapTile _L_MapTile; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.MapMark /// public MapMark L_MapMark { @@ -536,43 +606,17 @@ } private MapMark _L_MapMark; - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.MapLayer - /// - public MapLayer L_MapLayer - { - get - { - if (_L_MapLayer == null) _L_MapLayer = new MapLayer(UiPanel, Instance.GetNode("MapLayer")); - return _L_MapLayer; - } - } - private MapLayer _L_MapLayer; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.MapTileSet - /// - public MapTileSet L_MapTileSet - { - get - { - if (_L_MapTileSet == null) _L_MapTileSet = new MapTileSet(UiPanel, Instance.GetNode("MapTileSet")); - return _L_MapTileSet; - } - } - private MapTileSet _L_MapTileSet; - public TabContainer(MapEditorPanel uiPanel, Godot.TabContainer node) : base(uiPanel, node) { } public override TabContainer Clone() => new (UiPanel, (Godot.TabContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer /// public class MarginContainer_1 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.TabContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.TabContainer /// public TabContainer L_TabContainer { @@ -589,12 +633,12 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right /// public class Right : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.MarginContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.MarginContainer /// public MarginContainer_1 L_MarginContainer { @@ -611,25 +655,25 @@ } /// - /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2 /// - public class HSplitContainer : UiNode + public class HSplitContainer2 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.Left + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HBoxContainer /// - public Left L_Left + public HBoxContainer L_HBoxContainer { get { - if (_L_Left == null) _L_Left = new Left(UiPanel, Instance.GetNode("Left")); - return _L_Left; + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; } } - private Left _L_Left; + private HBoxContainer _L_HBoxContainer; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.Right + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right /// public Right L_Right { @@ -641,8 +685,30 @@ } private Right _L_Right; - public HSplitContainer(MapEditorPanel uiPanel, Godot.HSplitContainer node) : base(uiPanel, node) { } - public override HSplitContainer Clone() => new (UiPanel, (Godot.HSplitContainer)Instance.Duplicate()); + public HSplitContainer2(MapEditorPanel uiPanel, Godot.HSplitContainer node) : base(uiPanel, node) { } + public override HSplitContainer2 Clone() => new (UiPanel, (Godot.HSplitContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditor.Bg.VBoxContainer.HSplitContainer + /// + public class HSplitContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer2 + /// + public HSplitContainer2 L_HSplitContainer2 + { + get + { + if (_L_HSplitContainer2 == null) _L_HSplitContainer2 = new HSplitContainer2(UiPanel, Instance.GetNode("HSplitContainer2")); + return _L_HSplitContainer2; + } + } + private HSplitContainer2 _L_HSplitContainer2; + + public HSplitContainer(MapEditorPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HSplitContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// @@ -664,13 +730,13 @@ private Head _L_Head; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.HSplitContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditor.Bg.HSplitContainer /// public HSplitContainer L_HSplitContainer { get { - if (_L_HSplitContainer == null) _L_HSplitContainer = new HSplitContainer(UiPanel, Instance.GetNode("HSplitContainer")); + if (_L_HSplitContainer == null) _L_HSplitContainer = new HSplitContainer(UiPanel, Instance.GetNode("HSplitContainer")); return _L_HSplitContainer; } } @@ -734,97 +800,112 @@ public Head S_Head => L_Bg.L_VBoxContainer.L_Head; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell.ErrorCellAnimationPlayer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.LayerPanel.MapEditorMapLayer /// - public ErrorCellAnimationPlayer S_ErrorCellAnimationPlayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_ErrorCell.L_ErrorCellAnimationPlayer; + public MapEditorMapLayer S_MapEditorMapLayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_LayerPanel.L_MapEditorMapLayer; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.LayerPanel /// - public ErrorCell S_ErrorCell => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_ErrorCell; + public LayerPanel S_LayerPanel => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_LayerPanel; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap.Brush + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.NavigationRegion /// - public Brush S_Brush => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_Brush; + public NavigationRegion S_NavigationRegion => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_NavigationRegion; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.TileMap + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell.ErrorCellAnimationPlayer /// - public TileMap S_TileMap => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap; + public ErrorCellAnimationPlayer S_ErrorCellAnimationPlayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_ErrorCell.L_ErrorCellAnimationPlayer; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer.MapEditorTools + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.ErrorCell /// - public MapEditorTools S_MapEditorTools => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer.L_MapEditorTools; + public ErrorCell S_ErrorCell => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_ErrorCell; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap.Brush /// - public CanvasLayer S_CanvasLayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer; + public Brush S_Brush => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap.L_Brush; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView.SubViewport + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.TileMap /// - public SubViewport S_SubViewport => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport; + public TileMap S_TileMap => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_TileMap; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer.MapEditorTools /// - public MapView S_MapView => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView; + public MapEditorTools S_MapEditorTools => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer.L_MapEditorTools; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left.MarginContainer.MapView2 + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport.CanvasLayer /// - public MapView2 S_MapView2 => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView2; + public CanvasLayer S_CanvasLayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Left + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView.SubViewport /// - public Left S_Left => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left; + public SubViewport S_SubViewport => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapMark.MapEditorMapMark + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView /// - public MapEditorMapMark S_MapEditorMapMark => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapMark.L_MapEditorMapMark; + public MapView S_MapView => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapMark + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left.MarginContainer.MapView2 /// - public MapMark S_MapMark => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapMark; + public MapView2 S_MapView2 => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left.L_MarginContainer.L_MapView2; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapLayer.MapEditorMapLayer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer.Left /// - public MapEditorMapLayer S_MapEditorMapLayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapLayer.L_MapEditorMapLayer; + public Left S_Left => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer.L_Left; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapLayer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.HBoxContainer /// - public MapLayer S_MapLayer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapLayer; + public HBoxContainer S_HBoxContainer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_HBoxContainer; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapTileSet.MapEditorTileSet + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapTile.MapEditorMapTile /// - public MapEditorTileSet S_MapEditorTileSet => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapTileSet.L_MapEditorTileSet; + public MapEditorMapTile S_MapEditorMapTile => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapTile.L_MapEditorMapTile; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer.MapTileSet + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapTile /// - public MapTileSet S_MapTileSet => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer.L_MapTileSet; + public MapTile S_MapTile => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapTile; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right.MarginContainer.TabContainer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapMark.MapEditorMapMark /// - public TabContainer S_TabContainer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right.L_MarginContainer.L_TabContainer; + public MapEditorMapMark S_MapEditorMapMark => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapMark.L_MapEditorMapMark; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.Right + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer.MapMark /// - public Right S_Right => L_Bg.L_VBoxContainer.L_HSplitContainer.L_Right; + public MapMark S_MapMark => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer.L_MapMark; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right.MarginContainer.TabContainer + /// + public TabContainer S_TabContainer => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right.L_MarginContainer.L_TabContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2.Right + /// + public Right S_Right => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2.L_Right; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer.HSplitContainer2 + /// + public HSplitContainer2 S_HSplitContainer2 => L_Bg.L_VBoxContainer.L_HSplitContainer.L_HSplitContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditor.Bg.VBoxContainer.HSplitContainer /// public HSplitContainer S_HSplitContainer => L_Bg.L_VBoxContainer.L_HSplitContainer; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs index 8dbcf13..d54856e 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs @@ -1,3 +1,4 @@ +using System.Linq; using Godot; namespace UI.MapEditor; @@ -26,20 +27,22 @@ public override void OnCreateUi() { - //临时处理, 加载TileSet - var tileSet = ResourceManager.Load(ResourcePath.resource_map_tileSet_map1_TileSet1_tres); - var tileSetAtlasSource = (TileSetAtlasSource)tileSet.GetSource(0); - tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(Image.LoadFromFile("resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png")); - S_TileMap.Instance.TileSet = tileSet; - - S_TabContainer.Instance.SetTabTitle(0, "对象"); - S_TabContainer.Instance.SetTabTitle(1, "图层"); - S_TabContainer.Instance.SetTabTitle(2, "图块"); + S_TabContainer.Instance.SetTabTitle(0, "图块"); + S_TabContainer.Instance.SetTabTitle(1, "对象"); + S_TabContainer.Instance.TabChanged += OnTabChanged; //S_MapLayer.Instance.Init(S_MapLayer); S_Left.Instance.Resized += OnMapViewResized; S_Back.Instance.Pressed += OnBackClick; S_Save.Instance.Pressed += OnSave; S_Play.Instance.Pressed += OnPlay; + + OnTabChanged(0); + } + + //切换页签 + private void OnTabChanged(long tab) + { + S_LayerPanel.Instance.Visible = tab == 0; } public override void OnShowUi() @@ -50,11 +53,11 @@ public override void OnDestroyUi() { //清除选中的标记 - EditorManager.SetSelectMark(null); + EditorTileMapManager.SetSelectMark(null); //清除选中的波 - EditorManager.SetSelectWaveIndex(-1); + EditorTileMapManager.SetSelectWaveIndex(-1); //清除选中的预设 - EditorManager.SetSelectPreinstallIndex(-1); + EditorTileMapManager.SetSelectPreinstallIndex(-1); } //点击播放按钮 @@ -65,13 +68,13 @@ //有错误数据 if (check.HasError) { - EditorWindowManager.ShowTips("提示", EditorManager.GetRoomErrorTypeMessage(check.ErrorType) + ",不能运行房间!"); + EditorWindowManager.ShowTips("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",不能运行房间!"); return; } //保存数据 S_TileMap.Instance.TriggerSave(RoomErrorType.None, () => { - var groupName = EditorManager.SelectDungeonGroup.GroupName; + var groupName = EditorTileMapManager.SelectDungeonGroup.GroupName; var result = DungeonManager.CheckDungeon(groupName); if (result.HasError) { @@ -88,11 +91,20 @@ /// /// 加载地牢, 返回是否加载成功 /// - public bool LoadMap(DungeonRoomSplit roomSplit) + public bool LoadMap(DungeonRoomSplit roomSplit, TileSetSplit tileSetSplit) { _title = "正在编辑:" + roomSplit.RoomInfo.RoomName; S_Title.Instance.Text = _title; - var loadMap = S_TileMap.Instance.Load(roomSplit); + + //初始化 TileMap 层 + S_TileMap.Instance.InitLayer(); + //加载层级 + S_MapEditorMapLayer.Instance.InitData(); + //加载MapTile面板 + S_MapEditorMapTile.Instance.InitData(tileSetSplit); + + //加载Tile + var loadMap = S_TileMap.Instance.Load(roomSplit, tileSetSplit); S_MapEditorMapMark.Instance.RefreshPreinstallSelect(); return loadMap; } @@ -126,7 +138,7 @@ //有错误的数据 if (check.HasError) { - EditorWindowManager.ShowConfirm("提示", EditorManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) => + EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) => { if (v) { @@ -155,7 +167,7 @@ var check = CheckError(); if (check.HasError) //有错误 { - EditorWindowManager.ShowConfirm("提示", EditorManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) => + EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) => { if (v) { @@ -193,7 +205,7 @@ var check = CheckError(); if (check.HasError) //有错误 { - EditorWindowManager.ShowConfirm("提示", EditorManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果不解决错误就退出,运行游戏将不会刷出该房间!\n是否仍要退出?", (v) => + EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果不解决错误就退出,运行游戏将不会刷出该房间!\n是否仍要退出?", (v) => { if (v) { @@ -245,7 +257,7 @@ } } - if (EditorManager.SelectRoom.Preinstall == null || EditorManager.SelectRoom.Preinstall.Count == 0) + if (EditorTileMapManager.SelectRoom.Preinstall == null || EditorTileMapManager.SelectRoom.Preinstall.Count == 0) { return new CheckResult(true, RoomErrorType.NoPreinstallError); } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs index 205f45e..47f8b72 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Godot; using Godot.Collections; using UI.MapEditorTools; @@ -33,35 +34,26 @@ Edit, } - /// - /// 自动图块地板层 - /// - public const int AutoFloorLayer = 0; - /// - /// 自定义图块地板层 - /// - public const int CustomFloorLayer = 1; - /// - /// 自动图块中间层 - /// - public const int AutoMiddleLayer = 2; - /// - /// 自定义图块中间层 - /// - public const int CustomMiddleLayer = 3; - /// - /// 自动图块顶层 - /// - public const int AutoTopLayer = 4; - /// - /// 自定义图块顶层 - /// - public const int CustomTopLayer = 5; - /// - /// 标记数据层 - /// - public const int MarkLayer = 10; - + public enum TileMapDrawMode + { + /// + /// 无状态 + /// + None, + /// + /// 自由绘制 + /// + Free, + /// + /// 地形绘制 + /// + Terrain, + /// + /// 组合绘制 + /// + Combination + } + /// /// 所属地图编辑器UI /// @@ -98,8 +90,6 @@ private bool _drawFullRect = false; //负责存储自动图块数据 private InfiniteGrid _autoCellLayerGrid = new InfiniteGrid(); - //用于生成导航网格 - private DungeonTileMap _dungeonTileMap; //停止绘制多久后开始执行生成操作 private float _generateInterval = 3f; //生成自动图块和导航网格的计时器 @@ -110,13 +100,15 @@ private Vector2I _checkTerrainErrorPosition = Vector2I.Zero; //是否执行生成地形成功 private bool _isGenerateTerrain = true; + //导航网格数据 + private Vector2[][] _polygonData; private bool _initLayer = false; //--------- 配置数据 ------------- - private int _sourceId = 0; - private int _terrainSet = 0; - private int _terrain = 0; - private AutoTileConfig _autoTileConfig = new AutoTileConfig(); + private int _mainSource = 0; + private int _mainTerrainSet = 0; + private int _mainTerrain = 0; + private AutoTileConfig _autoTileConfig; /// /// 正在编辑的房间数据 @@ -132,8 +124,59 @@ /// 地图是否有绘制错误 /// public bool HasTerrainError => !_isGenerateTerrain; + + /// + /// 当前选择的图层 + /// + public TileMapLayerData CurrLayer { get; private set; } + + /// + /// 当前正在使用的 TileSetSplit 数据 + /// + public TileSetSplit CurrentTileSet { get; private set; } + + /// + /// 当前正在使用的 Source + /// + public TileSetSourceInfo CurrSource => CurrentTileSet.TileSetInfo.Sources[CurrSourceIndex]; - //变动过的数据 + /// + /// 当前正在使用的 Source 索引 + /// + public int CurrSourceIndex { get; private set; } + + /// + /// 当前笔刷类型 + /// + public TileMapDrawMode CurrBrushType { get; private set; } + + /// + /// 当前笔刷使用的 AtlasCoords,, key: position, value: atlasCoords, 单位: 格 + /// + public System.Collections.Generic.Dictionary CurrBrush { get; } = new System.Collections.Generic.Dictionary(); + + /// + /// 当前地形 + /// + public TerrainData CurrTerrain { get; private set; } + + /// + /// 当前笔刷使用的纹理 + /// + public Texture2D CurrBrushTexture { get; private set; } + + private int _brushStartX = 0; + private int _brushStartY = 0; + //笔刷宽度, 单位: 格 + private int _brushWidth = 0; + //笔刷高度, 单位: 格 + private int _brushHeight = 0; + //笔刷偏移, 单位: 格 + private Vector2I _brushOffset = Vector2I.Zero; + //淡化其它层级 + private bool _desaltOtherLayer = false; + + //--------------------------------------- 变动过的数据 --------------------------------------- /// /// 地图位置, 单位: 格 @@ -147,10 +190,17 @@ /// 当前编辑的门数据 /// public List CurrDoorConfigs { get; } = new List(); + + /// + /// 是否绘制房间中的辅助标记 + /// + public bool IsDrawMark { get; set; } = true; + //------------------------------- private MapEditor.TileMap _editorTileMap; private EventFactory _eventFactory; - + private Vector2I _cacheToolSizeData; + public void SetUiNode(IUiNode uiNode) { _editorTileMap = (MapEditor.TileMap)uiNode; @@ -164,9 +214,13 @@ _eventFactory.AddEventListener(EventEnum.OnSelectRectTool, OnSelectRectTool); _eventFactory.AddEventListener(EventEnum.OnSelectEditTool, OnSelectEditTool); _eventFactory.AddEventListener(EventEnum.OnClickCenterTool, OnClickCenterTool); - _eventFactory.AddEventListener(EventEnum.OnEditorDirty, OnEditorDirty); + _eventFactory.AddEventListener(EventEnum.OnTileMapDirty, OnEditorDirty); RenderingServer.FramePostDraw += OnFramePostDraw; + var navigationRegion = _editorTileMap.L_NavigationRegion.Instance; + navigationRegion.Visible = false; + navigationRegion.NavigationPolygon.AgentRadius = GameConfig.NavigationAgentRadius; + navigationRegion.BakeFinished += OnBakeFinished; } public void OnDestroy() @@ -174,27 +228,31 @@ _eventFactory.RemoveAllEventListener(); RenderingServer.FramePostDraw -= OnFramePostDraw; } - - public override void _Ready() - { - InitLayer(); - } public override void _Process(double delta) { + if (!_initLayer) + { + return; + } //触发绘制辅助线 _editorTileMap.L_Brush.Instance.QueueRedraw(); var newDelta = (float)delta; _drawFullRect = false; var position = GetLocalMousePosition(); + //绘制2x2地形 + if (CurrBrushType == TileMapDrawMode.Terrain && CurrTerrain != null && CurrTerrain.TerrainInfo.TerrainType == 1 && !_isRightPressed) + { + position -= new Vector2(GameConfig.TileCellSize / 2f, GameConfig.TileCellSize / 2f); + } _mouseCellPosition = LocalToMap(position); _mousePosition = new Vector2( _mouseCellPosition.X * GameConfig.TileCellSize, _mouseCellPosition.Y * GameConfig.TileCellSize ); - if (!MapEditorToolsPanel.S_HBoxContainer.Instance.IsPositionOver(GetGlobalMousePosition())) //不在Ui节点上 + if (!MapEditorToolsPanel.S_HBoxContainer.Instance.IsMouseInRect()) //不在Ui节点上 { //左键绘制 if (_isLeftPressed) @@ -205,8 +263,8 @@ { _changeFlag = true; _prevMouseCellPosition = _mouseCellPosition; - //绘制自动图块 - SetSingleAutoCell(_mouseCellPosition); + //绘制图块 + SetSingleCell(_mouseCellPosition); } } else if (MouseType == MouseButtonType.Area) //绘制区域 @@ -226,7 +284,7 @@ { _changeFlag = true; _prevMouseCellPosition = _mouseCellPosition; - EraseSingleAutoCell(_mouseCellPosition); + EraseSingleCell(_mouseCellPosition); } } else if (MouseType == MouseButtonType.Area) //绘制区域 @@ -269,26 +327,32 @@ //轴线 canvasItem.DrawLine(new Vector2(0, 2000), new Vector2(0, -2000), Colors.Green); canvasItem.DrawLine(new Vector2(2000, 0), new Vector2( -2000, 0), Colors.Red); - - //绘制房间区域 - if (CurrRoomSize.X != 0 && CurrRoomSize.Y != 0) + + if (IsDrawMark) { - var size = TileSet.TileSize; - canvasItem.DrawRect(new Rect2(CurrRoomPosition * size, CurrRoomSize * size), - Colors.Aqua, false, 5f / Scale.X); - } - - if (_checkTerrainFlag) //已经通过地形检测 - { - //绘制导航网格 - var result = _dungeonTileMap.GetGenerateNavigationResult(); - if (result != null && result.Success) + //绘制房间区域 + if (CurrRoomSize.X != 0 && CurrRoomSize.Y != 0) { - var polygonData = _dungeonTileMap.GetPolygonData(); - Utils.DrawNavigationPolygon(canvasItem, polygonData, 3f / Scale.X); + canvasItem.DrawRect( + new Rect2( + (CurrRoomPosition + new Vector2I(1, 2)) * GameConfig.TileCellSize, + (CurrRoomSize - new Vector2I(2, 3)) * GameConfig.TileCellSize + ), + Colors.Aqua, false, 5f / Scale.X + ); + } + + //绘制导航网格 + if (_checkTerrainFlag && _isGenerateTerrain && _polygonData != null) + { + foreach (var vector2s in _polygonData) + { + canvasItem.DrawPolygon(vector2s, new Color(0,1,1, 0.3f).MakeArray(vector2s.Length)); + } } } + //绘制笔刷 if (MouseType == MouseButtonType.Pen || MouseType == MouseButtonType.Area) { if (_drawFullRect) //绘制填充矩形 @@ -307,16 +371,107 @@ temp.Y -= size.Y; } - var pos = cellPos * size; - canvasItem.DrawRect(new Rect2(pos, _mousePosition - pos + temp), Colors.White, false, 2f / Scale.X); + var p = cellPos * size; + var s = _mousePosition.AsVector2I() - p + temp; + + if (s.X < 0) + { + p.X += s.X; + s.X *= -1; + } + + if (s.Y < 0) + { + p.Y += s.Y; + s.Y *= -1; + } + + //绘制边框 + canvasItem.DrawRect(new Rect2(p, s), Colors.White, false, 2f / Scale.X); + + if (CurrLayer.Layer != MapLayer.AutoFloorLayer && (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination)) //自由绘制 或者 绘制组合 + { + if (_isLeftPressed && _brushWidth > 0 && _brushHeight > 0) //左键绘制 + { + var w = s.X / GameConfig.TileCellSize; + var h = s.Y / GameConfig.TileCellSize; + for (var i = 0; i < w; i++) + { + for (var j = 0; j < h; j++) + { + var x = i % _brushWidth + _brushStartX; + var y = j % _brushHeight + _brushStartY; + if (CurrBrush.TryGetValue(new Vector2I(x, y), out var v)) + { + var rect = new Rect2(p + (new Vector2I(i, j)) * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); + var srcRect = new Rect2(v * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); + canvasItem.DrawTextureRectRegion(CurrBrushTexture, rect, srcRect, new Color(1, 1, 1, 0.3f)); + } + } + } + } + } } else //绘制单格 { - canvasItem.DrawRect(new Rect2(_mousePosition, TileSet.TileSize), Colors.White, false, 2f / Scale.X); + if (CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层 + { + DrawCellOutline(canvasItem); + } + else //自定义层 + { + if (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination) //自由绘制 或者 绘制组合 + { + if (_isRightPressed) //按下了左键擦除 + { + DrawCellOutline(canvasItem); + } + else //正常绘制 + { + foreach (var item in CurrBrush) + { + var rect = new Rect2(_mousePosition + (item.Key + _brushOffset) * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); + var srcRect = new Rect2(item.Value * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); + canvasItem.DrawTextureRectRegion(CurrBrushTexture, rect, srcRect, new Color(1, 1, 1, 0.3f)); + } + } + } + else if (CurrBrushType == TileMapDrawMode.Terrain) //绘制地形 + { + if (CurrTerrain == null) //未选择地形 + { + DrawCellOutline(canvasItem); + } + else if (CurrTerrain.TerrainInfo.TerrainType == 0) //3x3 + { + DrawCellOutline(canvasItem); + } + else //2x2 + { + DrawCellOutline(canvasItem); + if (!_isRightPressed) //没按下左键擦除 + { + DrawCellOutline(canvasItem, new Vector2I(GameConfig.TileCellSize, 0)); + DrawCellOutline(canvasItem, new Vector2I(0, GameConfig.TileCellSize)); + DrawCellOutline(canvasItem, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize)); + } + } + } + } } } } + private void DrawCellOutline(CanvasItem canvasItem) + { + canvasItem.DrawRect(new Rect2(_mousePosition, TileSet.TileSize), Colors.White, false, 2f / Scale.X); + } + + private void DrawCellOutline(CanvasItem canvasItem, Vector2I offset) + { + canvasItem.DrawRect(new Rect2(_mousePosition + offset, TileSet.TileSize), Colors.White, false, 2f / Scale.X); + } + public override void _Input(InputEvent @event) { if (@event is InputEventMouseButton mouseButton) @@ -333,7 +488,7 @@ _changeFlag = false; if (_drawFullRect) //松开, 提交绘制的矩形区域 { - SetRectAutoCell(_mouseStartCellPosition, _mouseCellPosition); + SetRectCell(_mouseStartCellPosition, _mouseCellPosition); _drawFullRect = false; } } @@ -352,7 +507,7 @@ _changeFlag = false; if (_drawFullRect) //松开, 提交擦除的矩形区域 { - EraseRectAutoCell(_mouseStartCellPosition, _mouseCellPosition); + EraseRectCell(_mouseStartCellPosition, _mouseCellPosition); _drawFullRect = false; } } @@ -381,6 +536,104 @@ } /// + /// 设置选择的layer + /// + public void SetCurrLayer(TileMapLayerData layerData) + { + CurrLayer = layerData; + EventManager.EmitEvent(EventEnum.OnSelectTileLayer, layerData.Layer); + SetLayerModulate(MapLayer.AutoFloorLayer, GetEditorLayerModulate(MapLayer.AutoFloorLayer)); + SetLayerModulate(MapLayer.AutoMiddleLayer, GetEditorLayerModulate(MapLayer.AutoMiddleLayer)); + SetLayerModulate(MapLayer.AutoTopLayer, GetEditorLayerModulate(MapLayer.AutoTopLayer)); + SetLayerModulate(MapLayer.CustomFloorLayer1, GetEditorLayerModulate(MapLayer.CustomFloorLayer1)); + SetLayerModulate(MapLayer.CustomFloorLayer2, GetEditorLayerModulate(MapLayer.CustomFloorLayer2)); + SetLayerModulate(MapLayer.CustomFloorLayer3, GetEditorLayerModulate(MapLayer.CustomFloorLayer3)); + SetLayerModulate(MapLayer.CustomMiddleLayer1, GetEditorLayerModulate(MapLayer.CustomMiddleLayer1)); + SetLayerModulate(MapLayer.CustomMiddleLayer2, GetEditorLayerModulate(MapLayer.CustomMiddleLayer2)); + SetLayerModulate(MapLayer.CustomTopLayer, GetEditorLayerModulate(MapLayer.CustomTopLayer)); + } + + /// + /// 设置选中的 Source 索引 + /// + public void SetCurrSourceIndex(int index) + { + CurrSourceIndex = index; + } + + /// + /// 设置当前笔刷类型 + /// + public void SetCurrBrushType(TileMapDrawMode mode) + { + CurrBrushType = mode; + } + + /// + /// 添加笔刷绘制的数据, 单位: 格 + /// + public void AddCurrBrushAtlasCoords(Vector2I pos, Vector2I atlasCoords) + { + if (!CurrBrush.ContainsKey(pos)) + { + CurrBrush.Add(pos, atlasCoords); + var xStart = int.MaxValue; + var xEnd = int.MinValue; + var yStart = int.MaxValue; + var yEnd = int.MinValue; + + //计算起始点和终点 + foreach (var kv in CurrBrush) + { + var cell = kv.Key; + xStart = Mathf.Min(cell.X, xStart); + yStart = Mathf.Min(cell.Y, yStart); + xEnd = Mathf.Max(cell.X, xEnd); + yEnd = Mathf.Max(cell.Y, yEnd); + } + + _brushStartX = xStart; + _brushStartY = yStart; + _brushWidth = xEnd - xStart + 1; + _brushHeight = yEnd - yStart + 1; + _brushOffset = new Vector2I(-(xStart + (xEnd - xStart) / 2), -(yStart + (yEnd - yStart) / 2)); + } + } + + /// + /// 移除笔刷绘制的数据, 单位: 格 + /// + public void RemoveCurrBrushAtlasCoords(Vector2I pos) + { + CurrBrush.Remove(pos); + } + + /// + /// 清除笔刷 + /// + public void ClearCurrBrushAtlasCoords() + { + CurrBrush.Clear(); + } + + /// + /// 设置笔刷使用的纹理 + /// + public void SetCurrBrushTexture(Texture2D texture) + { + CurrBrushTexture = texture; + } + + /// + /// 设置选中某个图层时是否淡化其他图层 + /// + public void SetDesaltOtherLayer(bool flag) + { + _desaltOtherLayer = flag; + SetCurrLayer(CurrLayer); + } + + /// /// 尝试运行检查, 如果已经运行过了, 则没有效果 /// public void TryRunCheckHandler() @@ -391,6 +644,15 @@ RunCheckHandler(); } } + + /// + /// 设置当前地形 + /// + public void SetCurrTerrain(TerrainData terrainData) + { + CurrBrushType = TileMapDrawMode.Terrain; + CurrTerrain = terrainData; + } //执行检测地形操作 private void RunCheckHandler() @@ -401,13 +663,12 @@ Debug.Log("开始检测是否可以生成地形..."); if (CheckTerrain()) { - Debug.Log("开始绘制导航网格..."); - if (GenerateNavigation()) - { - Debug.Log("开始绘制自动贴图..."); - GenerateTerrain(); - _isGenerateTerrain = true; - } + Debug.Log("开始绘制自动贴图..."); + var rect = TileMapUtils.GenerateTerrain(this, _editorTileMap.L_NavigationRegion.Instance, _autoTileConfig); + CurrRoomPosition = rect.Position; + SetMapSize(rect.Size, true); + //GenerateTerrain(); + _isGenerateTerrain = true; } else { @@ -415,33 +676,71 @@ } } - //将指定层数据存入list中 - private void PushLayerDataToList(int layer, int sourceId, List list) + //将指定自动地形层数据存入list中 + private void PushAutoLayerDataToList(int layer, List list) { + const int sourceId = 0; //这里指定0是因为 Main Source 的 id 为 0 var layerArray = GetUsedCellsById(layer, sourceId); foreach (var pos in layerArray) { var atlasCoords = GetCellAtlasCoords(layer, pos); + var tileCellData = _autoTileConfig.GetCellData(atlasCoords); + if (tileCellData != null) + { + list.Add(pos.X); + list.Add(pos.Y); + list.Add((int)tileCellData.TerrainPeering); + list.Add(tileCellData.TerrainType); + } + } + } + + //将指定层数据存入list中 + private void PushLayerDataToList(int layer, List list) + { + var layerArray = GetUsedCellsById(layer); + foreach (var pos in layerArray) + { + var atlasCoords = GetCellAtlasCoords(layer, pos); list.Add(pos.X); list.Add(pos.Y); - list.Add(_sourceId); + list.Add(GetCellSourceId(layer, pos)); list.Add(atlasCoords.X); list.Add(atlasCoords.Y); } } - private void SetLayerDataFromList(int layer, List list) + //设置自动地形层的数据 + private void SetAutoLayerDataFromList(int layer, List list) { + var terrainInfo = _autoTileConfig.TerrainInfo; + var sourceId = _autoTileConfig.SourceId; + for (var i = 0; i < list.Count; i += 4) + { + var pos = new Vector2I(list[i], list[i + 1]); + var bit = (uint)list[i + 2]; + var type = (byte)list[i + 3]; + var index = terrainInfo.TerrainBitToIndex(bit, type); + var terrainCell = terrainInfo.GetTerrainCell(index, type); + var atlasCoords = terrainInfo.GetPosition(terrainCell); + SetCell(layer, pos, sourceId, atlasCoords); + if (layer == MapLayer.AutoFloorLayer) + { + _autoCellLayerGrid.Set(pos, true); + } + } + } + + //设置自定义层的数据 + private void SetCustomLayerDataFromList(int layer, List list) + { + //五个一组 for (var i = 0; i < list.Count; i += 5) { var pos = new Vector2I(list[i], list[i + 1]); var sourceId = list[i + 2]; var atlasCoords = new Vector2I(list[i + 3], list[i + 4]); SetCell(layer, pos, sourceId, atlasCoords); - if (layer == AutoFloorLayer) - { - _autoCellLayerGrid.Set(pos, true); - } } } @@ -462,7 +761,7 @@ IsDirty = false; MapEditorPanel.SetTitleDirty(false); //派发保存事件 - EventManager.EmitEvent(EventEnum.OnEditorSave); + EventManager.EmitEvent(EventEnum.OnTileMapSave); if (finish != null) { finish(); @@ -473,8 +772,10 @@ /// /// 加载地牢, 返回是否加载成功 /// - public bool Load(DungeonRoomSplit roomSplit) + public bool Load(DungeonRoomSplit roomSplit, TileSetSplit tileSetSplit) { + InitTileSet(tileSetSplit); + //重新加载数据 roomSplit.ReloadRoomInfo(); roomSplit.ReloadTileInfo(); @@ -491,26 +792,15 @@ { CurrDoorConfigs.Add(doorAreaInfo.Clone()); } - - //初始化层级数据 - InitLayer(); - //地块数据 - SetLayerDataFromList(AutoFloorLayer, tileInfo.Floor); - SetLayerDataFromList(AutoMiddleLayer, tileInfo.Middle); - SetLayerDataFromList(AutoTopLayer, tileInfo.Top); - - //导航网格数据 - _dungeonTileMap.SetPolygonData(tileInfo.NavigationList); - - //如果有图块错误, 则找出错误的点位 - if (roomSplit.ErrorType == RoomErrorType.TileError) - { - RunCheckHandler(); - } - //聚焦 - //MapEditorPanel.CallDelay(0.1f, OnClickCenterTool); - //CallDeferred(nameof(OnClickCenterTool), null); + //读取地块数据 + SetAutoLayerDataFromList(MapLayer.AutoFloorLayer, tileInfo.Floor); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer1, tileInfo.CustomFloor1); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer2, tileInfo.CustomFloor2); + SetCustomLayerDataFromList(MapLayer.CustomFloorLayer3, tileInfo.CustomFloor3); + SetCustomLayerDataFromList(MapLayer.CustomMiddleLayer1, tileInfo.CustomMiddle1); + SetCustomLayerDataFromList(MapLayer.CustomMiddleLayer2, tileInfo.CustomMiddle2); + SetCustomLayerDataFromList(MapLayer.CustomTopLayer, tileInfo.CustomTop); //加载门编辑区域 foreach (var doorAreaInfo in CurrDoorConfigs) @@ -518,12 +808,32 @@ MapEditorToolsPanel.CreateDoorTool(doorAreaInfo); } - //聚焦 - OnClickCenterTool(null); + //执行生成墙壁和导航网格 + RunCheckHandler(); + + //聚焦 (需要延时一帧调用) + this.CallDelayInNode(0, () => OnClickCenterTool(null)); return true; } + + /// + /// 初始化图块集。 + /// + /// 要初始化的图块集 + private void InitTileSet(TileSetSplit tileSetSplit) + { + CurrentTileSet = tileSetSplit; + TileSet = tileSetSplit.GetTileSet(); - private void InitLayer() + // 创建AutoTileConfig对象 + // 使用第一个图块集源作为参数 + _autoTileConfig = new AutoTileConfig(0, tileSetSplit.TileSetInfo.Sources[0].Terrain[0]); + } + + /// + /// 初始化层数据 + /// + public void InitLayer() { if (_initLayer) { @@ -532,19 +842,7 @@ _initLayer = true; //初始化层级数据 - AddLayer(CustomFloorLayer); - SetLayerZIndex(CustomFloorLayer, CustomFloorLayer); - AddLayer(AutoMiddleLayer); - SetLayerZIndex(AutoMiddleLayer, AutoMiddleLayer); - AddLayer(CustomMiddleLayer); - SetLayerZIndex(CustomMiddleLayer, CustomMiddleLayer); - AddLayer(AutoTopLayer); - SetLayerZIndex(AutoTopLayer, AutoTopLayer); - AddLayer(CustomTopLayer); - SetLayerZIndex(CustomTopLayer, CustomTopLayer); - - _dungeonTileMap = new DungeonTileMap(this); - _dungeonTileMap.SetFloorAtlasCoords(new List(new []{ _autoTileConfig.Floor.AutoTileCoord })); + MapLayerManager.InitMapLayer(this); } //缩小 @@ -571,22 +869,68 @@ } } - //绘制单个自动贴图 - private void SetSingleAutoCell(Vector2I position) + //绘制单个贴图 + private void SetSingleCell(Vector2I position) { - SetCell(GetFloorLayer(), position, _sourceId, _autoTileConfig.Floor.AutoTileCoord); - if (!_autoCellLayerGrid.Contains(position.X, position.Y)) + if (CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层, 那么不管笔刷类型, 通通使用 Main Source 中的 Main Terrain { - ResetGenerateTimer(); - _autoCellLayerGrid.Set(position.X, position.Y, true); + var tileCellData = _autoTileConfig.Floor; + SetCell(MapLayer.AutoFloorLayer, position, tileCellData.SourceId, tileCellData.AutoTileCoords); + if (!_autoCellLayerGrid.Contains(position.X, position.Y)) + { + ResetGenerateTimer(); + _autoCellLayerGrid.Set(position.X, position.Y, true); + } + } + else //自定义层 + { + var dirty = false; + if (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination) //自由绘制 或者 组合 + { + foreach (var item in CurrBrush) + { + SetCell(CurrLayer.Layer, position + item.Key + _brushOffset, CurrSourceIndex, item.Value); + dirty = true; + } + } + else if (CurrBrushType == TileMapDrawMode.Terrain) //绘制地形 + { + if (CurrTerrain == null || !CurrTerrain.TerrainInfo.Ready) //未选择地形或者存在错误就不绘制了 + { + return; + } + if (CurrTerrain.TerrainInfo.TerrainType == 0) //3x3地形 + { + //绘制自动图块 + SetCellsTerrainConnect(CurrLayer.Layer, new Array() { position }, CurrTerrain.TerrainSetIndex, 0); + dirty = true; + } + else if (CurrTerrain.TerrainInfo.TerrainType == 1) //2x2地形 + { + var arr = new Array() + { + position, + position + new Vector2I(0, 1), + position + new Vector2I(1, 1), + position + new Vector2I(1, 0), + }; + //绘制自动图块 + SetCellsTerrainConnect(CurrLayer.Layer, arr, CurrTerrain.TerrainSetIndex, 0, false); + dirty = true; + } + } + + if (dirty) + { + //标记有修改数据 + EventManager.EmitEvent(EventEnum.OnTileMapDirty); + } } } - //绘制区域自动贴图 - private void SetRectAutoCell(Vector2I start, Vector2I end) + //绘制区域贴图 + private void SetRectCell(Vector2I start, Vector2I end) { - ResetGenerateTimer(); - if (start.X > end.X) { var temp = end.X; @@ -602,32 +946,163 @@ var width = end.X - start.X + 1; var height = end.Y - start.Y + 1; - for (var i = 0; i < width; i++) - { - for (var j = 0; j < height; j++) - { - SetCell(GetFloorLayer(), new Vector2I(start.X + i, start.Y + j), _sourceId, _autoTileConfig.Floor.AutoTileCoord); - } - } - - _autoCellLayerGrid.SetRect(start, new Vector2I(width, height), true); - } - - //擦除单个自动图块 - private void EraseSingleAutoCell(Vector2I position) - { - EraseCell(GetFloorLayer(), position); - if (_autoCellLayerGrid.Remove(position.X, position.Y)) + + if (CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层, 那么不管笔刷类型, 通通使用 Main Source 中的 Main Terrain { ResetGenerateTimer(); + for (var i = 0; i < width; i++) + { + for (var j = 0; j < height; j++) + { + var tileCellData = _autoTileConfig.Floor; + SetCell(MapLayer.AutoFloorLayer, new Vector2I(start.X + i, start.Y + j), tileCellData.SourceId, tileCellData.AutoTileCoords); + } + } + + _autoCellLayerGrid.SetRect(start, new Vector2I(width, height), true); + } + else //自定义层 + { + var dirty = false; + if (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination) //自由绘制 或者 组合 + { + dirty = CurrBrush.Count > 0; + for (var i = 0; i < width; i++) + { + for (var j = 0; j < height; j++) + { + var x = i % _brushWidth + _brushStartX; + var y = j % _brushHeight + _brushStartY; + if (CurrBrush.TryGetValue(new Vector2I(x, y), out var v)) + { + SetCell(CurrLayer.Layer, new Vector2I(start.X + i, start.Y + j), CurrSourceIndex, v); + } + } + } + } + else if (CurrBrushType == TileMapDrawMode.Terrain) //绘制地形 + { + if (CurrTerrain == null || !CurrTerrain.TerrainInfo.Ready) //未选择地形或者存在错误就不绘制了 + { + return; + } + + var arr = new Array(); + for (var i = 0; i < width; i++) + { + for (var j = 0; j < height; j++) + { + arr.Add(new Vector2I(start.X + i, start.Y + j)); + } + } + + if (CurrTerrain.TerrainInfo.TerrainType == 0) //3x3地形 + { + SetCellsTerrainConnect(CurrLayer.Layer, arr, CurrTerrain.TerrainSetIndex, 0); + } + else if (CurrTerrain.TerrainInfo.TerrainType == 1) //2x2地形 + { + SetCellsTerrainConnect(CurrLayer.Layer, arr, CurrTerrain.TerrainSetIndex, 0, false); + } + dirty = true; + } + + if (dirty) + { + //标记有修改数据 + EventManager.EmitEvent(EventEnum.OnTileMapDirty); + } + } + } + + //擦除单个图块 + private void EraseSingleCell(Vector2I position) + { + if (CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层, 那么不管笔刷类型, 通通使用 Main Source 中的 Main Terrain + { + EraseCell(MapLayer.AutoFloorLayer, position); + if (_autoCellLayerGrid.Remove(position.X, position.Y)) + { + ResetGenerateTimer(); + } + } + else //自定义层 + { + if (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination) //自由绘制 或者 组合 + { + EraseCell(CurrLayer.Layer, position); + } + else //绘制地形 + { + if (CurrTerrain == null) //未选择地形 + { + EraseCell(CurrLayer.Layer, position); + } + else if (CurrTerrain.TerrainInfo.TerrainType == 0 || CurrTerrain.TerrainInfo.TerrainType == 1) //2x2地形 / 3x3地形 + { + EraseCell(CurrLayer.Layer, position); + + var arr = new Array(); + //这里需要判断周围8格是否是同terrainSet + if (EqualsTerrainSet(position + new Vector2I(-1, -1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(-1, -1)); + arr.Add(position + new Vector2I(-1, -1)); + } + + if (EqualsTerrainSet(position + new Vector2I(0, -1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(0, -1)); + arr.Add(position + new Vector2I(0, -1)); + } + + if (EqualsTerrainSet(position + new Vector2I(1, -1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(1, -1)); + arr.Add(position + new Vector2I(1, -1)); + } + + if (EqualsTerrainSet(position + new Vector2I(-1, 0))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(-1, 0)); + arr.Add(position + new Vector2I(-1, 0)); + } + + if (EqualsTerrainSet(position + new Vector2I(1, 0))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(1, 0)); + arr.Add(position + new Vector2I(1, 0)); + } + + if (EqualsTerrainSet(position + new Vector2I(-1, 1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(-1, 1)); + arr.Add(position + new Vector2I(-1, 1)); + } + + if (EqualsTerrainSet(position + new Vector2I(0, 1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(0, 1)); + arr.Add(position + new Vector2I(0, 1)); + } + + if (EqualsTerrainSet(position + new Vector2I(1, 1))) + { + EraseCell(CurrLayer.Layer, position + new Vector2I(1, 1)); + arr.Add(position + new Vector2I(1, 1)); + } + + SetCellsTerrainConnect(CurrLayer.Layer, arr, CurrTerrain.TerrainSetIndex, 0, false); + } + } + //标记有修改数据 + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } } - //擦除一个区域内的自动贴图 - private void EraseRectAutoCell(Vector2I start, Vector2I end) + //擦除一个区域内的贴图 + private void EraseRectCell(Vector2I start, Vector2I end) { - ResetGenerateTimer(); - if (start.X > end.X) { var temp = end.X; @@ -643,14 +1118,59 @@ var width = end.X - start.X + 1; var height = end.Y - start.Y + 1; - for (var i = 0; i < width; i++) + + if (CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层 { - for (var j = 0; j < height; j++) + ResetGenerateTimer(); + for (var i = 0; i < width; i++) { - EraseCell(GetFloorLayer(), new Vector2I(start.X + i, start.Y + j)); + for (var j = 0; j < height; j++) + { + EraseCell(MapLayer.AutoFloorLayer, new Vector2I(start.X + i, start.Y + j)); + } } + _autoCellLayerGrid.RemoveRect(start, new Vector2I(width, height)); } - _autoCellLayerGrid.RemoveRect(start, new Vector2I(width, height)); + else //自定义层 + { + if (CurrBrushType == TileMapDrawMode.Free || CurrBrushType == TileMapDrawMode.Combination || + (CurrBrushType == TileMapDrawMode.Terrain && CurrTerrain == null)) //自由绘制 或者 组合 或者 未选择地形 + { + for (var i = 0; i < width; i++) + { + for (var j = 0; j < height; j++) + { + EraseCell(CurrLayer.Layer, new Vector2I(start.X + i, start.Y + j)); + } + } + } + else if (CurrBrushType == TileMapDrawMode.Terrain) //绘制地形 + { + var arr = new Array(); + //需要检测矩形向外一格的Cell + for (var i = -1; i < width + 1; i++) + { + for (var j = -1; j < height + 1; j++) + { + var pos = new Vector2I(start.X + i, start.Y + j); + if (i >= 0 && i < width && j >= 0 && j < height) + { + EraseCell(CurrLayer.Layer, pos); + } + else if (EqualsTerrainSet(pos)) + { + EraseCell(CurrLayer.Layer, pos); + arr.Add(pos); + } + } + } + + SetCellsTerrainConnect(CurrLayer.Layer, arr, CurrTerrain.TerrainSetIndex, 0, false); + } + + //标记有修改数据 + EventManager.EmitEvent(EventEnum.OnTileMapDirty); + } } //重置计时器 @@ -658,141 +1178,43 @@ { _generateTimer = _generateInterval; _isGenerateTerrain = false; - _dungeonTileMap.ClearPolygonData(); - ClearLayer(AutoTopLayer); - ClearLayer(AutoMiddleLayer); + ClearLayer(MapLayer.AutoTopLayer); + ClearLayer(MapLayer.AutoMiddleLayer); + CloseErrorCell(); //标记有修改数据 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } //重新计算房间区域 private void CalcTileRect(bool refreshDoorTrans) { - var rect = GetUsedRect(); - CurrRoomPosition = rect.Position; - SetMapSize(rect.Size, refreshDoorTrans); + var rect = _autoCellLayerGrid.GetRect(); + CurrRoomPosition = rect.Position - new Vector2I(2, 3); + SetMapSize(rect.Size + new Vector2I(4, 5), refreshDoorTrans); + // CurrRoomPosition = rect.Position - new Vector2I(2, 4); + // SetMapSize(rect.Size + new Vector2I(4, 6), refreshDoorTrans); } //检测是否有不合规的图块, 返回true表示图块正常 private bool CheckTerrain() { - var x = CurrRoomPosition.X; - var y = CurrRoomPosition.Y; - var w = CurrRoomSize.X; - var h = CurrRoomSize.Y; - - for (var i = 0; i < w; i++) + _checkTerrainFlag = true; + _autoCellLayerGrid.ForEach((x, y, flag) => { - for (var j = 0; j < h; j++) + if (flag) { - var pos = new Vector2I(x + i, y + j); - if (GetCellSourceId(AutoFloorLayer, pos) == -1) + if (!_autoCellLayerGrid.Contains(x, y + 1) && + (_autoCellLayerGrid.Contains(x, y + 2) || _autoCellLayerGrid.Contains(x, y + 3))) { - //先检测对边是否有地板 - if ((_autoCellLayerGrid.Get(pos.X - 1, pos.Y) && _autoCellLayerGrid.Get(pos.X + 1, pos.Y)) //left & right - || (_autoCellLayerGrid.Get(pos.X, pos.Y + 1) && _autoCellLayerGrid.Get(pos.X, pos.Y - 1))) //top & down - { - _checkTerrainFlag = false; - _checkTerrainErrorPosition = pos; - return false; - } - - //再检测对角是否有地板 - var topLeft = _autoCellLayerGrid.Get(pos.X - 1, pos.Y + 1); //top-left - var downRight = _autoCellLayerGrid.Get(pos.X + 1, pos.Y - 1); //down-right - var downLeft = _autoCellLayerGrid.Get(pos.X - 1, pos.Y - 1); //down-left - var topRight = _autoCellLayerGrid.Get(pos.X + 1, pos.Y + 1); //top-right - if ((topLeft && downRight && !downLeft && !topRight) || (!topLeft && !downRight && downLeft && topRight)) - { - _checkTerrainFlag = false; - _checkTerrainErrorPosition = pos; - return false; - } + _checkTerrainFlag = false; + _checkTerrainErrorPosition = new Vector2I(x, y + 1); + return false; } } - } - _checkTerrainFlag = true; - return true; - } - - //生成自动图块 (地形) - private void GenerateTerrain() - { - ClearLayer(AutoFloorLayer); - - var list = new List(); - _autoCellLayerGrid.ForEach((x, y, data) => - { - if (data) - { - list.Add(new Vector2I(x, y)); - } + return true; }); - var arr = new Array(list); - //绘制自动图块 - SetCellsTerrainConnect(AutoFloorLayer, arr, _terrainSet, _terrain, false); - //计算区域 - CalcTileRect(true); - //将墙壁移动到指定层 - MoveTerrainCell(); - } - - //将自动生成的图块从 AutoFloorLayer 移动到指定图层中 - private void MoveTerrainCell() - { - ClearLayer(AutoTopLayer); - ClearLayer(AutoMiddleLayer); - - var x = CurrRoomPosition.X; - var y = CurrRoomPosition.Y; - var w = CurrRoomSize.X; - var h = CurrRoomSize.Y; - - for (var i = 0; i < w; i++) - { - for (var j = 0; j < h; j++) - { - var pos = new Vector2I(x + i, y + j); - if (!_autoCellLayerGrid.Contains(pos) && GetCellSourceId(AutoFloorLayer, pos) != -1) - { - var atlasCoords = GetCellAtlasCoords(AutoFloorLayer, pos); - var layer = _autoTileConfig.GetLayer(atlasCoords); - if (layer == GameConfig.MiddleMapLayer) - { - layer = AutoMiddleLayer; - } - else if (layer == GameConfig.TopMapLayer) - { - layer = AutoTopLayer; - } - else - { - Debug.LogError($"异常图块: {pos}, 这个图块的图集坐标'{atlasCoords}'不属于'MiddleMapLayer'和'TopMapLayer'!"); - continue; - } - EraseCell(AutoFloorLayer, pos); - SetCell(layer, pos, _sourceId, atlasCoords); - } - } - } - } - - //生成导航网格 - private bool GenerateNavigation() - { - _dungeonTileMap.GenerateNavigationPolygon(AutoFloorLayer); - var result = _dungeonTileMap.GetGenerateNavigationResult(); - if (result.Success) - { - CloseErrorCell(); - } - else - { - SetErrorCell(result.Exception.Point); - } - - return result.Success; + return _checkTerrainFlag; } //设置显示的错误cell, 会标记上红色的闪烁动画 @@ -807,22 +1229,7 @@ { MapEditorPanel.S_ErrorCellAnimationPlayer.Instance.Stop(); } - - private int GetFloorLayer() - { - return AutoFloorLayer; - } - - private int GetMiddleLayer() - { - return AutoMiddleLayer; - } - - private int GetTopLayer() - { - return AutoTopLayer; - } - + /// /// 选中拖拽功能 /// @@ -867,7 +1274,9 @@ } else //聚焦地图中心点 { - SetMapPosition(pos - (CurrRoomPosition + CurrRoomSize / 2) * TileSet.TileSize * Scale); + var roomPos = new Vector2(CurrRoomPosition.X, CurrRoomPosition.Y - 1); + var roomSize = new Vector2(CurrRoomSize.X, CurrRoomSize.Y + 1); + SetMapPosition(pos - (roomPos + roomSize / 2) * TileSet.TileSize * Scale); } } @@ -982,15 +1391,42 @@ { //存入本地 var tileInfo = CurrRoomSplit.TileInfo; - tileInfo.NavigationList.Clear(); - tileInfo.NavigationList.AddRange(_dungeonTileMap.GetPolygonData()); + if (tileInfo.NavigationPolygon == null) + { + tileInfo.NavigationPolygon = new List(); + } + else + { + tileInfo.NavigationPolygon.Clear(); + } + if (tileInfo.NavigationVertices == null) + { + tileInfo.NavigationVertices = new List(); + } + else + { + tileInfo.NavigationVertices.Clear(); + } + var polygon = _editorTileMap.L_NavigationRegion.Instance.NavigationPolygon; + tileInfo.NavigationPolygon.AddRange(polygon.Polygons); + tileInfo.NavigationVertices.AddRange(polygon.Vertices.Select(v => new SerializeVector2(v))); tileInfo.Floor.Clear(); - tileInfo.Middle.Clear(); - tileInfo.Top.Clear(); + tileInfo.CustomFloor1.Clear(); + tileInfo.CustomFloor2.Clear(); + tileInfo.CustomFloor3.Clear(); + tileInfo.CustomMiddle1.Clear(); + tileInfo.CustomMiddle2.Clear(); + tileInfo.CustomTop.Clear(); - PushLayerDataToList(AutoFloorLayer, _sourceId, tileInfo.Floor); - PushLayerDataToList(AutoMiddleLayer, _sourceId, tileInfo.Middle); - PushLayerDataToList(AutoTopLayer, _sourceId, tileInfo.Top); + //保存图块数据 + PushAutoLayerDataToList(MapLayer.AutoFloorLayer, tileInfo.Floor); + PushLayerDataToList(MapLayer.CustomFloorLayer1, tileInfo.CustomFloor1); + PushLayerDataToList(MapLayer.CustomFloorLayer2, tileInfo.CustomFloor2); + PushLayerDataToList(MapLayer.CustomFloorLayer3, tileInfo.CustomFloor3); + PushLayerDataToList(MapLayer.CustomMiddleLayer1, tileInfo.CustomMiddle1); + PushLayerDataToList(MapLayer.CustomMiddleLayer2, tileInfo.CustomMiddle2); + PushLayerDataToList(MapLayer.CustomTopLayer, tileInfo.CustomTop); + MapProjectManager.SaveRoomTileInfo(CurrRoomSplit); } @@ -1034,14 +1470,11 @@ //设置地图大小 private void SetMapSize(Vector2I size, bool refreshDoorTrans) { - if (CurrRoomSize != size) + CurrRoomSize = size; + if (refreshDoorTrans && _cacheToolSizeData != size) { - CurrRoomSize = size; - - if (refreshDoorTrans) - { - MapEditorToolsPanel.SetDoorHoverToolTransform(CurrRoomPosition, CurrRoomSize); - } + _cacheToolSizeData = size; + MapEditorToolsPanel.SetDoorHoverToolTransform(CurrRoomPosition, CurrRoomSize); } } @@ -1052,9 +1485,12 @@ private Vector2 _tempMapPos; private Vector2 _tempMapScale; private bool _tempAutoFloorLayer; - private bool _tempCustomFloorLayer; + private bool _tempCustomFloorLayer1; + private bool _tempCustomFloorLayer2; + private bool _tempCustomFloorLayer3; private bool _tempAutoMiddleLayer; - private bool _tempCustomMiddleLayer; + private bool _tempCustomMiddleLayer1; + private bool _tempCustomMiddleLayer2; private bool _tempAutoTopLayer; private bool _tempCustomTopLayer; @@ -1090,30 +1526,48 @@ } else //聚焦地图中心点 { - var tempPos = new Vector2(CurrRoomSize.X + 2, CurrRoomSize.Y + 2); - var mapSize = tempPos * TileSet.TileSize; + var tempPos = new Vector2(CurrRoomPosition.X, CurrRoomPosition.Y - 1); + var tempSize = new Vector2(CurrRoomSize.X, CurrRoomSize.Y + 1); + //var tempPos = new Vector2(CurrRoomSize.X + 2, CurrRoomSize.Y + 2); + var mapSize = tempSize * TileSet.TileSize; var axis = Mathf.Max(mapSize.X, mapSize.Y); var targetScale = GameConfig.PreviewImageSize / axis; Scale = new Vector2(targetScale, targetScale); - Position = pos - (CurrRoomPosition + tempPos / 2f - Vector2.One) * TileSet.TileSize * targetScale; + Position = pos - (tempPos + tempSize / 2f) * TileSet.TileSize * targetScale; } //隐藏工具栏 MapEditorToolsPanel.Visible = false; //显示所有层级 - _tempAutoFloorLayer = IsLayerEnabled(AutoFloorLayer); - _tempCustomFloorLayer = IsLayerEnabled(CustomFloorLayer); - _tempAutoMiddleLayer = IsLayerEnabled(AutoMiddleLayer); - _tempCustomMiddleLayer = IsLayerEnabled(CustomMiddleLayer); - _tempAutoTopLayer = IsLayerEnabled(AutoTopLayer); - _tempCustomTopLayer = IsLayerEnabled(CustomTopLayer); + _tempAutoFloorLayer = IsLayerEnabled(MapLayer.AutoFloorLayer); + _tempCustomFloorLayer1 = IsLayerEnabled(MapLayer.CustomFloorLayer1); + _tempCustomFloorLayer2 = IsLayerEnabled(MapLayer.CustomFloorLayer2); + _tempCustomFloorLayer3 = IsLayerEnabled(MapLayer.CustomFloorLayer3); + _tempAutoMiddleLayer = IsLayerEnabled(MapLayer.AutoMiddleLayer); + _tempCustomMiddleLayer1 = IsLayerEnabled(MapLayer.CustomMiddleLayer1); + _tempCustomMiddleLayer2 = IsLayerEnabled(MapLayer.CustomMiddleLayer2); + _tempAutoTopLayer = IsLayerEnabled(MapLayer.AutoTopLayer); + _tempCustomTopLayer = IsLayerEnabled(MapLayer.CustomTopLayer); - SetLayerEnabled(AutoFloorLayer, true); - SetLayerEnabled(CustomFloorLayer, true); - SetLayerEnabled(AutoMiddleLayer, true); - SetLayerEnabled(CustomMiddleLayer, true); - SetLayerEnabled(AutoTopLayer, true); - SetLayerEnabled(CustomTopLayer, true); + SetLayerEnabled(MapLayer.AutoFloorLayer, true); + SetLayerEnabled(MapLayer.CustomFloorLayer1, true); + SetLayerEnabled(MapLayer.CustomFloorLayer2, true); + SetLayerEnabled(MapLayer.CustomFloorLayer3, true); + SetLayerEnabled(MapLayer.AutoMiddleLayer, true); + SetLayerEnabled(MapLayer.CustomMiddleLayer1, true); + SetLayerEnabled(MapLayer.CustomMiddleLayer2, true); + SetLayerEnabled(MapLayer.AutoTopLayer, true); + SetLayerEnabled(MapLayer.CustomTopLayer, true); + + SetLayerModulate(MapLayer.AutoFloorLayer, Colors.White); + SetLayerModulate(MapLayer.CustomFloorLayer1, Colors.White); + SetLayerModulate(MapLayer.CustomFloorLayer2, Colors.White); + SetLayerModulate(MapLayer.CustomFloorLayer3, Colors.White); + SetLayerModulate(MapLayer.AutoMiddleLayer, Colors.White); + SetLayerModulate(MapLayer.CustomMiddleLayer1, Colors.White); + SetLayerModulate(MapLayer.CustomMiddleLayer2, Colors.White); + SetLayerModulate(MapLayer.AutoTopLayer, Colors.White); + SetLayerModulate(MapLayer.CustomTopLayer, Colors.White); } private void OnFramePostDraw() @@ -1132,12 +1586,16 @@ //还原工具栏 MapEditorToolsPanel.Visible = true; //还原层级显示 - SetLayerEnabled(AutoFloorLayer, _tempAutoFloorLayer); - SetLayerEnabled(CustomFloorLayer, _tempCustomFloorLayer); - SetLayerEnabled(AutoMiddleLayer, _tempAutoMiddleLayer); - SetLayerEnabled(CustomMiddleLayer, _tempCustomMiddleLayer); - SetLayerEnabled(AutoTopLayer, _tempAutoTopLayer); - SetLayerEnabled(CustomTopLayer, _tempCustomTopLayer); + SetLayerEnabled(MapLayer.AutoFloorLayer, _tempAutoFloorLayer); + SetLayerEnabled(MapLayer.AutoMiddleLayer, _tempAutoMiddleLayer); + SetLayerEnabled(MapLayer.AutoTopLayer, _tempAutoTopLayer); + SetLayerEnabled(MapLayer.CustomFloorLayer1, _tempCustomFloorLayer1); + SetLayerEnabled(MapLayer.CustomFloorLayer2, _tempCustomFloorLayer2); + SetLayerEnabled(MapLayer.CustomFloorLayer3, _tempCustomFloorLayer3); + SetLayerEnabled(MapLayer.CustomMiddleLayer1, _tempCustomMiddleLayer1); + SetLayerEnabled(MapLayer.CustomMiddleLayer2, _tempCustomMiddleLayer2); + SetLayerEnabled(MapLayer.CustomTopLayer, _tempCustomTopLayer); + SetCurrLayer(CurrLayer); //保存预览图 var subViewport = MapEditorPanel.S_SubViewport.Instance; @@ -1159,4 +1617,46 @@ } } } + + private void OnBakeFinished() + { + var polygonData = _editorTileMap.L_NavigationRegion.Instance.NavigationPolygon; + var polygons = polygonData.Polygons; + var vertices = polygonData.Vertices; + _polygonData = new Vector2[polygons.Count][]; + for (var i = 0; i < polygons.Count; i++) + { + var polygon = polygons[i]; + var v2Array = new Vector2[polygon.Length]; + for (var j = 0; j < polygon.Length; j++) + { + v2Array[j] = vertices[polygon[j]]; + } + _polygonData[i] = v2Array; + } + } + + private Color GetEditorLayerModulate(int layer) + { + if (!_desaltOtherLayer) + { + return Colors.White; + } + + return layer == CurrLayer.Layer ? Colors.White : new Color(1, 1, 1, 0.25f); + } + + private bool EqualsTerrainSet(Vector2I position) + { + if (GetCellSourceId(CurrLayer.Layer, position) == CurrSourceIndex) + { + var cellTileData = GetCellTileData(CurrLayer.Layer, position); + if (cellTileData != null && cellTileData.TerrainSet == CurrTerrain.TerrainSetIndex) + { + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroup.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroup.cs deleted file mode 100644 index 18be6a5..0000000 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroup.cs +++ /dev/null @@ -1,234 +0,0 @@ -namespace UI.MapEditorCreateGroup; - -/// -/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 -/// -public abstract partial class MapEditorCreateGroup : UiBase -{ - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer - /// - public MarginContainer L_MarginContainer - { - get - { - if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer(this, GetNodeOrNull("MarginContainer")); - return _L_MarginContainer; - } - } - private MarginContainer _L_MarginContainer; - - - public MapEditorCreateGroup() : base(nameof(MapEditorCreateGroup)) - { - } - - public sealed override void OnInitNestedUi() - { - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer.GroupNameLabel - /// - public class GroupNameLabel : UiNode - { - public GroupNameLabel(MapEditorCreateGroup uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override GroupNameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer.GroupNameInput - /// - public class GroupNameInput : UiNode - { - public GroupNameInput(MapEditorCreateGroup uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } - public override GroupNameInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer - /// - public class HBoxContainer : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.GroupNameLabel - /// - public GroupNameLabel L_GroupNameLabel - { - get - { - if (_L_GroupNameLabel == null) _L_GroupNameLabel = new GroupNameLabel(UiPanel, Instance.GetNodeOrNull("GroupNameLabel")); - return _L_GroupNameLabel; - } - } - private GroupNameLabel _L_GroupNameLabel; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.GroupNameInput - /// - public GroupNameInput L_GroupNameInput - { - get - { - if (_L_GroupNameInput == null) _L_GroupNameInput = new GroupNameInput(UiPanel, Instance.GetNodeOrNull("GroupNameInput")); - return _L_GroupNameInput; - } - } - private GroupNameInput _L_GroupNameInput; - - public HBoxContainer(MapEditorCreateGroup uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel - /// - public class RemarkNameLabel : UiNode - { - public RemarkNameLabel(MapEditorCreateGroup uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override RemarkNameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput - /// - public class RemarkInput : UiNode - { - public RemarkInput(MapEditorCreateGroup uiPanel, Godot.TextEdit node) : base(uiPanel, node) { } - public override RemarkInput Clone() => new (UiPanel, (Godot.TextEdit)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5 - /// - public class HBoxContainer5 : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.RemarkNameLabel - /// - public RemarkNameLabel L_RemarkNameLabel - { - get - { - if (_L_RemarkNameLabel == null) _L_RemarkNameLabel = new RemarkNameLabel(UiPanel, Instance.GetNodeOrNull("RemarkNameLabel")); - return _L_RemarkNameLabel; - } - } - private RemarkNameLabel _L_RemarkNameLabel; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.RemarkInput - /// - public RemarkInput L_RemarkInput - { - get - { - if (_L_RemarkInput == null) _L_RemarkInput = new RemarkInput(UiPanel, Instance.GetNodeOrNull("RemarkInput")); - return _L_RemarkInput; - } - } - private RemarkInput _L_RemarkInput; - - public HBoxContainer5(MapEditorCreateGroup uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer.VBoxContainer - /// - public class VBoxContainer : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.HBoxContainer - /// - public HBoxContainer L_HBoxContainer - { - get - { - if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNodeOrNull("HBoxContainer")); - return _L_HBoxContainer; - } - } - private HBoxContainer _L_HBoxContainer; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.HBoxContainer5 - /// - public HBoxContainer5 L_HBoxContainer5 - { - get - { - if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNodeOrNull("HBoxContainer5")); - return _L_HBoxContainer5; - } - } - private HBoxContainer5 _L_HBoxContainer5; - - public VBoxContainer(MapEditorCreateGroup uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } - public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorCreateGroup.MarginContainer - /// - public class MarginContainer : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreateGroup.VBoxContainer - /// - public VBoxContainer L_VBoxContainer - { - get - { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNodeOrNull("VBoxContainer")); - return _L_VBoxContainer; - } - } - private VBoxContainer _L_VBoxContainer; - - public MarginContainer(MapEditorCreateGroup uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } - public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); - } - - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer.GroupNameLabel - /// - public GroupNameLabel S_GroupNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupNameLabel; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer.GroupNameInput - /// - public GroupNameInput S_GroupNameInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupNameInput; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer - /// - public HBoxContainer S_HBoxContainer => L_MarginContainer.L_VBoxContainer.L_HBoxContainer; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkNameLabel - /// - public RemarkNameLabel S_RemarkNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkNameLabel; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5.RemarkInput - /// - public RemarkInput S_RemarkInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5.L_RemarkInput; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer.HBoxContainer5 - /// - public HBoxContainer5 S_HBoxContainer5 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer5; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer.VBoxContainer - /// - public VBoxContainer S_VBoxContainer => L_MarginContainer.L_VBoxContainer; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreateGroup.MarginContainer - /// - public MarginContainer S_MarginContainer => L_MarginContainer; - -} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroupPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroupPanel.cs deleted file mode 100644 index cbc213d..0000000 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateGroup/MapEditorCreateGroupPanel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.IO; -using System.Text.RegularExpressions; -using Godot; - -namespace UI.MapEditorCreateGroup; - -public partial class MapEditorCreateGroupPanel : MapEditorCreateGroup -{ - - /// - /// 填完数据后获取数据对象, 并进行验证, 如果验证失败, 则返回 null - /// - public DungeonRoomGroup GetGroupInfo() - { - //组名 - var groupName = S_GroupNameInput.Instance.Text; - - //检查名称是否合规 - if (string.IsNullOrEmpty(groupName)) - { - EditorWindowManager.ShowTips("错误", "组名称不能为空!"); - return null; - } - - //验证是否有同名组 - var path = MapProjectManager.CustomMapPath + groupName; - var dir = new DirectoryInfo(path); - if (dir.Exists && dir.GetDirectories().Length > 0) - { - EditorWindowManager.ShowTips("错误", $"已经有相同路径的房间了!"); - return null; - } - - var group = new DungeonRoomGroup(); - group.GroupName = groupName; - group.Remark = S_RemarkInput.Instance.Text; - return group; - } -} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMarkPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMarkPanel.cs index 0dce3e9..4b899e9 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMarkPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMarkPanel.cs @@ -78,10 +78,9 @@ S_DelayInput.Instance.Value = data.DelayTime; } - if (_markInfo.SpecialMarkType == SpecialMarkType.BirthPoint) //出生标记 + if (_markInfo.SpecialMarkType != SpecialMarkType.Normal) //特殊标记 { var markInfoItem = new MarkInfoItem(); - markInfoItem.Id = ActivityObject.Ids.Id_role0001; markInfoItem.SpecialMarkType = _markInfo.SpecialMarkType; _grid.Add(markInfoItem); //隐藏选项 @@ -135,6 +134,10 @@ { } + else if (data.SpecialMarkType == SpecialMarkType.OutPoint) //出口标记 + { + + } else //普通标记 { var gridCount = _grid.Count; @@ -203,10 +206,25 @@ //选中物体回调, 创建标记数据 private void OnSelectObject(ExcelConfig.ActivityBase activityObject) { - _grid.Add(new MarkInfoItem() + var markInfoItem = new MarkInfoItem() { Id = activityObject.Id, Weight = 100, - }); + }; + + //初始高度 + if (activityObject.Type == ActivityType.Weapon || activityObject.Type == ActivityType.Prop) + { + markInfoItem.Altitude = 8; + } + else if (activityObject.Type == ActivityType.Other) + { + //随机道具或者随机武器 + if (activityObject.Id == PreinstallMarkManager.RandomWeapon.Id || activityObject.Id == PreinstallMarkManager.RandomProp.Id) + { + markInfoItem.Altitude = 8; + } + } + _grid.Add(markInfoItem); } } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MarkObjectCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MarkObjectCell.cs index b42ac54..5211359 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MarkObjectCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MarkObjectCell.cs @@ -24,34 +24,45 @@ public override void OnSetData(MarkInfoItem data) { - //记得判断随机对象, 后面再做 - _activityObject = ExcelConfig.ActivityBase_Map[data.Id]; - //图标 - if (string.IsNullOrEmpty(_activityObject.Icon)) - { - CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = false; - } - else - { - CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = true; - CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(_activityObject.Icon); - } //物体Id CellNode.L_VBoxContainer.L_HBoxContainer.L_IdLabel.Instance.Text = data.Id; - //物体名称 - CellNode.L_VBoxContainer.L_HBoxContainer.L_NameLabel.Instance.Text = _activityObject.Name; - //物体类型 - CellNode.L_VBoxContainer.L_HBoxContainer.L_TypeLabel.Instance.Text = NameManager.GetActivityTypeName(_activityObject.Type); //权重 CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Value = data.Weight; - if (data.SpecialMarkType == SpecialMarkType.BirthPoint) //出生标记 + if (data.SpecialMarkType != SpecialMarkType.Normal) //特殊标记 { + //物体名称 + CellNode.L_VBoxContainer.L_HBoxContainer.L_NameLabel.Instance.Text = PreinstallMarkManager.GetSpecialName(data.SpecialMarkType); + //物体类型 + CellNode.L_VBoxContainer.L_HBoxContainer.L_TypeLabel.Instance.Text = ActivityId.GetTypeName(ActivityType.Player); + + //图标 + CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = true; + CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_BirthMark_png); + CellNode.L_VBoxContainer.L_HBoxContainer.L_CenterContainer.L_DeleteButton.Instance.Visible = false; CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Visible = false; } else //普通标记 { + //记得判断随机对象, 后面再做 + _activityObject = PreinstallMarkManager.GetMarkConfig(data.Id); + //物体名称 + CellNode.L_VBoxContainer.L_HBoxContainer.L_NameLabel.Instance.Text = _activityObject.Name; + //物体类型 + CellNode.L_VBoxContainer.L_HBoxContainer.L_TypeLabel.Instance.Text = ActivityId.GetTypeName(_activityObject.Type); + + //图标 + if (string.IsNullOrEmpty(_activityObject.Icon)) + { + CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = false; + } + else + { + CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = true; + CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(_activityObject.Icon); + } + // 包含额外属性 if (_expandPanel == null) { @@ -66,8 +77,11 @@ { if (_expandPanel != null) { - _attributeBases.Clear(); - _attributeBases = null; + if (_attributeBases != null) + { + _attributeBases.Clear(); + _attributeBases = null; + } _expandPanel.QueueFree(); _expandPanel = null; _altitude = null; @@ -186,24 +200,13 @@ if (markInfoItem != null) { - if (markInfoItem.Attr == null) - { - //初始高度 - if (activityObject.Type == (int)ActivityType.Weapon || activityObject.Type == (int)ActivityType.Prop) - { - _altitude.L_NumInput.Instance.Value = 8; - } - } - else - { - //海拔高度 - _altitude.L_NumInput.Instance.Value = markInfoItem.Altitude; - //纵轴速度 - _vSpeed.L_NumInput.Instance.Value = markInfoItem.VerticalSpeed; - } + //海拔高度 + _altitude.L_NumInput.Instance.Value = markInfoItem.Altitude; + //纵轴速度 + _vSpeed.L_NumInput.Instance.Value = markInfoItem.VerticalSpeed; } - if (activityObject.Type == (int)ActivityType.Weapon) //武器类型 + if (activityObject.Type == ActivityType.Weapon) //武器类型 { var numberBar = CellNode.UiPanel.CreateNumberBar("CurrAmmon", "弹夹弹药量:"); var numberBar2 = CellNode.UiPanel.CreateNumberBar("ResidueAmmo", "剩余弹药量:"); @@ -243,7 +246,7 @@ } } } - else if (activityObject.Type == (int)ActivityType.Enemy) //敌人 + else if (activityObject.Type == ActivityType.Enemy) //敌人 { var faceBar = CellNode.UiPanel.CreateOptionBar("Face", "脸朝向:"); faceBar.Instance.AddItem("随机", 0); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstall.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstall.cs index 21b973f..11e247b 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstall.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstall.cs @@ -12,7 +12,7 @@ { get { - if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((MapEditorCreatePreinstallPanel)this, GetNodeOrNull("MarginContainer")); + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer((MapEditorCreatePreinstallPanel)this, GetNode("MarginContainer")); return _L_MarginContainer; } } @@ -25,6 +25,7 @@ public sealed override void OnInitNestedUi() { + } /// @@ -57,7 +58,7 @@ { get { - if (_L_PreinstallNameLabel == null) _L_PreinstallNameLabel = new PreinstallNameLabel(UiPanel, Instance.GetNodeOrNull("PreinstallNameLabel")); + if (_L_PreinstallNameLabel == null) _L_PreinstallNameLabel = new PreinstallNameLabel(UiPanel, Instance.GetNode("PreinstallNameLabel")); return _L_PreinstallNameLabel; } } @@ -70,7 +71,7 @@ { get { - if (_L_PreinstallNameInput == null) _L_PreinstallNameInput = new PreinstallNameInput(UiPanel, Instance.GetNodeOrNull("PreinstallNameInput")); + if (_L_PreinstallNameInput == null) _L_PreinstallNameInput = new PreinstallNameInput(UiPanel, Instance.GetNode("PreinstallNameInput")); return _L_PreinstallNameInput; } } @@ -81,6 +82,59 @@ } /// + /// 类型: , 路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer2.PreinstallNameLabel + /// + public class PreinstallNameLabel_1 : UiNode + { + public PreinstallNameLabel_1(MapEditorCreatePreinstallPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override PreinstallNameLabel_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer2.AutoCheckInput + /// + public class AutoCheckInput : UiNode + { + public AutoCheckInput(MapEditorCreatePreinstallPanel uiPanel, Godot.CheckBox node) : base(uiPanel, node) { } + public override AutoCheckInput Clone() => new (UiPanel, (Godot.CheckBox)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.PreinstallNameLabel + /// + public PreinstallNameLabel_1 L_PreinstallNameLabel + { + get + { + if (_L_PreinstallNameLabel == null) _L_PreinstallNameLabel = new PreinstallNameLabel_1(UiPanel, Instance.GetNode("PreinstallNameLabel")); + return _L_PreinstallNameLabel; + } + } + private PreinstallNameLabel_1 _L_PreinstallNameLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.AutoCheckInput + /// + public AutoCheckInput L_AutoCheckInput + { + get + { + if (_L_AutoCheckInput == null) _L_AutoCheckInput = new AutoCheckInput(UiPanel, Instance.GetNode("AutoCheckInput")); + return _L_AutoCheckInput; + } + } + private AutoCheckInput _L_AutoCheckInput; + + public HBoxContainer2(MapEditorCreatePreinstallPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// /// 类型: , 路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer4.WeightNameLabel /// public class WeightNameLabel : UiNode @@ -110,7 +164,7 @@ { get { - if (_L_WeightNameLabel == null) _L_WeightNameLabel = new WeightNameLabel(UiPanel, Instance.GetNodeOrNull("WeightNameLabel")); + if (_L_WeightNameLabel == null) _L_WeightNameLabel = new WeightNameLabel(UiPanel, Instance.GetNode("WeightNameLabel")); return _L_WeightNameLabel; } } @@ -123,7 +177,7 @@ { get { - if (_L_WeightInput == null) _L_WeightInput = new WeightInput(UiPanel, Instance.GetNodeOrNull("WeightInput")); + if (_L_WeightInput == null) _L_WeightInput = new WeightInput(UiPanel, Instance.GetNode("WeightInput")); return _L_WeightInput; } } @@ -163,7 +217,7 @@ { get { - if (_L_RemarkNameLabel == null) _L_RemarkNameLabel = new RemarkNameLabel(UiPanel, Instance.GetNodeOrNull("RemarkNameLabel")); + if (_L_RemarkNameLabel == null) _L_RemarkNameLabel = new RemarkNameLabel(UiPanel, Instance.GetNode("RemarkNameLabel")); return _L_RemarkNameLabel; } } @@ -176,7 +230,7 @@ { get { - if (_L_RemarkInput == null) _L_RemarkInput = new RemarkInput(UiPanel, Instance.GetNodeOrNull("RemarkInput")); + if (_L_RemarkInput == null) _L_RemarkInput = new RemarkInput(UiPanel, Instance.GetNode("RemarkInput")); return _L_RemarkInput; } } @@ -198,20 +252,33 @@ { get { - if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNodeOrNull("HBoxContainer")); + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); return _L_HBoxContainer; } } private HBoxContainer _L_HBoxContainer; /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.HBoxContainer4 /// public HBoxContainer4 L_HBoxContainer4 { get { - if (_L_HBoxContainer4 == null) _L_HBoxContainer4 = new HBoxContainer4(UiPanel, Instance.GetNodeOrNull("HBoxContainer4")); + if (_L_HBoxContainer4 == null) _L_HBoxContainer4 = new HBoxContainer4(UiPanel, Instance.GetNode("HBoxContainer4")); return _L_HBoxContainer4; } } @@ -224,7 +291,7 @@ { get { - if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNodeOrNull("HBoxContainer5")); + if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNode("HBoxContainer5")); return _L_HBoxContainer5; } } @@ -246,7 +313,7 @@ { get { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNodeOrNull("VBoxContainer")); + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); return _L_VBoxContainer; } } @@ -258,11 +325,6 @@ /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer.PreinstallNameLabel - /// - public PreinstallNameLabel S_PreinstallNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_PreinstallNameLabel; - - /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer.PreinstallNameInput /// public PreinstallNameInput S_PreinstallNameInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_PreinstallNameInput; @@ -273,6 +335,16 @@ public HBoxContainer S_HBoxContainer => L_MarginContainer.L_VBoxContainer.L_HBoxContainer; /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer2.AutoCheckInput + /// + public AutoCheckInput S_AutoCheckInput => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_AutoCheckInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2; + + /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorCreatePreinstall.MarginContainer.VBoxContainer.HBoxContainer4.WeightNameLabel /// public WeightNameLabel S_WeightNameLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer4.L_WeightNameLabel; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstallPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstallPanel.cs index 15ec1ca..d9637ab 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstallPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreatePreinstall/MapEditorCreatePreinstallPanel.cs @@ -25,6 +25,7 @@ InitData(roomType); _roomPreinstallInfo = preinstallInfo; S_PreinstallNameInput.Instance.Text = preinstallInfo.Name; + S_AutoCheckInput.Instance.ButtonPressed = preinstallInfo.AutoFill; S_WeightInput.Instance.Value = preinstallInfo.Weight; S_RemarkInput.Instance.Text = preinstallInfo.Remark; } @@ -52,6 +53,7 @@ return null; } + data.AutoFill = S_AutoCheckInput.Instance.ButtonPressed; data.Remark = S_RemarkInput.Instance.Text; data.Weight = (int)S_WeightInput.Instance.Value; } @@ -73,6 +75,7 @@ return null; } + data.AutoFill = S_AutoCheckInput.Instance.ButtonPressed; data.Remark = S_RemarkInput.Instance.Text; data.Weight = (int)S_WeightInput.Instance.Value; //预加载波 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs index 7ad311a..2b015ec 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs @@ -31,6 +31,7 @@ for (var i = 0; i < roomTypes.Length; i++) { var item = roomTypes[i]; + if (item == DungeonRoomType.None) continue; var text = DungeonManager.DungeonRoomTypeToDescribeString(item); selectButton.AddItem(text, (int)item); } @@ -134,9 +135,7 @@ return null; } - roomInfo.Size = new SerializeVector2(); - roomInfo.Position = new SerializeVector2(); - roomInfo.DoorAreaInfos = new List(); + roomInfo.InitData(); var roomSplit = new DungeonRoomSplit(); roomSplit.ErrorType = RoomErrorType.Empty; @@ -144,10 +143,7 @@ roomSplit.RoomInfo = roomInfo; var tileInfo = new DungeonTileInfo(); - tileInfo.NavigationList = new List(); - tileInfo.Floor = new List(); - tileInfo.Middle = new List(); - tileInfo.Top = new List(); + tileInfo.InitData(); roomSplit.TileInfo = tileInfo; roomSplit.Preinstall = new List(); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/LayerButtonCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/LayerButtonCell.cs index 6f3a4f3..7e4db86 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/LayerButtonCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/LayerButtonCell.cs @@ -2,16 +2,17 @@ namespace UI.MapEditorMapLayer; -public class LayerButtonCell : UiCell +public class LayerButtonCell : UiCell { private bool _visible; public override void OnInit() { CellNode.L_VisibleButton.Instance.Pressed += OnVisibleButtonClick; + CellNode.L_SelectTexture.Instance.Visible = false; } - public override void OnSetData(MapEditorMapLayerPanel.LayerButtonData data) + public override void OnSetData(TileMapLayerData data) { if (data.IsLock) { @@ -26,9 +27,10 @@ var panel = CellNode.UiPanel.ParentUi as MapEditorPanel; if (panel != null) { - if (Data.Layer == EditorTileMap.MarkLayer) //标记层 + if (Data.Layer == MapLayer.MarkLayer) //标记层 { _visible = true; + CellNode.UiPanel.EditorTileMap.IsDrawMark = _visible; } else { @@ -38,24 +40,33 @@ } } - private void OnVisibleButtonClick() + /// + /// 设置层级是否显示 + /// + public void SetLayerVisible(bool visible) { var panel = CellNode.UiPanel.ParentUi as MapEditorPanel; if (panel != null) { - _visible = !_visible; - if (Data.Layer == EditorTileMap.MarkLayer) //隐藏标记层 + _visible = visible; + if (Data.Layer == MapLayer.MarkLayer) //隐藏标记层 { - panel.S_MapEditorTools.Instance.S_ToolRoot.Instance.Visible = _visible; + CellNode.UiPanel.EditorTileMap.IsDrawMark = visible; + panel.S_MapEditorTools.Instance.S_ToolRoot.Instance.Visible = visible; } else //隐藏地图层级 { - panel.S_TileMap.Instance.SetLayerEnabled(Data.Layer, _visible); + panel.S_TileMap.Instance.SetLayerEnabled(Data.Layer, visible); } - SetVisibleIcon(_visible); + SetVisibleIcon(visible); } } + private void OnVisibleButtonClick() + { + SetLayerVisible(!_visible); + } + private void SetVisibleIcon(bool visible) { if (visible) @@ -67,4 +78,20 @@ CellNode.L_VisibleButton.Instance.TextureNormal = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Hide_png); } } + + public override void OnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = true; + CellNode.UiPanel.EditorTileMap.SetCurrLayer(Data); + } + + public override void OnUnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } + + public override bool CanSelect() + { + return !Data.IsLock; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayer.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayer.cs index b21b499..dabbdcc 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayer.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayer.cs @@ -12,7 +12,7 @@ { get { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(this, GetNodeOrNull("VBoxContainer")); + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer((MapEditorMapLayerPanel)this, GetNode("VBoxContainer")); return _L_VBoxContainer; } } @@ -25,52 +25,119 @@ public sealed override void OnInitNestedUi() { + } /// - /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.LayerLabel + /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.HBoxContainer.Label /// - public class LayerLabel : UiNode + public class Label : UiNode { - public LayerLabel(MapEditorMapLayer uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override LayerLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label(MapEditorMapLayerPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.HBoxContainer.CheckButton + /// + public class CheckButton : UiNode + { + public CheckButton(MapEditorMapLayerPanel uiPanel, Godot.CheckButton node) : base(uiPanel, node) { } + public override CheckButton Clone() => new (UiPanel, (Godot.CheckButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.CheckButton + /// + public CheckButton L_CheckButton + { + get + { + if (_L_CheckButton == null) _L_CheckButton = new CheckButton(UiPanel, Instance.GetNode("CheckButton")); + return _L_CheckButton; + } + } + private CheckButton _L_CheckButton; + + public HBoxContainer(MapEditorMapLayerPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.LayerButton.SelectTexture + /// + public class SelectTexture : UiNode + { + public SelectTexture(MapEditorMapLayerPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override SelectTexture Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.LayerButton.VisibleButton /// - public class VisibleButton : UiNode + public class VisibleButton : UiNode { - public VisibleButton(MapEditorMapLayer uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public VisibleButton(MapEditorMapLayerPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } public override VisibleButton Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.LayerButton /// - public class LayerButton : UiNode + public class LayerButton : UiNode { /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.SelectTexture + /// + public SelectTexture L_SelectTexture + { + get + { + if (_L_SelectTexture == null) _L_SelectTexture = new SelectTexture(UiPanel, Instance.GetNode("SelectTexture")); + return _L_SelectTexture; + } + } + private SelectTexture _L_SelectTexture; + + /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.VisibleButton /// public VisibleButton L_VisibleButton { get { - if (_L_VisibleButton == null) _L_VisibleButton = new VisibleButton(UiPanel, Instance.GetNodeOrNull("VisibleButton")); + if (_L_VisibleButton == null) _L_VisibleButton = new VisibleButton(UiPanel, Instance.GetNode("VisibleButton")); return _L_VisibleButton; } } private VisibleButton _L_VisibleButton; - public LayerButton(MapEditorMapLayer uiPanel, Godot.Button node) : base(uiPanel, node) { } + public LayerButton(MapEditorMapLayerPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } public override LayerButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorMapLayer.VBoxContainer.ScrollContainer /// - public class ScrollContainer : UiNode + public class ScrollContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.LayerButton @@ -79,33 +146,33 @@ { get { - if (_L_LayerButton == null) _L_LayerButton = new LayerButton(UiPanel, Instance.GetNodeOrNull("LayerButton")); + if (_L_LayerButton == null) _L_LayerButton = new LayerButton(UiPanel, Instance.GetNode("LayerButton")); return _L_LayerButton; } } private LayerButton _L_LayerButton; - public ScrollContainer(MapEditorMapLayer uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public ScrollContainer(MapEditorMapLayerPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorMapLayer.VBoxContainer /// - public class VBoxContainer : UiNode + public class VBoxContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.LayerLabel + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.HBoxContainer /// - public LayerLabel L_LayerLabel + public HBoxContainer L_HBoxContainer { get { - if (_L_LayerLabel == null) _L_LayerLabel = new LayerLabel(UiPanel, Instance.GetNodeOrNull("LayerLabel")); - return _L_LayerLabel; + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; } } - private LayerLabel _L_LayerLabel; + private HBoxContainer _L_HBoxContainer; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapLayer.ScrollContainer @@ -114,21 +181,36 @@ { get { - if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNodeOrNull("ScrollContainer")); + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); return _L_ScrollContainer; } } private ScrollContainer _L_ScrollContainer; - public VBoxContainer(MapEditorMapLayer uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public VBoxContainer(MapEditorMapLayerPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); } /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.LayerLabel + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.HBoxContainer.Label /// - public LayerLabel S_LayerLabel => L_VBoxContainer.L_LayerLabel; + public Label S_Label => L_VBoxContainer.L_HBoxContainer.L_Label; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.HBoxContainer.CheckButton + /// + public CheckButton S_CheckButton => L_VBoxContainer.L_HBoxContainer.L_CheckButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.LayerButton.SelectTexture + /// + public SelectTexture S_SelectTexture => L_VBoxContainer.L_ScrollContainer.L_LayerButton.L_SelectTexture; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapLayer.VBoxContainer.ScrollContainer.LayerButton.VisibleButton diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayerPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayerPanel.cs index ff3448e..3a64492 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayerPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapLayer/MapEditorMapLayerPanel.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Godot; using UI.MapEditor; @@ -5,49 +6,59 @@ public partial class MapEditorMapLayerPanel : MapEditorMapLayer { - public class LayerButtonData - { - /// - /// 显示文本 - /// - public string Title; - /// - /// 是否锁定 - /// - public bool IsLock; - /// - /// Map层级 - /// - public int Layer; - - public LayerButtonData(string title, bool isLock, int layer) - { - Title = title; - IsLock = isLock; - Layer = layer; - } - } + /// + /// 所有地图层级网格 + /// + public UiGrid LayerGrid { get; private set; } - private UiGrid _grid; + /// + /// 编辑器Tile对象 + /// + public EditorTileMap EditorTileMap { get; private set; } public override void OnCreateUi() { - _grid = new UiGrid(S_LayerButton, typeof(LayerButtonCell)); - _grid.SetCellOffset(new Vector2I(0, 2)); - _grid.SetHorizontalExpand(true); - - _grid.Add(new LayerButtonData("地面", false, EditorTileMap.AutoFloorLayer)); - _grid.Add(new LayerButtonData("自定义底层", false, EditorTileMap.CustomFloorLayer)); - _grid.Add(new LayerButtonData("中层自动图块", true, EditorTileMap.AutoMiddleLayer)); - _grid.Add(new LayerButtonData("自定义中层", false, EditorTileMap.CustomMiddleLayer)); - _grid.Add(new LayerButtonData("高层自动图块", true, EditorTileMap.AutoTopLayer)); - _grid.Add(new LayerButtonData("自定义高层", false, EditorTileMap.CustomTopLayer)); - _grid.Add(new LayerButtonData("标记数据层", false, EditorTileMap.MarkLayer)); + var editorPanel = (MapEditorPanel)ParentUi; + EditorTileMap = editorPanel.S_TileMap.Instance; + + LayerGrid = CreateUiGrid(S_LayerButton); + LayerGrid.SetCellOffset(new Vector2I(0, 2)); + LayerGrid.SetHorizontalExpand(true); + + S_CheckButton.Instance.Toggled += OnToggled; } - public override void OnDestroyUi() + /// + /// 初始化层级数据 + /// + public void InitData() { - _grid.Destroy(); + LayerGrid.Add(new TileMapLayerData("地板", MapLayer.AutoFloorLayer, false)); + LayerGrid.Add(new TileMapLayerData("底层1", MapLayer.CustomFloorLayer1, false)); + LayerGrid.Add(new TileMapLayerData("底层2", MapLayer.CustomFloorLayer2, false)); + LayerGrid.Add(new TileMapLayerData("底层3", MapLayer.CustomFloorLayer3, false)); + LayerGrid.Add(new TileMapLayerData("侧方墙壁", MapLayer.AutoMiddleLayer, true)); + LayerGrid.Add(new TileMapLayerData("中层1", MapLayer.CustomMiddleLayer1, false)); + LayerGrid.Add(new TileMapLayerData("中层2", MapLayer.CustomMiddleLayer2, false)); + LayerGrid.Add(new TileMapLayerData("顶部墙壁", MapLayer.AutoTopLayer, true)); + LayerGrid.Add(new TileMapLayerData("顶层", MapLayer.CustomTopLayer, false)); + LayerGrid.Add(new TileMapLayerData("标记数据层", MapLayer.MarkLayer, true)); + LayerGrid.SelectIndex = 0; } + /// + /// 设置指定层级显示或者隐藏 + /// + public void SetLayerVisible(int layer, bool visible) + { + LayerGrid.ForEach(cell => + { + ((LayerButtonCell)cell).SetLayerVisible(visible); + }); + } + + private void OnToggled(bool toggledon) + { + EditorTileMap.SetDesaltOtherLayer(toggledon); + } } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs index 73d6084..ed605f4 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs @@ -32,19 +32,19 @@ str += ","; } - str += ExcelConfig.ActivityBase_Map[markInfoItem.Id].Name; + str += PreinstallMarkManager.GetMarkConfig(markInfoItem.Id).Name; } text += str; } else { - if (data.MarkInfo.SpecialMarkType == SpecialMarkType.BirthPoint) + if (data.MarkInfo.SpecialMarkType != SpecialMarkType.Normal) { - text = "出生标记"; + text = PreinstallMarkManager.GetSpecialName(data.MarkInfo.SpecialMarkType); } else { - text += "空"; + text = "空"; } } @@ -66,10 +66,10 @@ public void OnClickHandler() { - EditorManager.SetSelectWaveIndex(Data.ParentCell.Index); + EditorTileMapManager.SetSelectWaveIndex(Data.ParentCell.Index); CellNode.UiPanel.SetSelectCell(this, CellNode.Instance, MapEditorMapMarkPanel.SelectToolType.Mark); //选中标记 - EditorManager.SetSelectMark(Data.MarkInfo); + EditorTileMapManager.SetSelectMark(Data.MarkInfo); //双击判定 if (_prevClickTime2 >= 0) @@ -99,7 +99,7 @@ { CellNode.L_MarkButton.L_Select.Instance.Visible = true; //选中标记 - EditorManager.SetSelectMark(Data.MarkInfo); + EditorTileMapManager.SetSelectMark(Data.MarkInfo); } public override void OnUnSelect() @@ -109,7 +109,7 @@ public override int OnSort(UiCell other) { - if (!Data.Preloading && other.Data.Preloading) + if (Data.Preloading && other.Data.Preloading) { return 0; } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs index f7f1866..898eccd 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs @@ -90,7 +90,7 @@ EventManager.EmitEvent(EventEnum.OnSetMarkVisible, new MarkInfoVisibleData(markInfo, false)); } //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } /// @@ -159,10 +159,10 @@ public void OnClickHandler() { - EditorManager.SetSelectWaveIndex(Index); + EditorTileMapManager.SetSelectWaveIndex(Index); CellNode.UiPanel.SetSelectCell(this, CellNode.L_WaveContainer.Instance, MapEditorMapMarkPanel.SelectToolType.Wave); //清除选中的标记 - EditorManager.SetSelectMark(null); + EditorTileMapManager.SetSelectMark(null); } public override void OnSelect() diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMark.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMark.cs index 75f5c82..ed20637 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMark.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMark.cs @@ -197,6 +197,37 @@ } /// + /// 类型: , 路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AutoFillTip.Label + /// + public class Label : UiNode + { + public Label(MapEditorMapMarkPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AutoFillTip + /// + public class AutoFillTip : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + public AutoFillTip(MapEditorMapMarkPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override AutoFillTip Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// /// 类型: , 路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AddWaveButton /// public class AddWaveButton : UiNode @@ -484,6 +515,19 @@ public class VBoxContainer_1 : UiNode { /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.AutoFillTip + /// + public AutoFillTip L_AutoFillTip + { + get + { + if (_L_AutoFillTip == null) _L_AutoFillTip = new AutoFillTip(UiPanel, Instance.GetNode("AutoFillTip")); + return _L_AutoFillTip; + } + } + private AutoFillTip _L_AutoFillTip; + + /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.AddWaveButton /// public AddWaveButton L_AddWaveButton @@ -661,6 +705,16 @@ public DynamicTool S_DynamicTool => L_VBoxContainer.L_DynamicTool; /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AutoFillTip.Label + /// + public Label S_Label => L_VBoxContainer.L_ScrollContainer.L_VBoxContainer.L_AutoFillTip.L_Label; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AutoFillTip + /// + public AutoFillTip S_AutoFillTip => L_VBoxContainer.L_ScrollContainer.L_VBoxContainer.L_AutoFillTip; + + /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapMark.VBoxContainer.ScrollContainer.VBoxContainer.AddWaveButton /// public AddWaveButton S_AddWaveButton => L_VBoxContainer.L_ScrollContainer.L_VBoxContainer.L_AddWaveButton; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs index 4bd798e..638b735 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs @@ -62,6 +62,7 @@ //S_DynamicTool.Instance.GetParent().RemoveChild(S_DynamicTool.Instance); S_DynamicTool.Instance.Visible = false; + S_AutoFillTip.Instance.Visible = false; _grid = new UiGrid>(S_WaveItem, typeof(EditorWaveCell)); _grid.SetCellOffset(new Vector2I(0, 10)); @@ -127,7 +128,7 @@ public RoomPreinstallInfo GetSelectPreinstall() { var index = S_PreinstallOption.Instance.Selected; - var preinstall = EditorManager.SelectRoom.Preinstall; + var preinstall = EditorTileMapManager.SelectRoom.Preinstall; if (index >= preinstall.Count) { return null; @@ -140,7 +141,7 @@ /// public void RefreshPreinstallSelect(int index = -1) { - var preinstall = EditorManager.SelectRoom.Preinstall; + var preinstall = EditorTileMapManager.SelectRoom.Preinstall; var optionButton = S_PreinstallOption.Instance; var selectIndex = index < 0 ? (preinstall.Count > 0 ? 0 : -1) : index; optionButton.Clear(); @@ -167,10 +168,10 @@ //清除选中项 RemoveSelectCell(); //记录选中波数 - EditorManager.SetSelectWaveIndex(-1); + EditorTileMapManager.SetSelectWaveIndex(-1); //记录选中的预设 - EditorManager.SetSelectPreinstallIndex((int)index); - var preinstall = EditorManager.SelectRoom.Preinstall; + EditorTileMapManager.SetSelectPreinstallIndex((int)index); + var preinstall = EditorTileMapManager.SelectRoom.Preinstall; if (index >= 0 && index <= preinstall.Count) { _grid.SetDataList(preinstall[(int)index].WaveList.ToArray()); @@ -179,6 +180,8 @@ { _grid.RemoveAll(); } + + RefreshAutoFillTip(); } /// @@ -211,7 +214,7 @@ { var markCell = (EditorMarkCell)uiCell; var markType = markCell.Data.MarkInfo.SpecialMarkType; - if (markType == SpecialMarkType.BirthPoint) //某些特殊标记不能删除 + if (markType != SpecialMarkType.Normal) //特殊标记不能删除 { S_DynamicTool.L_EditButton.Instance.Visible = true; S_DynamicTool.L_DeleteButton.Instance.Visible = false; @@ -266,15 +269,15 @@ /// public void OnAddPreinstall() { - var roomInfoRoomType = EditorManager.SelectRoom.RoomInfo.RoomType; - var roomSplitPreinstall = EditorManager.SelectRoom.Preinstall; + var roomInfoRoomType = EditorTileMapManager.SelectRoom.RoomInfo.RoomType; + var roomSplitPreinstall = EditorTileMapManager.SelectRoom.Preinstall; EditorWindowManager.ShowCreatePreinstall(roomInfoRoomType, roomSplitPreinstall, preinstall => { //创建逻辑 roomSplitPreinstall.Add(preinstall); RefreshPreinstallSelect(roomSplitPreinstall.Count - 1); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); }); } @@ -283,16 +286,17 @@ /// public void OnEditPreinstall() { - var roomInfoRoomType = EditorManager.SelectRoom.RoomInfo.RoomType; - var roomSplitPreinstall = EditorManager.SelectRoom.Preinstall; + var roomInfoRoomType = EditorTileMapManager.SelectRoom.RoomInfo.RoomType; + var roomSplitPreinstall = EditorTileMapManager.SelectRoom.Preinstall; var selectPreinstall = GetSelectPreinstall(); EditorWindowManager.ShowEditPreinstall(roomInfoRoomType, roomSplitPreinstall, selectPreinstall, preinstall => { //修改下拉菜单数据 var optionButton = S_PreinstallOption.Instance; optionButton.SetItemText(optionButton.Selected, $"{preinstall.Name} ({preinstall.Weight})"); + RefreshAutoFillTip(); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); }); } @@ -301,7 +305,7 @@ /// public void OnDeletePreinstall() { - var index = EditorManager.SelectPreinstallIndex; + var index = EditorTileMapManager.SelectPreinstallIndex; if (index < 0) { return; @@ -312,13 +316,13 @@ if (v) { //先把选中项置为-1 - EditorManager.SetSelectPreinstallIndex(-1); + EditorTileMapManager.SetSelectPreinstallIndex(-1); //移除预设数据 - EditorManager.SelectRoom.Preinstall.RemoveAt(index); + EditorTileMapManager.SelectRoom.Preinstall.RemoveAt(index); //刷新选项 - RefreshPreinstallSelect(EditorManager.SelectRoom.Preinstall.Count - 1); + RefreshPreinstallSelect(EditorTileMapManager.SelectRoom.Preinstall.Count - 1); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } }); } @@ -335,7 +339,7 @@ return; } - var preinstall = EditorManager.SelectRoom.Preinstall; + var preinstall = EditorTileMapManager.SelectRoom.Preinstall; if (index >= preinstall.Count) { EditorWindowManager.ShowTips("警告", "未知预设选项!"); @@ -346,7 +350,7 @@ item.WaveList.Add(wave); _grid.Add(wave); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } //工具节点编辑按钮点击 @@ -377,7 +381,7 @@ /// public void OnDeleteWave() { - var index = EditorManager.SelectWaveIndex; + var index = EditorTileMapManager.SelectWaveIndex; if (index < 0) { return; @@ -405,9 +409,9 @@ //移除数据 selectPreinstall.WaveList.RemoveAt(index); _grid.RemoveByIndex(index); - EditorManager.SetSelectWaveIndex(-1); + EditorTileMapManager.SetSelectWaveIndex(-1); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } }); } @@ -431,7 +435,7 @@ markCell.Grid.Sort(); EventManager.EmitEvent(EventEnum.OnEditMark, dataMarkInfo); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); }); } } @@ -443,7 +447,7 @@ { if (SelectCell is EditorMarkCell markCell) { - var index = EditorManager.SelectWaveIndex; + var index = EditorTileMapManager.SelectWaveIndex; if (index < 0) { return; @@ -470,9 +474,20 @@ waveCell.MarkGrid.RemoveByIndex(markCellIndex); waveCell.Data.Remove(markInfo); //派发数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } }); } } + + private void RefreshAutoFillTip() + { + var preinstall = EditorTileMapManager.SelectPreinstall; + if (preinstall != null) + { + S_AutoFillTip.Instance.Visible = preinstall.AutoFill; + return; + } + S_AutoFillTip.Instance.Visible = false; + } } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationCell.cs new file mode 100644 index 0000000..24ef31a --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationCell.cs @@ -0,0 +1,58 @@ +using Godot; + +namespace UI.MapEditorMapTile; + +public class CombinationCell : UiCell +{ + public override void OnInit() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } + + public override void OnSetData(ImportCombinationData data) + { + CellNode.L_CellName.Instance.Text = data.CombinationInfo.Name; + CellNode.L_PreviewImage.Instance.Texture = data.PreviewTexture; + } + + public override void OnDisable() + { + if (Data.PreviewTexture != null) + { + Data.PreviewTexture.Dispose(); + Data.PreviewTexture = null; + } + } + + public override void OnDestroy() + { + if (Data.PreviewTexture != null) + { + Data.PreviewTexture.Dispose(); + Data.PreviewTexture = null; + } + } + + public override void OnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = true; + + //选中组合, 将组合数据设置到笔刷上 + var editorTileMap = CellNode.UiPanel.EditorTileMap; + editorTileMap.ClearCurrBrushAtlasCoords(); + var positions = Data.CombinationInfo.Positions; + var cells = Data.CombinationInfo.Cells; + for (var i = 0; i < cells.Length; i++) + { + editorTileMap.AddCurrBrushAtlasCoords( + positions[i].AsVector2I() / GameConfig.TileCellSize, + cells[i].AsVector2I() / GameConfig.TileCellSize + ); + } + } + + public override void OnUnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationTileTab.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationTileTab.cs new file mode 100644 index 0000000..5daf432 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/CombinationTileTab.cs @@ -0,0 +1,40 @@ +using Godot; + +namespace UI.MapEditorMapTile; + +/// +/// 组合笔刷页签 +/// +public partial class CombinationTileTab : Control, IUiNodeScript +{ + public UiGrid Grid; + private MapEditorMapTile.Tab3 _uiNode; + + public void SetUiNode(IUiNode uiNode) + { + _uiNode = (MapEditorMapTile.Tab3)uiNode; + Grid = _uiNode.UiPanel.CreateUiGrid(_uiNode.L_ScrollContainer.L_CellButton); + Grid.SetCellOffset(new Vector2I(5, 5)); + Grid.SetAutoColumns(true); + Grid.SetHorizontalExpand(true); + } + + public void OnDestroy() + { + + } + + /// + /// 刷新组合数据 + /// + public void RefreshCombination(TileSetSourceInfo sourceInfo) + { + Grid.RemoveAll(); + var src = sourceInfo.GetSourceImage(); + foreach (var combinationInfo in sourceInfo.Combination) + { + var previewImage = ImportCombinationData.GetPreviewTexture(src, combinationInfo.Cells, combinationInfo.Positions); + Grid.Add(new ImportCombinationData(ImageTexture.CreateFromImage(previewImage), combinationInfo)); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs new file mode 100644 index 0000000..8f5fe6b --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using Godot; + +namespace UI.MapEditorMapTile; + +/// +/// 自由笔刷页签 +/// +public partial class FreeTileTab : EditorGridBg +{ + public new MapEditorMapTile.Tab1 UiNode => (MapEditorMapTile.Tab1)base.UiNode; + + private ImageTexture _texture; + private Sprite2D _sprite; + private Control _brush; + + //图像宽度 + private int _width; + //图像高度 + private int _height; + private bool _leftPressed; + private Vector2I _prevPos; + private List _selectCells = new List(); + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + InitNode(UiNode.L_TabRoot.Instance, UiNode.L_Grid.Instance); + _texture = new ImageTexture(); + UiNode.UiPanel.EditorTileMap.SetCurrBrushTexture(_texture); + _sprite = UiNode.L_TabRoot.L_TileSprite.Instance; + _sprite.Texture = _texture; + + _brush = UiNode.L_TabRoot.L_Brush.Instance; + _brush.Draw += OnBrushDraw; + + //聚焦按钮 + UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; + } + + protected override void Dispose(bool disposing) + { + _texture.Dispose(); + } + + public override void _Process(double delta) + { + if (Visible) + { + _brush.QueueRedraw(); + } + } + + public override void _GuiInput(InputEvent @event) + { + base._GuiInput(@event); + + if (@event is InputEventMouseButton mouseButton) + { + if (mouseButton.ButtonIndex == MouseButton.Left) //左键选中 + { + if (UiNode.L_TabRoot.Instance.IsMouseInRect()) + { + _leftPressed = mouseButton.Pressed; + if (_leftPressed) + { + //清理之前的格子 + _selectCells.Clear(); + UiNode.UiPanel.EditorTileMap.ClearCurrBrushAtlasCoords(); + //当前格子 + var atlasCoords = Utils.GetMouseCellPosition(UiNode.L_TabRoot.Instance); + _prevPos = atlasCoords * GameConfig.TileCellSize; + _selectCells.Add(_prevPos); + UiNode.UiPanel.EditorTileMap.AddCurrBrushAtlasCoords(atlasCoords, atlasCoords); + } + } + + } + else if (!_leftPressed && mouseButton.ButtonIndex == MouseButton.Right) //右键擦除 + { + if (UiNode.L_TabRoot.Instance.IsMouseInRect()) + { + var atlasCoords = Utils.GetMouseCellPosition(UiNode.L_TabRoot.Instance); + _selectCells.Remove(atlasCoords * GameConfig.TileCellSize); + UiNode.UiPanel.EditorTileMap.RemoveCurrBrushAtlasCoords(atlasCoords); + } + } + } + else if (_leftPressed && @event is InputEventMouseMotion && UiNode.L_TabRoot.Instance.IsMouseInRect()) + { + //多选格子 + var atlasCoords = Utils.GetMouseCellPosition(UiNode.L_TabRoot.Instance); + var pos = atlasCoords * GameConfig.TileCellSize; + if (pos != _prevPos) + { + _prevPos = pos; + if (!_selectCells.Contains(pos)) + { + _selectCells.Add(pos); + UiNode.UiPanel.EditorTileMap.AddCurrBrushAtlasCoords(atlasCoords, atlasCoords); + } + } + } + } + + /// + /// 设置显示的纹理 + /// + public void SetImage(Image image) + { + //清理之前的格子 + _selectCells.Clear(); + UiNode.UiPanel.EditorTileMap.ClearCurrBrushAtlasCoords(); + + _texture.SetImage(image); + var texture = UiNode.L_TabRoot.L_TileSprite.Instance.Texture; + if (texture != null) + { + _width = texture.GetWidth(); + _height = texture.GetHeight(); + } + else + { + _width = 0; + _height = 0; + } + var root = UiNode.L_TabRoot.Instance; + root.Size = new Vector2(_width, _height); + } + + /// + /// 聚焦 + /// + public void OnFocusClick() + { + Utils.DoFocusNode(ContainerRoot, Size, new Vector2(_width, _height)); + RefreshGridTrans(); + } + + //绘制辅助线 + private void OnBrushDraw() + { + var root = UiNode.L_TabRoot.Instance; + //绘制区域 + _brush.DrawRect( + new Rect2(Vector2.Zero, new Vector2(_width, _height)), new Color(1, 1, 0, 0.5f), false, + 2f / root.Scale.X + ); + + //绘制悬停的区域 + if (root.IsMouseInRect()) + { + var position = Utils.GetMouseCellPosition(root) * GameConfig.TileCellSize; + _brush.DrawRect( + new Rect2(position, GameConfig.TileCellSizeVector2I), + Colors.Green, false, 3f / root.Scale.X + ); + } + + //绘制选中的格子 + foreach (var cell in _selectCells) + { + _brush.DrawRect( + new Rect2(cell, GameConfig.TileCellSizeVector2I), + Colors.White, false, 2f / root.Scale.X + ); + _brush.DrawRect( + new Rect2(cell, GameConfig.TileCellSizeVector2I), + new Color(0, 1, 0, 0.1f), true + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTile.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTile.cs new file mode 100644 index 0000000..c538a1e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTile.cs @@ -0,0 +1,807 @@ +namespace UI.MapEditorMapTile; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class MapEditorMapTile : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer((MapEditorMapTilePanel)this, GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.MaskBg + /// + public MaskBg L_MaskBg + { + get + { + if (_L_MaskBg == null) _L_MaskBg = new MaskBg((MapEditorMapTilePanel)this, GetNode("MaskBg")); + return _L_MaskBg; + } + } + private MaskBg _L_MaskBg; + + + public MapEditorMapTile() : base(nameof(MapEditorMapTile)) + { + } + + public sealed override void OnInitNestedUi() + { + _ = L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1; + _ = L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2; + _ = L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3; + + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer.Label + /// + public class Label : UiNode + { + public Label(MapEditorMapTilePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer.SourceOption + /// + public class SourceOption : UiNode + { + public SourceOption(MapEditorMapTilePanel uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } + public override SourceOption Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.SourceOption + /// + public SourceOption L_SourceOption + { + get + { + if (_L_SourceOption == null) _L_SourceOption = new SourceOption(UiPanel, Instance.GetNode("SourceOption")); + return _L_SourceOption; + } + } + private SourceOption _L_SourceOption; + + public HBoxContainer(MapEditorMapTilePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer2.Label + /// + public class Label_1 : UiNode + { + public Label_1(MapEditorMapTilePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer2.HandleOption + /// + public class HandleOption : UiNode + { + public HandleOption(MapEditorMapTilePanel uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } + public override HandleOption Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Label + /// + public Label_1 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_1(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_1 _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.HandleOption + /// + public HandleOption L_HandleOption + { + get + { + if (_L_HandleOption == null) _L_HandleOption = new HandleOption(UiPanel, Instance.GetNode("HandleOption")); + return _L_HandleOption; + } + } + private HandleOption _L_HandleOption; + + public HBoxContainer2(MapEditorMapTilePanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot.TileSprite + /// + public class TileSprite : UiNode + { + public TileSprite(MapEditorMapTilePanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override TileSprite Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot.Brush + /// + public class Brush : UiNode + { + public Brush(MapEditorMapTilePanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Brush Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot + /// + public class TabRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TileSprite + /// + public TileSprite L_TileSprite + { + get + { + if (_L_TileSprite == null) _L_TileSprite = new TileSprite(UiPanel, Instance.GetNode("TileSprite")); + return _L_TileSprite; + } + } + private TileSprite _L_TileSprite; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.Brush + /// + public Brush L_Brush + { + get + { + if (_L_Brush == null) _L_Brush = new Brush(UiPanel, Instance.GetNode("Brush")); + return _L_Brush; + } + } + private Brush _L_Brush; + + public TabRoot(MapEditorMapTilePanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override TabRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.Grid + /// + public class Grid : UiNode + { + public Grid(MapEditorMapTilePanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Grid Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.FocusBtn + /// + public class FocusBtn : UiNode + { + public FocusBtn(MapEditorMapTilePanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1 + /// + public class Tab1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.TabRoot + /// + public TabRoot L_TabRoot + { + get + { + if (_L_TabRoot == null) _L_TabRoot = new TabRoot(UiPanel, Instance.GetNode("TabRoot")); + return _L_TabRoot; + } + } + private TabRoot _L_TabRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Grid + /// + public Grid L_Grid + { + get + { + if (_L_Grid == null) _L_Grid = new Grid(UiPanel, Instance.GetNode("Grid")); + return _L_Grid; + } + } + private Grid _L_Grid; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.FocusBtn + /// + public FocusBtn L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn _L_FocusBtn; + + public Tab1(MapEditorMapTilePanel uiPanel, UI.MapEditorMapTile.FreeTileTab node) : base(uiPanel, node) { } + public override Tab1 Clone() => new (UiPanel, (UI.MapEditorMapTile.FreeTileTab)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.Select + /// + public class Select : UiNode + { + public Select(MapEditorMapTilePanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override Select Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.TerrainName + /// + public class TerrainName : UiNode + { + public TerrainName(MapEditorMapTilePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override TerrainName Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.ErrorIcon + /// + public class ErrorIcon : UiNode + { + public ErrorIcon(MapEditorMapTilePanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override ErrorIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.TerrainPreview + /// + public class TerrainPreview : UiNode + { + public TerrainPreview(MapEditorMapTilePanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TerrainPreview Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem + /// + public class TerrainItem : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.Select + /// + public Select L_Select + { + get + { + if (_L_Select == null) _L_Select = new Select(UiPanel, Instance.GetNode("Select")); + return _L_Select; + } + } + private Select _L_Select; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainName + /// + public TerrainName L_TerrainName + { + get + { + if (_L_TerrainName == null) _L_TerrainName = new TerrainName(UiPanel, Instance.GetNode("TerrainName")); + return _L_TerrainName; + } + } + private TerrainName _L_TerrainName; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.ErrorIcon + /// + public ErrorIcon L_ErrorIcon + { + get + { + if (_L_ErrorIcon == null) _L_ErrorIcon = new ErrorIcon(UiPanel, Instance.GetNode("ErrorIcon")); + return _L_ErrorIcon; + } + } + private ErrorIcon _L_ErrorIcon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainPreview + /// + public TerrainPreview L_TerrainPreview + { + get + { + if (_L_TerrainPreview == null) _L_TerrainPreview = new TerrainPreview(UiPanel, Instance.GetNode("TerrainPreview")); + return _L_TerrainPreview; + } + } + private TerrainPreview _L_TerrainPreview; + + public TerrainItem(MapEditorMapTilePanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TerrainItem Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.TerrainItem + /// + public TerrainItem L_TerrainItem + { + get + { + if (_L_TerrainItem == null) _L_TerrainItem = new TerrainItem(UiPanel, Instance.GetNode("TerrainItem")); + return _L_TerrainItem; + } + } + private TerrainItem _L_TerrainItem; + + public ScrollContainer(MapEditorMapTilePanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2 + /// + public class Tab2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public Tab2(MapEditorMapTilePanel uiPanel, UI.MapEditorMapTile.TerrainTileTab node) : base(uiPanel, node) { } + public override Tab2 Clone() => new (UiPanel, (UI.MapEditorMapTile.TerrainTileTab)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.PreviewImage + /// + public class PreviewImage : UiNode + { + public PreviewImage(MapEditorMapTilePanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override PreviewImage Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.CellName + /// + public class CellName : UiNode + { + public CellName(MapEditorMapTilePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override CellName Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.SelectTexture + /// + public class SelectTexture : UiNode + { + public SelectTexture(MapEditorMapTilePanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override SelectTexture Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton + /// + public class CellButton : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.PreviewImage + /// + public PreviewImage L_PreviewImage + { + get + { + if (_L_PreviewImage == null) _L_PreviewImage = new PreviewImage(UiPanel, Instance.GetNode("PreviewImage")); + return _L_PreviewImage; + } + } + private PreviewImage _L_PreviewImage; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellName + /// + public CellName L_CellName + { + get + { + if (_L_CellName == null) _L_CellName = new CellName(UiPanel, Instance.GetNode("CellName")); + return _L_CellName; + } + } + private CellName _L_CellName; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.SelectTexture + /// + public SelectTexture L_SelectTexture + { + get + { + if (_L_SelectTexture == null) _L_SelectTexture = new SelectTexture(UiPanel, Instance.GetNode("SelectTexture")); + return _L_SelectTexture; + } + } + private SelectTexture _L_SelectTexture; + + public CellButton(MapEditorMapTilePanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override CellButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer + /// + public class ScrollContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.CellButton + /// + public CellButton L_CellButton + { + get + { + if (_L_CellButton == null) _L_CellButton = new CellButton(UiPanel, Instance.GetNode("CellButton")); + return _L_CellButton; + } + } + private CellButton _L_CellButton; + + public ScrollContainer_1(MapEditorMapTilePanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer_1 Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3 + /// + public class Tab3 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.ScrollContainer + /// + public ScrollContainer_1 L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer_1(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer_1 _L_ScrollContainer; + + public Tab3(MapEditorMapTilePanel uiPanel, UI.MapEditorMapTile.CombinationTileTab node) : base(uiPanel, node) { } + public override Tab3 Clone() => new (UiPanel, (UI.MapEditorMapTile.CombinationTileTab)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.Tab1 + /// + public Tab1 L_Tab1 + { + get + { + if (_L_Tab1 == null) _L_Tab1 = new Tab1(UiPanel, Instance.GetNode("Tab1")); + return _L_Tab1; + } + } + private Tab1 _L_Tab1; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.Tab2 + /// + public Tab2 L_Tab2 + { + get + { + if (_L_Tab2 == null) _L_Tab2 = new Tab2(UiPanel, Instance.GetNode("Tab2")); + return _L_Tab2; + } + } + private Tab2 _L_Tab2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.Tab3 + /// + public Tab3 L_Tab3 + { + get + { + if (_L_Tab3 == null) _L_Tab3 = new Tab3(UiPanel, Instance.GetNode("Tab3")); + return _L_Tab3; + } + } + private Tab3 _L_Tab3; + + public MarginContainer(MapEditorMapTilePanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer.Panel + /// + public class Panel : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer(UiPanel, Instance.GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + public Panel(MapEditorMapTilePanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Panel Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.Panel + /// + public Panel L_Panel + { + get + { + if (_L_Panel == null) _L_Panel = new Panel(UiPanel, Instance.GetNode("Panel")); + return _L_Panel; + } + } + private Panel _L_Panel; + + public VBoxContainer(MapEditorMapTilePanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.MaskBg.Label + /// + public class Label_2 : UiNode + { + public Label_2(MapEditorMapTilePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_2 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorMapTile.MaskBg + /// + public class MaskBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorMapTile.Label + /// + public Label_2 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_2(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_2 _L_Label; + + public MaskBg(MapEditorMapTilePanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override MaskBg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.HBoxContainer.SourceOption + /// + public SourceOption S_SourceOption => L_VBoxContainer.L_HBoxContainer.L_SourceOption; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.HBoxContainer2.HandleOption + /// + public HandleOption S_HandleOption => L_VBoxContainer.L_HBoxContainer2.L_HandleOption; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_VBoxContainer.L_HBoxContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot.TileSprite + /// + public TileSprite S_TileSprite => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1.L_TabRoot.L_TileSprite; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot.Brush + /// + public Brush S_Brush => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1.L_TabRoot.L_Brush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.TabRoot + /// + public TabRoot S_TabRoot => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1.L_TabRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.Grid + /// + public Grid S_Grid => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1.L_Grid; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1.FocusBtn + /// + public FocusBtn S_FocusBtn => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1.L_FocusBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab1 + /// + public Tab1 S_Tab1 => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab1; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.Select + /// + public Select S_Select => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2.L_ScrollContainer.L_TerrainItem.L_Select; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.TerrainName + /// + public TerrainName S_TerrainName => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2.L_ScrollContainer.L_TerrainItem.L_TerrainName; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.ErrorIcon + /// + public ErrorIcon S_ErrorIcon => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2.L_ScrollContainer.L_TerrainItem.L_ErrorIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem.TerrainPreview + /// + public TerrainPreview S_TerrainPreview => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2.L_ScrollContainer.L_TerrainItem.L_TerrainPreview; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2.ScrollContainer.TerrainItem + /// + public TerrainItem S_TerrainItem => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2.L_ScrollContainer.L_TerrainItem; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab2 + /// + public Tab2 S_Tab2 => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.PreviewImage + /// + public PreviewImage S_PreviewImage => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3.L_ScrollContainer.L_CellButton.L_PreviewImage; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.CellName + /// + public CellName S_CellName => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3.L_ScrollContainer.L_CellButton.L_CellName; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton.SelectTexture + /// + public SelectTexture S_SelectTexture => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3.L_ScrollContainer.L_CellButton.L_SelectTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3.ScrollContainer.CellButton + /// + public CellButton S_CellButton => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3.L_ScrollContainer.L_CellButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer.Tab3 + /// + public Tab3 S_Tab3 => L_VBoxContainer.L_Panel.L_MarginContainer.L_Tab3; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel.MarginContainer + /// + public MarginContainer S_MarginContainer => L_VBoxContainer.L_Panel.L_MarginContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer.Panel + /// + public Panel S_Panel => L_VBoxContainer.L_Panel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorMapTile.MaskBg + /// + public MaskBg S_MaskBg => L_MaskBg; + +} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTilePanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTilePanel.cs new file mode 100644 index 0000000..e82ff5f --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/MapEditorMapTilePanel.cs @@ -0,0 +1,132 @@ +using Godot; +using UI.MapEditor; + +namespace UI.MapEditorMapTile; + +public partial class MapEditorMapTilePanel : MapEditorMapTile +{ + /// + /// 使用的TileSet数据 + /// + public TileSetSplit TileSetSplit { get; private set; } + + /// + /// 选中的资源 Id + /// + public int SourceIndex { get; private set; } = -1; + + /// + /// 选中的 Source + /// + public TileSetSourceInfo TileSetSourceInfo + { + get + { + if (SourceIndex < 0) + { + return null; + } + return TileSetSplit.TileSetInfo.Sources[SourceIndex]; + } + } + + /// + /// 编辑器Tile对象 + /// + public EditorTileMap EditorTileMap { get; private set; } + + public override void OnCreateUi() + { + var editorPanel = (MapEditorPanel)ParentUi; + EditorTileMap = editorPanel.S_TileMap.Instance; + //切换资源 + S_SourceOption.Instance.ItemSelected += OnChangeSource; + //切换笔刷类型 + S_HandleOption.Instance.ItemSelected += OnChangeBrush; + OnChangeBrush(0); + //选择层级 + AddEventListener(EventEnum.OnSelectTileLayer, OnSelectTileLayer); + OnSelectTileLayer(0); + } + + public override void OnDestroyUi() + { + + } + + /// + /// 初始化TileSet数据 + /// + public void InitData(TileSetSplit tileSetSplit) + { + TileSetSplit = tileSetSplit; + //初始化Source下拉框 + var optionButton = S_SourceOption.Instance; + foreach (var sourceInfo in tileSetSplit.TileSetInfo.Sources) + { + optionButton.AddItem(sourceInfo.Name); + } + + optionButton.Selected = 0; + OnChangeSource(0); + } + + //选中层级 + private void OnSelectTileLayer(object obj) + { + if (obj is int v) + { + S_MaskBg.Instance.Visible = v == 0; + } + } + + // 切换选中的资源 + private void OnChangeSource(long index) + { + SourceIndex = (int)index; + if (index >= 0) + { + var sourceInfo = TileSetSourceInfo; + //单格页签纹理 + S_Tab1.Instance.SetImage(sourceInfo.GetSourceImage()); + //触发聚焦 + S_Tab1.Instance.OnFocusClick(); + //地形页签 + S_Tab2.Instance.RefreshTerrain(sourceInfo); + //组合页签 + S_Tab3.Instance.RefreshCombination(sourceInfo); + } + EditorTileMap.SetCurrSourceIndex(SourceIndex); + } + + //切换笔刷类型 + private void OnChangeBrush(long index) + { + var v1 = false; + var v2 = false; + var v3 = false; + if (index == 0) //自由绘制 + { + v1 = true; + EditorTileMap.SetCurrBrushType(EditorTileMap.TileMapDrawMode.Free); + } + else if (index == 1) //地形 + { + v2 = true; + EditorTileMap.SetCurrBrushType(EditorTileMap.TileMapDrawMode.Terrain); + } + else if (index == 2) //组合 + { + v3 = true; + EditorTileMap.SetCurrBrushType(EditorTileMap.TileMapDrawMode.Combination); + } + else + { + EditorTileMap.SetCurrBrushType(EditorTileMap.TileMapDrawMode.Free); + } + + S_Tab1.Instance.Visible = v1; + S_Tab2.Instance.Visible = v2; + S_Tab3.Instance.Visible = v3; + } +} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainCell.cs new file mode 100644 index 0000000..2a62a4e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainCell.cs @@ -0,0 +1,119 @@ +using Godot; +using static TerrainPeering; + +namespace UI.MapEditorMapTile; + +/// +/// 地形选项 +/// +public class TerrainCell : UiCell +{ + private Image _image; + private ImageTexture _texture; + + public override void OnInit() + { + _texture = new ImageTexture(); + CellNode.L_TerrainPreview.Instance.Texture = _texture; + CellNode.L_Select.Instance.Visible = false; + CellNode.L_ErrorIcon.Instance.Visible = false; + } + + public override void OnSetData(TerrainData data) + { + //是否可以使用 + if (!data.TerrainInfo.Ready) + { + CellNode.L_ErrorIcon.Instance.Visible = true; + CellNode.Instance.TooltipText = "该地形Bit配置未完成,请在TileSet编辑器中配置!"; + } + else + { + CellNode.L_ErrorIcon.Instance.Visible = false; + CellNode.Instance.TooltipText = ""; + } + + if (_image != null) + { + _image.Dispose(); + } + + //创建预览图 + _image = Image.Create( + 3 * GameConfig.TileCellSize, + 3 * GameConfig.TileCellSize, + false, Image.Format.Rgba8 + ); + if (data.TerrainInfo.TerrainType == 0) //3x3 + { + CellNode.L_TerrainName.Instance.Text = data.TerrainInfo.Name + "\n3x3"; + var src = CellNode.UiPanel.TileSetSourceInfo.GetSourceImage(); + + SetImageSrc(src, Center | Right | Bottom | RightBottom, new Vector2I(0, 0)); + SetImageSrc(src, Center | Left | Right | Bottom | LeftBottom | RightBottom, new Vector2I(GameConfig.TileCellSize, 0)); + SetImageSrc(src, Center | Left | Bottom | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, 0)); + + SetImageSrc(src, Center | Right | Top | Bottom | RightTop | RightBottom, new Vector2I(0, GameConfig.TileCellSize)); + SetImageSrc(src, Center | Left | Right | Bottom | Top | LeftTop | LeftBottom | RightTop | RightBottom, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize)); + SetImageSrc(src, Center | Left | Top | Bottom | LeftTop | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize)); + + SetImageSrc(src, Center | Right | Top | RightTop, new Vector2I(0, GameConfig.TileCellSize * 2)); + SetImageSrc(src, Center | Left | Top | Right | LeftTop | RightTop, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize * 2)); + SetImageSrc(src, Center | Left | Top | LeftTop, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 2)); + } + else //2x2 + { + CellNode.L_TerrainName.Instance.Text = data.TerrainInfo.Name + "\n2x2"; + var src = CellNode.UiPanel.TileSetSourceInfo.GetSourceImage(); + + SetImageSrc(src, Center | RightBottom, new Vector2I(0, 0)); + SetImageSrc(src, Center | LeftBottom | RightBottom, new Vector2I(GameConfig.TileCellSize, 0)); + SetImageSrc(src, Center | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, 0)); + + SetImageSrc(src, Center | RightTop | RightBottom, new Vector2I(0, GameConfig.TileCellSize)); + SetImageSrc(src, Center | LeftTop | LeftBottom | RightTop | RightBottom, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize)); + SetImageSrc(src, Center | LeftTop | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize)); + + SetImageSrc(src, Center | RightTop, new Vector2I(0, GameConfig.TileCellSize * 2)); + SetImageSrc(src, Center | LeftTop | RightTop, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize * 2)); + SetImageSrc(src, Center | LeftTop, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 2)); + } + + _texture.SetImage(_image); + } + + private void SetImageSrc(Image src, uint bit, Vector2I dst) + { + if (Data.TerrainInfo.T.TryGetValue(bit, out var temp)) + { + var pos = Data.TerrainInfo.GetPosition(temp); + _image.BlitRect(src, new Rect2I(pos * GameConfig.TileCellSize, GameConfig.TileCellSizeVector2I), dst); + } + } + + public override void OnDestroy() + { + if (_texture != null) + { + _texture.Dispose(); + _texture = null; + } + + if (_image != null) + { + _image.Dispose(); + _image = null; + } + } + + public override void OnSelect() + { + CellNode.L_Select.Instance.Visible = true; + CellNode.UiPanel.EditorTileMap.SetCurrTerrain(Data); + } + + public override void OnUnSelect() + { + CellNode.L_Select.Instance.Visible = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainTileTab.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainTileTab.cs new file mode 100644 index 0000000..f9fca08 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/TerrainTileTab.cs @@ -0,0 +1,46 @@ +using Godot; + +namespace UI.MapEditorMapTile; + +/// +/// 地形笔刷页签 +/// +public partial class TerrainTileTab : Control, IUiNodeScript +{ + private MapEditorMapTile.Tab2 _uiNode; + + private UiGrid _uiGrid; + + public void SetUiNode(IUiNode uiNode) + { + _uiNode = (MapEditorMapTile.Tab2)uiNode; + _uiGrid = _uiNode.UiPanel.CreateUiGrid(_uiNode.L_ScrollContainer.L_TerrainItem); + _uiGrid.SetColumns(1); + _uiGrid.SetCellOffset(new Vector2I(0, 8)); + _uiGrid.SetHorizontalExpand(true); + } + + public void OnDestroy() + { + + } + + public void RefreshTerrain(TileSetSourceInfo sourceInfo) + { + _uiGrid.RemoveAll(); + + var startSetIndex = 0; + var panel = _uiNode.UiPanel; + for (var i = 0; i < panel.SourceIndex; i++) + { + var source = panel.TileSetSplit.TileSetInfo.Sources[i]; + startSetIndex += source.Terrain.Count; + } + + var start = panel.SourceIndex == 0 ? 1 : 0; //跳过 Main Source 中的 Main Terrain + for (var i = start; i < sourceInfo.Terrain.Count; i++) + { + _uiGrid.Add(new TerrainData(i, sourceInfo.Terrain[i], startSetIndex + i)); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorProject/GroupButtonCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorProject/GroupButtonCell.cs index b9ab1ed..746e3b9 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorProject/GroupButtonCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorProject/GroupButtonCell.cs @@ -12,7 +12,7 @@ public override void OnSetData(DungeonRoomGroup info) { CellNode.Instance.Text = info.GroupName; - CellNode.Instance.TooltipText = "路径: " + MapProjectManager.CustomMapPath + "/" + info.GroupName; + CellNode.Instance.TooltipText = "路径: " + MapProjectManager.CustomMapPath + info.GroupName; } public override void OnRefreshIndex() diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProject.cs b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProject.cs index ad57e6e..d71b162 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProject.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProject.cs @@ -6,17 +6,17 @@ public abstract partial class MapEditorProject : UiBase { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer /// - public Bg L_Bg + public HBoxContainer L_HBoxContainer { get { - if (_L_Bg == null) _L_Bg = new Bg((MapEditorProjectPanel)this, GetNode("Bg")); - return _L_Bg; + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer((MapEditorProjectPanel)this, GetNode("HBoxContainer")); + return _L_HBoxContainer; } } - private Bg _L_Bg; + private HBoxContainer _L_HBoxContainer; public MapEditorProject() : base(nameof(MapEditorProject)) @@ -29,38 +29,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.Head.Back - /// - public class Back : UiNode - { - public Back(MapEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override Back Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.Head - /// - public class Head : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.Back - /// - public Back L_Back - { - get - { - if (_L_Back == null) _L_Back = new Back(UiPanel, Instance.GetNode("Back")); - return _L_Back; - } - } - private Back _L_Back; - - public Head(MapEditorProjectPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } - public override Head Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchInput + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchInput /// public class GroupSearchInput : UiNode { @@ -69,7 +38,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchButton /// public class GroupSearchButton : UiNode { @@ -78,21 +47,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupAddButton - /// - public class GroupAddButton : UiNode - { - public GroupAddButton(MapEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override GroupAddButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer /// public class HBoxContainer_1 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupSearchInput + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupSearchInput /// public GroupSearchInput L_GroupSearchInput { @@ -105,7 +65,7 @@ private GroupSearchInput _L_GroupSearchInput; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupSearchButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupSearchButton /// public GroupSearchButton L_GroupSearchButton { @@ -117,8 +77,44 @@ } private GroupSearchButton _L_GroupSearchButton; + public HBoxContainer_1(MapEditorProjectPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer_1 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupAddButton + /// + public class GroupAddButton : UiNode + { + public GroupAddButton(MapEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override GroupAddButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupEditButton + /// + public class GroupEditButton : UiNode + { + public GroupEditButton(MapEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override GroupEditButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupDeleteButton + /// + public class GroupDeleteButton : UiNode + { + public GroupDeleteButton(MapEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override GroupDeleteButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupAddButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupAddButton /// public GroupAddButton L_GroupAddButton { @@ -130,12 +126,38 @@ } private GroupAddButton _L_GroupAddButton; - public HBoxContainer_1(MapEditorProjectPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override HBoxContainer_1 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupEditButton + /// + public GroupEditButton L_GroupEditButton + { + get + { + if (_L_GroupEditButton == null) _L_GroupEditButton = new GroupEditButton(UiPanel, Instance.GetNode("GroupEditButton")); + return _L_GroupEditButton; + } + } + private GroupEditButton _L_GroupEditButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupDeleteButton + /// + public GroupDeleteButton L_GroupDeleteButton + { + get + { + if (_L_GroupDeleteButton == null) _L_GroupDeleteButton = new GroupDeleteButton(UiPanel, Instance.GetNode("GroupDeleteButton")); + return _L_GroupDeleteButton; + } + } + private GroupDeleteButton _L_GroupDeleteButton; + + public HBoxContainer2(MapEditorProjectPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton.SelectTexture + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton.SelectTexture /// public class SelectTexture : UiNode { @@ -144,12 +166,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton /// public class GroupButton : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.SelectTexture + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.SelectTexture /// public SelectTexture L_SelectTexture { @@ -166,12 +188,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer /// public class ScrollContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.GroupButton /// public GroupButton L_GroupButton { @@ -188,12 +210,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer /// - public class VBoxContainer_1 : UiNode + public class VBoxContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.HBoxContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.HBoxContainer /// public HBoxContainer_1 L_HBoxContainer { @@ -206,7 +228,20 @@ private HBoxContainer_1 _L_HBoxContainer; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.ScrollContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.ScrollContainer /// public ScrollContainer L_ScrollContainer { @@ -218,39 +253,39 @@ } private ScrollContainer _L_ScrollContainer; - public VBoxContainer_1(MapEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } - public override VBoxContainer_1 Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + public VBoxContainer(MapEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel.MarginContainer /// public class MarginContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.VBoxContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.VBoxContainer /// - public VBoxContainer_1 L_VBoxContainer + public VBoxContainer L_VBoxContainer { get { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer_1(UiPanel, Instance.GetNode("VBoxContainer")); + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); return _L_VBoxContainer; } } - private VBoxContainer_1 _L_VBoxContainer; + private VBoxContainer _L_VBoxContainer; public MarginContainer(MapEditorProjectPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel /// public class Panel : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.MarginContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.MarginContainer /// public MarginContainer L_MarginContainer { @@ -267,7 +302,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchInput + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchInput /// public class RoomSearchInput : UiNode { @@ -276,7 +311,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomTypeButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomTypeButton /// public class RoomTypeButton : UiNode { @@ -285,7 +320,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchButton /// public class RoomSearchButton : UiNode { @@ -294,7 +329,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomAddButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomAddButton /// public class RoomAddButton : UiNode { @@ -303,7 +338,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomEditButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomEditButton /// public class RoomEditButton : UiNode { @@ -312,7 +347,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomDeleteButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomDeleteButton /// public class RoomDeleteButton : UiNode { @@ -321,12 +356,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer /// public class HBoxContainer_2 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomSearchInput + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomSearchInput /// public RoomSearchInput L_RoomSearchInput { @@ -339,7 +374,7 @@ private RoomSearchInput _L_RoomSearchInput; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomTypeButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomTypeButton /// public RoomTypeButton L_RoomTypeButton { @@ -352,7 +387,7 @@ private RoomTypeButton _L_RoomTypeButton; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomSearchButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomSearchButton /// public RoomSearchButton L_RoomSearchButton { @@ -365,7 +400,7 @@ private RoomSearchButton _L_RoomSearchButton; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomAddButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomAddButton /// public RoomAddButton L_RoomAddButton { @@ -378,7 +413,7 @@ private RoomAddButton _L_RoomAddButton; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomEditButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomEditButton /// public RoomEditButton L_RoomEditButton { @@ -391,7 +426,7 @@ private RoomEditButton _L_RoomEditButton; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomDeleteButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomDeleteButton /// public RoomDeleteButton L_RoomDeleteButton { @@ -408,7 +443,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.PreviewImage + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.PreviewImage /// public class PreviewImage : UiNode { @@ -417,7 +452,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomName + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomName /// public class RoomName : UiNode { @@ -426,7 +461,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomType + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomType /// public class RoomType : UiNode { @@ -435,7 +470,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.SelectTexture + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.SelectTexture /// public class SelectTexture_1 : UiNode { @@ -444,7 +479,7 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.ErrorTexture + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.ErrorTexture /// public class ErrorTexture : UiNode { @@ -453,12 +488,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton /// public class RoomButton : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.PreviewImage + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.PreviewImage /// public PreviewImage L_PreviewImage { @@ -471,7 +506,7 @@ private PreviewImage _L_PreviewImage; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomName + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomName /// public RoomName L_RoomName { @@ -484,7 +519,7 @@ private RoomName _L_RoomName; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomType + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomType /// public RoomType L_RoomType { @@ -497,7 +532,7 @@ private RoomType _L_RoomType; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.SelectTexture + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.SelectTexture /// public SelectTexture_1 L_SelectTexture { @@ -510,7 +545,7 @@ private SelectTexture_1 _L_SelectTexture; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.ErrorTexture + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.ErrorTexture /// public ErrorTexture L_ErrorTexture { @@ -527,12 +562,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer /// public class ScrollContainer_1 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomButton + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.RoomButton /// public RoomButton L_RoomButton { @@ -549,12 +584,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer /// - public class VBoxContainer_2 : UiNode + public class VBoxContainer_1 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.HBoxContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.HBoxContainer /// public HBoxContainer_2 L_HBoxContainer { @@ -567,7 +602,7 @@ private HBoxContainer_2 _L_HBoxContainer; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.ScrollContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.ScrollContainer /// public ScrollContainer_1 L_ScrollContainer { @@ -579,39 +614,39 @@ } private ScrollContainer_1 _L_ScrollContainer; - public VBoxContainer_2(MapEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } - public override VBoxContainer_2 Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + public VBoxContainer_1(MapEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer_1 Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer /// public class MarginContainer_1 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.VBoxContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.VBoxContainer /// - public VBoxContainer_2 L_VBoxContainer + public VBoxContainer_1 L_VBoxContainer { get { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer_2(UiPanel, Instance.GetNode("VBoxContainer")); + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer_1(UiPanel, Instance.GetNode("VBoxContainer")); return _L_VBoxContainer; } } - private VBoxContainer_2 _L_VBoxContainer; + private VBoxContainer_1 _L_VBoxContainer; public MarginContainer_1(MapEditorProjectPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } public override MarginContainer_1 Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2 + /// 类型: , 路径: MapEditorProject.HBoxContainer.Panel2 /// public class Panel2 : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.MarginContainer + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.MarginContainer /// public MarginContainer_1 L_MarginContainer { @@ -628,12 +663,12 @@ } /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer + /// 类型: , 路径: MapEditorProject.HBoxContainer /// public class HBoxContainer : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.Panel + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Panel /// public Panel L_Panel { @@ -646,7 +681,7 @@ private Panel _L_Panel; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.Panel2 + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Panel2 /// public Panel2 L_Panel2 { @@ -662,162 +697,105 @@ public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } - /// - /// 类型: , 路径: MapEditorProject.Bg.VBoxContainer - /// - public class VBoxContainer : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.Head - /// - public Head L_Head - { - get - { - if (_L_Head == null) _L_Head = new Head(UiPanel, Instance.GetNode("Head")); - return _L_Head; - } - } - private Head _L_Head; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.Bg.HBoxContainer - /// - public HBoxContainer L_HBoxContainer - { - get - { - if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); - return _L_HBoxContainer; - } - } - private HBoxContainer _L_HBoxContainer; - - public VBoxContainer(MapEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } - public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); - } /// - /// 类型: , 路径: MapEditorProject.Bg + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchInput /// - public class Bg : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorProject.VBoxContainer - /// - public VBoxContainer L_VBoxContainer - { - get - { - if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); - return _L_VBoxContainer; - } - } - private VBoxContainer _L_VBoxContainer; - - public Bg(MapEditorProjectPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } - public override Bg Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); - } - + public GroupSearchInput S_GroupSearchInput => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupSearchInput; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.Head.Back + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchButton /// - public Back S_Back => L_Bg.L_VBoxContainer.L_Head.L_Back; + public GroupSearchButton S_GroupSearchButton => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupSearchButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.Head + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupAddButton /// - public Head S_Head => L_Bg.L_VBoxContainer.L_Head; + public GroupAddButton S_GroupAddButton => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_GroupAddButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchInput + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupEditButton /// - public GroupSearchInput S_GroupSearchInput => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupSearchInput; + public GroupEditButton S_GroupEditButton => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_GroupEditButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupSearchButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2.GroupDeleteButton /// - public GroupSearchButton S_GroupSearchButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupSearchButton; + public GroupDeleteButton S_GroupDeleteButton => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_GroupDeleteButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer.GroupAddButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.HBoxContainer2 /// - public GroupAddButton S_GroupAddButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_GroupAddButton; + public HBoxContainer2 S_HBoxContainer2 => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_HBoxContainer2; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel.MarginContainer.VBoxContainer.ScrollContainer.GroupButton /// - public GroupButton S_GroupButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_GroupButton; + public GroupButton S_GroupButton => L_HBoxContainer.L_Panel.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_GroupButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel /// - public Panel S_Panel => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel; + public Panel S_Panel => L_HBoxContainer.L_Panel; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchInput + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchInput /// - public RoomSearchInput S_RoomSearchInput => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomSearchInput; + public RoomSearchInput S_RoomSearchInput => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomSearchInput; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomTypeButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomTypeButton /// - public RoomTypeButton S_RoomTypeButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomTypeButton; + public RoomTypeButton S_RoomTypeButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomTypeButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomSearchButton /// - public RoomSearchButton S_RoomSearchButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomSearchButton; + public RoomSearchButton S_RoomSearchButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomSearchButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomAddButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomAddButton /// - public RoomAddButton S_RoomAddButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomAddButton; + public RoomAddButton S_RoomAddButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomAddButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomEditButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomEditButton /// - public RoomEditButton S_RoomEditButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomEditButton; + public RoomEditButton S_RoomEditButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomEditButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomDeleteButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.HBoxContainer.RoomDeleteButton /// - public RoomDeleteButton S_RoomDeleteButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomDeleteButton; + public RoomDeleteButton S_RoomDeleteButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_HBoxContainer.L_RoomDeleteButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.PreviewImage + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.PreviewImage /// - public PreviewImage S_PreviewImage => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_PreviewImage; + public PreviewImage S_PreviewImage => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_PreviewImage; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomName + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomName /// - public RoomName S_RoomName => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_RoomName; + public RoomName S_RoomName => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_RoomName; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomType + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.RoomType /// - public RoomType S_RoomType => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_RoomType; + public RoomType S_RoomType => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_RoomType; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.ErrorTexture + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton.ErrorTexture /// - public ErrorTexture S_ErrorTexture => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_ErrorTexture; + public ErrorTexture S_ErrorTexture => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton.L_ErrorTexture; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2.MarginContainer.VBoxContainer.ScrollContainer.RoomButton /// - public RoomButton S_RoomButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton; + public RoomButton S_RoomButton => L_HBoxContainer.L_Panel2.L_MarginContainer.L_VBoxContainer.L_ScrollContainer.L_RoomButton; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg.VBoxContainer.HBoxContainer.Panel2 + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.HBoxContainer.Panel2 /// - public Panel2 S_Panel2 => L_Bg.L_VBoxContainer.L_HBoxContainer.L_Panel2; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorProject.Bg - /// - public Bg S_Bg => L_Bg; + public Panel2 S_Panel2 => L_HBoxContainer.L_Panel2; } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs index 83cfad6..97dab7b 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorProject/MapEditorProjectPanel.cs @@ -2,15 +2,22 @@ using System.Collections.Generic; using System.Linq; using Godot; +using UI.MapEditor; namespace UI.MapEditorProject; public partial class MapEditorProjectPanel : MapEditorProject { - //当前显示的组数据 - private UiGrid _groupGrid; - //当前显示的房间数据 - private UiGrid _roomGrid; + /// + /// 当前显示的组数据 + /// + public UiGrid GroupGrid { get; private set; } + + /// + /// 当前显示的房间数据 + /// + public UiGrid RoomGrid { get; private set; } + private EventFactory _eventFactory; public override void OnCreateUi() @@ -22,37 +29,33 @@ for (var i = 0; i < roomTypes.Length; i++) { var dungeonRoomType = roomTypes[i]; - optionButton.AddItem(DungeonManager.DungeonRoomTypeToDescribeString(dungeonRoomType), (int)dungeonRoomType + 1); + if (dungeonRoomType == DungeonRoomType.None) continue; + optionButton.AddItem(DungeonManager.DungeonRoomTypeToDescribeString(dungeonRoomType), + (int)dungeonRoomType + 1); } - _groupGrid = new UiGrid(S_GroupButton, typeof(GroupButtonCell)); - _groupGrid.SetCellOffset(new Vector2I(0, 2)); - _groupGrid.SetHorizontalExpand(true); + GroupGrid = new UiGrid(S_GroupButton, typeof(GroupButtonCell)); + GroupGrid.SetCellOffset(new Vector2I(0, 2)); + GroupGrid.SetHorizontalExpand(true); - _roomGrid = new UiGrid(S_RoomButton, typeof(RoomButtonCell)); - _roomGrid.SetAutoColumns(true); - _roomGrid.SetCellOffset(new Vector2I(10, 10)); - _roomGrid.SetHorizontalExpand(true); + RoomGrid = new UiGrid(S_RoomButton, typeof(RoomButtonCell)); + RoomGrid.SetAutoColumns(true); + RoomGrid.SetCellOffset(new Vector2I(10, 10)); + RoomGrid.SetHorizontalExpand(true); - if (PrevUi != null) - { - S_Back.Instance.Visible = true; - S_Back.Instance.Pressed += OpenPrevUi; - } - else - { - S_Back.Instance.Visible = false; - } - S_GroupSearchButton.Instance.Pressed += OnSearchGroupButtonClick; + S_GroupEditButton.Instance.Pressed += OnEditGroup; + S_GroupAddButton.Instance.Pressed += OnCreateGroupClick; + S_GroupDeleteButton.Instance.Pressed += OnDeleteGroup; + S_RoomSearchButton.Instance.Pressed += OnSearchRoomButtonClick; S_RoomAddButton.Instance.Pressed += OnCreateRoomClick; S_RoomEditButton.Instance.Pressed += OnEditRoom; S_RoomDeleteButton.Instance.Pressed += OnDeleteRoom; - S_GroupAddButton.Instance.Pressed += OnCreateGroupClick; - + _eventFactory = EventManager.CreateEventFactory(); _eventFactory.AddEventListener(EventEnum.OnCreateGroupFinish, OnCreateGroupFinish); + _eventFactory.AddEventListener(EventEnum.OnDeleteGroupFinish, OnDeleteGroupFinish); _eventFactory.AddEventListener(EventEnum.OnCreateRoomFinish, OnCreateRoomFinish); } @@ -66,11 +69,11 @@ { _eventFactory.RemoveAllEventListener(); _eventFactory = null; - _groupGrid.Destroy(); - _groupGrid = null; - - _roomGrid.Destroy(); - _roomGrid = null; + GroupGrid.Destroy(); + GroupGrid = null; + + RoomGrid.Destroy(); + RoomGrid = null; } /// @@ -78,14 +81,8 @@ /// public void RefreshGroup() { - var index = _groupGrid.SelectIndex; - if (index == -1) - { - index = 0; - } MapProjectManager.RefreshMapGroup(); OnSearchGroupButtonClick(); - _groupGrid.SelectIndex = index; } /// @@ -93,29 +90,30 @@ /// public void SelectGroup(DungeonRoomGroup group) { - EditorManager.SetSelectDungeonGroup(group); + EditorTileMapManager.SetSelectDungeonGroup(group); OnSearchRoomButtonClick(); } /// /// 选择地图并打开地图编辑器 /// - public void OpenSelectRoom(DungeonRoomSplit room) + public void OpenSelectRoom(DungeonRoomSplit room, TileSetSplit tileSetSplit) { - HideUi(); //创建地牢Ui - var mapEditor = UiManager.Create_MapEditor(); - mapEditor.PrevUi = this; + var mapEditor = ParentUi.OpenNextUi(UiManager.UiNames.MapEditor); //加载地牢 - mapEditor.LoadMap(room); - //打开Ui - mapEditor.ShowUi(); + mapEditor.LoadMap(room, tileSetSplit); } - + //搜索组按钮点击 private void OnSearchGroupButtonClick() { - var select = _groupGrid.SelectIndex; + var select = GroupGrid.SelectIndex; + if (select < 0) + { + select = 0; + } + //输入文本 var text = S_GroupSearchInput.Instance.Text; if (!string.IsNullOrEmpty(text)) @@ -129,28 +127,29 @@ list.Add(valuePair.Value); } } - _groupGrid.SetDataList(list.ToArray()); + + GroupGrid.SetDataList(list.ToArray()); } else { - _groupGrid.SetDataList(MapProjectManager.GroupMap.Values.ToArray()); + GroupGrid.SetDataList(MapProjectManager.GroupMap.Values.ToArray()); } - _roomGrid.SelectIndex = select; + GroupGrid.SelectIndex = select; } //搜索房间按钮点击 private void OnSearchRoomButtonClick() { - if (EditorManager.SelectDungeonGroup != null) + if (EditorTileMapManager.SelectDungeonGroup != null) { //输入文本 var text = S_RoomSearchInput.Instance.Text; //房间类型 var roomType = S_RoomTypeButton.Instance.GetSelectedId(); - IEnumerable result = EditorManager.SelectDungeonGroup.GetAllRoomList(); - + IEnumerable result = EditorTileMapManager.SelectDungeonGroup.GetAllRoomList(); + //名称搜索 if (!string.IsNullOrEmpty(text)) { @@ -167,12 +166,12 @@ var type = (DungeonRoomType)(roomType - 1); result = result.Where(split => split.RoomInfo.RoomType == type); } - - _roomGrid.SetDataList(result.ToArray()); + + RoomGrid.SetDataList(result.ToArray()); } else { - _roomGrid.RemoveAll(); + RoomGrid.RemoveAll(); } } @@ -181,19 +180,47 @@ { EditorWindowManager.ShowCreateGroup(CreateGroup); } - + + //编辑组按钮点击 + private void OnEditGroup() + { + if (GroupGrid.SelectIndex != -1) + { + EditorWindowManager.ShowEditGroup(GroupGrid.SelectData, EditGroup); + } + else + { + EditorWindowManager.ShowTips("提示", "请选择需要编辑的组!"); + } + } + + //删除组按钮点击 + private void OnDeleteGroup() + { + if (GroupGrid.SelectIndex != -1) + { + EditorWindowManager.ShowDelayConfirm("提示", "确定删除该组吗?\n该操作不可取消!", 5, DeleteGroup); + } + else + { + EditorWindowManager.ShowTips("提示", "请选择需要删除的组!"); + } + } + //创建地牢房间按钮点击 private void OnCreateRoomClick() { - var groupName = EditorManager.SelectDungeonGroup != null ? EditorManager.SelectDungeonGroup.GroupName : null; + var groupName = EditorTileMapManager.SelectDungeonGroup != null + ? EditorTileMapManager.SelectDungeonGroup.GroupName + : null; EditorWindowManager.ShowCreateRoom(groupName, Mathf.Max(S_RoomTypeButton.Instance.Selected - 1, 0), CreateRoom); } - - + + //编辑房间 private void OnEditRoom() { - var selectRoom = _roomGrid.SelectData; + var selectRoom = RoomGrid.SelectData; if (selectRoom == null) { EditorWindowManager.ShowTips("提示", "请选择需要编辑的房间!"); @@ -208,23 +235,23 @@ }); } } - + //删除房间 private void OnDeleteRoom() { - var selectRoom = _roomGrid.SelectData; + var selectRoom = RoomGrid.SelectData; if (selectRoom == null) { EditorWindowManager.ShowTips("提示", "请选择需要删除的房间!"); } else { - EditorWindowManager.ShowConfirm("提示", $"是否删除房间: {selectRoom.RoomInfo.RoomName}, 该操作无法撤销!", result => + EditorWindowManager.ShowDelayConfirm("提示", $"是否删除房间: {selectRoom.RoomInfo.RoomName}, 该操作无法撤销!", 3, result => { if (result) { //删除房间 - if (MapProjectManager.DeleteRoom(EditorManager.SelectDungeonGroup, selectRoom)) + if (MapProjectManager.DeleteRoom(EditorTileMapManager.SelectDungeonGroup, selectRoom)) { MapProjectManager.SaveGroupMap(); OnSearchRoomButtonClick(); @@ -239,7 +266,22 @@ { MapProjectManager.CreateGroup(group); } - + + //编辑地牢组 + private void EditGroup(DungeonRoomGroup group) + { + MapProjectManager.SaveGroupMap(); + } + + //删除地牢组 + private void DeleteGroup(bool v) + { + if (v) + { + MapProjectManager.DeleteGroup(GroupGrid.SelectData.GroupName); + } + } + //创建房间 private void CreateRoom(DungeonRoomSplit roomSplit) { @@ -252,7 +294,13 @@ OnSearchGroupButtonClick(); } - //创建地牢房间完成 + //删除地牢组完成 + private void OnDeleteGroupFinish(object group) + { + OnSearchGroupButtonClick(); + } + +//创建地牢房间完成 private void OnCreateRoomFinish(object roomSplit) { OnSearchRoomButtonClick(); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorProject/RoomButtonCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorProject/RoomButtonCell.cs index 9d82d5a..9a12446 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorProject/RoomButtonCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorProject/RoomButtonCell.cs @@ -1,4 +1,6 @@ +using System.Linq; using Godot; +using UI.TileSetEditor; namespace UI.MapEditorProject; @@ -28,7 +30,7 @@ else { CellNode.L_ErrorTexture.Instance.Visible = true; - tipText += "\n错误: " + EditorManager.GetRoomErrorTypeMessage(data.ErrorType); + tipText += "\n错误: " + EditorTileMapManager.GetRoomErrorTypeMessage(data.ErrorType); } if (!string.IsNullOrEmpty(data.RoomInfo.Remark)) @@ -45,13 +47,28 @@ public override void OnDoubleClick() { - //打开房间编辑器 - CellNode.UiPanel.OpenSelectRoom(Data); + //加载TileSet + var tileSetSplit = GameApplication.Instance.TileSetConfig[CellNode.UiPanel.GroupGrid.SelectData.TileSet]; + //判断tileSet是否可以使用 + if (string.IsNullOrEmpty(tileSetSplit.TileSetInfo.Sources[0].SourcePath)) + { + EditorWindowManager.ShowConfirm("错误", "当前房间绑定的 TileSet 中 Main Source 未被赋予纹理数据!\n是否前往编辑 TileSet?", (v) => + { + if (v) + { + //跳转编辑TileSet页面 + var tileSetEditorPanel = CellNode.UiPanel.ParentUi.OpenNextUi(UiManager.UiNames.TileSetEditor); + tileSetEditorPanel.InitData(tileSetSplit); + } + }); + return; + } + CellNode.UiPanel.OpenSelectRoom(Data, tileSetSplit); } public override void OnSelect() { - EditorManager.SetSelectRoom(Data); + EditorTileMapManager.SetSelectRoom(Data); CellNode.L_SelectTexture.Instance.Visible = true; } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorSelectObject/MapEditorSelectObjectPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorSelectObject/MapEditorSelectObjectPanel.cs index 5776073..101e836 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorSelectObject/MapEditorSelectObjectPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorSelectObject/MapEditorSelectObjectPanel.cs @@ -1,4 +1,6 @@ + using System; +using System.Collections.Generic; using System.Linq; using Config; using Godot; @@ -21,9 +23,9 @@ /// /// 类型值 /// - public int Type; + public ActivityType Type; - public TypeButtonData(string name, int type) + public TypeButtonData(string name, ActivityType type) { Name = name; Type = type; @@ -34,7 +36,7 @@ //物体网格组件 private UiGrid _objectGrid; //允许出现在该面板中的物体类型 - private int[] _typeArray = new[] { 4, 5, 9 }; + private ActivityType[] _typeArray = new[] { ActivityType.Enemy, ActivityType.Weapon, ActivityType.Prop }; public override void OnCreateUi() { @@ -65,14 +67,14 @@ _typeGrid.RemoveAll(); if (activityType == ActivityType.None) { - _typeGrid.Add(new TypeButtonData("所有", -1)); - _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Weapon), (int)ActivityType.Weapon)); - _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Prop), (int)ActivityType.Prop)); - _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Enemy), (int)ActivityType.Enemy)); + _typeGrid.Add(new TypeButtonData("所有", ActivityType.None)); + _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Weapon), ActivityType.Weapon)); + _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Prop), ActivityType.Prop)); + _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(ActivityType.Enemy), ActivityType.Enemy)); } else { - _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(activityType), (int)activityType)); + _typeGrid.Add(new TypeButtonData(ActivityId.GetTypeName(activityType), activityType)); } _typeGrid.SelectIndex = 0; } @@ -83,7 +85,7 @@ public void OnSearch() { //类型 - int type; + ActivityType type; //名称 var name = S_LineEdit.Instance.Text; var buttonData = _typeGrid.GetData(_typeGrid.SelectIndex); @@ -93,19 +95,43 @@ } else { - type = -1; + type = ActivityType.None; } //搜索结果 - var arr = ExcelConfig.ActivityBase_List.Where( - o => + var arr = new List(); + switch (type) + { + //全部类型 + case ActivityType.None: + arr.Add(PreinstallMarkManager.RandomEnemy); + arr.Add(PreinstallMarkManager.RandomProp); + arr.Add(PreinstallMarkManager.RandomWeapon); + break; + //随机武器 + case ActivityType.Weapon: + arr.Add(PreinstallMarkManager.RandomWeapon); + break; + //随机道具 + case ActivityType.Prop: + arr.Add(PreinstallMarkManager.RandomProp); + break; + //随机敌人 + case ActivityType.Enemy: + arr.Add(PreinstallMarkManager.RandomEnemy); + break; + } + foreach (var o in ExcelConfig.ActivityBase_List) + { + if (o.ShowInMapEditor && + (string.IsNullOrEmpty(name) || o.Name.Contains(name) || o.Id.Contains(name)) && + (type == ActivityType.None ? _typeArray.Contains(o.Type) : o.Type == type)) { - return o.ShowInMapEditor && - (string.IsNullOrEmpty(name) || o.Name.Contains(name) || o.Id.Contains(name)) && - (type < 0 ? _typeArray.Contains(o.Type) : o.Type == type); + arr.Add(o); } - ).ToArray(); - _objectGrid.SetDataList(arr); + } + + _objectGrid.SetDataList(arr.ToArray()); } /// diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSet.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSet.cs deleted file mode 100644 index 6d59628..0000000 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSet.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace UI.MapEditorTileSet; - -/// -/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 -/// -public abstract partial class MapEditorTileSet : UiBase -{ - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTileSet.Label - /// - public Label L_Label - { - get - { - if (_L_Label == null) _L_Label = new Label((MapEditorTileSetPanel)this, GetNode("Label")); - return _L_Label; - } - } - private Label _L_Label; - - - public MapEditorTileSet() : base(nameof(MapEditorTileSet)) - { - } - - public sealed override void OnInitNestedUi() - { - - } - - /// - /// 类型: , 路径: MapEditorTileSet.Label - /// - public class Label : UiNode - { - public Label(MapEditorTileSetPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTileSet.Label - /// - public Label S_Label => L_Label; - -} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSetPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSetPanel.cs deleted file mode 100644 index fbc477e..0000000 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTileSet/MapEditorTileSetPanel.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Godot; - -namespace UI.MapEditorTileSet; - -public partial class MapEditorTileSetPanel : MapEditorTileSet -{ - - public override void OnCreateUi() - { - - } - - public override void OnDestroyUi() - { - - } - -} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs index 34b2d6f..4dfff22 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs @@ -420,7 +420,7 @@ DoorAreaInfo.End = doorAreaRange.Y; Debug.Log("提交修改: " + doorAreaRange); //派发修改数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs index 2fcfe26..32da2d8 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs @@ -76,7 +76,7 @@ Debug.Log("提交创建: " + direction + ", " + start + ", " + end); _currToolTemplate.Instance.DoorAreaInfo = MapEditorToolsPanel.EditorMap.Instance.CreateDoorArea(direction, start, end); //派发修改数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } //取消提交 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs index 77fc4eb..9c0c842 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs @@ -12,7 +12,7 @@ { get { - if (_L_ToolRoot == null) _L_ToolRoot = new ToolRoot((MapEditorToolsPanel)this, GetNodeOrNull("ToolRoot")); + if (_L_ToolRoot == null) _L_ToolRoot = new ToolRoot((MapEditorToolsPanel)this, GetNode("ToolRoot")); return _L_ToolRoot; } } @@ -25,7 +25,7 @@ { get { - if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer((MapEditorToolsPanel)this, GetNodeOrNull("HBoxContainer")); + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer((MapEditorToolsPanel)this, GetNode("HBoxContainer")); return _L_HBoxContainer; } } @@ -63,7 +63,7 @@ { get { - if (_L_N_HoverArea == null) _L_N_HoverArea = new N_HoverArea(UiPanel, Instance.GetNodeOrNull("N_HoverArea")); + if (_L_N_HoverArea == null) _L_N_HoverArea = new N_HoverArea(UiPanel, Instance.GetNode("N_HoverArea")); return _L_N_HoverArea; } } @@ -94,7 +94,7 @@ { get { - if (_L_E_HoverArea == null) _L_E_HoverArea = new E_HoverArea(UiPanel, Instance.GetNodeOrNull("E_HoverArea")); + if (_L_E_HoverArea == null) _L_E_HoverArea = new E_HoverArea(UiPanel, Instance.GetNode("E_HoverArea")); return _L_E_HoverArea; } } @@ -125,7 +125,7 @@ { get { - if (_L_S_HoverArea == null) _L_S_HoverArea = new S_HoverArea(UiPanel, Instance.GetNodeOrNull("S_HoverArea")); + if (_L_S_HoverArea == null) _L_S_HoverArea = new S_HoverArea(UiPanel, Instance.GetNode("S_HoverArea")); return _L_S_HoverArea; } } @@ -156,7 +156,7 @@ { get { - if (_L_W_HoverArea == null) _L_W_HoverArea = new W_HoverArea(UiPanel, Instance.GetNodeOrNull("W_HoverArea")); + if (_L_W_HoverArea == null) _L_W_HoverArea = new W_HoverArea(UiPanel, Instance.GetNode("W_HoverArea")); return _L_W_HoverArea; } } @@ -187,7 +187,7 @@ { get { - if (_L_HoverPreview == null) _L_HoverPreview = new HoverPreview(UiPanel, Instance.GetNodeOrNull("HoverPreview")); + if (_L_HoverPreview == null) _L_HoverPreview = new HoverPreview(UiPanel, Instance.GetNode("HoverPreview")); return _L_HoverPreview; } } @@ -236,7 +236,7 @@ { get { - if (_L_DoorArea == null) _L_DoorArea = new DoorArea(UiPanel, Instance.GetNodeOrNull("DoorArea")); + if (_L_DoorArea == null) _L_DoorArea = new DoorArea(UiPanel, Instance.GetNode("DoorArea")); return _L_DoorArea; } } @@ -249,7 +249,7 @@ { get { - if (_L_StartBtn == null) _L_StartBtn = new StartBtn(UiPanel, Instance.GetNodeOrNull("StartBtn")); + if (_L_StartBtn == null) _L_StartBtn = new StartBtn(UiPanel, Instance.GetNode("StartBtn")); return _L_StartBtn; } } @@ -262,7 +262,7 @@ { get { - if (_L_EndBtn == null) _L_EndBtn = new EndBtn(UiPanel, Instance.GetNodeOrNull("EndBtn")); + if (_L_EndBtn == null) _L_EndBtn = new EndBtn(UiPanel, Instance.GetNode("EndBtn")); return _L_EndBtn; } } @@ -293,7 +293,7 @@ { get { - if (_L_N_HoverRoot == null) _L_N_HoverRoot = new N_HoverRoot(UiPanel, Instance.GetNodeOrNull("N_HoverRoot")); + if (_L_N_HoverRoot == null) _L_N_HoverRoot = new N_HoverRoot(UiPanel, Instance.GetNode("N_HoverRoot")); return _L_N_HoverRoot; } } @@ -306,7 +306,7 @@ { get { - if (_L_E_HoverRoot == null) _L_E_HoverRoot = new E_HoverRoot(UiPanel, Instance.GetNodeOrNull("E_HoverRoot")); + if (_L_E_HoverRoot == null) _L_E_HoverRoot = new E_HoverRoot(UiPanel, Instance.GetNode("E_HoverRoot")); return _L_E_HoverRoot; } } @@ -319,7 +319,7 @@ { get { - if (_L_S_HoverRoot == null) _L_S_HoverRoot = new S_HoverRoot(UiPanel, Instance.GetNodeOrNull("S_HoverRoot")); + if (_L_S_HoverRoot == null) _L_S_HoverRoot = new S_HoverRoot(UiPanel, Instance.GetNode("S_HoverRoot")); return _L_S_HoverRoot; } } @@ -332,7 +332,7 @@ { get { - if (_L_W_HoverRoot == null) _L_W_HoverRoot = new W_HoverRoot(UiPanel, Instance.GetNodeOrNull("W_HoverRoot")); + if (_L_W_HoverRoot == null) _L_W_HoverRoot = new W_HoverRoot(UiPanel, Instance.GetNode("W_HoverRoot")); return _L_W_HoverRoot; } } @@ -345,7 +345,7 @@ { get { - if (_L_HoverPreviewRoot == null) _L_HoverPreviewRoot = new HoverPreviewRoot(UiPanel, Instance.GetNodeOrNull("HoverPreviewRoot")); + if (_L_HoverPreviewRoot == null) _L_HoverPreviewRoot = new HoverPreviewRoot(UiPanel, Instance.GetNode("HoverPreviewRoot")); return _L_HoverPreviewRoot; } } @@ -358,7 +358,7 @@ { get { - if (_L_DoorToolTemplate == null) _L_DoorToolTemplate = new DoorToolTemplate(UiPanel, Instance.GetNodeOrNull("DoorToolTemplate")); + if (_L_DoorToolTemplate == null) _L_DoorToolTemplate = new DoorToolTemplate(UiPanel, Instance.GetNode("DoorToolTemplate")); return _L_DoorToolTemplate; } } @@ -371,7 +371,7 @@ { get { - if (_L_MarkTemplate == null) _L_MarkTemplate = new MarkTemplate(UiPanel, Instance.GetNodeOrNull("MarkTemplate")); + if (_L_MarkTemplate == null) _L_MarkTemplate = new MarkTemplate(UiPanel, Instance.GetNode("MarkTemplate")); return _L_MarkTemplate; } } @@ -402,7 +402,7 @@ { get { - if (_L_Select == null) _L_Select = new Select(UiPanel, Instance.GetNodeOrNull("Select")); + if (_L_Select == null) _L_Select = new Select(UiPanel, Instance.GetNode("Select")); return _L_Select; } } @@ -424,7 +424,7 @@ { get { - if (_L_ToolButton == null) _L_ToolButton = new ToolButton(UiPanel, Instance.GetNodeOrNull("ToolButton")); + if (_L_ToolButton == null) _L_ToolButton = new ToolButton(UiPanel, Instance.GetNode("ToolButton")); return _L_ToolButton; } } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs index 50c278b..c85cf82 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs @@ -53,7 +53,8 @@ public override void OnCreateUi() { - EditorMap = ((MapEditorPanel)ParentUi).S_TileMap; + var mapEditorPanel = (MapEditorPanel)ParentUi; + EditorMap = mapEditorPanel.S_TileMap; S_N_HoverArea.Instance.Init(this, DoorDirection.N); S_S_HoverArea.Instance.Init(this, DoorDirection.S); @@ -79,10 +80,11 @@ { EventManager.EmitEvent(EventEnum.OnSelectRectTool); })); - //编辑攻击按钮 + //编辑工具按钮 _toolGrid.Add(new ToolBtnData(true, ResourcePath.resource_sprite_ui_commonIcon_DoorTool_png, () => { EventManager.EmitEvent(EventEnum.OnSelectEditTool); + mapEditorPanel.S_MapEditorMapLayer.Instance.SetLayerVisible(MapLayer.MarkLayer, true); })); _editToolIndex = _toolGrid.Count - 1; //聚焦按钮 @@ -136,7 +138,7 @@ } _currMarkToolsMap.Clear(); //添加新的数据 - var selectPreinstall = EditorManager.SelectPreinstall; + var selectPreinstall = EditorTileMapManager.SelectPreinstall; if (selectPreinstall != null) { foreach (var markInfos in selectPreinstall.WaveList) @@ -158,8 +160,8 @@ _toolGrid.Click(_editToolIndex); } - var selectIndex = EditorManager.SelectWaveIndex; - var waveList = EditorManager.SelectPreinstall.WaveList; + var selectIndex = EditorTileMapManager.SelectWaveIndex; + var waveList = EditorTileMapManager.SelectPreinstall.WaveList; for (var i = 0; i < waveList.Count; i++) { var wave = waveList[i]; @@ -325,11 +327,11 @@ if (markTool != null) //选中当前 { ActiveMark.OnSelect(); - EditorManager.SetSelectMark(markTool.MarkInfo); + EditorTileMapManager.SetSelectMark(markTool.MarkInfo); } else { - EditorManager.SetSelectMark(null); + EditorTileMapManager.SetSelectMark(null); } } @@ -380,7 +382,7 @@ } toolInstance.Instance.QueueFree(); //派发修改数据修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } /// @@ -408,15 +410,15 @@ var ePos1 = S_E_HoverRoot.Instance.Position; var sPos1 = S_S_HoverRoot.Instance.Position; var wPos1 = S_W_HoverRoot.Instance.Position; - var nPos2 = position + GameConfig.TileCellSizeVector2I; - var ePos2 = new Vector2(position.X + size.X - GameConfig.TileCellSize, position.Y + GameConfig.TileCellSize); - var sPos2 = new Vector2(position.X + GameConfig.TileCellSize, position.Y + size.Y - GameConfig.TileCellSize); - var wPos2 = position + GameConfig.TileCellSizeVector2I; + var nPos2 = position + new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 3); + var ePos2 = new Vector2(position.X + size.X - GameConfig.TileCellSize * 2, position.Y + GameConfig.TileCellSize * 3); + var sPos2 = new Vector2(position.X + GameConfig.TileCellSize * 2, position.Y + size.Y - GameConfig.TileCellSize * 2); + var wPos2 = position + new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 3); - var nSize2 = new Vector2(size.X - GameConfig.TileCellSize * 2, S_N_HoverArea.Instance.Size.Y); - var eSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_E_HoverArea.Instance.Size.Y); - var sSize2 = new Vector2(size.X - GameConfig.TileCellSize * 2, S_S_HoverArea.Instance.Size.Y); - var wSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_W_HoverArea.Instance.Size.Y); + var nSize2 = new Vector2(size.X - GameConfig.TileCellSize * 4, S_N_HoverArea.Instance.Size.Y); + var eSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 5, S_E_HoverArea.Instance.Size.Y); + var sSize2 = new Vector2(size.X - GameConfig.TileCellSize * 4, S_S_HoverArea.Instance.Size.Y); + var wSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 5, S_W_HoverArea.Instance.Size.Y); S_N_HoverRoot.Instance.Position = nPos2; S_E_HoverRoot.Instance.Position = ePos2; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkAreaTool.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkAreaTool.cs index b52324f..877db03 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkAreaTool.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkAreaTool.cs @@ -70,7 +70,7 @@ _startWidth = _markInfo.Size.X; _startHeight = _markInfo.Size.Y; //派发修改事件 - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } IsDrag = false; } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs index bb6f72c..5090139 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs @@ -61,7 +61,7 @@ if (_startPos != pos) { _startPos = pos; - EventManager.EmitEvent(EventEnum.OnEditorDirty); + EventManager.EmitEvent(EventEnum.OnTileMapDirty); } } } diff --git a/DungeonShooting_Godot/src/game/ui/pauseMenu/PauseMenuPanel.cs b/DungeonShooting_Godot/src/game/ui/pauseMenu/PauseMenuPanel.cs index 19e06a1..2a78dc0 100644 --- a/DungeonShooting_Godot/src/game/ui/pauseMenu/PauseMenuPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/pauseMenu/PauseMenuPanel.cs @@ -15,6 +15,14 @@ { S_Exit.Instance.Text = "返回编辑器"; } + else if (World.Current is Dungeon) //在游戏地牢中 + { + S_Exit.Instance.Text = "退出地牢"; + } + else //在大厅中 + { + S_Restart.Instance.Visible = false; + } } public override void Process(float delta) @@ -28,7 +36,7 @@ //继续游戏 private void OnContinueClick() { - GameApplication.Instance.World.Pause = false; + World.Current.Pause = false; GameApplication.Instance.Cursor.SetGuiMode(false); Destroy(); } @@ -43,7 +51,11 @@ } else //正常重新开始 { - GameApplication.Instance.DungeonManager.RestartDungeon(GameApplication.Instance.DungeonConfig); + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.RestartDungeon(false, GameApplication.Instance.DungeonConfig, () => + { + UiManager.Destroy_Loading(); + }); } } @@ -55,10 +67,23 @@ { EditorPlayManager.Exit(); } - else //正常关闭Ui + else if (World.Current is Dungeon) //在游戏地牢中 { - GameApplication.Instance.DungeonManager.ExitDungeon(() => + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.ExitDungeon(false, () => { + GameApplication.Instance.DungeonManager.LoadHall(() => + { + UiManager.Destroy_Loading(); + }); + }); + } + else //在大厅中 + { + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.ExitHall(false, () => + { + UiManager.Destroy_Loading(); UiManager.Open_Main(); }); } diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs index 8668ab5..f1fd9c2 100644 --- a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs @@ -19,7 +19,7 @@ //是否放大地图 private bool _isMagnifyMap = false; - private DragBinder _dragBinder; + private UiEventBinder _dragBinder; //放大地图后拖拽的偏移 private Vector2 _mapOffset; //放大地图后鼠标悬停的房间 @@ -45,11 +45,6 @@ public override void OnDestroyUi() { _factory.RemoveAllEventListener(); - - if (_dragBinder != null) - { - _dragBinder.UnBind(); - } if (_transmissionTween != null) { @@ -126,7 +121,7 @@ sprite = _enemySpriteList[i]; } //更新标记位置 - sprite.Position = enemy.Position / 16; + sprite.Position = enemy.GetCenterPosition() / 16; } } @@ -152,27 +147,32 @@ _needRefresh.Clear(); } - //更新地图中心点位置 - if (!_isMagnifyMap) + if (Player.Current != null) { - S_Root.Instance.Position = CalcRootPosition(Player.Current.Position); - } - else - { - S_Root.Instance.Position = CalcRootPosition(Player.Current.Position) + _mapOffset; - S_Mark.Instance.Position = S_DrawContainer.Instance.Size / 2 + _mapOffset; - } + //更新地图中心点位置 + var playPosition = Player.Current.GetCenterPosition(); + if (!_isMagnifyMap) + { + S_Root.Instance.Position = CalcRootPosition(playPosition); + } + else + { + S_Root.Instance.Position = CalcRootPosition(playPosition) + _mapOffset; + S_Mark.Instance.Position = S_DrawContainer.Instance.Size / 2 + _mapOffset; + } - //传送 - if (_pressMapFlag && _mouseHoverRoom != null && - !Player.Current.AffiliationArea.RoomInfo.IsSeclusion && - Input.IsMouseButtonPressed(MouseButton.Right)) - { - //执行传送操作 - DoTransmission((_mouseHoverRoom.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize); - ResetMap(); - _isMagnifyMap = false; - World.Current.Pause = false; + var area = Player.Current.AffiliationArea; + //传送 + if (_pressMapFlag && _mouseHoverRoom != null && + area != null && !area.RoomInfo.IsSeclusion && + Input.IsMouseButtonPressed(MouseButton.Right)) + { + //执行传送操作 + DoTransmission((_mouseHoverRoom.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize); + ResetMap(); + _isMagnifyMap = false; + World.Current.Pause = false; + } } } @@ -191,8 +191,8 @@ S_MagnifyMapBar.Instance.Visible = true; S_MapBar.Instance.Visible = false; _mapOffset = Vector2.Zero; - - _dragBinder = DragUiManager.BindDrag(S_DrawContainer.Instance, (state, delta) => + + _dragBinder = S_DrawContainer.Instance.AddDragListener((state, delta) => { if (state == DragState.DragMove) { @@ -215,6 +215,7 @@ if (_dragBinder != null) { _dragBinder.UnBind(); + _dragBinder = null; } } @@ -231,6 +232,11 @@ private void InitMap() { var startRoom = GameApplication.Instance.DungeonManager.StartRoomInfo; + if (startRoom == null) + { + HideUi(); + return; + } startRoom.EachRoom(roomInfo => { //房间 @@ -248,14 +254,18 @@ var shaderMaterial = (ShaderMaterial)roomInfo.PreviewSprite.Material; _originOutlineColor = shaderMaterial.GetShaderParameter("outline_color").AsColor(); //玩家所在的房间门是否打开 - var isOpen = !Player.Current.AffiliationArea.RoomInfo.IsSeclusion; - if (isOpen) + var area = Player.Current.AffiliationArea; + if (area != null) { - shaderMaterial.SetShaderParameter("outline_color", new Color(0, 1, 0, 0.9f)); - } - else - { - shaderMaterial.SetShaderParameter("outline_color", new Color(1, 0, 0, 0.9f)); + var isOpen = !area.RoomInfo.IsSeclusion; + if (isOpen) + { + shaderMaterial.SetShaderParameter("outline_color", new Color(0, 1, 0, 0.9f)); + } + else + { + shaderMaterial.SetShaderParameter("outline_color", new Color(1, 0, 0, 0.9f)); + } } }; roomInfo.PreviewSprite.MouseExited += () => @@ -336,24 +346,24 @@ if (!flag2) //偏向过道 { if (roomDoorInfo.Direction == DoorDirection.N) - pos += new Vector2I(0, -2); + pos += new Vector2I(0, -1); else if (roomDoorInfo.Direction == DoorDirection.S) - pos += new Vector2I(0, 2); + pos += new Vector2I(0, 3); else if (roomDoorInfo.Direction == DoorDirection.E) - pos += new Vector2I(2, 0); + pos += new Vector2I(2, 1); else if (roomDoorInfo.Direction == DoorDirection.W) - pos += new Vector2I(-2, 0); + pos += new Vector2I(-2, 1); } else //偏向房间 { if (roomDoorInfo.Direction == DoorDirection.N) - pos -= new Vector2I(0, -2); + pos -= new Vector2I(0, -4); else if (roomDoorInfo.Direction == DoorDirection.S) - pos -= new Vector2I(0, 2); + pos -= new Vector2I(0, 1); else if (roomDoorInfo.Direction == DoorDirection.E) - pos -= new Vector2I(2, 0); + pos -= new Vector2I(3, -1); else if (roomDoorInfo.Direction == DoorDirection.W) - pos -= new Vector2I(-2, 0); + pos -= new Vector2I(-3, -1); } unknownSprite.Position = pos; } diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs index 3bc3dd4..104c005 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs @@ -9,15 +9,17 @@ private RoomUI.LifeBar _bar; private UiGrid _grid; private EventFactory _eventFactory; - private bool _refreshFlag = false; + private bool _refreshHpFlag = false; + private bool _refreshGoldFlag = false; public LifeBarHandler(RoomUI.LifeBar lifeBar) { _bar = lifeBar; var uiNodeLife = lifeBar.L_Life; - _grid = new UiGrid(uiNodeLife, typeof(LifeCell)); - _grid.SetColumns(20); + _grid = lifeBar.UiPanel.CreateUiGrid(uiNodeLife); + _grid.SetAutoColumns(true); + _grid.SetHorizontalExpand(true); _grid.SetCellOffset(new Vector2I(1, 2)); } @@ -28,7 +30,9 @@ _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife()); _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife()); _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife()); + _eventFactory.AddEventListener(EventEnum.OnPlayerGoldChange, o => RefreshGold()); RefreshLife(); + RefreshGold(); } public void OnHide() @@ -38,16 +42,27 @@ public void Process(float delta) { - if (_refreshFlag) + if (_refreshHpFlag) { - _refreshFlag = false; + _refreshHpFlag = false; HandlerRefreshLife(); } + + if (_refreshGoldFlag) + { + _refreshGoldFlag = false; + HandlerRefreshGold(); + } + } + + public void RefreshGold() + { + _refreshGoldFlag = true; } public void RefreshLife() { - _refreshFlag = true; + _refreshHpFlag = true; } private void HandlerRefreshLife() @@ -90,5 +105,10 @@ //var maxHp _grid.SetDataList(list.ToArray()); } + + private void HandlerRefreshGold() + { + _bar.L_Gold.L_GoldText.Instance.Text = Player.Current.RoleState.Gold.ToString(); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs b/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs index d549158..abdcd9b 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs @@ -17,19 +17,19 @@ switch (data) { case LifeIconEnum.FullHeart: - CellNode.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_full_png); + CellNode.L_LifeIcon.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_full_png); break; case LifeIconEnum.HalfHeart: - CellNode.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_half_png); + CellNode.L_LifeIcon.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_half_png); break; case LifeIconEnum.EmptyHeart: - CellNode.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_empty_png); + CellNode.L_LifeIcon.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Life_empty_png); break; case LifeIconEnum.FullShield: - CellNode.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Shield_full_png); + CellNode.L_LifeIcon.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Shield_full_png); break; case LifeIconEnum.EmptyShield: - CellNode.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Shield_empty_png); + CellNode.L_LifeIcon.Instance.Texture = ResourceManager.Load(ResourcePath.resource_sprite_ui_roomUI_Shield_empty_png); break; } } diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs index e44c0ff..93620d1 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs @@ -56,9 +56,10 @@ public void OnCameraPositionUpdate(float delta) { var player = Player.Current; - if (player.WeaponPack.ActiveItem != null && player.WeaponPack.ActiveItem.Reloading) + var activeItem = player.WeaponPack.ActiveItem; + if (activeItem != null && activeItem.Reloading && activeItem.Attribute.ShowReloadBar) { - ShowBar(player.GlobalPosition, player.WeaponPack.ActiveItem.ReloadProgress); + ShowBar(player.GlobalPosition, activeItem.ReloadProgress); } else { diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs index 64f9203..1dfdf85 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs @@ -236,34 +236,122 @@ } /// - /// 类型: , 路径: RoomUI.Control.LifeBar.Life + /// 类型: , 路径: RoomUI.Control.LifeBar.Life.LifeIcon /// - public class Life : UiNode + public class LifeIcon : UiNode { - public Life(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override Life Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public LifeIcon(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override LifeIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// - /// 类型: , 路径: RoomUI.Control.LifeBar + /// 类型: , 路径: RoomUI.Control.LifeBar.Life /// - public class LifeBar : UiNode + public class Life : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.Life + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.LifeBar.LifeIcon + /// + public LifeIcon L_LifeIcon + { + get + { + if (_L_LifeIcon == null) _L_LifeIcon = new LifeIcon(UiPanel, Instance.GetNode("LifeIcon")); + return _L_LifeIcon; + } + } + private LifeIcon _L_LifeIcon; + + public Life(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Life Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomUI.Control.LifeBar.Gold.GoldIcon + /// + public class GoldIcon : UiNode + { + public GoldIcon(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override GoldIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomUI.Control.LifeBar.Gold.GoldText + /// + public class GoldText : UiNode + { + public GoldText(RoomUIPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override GoldText Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomUI.Control.LifeBar.Gold + /// + public class Gold : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.LifeBar.GoldIcon + /// + public GoldIcon L_GoldIcon + { + get + { + if (_L_GoldIcon == null) _L_GoldIcon = new GoldIcon(UiPanel, Instance.GetNode("GoldIcon")); + return _L_GoldIcon; + } + } + private GoldIcon _L_GoldIcon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.LifeBar.GoldText + /// + public GoldText L_GoldText + { + get + { + if (_L_GoldText == null) _L_GoldText = new GoldText(UiPanel, Instance.GetNode("GoldText")); + return _L_GoldText; + } + } + private GoldText _L_GoldText; + + public Gold(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Gold Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomUI.Control.LifeBar + /// + public class LifeBar : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.Life /// public Life L_Life { get { - if (_L_Life == null) _L_Life = new Life(UiPanel, Instance.GetNode("Life")); + if (_L_Life == null) _L_Life = new Life(UiPanel, Instance.GetNode("Life")); return _L_Life; } } private Life _L_Life; - public LifeBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override LifeBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.Gold + /// + public Gold L_Gold + { + get + { + if (_L_Gold == null) _L_Gold = new Gold(UiPanel, Instance.GetNode("Gold")); + return _L_Gold; + } + } + private Gold _L_Gold; + + public LifeBar(RoomUIPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override LifeBar Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); } /// @@ -510,13 +598,13 @@ public class Control : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.LifeBar + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.LifeBar /// public LifeBar L_LifeBar { get { - if (_L_LifeBar == null) _L_LifeBar = new LifeBar(UiPanel, Instance.GetNode("LifeBar")); + if (_L_LifeBar == null) _L_LifeBar = new LifeBar(UiPanel, Instance.GetNode("LifeBar")); return _L_LifeBar; } } @@ -619,12 +707,32 @@ public ReloadBar S_ReloadBar => L_ReloadBar; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Life + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Life.LifeIcon + /// + public LifeIcon S_LifeIcon => L_Control.L_LifeBar.L_Life.L_LifeIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Life /// public Life S_Life => L_Control.L_LifeBar.L_Life; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Gold.GoldIcon + /// + public GoldIcon S_GoldIcon => L_Control.L_LifeBar.L_Gold.L_GoldIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Gold.GoldText + /// + public GoldText S_GoldText => L_Control.L_LifeBar.L_Gold.L_GoldText; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Gold + /// + public Gold S_Gold => L_Control.L_LifeBar.L_Gold; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar /// public LifeBar S_LifeBar => L_Control.L_LifeBar; diff --git a/DungeonShooting_Godot/src/game/ui/settlement/SettlementPanel.cs b/DungeonShooting_Godot/src/game/ui/settlement/SettlementPanel.cs index b0ac795..f88c7f7 100644 --- a/DungeonShooting_Godot/src/game/ui/settlement/SettlementPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/settlement/SettlementPanel.cs @@ -10,7 +10,7 @@ public override void OnCreateUi() { S_Restart.Instance.Pressed += OnRestartClick; - S_ToMenu.Instance.Pressed += OnToMenuClick; + S_ToMenu.Instance.Pressed += OnBackClick; if (GameApplication.Instance.DungeonManager.IsEditorMode) //在编辑器模式下打开的Ui { @@ -28,23 +28,31 @@ } else //正常重新开始 { - GameApplication.Instance.DungeonManager.RestartDungeon(GameApplication.Instance.DungeonConfig); + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.RestartDungeon(false, GameApplication.Instance.DungeonConfig, () => + { + UiManager.Destroy_Loading(); + }); } } - //回到主菜单 - private void OnToMenuClick() + //回到上一级 + private void OnBackClick() { Destroy(); if (GameApplication.Instance.DungeonManager.IsEditorMode) //在编辑器模式下打开的Ui { EditorPlayManager.Exit(); } - else //正常关闭Ui + else //正常关闭Ui, 回到大厅 { - GameApplication.Instance.DungeonManager.ExitDungeon(() => + UiManager.Open_Loading(); + GameApplication.Instance.DungeonManager.ExitDungeon(false, () => { - UiManager.Open_Main(); + GameApplication.Instance.DungeonManager.LoadHall(() => + { + UiManager.Destroy_Loading(); + }); }); } } diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditor.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditor.cs new file mode 100644 index 0000000..624b834 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditor.cs @@ -0,0 +1,539 @@ +namespace UI.TileSetEditor; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class TileSetEditor : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg + /// + public Bg L_Bg + { + get + { + if (_L_Bg == null) _L_Bg = new Bg((TileSetEditorPanel)this, GetNode("Bg")); + return _L_Bg; + } + } + private Bg _L_Bg; + + + public TileSetEditor() : base(nameof(TileSetEditor)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.Head.Back + /// + public class Back : UiNode + { + public Back(TileSetEditorPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Back Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.Head.Save + /// + public class Save : UiNode + { + public Save(TileSetEditorPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Save Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.Head.Title + /// + public class Title : UiNode + { + public Title(TileSetEditorPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Title Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.Head + /// + public class Head : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Back + /// + public Back L_Back + { + get + { + if (_L_Back == null) _L_Back = new Back(UiPanel, Instance.GetNode("Back")); + return _L_Back; + } + } + private Back _L_Back; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Save + /// + public Save L_Save + { + get + { + if (_L_Save == null) _L_Save = new Save(UiPanel, Instance.GetNode("Save")); + return _L_Save; + } + } + private Save _L_Save; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Title + /// + public Title L_Title + { + get + { + if (_L_Title == null) _L_Title = new Title(UiPanel, Instance.GetNode("Title")); + return _L_Title; + } + } + private Title _L_Title; + + public Head(TileSetEditorPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Head Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.Label + /// + public class Label : UiNode + { + public Label(TileSetEditorPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.AddButton + /// + public class AddButton : UiNode + { + public AddButton(TileSetEditorPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override AddButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.DeleteButton + /// + public class DeleteButton : UiNode + { + public DeleteButton(TileSetEditorPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override DeleteButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer + /// + public class HBoxContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.AddButton + /// + public AddButton L_AddButton + { + get + { + if (_L_AddButton == null) _L_AddButton = new AddButton(UiPanel, Instance.GetNode("AddButton")); + return _L_AddButton; + } + } + private AddButton _L_AddButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.DeleteButton + /// + public DeleteButton L_DeleteButton + { + get + { + if (_L_DeleteButton == null) _L_DeleteButton = new DeleteButton(UiPanel, Instance.GetNode("DeleteButton")); + return _L_DeleteButton; + } + } + private DeleteButton _L_DeleteButton; + + public HBoxContainer_1(TileSetEditorPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer_1 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.OptionButton + /// + public class OptionButton : UiNode + { + public OptionButton(TileSetEditorPanel uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } + public override OptionButton Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ColorRect + /// + public class ColorRect : UiNode + { + public ColorRect(TileSetEditorPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override ColorRect Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab.ErrorIcon + /// + public class ErrorIcon : UiNode + { + public ErrorIcon(TileSetEditorPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override ErrorIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab.Select + /// + public class Select : UiNode + { + public Select(TileSetEditorPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override Select Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab + /// + public class Tab : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.ErrorIcon + /// + public ErrorIcon L_ErrorIcon + { + get + { + if (_L_ErrorIcon == null) _L_ErrorIcon = new ErrorIcon(UiPanel, Instance.GetNode("ErrorIcon")); + return _L_ErrorIcon; + } + } + private ErrorIcon _L_ErrorIcon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Select + /// + public Select L_Select + { + get + { + if (_L_Select == null) _L_Select = new Select(UiPanel, Instance.GetNode("Select")); + return _L_Select; + } + } + private Select _L_Select; + + public Tab(TileSetEditorPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Tab Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.Tab + /// + public Tab L_Tab + { + get + { + if (_L_Tab == null) _L_Tab = new Tab(UiPanel, Instance.GetNode("Tab")); + return _L_Tab; + } + } + private Tab _L_Tab; + + public ScrollContainer(TileSetEditorPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer + /// + public class VBoxContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.HBoxContainer + /// + public HBoxContainer_1 L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer_1(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer_1 _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.OptionButton + /// + public OptionButton L_OptionButton + { + get + { + if (_L_OptionButton == null) _L_OptionButton = new OptionButton(UiPanel, Instance.GetNode("OptionButton")); + return _L_OptionButton; + } + } + private OptionButton _L_OptionButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.ColorRect + /// + public ColorRect L_ColorRect + { + get + { + if (_L_ColorRect == null) _L_ColorRect = new ColorRect(UiPanel, Instance.GetNode("ColorRect")); + return _L_ColorRect; + } + } + private ColorRect _L_ColorRect; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public VBoxContainer_1(TileSetEditorPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer_1 Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot + /// + public class LeftRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.VBoxContainer + /// + public VBoxContainer_1 L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer_1(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer_1 _L_VBoxContainer; + + public LeftRoot(TileSetEditorPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override LeftRoot Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.RightRoot + /// + public class RightRoot : UiNode + { + public RightRoot(TileSetEditorPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override RightRoot Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.LeftRoot + /// + public LeftRoot L_LeftRoot + { + get + { + if (_L_LeftRoot == null) _L_LeftRoot = new LeftRoot(UiPanel, Instance.GetNode("LeftRoot")); + return _L_LeftRoot; + } + } + private LeftRoot _L_LeftRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.RightRoot + /// + public RightRoot L_RightRoot + { + get + { + if (_L_RightRoot == null) _L_RightRoot = new RightRoot(UiPanel, Instance.GetNode("RightRoot")); + return _L_RightRoot; + } + } + private RightRoot _L_RightRoot; + + public HBoxContainer(TileSetEditorPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.Head + /// + public Head L_Head + { + get + { + if (_L_Head == null) _L_Head = new Head(UiPanel, Instance.GetNode("Head")); + return _L_Head; + } + } + private Head _L_Head; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.Bg.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + public VBoxContainer(TileSetEditorPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditor.Bg + /// + public class Bg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditor.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public Bg(TileSetEditorPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Bg Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Head.Back + /// + public Back S_Back => L_Bg.L_VBoxContainer.L_Head.L_Back; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Head.Save + /// + public Save S_Save => L_Bg.L_VBoxContainer.L_Head.L_Save; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Head.Title + /// + public Title S_Title => L_Bg.L_VBoxContainer.L_Head.L_Title; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.Head + /// + public Head S_Head => L_Bg.L_VBoxContainer.L_Head; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.Label + /// + public Label S_Label => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_HBoxContainer.L_Label; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.AddButton + /// + public AddButton S_AddButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_HBoxContainer.L_AddButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.HBoxContainer.DeleteButton + /// + public DeleteButton S_DeleteButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_HBoxContainer.L_DeleteButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.OptionButton + /// + public OptionButton S_OptionButton => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_OptionButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ColorRect + /// + public ColorRect S_ColorRect => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_ColorRect; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab.ErrorIcon + /// + public ErrorIcon S_ErrorIcon => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_ScrollContainer.L_Tab.L_ErrorIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab.Select + /// + public Select S_Select => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_ScrollContainer.L_Tab.L_Select; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer.Tab + /// + public Tab S_Tab => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_ScrollContainer.L_Tab; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot.VBoxContainer.ScrollContainer + /// + public ScrollContainer S_ScrollContainer => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot.L_VBoxContainer.L_ScrollContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.LeftRoot + /// + public LeftRoot S_LeftRoot => L_Bg.L_VBoxContainer.L_HBoxContainer.L_LeftRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg.VBoxContainer.HBoxContainer.RightRoot + /// + public RightRoot S_RightRoot => L_Bg.L_VBoxContainer.L_HBoxContainer.L_RightRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditor.Bg + /// + public Bg S_Bg => L_Bg; + +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs new file mode 100644 index 0000000..2665850 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs @@ -0,0 +1,374 @@ +using System.Linq; +using Godot; + +namespace UI.TileSetEditor; + +public partial class TileSetEditorPanel : TileSetEditor +{ + /// + /// 数据是否脏了 + /// + public bool IsDirty { get; private set; } + + /// + /// 编辑使用的 tileSetSplit 数据 + /// + public TileSetSplit TileSetSplit { get; private set; } + + /// + /// 编辑使用的 tileSetInfo 数据 + /// + public TileSetInfo TileSetInfo { get; private set; } + + /// + /// 当前正在使用的 TileSetSourceInfo 数据 + /// + public TileSetSourceInfo TileSetSourceInfo { get; private set; } + + /// + /// 当前正在使用的 TileSetSourceInfo 的索引 + /// + public int TileSetSourceIndex { get; private set; } + + /// + /// 是否初始化过纹理 + /// + public bool InitTexture { get; private set; } + + /// + /// 纹理 + /// + public ImageTexture Texture { get; private set; } + + /// + /// 纹理的Image对象 + /// + public Image TextureImage { get; private set; } + + /// + /// 背景颜色 + /// + public Color BgColor { get; private set; } = new Color(0.14f, 0.14f, 0.14f, 1); + + /// + /// Cell 横轴数量 + /// + public int CellHorizontal { get; private set; } + + /// + /// Cell 纵轴数量 + /// + public int CellVertical { get; private set; } + + /// + /// 页签对象 + /// + public UiGrid TabGrid { get; private set; } + + private Image _emptyImage; + + public override void OnCreateUi() + { + _emptyImage = Image.Create(1, 1, false, Image.Format.Rgba8); + Texture = new ImageTexture(); + Texture.SetImage(_emptyImage); + S_Back.Instance.Visible = PrevUi != null; + S_Back.Instance.Pressed += OnBackClick; + + TabGrid = new UiGrid(S_Tab, typeof(TileSetEditorTabCell)); + TabGrid.SetHorizontalExpand(true); + TabGrid.SetCellOffset(new Vector2I(0, 5)); + TabGrid.Add(new TileSetEditorTabData() + { + Text = "纹理", + UiName = UiManager.UiNames.TileSetEditorImport, + }); + TabGrid.Add(new TileSetEditorTabData() + { + Text = "地形", + UiName = UiManager.UiNames.TileSetEditorTerrain, + }); + TabGrid.Add(new TileSetEditorTabData() + { + Text = "组合", + UiName = UiManager.UiNames.TileSetEditorCombination, + }); + TabGrid.Visible = false; + + S_DeleteButton.Instance.Pressed += OnDeleteSourceClick; + S_AddButton.Instance.Pressed += OnAddSourceClick; + S_OptionButton.Instance.ItemSelected += OnOptionChange; + S_Save.Instance.Pressed += OnSaveClick; + AddEventListener(EventEnum.OnTileSetDirty, OnTileSetDirty); + } + + public override void OnDestroyUi() + { + TabGrid.Destroy(); + if (Texture != null) + { + Texture.Dispose(); + } + + _emptyImage.Dispose(); + TextureImage = null; + + if (TileSetInfo != null) + { + TileSetInfo.Destroy(); + } + } + + public override void Process(float delta) + { + if (TabGrid.Visible && TileSetSourceInfo != null) + { + //纹理红点 + ((TileSetEditorTabCell)TabGrid.GetCell(0)).CellNode.L_ErrorIcon.Instance.Visible = !InitTexture; + //地形红点 + var terrainTab = (TileSetEditorTabCell)TabGrid.GetCell(1); + var flag = true; + foreach (var terrainInfo in TileSetSourceInfo.Terrain) + { + if (!terrainInfo.Ready) + { + flag = false; + break; + } + } + terrainTab.CellNode.L_ErrorIcon.Instance.Visible = !flag; + } + } + + /// + /// 初始化数据 + /// + public void InitData(TileSetSplit tileSetSplit) + { + IsDirty = false; + tileSetSplit.ReloadTileSetInfo(); + TileSetSplit = tileSetSplit; + TileSetInfo = tileSetSplit.TileSetInfo.Clone(); + RefreshTitle(); + + //初始化下拉框 + if (TileSetInfo.Sources.Count > 0) + { + var optionButton = S_OptionButton.Instance; + foreach (var tileSetSourceInfo in TileSetInfo.Sources) + { + optionButton.AddItem(tileSetSourceInfo.Name); + } + + optionButton.Selected = 0; + OnOptionChange(0); + } + } + + //设置标题显示内容 + private void RefreshTitle() + { + if (IsDirty) + { + S_Title.Instance.Text = "正在编辑:" + TileSetInfo.Name + "*"; + } + else + { + S_Title.Instance.Text = "正在编辑:" + TileSetInfo.Name; + } + } + + /// + /// 设置纹理使用的纹理 + /// + public void SetTextureData(Image image) + { + if (image == null) + { + InitTexture = false; + TextureImage = null; + Texture.SetImage(_emptyImage); + CellHorizontal = 0; + CellVertical = 0; + } + else + { + if (TileSetSourceInfo == null) + { + return; + } + + InitTexture = true; + Texture.SetImage(image); + TextureImage = image; + CellHorizontal = image.GetWidth() / GameConfig.TileCellSize; + CellVertical = image.GetHeight() / GameConfig.TileCellSize; + } + //派发事件 + EventManager.EmitEvent(EventEnum.OnSetTileTexture, Texture); + } + + /// + /// 设置背景颜色 + /// + public void SetBgColor(Color color) + { + BgColor = color; + + //派发事件 + EventManager.EmitEvent(EventEnum.OnSetTileSetBgColor, color); + } + + /// + /// 将二维位置转换为索引的函数 + /// + public int CellPositionToIndex(Vector2I pos) + { + return pos.Y * CellHorizontal + pos.X; + } + + /// + /// 返回Cell的坐标是否在纹理区域内 + /// + public bool IsCellPositionInTexture(Vector2I cell) + { + return cell.X >= 0 && cell.Y >= 0 && cell.X < CellHorizontal && cell.Y < CellVertical; + } + + //返回上一级按钮点击 + private void OnBackClick() + { + if (IsDirty) + { + EditorWindowManager.ShowConfirm("提示", "当前TileSet修改的数据还未保存,是否退出编辑?", + "保存并退出", "直接退出", "取消" + , index => + { + if (index == 0) //保存并退出 + { + OnSaveClick(); + OpenPrevUi(); + } + else if (index == 1) //直接退出 + { + OpenPrevUi(); + } + } + ); + } + else + { + OpenPrevUi(); + } + } + + //删除资源 + private void OnDeleteSourceClick() + { + var optionButton = S_OptionButton.Instance; + var selectIndex = optionButton.Selected; + if (selectIndex == 0) + { + EditorWindowManager.ShowTips("警告", "不允许删除 Main Source!"); + return; + } + else if (selectIndex > 0) + { + EditorWindowManager.ShowConfirm("提示", "是否需要删除该资源!", v => + { + if (v) + { + var name = optionButton.GetItemText(selectIndex); + var findIndex = TileSetInfo.Sources.FindIndex(info => info.Name == name); + if (findIndex >= 0) + { + TileSetInfo.Sources[findIndex].Destroy(); + TileSetInfo.Sources.RemoveAt(findIndex); + } + + var index = optionButton.ItemCount - 2; + optionButton.RemoveItem(selectIndex); + optionButton.Selected = index; + OnOptionChange(index); + + //标记数据脏了 + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + }); + } + else + { + EditorWindowManager.ShowTips("提示", "请选择需要删除的资源!"); + } + } + + //创建资源 + private void OnAddSourceClick() + { + EditorWindowManager.ShowInput("创建资源", "资源名称:", null, (value, isSubmit) => + { + if (isSubmit) + { + if (TileSetInfo.Sources.FindIndex(info => info.Name == value) >= 0) + { + EditorWindowManager.ShowTips("错误", "该资源名称已存在!"); + return false; + } + + var source = new TileSetSourceInfo(); + source.InitData(); + source.Name = value; + TileSetInfo.Sources.Add(source); + + EventManager.EmitEvent(EventEnum.OnCreateTileSetSource, source); + var optionButton = S_OptionButton.Instance; + optionButton.AddItem(value); + var selectIndex = optionButton.ItemCount - 1; + optionButton.Selected = selectIndex; + OnOptionChange(selectIndex); + } + + return true; + }); + } + + //选中资源 + private void OnOptionChange(long index) + { + if (index >= 0) + { + TabGrid.Visible = true; + TabGrid.SelectIndex = 0; + TileSetSourceInfo = TileSetInfo.Sources[(int)index]; + TileSetSourceIndex = (int)index; + SetTextureData(TileSetSourceInfo.GetSourceImage()); + } + else + { + TabGrid.Visible = false; + TabGrid.SelectIndex = -1; + TileSetSourceInfo = null; + TileSetSourceIndex = -1; + SetTextureData(null); + } + + //派发选择资源事件 + EventManager.EmitEvent(EventEnum.OnSelectTileSetSource, TileSetSourceInfo); + } + + //保存 + private void OnSaveClick() + { + TileSetSplit.SetTileSetInfo(TileSetInfo.Clone()); + EventManager.EmitEvent(EventEnum.OnTileSetSave, TileSetSplit); + IsDirty = false; + RefreshTitle(); + } + + //数据脏了 + private void OnTileSetDirty(object obj) + { + IsDirty = true; + RefreshTitle(); + } +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabCell.cs new file mode 100644 index 0000000..58cbd98 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabCell.cs @@ -0,0 +1,31 @@ +namespace UI.TileSetEditor; + +public class TileSetEditorTabCell : UiCell +{ + private UiBase _uiInstance; + + public override void OnInit() + { + CellNode.L_Select.Instance.Visible = false; + CellNode.L_ErrorIcon.Instance.Visible = false; + } + + public override void OnSetData(TileSetEditorTabData data) + { + CellNode.Instance.Text = data.Text; + _uiInstance = CellNode.UiPanel.S_RightRoot.OpenNestedUi(data.UiName); + _uiInstance.HideUi(); + } + + public override void OnSelect() + { + CellNode.L_Select.Instance.Visible = true; + _uiInstance.ShowUi(); + } + + public override void OnUnSelect() + { + CellNode.L_Select.Instance.Visible = false; + _uiInstance.HideUi(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabData.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabData.cs new file mode 100644 index 0000000..414f15a --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorTabData.cs @@ -0,0 +1,17 @@ +namespace UI.TileSetEditor; + +/// +/// 页签数据 +/// +public class TileSetEditorTabData +{ + /// + /// 显示文本 + /// + public string Text; + + /// + /// 打开的Ui + /// + public string UiName; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombination.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombination.cs new file mode 100644 index 0000000..765eea6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombination.cs @@ -0,0 +1,824 @@ +namespace UI.TileSetEditorCombination; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class TileSetEditorCombination : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer + /// + public HSplitContainer L_HSplitContainer + { + get + { + if (_L_HSplitContainer == null) _L_HSplitContainer = new HSplitContainer((TileSetEditorCombinationPanel)this, GetNode("HSplitContainer")); + return _L_HSplitContainer; + } + } + private HSplitContainer _L_HSplitContainer; + + + public TileSetEditorCombination() : base(nameof(TileSetEditorCombination)) + { + } + + public sealed override void OnInitNestedUi() + { + _ = L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg; + _ = L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg; + _ = L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg; + + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.CanvasRoot + /// + public class CanvasRoot : UiNode + { + public CanvasRoot(TileSetEditorCombinationPanel uiPanel, Godot.Node2D node) : base(uiPanel, node) { } + public override CanvasRoot Clone() => new (UiPanel, (Godot.Node2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.BrushRoot + /// + public class BrushRoot : UiNode + { + public BrushRoot(TileSetEditorCombinationPanel uiPanel, Godot.Node2D node) : base(uiPanel, node) { } + public override BrushRoot Clone() => new (UiPanel, (Godot.Node2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.RectBrush + /// + public class RectBrush : UiNode + { + public RectBrush(TileSetEditorCombinationPanel uiPanel, UI.TileSetEditorCombination.RectBrush node) : base(uiPanel, node) { } + public override RectBrush Clone() => new (UiPanel, (UI.TileSetEditorCombination.RectBrush)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot + /// + public class CombinationRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CanvasRoot + /// + public CanvasRoot L_CanvasRoot + { + get + { + if (_L_CanvasRoot == null) _L_CanvasRoot = new CanvasRoot(UiPanel, Instance.GetNode("CanvasRoot")); + return _L_CanvasRoot; + } + } + private CanvasRoot _L_CanvasRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.BrushRoot + /// + public BrushRoot L_BrushRoot + { + get + { + if (_L_BrushRoot == null) _L_BrushRoot = new BrushRoot(UiPanel, Instance.GetNode("BrushRoot")); + return _L_BrushRoot; + } + } + private BrushRoot _L_BrushRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.RectBrush + /// + public RectBrush L_RectBrush + { + get + { + if (_L_RectBrush == null) _L_RectBrush = new RectBrush(UiPanel, Instance.GetNode("RectBrush")); + return _L_RectBrush; + } + } + private RectBrush _L_RectBrush; + + public CombinationRoot(TileSetEditorCombinationPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override CombinationRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.Grid + /// + public class Grid : UiNode + { + public Grid(TileSetEditorCombinationPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Grid Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.FocusBtn + /// + public class FocusBtn : UiNode + { + public FocusBtn(TileSetEditorCombinationPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.DeleteBtn + /// + public class DeleteBtn : UiNode + { + public DeleteBtn(TileSetEditorCombinationPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override DeleteBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.ImportBtn + /// + public class ImportBtn : UiNode + { + public ImportBtn(TileSetEditorCombinationPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override ImportBtn Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg + /// + public class LeftTopBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.CombinationRoot + /// + public CombinationRoot L_CombinationRoot + { + get + { + if (_L_CombinationRoot == null) _L_CombinationRoot = new CombinationRoot(UiPanel, Instance.GetNode("CombinationRoot")); + return _L_CombinationRoot; + } + } + private CombinationRoot _L_CombinationRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.Grid + /// + public Grid L_Grid + { + get + { + if (_L_Grid == null) _L_Grid = new Grid(UiPanel, Instance.GetNode("Grid")); + return _L_Grid; + } + } + private Grid _L_Grid; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.FocusBtn + /// + public FocusBtn L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn _L_FocusBtn; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.DeleteBtn + /// + public DeleteBtn L_DeleteBtn + { + get + { + if (_L_DeleteBtn == null) _L_DeleteBtn = new DeleteBtn(UiPanel, Instance.GetNode("DeleteBtn")); + return _L_DeleteBtn; + } + } + private DeleteBtn _L_DeleteBtn; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.ImportBtn + /// + public ImportBtn L_ImportBtn + { + get + { + if (_L_ImportBtn == null) _L_ImportBtn = new ImportBtn(UiPanel, Instance.GetNode("ImportBtn")); + return _L_ImportBtn; + } + } + private ImportBtn _L_ImportBtn; + + public LeftTopBg(TileSetEditorCombinationPanel uiPanel, UI.TileSetEditorCombination.TileEditCombination node) : base(uiPanel, node) { } + public override LeftTopBg Clone() => new (UiPanel, (UI.TileSetEditorCombination.TileEditCombination)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.LeftTopBg + /// + public LeftTopBg L_LeftTopBg + { + get + { + if (_L_LeftTopBg == null) _L_LeftTopBg = new LeftTopBg(UiPanel, Instance.GetNode("LeftTopBg")); + return _L_LeftTopBg; + } + } + private LeftTopBg _L_LeftTopBg; + + public MarginContainer(TileSetEditorCombinationPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop + /// + public class LeftTop : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer(UiPanel, Instance.GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + public LeftTop(TileSetEditorCombinationPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override LeftTop Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskRoot.MaskRect + /// + public class MaskRect : UiNode + { + public MaskRect(TileSetEditorCombinationPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override MaskRect Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskRoot + /// + public class MaskRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskRect + /// + public MaskRect L_MaskRect + { + get + { + if (_L_MaskRect == null) _L_MaskRect = new MaskRect(UiPanel, Instance.GetNode("MaskRect")); + return _L_MaskRect; + } + } + private MaskRect _L_MaskRect; + + public MaskRoot(TileSetEditorCombinationPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override MaskRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskBrush + /// + public class MaskBrush : UiNode + { + public MaskBrush(TileSetEditorCombinationPanel uiPanel, EditorMaskBrush node) : base(uiPanel, node) { } + public override MaskBrush Clone() => new (UiPanel, (EditorMaskBrush)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture + /// + public class TileTexture : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.MaskRoot + /// + public MaskRoot L_MaskRoot + { + get + { + if (_L_MaskRoot == null) _L_MaskRoot = new MaskRoot(UiPanel, Instance.GetNode("MaskRoot")); + return _L_MaskRoot; + } + } + private MaskRoot _L_MaskRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.MaskBrush + /// + public MaskBrush L_MaskBrush + { + get + { + if (_L_MaskBrush == null) _L_MaskBrush = new MaskBrush(UiPanel, Instance.GetNode("MaskBrush")); + return _L_MaskBrush; + } + } + private MaskBrush _L_MaskBrush; + + public TileTexture(TileSetEditorCombinationPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TileTexture Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.Grid + /// + public class Grid_1 : UiNode + { + public Grid_1(TileSetEditorCombinationPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Grid_1 Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.FocusBtn + /// + public class FocusBtn_1 : UiNode + { + public FocusBtn_1(TileSetEditorCombinationPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn_1 Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg + /// + public class LeftBottomBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.TileTexture + /// + public TileTexture L_TileTexture + { + get + { + if (_L_TileTexture == null) _L_TileTexture = new TileTexture(UiPanel, Instance.GetNode("TileTexture")); + return _L_TileTexture; + } + } + private TileTexture _L_TileTexture; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.Grid + /// + public Grid_1 L_Grid + { + get + { + if (_L_Grid == null) _L_Grid = new Grid_1(UiPanel, Instance.GetNode("Grid")); + return _L_Grid; + } + } + private Grid_1 _L_Grid; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.FocusBtn + /// + public FocusBtn_1 L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn_1(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn_1 _L_FocusBtn; + + public LeftBottomBg(TileSetEditorCombinationPanel uiPanel, UI.TileSetEditorCombination.TileEditArea node) : base(uiPanel, node) { } + public override LeftBottomBg Clone() => new (UiPanel, (UI.TileSetEditorCombination.TileEditArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer + /// + public class MarginContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.LeftBottomBg + /// + public LeftBottomBg L_LeftBottomBg + { + get + { + if (_L_LeftBottomBg == null) _L_LeftBottomBg = new LeftBottomBg(UiPanel, Instance.GetNode("LeftBottomBg")); + return _L_LeftBottomBg; + } + } + private LeftBottomBg _L_LeftBottomBg; + + public MarginContainer_1(TileSetEditorCombinationPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer_1 Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom + /// + public class LeftBottom : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.MarginContainer + /// + public MarginContainer_1 L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer_1(UiPanel, Instance.GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer_1 _L_MarginContainer; + + public LeftBottom(TileSetEditorCombinationPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override LeftBottom Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.VSplitContainer + /// + public class VSplitContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.LeftTop + /// + public LeftTop L_LeftTop + { + get + { + if (_L_LeftTop == null) _L_LeftTop = new LeftTop(UiPanel, Instance.GetNode("LeftTop")); + return _L_LeftTop; + } + } + private LeftTop _L_LeftTop; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.LeftBottom + /// + public LeftBottom L_LeftBottom + { + get + { + if (_L_LeftBottom == null) _L_LeftBottom = new LeftBottom(UiPanel, Instance.GetNode("LeftBottom")); + return _L_LeftBottom; + } + } + private LeftBottom _L_LeftBottom; + + public VSplitContainer(TileSetEditorCombinationPanel uiPanel, Godot.VSplitContainer node) : base(uiPanel, node) { } + public override VSplitContainer Clone() => new (UiPanel, (Godot.VSplitContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.Label + /// + public class Label : UiNode + { + public Label(TileSetEditorCombinationPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.PreviewImage + /// + public class PreviewImage : UiNode + { + public PreviewImage(TileSetEditorCombinationPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override PreviewImage Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.CellName + /// + public class CellName : UiNode + { + public CellName(TileSetEditorCombinationPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override CellName Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.SelectTexture + /// + public class SelectTexture : UiNode + { + public SelectTexture(TileSetEditorCombinationPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override SelectTexture Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton + /// + public class CellButton : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.PreviewImage + /// + public PreviewImage L_PreviewImage + { + get + { + if (_L_PreviewImage == null) _L_PreviewImage = new PreviewImage(UiPanel, Instance.GetNode("PreviewImage")); + return _L_PreviewImage; + } + } + private PreviewImage _L_PreviewImage; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellName + /// + public CellName L_CellName + { + get + { + if (_L_CellName == null) _L_CellName = new CellName(UiPanel, Instance.GetNode("CellName")); + return _L_CellName; + } + } + private CellName _L_CellName; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.SelectTexture + /// + public SelectTexture L_SelectTexture + { + get + { + if (_L_SelectTexture == null) _L_SelectTexture = new SelectTexture(UiPanel, Instance.GetNode("SelectTexture")); + return _L_SelectTexture; + } + } + private SelectTexture _L_SelectTexture; + + public CellButton(TileSetEditorCombinationPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override CellButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.CellButton + /// + public CellButton L_CellButton + { + get + { + if (_L_CellButton == null) _L_CellButton = new CellButton(UiPanel, Instance.GetNode("CellButton")); + return _L_CellButton; + } + } + private CellButton _L_CellButton; + + public ScrollContainer(TileSetEditorCombinationPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg + /// + public class RightBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public RightBg(TileSetEditorCombinationPanel uiPanel, UI.TileSetEditorCombination.TileSelected node) : base(uiPanel, node) { } + public override RightBg Clone() => new (UiPanel, (UI.TileSetEditorCombination.TileSelected)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer + /// + public class MarginContainer_2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.RightBg + /// + public RightBg L_RightBg + { + get + { + if (_L_RightBg == null) _L_RightBg = new RightBg(UiPanel, Instance.GetNode("RightBg")); + return _L_RightBg; + } + } + private RightBg _L_RightBg; + + public MarginContainer_2(TileSetEditorCombinationPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer_2 Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer.Right + /// + public class Right : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.MarginContainer + /// + public MarginContainer_2 L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer_2(UiPanel, Instance.GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer_2 _L_MarginContainer; + + public Right(TileSetEditorCombinationPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Right Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorCombination.HSplitContainer + /// + public class HSplitContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.VSplitContainer + /// + public VSplitContainer L_VSplitContainer + { + get + { + if (_L_VSplitContainer == null) _L_VSplitContainer = new VSplitContainer(UiPanel, Instance.GetNode("VSplitContainer")); + return _L_VSplitContainer; + } + } + private VSplitContainer _L_VSplitContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorCombination.Right + /// + public Right L_Right + { + get + { + if (_L_Right == null) _L_Right = new Right(UiPanel, Instance.GetNode("Right")); + return _L_Right; + } + } + private Right _L_Right; + + public HSplitContainer(TileSetEditorCombinationPanel uiPanel, Godot.HSplitContainer node) : base(uiPanel, node) { } + public override HSplitContainer Clone() => new (UiPanel, (Godot.HSplitContainer)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.CanvasRoot + /// + public CanvasRoot S_CanvasRoot => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_CombinationRoot.L_CanvasRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.BrushRoot + /// + public BrushRoot S_BrushRoot => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_CombinationRoot.L_BrushRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot.RectBrush + /// + public RectBrush S_RectBrush => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_CombinationRoot.L_RectBrush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.CombinationRoot + /// + public CombinationRoot S_CombinationRoot => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_CombinationRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.DeleteBtn + /// + public DeleteBtn S_DeleteBtn => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_DeleteBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg.ImportBtn + /// + public ImportBtn S_ImportBtn => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg.L_ImportBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop.MarginContainer.LeftTopBg + /// + public LeftTopBg S_LeftTopBg => L_HSplitContainer.L_VSplitContainer.L_LeftTop.L_MarginContainer.L_LeftTopBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftTop + /// + public LeftTop S_LeftTop => L_HSplitContainer.L_VSplitContainer.L_LeftTop; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskRoot.MaskRect + /// + public MaskRect S_MaskRect => L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg.L_TileTexture.L_MaskRoot.L_MaskRect; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskRoot + /// + public MaskRoot S_MaskRoot => L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg.L_TileTexture.L_MaskRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture.MaskBrush + /// + public MaskBrush S_MaskBrush => L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg.L_TileTexture.L_MaskBrush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg.TileTexture + /// + public TileTexture S_TileTexture => L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg.L_TileTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom.MarginContainer.LeftBottomBg + /// + public LeftBottomBg S_LeftBottomBg => L_HSplitContainer.L_VSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBottomBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer.LeftBottom + /// + public LeftBottom S_LeftBottom => L_HSplitContainer.L_VSplitContainer.L_LeftBottom; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.VSplitContainer + /// + public VSplitContainer S_VSplitContainer => L_HSplitContainer.L_VSplitContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.Label + /// + public Label S_Label => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_Label; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.PreviewImage + /// + public PreviewImage S_PreviewImage => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_ScrollContainer.L_CellButton.L_PreviewImage; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.CellName + /// + public CellName S_CellName => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_ScrollContainer.L_CellButton.L_CellName; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton.SelectTexture + /// + public SelectTexture S_SelectTexture => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_ScrollContainer.L_CellButton.L_SelectTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer.CellButton + /// + public CellButton S_CellButton => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_ScrollContainer.L_CellButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg.ScrollContainer + /// + public ScrollContainer S_ScrollContainer => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg.L_ScrollContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right.MarginContainer.RightBg + /// + public RightBg S_RightBg => L_HSplitContainer.L_Right.L_MarginContainer.L_RightBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer.Right + /// + public Right S_Right => L_HSplitContainer.L_Right; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorCombination.HSplitContainer + /// + public HSplitContainer S_HSplitContainer => L_HSplitContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombinationPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombinationPanel.cs new file mode 100644 index 0000000..38ff3c8 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/TileSetEditorCombinationPanel.cs @@ -0,0 +1,85 @@ +using Godot; +using UI.TileSetEditor; + +namespace UI.TileSetEditorCombination; + +public partial class TileSetEditorCombinationPanel : TileSetEditorCombination +{ + /// + /// 父Ui + /// + public TileSetEditorPanel EditorPanel; + + public override void OnCreateUi() + { + EditorPanel = (TileSetEditorPanel)ParentUi; + + //改变选中资源事件 + AddEventListener(EventEnum.OnSelectTileSetSource, OnSelectTileSetSource); + //改变纹理事件 + AddEventListener(EventEnum.OnSetTileTexture, OnSetTileTexture); + //改变背景颜色事件 + AddEventListener(EventEnum.OnSetTileSetBgColor, OnSetTileSetBgColor); + OnSetTileSetBgColor(EditorPanel.BgColor); + } + + public override void OnShowUi() + { + if (EditorPanel.Texture == null) + { + EditorWindowManager.ShowTips("警告", "请先导入纹理!", () => + { + EditorPanel.TabGrid.SelectIndex = 0; + }); + } + } + + public override void OnDestroyUi() + { + + } + + //改变选中资源事件 + private void OnSelectTileSetSource(object obj) + { + //取消选中组合 + S_LeftBottomBg.Instance.ClearSelectCell(); + //清除绘制的组合 + S_LeftTopBg.Instance.ClearAllCell(); + //清除gird中的组合 + var grid = S_RightBg.Instance.Grid; + grid.RemoveAll(); + if (obj != null) + { + //grid加载组合 + var sourceInfo = (TileSetSourceInfo)obj; + foreach (var combinationInfo in sourceInfo.Combination) + { + var src = EditorPanel.TextureImage; + var previewImage = ImportCombinationData.GetPreviewTexture(src, combinationInfo.Cells, combinationInfo.Positions); + grid.Add(new ImportCombinationData(ImageTexture.CreateFromImage(previewImage), combinationInfo)); + } + } + } + + //改变TileSet纹理 + private void OnSetTileTexture(object arg) + { + S_LeftBottomBg.Instance.OnChangeTileSetTexture(); + if (EditorPanel.InitTexture) + { + S_RightBg.Instance.OnChangeTileSetTexture(); + } + } + + //改变TileSet背景颜色 + private void OnSetTileSetBgColor(object arg) + { + //背景颜色 + if (arg is Color color) + { + S_LeftTopBg.Instance.Color = color; + S_LeftBottomBg.Instance.Color = color; + } + } +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/MaskRectCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/MaskRectCell.cs new file mode 100644 index 0000000..b5dc879 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/MaskRectCell.cs @@ -0,0 +1,37 @@ +using Godot; + +namespace UI.TileSetEditorCombination; + +public class MaskRectCell : UiCell +{ + public override void OnInit() + { + CellNode.Instance.Draw += OnDraw; + } + + public override void OnSetData(bool data) + { + //选择当前cell时显示透明颜色 + CellNode.Instance.Color = data ? new Color(0, 0, 0, 0) : new Color(0, 0, 0, 0.7f); + } + + public override void Process(float delta) + { + if (Data) + { + CellNode.Instance.QueueRedraw(); + } + } + + private void OnDraw() + { + if (Data) + { + //选中时绘制轮廓 + CellNode.Instance.DrawRect( + new Rect2(Vector2.Zero, CellNode.Instance.Size), + new Color(0, 1, 1), false, 2f / CellNode.UiPanel.S_TileTexture.Instance.Scale.X + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/TileEditArea.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/TileEditArea.cs new file mode 100644 index 0000000..3dda271 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftBottom/TileEditArea.cs @@ -0,0 +1,158 @@ +using System.Collections.Generic; +using Godot; + +namespace UI.TileSetEditorCombination; + +public partial class TileEditArea : EditorGridBg +{ + public new TileSetEditorCombination.LeftBottomBg UiNode => (TileSetEditorCombination.LeftBottomBg)base.UiNode; + + private UiGrid _maskGrid; + private readonly HashSet _useMask = new HashSet(); + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + InitNode(UiNode.L_TileTexture.Instance, UiNode.L_Grid.Instance); + UiNode.L_TileTexture.Instance.Texture = UiNode.UiPanel.EditorPanel.Texture; + var maskBrush = UiNode.L_TileTexture.L_MaskBrush.Instance; + maskBrush.Init(UiNode.L_TileTexture.Instance, UiNode.UiPanel.EditorPanel); + + _maskGrid = new UiGrid(UiNode.L_TileTexture.L_MaskRoot.L_MaskRect, typeof(MaskRectCell)); + _maskGrid.SetCellOffset(Vector2I.Zero); + _maskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore; + + //聚焦按钮点击 + UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; + } + + public override void OnDestroy() + { + base.OnDestroy(); + _maskGrid.Destroy(); + } + + public override void _GuiInput(InputEvent @event) + { + base._GuiInput(@event); + if (@event is InputEventMouse) + { + AcceptEvent(); + if (Input.IsMouseButtonPressed(MouseButton.Left)) //左键选中 + { + var cellPosition = GetMouseCellPosition(); + if (UiNode.UiPanel.EditorPanel.IsCellPositionInTexture(cellPosition)) + { + if (Input.IsActionJustPressed(InputAction.MouseLeft)) //刚按下, 清除之前的选中 + { + ClearSelectCell(); + } + OnSelectCell(cellPosition); + } + } + else if (Input.IsMouseButtonPressed(MouseButton.Right)) //右键键擦除 + { + var cellPosition = GetMouseCellPosition(); + if (UiNode.UiPanel.EditorPanel.IsCellPositionInTexture(cellPosition)) + { + OnRemoveCell(cellPosition); + } + } + } + } + + //聚焦按钮点击 + private void OnFocusClick() + { + var texture = UiNode.L_TileTexture.Instance.Texture; + Utils.DoFocusNode(ContainerRoot, Size, texture != null ? texture.GetSize() : Vector2.Zero); + RefreshGridTrans(); + } + + /// + /// 选中Cell图块 + /// + private void OnSelectCell(Vector2I cell) + { + if (!_useMask.Contains(cell)) + { + var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell); + var uiCell = _maskGrid.GetCell(cellIndex); + if (uiCell != null && !uiCell.Data) + { + _useMask.Add(cell); + uiCell.SetData(true); + + EventManager.EmitEvent(EventEnum.OnSelectCombinationCell, cell); + } + } + } + + /// + /// 移除指定的Cell图块 + /// + private void OnRemoveCell(Vector2I cell) + { + if (_useMask.Contains(cell)) + { + var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell); + var uiCell = _maskGrid.GetCell(cellIndex); + if (uiCell != null && uiCell.Data) + { + _useMask.Remove(cell); + uiCell.SetData(false); + + EventManager.EmitEvent(EventEnum.OnRemoveCombinationCell, cell); + } + } + } + + /// + /// 移除所有选中的Cell图块 + /// + public void ClearSelectCell() + { + _useMask.Clear(); + var count = _maskGrid.Count; + for (var i = 0; i < count; i++) + { + var uiCell = _maskGrid.GetCell(i); + if (uiCell.Data) + { + uiCell.SetData(false); + } + } + + EventManager.EmitEvent(EventEnum.OnClearCombinationCell); + } + + /// + /// 改变TileSet纹理 + /// + public void OnChangeTileSetTexture() + { + var width = UiNode.UiPanel.EditorPanel.CellHorizontal; + var height = UiNode.UiPanel.EditorPanel.CellVertical; + UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize(); + _maskGrid.RemoveAll(); + _useMask.Clear(); + _maskGrid.SetColumns(Mathf.Max(1, width)); + for (var i = 0; i < width; i++) + { + for (var j = 0; j < height; j++) + { + _maskGrid.Add(false); + } + } + + OnFocusClick(); + } + + /// + /// 返回鼠标所在的单元格位置, 相对于纹理左上角 + /// + public Vector2I GetMouseCellPosition() + { + return Utils.GetMouseCellPosition(UiNode.L_TileTexture.Instance); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/CombinationCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/CombinationCell.cs new file mode 100644 index 0000000..416235d --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/CombinationCell.cs @@ -0,0 +1,30 @@ +using Godot; + +namespace UI.TileSetEditorCombination; + +public partial class CombinationCell : Sprite2D +{ + public override void _Ready() + { + Centered = false; + RegionEnabled = true; + } + + /// + /// 初始化数据, 设置纹理和显示的区域 + /// + public void InitData(Texture2D texture, Vector2I texturePos) + { + Texture = texture; + RegionRect = new Rect2(texturePos * GameConfig.TileCellSize, GameConfig.TileCellSizeVector2I); + } + + /// + /// 从指定的组合单元克隆数据 + /// + public void CloneFrom(CombinationCell combinationCell) + { + Texture = combinationCell.Texture; + RegionRect = combinationCell.RegionRect; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/RectBrush.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/RectBrush.cs new file mode 100644 index 0000000..fe763d3 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/RectBrush.cs @@ -0,0 +1,83 @@ +using Godot; + +namespace UI.TileSetEditorCombination; + +public partial class RectBrush : Node2D +{ + /// + /// 所在的根节点 + /// + public Control Root { get; set; } + + private bool _drawFlag = false; + private int _x; + private int _y; + private int _w; + private int _h; + + public override void _Process(double delta) + { + QueueRedraw(); + } + + /// + /// 停止绘制 + /// + public void ClearDrawRect() + { + _drawFlag = false; + } + + /// + /// 设置绘制的矩形区域 + /// + public void SetDrawRect(int x, int y, int w, int h) + { + _drawFlag = true; + _x = x; + _y = y; + _w = w; + _h = h; + } + + /// + /// 获取原点坐标, 单位: 像素 + /// + public Vector2I GetOriginPosition() + { + return new Vector2I(_x, _y); + } + + /// + /// 获取中心点坐标, 单位: 像素 + /// + public Vector2I GetCenterPosition() + { + if (!_drawFlag) + { + return Vector2I.Zero; + } + return new Vector2I(_x + _w / 2, _y + _h / 2); + } + + /// + /// 获取绘制的矩形大小, 单位: 像素 + /// + public Vector2I GetRectSize() + { + if (!_drawFlag) + { + return Vector2I.Zero; + } + + return new Vector2I(_w, _h); + } + + public override void _Draw() + { + if (Root != null && _drawFlag) + { + DrawRect(new Rect2(_x, _y, _w, _h), new Color(1, 1, 0, 0.5f), false, 2f / Root.Scale.X); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs new file mode 100644 index 0000000..dc67131 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Godot; + +namespace UI.TileSetEditorCombination; + +public partial class TileEditCombination : EditorGridBg +{ + public new TileSetEditorCombination.LeftTopBg UiNode => (TileSetEditorCombination.LeftTopBg)base.UiNode; + + // ------------------------------- 笔刷相关 ------------------------------- + //笔刷数据, kay: 代表原图中的坐标, 单位: 格 + private Dictionary _brushData = new Dictionary(); + + //笔刷偏移, 单位: 像素 + private Vector2I _brushOffset = Vector2I.Zero; + //上一帧笔刷位置 + private Vector2 _brushPrevPos = Vector2.Zero; + private bool _initBrush = false; + private bool _drawBrushFlag = false; + private int _xStart = int.MaxValue; + private int _yStart = int.MaxValue; + private int _xEnd = int.MinValue; + private int _yEnd = int.MinValue; + // ----------------------------------------------------------------------- + + // ------------------------------- 画布相关 ------------------------------- + //画布数据, kay: 绘制坐标, 单位: 像素 + private Dictionary _canvas = new Dictionary(); + //画布数据是否需要更新 + private bool _canvasDirty = false; + // ----------------------------------------------------------------------- + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + UiNode.L_CombinationRoot.L_RectBrush.Instance.Root = UiNode.L_CombinationRoot.Instance; + InitNode(UiNode.L_CombinationRoot.Instance, UiNode.L_Grid.Instance); + + UiNode.UiPanel.AddEventListener(EventEnum.OnSelectCombinationCell, OnSelectCombinationCell); + UiNode.UiPanel.AddEventListener(EventEnum.OnRemoveCombinationCell, OnRemoveCombinationCell); + UiNode.UiPanel.AddEventListener(EventEnum.OnClearCombinationCell, OnClearCombinationCell); + + //删除按钮点击事件 + UiNode.L_DeleteBtn.Instance.Pressed += ClearAllCell; + //聚焦按钮点击事件 + UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; + //导入组合按钮点击事件 + UiNode.L_ImportBtn.Instance.Pressed += OnImportClick; + } + + public override void _Process(double delta) + { + if (!UiNode.UiPanel.IsOpen) + { + return; + } + + var brushRoot = UiNode.L_CombinationRoot.L_BrushRoot.Instance; + var combinationRoot = UiNode.L_CombinationRoot.Instance; + brushRoot.Position = combinationRoot.GetLocalMousePosition().FloorAdsorption(GameConfig.TileCellSizeVector2I) + _brushOffset; + + if (_canvasDirty) //更新画布范围 + { + _canvasDirty = false; + if (_canvas.Count > 0) + { + var rect = Utils.CalcTileRect(_canvas.Keys); + UiNode.L_CombinationRoot.L_RectBrush.Instance.SetDrawRect( + rect.Position.X, + rect.Position.Y, + rect.Size.X, + rect.Size.Y + ); + } + else + { + UiNode.L_CombinationRoot.L_RectBrush.Instance.ClearDrawRect(); + } + } + } + + public override void _GuiInput(InputEvent @event) + { + base._GuiInput(@event); + if (@event is InputEventMouse) + { + AcceptEvent(); + var brushRoot = UiNode.L_CombinationRoot.L_BrushRoot.Instance; + var newPos = brushRoot.Position; + + sbyte flag = 0; + //左键按下开始绘制 + if (_initBrush) + { + if (Input.IsMouseButtonPressed(MouseButton.Left)) //绘制 + { + flag = 1; + if (_brushPrevPos != newPos || !_drawBrushFlag) + { + _drawBrushFlag = true; + _brushPrevPos = newPos; + DrawBrush(); + } + } + else if (Input.IsMouseButtonPressed(MouseButton.Right)) //擦除 + { + flag = -1; + brushRoot.Modulate = new Color(1, 1, 1, 0.3f); + if (_brushPrevPos != newPos || !_drawBrushFlag) + { + _drawBrushFlag = true; + _brushPrevPos = newPos; + EraseBrush(); + } + } + } + + if (flag != 0) + { + _drawBrushFlag = false; + } + + if (flag != -1) + { + brushRoot.Modulate = Colors.White; + } + } + } + + /// + /// 删除已经绘制的图块 + /// + public void ClearAllCell() + { + foreach (var keyValuePair in _canvas) + { + keyValuePair.Value.QueueFree(); + } + + _canvas.Clear(); + _canvasDirty = true; + } + + //点击聚焦按钮 + private void OnFocusClick() + { + Utils.DoFocusNode(ContainerRoot, Size, UiNode.L_CombinationRoot.L_RectBrush.Instance.GetCenterPosition() * 2); + RefreshGridTrans(); + } + + //导入按钮点击 + private void OnImportClick() + { + var size = UiNode.L_CombinationRoot.L_RectBrush.Instance.GetRectSize(); + if (UiNode.UiPanel.EditorPanel.TextureImage == null) + { + EditorWindowManager.ShowTips("警告", "未选择纹理资源!"); + return; + } + else if (size == Vector2.Zero) + { + EditorWindowManager.ShowTips("警告", "请先绘制组合图块!"); + return; + } + else if (size == GameConfig.TileCellSizeVector2I) + { + EditorWindowManager.ShowTips("警告", "导入一格大小的组合图块没有任何意义!"); + return; + } + + var originPos = UiNode.L_CombinationRoot.L_RectBrush.Instance.GetOriginPosition(); + var tempCell = new List(); + var tempPos = new List(); + foreach (var keyValuePair in _canvas) + { + var pos = keyValuePair.Key; + var srcRect = keyValuePair.Value.RegionRect; + tempCell.Add(new SerializeVector2(srcRect.Position.AsVector2I())); + tempPos.Add(new SerializeVector2(pos - originPos)); + } + + var cells = tempCell.ToArray(); + var positions = tempPos.ToArray(); + + var tileSetEditorPanel = UiNode.UiPanel.EditorPanel; + var color = tileSetEditorPanel.BgColor; + var src = tileSetEditorPanel.TextureImage; + var image = ImportCombinationData.GetPreviewTexture(src, cells, positions); + var texture = ImageTexture.CreateFromImage(image); + EditorWindowManager.ShowImportCombination("组合", color, texture, (name) => + { + var combinationInfo = new TileCombinationInfo(); + combinationInfo.Id = DateTime.UtcNow.Ticks.ToString(); + combinationInfo.Name = name; + combinationInfo.Cells = cells; + combinationInfo.Positions = positions; + var data = new ImportCombinationData(texture, combinationInfo); + //派发导入组合图块事件 + EventManager.EmitEvent(EventEnum.OnImportCombination, data); + }, () => //取消添加组件 + { + image.Dispose(); + texture.Dispose(); + }); + } + + //绘制笔刷 + private void DrawBrush() + { + var brushRoot = UiNode.L_CombinationRoot.L_BrushRoot.Instance; + foreach (var keyValuePair in _brushData) + { + var combinationCell = keyValuePair.Value; + var pos = (combinationCell.Position + brushRoot.Position).AsVector2I(); + if (_canvas.TryGetValue(pos, out var canvasCell)) + { + canvasCell.CloneFrom(combinationCell); + } + else + { + canvasCell = (CombinationCell)combinationCell.Duplicate(); + canvasCell.Position = pos; + UiNode.L_CombinationRoot.L_CanvasRoot.AddChild(canvasCell); + _canvas.Add(pos, canvasCell); + _canvasDirty = true; + } + } + } + + //擦除操作 + private void EraseBrush() + { + var brushRoot = UiNode.L_CombinationRoot.L_BrushRoot.Instance; + foreach (var keyValuePair in _brushData) + { + var combinationCell = keyValuePair.Value; + var pos = (combinationCell.Position + brushRoot.Position).AsVector2I(); + if (_canvas.TryGetValue(pos, out var canvasCell)) + { + canvasCell.QueueFree(); + _canvas.Remove(pos); + _canvasDirty = true; + } + } + } + + //选中组合的图块 + private void OnSelectCombinationCell(object obj) + { + if (obj is Vector2I cell && !_brushData.ContainsKey(cell)) + { + _initBrush = true; + var cellData = new CombinationCell(); + cellData.Position = cell * GameConfig.TileCellSize; + cellData.InitData(UiNode.UiPanel.EditorPanel.Texture, cell); + UiNode.L_CombinationRoot.L_BrushRoot.AddChild(cellData); + _brushData.Add(cell, cellData); + + //计算起始点和终点 + _xStart = Mathf.Min(cell.X, _xStart); + _yStart = Mathf.Min(cell.Y, _yStart); + _xEnd = Mathf.Max(cell.X, _xEnd); + _yEnd = Mathf.Max(cell.Y, _yEnd); + _brushOffset = new Vector2I(-(_xStart + (_xEnd - _xStart) / 2), -(_yStart + (_yEnd - _yStart) / 2)) * GameConfig.TileCellSize; + } + } + + //移除组合图块 + private void OnRemoveCombinationCell(object obj) + { + if (obj is Vector2I cell) + { + if (_brushData.TryGetValue(cell, out var cellData)) + { + cellData.QueueFree(); + _brushData.Remove(cell); + } + } + } + + //移除所有组合图块 + private void OnClearCombinationCell(object obj) + { + foreach (var keyValuePair in _brushData) + { + keyValuePair.Value.QueueFree(); + } + _brushData.Clear(); + _initBrush = false; + _brushOffset = Vector2I.Zero; + _xStart = int.MaxValue; + _yStart = int.MaxValue; + _xEnd = int.MinValue; + _yEnd = int.MinValue; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileCell.cs new file mode 100644 index 0000000..e4354f6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileCell.cs @@ -0,0 +1,64 @@ +using Godot; + +namespace UI.TileSetEditorCombination; + +public class TileCell : UiCell +{ + public override void OnInit() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } + + public override void OnSetData(ImportCombinationData data) + { + CellNode.L_CellName.Instance.Text = data.CombinationInfo.Name; + CellNode.L_PreviewImage.Instance.Texture = data.PreviewTexture; + } + + public override void OnDisable() + { + if (Data.PreviewTexture != null) + { + Data.PreviewTexture.Dispose(); + Data.PreviewTexture = null; + } + } + + public override void OnDestroy() + { + if (Data.PreviewTexture != null) + { + Data.PreviewTexture.Dispose(); + Data.PreviewTexture = null; + } + } + + public override void OnDoubleClick() + { + //双击移除Cell数据 + EditorWindowManager.ShowEditCombination( + Data.CombinationInfo.Name, + CellNode.UiPanel.EditorPanel.BgColor, + Data.PreviewTexture, + (newName) => //修改 + { + Data.CombinationInfo.Name = newName; + EventManager.EmitEvent(EventEnum.OnUpdateCombination, Data); + }, + () => //删除 + { + EventManager.EmitEvent(EventEnum.OnRemoveCombination, Data); + } + ); + } + + public override void OnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = true; + } + + public override void OnUnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileSelected.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileSelected.cs new file mode 100644 index 0000000..5d546e2 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/right/TileSelected.cs @@ -0,0 +1,92 @@ +using Godot; + +namespace UI.TileSetEditorCombination; + +public partial class TileSelected : VBoxContainer, IUiNodeScript +{ + /// + /// 存放所有组合数据 + /// + public UiGrid Grid { get; private set; } + + private TileSetEditorCombination.RightBg _rightBg; + + public void SetUiNode(IUiNode uiNode) + { + _rightBg = (TileSetEditorCombination.RightBg)uiNode; + + Grid = new UiGrid(_rightBg.L_ScrollContainer.L_CellButton, typeof(TileCell)); + Grid.SetCellOffset(new Vector2I(5, 5)); + Grid.SetAutoColumns(true); + Grid.SetHorizontalExpand(true); + + _rightBg.UiPanel.AddEventListener(EventEnum.OnImportCombination, OnImportCombination); + _rightBg.UiPanel.AddEventListener(EventEnum.OnRemoveCombination, OnRemoveCombination); + _rightBg.UiPanel.AddEventListener(EventEnum.OnUpdateCombination, OnUpdateCombination); + } + + /// + /// 导入组合图块 + /// + private void OnImportCombination(object obj) + { + if (obj is ImportCombinationData data) + { + _rightBg.UiPanel.EditorPanel.TileSetSourceInfo.Combination.Add(data.CombinationInfo); + Grid.Add(data); + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + } + + /// + /// 移除组合图块 + /// + private void OnRemoveCombination(object obj) + { + if (obj is ImportCombinationData data) + { + var uiCell = Grid.Find(c => c.Data.CombinationInfo.Id == data.CombinationInfo.Id); + _rightBg.UiPanel.EditorPanel.TileSetSourceInfo.Combination.Remove(data.CombinationInfo); + if (uiCell != null) + { + Grid.RemoveByIndex(uiCell.Index); + } + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + } + + /// + /// 修改组合图块 + /// + private void OnUpdateCombination(object obj) + { + if (obj is ImportCombinationData data) + { + var uiCell = Grid.Find(c => c.Data.CombinationInfo.Id == data.CombinationInfo.Id); + if (uiCell != null) + { + uiCell.SetData(data); + } + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + } + + public void OnDestroy() + { + Grid.Destroy(); + } + + + /// + /// 改变TileSet纹理 + /// + public void OnChangeTileSetTexture() + { + //_grid.RemoveAll(); + //刷新预览图 + Grid.ForEach(cell => + { + cell.Data.UpdatePreviewTexture(_rightBg.UiPanel.EditorPanel.TextureImage); + }); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImport.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImport.cs new file mode 100644 index 0000000..25b5aff --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImport.cs @@ -0,0 +1,262 @@ +namespace UI.TileSetEditorImport; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class TileSetEditorImport : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportPreviewBg + /// + public ImportPreviewBg L_ImportPreviewBg + { + get + { + if (_L_ImportPreviewBg == null) _L_ImportPreviewBg = new ImportPreviewBg((TileSetEditorImportPanel)this, GetNode("ImportPreviewBg")); + return _L_ImportPreviewBg; + } + } + private ImportPreviewBg _L_ImportPreviewBg; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportButton + /// + public ImportButton L_ImportButton + { + get + { + if (_L_ImportButton == null) _L_ImportButton = new ImportButton((TileSetEditorImportPanel)this, GetNode("ImportButton")); + return _L_ImportButton; + } + } + private ImportButton _L_ImportButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportLabel + /// + public ImportLabel L_ImportLabel + { + get + { + if (_L_ImportLabel == null) _L_ImportLabel = new ImportLabel((TileSetEditorImportPanel)this, GetNode("ImportLabel")); + return _L_ImportLabel; + } + } + private ImportLabel _L_ImportLabel; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportIcon + /// + public ImportIcon L_ImportIcon + { + get + { + if (_L_ImportIcon == null) _L_ImportIcon = new ImportIcon((TileSetEditorImportPanel)this, GetNode("ImportIcon")); + return _L_ImportIcon; + } + } + private ImportIcon _L_ImportIcon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.Control + /// + public Control L_Control + { + get + { + if (_L_Control == null) _L_Control = new Control((TileSetEditorImportPanel)this, GetNode("Control")); + return _L_Control; + } + } + private Control _L_Control; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportColorPicker + /// + public ImportColorPicker L_ImportColorPicker + { + get + { + if (_L_ImportColorPicker == null) _L_ImportColorPicker = new ImportColorPicker((TileSetEditorImportPanel)this, GetNode("ImportColorPicker")); + return _L_ImportColorPicker; + } + } + private ImportColorPicker _L_ImportColorPicker; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ReimportButton + /// + public ReimportButton L_ReimportButton + { + get + { + if (_L_ReimportButton == null) _L_ReimportButton = new ReimportButton((TileSetEditorImportPanel)this, GetNode("ReimportButton")); + return _L_ReimportButton; + } + } + private ReimportButton _L_ReimportButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.FocusBtn + /// + public FocusBtn L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn((TileSetEditorImportPanel)this, GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn _L_FocusBtn; + + + public TileSetEditorImport() : base(nameof(TileSetEditorImport)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: TileSetEditorImport.ImportPreviewBg + /// + public class ImportPreviewBg : UiNode + { + public ImportPreviewBg(TileSetEditorImportPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override ImportPreviewBg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.ImportButton + /// + public class ImportButton : UiNode + { + public ImportButton(TileSetEditorImportPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override ImportButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.ImportLabel + /// + public class ImportLabel : UiNode + { + public ImportLabel(TileSetEditorImportPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override ImportLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.ImportIcon + /// + public class ImportIcon : UiNode + { + public ImportIcon(TileSetEditorImportPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override ImportIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.Control.ImportPreview + /// + public class ImportPreview : UiNode + { + public ImportPreview(TileSetEditorImportPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override ImportPreview Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.Control + /// + public class Control : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorImport.ImportPreview + /// + public ImportPreview L_ImportPreview + { + get + { + if (_L_ImportPreview == null) _L_ImportPreview = new ImportPreview(UiPanel, Instance.GetNode("ImportPreview")); + return _L_ImportPreview; + } + } + private ImportPreview _L_ImportPreview; + + public Control(TileSetEditorImportPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Control Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.ImportColorPicker + /// + public class ImportColorPicker : UiNode + { + public ImportColorPicker(TileSetEditorImportPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override ImportColorPicker Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.ReimportButton + /// + public class ReimportButton : UiNode + { + public ReimportButton(TileSetEditorImportPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override ReimportButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorImport.FocusBtn + /// + public class FocusBtn : UiNode + { + public FocusBtn(TileSetEditorImportPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ImportPreviewBg + /// + public ImportPreviewBg S_ImportPreviewBg => L_ImportPreviewBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ImportButton + /// + public ImportButton S_ImportButton => L_ImportButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ImportLabel + /// + public ImportLabel S_ImportLabel => L_ImportLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ImportIcon + /// + public ImportIcon S_ImportIcon => L_ImportIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.Control.ImportPreview + /// + public ImportPreview S_ImportPreview => L_Control.L_ImportPreview; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.Control + /// + public Control S_Control => L_Control; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ImportColorPicker + /// + public ImportColorPicker S_ImportColorPicker => L_ImportColorPicker; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.ReimportButton + /// + public ReimportButton S_ReimportButton => L_ReimportButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorImport.FocusBtn + /// + public FocusBtn S_FocusBtn => L_FocusBtn; + +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImportPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImportPanel.cs new file mode 100644 index 0000000..54e55f4 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorImport/TileSetEditorImportPanel.cs @@ -0,0 +1,192 @@ +using System.IO; +using Godot; + +namespace UI.TileSetEditorImport; + +public partial class TileSetEditorImportPanel : TileSetEditorImport +{ + //是否打开了颜色选择器 + private bool _isOpenColorPicker; + + private TileSetEditor.TileSetEditorPanel _tileSetEditor; + + public override void OnCreateUi() + { + _tileSetEditor = (TileSetEditor.TileSetEditorPanel)ParentUi; + S_ImportPreviewBg.Instance.Color = _tileSetEditor.BgColor; + S_ImportPreview.Instance.Texture = _tileSetEditor.Texture; + + GetTree().Root.FilesDropped += OnFilesDropped; + S_ImportButton.Instance.Pressed += OnImportButtonClick; + S_ReimportButton.Instance.Pressed += OnReimportButtonClick; + S_ImportColorPicker.Instance.Pressed += OnColorPickerClick; + S_FocusBtn.Instance.Pressed += OnFocusClick; + + S_ImportPreviewBg.Instance.Visible = false; + S_ReimportButton.Instance.Visible = false; + S_ImportColorPicker.Instance.Visible = false; + S_FocusBtn.Instance.Visible = false; + + //监听TileSet纹理改变 + AddEventListener(EventEnum.OnSetTileTexture, OnSetTileTexture); + //监听TileSet背景颜色改变 + AddEventListener(EventEnum.OnSetTileSetBgColor, OnSetTileSetBgColor); + //监听拖拽 + S_ImportPreviewBg.Instance.AddDragListener(DragButtonEnum.Left | DragButtonEnum.Middle | DragButtonEnum.Right, OnDragCallback); + //监听鼠标滚轮 + S_ImportPreviewBg.Instance.AddMouseWheelListener(OnMouseCallback); + } + + public override void OnDestroyUi() + { + GetTree().Root.FilesDropped -= OnFilesDropped; + } + + //TileSet纹理改变 + private void OnSetTileTexture(object arg) + { + //判断是否已经初始化好纹理了 + //_tileSetEditor.InitTexture + S_ImportPreviewBg.Instance.Visible = _tileSetEditor.InitTexture; + S_ReimportButton.Instance.Visible = _tileSetEditor.InitTexture; + S_ImportColorPicker.Instance.Visible = _tileSetEditor.InitTexture; + S_FocusBtn.Instance.Visible = _tileSetEditor.InitTexture; + + //隐藏导入文本和icon + S_ImportLabel.Instance.Visible = !_tileSetEditor.InitTexture; + S_ImportIcon.Instance.Visible = !_tileSetEditor.InitTexture; + S_ImportButton.Instance.Visible = !_tileSetEditor.InitTexture; + } + + //背景颜色改变 + private void OnSetTileSetBgColor(object arg) + { + if (arg is Color color) + { + S_ImportPreviewBg.Instance.Color = color; + } + } + + //点击导入按钮 + private void OnImportButtonClick() + { + if (_tileSetEditor.InitTexture) + { + return; + } + + OnReimportButtonClick(); + } + + //重新导入 + private void OnReimportButtonClick() + { + EditorWindowManager.ShowOpenFileDialog(["*.png"], (path) => + { + if (path != null) + { + SetImportTexture(path); + } + }); + } + + //点击调整背景颜色 + private void OnColorPickerClick() + { + if (!_isOpenColorPicker) + { + _isOpenColorPicker = true; + EditorWindowManager.ShowColorPicker( + S_ImportColorPicker.Instance.GlobalPosition, + S_ImportPreviewBg.Instance.Color, + //设置颜色 + color => + { + _tileSetEditor.SetBgColor(color); + }, + //关闭窗口 + () => { _isOpenColorPicker = false; } + ); + } + } + + //聚焦 + private void OnFocusClick() + { + S_ImportPreview.Instance.Position = Vector2.Zero; + } + + //拖拽区域回调 + private void OnDragCallback(DragState state, Vector2 position) + { + var sprite2D = S_ImportPreview.Instance; + if (state == DragState.DragMove && sprite2D.Visible) + { + sprite2D.Position += position; + } + } + + //鼠标滚轮 + private void OnMouseCallback(int v) + { + if (!_tileSetEditor.InitTexture) + { + return; + } + + if (v < 0) + { + //缩小 + Utils.DoShrinkByMousePosition(S_Control.L_ImportPreview.Instance, 0.4f); + } + else + { + //放大 + Utils.DoMagnifyByMousePosition(S_Control.L_ImportPreview.Instance, 20); + } + } + + //拖拽文件进入区域 + private void OnFilesDropped(string[] files) + { + if (files.Length == 0 || !IsOpen) + { + return; + } + var flag = GetGlobalRect().HasPoint(GetGlobalMousePosition()); + if (flag) + { + var file = files[0]; + if (Path.GetExtension(file) != ".png") + { + EditorWindowManager.ShowTips("警告", "只能导入'.png'格式的文件!"); + return; + } + + SetImportTexture(file); + } + } + + /// + /// 导入纹理 + /// + /// 纹理路径 + private void SetImportTexture(string file) + { + var tileSetSourceInfo = _tileSetEditor.TileSetSourceInfo; + if (tileSetSourceInfo == null) + { + return; + } + + Debug.Log("导入文件: " + file); + var image = Image.LoadFromFile(file); + EditorWindowManager.ShowImportTileImage(image, (result) => + { + tileSetSourceInfo.SourcePath = GameConfig.RoomTileSetDir + _tileSetEditor.TileSetInfo.Name + "/" + tileSetSourceInfo.Name + ".png"; + tileSetSourceInfo.SetSourceImage(result); + _tileSetEditor.SetTextureData(result); + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + }); + } +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/PreviewCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/PreviewCell.cs new file mode 100644 index 0000000..348fa94 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/PreviewCell.cs @@ -0,0 +1,35 @@ +using Godot; + +namespace UI.TileSetEditorProject; + +public class PreviewCell : UiCell +{ + private ImageTexture _imageTexture; + + public override void OnInit() + { + _imageTexture = new ImageTexture(); + CellNode.L_PreviewImage.Instance.Texture = _imageTexture; + } + + public override void OnSetData(TileSetSourceInfo data) + { + CellNode.L_Name.Instance.Text = data.Name; + var sourceImage = data.GetSourceImage(); + if (sourceImage == null) + { + CellNode.L_PreviewImage.Instance.Visible = false; + } + else + { + CellNode.L_PreviewImage.Instance.Visible = true; + _imageTexture.SetImage(sourceImage); + } + } + + public override void OnDestroy() + { + _imageTexture.Dispose(); + _imageTexture = null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileButtonCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileButtonCell.cs new file mode 100644 index 0000000..bab4943 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileButtonCell.cs @@ -0,0 +1,65 @@ + +using Godot; +using UI.TileSetEditor; + +namespace UI.TileSetEditorProject; + +public class TileButtonCell : UiCell +{ + public override void OnInit() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } + + public override void OnSetData(TileSetSplit data) + { + CellNode.L_TileName.Instance.Text = data.TileSetInfo.Name; + //检测是否有错误 + var hasError = false; + foreach (var sourceInfo in data.TileSetInfo.Sources) + { + if (string.IsNullOrEmpty(sourceInfo.SourcePath)) + { + hasError = true; + break; + } + + foreach (var terrainInfo in sourceInfo.Terrain) + { + if (!terrainInfo.Ready) + { + hasError = true; + break; + } + } + } + + if (hasError) + { + CellNode.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Error_mini_png); + } + else + { + CellNode.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Success_mini_png); + } + } + + public override void OnDoubleClick() + { + //打开TileSet编辑器面板 + var tileSetEditorPanel = CellNode.UiPanel.ParentUi.OpenNextUi(UiManager.UiNames.TileSetEditor); + tileSetEditorPanel.InitData(Data); + } + + public override void OnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = true; + var previewGrid = CellNode.UiPanel.PreviewGrid; + previewGrid.SetDataList(Data.TileSetInfo.Sources.ToArray()); + } + + public override void OnUnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProject.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProject.cs new file mode 100644 index 0000000..487c800 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProject.cs @@ -0,0 +1,539 @@ +namespace UI.TileSetEditorProject; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class TileSetEditorProject : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel + /// + public Panel L_Panel + { + get + { + if (_L_Panel == null) _L_Panel = new Panel((TileSetEditorProjectPanel)this, GetNode("Panel")); + return _L_Panel; + } + } + private Panel _L_Panel; + + + public TileSetEditorProject() : base(nameof(TileSetEditorProject)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileSearchInput + /// + public class TileSearchInput : UiNode + { + public TileSearchInput(TileSetEditorProjectPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override TileSearchInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileSearchButton + /// + public class TileSearchButton : UiNode + { + public TileSearchButton(TileSetEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TileSearchButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileAddButton + /// + public class TileAddButton : UiNode + { + public TileAddButton(TileSetEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TileAddButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileEditButton + /// + public class TileEditButton : UiNode + { + public TileEditButton(TileSetEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TileEditButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileDeleteButton + /// + public class TileDeleteButton : UiNode + { + public TileDeleteButton(TileSetEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TileDeleteButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileSearchInput + /// + public TileSearchInput L_TileSearchInput + { + get + { + if (_L_TileSearchInput == null) _L_TileSearchInput = new TileSearchInput(UiPanel, Instance.GetNode("TileSearchInput")); + return _L_TileSearchInput; + } + } + private TileSearchInput _L_TileSearchInput; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileSearchButton + /// + public TileSearchButton L_TileSearchButton + { + get + { + if (_L_TileSearchButton == null) _L_TileSearchButton = new TileSearchButton(UiPanel, Instance.GetNode("TileSearchButton")); + return _L_TileSearchButton; + } + } + private TileSearchButton _L_TileSearchButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileAddButton + /// + public TileAddButton L_TileAddButton + { + get + { + if (_L_TileAddButton == null) _L_TileAddButton = new TileAddButton(UiPanel, Instance.GetNode("TileAddButton")); + return _L_TileAddButton; + } + } + private TileAddButton _L_TileAddButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileEditButton + /// + public TileEditButton L_TileEditButton + { + get + { + if (_L_TileEditButton == null) _L_TileEditButton = new TileEditButton(UiPanel, Instance.GetNode("TileEditButton")); + return _L_TileEditButton; + } + } + private TileEditButton _L_TileEditButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileDeleteButton + /// + public TileDeleteButton L_TileDeleteButton + { + get + { + if (_L_TileDeleteButton == null) _L_TileDeleteButton = new TileDeleteButton(UiPanel, Instance.GetNode("TileDeleteButton")); + return _L_TileDeleteButton; + } + } + private TileDeleteButton _L_TileDeleteButton; + + public HBoxContainer(TileSetEditorProjectPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.Icon + /// + public class Icon : UiNode + { + public Icon(TileSetEditorProjectPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override Icon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.TileName + /// + public class TileName : UiNode + { + public TileName(TileSetEditorProjectPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override TileName Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.SelectTexture + /// + public class SelectTexture : UiNode + { + public SelectTexture(TileSetEditorProjectPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override SelectTexture Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton + /// + public class TileButton : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.Icon + /// + public Icon L_Icon + { + get + { + if (_L_Icon == null) _L_Icon = new Icon(UiPanel, Instance.GetNode("Icon")); + return _L_Icon; + } + } + private Icon _L_Icon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileName + /// + public TileName L_TileName + { + get + { + if (_L_TileName == null) _L_TileName = new TileName(UiPanel, Instance.GetNode("TileName")); + return _L_TileName; + } + } + private TileName _L_TileName; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.SelectTexture + /// + public SelectTexture L_SelectTexture + { + get + { + if (_L_SelectTexture == null) _L_SelectTexture = new SelectTexture(UiPanel, Instance.GetNode("SelectTexture")); + return _L_SelectTexture; + } + } + private SelectTexture _L_SelectTexture; + + public TileButton(TileSetEditorProjectPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TileButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.TileButton + /// + public TileButton L_TileButton + { + get + { + if (_L_TileButton == null) _L_TileButton = new TileButton(UiPanel, Instance.GetNode("TileButton")); + return _L_TileButton; + } + } + private TileButton _L_TileButton; + + public ScrollContainer(TileSetEditorProjectPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public VBoxContainer(TileSetEditorProjectPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview.Name + /// + public class Name : UiNode + { + public Name(TileSetEditorProjectPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Name Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview.PreviewImage + /// + public class PreviewImage : UiNode + { + public PreviewImage(TileSetEditorProjectPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override PreviewImage Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview + /// + public class Preview : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Name + /// + public Name L_Name + { + get + { + if (_L_Name == null) _L_Name = new Name(UiPanel, Instance.GetNode("Name")); + return _L_Name; + } + } + private Name _L_Name; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.PreviewImage + /// + public PreviewImage L_PreviewImage + { + get + { + if (_L_PreviewImage == null) _L_PreviewImage = new PreviewImage(UiPanel, Instance.GetNode("PreviewImage")); + return _L_PreviewImage; + } + } + private PreviewImage _L_PreviewImage; + + public Preview(TileSetEditorProjectPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Preview Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer + /// + public class ScrollContainer_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.Preview + /// + public Preview L_Preview + { + get + { + if (_L_Preview == null) _L_Preview = new Preview(UiPanel, Instance.GetNode("Preview")); + return _L_Preview; + } + } + private Preview _L_Preview; + + public ScrollContainer_1(TileSetEditorProjectPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer_1 Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel + /// + public class Panel_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.ScrollContainer + /// + public ScrollContainer_1 L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer_1(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer_1 _L_ScrollContainer; + + public Panel_1(TileSetEditorProjectPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Panel_1 Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2 + /// + public class HBoxContainer2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.Panel + /// + public Panel_1 L_Panel + { + get + { + if (_L_Panel == null) _L_Panel = new Panel_1(UiPanel, Instance.GetNode("Panel")); + return _L_Panel; + } + } + private Panel_1 _L_Panel; + + public HBoxContainer2(TileSetEditorProjectPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel.MarginContainer + /// + public class MarginContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.Panel.HBoxContainer2 + /// + public HBoxContainer2 L_HBoxContainer2 + { + get + { + if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new HBoxContainer2(UiPanel, Instance.GetNode("HBoxContainer2")); + return _L_HBoxContainer2; + } + } + private HBoxContainer2 _L_HBoxContainer2; + + public MarginContainer(TileSetEditorProjectPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorProject.Panel + /// + public class Panel : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorProject.MarginContainer + /// + public MarginContainer L_MarginContainer + { + get + { + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer(UiPanel, Instance.GetNode("MarginContainer")); + return _L_MarginContainer; + } + } + private MarginContainer _L_MarginContainer; + + public Panel(TileSetEditorProjectPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override Panel Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileSearchInput + /// + public TileSearchInput S_TileSearchInput => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer.L_TileSearchInput; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileSearchButton + /// + public TileSearchButton S_TileSearchButton => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer.L_TileSearchButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileAddButton + /// + public TileAddButton S_TileAddButton => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer.L_TileAddButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileEditButton + /// + public TileEditButton S_TileEditButton => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer.L_TileEditButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer.TileDeleteButton + /// + public TileDeleteButton S_TileDeleteButton => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer.L_TileDeleteButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.Icon + /// + public Icon S_Icon => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_ScrollContainer.L_TileButton.L_Icon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.TileName + /// + public TileName S_TileName => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_ScrollContainer.L_TileButton.L_TileName; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton.SelectTexture + /// + public SelectTexture S_SelectTexture => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_ScrollContainer.L_TileButton.L_SelectTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer.ScrollContainer.TileButton + /// + public TileButton S_TileButton => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer.L_ScrollContainer.L_TileButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_Panel.L_MarginContainer.L_HBoxContainer2.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview.Name + /// + public Name S_Name => L_Panel.L_MarginContainer.L_HBoxContainer2.L_Panel.L_ScrollContainer.L_Preview.L_Name; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview.PreviewImage + /// + public PreviewImage S_PreviewImage => L_Panel.L_MarginContainer.L_HBoxContainer2.L_Panel.L_ScrollContainer.L_Preview.L_PreviewImage; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2.Panel.ScrollContainer.Preview + /// + public Preview S_Preview => L_Panel.L_MarginContainer.L_HBoxContainer2.L_Panel.L_ScrollContainer.L_Preview; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer.HBoxContainer2 + /// + public HBoxContainer2 S_HBoxContainer2 => L_Panel.L_MarginContainer.L_HBoxContainer2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorProject.Panel.MarginContainer + /// + public MarginContainer S_MarginContainer => L_Panel.L_MarginContainer; + +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProjectPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProjectPanel.cs new file mode 100644 index 0000000..9de3524 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorProject/TileSetEditorProjectPanel.cs @@ -0,0 +1,154 @@ +using System.IO; +using Godot; + +namespace UI.TileSetEditorProject; + +public partial class TileSetEditorProjectPanel : TileSetEditorProject +{ + /// + /// TileSet列表 + /// + public UiGrid Grid { get; private set; } + + /// + /// TileSet Source 预览列表 + /// + public UiGrid PreviewGrid { get; private set; } + + public override void OnCreateUi() + { + //搜索按钮 + S_TileSearchButton.Instance.Pressed += OnSearchClick; + //创建按钮 + S_TileAddButton.Instance.Pressed += OnAddClick; + //删除按钮 + S_TileDeleteButton.Instance.Pressed += OnDeleteClick; + //编辑按钮 + S_TileEditButton.Instance.Pressed += OnEditClick; + + Grid = CreateUiGrid(S_TileButton); + Grid.SetColumns(1); + Grid.SetCellOffset(new Vector2I(0, 5)); + Grid.SetHorizontalExpand(true); + + PreviewGrid = CreateUiGrid(S_Preview); + PreviewGrid.SetColumns(1); + PreviewGrid.SetCellOffset(new Vector2I(0, 15)); + PreviewGrid.SetHorizontalExpand(true); + + //初始化数据 + OnSearchClick(); + } + + public override void OnShowUi() + { + OnSearchClick(); + } + + /// + /// 刷新数据 + /// + public void SearchData(string text) + { + Grid.RemoveAll(); + PreviewGrid.RemoveAll(); + text = text.ToLower(); + foreach (var tileSetSplit in GameApplication.Instance.TileSetConfig) + { + if (text.Length == 0 || tileSetSplit.Value.TileSetInfo.Name.ToLower().Contains(text)) + { + Grid.Add(tileSetSplit.Value); + } + } + } + + //搜索 + private void OnSearchClick() + { + SearchData(S_TileSearchInput.Instance.Text); + } + + //创建 + private void OnAddClick() + { + EditorWindowManager.ShowCreateTileSet((name, split) => + { + //创建TileSetInfo + var tileSetInfo = new TileSetInfo(); + tileSetInfo.InitData(); + tileSetInfo.Name = name; + //默认创建一个Main Source, 该Source不可删除 + var tileSetSourceInfo = new TileSetSourceInfo(); + tileSetSourceInfo.InitData(); + tileSetSourceInfo.Name = "Main"; + tileSetInfo.Sources.Add(tileSetSourceInfo); + //默认创建一个Main Terrain, 该Terrain不可删除 + var tileSetTerrainInfo = new TileSetTerrainInfo(); + tileSetTerrainInfo.InitData(); + tileSetTerrainInfo.Name = "Main"; + tileSetSourceInfo.Terrain.Add(tileSetTerrainInfo); + + split.SetTileSetInfo(tileSetInfo); + GameApplication.Instance.TileSetConfig.Add(name, split); + //保存TileSetInfo + EditorTileSetManager.SaveTileSetInfo(tileSetInfo); + //保存TileSetSplit数据 + EditorTileSetManager.SaveTileSetConfig(); + //刷新 + OnSearchClick(); + }); + } + + //删除 + private void OnDeleteClick() + { + if (Grid.SelectIndex < 0) + { + EditorWindowManager.ShowTips("提示", "请选择要删除的TileSet!"); + return; + } + + var tileSetSplit = Grid.SelectData; + //这里要判断是否引用 + foreach (var dungeonRoomGroup in GameApplication.Instance.RoomConfig) + { + if (dungeonRoomGroup.Value.TileSet == tileSetSplit.TileSetInfo.Name) + { + EditorWindowManager.ShowTips("提示", $"该TileSet被'{dungeonRoomGroup.Key}'地牢组使用,不能删除!"); + return; + } + } + + //删除数据 + EditorWindowManager.ShowDelayConfirm("提示", "确认删除该TileSet吗,删除后无法恢复!", 5, (v) => + { + if (v) + { + Directory.Delete(EditorTileSetManager.CustomTileSetPath + tileSetSplit.TileSetInfo.Name, true); + GameApplication.Instance.TileSetConfig.Remove(tileSetSplit.TileSetInfo.Name); + EditorTileSetManager.SaveTileSetConfig(); + tileSetSplit.Destroy(); + //刷新 + OnSearchClick(); + } + }); + } + + //编辑按钮 + private void OnEditClick() + { + if (Grid.SelectIndex < 0) + { + EditorWindowManager.ShowTips("提示", "请选择要删除的TileSet!"); + return; + } + + var tileSetSplit = Grid.SelectData; + EditorWindowManager.ShowEditTileSet(tileSetSplit, (v) => + { + EditorTileSetManager.SaveTileSetConfig(); + //刷新 + OnSearchClick(); + }); + } +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TerrainTabCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TerrainTabCell.cs new file mode 100644 index 0000000..af6a41e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TerrainTabCell.cs @@ -0,0 +1,38 @@ +namespace UI.TileSetEditorTerrain; + +public class TerrainTabCell : UiCell +{ + public override void OnInit() + { + CellNode.L_SelectTexture.Instance.Visible = false; + CellNode.L_ErrorIcon.Instance.Visible = false; + } + + public override void OnSetData(TileSetTerrainInfo data) + { + RefreshData(); + } + + public override void Process(float delta) + { + CellNode.L_ErrorIcon.Instance.Visible = !Data.Ready; + } + + /// + /// 刷新数据 + /// + public void RefreshData() + { + CellNode.Instance.Text = Data.Name; + } + + public override void OnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = true; + } + + public override void OnUnSelect() + { + CellNode.L_SelectTexture.Instance.Visible = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs new file mode 100644 index 0000000..e2618e5 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs @@ -0,0 +1,1020 @@ +namespace UI.TileSetEditorTerrain; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class TileSetEditorTerrain : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer + /// + public VSplitContainer L_VSplitContainer + { + get + { + if (_L_VSplitContainer == null) _L_VSplitContainer = new VSplitContainer((TileSetEditorTerrainPanel)this, GetNode("VSplitContainer")); + return _L_VSplitContainer; + } + } + private VSplitContainer _L_VSplitContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.DragSprite + /// + public DragSprite L_DragSprite + { + get + { + if (_L_DragSprite == null) _L_DragSprite = new DragSprite((TileSetEditorTerrainPanel)this, GetNode("DragSprite")); + return _L_DragSprite; + } + } + private DragSprite _L_DragSprite; + + + public TileSetEditorTerrain() : base(nameof(TileSetEditorTerrain)) + { + } + + public sealed override void OnInitNestedUi() + { + _ = L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg; + _ = L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_Brush; + _ = L_VSplitContainer.L_PanelBottom.L_BottomBg; + + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.Label + /// + public class Label : UiNode + { + public Label(TileSetEditorTerrainPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.AddButton + /// + public class AddButton : UiNode + { + public AddButton(TileSetEditorTerrainPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override AddButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.EditButton + /// + public class EditButton : UiNode + { + public EditButton(TileSetEditorTerrainPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override EditButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.DeleteButton + /// + public class DeleteButton : UiNode + { + public DeleteButton(TileSetEditorTerrainPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override DeleteButton Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer + /// + public class HBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.Label + /// + public Label L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label _L_Label; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.AddButton + /// + public AddButton L_AddButton + { + get + { + if (_L_AddButton == null) _L_AddButton = new AddButton(UiPanel, Instance.GetNode("AddButton")); + return _L_AddButton; + } + } + private AddButton _L_AddButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.EditButton + /// + public EditButton L_EditButton + { + get + { + if (_L_EditButton == null) _L_EditButton = new EditButton(UiPanel, Instance.GetNode("EditButton")); + return _L_EditButton; + } + } + private EditButton _L_EditButton; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.DeleteButton + /// + public DeleteButton L_DeleteButton + { + get + { + if (_L_DeleteButton == null) _L_DeleteButton = new DeleteButton(UiPanel, Instance.GetNode("DeleteButton")); + return _L_DeleteButton; + } + } + private DeleteButton _L_DeleteButton; + + public HBoxContainer(TileSetEditorTerrainPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab.SelectTexture + /// + public class SelectTexture : UiNode + { + public SelectTexture(TileSetEditorTerrainPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override SelectTexture Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab.ErrorIcon + /// + public class ErrorIcon : UiNode + { + public ErrorIcon(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override ErrorIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab + /// + public class TerrainTab : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.SelectTexture + /// + public SelectTexture L_SelectTexture + { + get + { + if (_L_SelectTexture == null) _L_SelectTexture = new SelectTexture(UiPanel, Instance.GetNode("SelectTexture")); + return _L_SelectTexture; + } + } + private SelectTexture _L_SelectTexture; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.ErrorIcon + /// + public ErrorIcon L_ErrorIcon + { + get + { + if (_L_ErrorIcon == null) _L_ErrorIcon = new ErrorIcon(UiPanel, Instance.GetNode("ErrorIcon")); + return _L_ErrorIcon; + } + } + private ErrorIcon _L_ErrorIcon; + + public TerrainTab(TileSetEditorTerrainPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override TerrainTab Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer + /// + public class ScrollContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.TerrainTab + /// + public TerrainTab L_TerrainTab + { + get + { + if (_L_TerrainTab == null) _L_TerrainTab = new TerrainTab(UiPanel, Instance.GetNode("TerrainTab")); + return _L_TerrainTab; + } + } + private TerrainTab _L_TerrainTab; + + public ScrollContainer(TileSetEditorTerrainPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer + /// + public class VBoxContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.HBoxContainer + /// + public HBoxContainer L_HBoxContainer + { + get + { + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); + return _L_HBoxContainer; + } + } + private HBoxContainer _L_HBoxContainer; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.ScrollContainer + /// + public ScrollContainer L_ScrollContainer + { + get + { + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer(UiPanel, Instance.GetNode("ScrollContainer")); + return _L_ScrollContainer; + } + } + private ScrollContainer _L_ScrollContainer; + + public VBoxContainer(TileSetEditorTerrainPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab + /// + public class TopTab : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.VBoxContainer + /// + public VBoxContainer L_VBoxContainer + { + get + { + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); + return _L_VBoxContainer; + } + } + private VBoxContainer _L_VBoxContainer; + + public TopTab(TileSetEditorTerrainPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override TopTab Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot.RightCell.CellTexture + /// + public class CellTexture : UiNode + { + public CellTexture(TileSetEditorTerrainPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override CellTexture Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot.RightCell + /// + public class RightCell : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot.CellTexture + /// + public CellTexture L_CellTexture + { + get + { + if (_L_CellTexture == null) _L_CellTexture = new CellTexture(UiPanel, Instance.GetNode("CellTexture")); + return _L_CellTexture; + } + } + private CellTexture _L_CellTexture; + + public RightCell(TileSetEditorTerrainPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override RightCell Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot + /// + public class CellRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.RightCell + /// + public RightCell L_RightCell + { + get + { + if (_L_RightCell == null) _L_RightCell = new RightCell(UiPanel, Instance.GetNode("RightCell")); + return _L_RightCell; + } + } + private RightCell _L_RightCell; + + public CellRoot(TileSetEditorTerrainPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override CellRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture1.Label + /// + public class Label_1 : UiNode + { + public Label_1(TileSetEditorTerrainPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture1 + /// + public class TerrainTexture1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Label + /// + public Label_1 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_1(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_1 _L_Label; + + public TerrainTexture1(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TerrainTexture1 Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture2.Label + /// + public class Label_2 : UiNode + { + public Label_2(TileSetEditorTerrainPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_2 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture2 + /// + public class TerrainTexture2 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Label + /// + public Label_2 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_2(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_2 _L_Label; + + public TerrainTexture2(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TerrainTexture2 Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture3.Label + /// + public class Label_3 : UiNode + { + public Label_3(TileSetEditorTerrainPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_3 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture3 + /// + public class TerrainTexture3 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Label + /// + public Label_3 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_3(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_3 _L_Label; + + public TerrainTexture3(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TerrainTexture3 Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture4.Label + /// + public class Label_4 : UiNode + { + public Label_4(TileSetEditorTerrainPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_4 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture4 + /// + public class TerrainTexture4 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Label + /// + public Label_4 L_Label + { + get + { + if (_L_Label == null) _L_Label = new Label_4(UiPanel, Instance.GetNode("Label")); + return _L_Label; + } + } + private Label_4 _L_Label; + + public TerrainTexture4(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TerrainTexture4 Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Brush + /// + public class Brush : UiNode + { + public Brush(TileSetEditorTerrainPanel uiPanel, UI.TileSetEditorTerrain.TerrainBrush node) : base(uiPanel, node) { } + public override Brush Clone() => new (UiPanel, (UI.TileSetEditorTerrain.TerrainBrush)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot + /// + public class TerrainRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.CellRoot + /// + public CellRoot L_CellRoot + { + get + { + if (_L_CellRoot == null) _L_CellRoot = new CellRoot(UiPanel, Instance.GetNode("CellRoot")); + return _L_CellRoot; + } + } + private CellRoot _L_CellRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainTexture1 + /// + public TerrainTexture1 L_TerrainTexture1 + { + get + { + if (_L_TerrainTexture1 == null) _L_TerrainTexture1 = new TerrainTexture1(UiPanel, Instance.GetNode("TerrainTexture1")); + return _L_TerrainTexture1; + } + } + private TerrainTexture1 _L_TerrainTexture1; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainTexture2 + /// + public TerrainTexture2 L_TerrainTexture2 + { + get + { + if (_L_TerrainTexture2 == null) _L_TerrainTexture2 = new TerrainTexture2(UiPanel, Instance.GetNode("TerrainTexture2")); + return _L_TerrainTexture2; + } + } + private TerrainTexture2 _L_TerrainTexture2; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainTexture3 + /// + public TerrainTexture3 L_TerrainTexture3 + { + get + { + if (_L_TerrainTexture3 == null) _L_TerrainTexture3 = new TerrainTexture3(UiPanel, Instance.GetNode("TerrainTexture3")); + return _L_TerrainTexture3; + } + } + private TerrainTexture3 _L_TerrainTexture3; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainTexture4 + /// + public TerrainTexture4 L_TerrainTexture4 + { + get + { + if (_L_TerrainTexture4 == null) _L_TerrainTexture4 = new TerrainTexture4(UiPanel, Instance.GetNode("TerrainTexture4")); + return _L_TerrainTexture4; + } + } + private TerrainTexture4 _L_TerrainTexture4; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.Brush + /// + public Brush L_Brush + { + get + { + if (_L_Brush == null) _L_Brush = new Brush(UiPanel, Instance.GetNode("Brush")); + return _L_Brush; + } + } + private Brush _L_Brush; + + public TerrainRoot(TileSetEditorTerrainPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override TerrainRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.Grid + /// + public class Grid : UiNode + { + public Grid(TileSetEditorTerrainPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Grid Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.FocusBtn + /// + public class FocusBtn : UiNode + { + public FocusBtn(TileSetEditorTerrainPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg + /// + public class TopBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TerrainRoot + /// + public TerrainRoot L_TerrainRoot + { + get + { + if (_L_TerrainRoot == null) _L_TerrainRoot = new TerrainRoot(UiPanel, Instance.GetNode("TerrainRoot")); + return _L_TerrainRoot; + } + } + private TerrainRoot _L_TerrainRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.Grid + /// + public Grid L_Grid + { + get + { + if (_L_Grid == null) _L_Grid = new Grid(UiPanel, Instance.GetNode("Grid")); + return _L_Grid; + } + } + private Grid _L_Grid; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.FocusBtn + /// + public FocusBtn L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn _L_FocusBtn; + + public TopBg(TileSetEditorTerrainPanel uiPanel, UI.TileSetEditorTerrain.TileEditTerrain node) : base(uiPanel, node) { } + public override TopBg Clone() => new (UiPanel, (UI.TileSetEditorTerrain.TileEditTerrain)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer + /// + public class HSplitContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.TopTab + /// + public TopTab L_TopTab + { + get + { + if (_L_TopTab == null) _L_TopTab = new TopTab(UiPanel, Instance.GetNode("TopTab")); + return _L_TopTab; + } + } + private TopTab _L_TopTab; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.TopBg + /// + public TopBg L_TopBg + { + get + { + if (_L_TopBg == null) _L_TopBg = new TopBg(UiPanel, Instance.GetNode("TopBg")); + return _L_TopBg; + } + } + private TopBg _L_TopBg; + + public HSplitContainer(TileSetEditorTerrainPanel uiPanel, Godot.HSplitContainer node) : base(uiPanel, node) { } + public override HSplitContainer Clone() => new (UiPanel, (Godot.HSplitContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelTop + /// + public class PanelTop : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.HSplitContainer + /// + public HSplitContainer L_HSplitContainer + { + get + { + if (_L_HSplitContainer == null) _L_HSplitContainer = new HSplitContainer(UiPanel, Instance.GetNode("HSplitContainer")); + return _L_HSplitContainer; + } + } + private HSplitContainer _L_HSplitContainer; + + public PanelTop(TileSetEditorTerrainPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override PanelTop Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.CellRoot.BottomCell + /// + public class BottomCell : UiNode + { + public BottomCell(TileSetEditorTerrainPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override BottomCell Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.CellRoot + /// + public class CellRoot_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.BottomCell + /// + public BottomCell L_BottomCell + { + get + { + if (_L_BottomCell == null) _L_BottomCell = new BottomCell(UiPanel, Instance.GetNode("BottomCell")); + return _L_BottomCell; + } + } + private BottomCell _L_BottomCell; + + public CellRoot_1(TileSetEditorTerrainPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override CellRoot_1 Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.MaskBrush + /// + public class MaskBrush : UiNode + { + public MaskBrush(TileSetEditorTerrainPanel uiPanel, EditorMaskBrush node) : base(uiPanel, node) { } + public override MaskBrush Clone() => new (UiPanel, (EditorMaskBrush)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture + /// + public class TileTexture : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.CellRoot + /// + public CellRoot_1 L_CellRoot + { + get + { + if (_L_CellRoot == null) _L_CellRoot = new CellRoot_1(UiPanel, Instance.GetNode("CellRoot")); + return _L_CellRoot; + } + } + private CellRoot_1 _L_CellRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.MaskBrush + /// + public MaskBrush L_MaskBrush + { + get + { + if (_L_MaskBrush == null) _L_MaskBrush = new MaskBrush(UiPanel, Instance.GetNode("MaskBrush")); + return _L_MaskBrush; + } + } + private MaskBrush _L_MaskBrush; + + public TileTexture(TileSetEditorTerrainPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override TileTexture Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.Grid + /// + public class Grid_1 : UiNode + { + public Grid_1(TileSetEditorTerrainPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Grid_1 Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.FocusBtn + /// + public class FocusBtn_1 : UiNode + { + public FocusBtn_1(TileSetEditorTerrainPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public override FocusBtn_1 Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg + /// + public class BottomBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.TileTexture + /// + public TileTexture L_TileTexture + { + get + { + if (_L_TileTexture == null) _L_TileTexture = new TileTexture(UiPanel, Instance.GetNode("TileTexture")); + return _L_TileTexture; + } + } + private TileTexture _L_TileTexture; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.Grid + /// + public Grid_1 L_Grid + { + get + { + if (_L_Grid == null) _L_Grid = new Grid_1(UiPanel, Instance.GetNode("Grid")); + return _L_Grid; + } + } + private Grid_1 _L_Grid; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.FocusBtn + /// + public FocusBtn_1 L_FocusBtn + { + get + { + if (_L_FocusBtn == null) _L_FocusBtn = new FocusBtn_1(UiPanel, Instance.GetNode("FocusBtn")); + return _L_FocusBtn; + } + } + private FocusBtn_1 _L_FocusBtn; + + public BottomBg(TileSetEditorTerrainPanel uiPanel, UI.TileSetEditorTerrain.TileEditArea node) : base(uiPanel, node) { } + public override BottomBg Clone() => new (UiPanel, (UI.TileSetEditorTerrain.TileEditArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer.PanelBottom + /// + public class PanelBottom : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.BottomBg + /// + public BottomBg L_BottomBg + { + get + { + if (_L_BottomBg == null) _L_BottomBg = new BottomBg(UiPanel, Instance.GetNode("BottomBg")); + return _L_BottomBg; + } + } + private BottomBg _L_BottomBg; + + public PanelBottom(TileSetEditorTerrainPanel uiPanel, Godot.Panel node) : base(uiPanel, node) { } + public override PanelBottom Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.VSplitContainer + /// + public class VSplitContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.PanelTop + /// + public PanelTop L_PanelTop + { + get + { + if (_L_PanelTop == null) _L_PanelTop = new PanelTop(UiPanel, Instance.GetNode("PanelTop")); + return _L_PanelTop; + } + } + private PanelTop _L_PanelTop; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.PanelBottom + /// + public PanelBottom L_PanelBottom + { + get + { + if (_L_PanelBottom == null) _L_PanelBottom = new PanelBottom(UiPanel, Instance.GetNode("PanelBottom")); + return _L_PanelBottom; + } + } + private PanelBottom _L_PanelBottom; + + public VSplitContainer(TileSetEditorTerrainPanel uiPanel, Godot.VSplitContainer node) : base(uiPanel, node) { } + public override VSplitContainer Clone() => new (UiPanel, (Godot.VSplitContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: TileSetEditorTerrain.DragSprite + /// + public class DragSprite : UiNode + { + public DragSprite(TileSetEditorTerrainPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override DragSprite Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.AddButton + /// + public AddButton S_AddButton => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_HBoxContainer.L_AddButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.EditButton + /// + public EditButton S_EditButton => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_HBoxContainer.L_EditButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer.DeleteButton + /// + public DeleteButton S_DeleteButton => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_HBoxContainer.L_DeleteButton; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.HBoxContainer + /// + public HBoxContainer S_HBoxContainer => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_HBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab.SelectTexture + /// + public SelectTexture S_SelectTexture => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_ScrollContainer.L_TerrainTab.L_SelectTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab.ErrorIcon + /// + public ErrorIcon S_ErrorIcon => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_ScrollContainer.L_TerrainTab.L_ErrorIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer.TerrainTab + /// + public TerrainTab S_TerrainTab => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_ScrollContainer.L_TerrainTab; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer.ScrollContainer + /// + public ScrollContainer S_ScrollContainer => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer.L_ScrollContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab.VBoxContainer + /// + public VBoxContainer S_VBoxContainer => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab.L_VBoxContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopTab + /// + public TopTab S_TopTab => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopTab; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot.RightCell.CellTexture + /// + public CellTexture S_CellTexture => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_CellRoot.L_RightCell.L_CellTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.CellRoot.RightCell + /// + public RightCell S_RightCell => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_CellRoot.L_RightCell; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture1 + /// + public TerrainTexture1 S_TerrainTexture1 => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_TerrainTexture1; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture2 + /// + public TerrainTexture2 S_TerrainTexture2 => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_TerrainTexture2; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture3 + /// + public TerrainTexture3 S_TerrainTexture3 => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_TerrainTexture3; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.TerrainTexture4 + /// + public TerrainTexture4 S_TerrainTexture4 => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_TerrainTexture4; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot.Brush + /// + public Brush S_Brush => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot.L_Brush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg.TerrainRoot + /// + public TerrainRoot S_TerrainRoot => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg.L_TerrainRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer.TopBg + /// + public TopBg S_TopBg => L_VSplitContainer.L_PanelTop.L_HSplitContainer.L_TopBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop.HSplitContainer + /// + public HSplitContainer S_HSplitContainer => L_VSplitContainer.L_PanelTop.L_HSplitContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelTop + /// + public PanelTop S_PanelTop => L_VSplitContainer.L_PanelTop; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.CellRoot.BottomCell + /// + public BottomCell S_BottomCell => L_VSplitContainer.L_PanelBottom.L_BottomBg.L_TileTexture.L_CellRoot.L_BottomCell; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture.MaskBrush + /// + public MaskBrush S_MaskBrush => L_VSplitContainer.L_PanelBottom.L_BottomBg.L_TileTexture.L_MaskBrush; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg.TileTexture + /// + public TileTexture S_TileTexture => L_VSplitContainer.L_PanelBottom.L_BottomBg.L_TileTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom.BottomBg + /// + public BottomBg S_BottomBg => L_VSplitContainer.L_PanelBottom.L_BottomBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer.PanelBottom + /// + public PanelBottom S_PanelBottom => L_VSplitContainer.L_PanelBottom; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.VSplitContainer + /// + public VSplitContainer S_VSplitContainer => L_VSplitContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.DragSprite + /// + public DragSprite S_DragSprite => L_DragSprite; + +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs new file mode 100644 index 0000000..15d2760 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs @@ -0,0 +1,522 @@ +using Godot; +using UI.TileSetEditor; + +namespace UI.TileSetEditorTerrain; + +public partial class TileSetEditorTerrainPanel : TileSetEditorTerrain +{ + /// + /// 父Ui + /// + public TileSetEditorPanel EditorPanel; + + /// + /// 当前选中的地形索引 + /// + public int CurrTerrainIndex => TerrainTabGrid.SelectIndex; + + /// + /// 当前选中的地形 + /// + public TileSetTerrainInfo CurrTerrain + { + get + { + var terrain = EditorPanel.TileSetSourceInfo?.Terrain; + if (terrain == null) + { + return null; + } + if (CurrTerrainIndex < 0 || CurrTerrainIndex >= terrain.Count) + { + return null; + } + return terrain[CurrTerrainIndex]; + } + } + + /// + /// 正在拖拽的图块 + /// + public MaskCell DraggingCell { get; set; } + + public UiGrid TerrainTabGrid; + public UiGrid TerrainGrid3x3; + public UiGrid TerrainGrid2x2; + public UiGrid TerrainGridMiddle; + public UiGrid TerrainGridFloor; + public UiGrid MaskGrid; + + private bool _refreshGridConnect = false; + + public override void OnCreateUi() + { + EditorPanel = (TileSetEditorPanel)ParentUi; + S_DragSprite.Instance.Visible = false; + + //改变选中的TileSet资源 + AddEventListener(EventEnum.OnSelectTileSetSource, OnSelectTileSetSource); + //改变纹理事件 + AddEventListener(EventEnum.OnSetTileTexture, (data) => + { + OnSetTileTexture(data); + if (TerrainTabGrid.SelectIndex >= 0) + { + OnChangeTerrain(TerrainTabGrid.SelectIndex); + } + }); + //背景颜色改变 + AddEventListener(EventEnum.OnSetTileSetBgColor, OnChangeTileSetBgColor); + + //地形页签 + TerrainTabGrid = CreateUiGrid(S_TerrainTab); + TerrainTabGrid.SetCellOffset(Vector2I.Zero); + TerrainTabGrid.SetColumns(1); + TerrainTabGrid.SetHorizontalExpand(true); + + MaskGrid = CreateUiGrid(S_BottomCell); + MaskGrid.SetCellOffset(Vector2I.Zero); + MaskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore; + + TerrainGrid3x3 = InitTopGrid(S_TerrainRoot.L_TerrainTexture1.Instance, GameConfig.TerrainBit3x3, TileSetTerrainInfo.TerrainLayerType); + TerrainGrid2x2 = InitTopGrid(S_TerrainRoot.L_TerrainTexture4.Instance, GameConfig.TerrainBit2x2, TileSetTerrainInfo.TerrainLayerType); + TerrainGridMiddle = InitTopGrid(S_TerrainRoot.L_TerrainTexture2.Instance, GameConfig.TerrainBitMiddle, TileSetTerrainInfo.MiddleLayerType); + TerrainGridFloor = InitTopGrid(S_TerrainRoot.L_TerrainTexture3.Instance, GameConfig.TerrainBitFloor, TileSetTerrainInfo.FloorLayerType); + + //删除地形按钮 + S_DeleteButton.Instance.Pressed += OnDeleteTerrainClick; + //添加地形按钮 + S_AddButton.Instance.Pressed += OnAddTerrainClick; + //编辑地形 + S_EditButton.Instance.Pressed += OnEditTerrainClick; + + OnSetTileTexture(EditorPanel.Texture); + OnChangeTileSetBgColor(EditorPanel.BgColor); + + OnChangeTerrainType(-1); + //改变选中的地形 + TerrainTabGrid.SelectEvent += OnChangeTerrain; + } + + public override void OnDestroyUi() + { + + } + + public override void Process(float delta) + { + S_MaskBrush.Instance.Visible = DraggingCell == null; + + if (_refreshGridConnect) + { + _refreshGridConnect = false; + + var terrainList = EditorPanel.TileSetSourceInfo.Terrain; + for (var i = 0; i < terrainList.Count; i++) + { + var terrain = terrainList[i]; + if (terrain.TerrainType == 0) //选中47格Terrain + { + TerrainGrid3x3.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source + { + TerrainGridMiddle.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); + TerrainGridFloor.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); + } + } + else //选中13格Terrain + { + TerrainGrid2x2.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); + } + } + } + } + + private UiGrid InitTopGrid(Control texture, Vector2I size, byte type) + { + var cellRoot = S_TopBg.L_TerrainRoot.L_CellRoot; + var sRightCell = cellRoot.L_RightCell; + sRightCell.Instance.Position = texture.Position; + var grid = CreateUiGrid(sRightCell, cellRoot.Instance); + grid.GridContainer.MouseFilter = MouseFilterEnum.Ignore; + grid.SetCellOffset(Vector2I.Zero); + grid.SetColumns(size.X); + for (var y = 0; y < size.Y; y++) + { + for (var x = 0; x < size.X; x++) + { + grid.Add(type); + } + } + + return grid; + } + + //改变选中的TileSet资源 + private void OnSelectTileSetSource(object obj) + { + TerrainTabGrid.RemoveAll(); + //加载Terrain + if (obj != null) + { + var terrainList = ((TileSetSourceInfo)obj).Terrain; + if (terrainList.Count > 0) + { + TerrainTabGrid.SetDataList(terrainList.ToArray()); + TerrainTabGrid.SelectIndex = 0; + } + } + } + + private void SetTerrainCellData(TileSetTerrainInfo terrain, UiCell cell) + { + var data = terrain.GetTerrainCell(cell.Index, cell.Data); + if (data != null) + { + var terrainCell = (TerrainCell)cell; + var x = data[0]; + var y = data[1]; + terrainCell.SetCell(new Rect2I(x, y, GameConfig.TileCellSize, GameConfig.TileCellSize)); + } + } + + private void RefreshConnectTerrainCell(TileSetTerrainInfo terrain, UiCell cell) + { + var data = terrain.GetTerrainCell(cell.Index, cell.Data); + if (data != null) + { + var terrainCell = (TerrainCell)cell; + var x = data[0]; + var y = data[1]; + var index = x / GameConfig.TileCellSize + y / GameConfig.TileCellSize * MaskGrid.GetColumns(); + var maskCell = (MaskCell)MaskGrid.GetCell(index); + if (maskCell != null) + { + //绑定TerrainCell + maskCell.SetConnectTerrainCell(terrainCell); + } + } + } + + private void RefreshTerrainCellUseFlag(TileSetTerrainInfo terrain, UiCell cell) + { + var data = terrain.GetTerrainCell(cell.Index, cell.Data); + if (data != null) + { + var x = data[0]; + var y = data[1]; + var index = x / GameConfig.TileCellSize + y / GameConfig.TileCellSize * MaskGrid.GetColumns(); + var maskCell = (MaskCell)MaskGrid.GetCell(index); + if (maskCell != null) + { + maskCell.SetUseFlag(true); + } + } + } + + /// + /// 放置地形Cell纹理 + /// + public void OnDropCell(MaskCell maskCell) + { + var terrain = CurrTerrain; + if (terrain == null) + { + return; + } + if (terrain.TerrainType == 0) //选中47个Terrain + { + var flag = true; + TerrainGrid3x3.ForEach((cell) => + { + flag = !((TerrainCell)cell).OnDropCell(maskCell); + return flag; + }); + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source + { + if (flag) + { + TerrainGridMiddle.ForEach((cell) => + { + flag = !((TerrainCell)cell).OnDropCell(maskCell); + return flag; + }); + } + if (flag) + { + TerrainGridFloor.ForEach((cell) => + { + return ((TerrainCell)cell).OnDropCell(maskCell); + }); + } + } + } + else //选中13格Terrain + { + TerrainGrid2x2.ForEach((cell) => + { + return !((TerrainCell)cell).OnDropCell(maskCell); + }); + } + } + + //改变TileSet纹理 + private void OnSetTileTexture(object arg) + { + S_BottomBg.Instance.OnChangeTileSetTexture(); + + MaskGrid.RemoveAll(); + var cellHorizontal = EditorPanel.CellHorizontal; + if (cellHorizontal <= 0) + { + return; + } + var cellVertical = EditorPanel.CellVertical; + MaskGrid.SetColumns(cellHorizontal); + for (var y = 0; y < cellVertical; y++) + { + for (var x = 0; x < cellHorizontal; x++) + { + MaskGrid.Add(new Rect2I(x * GameConfig.TileCellSize, y * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize)); + } + } + + _refreshGridConnect = true; + } + + //更改背景颜色 + private void OnChangeTileSetBgColor(object obj) + { + S_BottomBg.Instance.Color = EditorPanel.BgColor; + S_TopBg.Instance.Color = EditorPanel.BgColor; + } + + //切换选中的地形 + private void OnChangeTerrain(int index) + { + //清除所有绑定的Terrain + if (index >= 0) + { + TerrainGrid3x3.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); + TerrainGridMiddle.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); + TerrainGridFloor.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); + TerrainGrid2x2.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); + } + S_TopBg.Instance.SetHoverCell(null); + S_BottomBg.Instance.SetHoverCell(null); + + MaskGrid.ForEach(cell => + { + ((MaskCell)cell).SetConnectTerrainCell(null); + }); + + var terrain = CurrTerrain; + if (terrain != null) + { + if (terrain.TerrainType == 0) //选中47个Terrain + { + TerrainGrid3x3.ForEach(cell => + { + SetTerrainCellData(terrain, cell); + RefreshConnectTerrainCell(terrain, cell); + }); + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source + { + TerrainGridMiddle.ForEach(cell => + { + SetTerrainCellData(terrain, cell); + RefreshConnectTerrainCell(terrain, cell); + }); + TerrainGridFloor.ForEach(cell => + { + SetTerrainCellData(terrain, cell); + RefreshConnectTerrainCell(terrain, cell); + }); + } + } + else //选中13格Terrain + { + TerrainGrid2x2.ForEach(cell => + { + SetTerrainCellData(terrain, cell); + RefreshConnectTerrainCell(terrain, cell); + }); + } + } + + if (index >= 0) + { + OnChangeTerrainType(TerrainTabGrid.GetCell(index).Data.TerrainType); + } + else + { + OnChangeTerrainType(-1); + } + } + + /// + /// 切换Terrain类型 + /// + private void OnChangeTerrainType(long index) + { + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中 Main Source + { + S_TerrainTexture2.Instance.Visible = true; + S_TerrainTexture3.Instance.Visible = true; + TerrainGridMiddle.Visible = true; + TerrainGridFloor.Visible = true; + S_TerrainTexture1.L_Label.Instance.Text = "顶部墙壁"; + } + else + { + S_TerrainTexture2.Instance.Visible = false; + S_TerrainTexture3.Instance.Visible = false; + TerrainGridMiddle.Visible = false; + TerrainGridFloor.Visible = false; + S_TerrainTexture1.L_Label.Instance.Text = "地形"; + } + + if (index == 0) //47 格子 + { + S_TerrainRoot.L_TerrainTexture1.Instance.Visible = true; + TerrainGrid3x3.Visible = true; + S_TerrainRoot.L_TerrainTexture4.Instance.Visible = false; + TerrainGrid2x2.Visible = false; + } + else if (index == 1) //13 格子 + { + S_TerrainRoot.L_TerrainTexture1.Instance.Visible = false; + TerrainGrid3x3.Visible = false; + S_TerrainRoot.L_TerrainTexture4.Instance.Visible = true; + TerrainGrid2x2.Visible = true; + } + else + { + S_TerrainRoot.L_TerrainTexture1.Instance.Visible = false; + TerrainGrid3x3.Visible = false; + S_TerrainRoot.L_TerrainTexture4.Instance.Visible = false; + TerrainGrid2x2.Visible = false; + } + } + + //删除地形 + private void OnDeleteTerrainClick() + { + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //不能删除 Main Terrain + { + EditorWindowManager.ShowTips("警告", "不允许删除 Main Terrain!"); + return; + } + + var terrain = CurrTerrain; + if (terrain != null) + { + EditorWindowManager.ShowConfirm("提示", $"是否删除地形'{terrain.Name}'?", (v) => + { + if (v) + { + var index = TerrainTabGrid.SelectIndex; + //执行删除操作 + + //清除Mask + if (terrain.TerrainType == 0) //47格 + { + TerrainGrid3x3.ForEach(cell => + { + var terrainCell = (TerrainCell)cell; + terrainCell.ClearCellTexture(); + if (terrainCell.ConnectMaskCell != null) + { + terrainCell.ConnectMaskCell.SetUseFlag(false); + terrainCell.ConnectMaskCell.SetConnectTerrainCell(null); + } + }); + } + else //13格 + { + TerrainGrid2x2.ForEach(cell => + { + var terrainCell = (TerrainCell)cell; + terrainCell.ClearCellTexture(); + if (terrainCell.ConnectMaskCell != null) + { + terrainCell.ConnectMaskCell.SetUseFlag(false); + terrainCell.ConnectMaskCell.SetConnectTerrainCell(null); + } + }); + } + + EditorPanel.TileSetSourceInfo.Terrain.Remove(terrain); + TerrainTabGrid.RemoveByIndex(index); + + if (index == TerrainTabGrid.Count) + { + TerrainTabGrid.SelectIndex = TerrainTabGrid.Count - 1; + } + else + { + TerrainTabGrid.SelectIndex = index; + } + //标记数据脏了 + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + }); + } + else + { + EditorWindowManager.ShowTips("提示", "清选择一个Terrain!"); + } + } + + //创建地形 + private void OnAddTerrainClick() + { + EditorWindowManager.ShowCreateTerrain(EditorPanel.TileSetSourceInfo, terrainInfo => + { + //执行添加操作 + EditorPanel.TileSetSourceInfo.Terrain.Add(terrainInfo); + TerrainTabGrid.Add(terrainInfo, true); + //标记数据脏了 + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + }); + } + + //编辑地形(重命名) + private void OnEditTerrainClick() + { + if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //不能删除 Main Terrain + { + EditorWindowManager.ShowTips("警告", "不允许重命名 Main Terrain!"); + return; + } + + var terrain = CurrTerrain; + if (terrain != null) + { + EditorWindowManager.ShowInput("提示", $"是否删除地形'{terrain.Name}'?", terrain.Name, (v, isClose) => + { + if (string.IsNullOrEmpty(v)) + { + EditorWindowManager.ShowTips("错误", $"名称不允许为空!"); + return false; + } + if (terrain.Name != v && EditorPanel.TileSetSourceInfo.Terrain.FindIndex(info => info.Name == v) >= 0) + { + EditorWindowManager.ShowTips("错误", $"已经有相同名称的Terrain了!"); + return false; + } + + terrain.Name = v; + //刷新页签 + ((TerrainTabCell)TerrainTabGrid.GetCell(CurrTerrainIndex)).RefreshData(); + //标记数据脏了 + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + return true; + }); + } + else + { + EditorWindowManager.ShowTips("提示", "清选择一个Terrain!"); + } + } +} diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/MaskCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/MaskCell.cs new file mode 100644 index 0000000..8f0554c --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/MaskCell.cs @@ -0,0 +1,102 @@ +using Godot; + +namespace UI.TileSetEditorTerrain; + +public class MaskCell : UiCell +{ + /// + /// 已经赋值并连接的TerrainCell + /// + public TerrainCell ConnectTerrainCell { get; private set; } + + /// + /// 是否使用 + /// + public bool UseFlag { get; private set; } + + /// + /// 鼠标是否悬停 + /// + public bool Hover { get; set; } + + private TextureRect _textureRect; + private TileSetEditorTerrainPanel _panel; + private float _startA; + + public override void OnInit() + { + _startA = CellNode.Instance.Color.A; + _panel = CellNode.UiPanel; + _textureRect = _panel.S_BottomBg.L_TileTexture.Instance; + CellNode.Instance.Draw += Draw; + } + + public override void OnDisable() + { + SetUseFlag(false); + SetConnectTerrainCell(null); + } + + public override void Process(float delta) + { + CellNode.Instance.QueueRedraw(); + } + + /// + /// 设置连接的Cell + /// + public void SetConnectTerrainCell(TerrainCell terrainCell) + { + if (terrainCell == null) + { + if (ConnectTerrainCell != null) + { + ConnectTerrainCell.ConnectMaskCell = null; + } + ConnectTerrainCell = null; + } + else if (ConnectTerrainCell != terrainCell) + { + ConnectTerrainCell = terrainCell; + terrainCell.ConnectMaskCell = this; + } + } + + /// + /// 设置是否使用 + /// + public void SetUseFlag(bool flag) + { + UseFlag = flag; + CellNode.Instance.Color = new Color(0, 0, 0, flag ? 0 : _startA); + } + + private void Draw() + { + if (Hover || (ConnectTerrainCell != null && ConnectTerrainCell.Hover)) + { + CellNode.Instance.DrawRect( + new Rect2(Vector2.Zero, CellNode.Instance.Size), + new Color(0, 1, 0, 0.3f) + ); + } + + //选中时绘制轮廓 + if (ConnectTerrainCell != null) //存在连接的Cell + { + var width = 2f / _textureRect.Scale.X; + CellNode.Instance.DrawRect( + new Rect2(Vector2.Zero + new Vector2(width / 2f, width / 2f), CellNode.Instance.Size - new Vector2(width, width)), + new Color(0, 1, 0, 0.6f), false, width + ); + } + else if (UseFlag) + { + var width = 2f / _textureRect.Scale.X; + CellNode.Instance.DrawRect( + new Rect2(Vector2.Zero + new Vector2(width / 2f, width / 2f), CellNode.Instance.Size - new Vector2(width, width)), + new Color(1, 1, 1, 0.6f), false, width + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/TileEditArea.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/TileEditArea.cs new file mode 100644 index 0000000..45c0023 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/down/TileEditArea.cs @@ -0,0 +1,130 @@ +using Godot; + +namespace UI.TileSetEditorTerrain; + +public partial class TileEditArea : EditorGridBg +{ + public new TileSetEditorTerrain.BottomBg UiNode => (TileSetEditorTerrain.BottomBg)base.UiNode; + + private bool _dragMoveFlag = false; + private MaskCell _hoverCell = null; + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + InitNode(UiNode.L_TileTexture.Instance, UiNode.L_Grid.Instance); + UiNode.L_TileTexture.L_MaskBrush.Instance.Init(UiNode.L_TileTexture.Instance, UiNode.UiPanel.EditorPanel); + + UiNode.L_TileTexture.Instance.Texture = UiNode.UiPanel.EditorPanel.Texture; + + //聚焦按钮点击 + UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; + + //拖拽Cell + UiNode.Instance.AddDragListener(OnDrag); + } + + public override void _Process(double delta) + { + MaskCell cell = null; + var _panel = UiNode.UiPanel; + if (!_panel.MaskGrid.IsDestroyed && _panel.S_BottomBg.Instance.IsMouseInRect() && _panel.S_TileTexture.Instance.IsMouseInRect()) + { + var cellPosition = Utils.GetMouseCellPosition(_panel.S_TileTexture.Instance); + var index = cellPosition.X + cellPosition.Y * _panel.MaskGrid.GetColumns(); + var tempCell = (MaskCell)_panel.MaskGrid.GetCell(index); + if (tempCell != null && tempCell.ConnectTerrainCell != null) + { + cell = tempCell; + } + } + SetHoverCell(cell); + } + + /// + /// 设置鼠标悬停Cell + /// + public void SetHoverCell(MaskCell cell) + { + if (cell != _hoverCell) + { + if (_hoverCell != null) + { + _hoverCell.Hover = false; + } + + if (cell != null) + { + cell.Hover = true; + } + + _hoverCell = cell; + } + } + + //拖拽操作 + private void OnDrag(DragState state, Vector2 delta) + { + var _panel = UiNode.UiPanel; + var sprite = _panel.S_DragSprite.Instance; + if (state == DragState.DragStart) //拖拽开始 + { + //这里要判断一下是否在BottomBg和TileTexture区域内 + if (_panel.S_BottomBg.Instance.IsMouseInRect() && _panel.S_TileTexture.Instance.IsMouseInRect()) + { + var cellPosition = Utils.GetMouseCellPosition(_panel.S_TileTexture.Instance); + var index = cellPosition.X + cellPosition.Y * _panel.MaskGrid.GetColumns(); + var cell = (MaskCell)_panel.MaskGrid.GetCell(index); + if (cell != null && !cell.UseFlag) //必须要没有使用的Cell + { + _panel.DraggingCell = cell; + _panel.MaskGrid.SelectIndex = index; + _dragMoveFlag = false; + } + } + } + else if (state == DragState.DragEnd) //拖拽结束 + { + if (_panel.DraggingCell != null) + { + if (_panel.S_TopBg.Instance.IsMouseInRect()) //找到放置的Cell + { + _panel.OnDropCell(_panel.DraggingCell); + } + sprite.Visible = false; + _dragMoveFlag = false; + _panel.DraggingCell = null; + } + } + else if (_panel.DraggingCell != null) //拖拽移动 + { + if (!_dragMoveFlag) + { + _dragMoveFlag = true; + sprite.Texture = _panel.S_TileTexture.Instance.Texture; + sprite.RegionRect = _panel.DraggingCell.Data; + sprite.Scale = _panel.S_TopBg.L_TerrainRoot.Instance.Scale; + sprite.Visible = true; + sprite.GlobalPosition = sprite.GetGlobalMousePosition(); + } + sprite.GlobalPosition = sprite.GetGlobalMousePosition(); + } + } + + /// + /// 改变TileSet纹理 + /// + public void OnChangeTileSetTexture() + { + UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize(); + OnFocusClick(); + } + + //聚焦按钮点击 + private void OnFocusClick() + { + var texture = UiNode.L_TileTexture.Instance.Texture; + Utils.DoFocusNode(ContainerRoot, Size, texture != null ? texture.GetSize() : Vector2.Zero); + RefreshGridTrans(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainBrush.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainBrush.cs new file mode 100644 index 0000000..243960e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainBrush.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using Godot; + +namespace UI.TileSetEditorTerrain; + +public partial class TerrainBrush : Control, IUiNodeScript +{ + public Control Root { get; set; } + public List TerrainTextureList { get; } = new List(); + + private TileSetEditorTerrain.Brush _uiNode; + + public void SetUiNode(IUiNode uiNode) + { + _uiNode = (TileSetEditorTerrain.Brush) uiNode; + } + + public void OnDestroy() + { + + } + + public override void _Process(double delta) + { + QueueRedraw(); + } + + public override void _Draw() + { + var scale = Root.Scale; + + //绘制区域 + for (var i = 0; i < TerrainTextureList.Count; i++) + { + var control = TerrainTextureList[i]; + if (control.Visible) + { + DrawRect( + new Rect2(control.Position, control.Size.AsVector2I()), new Color(1, 1, 0, 0.5f), false, + 2f / scale.X + ); + } + } + + //绘制鼠标悬停区域 + for (var i = 0; i < TerrainTextureList.Count; i++) + { + var control = TerrainTextureList[i]; + if (control.Visible && control.IsMouseInRect()) + { + var pos = Utils.GetMouseCellPosition(control) * GameConfig.TileCellSize; + DrawRect( + new Rect2(pos + control.Position, GameConfig.TileCellSizeVector2I), + Colors.Green, false, 3f / scale.X + ); + break; + } + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCell.cs new file mode 100644 index 0000000..c0ba71e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCell.cs @@ -0,0 +1,144 @@ +using Godot; + +namespace UI.TileSetEditorTerrain; + +public class TerrainCell : UiCell +{ + /// + /// 已经赋值并连接的MaskCell + /// + public MaskCell ConnectMaskCell { get; set; } + + /// + /// 鼠标是否悬停 + /// + public bool Hover { get; set; } + + /// + /// 是否放置了图块 + /// + public bool IsPutDownTexture { get; private set; } + + /// + /// 图块在 Source 中的位置, 单位: 像素 + /// + public Vector2I TextureCell { get; private set; } + + private TileSetEditorTerrainPanel _panel; + + public override void OnInit() + { + _panel = CellNode.UiPanel; + CellNode.Instance.Draw += OnDraw; + } + + /// + /// 拖拽放置Cell + /// + public bool OnDropCell(MaskCell maskCell) + { + if (CellNode.Instance.IsMouseInRect()) + { + OnDropData(maskCell); + return true; + } + + return false; + } + + public override void Process(float delta) + { + CellNode.Instance.QueueRedraw(); + } + + /// + /// 擦除当前选择的图块 + /// + public void EraseCell() + { + var flag = IsPutDownTexture; + ClearCellTexture(); + if (flag) + { + ClearTerrainBitData(); + if (ConnectMaskCell != null) + { + ConnectMaskCell.SetUseFlag(false); + ConnectMaskCell.SetConnectTerrainCell(null); + } + } + } + + /// + /// 设置选择的Cell + /// + public void SetCell(Rect2I rect) + { + TextureCell = rect.Position; + var sprite2D = CellNode.L_CellTexture.Instance; + sprite2D.Texture = _panel.EditorPanel.Texture; + sprite2D.RegionEnabled = true; + sprite2D.RegionRect = rect; + IsPutDownTexture = true; + } + + /// + /// 清除选中的cell + /// + public void ClearCellTexture() + { + CellNode.L_CellTexture.Instance.Texture = null; + IsPutDownTexture = false; + } + + /// + /// 清除存储的地形掩码数据 + /// + public void ClearTerrainBitData() + { + SetTerrainBitData(null); + } + + private void OnDropData(MaskCell maskCell) + { + SetCell(maskCell.Data); + SetTerrainBitData(new []{ TextureCell.X, TextureCell.Y }); + if (ConnectMaskCell != maskCell) + { + if (ConnectMaskCell != null) + { + ConnectMaskCell.SetUseFlag(false); + ConnectMaskCell.SetConnectTerrainCell(null); + } + maskCell.SetConnectTerrainCell(this); + maskCell.SetUseFlag(true); + } + } + + private void SetTerrainBitData(int[] cellData) + { + if (cellData == null) + { + _panel.CurrTerrain?.RemoveTerrainCell(Index, Data); + _panel.CurrTerrain?.RefreshReady(_panel.EditorPanel.TileSetSourceIndex, _panel.CurrTerrainIndex); + } + else + { + _panel.CurrTerrain?.SetTerrainCell(Index, Data, cellData); + _panel.CurrTerrain?.RefreshReady(_panel.EditorPanel.TileSetSourceIndex, _panel.CurrTerrainIndex); + } + + EventManager.EmitEvent(EventEnum.OnTileSetDirty); + } + + private void OnDraw() + { + if (ConnectMaskCell != null && (Hover || ConnectMaskCell.Hover)) + { + CellNode.Instance.DrawRect( + new Rect2(Vector2.Zero, CellNode.Instance.Size), + new Color(0, 1, 0, 0.2f) + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TileEditTerrain.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TileEditTerrain.cs new file mode 100644 index 0000000..5a0b01a --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TileEditTerrain.cs @@ -0,0 +1,149 @@ +using Godot; + +namespace UI.TileSetEditorTerrain; + +public partial class TileEditTerrain : EditorGridBg +{ + public new TileSetEditorTerrain.TopBg UiNode => (TileSetEditorTerrain.TopBg)base.UiNode; + + private bool _dragMoveFlag = false; + private TerrainCell _hoverCell = null; + + public override void SetUiNode(IUiNode uiNode) + { + base.SetUiNode(uiNode); + var tileTexture = UiNode.L_TerrainRoot; + InitNode(tileTexture.Instance, UiNode.L_Grid.Instance); + var terrainBrush = tileTexture.L_Brush.Instance; + terrainBrush.Root = tileTexture.Instance; + terrainBrush.TerrainTextureList.Add(tileTexture.L_TerrainTexture1.Instance); + terrainBrush.TerrainTextureList.Add(tileTexture.L_TerrainTexture2.Instance); + terrainBrush.TerrainTextureList.Add(tileTexture.L_TerrainTexture3.Instance); + terrainBrush.TerrainTextureList.Add(tileTexture.L_TerrainTexture4.Instance); + + //聚焦按钮点击 + UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; + } + + /// + /// 改变TileSet纹理 + /// + public void OnChangeTileSetTexture() + { + //UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize(); + OnFocusClick(); + } + + public override void _Process(double delta) + { + //鼠标悬停的图块 + TerrainCell hover = null; + var _panel = UiNode.UiPanel; + var terrain = _panel.CurrTerrain; + if (terrain != null && _panel.S_TopBg.Instance.IsMouseInRect()) + { + if (terrain.TerrainType == 0) //选中47个Terrain + { + hover = CalcMouseHoverCell(_panel.S_TerrainTexture1.Instance, _panel.TerrainGrid3x3); + if (_panel.EditorPanel.TileSetSourceIndex == 0 && _panel.CurrTerrainIndex == 0) //选中Main Source + { + if (hover == null) + { + hover = CalcMouseHoverCell(_panel.S_TerrainTexture2.Instance, _panel.TerrainGridMiddle); + } + if (hover == null) + { + hover = CalcMouseHoverCell(_panel.S_TerrainTexture3.Instance, _panel.TerrainGridFloor); + } + } + } + else //选中13格Terrain + { + hover = CalcMouseHoverCell(_panel.S_TerrainTexture4.Instance, _panel.TerrainGrid2x2); + } + } + + if (hover != null && Input.IsActionJustPressed(InputAction.MouseRight)) + { + //右键擦除 + hover.EraseCell(); + } + else + { + SetHoverCell(hover); + } + } + + /// + /// 计算鼠标悬停在的地形单元。 + /// + /// 矩形控件。 + /// 网格。 + /// 鼠标悬停在的地形单元,如果鼠标不在矩形控件内或单元无效则返回null。 + private TerrainCell CalcMouseHoverCell(Control rectControl, UiGrid grid) + { + if (rectControl.IsMouseInRect()) + { + var cellPosition = Utils.GetMouseCellPosition(rectControl); + var index = cellPosition.X + cellPosition.Y * grid.GetColumns(); + var tempCell = (TerrainCell)grid.GetCell(index); + if (tempCell != null && tempCell.ConnectMaskCell != null) + { + return tempCell; + } + } + + return null; + } + + /// + /// 设置鼠标悬停Cell + /// + public void SetHoverCell(TerrainCell cell) + { + if (cell != _hoverCell) + { + if (_hoverCell != null) + { + _hoverCell.Hover = false; + } + + if (cell != null) + { + cell.Hover = true; + } + + _hoverCell = cell; + } + } + + //聚焦按钮点击 + private void OnFocusClick() + { + Vector2 rootSize; + var panel = UiNode.UiPanel; + if (panel.EditorPanel.TileSetSourceIndex == 0 && panel.CurrTerrainIndex == 0) //选中 Main Source + { + rootSize = UiNode.L_TerrainRoot.Instance.Size; + } + else if (panel.CurrTerrain != null) + { + if (panel.CurrTerrain.TerrainType == 0) //选中 47 格 Terrain + { + rootSize = UiNode.L_TerrainRoot.L_TerrainTexture1.Instance.Size; + } + else //13 格 Terrain + { + rootSize = UiNode.L_TerrainRoot.L_TerrainTexture4.Instance.Size; + } + } + else + { + rootSize = Vector2.One; + } + + Utils.DoFocusNode(ContainerRoot, Size, rootSize); + RefreshGridTrans(); + } + +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/test/TestGridData.cs b/DungeonShooting_Godot/src/test/TestGridData.cs index 6049363..62f1d61 100644 --- a/DungeonShooting_Godot/src/test/TestGridData.cs +++ b/DungeonShooting_Godot/src/test/TestGridData.cs @@ -97,7 +97,7 @@ time = DateTime.Now; testGrid2.ForEach((i, i1, arg3) => { - + return true; }); Debug.Log("Grid遍历用时: " + (DateTime.Now - time).Milliseconds); } diff --git a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs new file mode 100644 index 0000000..7ec33f1 --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs @@ -0,0 +1,67 @@ +using Godot; +using System; +using System.Linq; +using System.Text.Json; +using Godot.Collections; + +public partial class TestLoadTileSetConfig : Node2D +{ + private System.Collections.Generic.Dictionary _tileSetConfig; + private TileMap _tileMap; + + public override void _Ready() + { + InitTileSetConfig(); + _tileMap = GetNode("TileMap"); + + var tileSetSplit = _tileSetConfig["TileSet2"]; + var tileSet = tileSetSplit.GetTileSet(); + //ResourceSaver.Save(tileSet, "test_tileset.tres"); + + _tileMap.TileSet = tileSet; + + _tileMap.SetCell(0, new Vector2I(5, 5), 1, new Vector2I(0, 0)); + _tileMap.SetCellsTerrainConnect(0, new Array() + { + new Vector2I(10, 10), + new Vector2I(10, 11), + new Vector2I(10, 12), + new Vector2I(11, 10), + new Vector2I(11, 11), + new Vector2I(11, 12), + new Vector2I(12, 10), + new Vector2I(12, 11), + new Vector2I(13, 10), + new Vector2I(13, 11), + }, 2, 0, false); + + _tileMap.SetCellsTerrainConnect(0, new Array() + { + new Vector2I(10 + 10, 10), + new Vector2I(10 + 10, 11), + new Vector2I(10 + 10, 12), + new Vector2I(11 + 10, 10), + new Vector2I(11 + 10, 11), + new Vector2I(11 + 10, 12), + new Vector2I(12 + 10, 10), + new Vector2I(12 + 10, 11), + new Vector2I(13 + 10, 10), + new Vector2I(13 + 10, 11), + }, 1, 0, false); + } + + //初始化TileSet配置 + private void InitTileSetConfig() + { + //加载房间配置信息 + var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile); + _tileSetConfig = JsonSerializer.Deserialize>(asText); + + //加载所有数据 + foreach (var tileSetSplit in _tileSetConfig) + { + tileSetSplit.Value.ReloadTileSetInfo(); + } + } + +} diff --git a/DungeonShooting_Godot/src/test/TestNewTerrain.cs b/DungeonShooting_Godot/src/test/TestNewTerrain.cs new file mode 100644 index 0000000..fc7cb8d --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestNewTerrain.cs @@ -0,0 +1,123 @@ +using Godot; +using System; + +/// +/// 测试动态烘焙导航网格 +/// +public partial class TestNewTerrain : Node2D +{ + private TileMap _tileMap; + private Vector2[][] _polygonData; + private NavigationRegion2D _navigationRegion; + + public override void _Ready() + { + Visible = false; + _tileMap = GetNode("TileMap2"); + _navigationRegion = GetNode("TileMap2/NavigationRegion2D"); + _navigationRegion.BakeFinished += BakeFinished; + RunTest(); + + + var tileSet = _tileMap.TileSet; + + var terrainSetsCount = tileSet.GetTerrainSetsCount(); + Debug.Log($"terrainSetsCount: {terrainSetsCount}"); + for (var i = 0; i < terrainSetsCount; i++) + { + Debug.Log("----------------------------------------------------"); + var count = tileSet.GetTerrainsCount(i); + Debug.Log($"terrainSet: {i} - {count} - {tileSet.GetTerrainSetMode(i)}"); + for (int j = 0; j < count; j++) + { + var terrainName = tileSet.GetTerrainName(i, j); + Debug.Log($"terrainName: {terrainName}"); + } + } + + var tileSetSource = tileSet.GetSource(0); + if (tileSetSource is TileSetAtlasSource atlasSource) + { + var tilesCount = tileSetSource.GetTilesCount(); + for (int i = 0; i < tilesCount; i++) + { + var pos = tileSetSource.GetTileId(i); + var tileData = atlasSource.GetTileData(pos, 0); + Debug.Log($"pos: {pos}, terrain: {tileData.Terrain}, terrainSet: {tileData.TerrainSet}, peering: {tileData.GetTerrainPeeringValue() & TerrainPeering.Top}"); + if (tileData.Terrain != -1 && tileData.TerrainSet != -1) + { + var str = ""; + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner) + 1).ToString(); + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopSide) + 1).ToString(); + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner) + 1).ToString() + "\n"; + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide) + 1).ToString(); + str += "1"; + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.RightSide) + 1).ToString() + "\n"; + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner) + 1).ToString(); + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide) + 1).ToString(); + str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner) + 1).ToString(); + GD.Print(str); + } + else + { + GD.Print("000\n000\n000"); + } + } + } + + } + + private void BakeFinished() + { + var polygonData = _navigationRegion.NavigationPolygon; + var polygons = polygonData.Polygons; + var vertices = polygonData.Vertices; + _polygonData = new Vector2[polygons.Count][]; + for (var i = 0; i < polygons.Count; i++) + { + var polygon = polygons[i]; + var v2Array = new Vector2[polygon.Length]; + for (var j = 0; j < polygon.Length; j++) + { + v2Array[j] = vertices[polygon[j]]; + } + _polygonData[i] = v2Array; + } + } + + public override void _Process(double delta) + { + QueueRedraw(); + } + + public override void _Draw() + { + if (_polygonData != null) + { + //Utils.DrawNavigationPolygon(this, _polygonData); + foreach (var vector2s in _polygonData) + { + DrawPolygon(vector2s, new Color(1, 1, 0, 0.3f).MakeArray(vector2s.Length)); + } + } + } + + private void RunTest() + { + var usedRect = _tileMap.GetUsedRect(); + var data = new NavigationPolygon(); + data.SourceGeometryMode = NavigationPolygon.SourceGeometryModeEnum.GroupsWithChildren; + data.SourceGeometryGroupName = "navigation"; + data.CellSize = 4; + data.AgentRadius = 6.5f; + data.AddOutline(new [] + { + usedRect.Position * GameConfig.TileCellSize, + new Vector2(usedRect.End.X, usedRect.Position.Y) * GameConfig.TileCellSize, + usedRect.End * GameConfig.TileCellSize, + new Vector2(usedRect.Position.X, usedRect.End.Y) * GameConfig.TileCellSize + }); + _navigationRegion.NavigationPolygon = data; + _navigationRegion.BakeNavigationPolygon(false); + } +} diff --git a/DungeonShooting_Godot/src/test/TestTrail.cs b/DungeonShooting_Godot/src/test/TestTrail.cs new file mode 100644 index 0000000..f722c97 --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestTrail.cs @@ -0,0 +1,20 @@ +using Godot; +using System; + +public partial class TestTrail : Node2D +{ + private Sprite2D sprite; + private Trail trail; + + public override void _Ready() + { + sprite = GetNode("Sprite2D"); + trail = GetNode("Trail"); + trail.SetTarget(sprite); + } + + public override void _Process(double delta) + { + sprite.Position = GetLocalMousePosition(); + } +} diff --git a/README.md b/README.md index 579c8da..8e3fe6f 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,32 @@ --- ### 游戏定义 -**游戏名称:** 待定 +**游戏名称:**《枪火地牢》 +**英文名称:**《Gunfire Dungeon》 **美术风格:** 2D像素(完美像素) -**游戏类型:** Roguelite, 俯视角, 地牢探索, 双摇杆射击 -**参考游戏:** 挺进地牢, 元气骑士, 废土之王 +**游戏标签:** Roguelite, 俯视角, 地牢探索, 双摇杆射击 +**参考游戏:** 《挺进地牢》, 《元气骑士》, 《废土之王》 **核心简介:** 游戏整体流程由数层地牢组成, 每层又由数个房间组成, 每个房间有一堵门隔开, 玩家每进入一个房间, 需要清理房间内所有的敌人, 方可离开和进入下一个房间, 玩家需要在这些房间中探索, 战斗, 收集掉落的道具和被动, 一步步成长, 击败boss, 进入下一层, 如此往复, 直到击败最后一层boss即可通关. 但本作与市面上常规地牢射击游戏不同的是, 玩家与敌人共用武器资源, 玩家击败敌人便可拾起敌人的武器, 并且更加注重环境互动要素 **游戏背景:** 构思中 -![gif](DungeonShooting_Document/文档资源/preview_gif.gif) +**游戏内置了一个功能强大的地图编辑器, 方便玩家自己制作地图和分享地图** + +--- +### 预览图 +##### 游戏中 +![gif](DungeonShooting_Document/文档资源/preview_gif.gif) +![png](DungeonShooting_Document/文档资源/preview1.png) +##### 地图编辑器 +房间管理器 +![png](DungeonShooting_Document/文档资源/preview2.png) +房间地形编辑 +![png](DungeonShooting_Document/文档资源/preview3_gif.gif) +房间装饰编辑 +![png](DungeonShooting_Document/文档资源/preview2_gif.gif) +房间预设编辑 +![png](DungeonShooting_Document/文档资源/preview3.png) --- ### 启动项目