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 36afd4a..e40e569 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,7 +1,41 @@ --- +### 2023-12-07 +项目正式从Godot4.2beta升级到4.2, 这一个半月主要工作内容: +* 新增武器: + * 榴弹发射器, 发射可以爆炸并造成范围伤害的弹丸, 爆炸会影响地上的弹壳和碎屑 + * 激光手枪, 发射具有穿透敌人身体并造成伤害的激光 +* 新增道具: + * 弹射子弹 子弹反弹次数+2 + * 穿透子弹, 子弹穿透+1 + * 武器背包, 武器容量+1 + * 道具背包, 道具容量+1 +* 武器预制体移除握把标记, 现在武器原点变为握把位置, 旋转中心点变为`AnimatedSprite`精灵的中心点, 这样更加方便制作武器动画 +* 新增对象池功能, 对象池类为`ObjectPool`, 可入池对象必须实现`IPoolItem`接口, 但为了方便获取池中的物体, 新增`ObjectManager`用于根据某些标记快速获取对象池中的物体 +* 新增`FreezeSprite`, 用于绘制静止不动的 `ActivityObject`,从而优化性能, 包含功能: + * 调用`Freeze()`和`Unfreeze()`来冻结和解冻, 与`BecomesStaticImage()`不同的是, `Freeze()`并不会销毁物体, 并且可逆 + * 提供了检测圆形范围内所有冻结实例的接口`RoomStaticSprite.CollisionCircle()`, 可用类似爆炸等造成范围影响的功能 + * 每个区域有`FreezeSprite`数量上限, 防止数量过多造成卡顿 +* 游戏解锁高帧率模式, 不再像以前一样锁定60帧了, 现在支持无上限帧数和垂直同步(暂未加入到游戏设置中) +* 将子弹伤害射程等基础配置移动到了`BulletBase.xlsx`配置表中 +* 优化子弹创建逻辑, 现在调用`FireManager.ShootBullet()`发射字段, 调用`FireManager.ThrowShell()`抛射弹壳 +* 新增物体材质, 配置表为`ActivityMaterial.xlsx`, 并提供`摩擦力`,`重力`,`回弹`等基础物理模拟属性 +* 在完美像素模式下实现相机平滑移动 +* 新增第二个敌人, 一个全身附着粘液的怪物, 发射带抛物线的远程子弹, 移动时地上会留下一滩粘液(暂未制作互动效果) +* 优化Ai状态机, 现在Ai发现玩家后会执行通知其它敌人的状态, 其它敌人收到通知时会走向玩家位置 +* 更新玩家翻滚动作, 更新地牢素材 +* 新增绘制液体功能, 根据笔刷(`BrushImageData`)在`LiquidCanvas`上绘制液体, 液体会随着时间消散, 液体材质配置为`LiquidMaterial.xlsx`, 液体笔刷管理器为`LiquidBrushManager`, `ActivityObject`新增绘制液体函数`DrawLiquid()`, 目前暂未制作互动效果 +* `ActivityObject`支持自定义阴影, 在预制体的`ShadowSprite`节点中放入阴影纹理即可视为自定义阴影 +* 游戏右上角小地图, 未探索的房间将显示问号, 已探索的房间显示房间轮廓, 并且显示房间内敌人的位置, 按下`ctrl`键展开小地图, 展开后使用鼠标右键可以拖拽小地图, 并且点击鼠标左键可以传送到已经探索的房间 +* 完善敌人死亡效果, 碎片会在地上留下血迹 +* 将敌方子弹的颜色改为红白色, 更加容易区分敌我弹幕 +* 修复武器没弹药后再触发扳机必须要等攻击冷却完成后才能触发换弹的bug +* 修复分裂子弹伤害计算错误的bug +* 修复武器换弹时扔掉或者放到背后会继续执行动画的问题 + +--- ### 2023-10-20 -项目从Godot4.1升级到4.2bate, 使用了部分新功能以提升视觉效果, 本月主要完善`Role`的动作和提升地牢视觉效果, 项目已正式开源 +项目从Godot4.1升级到4.2beta, 使用了部分新功能以提升视觉效果, 本月主要完善`Role`的动作和提升地牢视觉效果, 项目已正式开源 将项目的Ui框架抽成一个单独的Ui插件, 命名为`DsUi` 近一个半月主要工作内容如下: * 项目已经开启2Dhdr, 也就是辉光效果, 现在子弹, 开火特效等都有了高光效果 diff --git a/DungeonShooting_Godot/DungeonShooting.csproj b/DungeonShooting_Godot/DungeonShooting.csproj index 36c02a1..dd65ab8 100644 --- a/DungeonShooting_Godot/DungeonShooting.csproj +++ b/DungeonShooting_Godot/DungeonShooting.csproj @@ -1,4 +1,4 @@ - + net7.0 true @@ -8,4 +8,10 @@ + + + + + + \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old b/DungeonShooting_Godot/DungeonShooting.csproj.old index e36028f..97e725f 100644 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old +++ b/DungeonShooting_Godot/DungeonShooting.csproj.old @@ -1,4 +1,4 @@ - + net7.0 true diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.1 b/DungeonShooting_Godot/DungeonShooting.csproj.old.1 deleted file mode 100644 index 65ee589..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.1 +++ /dev/null @@ -1,11 +0,0 @@ - - - net7.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.2 b/DungeonShooting_Godot/DungeonShooting.csproj.old.2 deleted file mode 100644 index 543224c..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.2 +++ /dev/null @@ -1,11 +0,0 @@ - - - net7.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.sln.DotSettings.user b/DungeonShooting_Godot/DungeonShooting.sln.DotSettings.user index 639eefb..43de714 100644 --- a/DungeonShooting_Godot/DungeonShooting.sln.DotSettings.user +++ b/DungeonShooting_Godot/DungeonShooting.sln.DotSettings.user @@ -2,4 +2,7 @@ WARNING On On - On \ No newline at end of file + On + <SessionState ContinuousTestingMode="0" IsActive="True" Name="解决方案中的所有测试" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Solution /> +</SessionState> \ No newline at end of file diff --git a/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx b/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx index 62c2d8a..6a223ce 100644 --- a/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx b/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx index ad56ce8..bd510bd 100644 --- a/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx b/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx index 4531299..40dfdd7 100644 --- a/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx b/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx index 8e3e0b4..c96665f 100644 --- a/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/EnemyBase.xlsx b/DungeonShooting_Godot/excel/excelFile/EnemyBase.xlsx new file mode 100644 index 0000000..ec33827 --- /dev/null +++ b/DungeonShooting_Godot/excel/excelFile/EnemyBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/LiquidMaterial.xlsx b/DungeonShooting_Godot/excel/excelFile/LiquidMaterial.xlsx new file mode 100644 index 0000000..fec81d5 --- /dev/null +++ b/DungeonShooting_Godot/excel/excelFile/LiquidMaterial.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx index 5a36ef9..614fb08 100644 --- a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx b/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx index c5a29ed..92e09ef 100644 --- a/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn b/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn index 31cb46f..fad5129 100644 --- a/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/explode/Explode0001.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=26 format=3 uid="uid://cw3c600m8rv6t"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="1_ctx3v"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="1_ctx3v"] [ext_resource type="Script" path="res://src/game/activity/bullet/explode/Explode.cs" id="1_qn5pu"] -[ext_resource type="Texture2D" uid="uid://ccdflg560oub6" path="res://resource/sprite/effects/explode/Explode_circle0001.png" id="2_bpdnr"] -[ext_resource type="Texture2D" uid="uid://rk73piti0qot" path="res://resource/sprite/effects/common/Smoke2.png" id="3_xt36q"] -[ext_resource type="Texture2D" uid="uid://cquv6nomd3tpf" path="res://resource/sprite/effects/explode/Explode_line0001.png" id="4_i3ry2"] +[ext_resource type="Texture2D" uid="uid://ccdflg560oub6" path="res://resource/sprite/explode/Explode_circle0001.png" id="2_bpdnr"] +[ext_resource type="Texture2D" uid="uid://rk73piti0qot" path="res://resource/sprite/common/Smoke2.png" id="3_xt36q"] +[ext_resource type="Texture2D" uid="uid://cquv6nomd3tpf" path="res://resource/sprite/explode/Explode_line0001.png" id="4_i3ry2"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_sk5lv"] particles_animation = true diff --git a/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn b/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn index 5117e12..9189dc9 100644 --- a/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/laser/Laser0001.tscn @@ -6,10 +6,11 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_l4vuk"] resource_local_to_scene = true -[node name="Laser0001" type="Area2D"] +[node name="Laser0001" type="Area2D" node_paths=PackedStringArray("Particles2D")] collision_layer = 2 monitorable = false script = ExtResource("1_3w0rp") +Particles2D = [] [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_l4vuk") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn index 740c1cd..6c95617 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0001.tscn @@ -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_qhkgc"] resource_local_to_scene = true @@ -24,7 +25,8 @@ 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/outline_use_blend = false +shader_parameter/grey = 0.0 [sub_resource type="SpriteFrames" id="SpriteFrames_5wvmf"] animations = [{ @@ -40,10 +42,12 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_lcqb8"] size = Vector2(9, 4) -[node name="Bullet0001" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Bullet0001" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 script = ExtResource("1_3d3df") CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn index b1a1813..ecabf2f 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0002.tscn @@ -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_p0wfd"] resource_local_to_scene = true @@ -24,7 +25,8 @@ 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/outline_use_blend = false +shader_parameter/grey = 0.0 [sub_resource type="CircleShape2D" id="CircleShape2D_0vxfv"] radius = 3.0 @@ -32,10 +34,12 @@ [sub_resource type="CircleShape2D" id="CircleShape2D_e2yn3"] radius = 3.0 -[node name="Bullet0002" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Bullet0002" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 script = ExtResource("1_hepay") CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn index 65b9e2a..b87d8e0 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0003.tscn @@ -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_p0wfd"] resource_local_to_scene = true @@ -24,15 +25,18 @@ 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/outline_use_blend = false +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_c0onq"] size = Vector2(6, 3.125) -[node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 script = ExtResource("1_h6lfm") CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [] ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn index c798c13..3c96ac3 100644 --- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://src/game/activity/bullet/normal/BoomBullet.cs" id="1_1jbgr"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_w1qob"] [ext_resource type="SpriteFrames" uid="uid://d3vma1qjo478l" path="res://resource/spriteFrames/bullet/Bullet0004.tres" id="3_bttus"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="3_ofn8c"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="3_ofn8c"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_v77gw"] 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_p0wfd"] resource_local_to_scene = true @@ -25,7 +26,8 @@ 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/outline_use_blend = false +shader_parameter/grey = 0.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_c0onq"] size = Vector2(4, 4) @@ -40,7 +42,7 @@ _data = [Vector2(0, 0.730415), 0.0, 0.0, 0, 0, Vector2(0.245238, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0235023), 0.0, 0.0, 0, 0] point_count = 3 -[sub_resource type="CurveTexture" id="CurveTexture_uftx4"] +[sub_resource type="CurveTexture" id="CurveTexture_ie2e7"] curve = SubResource("Curve_dt320") [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_kelfq"] @@ -54,14 +56,16 @@ gravity = Vector3(0, 0, 0) scale_min = 0.15 scale_max = 0.6 -scale_curve = SubResource("CurveTexture_uftx4") +scale_curve = SubResource("CurveTexture_ie2e7") color = Color(0.619608, 0.619608, 0.619608, 1) anim_offset_max = 1.0 -[node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Bullet0003" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 2 script = ExtResource("1_1jbgr") CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [NodePath("AnimatedSprite/GPUParticles2D")] ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn new file mode 100644 index 0000000..3203560 --- /dev/null +++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0005.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=12 format=3 uid="uid://cjgnw37tqiqh7"] + +[ext_resource type="Script" path="res://src/game/activity/bullet/normal/BrushBullet.cs" id="1_13wdl"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_v0al6"] +[ext_resource type="SpriteFrames" uid="uid://jj8oh76pi53j" path="res://resource/spriteFrames/bullet/Bullet0005.tres" id="3_mmvqn"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="4_esjg6"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_v77gw"] +resource_local_to_scene = true +shader = ExtResource("2_v0al6") +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_p0wfd"] +resource_local_to_scene = true +shader = ExtResource("2_v0al6") +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_c0onq"] +size = Vector2(6, 3.5625) + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_aiome"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="Curve" id="Curve_5pn38"] +_data = [Vector2(0, 0.730415), 0.0, 0.0, 0, 0, Vector2(0.245238, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0235023), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_uftx4"] +curve = SubResource("Curve_5pn38") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ewus5"] +lifetime_randomness = 0.7 +particle_flag_disable_z = true +angle_max = 360.0 +spread = 180.0 +initial_velocity_min = 5.0 +initial_velocity_max = 15.0 +angular_velocity_max = 45.0 +gravity = Vector3(0, 0, 0) +scale_min = 0.15 +scale_max = 0.6 +scale_curve = SubResource("CurveTexture_uftx4") +color = Color(0.95, 0.70965, 0.6365, 0.392157) +anim_offset_max = 1.0 + +[node name="Bullet0005" type="CharacterBody2D" node_paths=PackedStringArray("CollisionArea", "CollisionShape2D", "Particles2D", "ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 2 +script = ExtResource("1_13wdl") +BrushId = "0004" +EffectiveAltitude = 1.0 +CollisionArea = NodePath("AnimatedSprite/CollisionArea") +CollisionShape2D = NodePath("AnimatedSprite/CollisionArea/CollisionShape2D") +Particles2D = [NodePath("AnimatedSprite/GPUParticles2D")] +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_p0wfd") +sprite_frames = ExtResource("3_mmvqn") + +[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"] +visible = false +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AnimatedSprite/CollisionArea"] +position = Vector2(1, 0) +shape = SubResource("RectangleShape2D_c0onq") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="AnimatedSprite"] +material = SubResource("CanvasItemMaterial_aiome") +amount = 10 +process_material = SubResource("ParticleProcessMaterial_ewus5") +texture = ExtResource("4_esjg6") +lifetime = 0.5 + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_c0onq") diff --git a/DungeonShooting_Godot/prefab/effect/Blood.tscn b/DungeonShooting_Godot/prefab/effect/Blood.tscn index 7abbec9..88930aa 100644 --- a/DungeonShooting_Godot/prefab/effect/Blood.tscn +++ b/DungeonShooting_Godot/prefab/effect/Blood.tscn @@ -1,9 +1,10 @@ [gd_scene load_steps=3 format=3] -[ext_resource type="Texture2D" uid="uid://cgptnp74ive4r" path="res://resource/sprite/effects/Circle.png" id="1"] +[ext_resource type="Texture2D" uid="uid://cgptnp74ive4r" path="res://resource/sprite/common/Circle.png" id="1"] [ext_resource type="Script" path="res://src/game/effects/Blood.cs" id="2"] + [node name="Blood" type="CPUParticles2D"] z_index = -5 lifetime = 0.2 diff --git a/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0001.tscn b/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0001.tscn new file mode 100644 index 0000000..5964bab --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0001.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=13 format=3 uid="uid://c6mmikwchwt"] + +[ext_resource type="Texture2D" uid="uid://4be6mi1egtiy" path="res://resource/sprite/explode/Explode_circle0003.png" id="1_nag6e"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_db7di"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="3_2w51u"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_tscb3"] +atlas = ExtResource("1_nag6e") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l2nv6"] +atlas = ExtResource("1_nag6e") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5133m"] +atlas = ExtResource("1_nag6e") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_41eg5"] +atlas = ExtResource("1_nag6e") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_ub3cw"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_tscb3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l2nv6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5133m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_41eg5") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 13.0 +}] + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4bd3q"] +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, 0.736364), 0.0, 0.0, 0, 0, Vector2(0.396825, 1), 0.0, 0.0, 0, 0, Vector2(0.990476, 0), 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_r1yeu"] +lifetime_randomness = 0.3 +particle_flag_disable_z = true +angle_max = 360.0 +spread = 180.0 +initial_velocity_min = 45.0 +initial_velocity_max = 65.0 +gravity = Vector3(0, 0, 0) +scale_min = 0.3 +scale_max = 0.6 +scale_curve = SubResource("CurveTexture_j77i6") +color = Color(0.909804, 0.909804, 0.909804, 0.380392) +anim_offset_max = 1.0 + +[node name="BulletDisappear0002" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(1, 1, 1, 0.784314) +z_index = -4 +scale = Vector2(0.5, 0.5) +sprite_frames = SubResource("SpriteFrames_ub3cw") +script = ExtResource("2_db7di") +DelayTime = 0.5 +Particles2D = [NodePath("GPUParticles2D")] + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +material = SubResource("CanvasItemMaterial_4bd3q") +emitting = false +process_material = SubResource("ParticleProcessMaterial_r1yeu") +texture = ExtResource("3_2w51u") +lifetime = 0.3 +one_shot = true +explosiveness = 0.9 +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0002.tscn b/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0002.tscn new file mode 100644 index 0000000..ce0ca7a --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/bullet/BulletDisappear0002.tscn @@ -0,0 +1,113 @@ +[gd_scene load_steps=16 format=3 uid="uid://7fjw62ymmrl7"] + +[ext_resource type="Texture2D" uid="uid://cusp3s5t7qbuy" path="res://resource/sprite/explode/Explode_circle0002.png" id="1_xuqre"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_eeot2"] +[ext_resource type="Texture2D" uid="uid://du0f3km5jhxlg" path="res://resource/sprite/common/Smoke4.png" id="3_yow4l"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_w7xvw"] +atlas = ExtResource("1_xuqre") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tt7yd"] +atlas = ExtResource("1_xuqre") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5yu76"] +atlas = ExtResource("1_xuqre") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_obu2v"] +atlas = ExtResource("1_xuqre") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5nbmq"] +atlas = ExtResource("1_xuqre") +region = Rect2(64, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tiuph"] +atlas = ExtResource("1_xuqre") +region = Rect2(80, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n3apl"] +atlas = ExtResource("1_xuqre") +region = Rect2(96, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_ub3cw"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_w7xvw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tt7yd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5yu76") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_obu2v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5nbmq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tiuph") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n3apl") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 18.0 +}] + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4bd3q"] +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_8k30u"] +lifetime_randomness = 0.3 +particle_flag_disable_z = true +angle_max = 360.0 +direction = Vector3(0, -1, 0) +initial_velocity_min = 70.0 +initial_velocity_max = 90.0 +gravity = Vector3(0, 150, 0) +scale_min = 0.9 +scale_max = 1.5 +scale_curve = SubResource("CurveTexture_j77i6") +color = Color(1, 1, 1, 0.392157) +anim_offset_max = 1.0 + +[node name="BulletDisappear0002" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(0.952941, 0.709804, 0.635294, 1) +z_index = -4 +scale = Vector2(0.5, 0.5) +sprite_frames = SubResource("SpriteFrames_ub3cw") +frame = 7 +frame_progress = 1.0 +script = ExtResource("2_eeot2") +Particles2D = [NodePath("GPUParticles2D")] + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +material = SubResource("CanvasItemMaterial_4bd3q") +emitting = false +process_material = SubResource("ParticleProcessMaterial_8k30u") +texture = ExtResource("3_yow4l") +lifetime = 0.5 +one_shot = true +explosiveness = 0.9 +randomness = 0.5 +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0001.tscn b/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0001.tscn new file mode 100644 index 0000000..77afb99 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0001.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=7 format=3 uid="uid://b8ogu2l8pa70y"] + +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="1"] +[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_8pe88"] +[ext_resource type="SpriteFrames" uid="uid://pwg2tx7dmcvp" path="res://resource/spriteFrames/bullet/Collision0001.tres" id="1_r62v8"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_r547d"] + +[sub_resource type="CanvasItemMaterial" id="1"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gpp81"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +angle_max = 360.0 +spread = 25.0 +initial_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +scale_curve = ExtResource("1_8pe88") +color = Color(0.75, 0.75, 0.75, 0.470588) +anim_offset_max = 1.0 + +[node name="BulletSmoke0001" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +sprite_frames = ExtResource("1_r62v8") +frame = 4 +frame_progress = 1.0 +offset = Vector2(8, 0) +script = ExtResource("2_r547d") +Particles2D = [NodePath("GpuParticles2D")] + +[node name="GpuParticles2D" type="GPUParticles2D" parent="."] +show_behind_parent = true +material = SubResource("1") +emitting = false +process_material = SubResource("ParticleProcessMaterial_gpp81") +texture = ExtResource("1") +lifetime = 0.4 +one_shot = true +explosiveness = 0.9 +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0002.tscn b/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0002.tscn new file mode 100644 index 0000000..e47a384 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/bullet/BulletSmoke0002.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=8 format=3 uid="uid://y47kp0t5uqu0"] + +[ext_resource type="SpriteFrames" uid="uid://dkqd4513sog3f" path="res://resource/spriteFrames/bullet/Collision0002.tres" id="1_0qscf"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_p27g6"] +[ext_resource type="Texture2D" uid="uid://du0f3km5jhxlg" path="res://resource/sprite/common/Smoke4.png" id="4_d8v0n"] + +[sub_resource type="CanvasItemMaterial" id="1"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="Curve" id="Curve_r4o86"] +_data = [Vector2(0.0107527, 1), 0.0, 0.0, 0, 0, Vector2(0.512545, 0.8), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_thj4e"] +curve = SubResource("Curve_r4o86") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gpp81"] +lifetime_randomness = 0.4 +particle_flag_disable_z = true +angle_max = 360.0 +spread = 25.0 +initial_velocity_min = 10.0 +initial_velocity_max = 60.0 +gravity = Vector3(0, 90, 0) +scale_min = 0.9 +scale_max = 1.5 +scale_curve = SubResource("CurveTexture_thj4e") +color = Color(0.75, 0.75, 0.75, 0.588235) +anim_offset_max = 1.0 + +[node name="BulletSmoke0002" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(0.95, 0.70965, 0.6365, 0.588235) +sprite_frames = ExtResource("1_0qscf") +offset = Vector2(8, 0) +script = ExtResource("2_p27g6") +Particles2D = [NodePath("GpuParticles2D")] + +[node name="GpuParticles2D" type="GPUParticles2D" parent="."] +show_behind_parent = true +material = SubResource("1") +emitting = false +process_material = SubResource("ParticleProcessMaterial_gpp81") +texture = ExtResource("4_d8v0n") +lifetime = 0.6 +one_shot = true +explosiveness = 0.9 +randomness = 0.5 +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn index 9f4e524..9159fe4 100644 --- a/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn +++ b/DungeonShooting_Godot/prefab/effect/common/Effect1.tscn @@ -2,9 +2,9 @@ [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/Smoke.png" id="2_3kyig"] -[ext_resource type="Texture2D" uid="uid://csud4e6kc3iku" path="res://resource/sprite/effects/Effect1.png" id="3_1mceu"] -[ext_resource type="Script" path="res://src/game/effects/Effect1.cs" id="3_ax5u4"] +[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="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="3_2tlhx"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ipadv"] particles_animation = true @@ -16,16 +16,14 @@ particle_flag_align_y = true particle_flag_disable_z = true spread = 180.0 -gravity = Vector3(0, 0, 0) initial_velocity_min = 40.0 initial_velocity_max = 70.0 -orbit_velocity_min = 0.0 -orbit_velocity_max = 0.0 +gravity = Vector3(0, 0, 0) scale_min = 0.2 scale_max = 0.3 scale_curve = ExtResource("1_s60r7") -[node name="Effect1" type="GPUParticles2D"] +[node name="Effect1" type="GPUParticles2D" node_paths=PackedStringArray("Particles2D")] modulate = Color(0.760784, 0.760784, 0.760784, 0.533333) z_index = 5 material = SubResource("CanvasItemMaterial_ipadv") @@ -37,10 +35,13 @@ one_shot = true explosiveness = 1.0 fixed_fps = 20 -script = ExtResource("3_ax5u4") +script = ExtResource("3_2tlhx") +Particles2D = [NodePath("GPUParticles2D")] [node name="GPUParticles2D" type="GPUParticles2D" parent="."] emitting = false +amount = 6 +amount_ratio = 0.8 process_material = SubResource("ParticleProcessMaterial_p8jst") texture = ExtResource("3_1mceu") lifetime = 0.5 diff --git a/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn b/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn deleted file mode 100644 index 4461145..0000000 --- a/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn +++ /dev/null @@ -1,205 +0,0 @@ -[gd_scene load_steps=31 format=3 uid="uid://pr88a1phtxgb"] - -[ext_resource type="Script" path="res://src/game/effects/EnemyDebris.cs" id="1_ttosm"] -[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_h62s7"] -[ext_resource type="Texture2D" uid="uid://cn64eauvwx1uj" path="res://resource/sprite/role/enemy0001/enemy0001_Debris.png" id="3_6ewaj"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="4_wu0t6"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1mj2"] -resource_local_to_scene = true -shader = ExtResource("2_h62s7") -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 - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_08fn3"] -shader = ExtResource("2_h62s7") -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 = true - -[sub_resource type="AtlasTexture" id="AtlasTexture_cldwb"] -atlas = ExtResource("3_6ewaj") -region = Rect2(0, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ehtnl"] -atlas = ExtResource("3_6ewaj") -region = Rect2(16, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_j05gd"] -atlas = ExtResource("3_6ewaj") -region = Rect2(32, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_7el6f"] -atlas = ExtResource("3_6ewaj") -region = Rect2(48, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_n7sw3"] -atlas = ExtResource("3_6ewaj") -region = Rect2(64, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_mumsm"] -atlas = ExtResource("3_6ewaj") -region = Rect2(80, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_gx41d"] -atlas = ExtResource("3_6ewaj") -region = Rect2(96, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_r4nx1"] -atlas = ExtResource("3_6ewaj") -region = Rect2(112, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_s8j4o"] -atlas = ExtResource("3_6ewaj") -region = Rect2(128, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_2svrb"] -atlas = ExtResource("3_6ewaj") -region = Rect2(144, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_twd5t"] -atlas = ExtResource("3_6ewaj") -region = Rect2(160, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_8w5ka"] -atlas = ExtResource("3_6ewaj") -region = Rect2(176, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6iumv"] -atlas = ExtResource("3_6ewaj") -region = Rect2(192, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_lpilf"] -atlas = ExtResource("3_6ewaj") -region = Rect2(208, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_n1a5a"] -atlas = ExtResource("3_6ewaj") -region = Rect2(224, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_q0oeq"] -atlas = ExtResource("3_6ewaj") -region = Rect2(240, 0, 16, 16) - -[sub_resource type="SpriteFrames" id="SpriteFrames_15g84"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_cldwb") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_ehtnl") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_j05gd") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_7el6f") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_n7sw3") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_mumsm") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_gx41d") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_r4nx1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_s8j4o") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_2svrb") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_twd5t") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_8w5ka") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_6iumv") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_lpilf") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_n1a5a") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_q0oeq") -}], -"loop": true, -"name": &"default", -"speed": 5.0 -}] - -[sub_resource type="CircleShape2D" id="CircleShape2D_0xl2q"] -radius = 4.0 - -[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"] -particles_animation = true -particles_anim_h_frames = 3 -particles_anim_v_frames = 1 -particles_anim_loop = false - -[sub_resource type="Gradient" id="Gradient_ryemi"] -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_orgu0"] -gradient = SubResource("Gradient_ryemi") - -[sub_resource type="Curve" id="Curve_21dxk"] -_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.177419, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0272727), 0.0, 0.0, 0, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_rutlp"] -curve = SubResource("Curve_21dxk") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ku1mm"] -particle_flag_disable_z = true -angle_max = 360.0 -gravity = Vector3(0, 0, 0) -scale_min = 0.4 -scale_max = 1.5 -scale_curve = SubResource("CurveTexture_rutlp") -color = Color(0.811765, 0.0980392, 0.0980392, 0.627451) -color_ramp = SubResource("GradientTexture1D_orgu0") -anim_offset_max = 1.0 - -[node name="Effect0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] -collision_layer = 128 -script = ExtResource("1_ttosm") -ShadowSprite = NodePath("ShadowSprite") -AnimatedSprite = NodePath("AnimatedSprite") -Collision = NodePath("Collision") - -[node name="ShadowSprite" type="Sprite2D" parent="."] -z_index = -1 -material = SubResource("ShaderMaterial_s1mj2") - -[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_08fn3") -sprite_frames = SubResource("SpriteFrames_15g84") - -[node name="Collision" type="CollisionShape2D" parent="."] -shape = SubResource("CircleShape2D_0xl2q") - -[node name="GPUParticles2D" type="GPUParticles2D" parent="."] -material = SubResource("CanvasItemMaterial_p3lv8") -emitting = false -process_material = SubResource("ParticleProcessMaterial_ku1mm") -texture = ExtResource("4_wu0t6") -fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/enemy/EnemyBlood0001.tscn b/DungeonShooting_Godot/prefab/effect/enemy/EnemyBlood0001.tscn new file mode 100644 index 0000000..1ffbf1b --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/enemy/EnemyBlood0001.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=5 format=3 uid="uid://m0s0k5nw7nbi"] + +[ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_leomh"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="2_c2t2e"] +[ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="3_5cpi6"] + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_emuda"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[node name="EnemyBloodEffect" type="GPUParticles2D" node_paths=PackedStringArray("Particles2D")] +modulate = Color(0.811765, 0.0980392, 0.0980392, 0.627451) +material = SubResource("CanvasItemMaterial_emuda") +emitting = false +amount = 10 +process_material = ExtResource("1_leomh") +texture = ExtResource("2_c2t2e") +lifetime = 1.2 +one_shot = true +explosiveness = 1.0 +fixed_fps = 20 +script = ExtResource("3_5cpi6") +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn b/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn deleted file mode 100644 index 8b4aa0a..0000000 --- a/DungeonShooting_Godot/prefab/effect/enemy/EnemyBloodEffect.tscn +++ /dev/null @@ -1,25 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://m0s0k5nw7nbi"] - -[ext_resource type="Material" uid="uid://c1chld6lkpgji" path="res://resource/material/SmokeParticleMaterial.tres" id="1_leomh"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="2_c2t2e"] -[ext_resource type="Script" path="res://src/game/effects/AutoDestroyParticles.cs" id="3_5cpi6"] - -[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_emuda"] -particles_animation = true -particles_anim_h_frames = 3 -particles_anim_v_frames = 1 -particles_anim_loop = false - -[node name="EnemyBloodEffect" type="GPUParticles2D"] -modulate = Color(0.811765, 0.0980392, 0.0980392, 0.627451) -material = SubResource("CanvasItemMaterial_emuda") -emitting = false -amount = 10 -process_material = ExtResource("1_leomh") -texture = ExtResource("2_c2t2e") -lifetime = 1.2 -one_shot = true -explosiveness = 1.0 -fixed_fps = 20 -script = ExtResource("3_5cpi6") -DelayTime = 1.5 diff --git a/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0001.tscn b/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0001.tscn new file mode 100644 index 0000000..488e2c5 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0001.tscn @@ -0,0 +1,207 @@ +[gd_scene load_steps=31 format=3 uid="uid://pr88a1phtxgb"] + +[ext_resource type="Script" path="res://src/game/effects/enemy/EnemyDead0001.cs" id="1_1re5v"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_s7bee"] +[ext_resource type="Texture2D" uid="uid://cn64eauvwx1uj" path="res://resource/sprite/role/enemy0001/enemy0001_Debris.png" id="3_uinig"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="4_t55wd"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1mj2"] +resource_local_to_scene = true +shader = ExtResource("2_s7bee") +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_08fn3"] +shader = ExtResource("2_s7bee") +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 = true +shader_parameter/grey = 0.0 + +[sub_resource type="AtlasTexture" id="AtlasTexture_cldwb"] +atlas = ExtResource("3_uinig") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ehtnl"] +atlas = ExtResource("3_uinig") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j05gd"] +atlas = ExtResource("3_uinig") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7el6f"] +atlas = ExtResource("3_uinig") +region = Rect2(48, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n7sw3"] +atlas = ExtResource("3_uinig") +region = Rect2(64, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mumsm"] +atlas = ExtResource("3_uinig") +region = Rect2(80, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gx41d"] +atlas = ExtResource("3_uinig") +region = Rect2(96, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_r4nx1"] +atlas = ExtResource("3_uinig") +region = Rect2(112, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s8j4o"] +atlas = ExtResource("3_uinig") +region = Rect2(128, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2svrb"] +atlas = ExtResource("3_uinig") +region = Rect2(144, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_twd5t"] +atlas = ExtResource("3_uinig") +region = Rect2(160, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8w5ka"] +atlas = ExtResource("3_uinig") +region = Rect2(176, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6iumv"] +atlas = ExtResource("3_uinig") +region = Rect2(192, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lpilf"] +atlas = ExtResource("3_uinig") +region = Rect2(208, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n1a5a"] +atlas = ExtResource("3_uinig") +region = Rect2(224, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q0oeq"] +atlas = ExtResource("3_uinig") +region = Rect2(240, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_15g84"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_cldwb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ehtnl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j05gd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7el6f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n7sw3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mumsm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gx41d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r4nx1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s8j4o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2svrb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_twd5t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8w5ka") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6iumv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lpilf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n1a5a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q0oeq") +}], +"loop": false, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="CircleShape2D" id="CircleShape2D_0xl2q"] +radius = 4.0 + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="Gradient" id="Gradient_ryemi"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_orgu0"] +gradient = SubResource("Gradient_ryemi") + +[sub_resource type="Curve" id="Curve_21dxk"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.177419, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0272727), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_rutlp"] +curve = SubResource("Curve_21dxk") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ku1mm"] +particle_flag_disable_z = true +angle_max = 360.0 +gravity = Vector3(0, 0, 0) +scale_min = 0.4 +scale_max = 1.5 +scale_curve = SubResource("CurveTexture_rutlp") +color = Color(0.811765, 0.0980392, 0.0980392, 0.627451) +color_ramp = SubResource("GradientTexture1D_orgu0") +anim_offset_max = 1.0 + +[node name="Effect0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 128 +script = ExtResource("1_1re5v") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_s1mj2") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_08fn3") +sprite_frames = SubResource("SpriteFrames_15g84") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_0xl2q") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +material = SubResource("CanvasItemMaterial_p3lv8") +emitting = false +process_material = SubResource("ParticleProcessMaterial_ku1mm") +texture = ExtResource("4_t55wd") +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0002.tscn b/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0002.tscn new file mode 100644 index 0000000..310d6fd --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/enemy/EnemyDead0002.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=19 format=3 uid="uid://nfx3lhkdhv6a"] + +[ext_resource type="Script" path="res://src/game/effects/enemy/EnemyDead0002.cs" id="1_ghu6a"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_q163q"] +[ext_resource type="Texture2D" uid="uid://x3tjqgdgp43n" path="res://resource/sprite/role/enemy0002/Enemy0002_dead.png" id="3_l0kbp"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="4_2wygu"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1mj2"] +resource_local_to_scene = true +shader = ExtResource("2_q163q") +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_08fn3"] +resource_local_to_scene = true +shader = ExtResource("2_q163q") +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_ag5h2"] +atlas = ExtResource("3_l0kbp") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_toly3"] +atlas = ExtResource("3_l0kbp") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bqash"] +atlas = ExtResource("3_l0kbp") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lx5fo"] +atlas = ExtResource("3_l0kbp") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_vhsqr"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ag5h2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_toly3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bqash") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lx5fo") +}], +"loop": false, +"name": &"dead", +"speed": 5.0 +}] + +[sub_resource type="CircleShape2D" id="CircleShape2D_0xl2q"] +radius = 4.0 + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"] +particles_animation = true +particles_anim_h_frames = 3 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="Gradient" id="Gradient_ryemi"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.537255) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_orgu0"] +gradient = SubResource("Gradient_ryemi") + +[sub_resource type="Curve" id="Curve_21dxk"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.177419, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0272727), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_rutlp"] +curve = SubResource("Curve_21dxk") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ku1mm"] +particle_flag_disable_z = true +angle_max = 360.0 +gravity = Vector3(0, 0, 0) +scale_min = 0.4 +scale_max = 1.5 +scale_curve = SubResource("CurveTexture_rutlp") +color = Color(0.811765, 0.0980392, 0.0980392, 0.627451) +color_ramp = SubResource("GradientTexture1D_orgu0") +anim_offset_max = 1.0 + +[node name="Effect0002" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 128 +script = ExtResource("1_ghu6a") +AnimationName = "dead" +AutoToGrey = true +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_s1mj2") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_08fn3") +sprite_frames = SubResource("SpriteFrames_vhsqr") +animation = &"dead" +offset = Vector2(0, -9) + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_0xl2q") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +material = SubResource("CanvasItemMaterial_p3lv8") +emitting = false +process_material = SubResource("ParticleProcessMaterial_ku1mm") +texture = ExtResource("4_2wygu") +fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn b/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn deleted file mode 100644 index 6572e0c..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/BulletDisappear.tscn +++ /dev/null @@ -1,90 +0,0 @@ -[gd_scene load_steps=13 format=3 uid="uid://c6mmikwchwt"] - -[ext_resource type="Texture2D" uid="uid://d8ot2wrdoe4j" path="res://resource/sprite/effects/Explosion.png" id="1_qqm6c"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="1_ybsvf"] -[ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_l2qlq"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_tscb3"] -atlas = ExtResource("1_qqm6c") -region = Rect2(0, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_l2nv6"] -atlas = ExtResource("1_qqm6c") -region = Rect2(16, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_5133m"] -atlas = ExtResource("1_qqm6c") -region = Rect2(32, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_41eg5"] -atlas = ExtResource("1_qqm6c") -region = Rect2(48, 0, 16, 16) - -[sub_resource type="SpriteFrames" id="SpriteFrames_ub3cw"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_tscb3") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_l2nv6") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_5133m") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_41eg5") -}], -"loop": false, -"name": &"default", -"speed": 13.0 -}] - -[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_4bd3q"] -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, 0.736364), 0.0, 0.0, 0, 0, Vector2(0.396825, 1), 0.0, 0.0, 0, 0, Vector2(0.990476, 0), 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_r1yeu"] -lifetime_randomness = 0.3 -particle_flag_disable_z = true -spread = 180.0 -gravity = Vector3(0, 0, 0) -initial_velocity_min = 45.0 -initial_velocity_max = 65.0 -orbit_velocity_min = 0.0 -orbit_velocity_max = 0.0 -angle_max = 360.0 -scale_min = 0.3 -scale_max = 0.6 -scale_curve = SubResource("CurveTexture_j77i6") -color = Color(0.909804, 0.909804, 0.909804, 0.380392) -anim_offset_max = 1.0 - -[node name="BulletDisappear" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] -modulate = Color(1, 1, 1, 0.784314) -z_index = -4 -scale = Vector2(0.5, 0.5) -sprite_frames = SubResource("SpriteFrames_ub3cw") -autoplay = "default" -script = ExtResource("2_l2qlq") -DelayTime = 0.3 -Particles2D = [NodePath("GPUParticles2D")] - -[node name="GPUParticles2D" type="GPUParticles2D" parent="."] -material = SubResource("CanvasItemMaterial_4bd3q") -emitting = false -process_material = SubResource("ParticleProcessMaterial_r1yeu") -texture = ExtResource("1_ybsvf") -lifetime = 0.3 -one_shot = true -explosiveness = 0.9 -fixed_fps = 20 diff --git a/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn b/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn deleted file mode 100644 index d13cf17..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/BulletSmoke.tscn +++ /dev/null @@ -1,145 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://b8ogu2l8pa70y"] - -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="1"] -[ext_resource type="Texture2D" uid="uid://bs1lan5uwxyfg" path="res://resource/curve/Curve1.tres" id="1_8pe88"] -[ext_resource type="Texture2D" uid="uid://dwa4chrugc6b1" path="res://resource/sprite/effects/weapon/Collision1.png" id="2"] - -[sub_resource type="CanvasItemMaterial" id="1"] -particles_animation = true -particles_anim_h_frames = 3 -particles_anim_v_frames = 1 -particles_anim_loop = false - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gpp81"] -lifetime_randomness = 0.5 -particle_flag_disable_z = true -spread = 25.0 -gravity = Vector3(0, 0, 0) -initial_velocity_max = 90.0 -orbit_velocity_min = 0.0 -orbit_velocity_max = 0.0 -angle_max = 360.0 -scale_curve = ExtResource("1_8pe88") -color = Color(0.75, 0.75, 0.75, 0.470588) -anim_offset_max = 1.0 - -[sub_resource type="Animation" id="5"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:emitting") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [false] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D:frame") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [0] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Sprite2D:visible") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [true] -} - -[sub_resource type="Animation" id="6"] -resource_name = "Smoke" -step = 0.05 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:emitting") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.05), -"transitions": PackedFloat32Array(1, 1), -"update": 1, -"values": [true, false] -} -tracks/1/type = "method" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(1), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"queue_free" -}] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Sprite2D:frame") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 0.05, 0.1, 0.15), -"transitions": PackedFloat32Array(1, 1, 1, 1), -"update": 1, -"values": [0, 1, 2, 3] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("Sprite2D:visible") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0, 0.2), -"transitions": PackedFloat32Array(1, 1), -"update": 1, -"values": [true, false] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_uuiu7"] -_data = { -"RESET": SubResource("5"), -"Smoke": SubResource("6") -} - -[node name="BulletSmoke" type="GPUParticles2D"] -material = SubResource("1") -emitting = false -process_material = SubResource("ParticleProcessMaterial_gpp81") -texture = ExtResource("1") -lifetime = 0.4 -one_shot = true -explosiveness = 0.9 -fixed_fps = 20 - -[node name="Sprite2D" type="Sprite2D" parent="."] -modulate = Color(1.6, 1.6, 1.6, 1) -texture = ExtResource("2") -offset = Vector2(8, 0) -hframes = 4 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_uuiu7") -} -autoplay = "Smoke" diff --git a/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn b/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn deleted file mode 100644 index 629586a..0000000 --- a/DungeonShooting_Godot/prefab/effect/weapon/FirePart.tscn +++ /dev/null @@ -1,13 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://bh6vo2i6x7lmj"] - -[sub_resource type="ParticleProcessMaterial" id="1"] -spread = 60.0 -gravity = Vector3(0, 0, 0) - -[node name="FirePart" type="GPUParticles2D"] -emitting = false -amount = 10 -process_material = SubResource("1") -lifetime = 0.2 -one_shot = true -explosiveness = 1.0 diff --git a/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn index 9d50730..ce93ef0 100644 --- a/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn +++ b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack1.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=3 uid="uid://cylm455bsio3g"] -[ext_resource type="Texture2D" uid="uid://7jhe2mmctmr1" path="res://resource/sprite/effects/weapon/MeleeAttack1.png" id="1_bjxle"] +[ext_resource type="Texture2D" uid="uid://7jhe2mmctmr1" path="res://resource/sprite/common/MeleeAttack1.png" id="1_bjxle"] [ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_bjagc"] [sub_resource type="AtlasTexture" id="AtlasTexture_36t2o"] @@ -39,8 +39,8 @@ "speed": 20.0 }] -[node name="MeleeAttack1" type="AnimatedSprite2D"] +[node name="MeleeAttack1" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] sprite_frames = SubResource("SpriteFrames_hkcv6") -autoplay = "default" script = ExtResource("2_bjagc") DelayTime = 0.2 +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack2.tscn b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack2.tscn index 3796f4a..9f8cba9 100644 --- a/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack2.tscn +++ b/DungeonShooting_Godot/prefab/effect/weapon/MeleeAttack2.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=3 format=3 uid="uid://cxq8wfeda4huc"] -[ext_resource type="SpriteFrames" uid="uid://dj8o7ws03bik4" path="res://resource/spriteFrames/effect/KnifeHit1.tres" id="1_ds7pw"] +[ext_resource type="SpriteFrames" uid="uid://dj8o7ws03bik4" path="res://resource/spriteFrames/weapon/Weapon0004_hit.tres" id="1_ds7pw"] [ext_resource type="Script" path="res://src/game/effects/AutoDestroySprite.cs" id="2_hl3gp"] -[node name="MeleeAttack2" type="AnimatedSprite2D"] +[node name="MeleeAttack2" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] sprite_frames = ExtResource("1_ds7pw") -autoplay = "default" script = ExtResource("2_hl3gp") DelayTime = 0.12 +Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn index 8a03b47..159734f 100644 --- a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=3 uid="uid://433h6huyctl1"] -[ext_resource type="Texture2D" uid="uid://b0jsyrbk4bydt" path="res://resource/sprite/effects/weapon/ShotFire.png" id="1_sencp"] +[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"] @@ -33,6 +33,9 @@ }, { "duration": 1.0, "texture": SubResource("AtlasTexture_qi1pq") +}, { +"duration": 1.0, +"texture": null }], "loop": false, "name": &"default", @@ -42,8 +45,7 @@ [node name="ShotFire" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] modulate = Color(1.6, 1.6, 1.6, 1) sprite_frames = SubResource("SpriteFrames_73j16") -autoplay = "default" offset = Vector2(8, 0) script = ExtResource("2_lnwju") -DelayTime = 0.2 +DelayTime = 0.5 Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn index d2c9f8b..768d4d4 100644 --- a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire2.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=3 uid="uid://drcvbo0xam6q"] -[ext_resource type="Texture2D" uid="uid://cj8gb5dxnk8ov" path="res://resource/sprite/effects/weapon/ShotFire2.png" id="1_ljjfn"] +[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"] @@ -33,6 +33,9 @@ }, { "duration": 1.0, "texture": SubResource("AtlasTexture_ud7n7") +}, { +"duration": 1.0, +"texture": null }], "loop": false, "name": &"default", @@ -42,8 +45,7 @@ [node name="ShotFire2" type="AnimatedSprite2D" node_paths=PackedStringArray("Particles2D")] modulate = Color(1.6, 1.6, 1.6, 1) sprite_frames = SubResource("SpriteFrames_rry1m") -autoplay = "default" offset = Vector2(5.5, 0) script = ExtResource("2_4ecjw") -DelayTime = 0.2 +DelayTime = 0.5 Particles2D = [] diff --git a/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.tscn b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.tscn new file mode 100644 index 0000000..751fef8 --- /dev/null +++ b/DungeonShooting_Godot/prefab/effect/weapon/ShotFire3.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/prop/PropTemplate.tscn b/DungeonShooting_Godot/prefab/prop/PropTemplate.tscn index a0fecf6..db39a29 100644 --- a/DungeonShooting_Godot/prefab/prop/PropTemplate.tscn +++ b/DungeonShooting_Godot/prefab/prop/PropTemplate.tscn @@ -1,26 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://utgoqn1dt4c3"] - -[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_77bh2"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] -resource_local_to_scene = true -shader = ExtResource("2_77bh2") -shader_parameter/blend = Color(0, 0, 0, 0.470588) -shader_parameter/schedule = 1.0 -shader_parameter/alpha = 1.0 -shader_parameter/show_outline = false -shader_parameter/outline_color = Color(0, 0, 0, 1) -shader_parameter/outline_rainbow = false - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_b6ii6"] -resource_local_to_scene = true -shader = ExtResource("2_77bh2") -shader_parameter/blend = Color(1, 1, 1, 1) -shader_parameter/schedule = 0.0 -shader_parameter/alpha = 1.0 -shader_parameter/show_outline = true -shader_parameter/outline_color = Color(0, 0, 0, 1) -shader_parameter/outline_rainbow = false +[gd_scene load_steps=2 format=3 uid="uid://utgoqn1dt4c3"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) @@ -30,10 +8,8 @@ [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 -material = SubResource("ShaderMaterial_mrkt4") [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_b6ii6") [node name="Collision" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_cpqup") diff --git a/DungeonShooting_Godot/prefab/prop/active/ActiveProp5000.tscn b/DungeonShooting_Godot/prefab/prop/active/ActiveProp5000.tscn index d874d73..26f1741 100644 --- a/DungeonShooting_Godot/prefab/prop/active/ActiveProp5000.tscn +++ b/DungeonShooting_Godot/prefab/prop/active/ActiveProp5000.tscn @@ -9,20 +9,24 @@ shader = ExtResource("1_f18nu") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_f18nu") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/active/ActiveProp5001.tscn b/DungeonShooting_Godot/prefab/prop/active/ActiveProp5001.tscn index 3ae9891..7bc2069 100644 --- a/DungeonShooting_Godot/prefab/prop/active/ActiveProp5001.tscn +++ b/DungeonShooting_Godot/prefab/prop/active/ActiveProp5001.tscn @@ -13,6 +13,8 @@ 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_b6ii6"] resource_local_to_scene = true @@ -23,6 +25,8 @@ 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_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0001.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0001.tscn index ebbb22c..5a224de 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0001.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0001.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://tdc6flkvlfbd"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0001.cs" id="1_exxhd"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0001.cs" id="1_exxhd"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_x6ey2"] [ext_resource type="SpriteFrames" uid="uid://wtvfyprel72y" path="res://resource/spriteFrames/prop/buff/BuffProp0001.tres" id="3_hfyao"] @@ -9,20 +9,24 @@ shader = ExtResource("2_x6ey2") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("2_x6ey2") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0002.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0002.tscn index 7ef2c07..eb82ff2 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0002.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0002.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=7 format=3 uid="uid://da131v16ct8c4"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_2qy1s"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0002.cs" id="1_5ouvd"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0002.cs" id="1_5ouvd"] [ext_resource type="SpriteFrames" uid="uid://7t57gsyff470" path="res://resource/spriteFrames/prop/buff/BuffProp0002.tres" id="3_v4alm"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] @@ -9,20 +9,24 @@ shader = ExtResource("1_2qy1s") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_2qy1s") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0003.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0003.tscn index 46f564b..f58be9f 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0003.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0003.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://ds21gbw4wyvn6"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0003.cs" id="1_h8d6p"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0003.cs" id="1_h8d6p"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_udh4b"] [ext_resource type="SpriteFrames" uid="uid://nqoieett75t3" path="res://resource/spriteFrames/prop/buff/BuffProp0003.tres" id="3_h72sh"] @@ -9,20 +9,24 @@ shader = ExtResource("1_udh4b") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_udh4b") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0004.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0004.tscn index 58d9d29..4e86fe2 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0004.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0004.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://cq8edil51uccc"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0004.cs" id="1_7bt71"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0004.cs" id="1_7bt71"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_j7hva"] [ext_resource type="SpriteFrames" uid="uid://bj0k3pipwp46x" path="res://resource/spriteFrames/prop/buff/BuffProp0004.tres" id="3_pdaqp"] @@ -9,20 +9,24 @@ shader = ExtResource("1_j7hva") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_j7hva") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0005.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0005.tscn index 741717b..b970cc9 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0005.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0005.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://3xtqrx17y14p"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0005.cs" id="1_6dlc2"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0005.cs" id="1_6dlc2"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_qa4yg"] [ext_resource type="SpriteFrames" uid="uid://bvqp46degt1rg" path="res://resource/spriteFrames/prop/buff/BuffProp0005.tres" id="3_1mcnn"] @@ -9,20 +9,24 @@ shader = ExtResource("1_qa4yg") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_qa4yg") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0006.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0006.tscn index 41ecf02..bc71428 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0006.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0006.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://bfc03e4aftg21"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0006.cs" id="1_2cooj"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0006.cs" id="1_2cooj"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_c1mo1"] [ext_resource type="SpriteFrames" uid="uid://bxn65oovekw6k" path="res://resource/spriteFrames/prop/buff/BuffProp0006.tres" id="3_nd6lq"] @@ -9,20 +9,24 @@ shader = ExtResource("1_c1mo1") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_c1mo1") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0007.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0007.tscn index 6598520..b8bcd90 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0007.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0007.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://cwfuv68ijkmfg"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0007.cs" id="1_71c3m"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0007.cs" id="1_71c3m"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_ofs5v"] [ext_resource type="SpriteFrames" uid="uid://et840sb4d1g3" path="res://resource/spriteFrames/prop/buff/BuffProp0007.tres" id="3_xxla0"] @@ -9,20 +9,24 @@ shader = ExtResource("1_ofs5v") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_ofs5v") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0008.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0008.tscn index a29d7cd..7de7463 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0008.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0008.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://cn1tmegrfgr8h"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0008.cs" id="1_b5ys1"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0008.cs" id="1_b5ys1"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_tdrqb"] [ext_resource type="SpriteFrames" uid="uid://bs41p1hpkpucb" path="res://resource/spriteFrames/prop/buff/BuffProp0008.tres" id="3_5noil"] @@ -9,20 +9,24 @@ shader = ExtResource("1_tdrqb") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_tdrqb") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0009.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0009.tscn index 7955262..a5167ba 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0009.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0009.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://gh0dxgvshwpm"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0009.cs" id="1_e1yrg"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0009.cs" id="1_e1yrg"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_eq0bc"] [ext_resource type="SpriteFrames" uid="uid://sqcibio78nwc" path="res://resource/spriteFrames/prop/buff/BuffProp0009.tres" id="3_qrjbu"] @@ -9,20 +9,24 @@ shader = ExtResource("1_eq0bc") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_eq0bc") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0010.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0010.tscn index 49eb575..b203391 100644 --- a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0010.tscn +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0010.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=7 format=3 uid="uid://do5mmmapnyxg4"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_5yy3i"] -[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffPropProp0010.cs" id="1_q6g7l"] +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0010.cs" id="1_q6g7l"] [ext_resource type="SpriteFrames" uid="uid://dxqtm7xgn2wms" path="res://resource/spriteFrames/prop/buff/BuffProp0010.tres" id="3_i5q7j"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] @@ -9,20 +9,24 @@ shader = ExtResource("1_5yy3i") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1.0 -shader_parameter/alpha = 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_b6ii6"] resource_local_to_scene = true shader = ExtResource("1_5yy3i") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0.0 -shader_parameter/alpha = 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="RectangleShape2D" id="RectangleShape2D_cpqup"] size = Vector2(12, 10) diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0011.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0011.tscn new file mode 100644 index 0000000..f1e2562 --- /dev/null +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0011.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=7 format=3 uid="uid://bs3ysp1587xqe"] + +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0011.cs" id="1_dnyh3"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_d5gcm"] +[ext_resource type="SpriteFrames" uid="uid://bq7t8ruav5g41" path="res://resource/spriteFrames/prop/buff/BuffProp0011.tres" id="3_hrxu3"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] +resource_local_to_scene = true +shader = ExtResource("2_d5gcm") +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_b6ii6"] +resource_local_to_scene = true +shader = ExtResource("2_d5gcm") +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_cpqup"] +size = Vector2(12, 10) + +[node name="BuffProp0011" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_dnyh3") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_mrkt4") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_b6ii6") +sprite_frames = ExtResource("3_hrxu3") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cpqup") diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0012.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0012.tscn new file mode 100644 index 0000000..7692be7 --- /dev/null +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0012.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=7 format=3 uid="uid://ph6x3vmkp11j"] + +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0012.cs" id="1_w2r3p"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_kwnd5"] +[ext_resource type="SpriteFrames" uid="uid://rksmm8jwex7l" path="res://resource/spriteFrames/prop/buff/BuffProp0012.tres" id="3_fijh4"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] +resource_local_to_scene = true +shader = ExtResource("2_kwnd5") +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_b6ii6"] +resource_local_to_scene = true +shader = ExtResource("2_kwnd5") +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_cpqup"] +size = Vector2(12, 10) + +[node name="BuffProp0012" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_w2r3p") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_mrkt4") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_b6ii6") +sprite_frames = ExtResource("3_fijh4") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cpqup") diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0013.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0013.tscn new file mode 100644 index 0000000..bd04f52 --- /dev/null +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0013.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=7 format=3 uid="uid://di6874mbwbpkd"] + +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0013.cs" id="1_iy1yu"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_n5bm6"] +[ext_resource type="SpriteFrames" uid="uid://cdnrqfy0vfyu5" path="res://resource/spriteFrames/prop/buff/BuffProp0013.tres" id="3_4qjjr"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] +resource_local_to_scene = true +shader = ExtResource("2_n5bm6") +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_b6ii6"] +resource_local_to_scene = true +shader = ExtResource("2_n5bm6") +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_cpqup"] +size = Vector2(12, 10) + +[node name="BuffProp0013" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_iy1yu") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_mrkt4") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_b6ii6") +sprite_frames = ExtResource("3_4qjjr") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cpqup") diff --git a/DungeonShooting_Godot/prefab/prop/buff/BuffProp0014.tscn b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0014.tscn new file mode 100644 index 0000000..dc86fa5 --- /dev/null +++ b/DungeonShooting_Godot/prefab/prop/buff/BuffProp0014.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=7 format=3 uid="uid://dw2tt5urcxtxe"] + +[ext_resource type="Script" path="res://src/game/activity/prop/buff/BuffProp0014.cs" id="1_3n5b4"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_ts4j6"] +[ext_resource type="SpriteFrames" uid="uid://ux70kddi6wwy" path="res://resource/spriteFrames/prop/buff/BuffProp0014.tres" id="3_byb1t"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mrkt4"] +resource_local_to_scene = true +shader = ExtResource("2_ts4j6") +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_b6ii6"] +resource_local_to_scene = true +shader = ExtResource("2_ts4j6") +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_cpqup"] +size = Vector2(12, 10) + +[node name="BuffProp0014" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")] +collision_layer = 4 +script = ExtResource("1_3n5b4") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 +material = SubResource("ShaderMaterial_mrkt4") + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_b6ii6") +sprite_frames = ExtResource("3_byb1t") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cpqup") diff --git a/DungeonShooting_Godot/prefab/role/Enemy0001.tscn b/DungeonShooting_Godot/prefab/role/Enemy0001.tscn index 866f829..7d51397 100644 --- a/DungeonShooting_Godot/prefab/role/Enemy0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Enemy0001.tscn @@ -1,11 +1,15 @@ -[gd_scene load_steps=7 format=3 uid="uid://dbrig6dq441wo"] +[gd_scene load_steps=13 format=3 uid="uid://b8s1dgu63fddf"] -[ext_resource type="PackedScene" uid="uid://cyrcv2jdgr8cf" path="res://prefab/role/RoleTemplate.tscn" id="1_5po38"] -[ext_resource type="Script" path="res://src/game/activity/role/enemy/Enemy.cs" id="2_1plrq"] +[ext_resource type="PackedScene" uid="uid://dbrig6dq441wo" path="res://prefab/role/template/EnemyTemplate.tscn" id="1_2vqwe"] +[ext_resource type="Script" path="res://src/game/activity/role/enemy/Enemy.cs" id="2_0pcq3"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_x8agd"] -[ext_resource type="SpriteFrames" uid="uid://cnctpyrn02rhd" path="res://resource/spriteFrames/role/Role1001.tres" id="4_qv8w5"] +[ext_resource type="SpriteFrames" uid="uid://cnctpyrn02rhd" path="res://resource/spriteFrames/role/Enemy0001.tres" id="4_qv8w5"] +[ext_resource type="Animation" uid="uid://b4mgiysicdk2b" path="res://resource/animation/enemy/Enemy_reset.res" id="5_ffnft"] +[ext_resource type="Animation" uid="uid://gvkkxspcdwrp" path="res://resource/animation/enemy/Enemy_astonished.res" id="5_jyt15"] +[ext_resource type="Animation" uid="uid://16rxpnsgj5tl" path="res://resource/animation/enemy/Enemy_notify.res" id="6_x8gmo"] +[ext_resource type="Animation" uid="uid://cmje7jsgrhgmx" path="res://resource/animation/enemy/Enemy_query.res" id="7_e37p2"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_8vxx6"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_3nkur"] resource_local_to_scene = true shader = ExtResource("3_x8agd") shader_parameter/blend = Color(0, 0, 0, 0.470588) @@ -15,8 +19,9 @@ 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_k8mt5"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2kup1"] resource_local_to_scene = true shader = ExtResource("3_x8agd") shader_parameter/blend = Color(1, 1, 1, 1) @@ -26,17 +31,34 @@ 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 -[node name="Enemy0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "MountPoint", "BackMountPoint", "InteractiveArea", "InteractiveCollision", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_5po38")] -collision_layer = 16 -collision_mask = 25 -script = ExtResource("2_1plrq") +[sub_resource type="RectangleShape2D" id="RectangleShape2D_rkrey"] +size = Vector2(12, 18) + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ur1ug"] +_data = { +"RESET": ExtResource("5_ffnft"), +"astonished": ExtResource("5_jyt15"), +"notify": ExtResource("6_x8gmo"), +"query": ExtResource("7_e37p2") +} + +[node name="Enemy0001" node_paths=PackedStringArray("ViewRay", "NavigationAgent2D", "NavigationPoint", "FirePoint", "HurtArea", "HurtCollision", "InteractiveArea", "InteractiveCollision", "TipRoot", "TipSprite", "AnimationPlayer", "MountPoint", "BackMountPoint", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_2vqwe")] +script = ExtResource("2_0pcq3") +ViewRay = NodePath("ViewRay") +NavigationAgent2D = NodePath("NavigationPoint/NavigationAgent2D") +NavigationPoint = NodePath("NavigationPoint") +FirePoint = NodePath("FirePoint") HurtArea = NodePath("HurtArea") HurtCollision = NodePath("HurtArea/HurtCollision") -MountPoint = NodePath("MountPoint") -BackMountPoint = NodePath("BackMountPoint") InteractiveArea = NodePath("InteractiveArea") InteractiveCollision = NodePath("InteractiveArea/InteractiveCollision") +TipRoot = NodePath("TipRoot") +TipSprite = NodePath("TipRoot/TipSprite") +AnimationPlayer = NodePath("AnimationPlayer") +MountPoint = NodePath("MountPoint") +BackMountPoint = NodePath("BackMountPoint") MeleeAttackArea = NodePath("MountPoint/MeleeAttackArea") MeleeAttackCollision = NodePath("MountPoint/MeleeAttackArea/MeleeAttackCollision") ShadowSprite = NodePath("ShadowSprite") @@ -44,21 +66,19 @@ Collision = NodePath("Collision") [node name="ShadowSprite" parent="." index="0"] -material = SubResource("ShaderMaterial_8vxx6") +material = SubResource("ShaderMaterial_3nkur") [node name="AnimatedSprite" parent="." index="2"] -material = SubResource("ShaderMaterial_k8mt5") +material = SubResource("ShaderMaterial_2kup1") sprite_frames = ExtResource("4_qv8w5") -animation = &"run" -[node name="ViewRay" type="RayCast2D" parent="." index="6"] -position = Vector2(0, -8) -enabled = false +[node name="HurtCollision" parent="HurtArea" index="0"] +shape = SubResource("RectangleShape2D_rkrey") -[node name="NavigationPoint" type="Marker2D" parent="." index="8"] -position = Vector2(0, -5) +[node name="FirePoint" parent="." index="8"] +position = Vector2(2, -9) -[node name="NavigationAgent2D" type="NavigationAgent2D" parent="NavigationPoint" index="0"] -path_desired_distance = 3.0 -target_desired_distance = 3.0 -radius = 20.0 +[node name="AnimationPlayer" parent="." index="11"] +libraries = { +"": SubResource("AnimationLibrary_ur1ug") +} diff --git a/DungeonShooting_Godot/prefab/role/Enemy0002.tscn b/DungeonShooting_Godot/prefab/role/Enemy0002.tscn new file mode 100644 index 0000000..bd2ff43 --- /dev/null +++ b/DungeonShooting_Godot/prefab/role/Enemy0002.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=13 format=3 uid="uid://daqsdld5gnwwr"] + +[ext_resource type="PackedScene" uid="uid://dbrig6dq441wo" path="res://prefab/role/template/EnemyTemplate.tscn" id="1_fanet"] +[ext_resource type="Script" path="res://src/game/activity/role/enemy/NoWeaponEnemy.cs" id="2_3an4s"] +[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_yunbp"] +[ext_resource type="SpriteFrames" uid="uid://ctpkpxgcwb583" path="res://resource/spriteFrames/role/Enemy0002.tres" id="3_hbsqi"] +[ext_resource type="Animation" uid="uid://gvkkxspcdwrp" path="res://resource/animation/enemy/Enemy_astonished.res" id="5_p7gwr"] +[ext_resource type="Animation" uid="uid://b4mgiysicdk2b" path="res://resource/animation/enemy/Enemy_reset.res" id="6_pt7v0"] +[ext_resource type="Animation" uid="uid://cmje7jsgrhgmx" path="res://resource/animation/enemy/Enemy_query.res" id="7_h4cls"] +[ext_resource type="Animation" uid="uid://16rxpnsgj5tl" path="res://resource/animation/enemy/Enemy_notify.res" id="8_0688j"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_y5nia"] +resource_local_to_scene = true +shader = ExtResource("2_yunbp") +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_4qvs8"] +resource_local_to_scene = true +shader = ExtResource("2_yunbp") +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="Animation" id="Animation_bn678"] +resource_name = "attack" +length = 1.8 +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": [&"attack"] +} +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, 12] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(1.3), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"OnAttack" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_3ge8m"] +_data = { +"RESET": ExtResource("6_pt7v0"), +"astonished": ExtResource("5_p7gwr"), +"attack": SubResource("Animation_bn678"), +"notify": ExtResource("8_0688j"), +"query": ExtResource("7_h4cls") +} + +[node name="Enemy0002" node_paths=PackedStringArray("ViewRay", "NavigationAgent2D", "NavigationPoint", "FirePoint", "HurtArea", "HurtCollision", "InteractiveArea", "InteractiveCollision", "TipRoot", "TipSprite", "AnimationPlayer", "MountPoint", "BackMountPoint", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_fanet")] +script = ExtResource("2_3an4s") +ViewRay = NodePath("ViewRay") +NavigationAgent2D = NodePath("NavigationPoint/NavigationAgent2D") +NavigationPoint = NodePath("NavigationPoint") +FirePoint = NodePath("FirePoint") +HurtArea = NodePath("HurtArea") +HurtCollision = NodePath("HurtArea/HurtCollision") +InteractiveArea = NodePath("InteractiveArea") +InteractiveCollision = NodePath("InteractiveArea/InteractiveCollision") +TipRoot = NodePath("TipRoot") +TipSprite = NodePath("TipRoot/TipSprite") +AnimationPlayer = NodePath("AnimationPlayer") +MountPoint = NodePath("MountPoint") +BackMountPoint = NodePath("BackMountPoint") +MeleeAttackArea = NodePath("MountPoint/MeleeAttackArea") +MeleeAttackCollision = NodePath("MountPoint/MeleeAttackArea/MeleeAttackCollision") +ShadowSprite = NodePath("ShadowSprite") +AnimatedSprite = NodePath("AnimatedSprite") +Collision = NodePath("Collision") + +[node name="ShadowSprite" parent="." index="0"] +material = SubResource("ShaderMaterial_y5nia") + +[node name="AnimatedSprite" parent="." index="2"] +material = SubResource("ShaderMaterial_4qvs8") +sprite_frames = ExtResource("3_hbsqi") +offset = Vector2(0, -9) + +[node name="HurtCollision" parent="HurtArea" index="0"] +position = Vector2(0, -7) + +[node name="MountPoint" parent="." index="7"] +position = Vector2(4, -9) + +[node name="FirePoint" parent="." index="8"] +position = Vector2(7, -6) + +[node name="AnimationPlayer" parent="." index="11"] +libraries = { +"": SubResource("AnimationLibrary_3ge8m") +} diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn index fd8b964..d877f44 100644 --- a/DungeonShooting_Godot/prefab/role/Role0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn @@ -1,21 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://cxhrcytrx0kcf"] +[gd_scene load_steps=9 format=3 uid="uid://cxhrcytrx0kcf"] -[ext_resource type="PackedScene" uid="uid://cyrcv2jdgr8cf" path="res://prefab/role/RoleTemplate.tscn" id="1_10c2n"] +[ext_resource type="PackedScene" uid="uid://cyrcv2jdgr8cf" path="res://prefab/role/template/RoleTemplate.tscn" id="1_10c2n"] [ext_resource type="Script" path="res://src/game/activity/role/player/Player.cs" id="2_6xwnt"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="3_rk4gg"] +[ext_resource type="Texture2D" uid="uid://dn58ax3t6rf4x" path="res://resource/sprite/role/common/Role_shadow1.png" id="3_vx7tr"] [ext_resource type="SpriteFrames" uid="uid://n11thtali6es" path="res://resource/spriteFrames/role/Role0001.tres" id="4_galcc"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_lvutq"] -resource_local_to_scene = true -shader = ExtResource("3_rk4gg") -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 - [sub_resource type="ShaderMaterial" id="ShaderMaterial_8hgu2"] resource_local_to_scene = true shader = ExtResource("3_rk4gg") @@ -26,16 +16,25 @@ 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 -[node name="Role0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "MountPoint", "BackMountPoint", "InteractiveArea", "InteractiveCollision", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_10c2n")] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ve262"] +size = Vector2(12, 18) + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ka171"] + +[node name="Role0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "InteractiveArea", "InteractiveCollision", "TipRoot", "TipSprite", "AnimationPlayer", "MountPoint", "BackMountPoint", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_10c2n")] collision_layer = 8 script = ExtResource("2_6xwnt") HurtArea = NodePath("HurtArea") HurtCollision = NodePath("HurtArea/HurtCollision") -MountPoint = NodePath("MountPoint") -BackMountPoint = NodePath("BackMountPoint") InteractiveArea = NodePath("InteractiveArea") InteractiveCollision = NodePath("InteractiveArea/InteractiveCollision") +TipRoot = NodePath("TipRoot") +TipSprite = NodePath("TipRoot/TipSprite") +AnimationPlayer = NodePath("AnimationPlayer") +MountPoint = NodePath("MountPoint") +BackMountPoint = NodePath("BackMountPoint") MeleeAttackArea = NodePath("MountPoint/MeleeAttackArea") MeleeAttackCollision = NodePath("MountPoint/MeleeAttackArea/MeleeAttackCollision") ShadowSprite = NodePath("ShadowSprite") @@ -43,8 +42,20 @@ Collision = NodePath("Collision") [node name="ShadowSprite" parent="." index="0"] -material = SubResource("ShaderMaterial_lvutq") +texture = ExtResource("3_vx7tr") [node name="AnimatedSprite" parent="." index="2"] material = SubResource("ShaderMaterial_8hgu2") sprite_frames = ExtResource("4_galcc") +animation = &"roll" + +[node name="HurtCollision" parent="HurtArea" index="0"] +shape = SubResource("RectangleShape2D_ve262") + +[node name="InteractiveArea" parent="." index="5"] +visible = true + +[node name="AnimationPlayer" parent="." index="8"] +libraries = { +"": SubResource("AnimationLibrary_ka171") +} diff --git a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn b/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn deleted file mode 100644 index 584b37c..0000000 --- a/DungeonShooting_Godot/prefab/role/RoleTemplate.tscn +++ /dev/null @@ -1,82 +0,0 @@ -[gd_scene load_steps=8 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"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_v2kfw"] -resource_local_to_scene = true -shader = ExtResource("1_xk5yk") -shader_parameter/blend = Color(0, 0, 0, 0.470588) -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 - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_yif6x"] -resource_local_to_scene = true -shader = ExtResource("1_xk5yk") -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 - -[sub_resource type="CircleShape2D" id="CircleShape2D_5pj80"] -radius = 4.0 - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_1eja2"] -size = Vector2(12, 18) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_n68nu"] -size = Vector2(10, 16.5) - -[node name="RoleTemplate" type="CharacterBody2D"] - -[node name="ShadowSprite" type="Sprite2D" parent="."] -z_index = -1 -material = SubResource("ShaderMaterial_v2kfw") - -[node name="BackMountPoint" type="Marker2D" parent="."] -position = Vector2(0, -12) - -[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_yif6x") -position = Vector2(0, -12) - -[node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(0, -4) -shape = SubResource("CircleShape2D_5pj80") - -[node name="HurtArea" type="Area2D" parent="."] -collision_layer = 0 -collision_mask = 0 -monitoring = false - -[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") - -[node name="MountPoint" type="Marker2D" parent="."] -position = Vector2(2, -8) -script = ExtResource("2_5ddpw") - -[node name="MeleeAttackArea" type="Area2D" parent="MountPoint"] -collision_layer = 0 -collision_mask = 0 -monitorable = false - -[node name="MeleeAttackCollision" type="CollisionPolygon2D" parent="MountPoint/MeleeAttackArea"] diff --git a/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn b/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn new file mode 100644 index 0000000..3625be0 --- /dev/null +++ b/DungeonShooting_Godot/prefab/role/template/EnemyTemplate.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=4 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"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_k8mt5"] +resource_local_to_scene = true +shader = ExtResource("3_x8agd") +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 + +[node name="EnemyTemplate" instance=ExtResource("1_5po38")] +collision_layer = 16 +collision_mask = 25 + +[node name="AnimatedSprite" parent="." index="2"] +material = SubResource("ShaderMaterial_k8mt5") + +[node name="ViewRay" type="RayCast2D" parent="." index="6"] +position = Vector2(0, -8) +enabled = false + +[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 +target_desired_distance = 3.0 +radius = 20.0 diff --git a/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn b/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn new file mode 100644 index 0000000..faf3e36 --- /dev/null +++ b/DungeonShooting_Godot/prefab/role/template/RoleTemplate.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=8 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="SpriteFrames" uid="uid://c8h5svp76h3kw" path="res://resource/spriteFrames/role/Role_tip.tres" id="3_bo78w"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_yif6x"] +resource_local_to_scene = true +shader = ExtResource("1_xk5yk") +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="CircleShape2D" id="CircleShape2D_5pj80"] +radius = 4.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_1eja2"] +size = Vector2(12, 18) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_n68nu"] +size = Vector2(10, 16.5) + +[node name="RoleTemplate" type="CharacterBody2D"] +collision_layer = 0 + +[node name="ShadowSprite" type="Sprite2D" parent="."] +z_index = -1 + +[node name="BackMountPoint" type="Marker2D" parent="."] +position = Vector2(0, -12) + +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_yif6x") +offset = Vector2(0, -12) + +[node name="Collision" type="CollisionShape2D" parent="."] +position = Vector2(0, -4) +shape = SubResource("CircleShape2D_5pj80") + +[node name="HurtArea" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 0 +monitoring = false + +[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") + +[node name="MountPoint" type="Marker2D" parent="."] +position = Vector2(2, -8) +script = ExtResource("2_5ddpw") + +[node name="MeleeAttackArea" type="Area2D" parent="MountPoint"] +collision_layer = 0 +collision_mask = 0 +monitorable = false + +[node name="MeleeAttackCollision" type="CollisionPolygon2D" parent="MountPoint/MeleeAttackArea"] + +[node name="TipRoot" type="Node2D" parent="."] + +[node name="TipSprite" type="AnimatedSprite2D" parent="TipRoot"] +visible = false +position = Vector2(0, -22) +sprite_frames = ExtResource("3_bo78w") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/DungeonShooting_Godot/prefab/shell/Shell0001.tscn b/DungeonShooting_Godot/prefab/shell/Shell0001.tscn index eceaf5d..c1b2535 100644 --- a/DungeonShooting_Godot/prefab/shell/Shell0001.tscn +++ b/DungeonShooting_Godot/prefab/shell/Shell0001.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://bj4yr6ru8nhwr"] -[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_2g70c"] +[ext_resource type="Script" path="res://src/game/activity/common/AutoFreezeObject.cs" id="1_2g70c"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_tdny6"] [ext_resource type="SpriteFrames" uid="uid://b8gksxl7auquc" path="res://resource/spriteFrames/shell/Shell0001.tres" id="3_ujn5y"] @@ -35,6 +35,8 @@ ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") +ShadowOffset = Vector2(0, 1) +ThrowCollisionSize = Vector2(5, 5) [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 diff --git a/DungeonShooting_Godot/prefab/shell/Shell0002.tscn b/DungeonShooting_Godot/prefab/shell/Shell0002.tscn index 7fc2e03..aa42706 100644 --- a/DungeonShooting_Godot/prefab/shell/Shell0002.tscn +++ b/DungeonShooting_Godot/prefab/shell/Shell0002.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://cdhinm8rnppxt"] -[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_qi64y"] +[ext_resource type="Script" path="res://src/game/activity/common/AutoFreezeObject.cs" id="1_qi64y"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_s28nu"] [ext_resource type="SpriteFrames" uid="uid://cj8psdl2pova6" path="res://resource/spriteFrames/shell/Shell0002.tres" id="3_r560h"] @@ -35,6 +35,8 @@ ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") +ShadowOffset = Vector2(0, 1) +ThrowCollisionSize = Vector2(5, 5) [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 diff --git a/DungeonShooting_Godot/prefab/shell/Shell0003.tscn b/DungeonShooting_Godot/prefab/shell/Shell0003.tscn index fecfbcb..f50ef2f 100644 --- a/DungeonShooting_Godot/prefab/shell/Shell0003.tscn +++ b/DungeonShooting_Godot/prefab/shell/Shell0003.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://ba5sxxjaappbj"] -[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_5hfb2"] +[ext_resource type="Script" path="res://src/game/activity/common/AutoFreezeObject.cs" id="1_5hfb2"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_586dn"] [ext_resource type="SpriteFrames" uid="uid://kc1jwvwdg660" path="res://resource/spriteFrames/shell/Shell0003.tres" id="3_j2kre"] @@ -35,6 +35,8 @@ ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") +ShadowOffset = Vector2(0, 1) +ThrowCollisionSize = Vector2(5, 5) [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 diff --git a/DungeonShooting_Godot/prefab/shell/Shell0004.tscn b/DungeonShooting_Godot/prefab/shell/Shell0004.tscn index 42d8fd0..fc18f6b 100644 --- a/DungeonShooting_Godot/prefab/shell/Shell0004.tscn +++ b/DungeonShooting_Godot/prefab/shell/Shell0004.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://ycr5mjr25302"] -[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_ridlp"] +[ext_resource type="Script" path="res://src/game/activity/common/AutoFreezeObject.cs" id="1_ridlp"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_guwkk"] [ext_resource type="SpriteFrames" uid="uid://b8b0ye3iv1vwp" path="res://resource/spriteFrames/shell/Shell0004.tres" id="3_1s5f3"] @@ -35,6 +35,8 @@ ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") Collision = NodePath("Collision") +ShadowOffset = Vector2(0, 1) +ThrowCollisionSize = Vector2(5, 5) [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 diff --git a/DungeonShooting_Godot/prefab/test/TestActivity.tscn b/DungeonShooting_Godot/prefab/test/TestActivity.tscn deleted file mode 100644 index 203f1e7..0000000 --- a/DungeonShooting_Godot/prefab/test/TestActivity.tscn +++ /dev/null @@ -1,42 +0,0 @@ -[gd_scene load_steps=7 format=3] - -[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1"] -[ext_resource type="Script" path="res://src/framework/activity/ActivityObjectTemplate.cs" id="2"] -[ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="3"] - - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_rxkv3"] -resource_local_to_scene = true -shader = ExtResource("1") -shader_parameter/blend = Color(0, 0, 0, 0.470588) -shader_parameter/schedule = 1 - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_aaga8"] -resource_local_to_scene = true -shader = ExtResource("1") -shader_parameter/blend = Color(1, 1, 1, 1) -shader_parameter/schedule = 0 - -[sub_resource type="SpriteFrames" id="SpriteFrames_kkdcb"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": ExtResource("3") -}], -"loop": true, -"name": &"default", -"speed": 5.0 -}] - -[node name="TestActivity" type="Node"] -script = ExtResource("2") - -[node name="ShadowSprite" type="Sprite2D" parent="."] -z_index = -5 -material = SubResource("ShaderMaterial_rxkv3") - -[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_aaga8") -sprite_frames = SubResource("SpriteFrames_kkdcb") - -[node name="Collision" type="CollisionShape2D" parent="."] diff --git a/DungeonShooting_Godot/prefab/ui/EditorTools.tscn b/DungeonShooting_Godot/prefab/ui/EditorTools.tscn index 1089ea7..9817a68 100644 --- a/DungeonShooting_Godot/prefab/ui/EditorTools.tscn +++ b/DungeonShooting_Godot/prefab/ui/EditorTools.tscn @@ -88,70 +88,6 @@ layout_mode = 2 text = "运行" -[node name="HBoxContainer6" type="HBoxContainer" parent="ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 5 - -[node name="Label" type="Label" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -text = "创建地牢房间" - -[node name="RoomNameInput" type="LineEdit" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -custom_minimum_size = Vector2(250, 0) -layout_mode = 2 -placeholder_text = "请输入房间名称" - -[node name="Label2" type="Label" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -text = "房间所属分组" - -[node name="RoomGroupSelect" type="OptionButton" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -item_count = 1 -selected = 0 -popup/item_0/text = "testGroup" -popup/item_0/id = 0 - -[node name="Label3" type="Label" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -text = "房间类型" - -[node name="RoomTypeSelect" type="OptionButton" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -item_count = 7 -selected = 0 -popup/item_0/text = "battle (战斗房间)" -popup/item_0/id = 0 -popup/item_1/text = "inlet (起始房间)" -popup/item_1/id = 1 -popup/item_2/text = "outlet (结束房间)" -popup/item_2/id = 2 -popup/item_3/text = "boss (boss战房间)" -popup/item_3/id = 3 -popup/item_4/text = "reward (奖励房间)" -popup/item_4/id = 4 -popup/item_5/text = "shop (商店房间)" -popup/item_5/id = 5 -popup/item_6/text = "event (事件房间)" -popup/item_6/id = 6 - -[node name="Button" type="Button" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer6"] -layout_mode = 2 -text = "创建 -" - -[node name="HBoxContainer2" type="HBoxContainer" parent="ScrollContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 5 - -[node name="Label" type="Label" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer2"] -layout_mode = 2 -text = "重新打包地牢房间配置" - -[node name="Button" type="Button" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer2"] -layout_mode = 2 -text = "运行" - [node name="HBoxContainer7" type="HBoxContainer" parent="ScrollContainer/MarginContainer/VBoxContainer"] layout_mode = 2 theme_override_constants/separation = 5 @@ -164,6 +100,18 @@ layout_mode = 2 text = "运行" +[node name="HBoxContainer8" type="HBoxContainer" parent="ScrollContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 5 + +[node name="Label" type="Label" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer8"] +layout_mode = 2 +text = "打开Excel表文件夹" + +[node name="Button" type="Button" parent="ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer8"] +layout_mode = 2 +text = "运行" + [node name="Confirm" type="ConfirmationDialog" parent="."] initial_position = 1 size = Vector2i(350, 200) diff --git a/DungeonShooting_Godot/prefab/ui/RoomMap.tscn b/DungeonShooting_Godot/prefab/ui/RoomMap.tscn new file mode 100644 index 0000000..3e0a791 --- /dev/null +++ b/DungeonShooting_Godot/prefab/ui/RoomMap.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=5 format=3 uid="uid://bmj3p25gwpqpn"] + +[ext_resource type="Script" path="res://src/game/ui/roomMap/RoomMapPanel.cs" id="1_ng7b3"] +[ext_resource type="Texture2D" uid="uid://k621mhhkg65f" path="res://resource/sprite/ui/roomMap/MapBar.png" id="2_m52os"] +[ext_resource type="Texture2D" uid="uid://0878uloew5jo" path="res://resource/sprite/ui/commonIcon/Block.png" id="3_el2ne"] +[ext_resource type="Texture2D" uid="uid://cw702ostmv2am" path="res://resource/sprite/role/role0001/Role0001_head.png" id="4_6wquw"] + +[node name="RoomMap" 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_ng7b3") + +[node name="Bg" 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.588235) + +[node name="MapBar" type="NinePatchRect" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -275.0 +offset_top = 20.0 +offset_right = -19.0 +offset_bottom = 276.0 +grow_horizontal = 0 +texture = ExtResource("2_m52os") +patch_margin_left = 4 +patch_margin_top = 4 +patch_margin_right = 4 +patch_margin_bottom = 4 + +[node name="DrawContainer" type="TextureRect" parent="MapBar"] +clip_children = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 1.0 +offset_top = 1.0 +offset_right = -1.0 +offset_bottom = -1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("3_el2ne") +expand_mode = 1 + +[node name="Root" type="Node2D" parent="MapBar/DrawContainer"] +scale = Vector2(6, 6) + +[node name="Mark" type="Sprite2D" parent="MapBar/DrawContainer"] +position = Vector2(128, 128) +scale = Vector2(2, 2) +texture = ExtResource("4_6wquw") + +[node name="MagnifyMapBar" type="NinePatchRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 390.0 +offset_top = 131.0 +offset_right = -390.0 +offset_bottom = -131.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_m52os") +patch_margin_left = 4 +patch_margin_top = 4 +patch_margin_right = 4 +patch_margin_bottom = 4 diff --git a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn index c4fdc0a..a16d493 100644 --- a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn +++ b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn @@ -6,7 +6,6 @@ [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="Texture2D" uid="uid://k621mhhkg65f" path="res://resource/sprite/ui/roomUI/MapBar.png" id="7_p6pvs"] [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"] @@ -15,6 +14,7 @@ [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="12_fgyob"] [ext_resource type="Texture2D" uid="uid://dwysndc5ffski" path="res://resource/sprite/ui/roomUI/ChargeProgressBar.png" id="13_6w7qi"] [ext_resource type="Texture2D" uid="uid://ck0w7at3oat5" path="res://resource/sprite/ui/roomUI/ChargeProgress.png" id="13_vuglj"] +[ext_resource type="PackedScene" uid="uid://bmj3p25gwpqpn" path="res://prefab/ui/RoomMap.tscn" id="16_rp3sg"] [sub_resource type="Gradient" id="1"] colors = PackedColorArray(0.4, 0.498039, 1, 1, 0.4, 0.498039, 1, 0.313726) @@ -33,6 +33,8 @@ shader_parameter/show_outline = true shader_parameter/outline_color = Color(0.941176, 0.941176, 0.941176, 1) shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [sub_resource type="ShaderMaterial" id="ShaderMaterial_7pkeh"] resource_local_to_scene = true @@ -43,6 +45,8 @@ shader_parameter/show_outline = true shader_parameter/outline_color = Color(0.941176, 0.941176, 0.941176, 1) shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true +shader_parameter/grey = 0.0 [node name="RoomUI" type="Control"] layout_mode = 3 @@ -167,18 +171,6 @@ offset_bottom = 10.0 texture = ExtResource("6_ggviq") -[node name="MapBar" type="TextureRect" parent="Control"] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -176.0 -offset_right = -132.0 -offset_bottom = 44.0 -grow_horizontal = 0 -scale = Vector2(4, 4) -texture = ExtResource("7_p6pvs") - [node name="ActivePropBar" type="Control" parent="Control"] layout_mode = 1 anchors_preset = 2 @@ -332,3 +324,18 @@ text = "30/90" horizontal_alignment = 2 vertical_alignment = 1 + +[node name="RoomMap" parent="." instance=ExtResource("16_rp3sg")] +layout_mode = 1 +metadata/_edit_lock_ = true + +[node name="Mask" type="ColorRect" parent="."] +visible = false +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(0, 0, 0, 1) diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0001.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0001.tscn index 05a83fb..503b43d 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0001.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0001.tscn @@ -14,6 +14,8 @@ 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_bj7y3"] resource_local_to_scene = true @@ -24,15 +26,16 @@ 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_7i6da"] size = Vector2(22, 8.25) -[node name="Weapon0001" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_ykl0r")] +[node name="Weapon0001" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_ykl0r")] script = ExtResource("2_t56pk") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_bj7y3") +position = Vector2(5, 1) sprite_frames = ExtResource("4_d5c81") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,9 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(15, -2) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-5, -1) - -[node name="Collision" parent="." index="3"] -position = Vector2(0, -0.875) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(5, 1) shape = SubResource("RectangleShape2D_7i6da") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0002.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0002.tscn index 0d01b8d..184f949 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0002.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0002.tscn @@ -14,6 +14,8 @@ 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_llqbm"] resource_local_to_scene = true @@ -24,15 +26,16 @@ 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_aymlx"] -size = Vector2(18, 6) +size = Vector2(18, 7) -[node name="Weapon0002" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_r50xc")] +[node name="Weapon0002" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_r50xc")] script = ExtResource("1_hgtyo") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_llqbm") +position = Vector2(7, -1) sprite_frames = ExtResource("3_4h3je") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,9 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(11.5, -2) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-10, 1) - -[node name="Collision" parent="." index="3"] -position = Vector2(0, 1) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(7, 0) shape = SubResource("RectangleShape2D_aymlx") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0003.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0003.tscn index 8575621..dee91f4 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0003.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0003.tscn @@ -14,6 +14,8 @@ 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_kp0pp"] resource_local_to_scene = true @@ -24,15 +26,16 @@ 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_tlu5a"] size = Vector2(12, 7) -[node name="Weapon0003" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_c17wt")] +[node name="Weapon0003" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_c17wt")] script = ExtResource("1_aeolk") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_kp0pp") +position = Vector2(4, 0) sprite_frames = ExtResource("3_upkjt") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,9 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(8, -2) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-4, 0) - -[node name="Collision" parent="." index="3"] -position = Vector2(-1, 0) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(4, 0) shape = SubResource("RectangleShape2D_tlu5a") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0004.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0004.tscn index cbedbe7..9450803 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0004.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0004.tscn @@ -14,6 +14,8 @@ 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_rtliw"] resource_local_to_scene = true @@ -24,15 +26,16 @@ 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_yks6x"] size = Vector2(26, 2) -[node name="Weapon0004" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_kg172")] +[node name="Weapon0004" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_kg172")] script = ExtResource("2_v1wer") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_rtliw") +position = Vector2(10, 1) sprite_frames = ExtResource("4_uymcs") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,11 +55,9 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(12, -1) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-12, -1) - -[node name="Collision" parent="." index="3"] -position = Vector2(-1, -1) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(9, 0) shape = SubResource("RectangleShape2D_yks6x") [node name="HitArea" type="Area2D" parent="." index="4"] diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0005.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0005.tscn index 1fbae52..aa2b854 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0005.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0005.tscn @@ -14,6 +14,8 @@ 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_irvr4"] resource_local_to_scene = true @@ -24,15 +26,16 @@ 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_opiwr"] size = Vector2(28, 8) -[node name="Weapon0005" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_lyhyf")] +[node name="Weapon0005" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_lyhyf")] script = ExtResource("1_3lu3r") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_irvr4") +position = Vector2(9, 0) sprite_frames = ExtResource("2_m3plc") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,9 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(20, -3.5) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-9, 0) - -[node name="Collision" parent="." index="3"] -position = Vector2(-1, 0) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(8, 0) shape = SubResource("RectangleShape2D_opiwr") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0006.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0006.tscn index 2b9639a..979066a 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0006.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0006.tscn @@ -14,6 +14,8 @@ 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 @@ -24,15 +26,16 @@ 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(12, 8) -[node name="Weapon0006" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_kx4jd")] +[node name="Weapon0006" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_kx4jd")] script = ExtResource("1_5nx8j") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -43,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_fqjj0") +position = Vector2(3, 1) sprite_frames = ExtResource("2_j3sji") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -51,9 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(8, -2.5) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-4, 1) - -[node name="Collision" parent="." index="3"] -position = Vector2(-1, 0) +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(2, 1) shape = SubResource("RectangleShape2D_iq77m") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0007.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0007.tscn index b4a5c1c..ab2e6a3 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0007.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0007.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_277ni"] resource_local_to_scene = true @@ -26,15 +27,15 @@ 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="Weapon0007" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_5xnlm")] +[node name="Weapon0007" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_5xnlm")] script = ExtResource("1_exwbu") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -45,6 +46,7 @@ [node name="AnimatedSprite" parent="." index="1"] material = SubResource("ShaderMaterial_277ni") +position = Vector2(4, 0) sprite_frames = ExtResource("3_ms2gs") [node name="ShellPoint" parent="AnimatedSprite" index="0"] @@ -53,8 +55,7 @@ [node name="FirePoint" parent="AnimatedSprite" index="1"] position = Vector2(13, -3) -[node name="GripPoint" parent="." index="2"] -position = Vector2(-6, 0) - -[node name="Collision" parent="." index="3"] +[node name="Collision" parent="." index="2"] +visible = true +position = Vector2(4, 0) shape = SubResource("RectangleShape2D_4pn1i") diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn index d43a8bc..faf871a 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="1_l63x2"] [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_mhoa7"] [ext_resource type="SpriteFrames" uid="uid://b2wpy40adyjs6" path="res://resource/spriteFrames/weapon/Weapon0008.tres" id="2_s0xbw"] +[ext_resource type="Animation" uid="uid://v3dltmdstqad" path="res://resource/animation/weapon/Weapon_floodlight.res" id="4_p833u"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_cbiyh"] resource_local_to_scene = true @@ -14,8 +15,9 @@ 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_o36tv"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6odx4"] resource_local_to_scene = true shader = ExtResource("1_mhoa7") shader_parameter/blend = Color(1, 1, 1, 1) @@ -25,6 +27,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="RectangleShape2D" id="RectangleShape2D_evjpf"] size = Vector2(12, 6) @@ -41,48 +44,79 @@ "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [0] +"values": [0.0] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath(".:rotation") +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_3piau"] -resource_name = "floodlight" -length = 3.0 -loop_mode = 1 -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, 2.3, 2.6, 2.7, 3), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 0, -"values": [0, 0, 0.5, 0.5, 0] -} - [sub_resource type="Animation" id="Animation_8xqs8"] resource_name = "reloading" length = 1.3 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:animation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { +"times": PackedFloat32Array(0, 1.3), +"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.3), +"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.1, 1.3), "transitions": PackedFloat32Array(1, 1, 1, 1), "update": 0, @@ -92,16 +126,15 @@ [sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] _data = { "RESET": SubResource("Animation_x136i"), -"floodlight": SubResource("Animation_3piau"), +"floodlight": ExtResource("4_p833u"), "reloading": SubResource("Animation_8xqs8") } -[node name="Weapon0008" type="CharacterBody2D" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Weapon0008" type="CharacterBody2D" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 4 script = ExtResource("1_l63x2") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -113,9 +146,9 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] modulate = Color(1.9, 1.9, 1.9, 1) -material = SubResource("ShaderMaterial_o36tv") +material = SubResource("ShaderMaterial_6odx4") sprite_frames = ExtResource("2_s0xbw") -animation = &"reloading" +offset = Vector2(4, 0) [node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(-2, -3) @@ -123,11 +156,8 @@ [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(7, -1.5) -[node name="GripPoint" type="Marker2D" parent="."] -position = Vector2(-5, 0) - [node name="Collision" type="CollisionShape2D" parent="."] -position = Vector2(1, 0) +position = Vector2(3, 0) shape = SubResource("RectangleShape2D_evjpf") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn index e8a8c26..b636c80 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn @@ -3,6 +3,7 @@ [ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_6fbtx"] [ext_resource type="Script" path="res://src/game/activity/weapon/gun/Gun.cs" id="1_eprgt"] [ext_resource type="SpriteFrames" uid="uid://c0xwj3kpk02ua" path="res://resource/spriteFrames/weapon/Weapon0009.tres" id="2_4kxpd"] +[ext_resource type="Animation" uid="uid://v3dltmdstqad" path="res://resource/animation/weapon/Weapon_floodlight.res" id="4_o2wqt"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_cbiyh"] resource_local_to_scene = true @@ -14,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_o36tv"] resource_local_to_scene = true @@ -25,6 +27,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="RectangleShape2D" id="RectangleShape2D_jbuu3"] size = Vector2(18, 6) @@ -34,67 +37,50 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") +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": 0, -"values": [0] +"update": 1, +"values": [&"default"] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath(".:rotation") +tracks/1/path = NodePath("AnimatedSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 0, -"values": [0.0] +"update": 1, +"values": [0] } tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("AnimatedSprite:animation") +tracks/2/path = NodePath("AnimatedSprite:material:shader_parameter/schedule") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, -"values": [&"reloading_frame"] +"update": 0, +"values": [0.0] } tracks/3/type = "value" tracks/3/imported = false tracks/3/enabled = true -tracks/3/path = NodePath("AnimatedSprite:frame") +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": 1, -"values": [0] -} - -[sub_resource type="Animation" id="Animation_3piau"] -resource_name = "floodlight" -length = 3.0 -loop_mode = 1 -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, 2.3, 2.6, 2.7, 3), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), "update": 0, -"values": [0, 0, 0.5, 0.5, 0] +"values": [0.0] } [sub_resource type="Animation" id="Animation_juv2q"] @@ -104,53 +90,52 @@ tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:rotation") +tracks/0/path = NodePath("AnimatedSprite:animation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0] +"times": PackedFloat32Array(0, 1.5), +"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:animation") +tracks/1/path = NodePath("AnimatedSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [&"reloading_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, 0.22, 0.24, 1.22, 1.24), "transitions": PackedFloat32Array(1, 1, 1, 1, 1), "update": 1, "values": [0, 1, 2, 3, 4] } +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.02, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] _data = { "RESET": SubResource("Animation_x136i"), -"floodlight": SubResource("Animation_3piau"), +"floodlight": ExtResource("4_o2wqt"), "reloading": SubResource("Animation_juv2q") } -[node name="Weapon0009" type="CharacterBody2D" node_paths=PackedStringArray("FirePoint", "ShellPoint", "GripPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] +[node name="Weapon0009" type="CharacterBody2D" node_paths=PackedStringArray("FirePoint", "ShellPoint", "AnimationPlayer", "ShadowSprite", "AnimatedSprite", "Collision")] collision_layer = 4 script = ExtResource("1_eprgt") FirePoint = NodePath("AnimatedSprite/FirePoint") ShellPoint = NodePath("AnimatedSprite/ShellPoint") -GripPoint = NodePath("GripPoint") AnimationPlayer = NodePath("AnimationPlayer") ShadowSprite = NodePath("ShadowSprite") AnimatedSprite = NodePath("AnimatedSprite") @@ -163,7 +148,7 @@ [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] material = SubResource("ShaderMaterial_o36tv") sprite_frames = ExtResource("2_4kxpd") -animation = &"reloading_frame" +offset = Vector2(6, -1) [node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(-2, -2) @@ -171,12 +156,8 @@ [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(13, -0.5) -[node name="GripPoint" type="Marker2D" parent="."] -position = Vector2(-6, 1) - [node name="Collision" type="CollisionShape2D" parent="."] -visible = false -position = Vector2(0, 1) +position = Vector2(6, 0) shape = SubResource("RectangleShape2D_jbuu3") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/DungeonShooting_Godot/prefab/weapon/WeaponTemplate.tscn b/DungeonShooting_Godot/prefab/weapon/WeaponTemplate.tscn index 7b22ce1..b16a59c 100644 --- a/DungeonShooting_Godot/prefab/weapon/WeaponTemplate.tscn +++ b/DungeonShooting_Godot/prefab/weapon/WeaponTemplate.tscn @@ -1,28 +1,6 @@ -[gd_scene load_steps=7 format=3 uid="uid://cxltmhhp4rbyk"] +[gd_scene load_steps=4 format=3 uid="uid://cxltmhhp4rbyk"] -[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="1_3p8rg"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_cbiyh"] -resource_local_to_scene = true -shader = ExtResource("1_3p8rg") -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 - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_o36tv"] -resource_local_to_scene = true -shader = ExtResource("1_3p8rg") -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 +[ext_resource type="Animation" uid="uid://v3dltmdstqad" path="res://resource/animation/weapon/Weapon_floodlight.res" id="1_eorlf"] [sub_resource type="Animation" id="Animation_x136i"] length = 0.001 @@ -36,30 +14,13 @@ "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [0] -} - -[sub_resource type="Animation" id="Animation_3piau"] -resource_name = "floodlight" -length = 3.0 -loop_mode = 1 -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, 2.3, 2.6, 2.7, 3), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 0, -"values": [0, 0, 0.5, 0.5, 0] +"values": [0.0] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"] _data = { "RESET": SubResource("Animation_x136i"), -"floodlight": SubResource("Animation_3piau") +"floodlight": ExtResource("1_eorlf") } [node name="WeaponTemplate" type="CharacterBody2D"] @@ -67,10 +28,8 @@ [node name="ShadowSprite" type="Sprite2D" parent="."] z_index = -1 -material = SubResource("ShaderMaterial_cbiyh") [node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_o36tv") [node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(0, -2) @@ -78,8 +37,6 @@ [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] position = Vector2(10, -2) -[node name="GripPoint" type="Marker2D" parent="."] - [node name="Collision" type="CollisionShape2D" parent="."] visible = false diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index 83159ea..3a53575 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -24,7 +24,7 @@ window/size/viewport_width=1920 window/size/viewport_height=1080 window/stretch/aspect="keep_width" -window/vsync/use_vsync=false +window/vsync/vsync_mode=0 [dotnet] @@ -182,6 +182,21 @@ "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) ] } +exchangeProp={ +"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":90,"key_label":0,"unicode":122,"echo":false,"script":null) +] +} +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) +] +} +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) +] +} [layer_names] diff --git a/DungeonShooting_Godot/resource/animation/enemy/Enemy_astonished.res b/DungeonShooting_Godot/resource/animation/enemy/Enemy_astonished.res new file mode 100644 index 0000000..715ff3c --- /dev/null +++ b/DungeonShooting_Godot/resource/animation/enemy/Enemy_astonished.res Binary files differ diff --git a/DungeonShooting_Godot/resource/animation/enemy/Enemy_notify.res b/DungeonShooting_Godot/resource/animation/enemy/Enemy_notify.res new file mode 100644 index 0000000..d1cc298 --- /dev/null +++ b/DungeonShooting_Godot/resource/animation/enemy/Enemy_notify.res Binary files differ diff --git a/DungeonShooting_Godot/resource/animation/enemy/Enemy_query.res b/DungeonShooting_Godot/resource/animation/enemy/Enemy_query.res new file mode 100644 index 0000000..81299b9 --- /dev/null +++ b/DungeonShooting_Godot/resource/animation/enemy/Enemy_query.res Binary files differ diff --git a/DungeonShooting_Godot/resource/animation/enemy/Enemy_reset.res b/DungeonShooting_Godot/resource/animation/enemy/Enemy_reset.res new file mode 100644 index 0000000..22d72ae --- /dev/null +++ b/DungeonShooting_Godot/resource/animation/enemy/Enemy_reset.res Binary files differ diff --git a/DungeonShooting_Godot/resource/animation/weapon/Weapon_floodlight.res b/DungeonShooting_Godot/resource/animation/weapon/Weapon_floodlight.res new file mode 100644 index 0000000..494a4f8 --- /dev/null +++ b/DungeonShooting_Godot/resource/animation/weapon/Weapon_floodlight.res Binary files differ diff --git a/DungeonShooting_Godot/resource/config/ActivityBase.json b/DungeonShooting_Godot/resource/config/ActivityBase.json index 99ef530..cff476b 100644 --- a/DungeonShooting_Godot/resource/config/ActivityBase.json +++ b/DungeonShooting_Godot/resource/config/ActivityBase.json @@ -24,6 +24,18 @@ "ShowInMapEditor": true }, { + "Id": "enemy0002", + "Type": 4, + "Name": "\u654C\u4EBA2", + "Intro": "\u654C\u4EBA2", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/role/Enemy0002.tscn", + "Icon": "res://resource/sprite/role/enemy0002/Enemy0002.png", + "ShowInMapEditor": true + }, + { "Id": "weapon0001", "Type": 5, "Name": "\u6B65\u67AA", @@ -68,7 +80,7 @@ "IsStatic": false, "__Material": "", "Prefab": "res://prefab/weapon/Weapon0004.tscn", - "Icon": "res://resource/sprite/weapon/knife1.png", + "Icon": "res://resource/sprite/weapon/weapon0004/Weapon0004.png", "ShowInMapEditor": true }, { @@ -138,7 +150,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0001.tscn", "Icon": "", "ShowInMapEditor": false @@ -150,7 +162,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0002.tscn", "Icon": "", "ShowInMapEditor": false @@ -162,7 +174,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0003.tscn", "Icon": "", "ShowInMapEditor": false @@ -174,19 +186,31 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "0002", + "__Material": "0005", "Prefab": "res://prefab/bullet/normal/Bullet0004.tscn", "Icon": "", "ShowInMapEditor": false }, { + "Id": "bullet0005", + "Type": 6, + "Name": "\u629B\u7269\u7EBF\u7C98\u6DB2\u5B50\u5F39", + "Intro": "", + "Details": "", + "IsStatic": false, + "__Material": "0004", + "Prefab": "res://prefab/bullet/normal/Bullet0005.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { "Id": "shell0001", "Type": 7, "Name": "", "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0006", "Prefab": "res://prefab/shell/Shell0001.tscn", "Icon": "", "ShowInMapEditor": false @@ -198,7 +222,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0006", "Prefab": "res://prefab/shell/Shell0002.tscn", "Icon": "", "ShowInMapEditor": false @@ -210,7 +234,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0006", "Prefab": "res://prefab/shell/Shell0003.tscn", "Icon": "", "ShowInMapEditor": false @@ -222,20 +246,32 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0006", "Prefab": "res://prefab/shell/Shell0004.tscn", "Icon": "", "ShowInMapEditor": false }, { - "Id": "effect0001", + "Id": "enemy_dead0001", "Type": 8, "Name": "", - "Intro": "\u654C\u4EBA\u6B7B\u4EA1\u788E\u7247", + "Intro": "\u654C\u4EBA1\u6B7B\u4EA1\u788E\u7247", "Details": "", "IsStatic": false, "__Material": "", - "Prefab": "res://prefab/effect/enemy/Effect0001.tscn", + "Prefab": "res://prefab/effect/enemy/EnemyDead0001.tscn", + "Icon": "", + "ShowInMapEditor": false + }, + { + "Id": "enemy_dead0002", + "Type": 8, + "Name": "", + "Intro": "\u654C\u4EBA2\u6B7B\u4EA1", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/effect/enemy/EnemyDead0002.tscn", "Icon": "", "ShowInMapEditor": false }, @@ -351,7 +387,7 @@ "Id": "prop0010", "Type": 9, "Name": "\u5206\u88C2\u5B50\u5F39", - "Intro": "\u5B50\u5F39\u6570\u91CF\u7FFB\u500D, \u4F46\u662F\u7CBE\u51C6\u5EA6\u548C\u4F24\u5BB3\u964D\u4F4E", + "Intro": "\u5B50\u5F39\u6570\u91CF\u7FFB\u500D, \u4F46\u662F\u7CBE\u51C6\u5EA6, \u51FB\u9000\u548C\u4F24\u5BB3\u964D\u4F4E", "Details": "", "IsStatic": false, "__Material": "", @@ -360,6 +396,54 @@ "ShowInMapEditor": true }, { + "Id": "prop0011", + "Type": 9, + "Name": "\u5F39\u5C04\u5B50\u5F39", + "Intro": "\u5B50\u5F39\u53CD\u5F39\u6B21\u6570\u002B2", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/prop/buff/BuffProp0011.tscn", + "Icon": "res://resource/sprite/prop/buff/BuffProp0011.png", + "ShowInMapEditor": true + }, + { + "Id": "prop0012", + "Type": 9, + "Name": "\u7A7F\u900F\u5B50\u5F39", + "Intro": "\u5B50\u5F39\u7A7F\u900F\u002B1", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/prop/buff/BuffProp0012.tscn", + "Icon": "res://resource/sprite/prop/buff/BuffProp0012.png", + "ShowInMapEditor": true + }, + { + "Id": "prop0013", + "Type": 9, + "Name": "\u6B66\u5668\u80CC\u5305", + "Intro": "\u6B66\u5668\u5BB9\u91CF\u002B1", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/prop/buff/BuffProp0013.tscn", + "Icon": "res://resource/sprite/prop/buff/BuffProp0013.png", + "ShowInMapEditor": true + }, + { + "Id": "prop0014", + "Type": 9, + "Name": "\u9053\u5177\u80CC\u5305", + "Intro": "\u9053\u5177\u5BB9\u91CF\u002B1", + "Details": "", + "IsStatic": false, + "__Material": "", + "Prefab": "res://prefab/prop/buff/BuffProp0014.tscn", + "Icon": "res://resource/sprite/prop/buff/BuffProp0014.png", + "ShowInMapEditor": true + }, + { "Id": "prop5000", "Type": 9, "Name": "\u533B\u836F\u7BB1", diff --git a/DungeonShooting_Godot/resource/config/ActivityMaterial.json b/DungeonShooting_Godot/resource/config/ActivityMaterial.json index a6cffda..2d40acf 100644 --- a/DungeonShooting_Godot/resource/config/ActivityMaterial.json +++ b/DungeonShooting_Godot/resource/config/ActivityMaterial.json @@ -3,22 +3,84 @@ "Id": "0001", "Remark": "\u9ED8\u8BA4\u6750\u8D28\u5C5E\u6027", "Friction": 140, + "GravityScale": 1, + "RotationType": 0, "RotationFriction": 140, "Bounce": true, "BounceStrength": 0.5, "FallBounceStrength": 0.5, "FallBounceSpeed": 0.75, - "FallBounceRotation": 0.5 + "FallBounceRotation": 0.5, + "DynamicCollision": false }, { "Id": "0002", "Remark": "\u7403\u4F53\u6750\u8D28\uFF0C\u6469\u64E6\u529B\u8F83\u4F4E", "Friction": 40, + "GravityScale": 1, + "RotationType": 1, "RotationFriction": 40, "Bounce": true, "BounceStrength": 0.7, "FallBounceStrength": 0.7, "FallBounceSpeed": 0.85, - "FallBounceRotation": 0.85 + "FallBounceRotation": 0.85, + "DynamicCollision": true + }, + { + "Id": "0003", + "Remark": "\u666E\u901A\u5B50\u5F39,\u53CD\u5F39\u6D88\u8017\u4F4E,\u65E0\u91CD\u529B\u4E0B\u5760", + "Friction": 140, + "GravityScale": 0, + "RotationType": 1, + "RotationFriction": 140, + "Bounce": true, + "BounceStrength": 1, + "FallBounceStrength": 0.5, + "FallBounceSpeed": 0.75, + "FallBounceRotation": 0.5, + "DynamicCollision": true + }, + { + "Id": "0004", + "Remark": "\u6B63\u5E38\u91CD\u529B\u5B50\u5F39", + "Friction": 140, + "GravityScale": 1, + "RotationType": 2, + "RotationFriction": 140, + "Bounce": true, + "BounceStrength": 1, + "FallBounceStrength": 0.5, + "FallBounceSpeed": 0.75, + "FallBounceRotation": 0.5, + "DynamicCollision": true + }, + { + "Id": "0005", + "Remark": "\u7403\u4F53\u5B50\u5F39\uFF0C\u6469\u64E6\u529B\u8F83\u4F4E", + "Friction": 40, + "GravityScale": 1, + "RotationType": 1, + "RotationFriction": 40, + "Bounce": true, + "BounceStrength": 0.7, + "FallBounceStrength": 0.7, + "FallBounceSpeed": 0.85, + "FallBounceRotation": 0.85, + "DynamicCollision": false + }, + { + "Id": "0006", + "Remark": "\u5F39\u58F3, \u6469\u64E6\u529B\u6BD4\u9ED8\u8BA4\u6750\u8D28\u4F4E", + "Friction": 100, + "GravityScale": 1, + "RotationType": 0, + "RotationFriction": 100, + "Bounce": true, + "BounceStrength": 0.5, + "FallBounceStrength": 0.5, + "FallBounceSpeed": 0.75, + "FallBounceRotation": 0.5, + "DynamicCollision": false } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/AiAttackAttr.json b/DungeonShooting_Godot/resource/config/AiAttackAttr.json index 3d27a46..251daae 100644 --- a/DungeonShooting_Godot/resource/config/AiAttackAttr.json +++ b/DungeonShooting_Godot/resource/config/AiAttackAttr.json @@ -2,6 +2,7 @@ { "Id": "0001", "Remark": "", + "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 1, @@ -13,6 +14,7 @@ { "Id": "0002", "Remark": "", + "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 2, @@ -24,6 +26,7 @@ { "Id": "0003", "Remark": "", + "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 1, @@ -35,6 +38,7 @@ { "Id": "0004", "Remark": "\u79FB\u52A8\u5C04\u51FB", + "LockingStand": false, "FiringStand": false, "ShowSubline": false, "LockingTime": 0.7, @@ -46,6 +50,7 @@ { "Id": "0005", "Remark": "\u4F7F\u7528\u8FDC\u8DDD\u79BB\u6B66\u5668", + "LockingStand": true, "FiringStand": true, "ShowSubline": true, "LockingTime": 1.5, @@ -57,6 +62,7 @@ { "Id": "0006", "Remark": "", + "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 0.5, @@ -68,6 +74,7 @@ { "Id": "0007", "Remark": "\u6FC0\u5149\u6B66\u5668", + "LockingStand": true, "FiringStand": true, "ShowSubline": true, "LockingTime": 1.5, @@ -79,6 +86,7 @@ { "Id": "0008", "Remark": "\u69B4\u5F39\u70AE", + "LockingStand": true, "FiringStand": true, "ShowSubline": false, "LockingTime": 1.5, diff --git a/DungeonShooting_Godot/resource/config/BulletBase.json b/DungeonShooting_Godot/resource/config/BulletBase.json index babab79..5985b17 100644 --- a/DungeonShooting_Godot/resource/config/BulletBase.json +++ b/DungeonShooting_Godot/resource/config/BulletBase.json @@ -7,7 +7,7 @@ "HarmRange": [ 4 ], - "RepelRnage": [ + "RepelRange": [ 20 ], "DeviationAngleRange": [ @@ -24,14 +24,15 @@ 300, 400 ], - "UseGravity": false, "VerticalSpeed": [ 0 ], "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0002", @@ -41,8 +42,8 @@ "HarmRange": [ 4 ], - "RepelRnage": [ - 30 + "RepelRange": [ + 15 ], "DeviationAngleRange": [ -10, @@ -59,14 +60,15 @@ 200, 250 ], - "UseGravity": false, "VerticalSpeed": [ 0 ], "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0003", @@ -76,8 +78,8 @@ "HarmRange": [ 3 ], - "RepelRnage": [ - 10 + "RepelRange": [ + 15 ], "DeviationAngleRange": [ 0 @@ -93,14 +95,15 @@ 300, 400 ], - "UseGravity": false, "VerticalSpeed": [ 0 ], "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0004", @@ -110,8 +113,8 @@ "HarmRange": [ 20 ], - "RepelRnage": [ - 200 + "RepelRange": [ + 75 ], "DeviationAngleRange": [ 0 @@ -127,14 +130,15 @@ 600, 600 ], - "UseGravity": false, "VerticalSpeed": [ 0 ], "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0005", @@ -144,8 +148,8 @@ "HarmRange": [ 30 ], - "RepelRnage": [ - 0 + "RepelRange": [ + 85 ], "DeviationAngleRange": [ 0 @@ -161,14 +165,50 @@ 270, 360 ], - "UseGravity": true, "VerticalSpeed": [ 70 ], "BounceCount": [ - 999 + 4 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] + }, + { + "Id": "0006", + "Name": "\u629B\u7269\u7EBF\u7C98\u6DB2\u5B50\u5F39", + "Type": 1, + "Prefab": "bullet0005", + "HarmRange": [ + 5 + ], + "RepelRange": [ + 30 + ], + "DeviationAngleRange": [ + 0 + ], + "SpeedRange": [ + 100, + 100 + ], + "LifeTimeRange": [ + -1 + ], + "DistanceRange": [ + 270, + 360 + ], + "VerticalSpeed": [ + 170 + ], + "BounceCount": [ + 0 + ], + "Penetration": [ + 0 + ] }, { "Id": "1001", @@ -178,8 +218,8 @@ "HarmRange": [ 5 ], - "RepelRnage": [ - 0 + "RepelRange": [ + 35 ], "DeviationAngleRange": [ 0 @@ -195,12 +235,11 @@ 600, 600 ], - "UseGravity": false, "VerticalSpeed": null, "BounceCount": [ 0 ], - "StrikeDestroy": false + "Penetration": null }, { "Id": "2001", @@ -210,8 +249,8 @@ "HarmRange": [ 25 ], - "RepelRnage": [ - 150 + "RepelRange": [ + 70 ], "DeviationAngleRange": [ 0 @@ -225,9 +264,8 @@ "DistanceRange": [ 35 ], - "UseGravity": false, "VerticalSpeed": null, "BounceCount": null, - "StrikeDestroy": false + "Penetration": null } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/EnemyBase.json b/DungeonShooting_Godot/resource/config/EnemyBase.json new file mode 100644 index 0000000..968950a --- /dev/null +++ b/DungeonShooting_Godot/resource/config/EnemyBase.json @@ -0,0 +1,26 @@ +[ + { + "Id": "0001", + "__Activity": "enemy0001", + "Remark": "\u654C\u4EBA1", + "MoveSpeed": 120, + "Acceleration": 1500, + "Friction": 900, + "CanPickUpWeapon": true, + "ViewRange": 250, + "TailAfterViewRange": 400, + "BackViewRange": 50 + }, + { + "Id": "0002", + "__Activity": "enemy0002", + "Remark": "\u654C\u4EBA2", + "MoveSpeed": 120, + "Acceleration": 1500, + "Friction": 900, + "CanPickUpWeapon": false, + "ViewRange": 250, + "TailAfterViewRange": 400, + "BackViewRange": 50 + } +] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/LiquidMaterial.json b/DungeonShooting_Godot/resource/config/LiquidMaterial.json new file mode 100644 index 0000000..8fd1e39 --- /dev/null +++ b/DungeonShooting_Godot/resource/config/LiquidMaterial.json @@ -0,0 +1,34 @@ +[ + { + "Id": "0001", + "Remark": "\u6BD2\u6DB2", + "BrushTexture": "res://resource/sprite/brush/Brush2.png", + "Ffm": 0.5, + "Duration": 5, + "WriteOffSpeed": 0.2 + }, + { + "Id": "0002", + "Remark": "\u654C\u4EBA0002\u7684\u7C98\u6DB2", + "BrushTexture": "res://resource/sprite/brush/Brush3.png", + "Ffm": 0.7, + "Duration": 4, + "WriteOffSpeed": 0.2 + }, + { + "Id": "0003", + "Remark": "\u8840\u6DB2(\u6700\u5C0F\u7B14\u5237)", + "BrushTexture": "res://resource/sprite/brush/Brush4.png", + "Ffm": 0.5, + "Duration": 12, + "WriteOffSpeed": 0.2 + }, + { + "Id": "0004", + "Remark": "\u7C98\u6DB2(\u6700\u5C0F\u7B14\u5237)", + "BrushTexture": "res://resource/sprite/brush/Brush5.png", + "Ffm": 0.5, + "Duration": 5, + "WriteOffSpeed": 0.2 + } +] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/WeaponBase.json b/DungeonShooting_Godot/resource/config/WeaponBase.json index 4e75043..3cbe120 100644 --- a/DungeonShooting_Godot/resource/config/WeaponBase.json +++ b/DungeonShooting_Godot/resource/config/WeaponBase.json @@ -1,10 +1,11 @@ [ { "Id": "0001", - "__Activity": "weapon0001", "Remark": "\u6B65\u67AA", + "__Activity": "weapon0001", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": true, "AmmoCapacity": 30, "MaxAmmoCapacity": 420, @@ -28,6 +29,7 @@ "FinalFiringSpeed": 480, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -59,7 +61,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0005", @@ -77,10 +79,11 @@ }, { "Id": "0002", - "__Activity": "", "Remark": "\u6B65\u67AA", + "__Activity": "", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 30, "MaxAmmoCapacity": 420, @@ -104,6 +107,7 @@ "FinalFiringSpeed": 480, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -135,7 +139,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0005", @@ -153,10 +157,11 @@ }, { "Id": "0003", - "__Activity": "weapon0002", "Remark": "\u9730\u5F39\u67AA", + "__Activity": "weapon0002", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 7, "MaxAmmoCapacity": 140, @@ -180,6 +185,7 @@ "FinalFiringSpeed": 120, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 5 ], @@ -211,7 +217,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0003", @@ -229,10 +235,11 @@ }, { "Id": "0004", - "__Activity": "", "Remark": "\u9730\u5F39\u67AA", + "__Activity": "", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 7, "MaxAmmoCapacity": 140, @@ -256,6 +263,7 @@ "FinalFiringSpeed": 120, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 5 ], @@ -287,7 +295,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0003", @@ -305,10 +313,11 @@ }, { "Id": "0005", - "__Activity": "weapon0003", "Remark": "\u624B\u67AA", + "__Activity": "weapon0003", "Weight": 20, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 12, "MaxAmmoCapacity": 180, @@ -332,6 +341,7 @@ "FinalFiringSpeed": 460, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -363,7 +373,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0004", @@ -381,10 +391,11 @@ }, { "Id": "0006", - "__Activity": "", "Remark": "\u624B\u67AA", + "__Activity": "", "Weight": 20, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 12, "MaxAmmoCapacity": 180, @@ -408,6 +419,7 @@ "FinalFiringSpeed": 300, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -439,7 +451,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0004", @@ -457,10 +469,11 @@ }, { "Id": "0007", - "__Activity": "weapon0004", "Remark": "\u5200", + "__Activity": "weapon0004", "Weight": 40, "WeightType": 2, + "IsMelee": true, "ContinuousShoot": false, "AmmoCapacity": 180, "MaxAmmoCapacity": 180, @@ -484,6 +497,7 @@ "FinalFiringSpeed": 180, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -514,7 +528,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "", @@ -532,10 +546,11 @@ }, { "Id": "0008", - "__Activity": "", "Remark": "\u5200", + "__Activity": "", "Weight": 40, "WeightType": 2, + "IsMelee": true, "ContinuousShoot": false, "AmmoCapacity": 180, "MaxAmmoCapacity": 180, @@ -559,6 +574,7 @@ "FinalFiringSpeed": 180, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -589,7 +605,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "", @@ -607,10 +623,11 @@ }, { "Id": "0009", - "__Activity": "weapon0005", "Remark": "\u72D9\u51FB\u67AA", + "__Activity": "weapon0005", "Weight": 50, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 10, "MaxAmmoCapacity": 80, @@ -634,6 +651,7 @@ "FinalFiringSpeed": 150, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -665,7 +683,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0008", @@ -683,10 +701,11 @@ }, { "Id": "0010", - "__Activity": "", "Remark": "\u72D9\u51FB\u67AA", + "__Activity": "", "Weight": 50, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 10, "MaxAmmoCapacity": 80, @@ -710,6 +729,7 @@ "FinalFiringSpeed": 150, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -741,7 +761,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0008", @@ -759,10 +779,11 @@ }, { "Id": "0011", - "__Activity": "weapon0006", "Remark": "\u51B2\u950B\u67AA", + "__Activity": "weapon0006", "Weight": 30, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": true, "AmmoCapacity": 20, "MaxAmmoCapacity": 600, @@ -786,6 +807,7 @@ "FinalFiringSpeed": 700, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -817,7 +839,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0002", @@ -835,10 +857,11 @@ }, { "Id": "0012", - "__Activity": "", "Remark": "\u51B2\u950B\u67AA", + "__Activity": "", "Weight": 30, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 20, "MaxAmmoCapacity": 600, @@ -862,6 +885,7 @@ "FinalFiringSpeed": 700, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -893,7 +917,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0002", @@ -911,10 +935,11 @@ }, { "Id": "0013", - "__Activity": "weapon0007", "Remark": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA", + "__Activity": "weapon0007", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": true, "AmmoCapacity": 60, "MaxAmmoCapacity": 600, @@ -938,6 +963,7 @@ "FinalFiringSpeed": 700, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0.5, "FireBulletCountRange": [ 1 ], @@ -969,7 +995,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0007", @@ -987,10 +1013,11 @@ }, { "Id": "0014", - "__Activity": "", "Remark": "\u6C64\u59C6\u900A\u51B2\u950B\u67AA", + "__Activity": "", "Weight": 40, "WeightType": 2, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 60, "MaxAmmoCapacity": 600, @@ -1014,6 +1041,7 @@ "FinalFiringSpeed": 200, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -1045,7 +1073,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0007", @@ -1063,10 +1091,11 @@ }, { "Id": "0015", - "__Activity": "weapon0008", "Remark": "\u6FC0\u5149\u624B\u67AA", + "__Activity": "weapon0008", "Weight": 40, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 10, "MaxAmmoCapacity": 240, @@ -1090,14 +1119,15 @@ "FinalFiringSpeed": 300, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], "DelayedTime": 0, "StartScatteringRange": 0, - "FinalScatteringRange": 20, - "ScatteringRangeAddValue": 4, - "ScatteringRangeBackSpeed": 40, + "FinalScatteringRange": 8, + "ScatteringRangeAddValue": 3, + "ScatteringRangeBackSpeed": 20, "ScatteringRangeBackDelayTime": 0.5, "CameraShake": 2, "BacklashRange": [ @@ -1121,7 +1151,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0010", @@ -1139,10 +1169,11 @@ }, { "Id": "0016", - "__Activity": "", "Remark": "\u6FC0\u5149\u624B\u67AA", + "__Activity": "", "Weight": 40, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 10, "MaxAmmoCapacity": 240, @@ -1166,14 +1197,15 @@ "FinalFiringSpeed": 300, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], "DelayedTime": 0, "StartScatteringRange": 0, - "FinalScatteringRange": 20, - "ScatteringRangeAddValue": 4, - "ScatteringRangeBackSpeed": 40, + "FinalScatteringRange": 8, + "ScatteringRangeAddValue": 3, + "ScatteringRangeBackSpeed": 20, "ScatteringRangeBackDelayTime": 0.5, "CameraShake": 2, "BacklashRange": [ @@ -1197,7 +1229,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0010", @@ -1215,10 +1247,11 @@ }, { "Id": "0017", - "__Activity": "weapon0009", "Remark": "\u69B4\u5F39\u53D1\u5C04\u5668", + "__Activity": "weapon0009", "Weight": 40, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 1, "MaxAmmoCapacity": 50, @@ -1242,6 +1275,7 @@ "FinalFiringSpeed": 60, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -1273,7 +1307,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0011", @@ -1291,10 +1325,11 @@ }, { "Id": "0018", - "__Activity": "", "Remark": "\u69B4\u5F39\u53D1\u5C04\u5668", + "__Activity": "", "Weight": 40, "WeightType": 1, + "IsMelee": false, "ContinuousShoot": false, "AmmoCapacity": 1, "MaxAmmoCapacity": 50, @@ -1318,6 +1353,7 @@ "FinalFiringSpeed": 60, "FiringSpeedAddSpeed": 0, "FiringSpeedBackSpeed": 0, + "FiringSpeedBackTime": 0, "FireBulletCountRange": [ 1 ], @@ -1349,7 +1385,7 @@ "MeleeAttackHarmRange": [ 10 ], - "MeleeAttackRepelRnage": [ + "MeleeAttackRepelRange": [ 100 ], "__ShootSound": "shooting0011", diff --git a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json index d515189..aafbd9d 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json @@ -31,6 +31,14 @@ { "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" } ], "OutletList": [ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json index 80edbe9..d380491 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preinstall.json @@ -1 +1 @@ -[{"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":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":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}]}]]}] \ No newline at end of file +[{"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 index 7f5ea4d..41a778f 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle2/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json index bf4f6af..ddd7807 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Battle5/Preinstall.json @@ -1 +1 @@ -[{"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":"1"},"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":"1"},"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":"1"},"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 +[{"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/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json index 7a7ca41..c401b01 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":24,"Y":-14},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":6,"Y":34},"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":-42,"Y":9},"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":-47,"Y":32},"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":57,"Y":56},"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":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":60,"Y":-19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":34,"Y":23},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-11,"Y":8},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-20,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":24,"Y":-14},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":6,"Y":34},"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":-42,"Y":9},"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":-47,"Y":32},"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":-80,"Y":14},"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":-75,"Y":47},"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":46,"Y":1},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0011","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":49},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0012","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-90,"Y":-23},"Size":{"X":3,"Y":6},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0013","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-91,"Y":-6},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0014","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":57,"Y":56},"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":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":60,"Y":-19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":34,"Y":23},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-11,"Y":8},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-20,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","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 index e502322..e7bb706 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json index 2af15f7..b2a4f57 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":0,"Y":0},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":0,"Y":26},"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 +[{"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 index 6d2fd01..055d7fa 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json index 27eaead..0370957 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/RoomInfo.json @@ -1 +1 @@ -{"Position":{"X":-5,"Y":-5},"Size":{"X":10,"Y":12},"DoorAreaInfos":[{"Direction":3,"Start":0,"End":128},{"Direction":0,"Start":0,"End":160},{"Direction":1,"Start":0,"End":160}],"GroupName":"TestGroup1","RoomType":1,"RoomName":"Start2","Weight":100,"Remark":""} \ No newline at end of file +{"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 index 60689b8..b37b37a 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/TileInfo.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start2/TileInfo.json @@ -1 +1 @@ -{"NavigationList":[{"Type":0,"Points":[-56,-56,56,-56,56,96,40,96,40,48,-40,48,-40,96,-56,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],"Middle":[-4,-5,0,2,7,-3,-5,0,2,7,-2,-5,0,2,7,-1,-5,0,2,7,0,-5,0,2,7,1,-5,0,2,7,2,-5,0,2,7,3,-5,0,2,7],"Top":[-5,-5,0,3,4,-5,-4,0,3,3,-5,-3,0,3,3,-5,-2,0,3,3,-5,-1,0,3,3,-5,0,0,3,3,-5,1,0,3,3,-5,2,0,3,3,-5,3,0,3,3,-5,4,0,3,3,-5,5,0,3,3,-5,6,0,11,2,-4,6,0,2,2,-3,6,0,2,2,-2,3,0,1,2,-2,4,0,1,3,-2,5,0,1,3,-2,6,0,13,2,-1,3,0,2,2,0,3,0,2,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,-5,0,1,4,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 +{"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 new file mode 100644 index 0000000..e064a98 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json @@ -0,0 +1 @@ +[{"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":30,"Y":75},"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 new file mode 100644 index 0000000..6273480 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png 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 new file mode 100644 index 0000000..59dce7f --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preview.png.import @@ -0,0 +1,34 @@ +[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 new file mode 100644 index 0000000..a5d10e3 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/RoomInfo.json @@ -0,0 +1 @@ +{"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 new file mode 100644 index 0000000..a354c37 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/TileInfo.json @@ -0,0 +1 @@ +{"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 new file mode 100644 index 0000000..a239003 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preinstall.json @@ -0,0 +1 @@ +[{"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 new file mode 100644 index 0000000..9d9c52d --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png 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 new file mode 100644 index 0000000..95f9d45 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/Preview.png.import @@ -0,0 +1,34 @@ +[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 new file mode 100644 index 0000000..0d902b3 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/RoomInfo.json @@ -0,0 +1 @@ +{"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 new file mode 100644 index 0000000..77531b5 --- /dev/null +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start4/TileInfo.json @@ -0,0 +1 @@ +{"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/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 index 26c54b7..00d2144 100644 --- 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 Binary files differ diff --git a/DungeonShooting_Godot/resource/material/Blend.gdshader b/DungeonShooting_Godot/resource/material/Blend.gdshader index f952fc5..2fd8b76 100644 --- a/DungeonShooting_Godot/resource/material/Blend.gdshader +++ b/DungeonShooting_Godot/resource/material/Blend.gdshader @@ -3,7 +3,7 @@ //混合颜色 uniform vec4 blend : source_color = vec4(1.0, 1.0, 1.0, 1.0); //混合度 -uniform float schedule : hint_range(0.0, 1.0) = 0.0; +uniform float schedule : hint_range(0.0, 1.0, 0.01) = 0.0; // uniform vec4 modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0); @@ -15,6 +15,8 @@ uniform bool outline_rainbow = false; //轮廓是否使用 blend uniform bool outline_use_blend = true; +//灰度 +uniform float grey : hint_range(0.0, 1.0, 0.01) = 0.0; //彩虹轮廓变化周期 const float frequency = 0.25; @@ -46,13 +48,16 @@ a = outline_color.a; } } + if (outline_use_blend) { COLOR = mix(COLOR, blend, schedule); } } else { //非轮廓 COLOR = mix(COLOR, blend, schedule); + //灰度 + float grayColor = dot(COLOR.rgb, vec3(0.299, 0.587, 0.114)); + COLOR.rgb = mix(COLOR.rgb, vec3(grayColor), grey); } - COLOR.a *= a; COLOR *= modulate; } diff --git a/DungeonShooting_Godot/resource/material/Blend.tres b/DungeonShooting_Godot/resource/material/Blend.tres index b3015f1..707d8fa 100644 --- a/DungeonShooting_Godot/resource/material/Blend.tres +++ b/DungeonShooting_Godot/resource/material/Blend.tres @@ -12,3 +12,4 @@ 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 diff --git a/DungeonShooting_Godot/resource/material/Mask.gdshader b/DungeonShooting_Godot/resource/material/Mask.gdshader new file mode 100644 index 0000000..1c44ff4 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Mask.gdshader @@ -0,0 +1,9 @@ +shader_type canvas_item; + +uniform sampler2D mask_texture; + +void fragment() { + vec2 size = TEXTURE_PIXEL_SIZE; + COLOR.a = 1.0 - texture(mask_texture, UV).a; +} + diff --git a/DungeonShooting_Godot/resource/material/OffsetVertex.gdshader b/DungeonShooting_Godot/resource/material/OffsetVertex.gdshader new file mode 100644 index 0000000..f63d041 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/OffsetVertex.gdshader @@ -0,0 +1,7 @@ +shader_type canvas_item; + +uniform vec2 offset = vec2(0.0 , 0.0); + +void vertex() { + VERTEX += offset; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/material/Outline.gdshader b/DungeonShooting_Godot/resource/material/Outline.gdshader new file mode 100644 index 0000000..bb3072e --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Outline.gdshader @@ -0,0 +1,22 @@ +shader_type canvas_item; + +//轮廓颜色 +uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0); + +void fragment() { + float a = COLOR.a; + //显示轮廓 + if (a == 0.0) { + vec2 size = TEXTURE_PIXEL_SIZE; + float outline; + outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a; + outline += texture(TEXTURE, UV + vec2(0, size.y)).a; + outline += texture(TEXTURE, UV + vec2(size.x, 0)).a; + outline += texture(TEXTURE, UV + vec2(0, -size.y)).a; + outline = min(outline, 1.0); + if (outline > 0.0) { + COLOR = mix(COLOR, outline_color , 1); + COLOR.a = outline_color.a; + } + } +} diff --git a/DungeonShooting_Godot/resource/material/Outline.tres b/DungeonShooting_Godot/resource/material/Outline.tres new file mode 100644 index 0000000..c789b00 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Outline.tres @@ -0,0 +1,8 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://j8t31iuumvhr"] + +[ext_resource type="Shader" path="res://resource/material/Outline.gdshader" id="1_neih8"] + +[resource] +resource_local_to_scene = true +shader = ExtResource("1_neih8") +shader_parameter/outline_color = Color(0, 0, 0, 1) diff --git a/DungeonShooting_Godot/resource/material/Outline2.gdshader b/DungeonShooting_Godot/resource/material/Outline2.gdshader new file mode 100644 index 0000000..2f6d088 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Outline2.gdshader @@ -0,0 +1,30 @@ +shader_type canvas_item; + +//轮廓颜色 +uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0); +//轮廓缩放 +uniform float scale : hint_range(0.0, 2.0, 0.01) = 1.0; + +void fragment() { + float a = COLOR.a; + //显示轮廓 + if (a == 0.0) { + vec2 size = TEXTURE_PIXEL_SIZE * 0.5; + float outline; + outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a; + outline += texture(TEXTURE, UV + vec2(0, size.y)).a; + outline += texture(TEXTURE, UV + vec2(size.x, 0)).a; + outline += texture(TEXTURE, UV + vec2(0, -size.y)).a; + + outline += texture(TEXTURE, UV + vec2(-size.x, -size.y)).a; + outline += texture(TEXTURE, UV + vec2(size.x, size.y)).a; + outline += texture(TEXTURE, UV + vec2(size.x, -size.y)).a; + outline += texture(TEXTURE, UV + vec2(-size.x, size.y)).a; + + outline = min(outline, 1.0); + if (outline > 0.0) { + COLOR = mix(COLOR, outline_color , 1); + COLOR.a = outline_color.a; + } + } +} diff --git a/DungeonShooting_Godot/resource/material/Outline2.tres b/DungeonShooting_Godot/resource/material/Outline2.tres new file mode 100644 index 0000000..dd8cdb5 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Outline2.tres @@ -0,0 +1,9 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://jywcy17le5fd"] + +[ext_resource type="Shader" path="res://resource/material/Outline2.gdshader" id="1_skooq"] + +[resource] +resource_local_to_scene = true +shader = ExtResource("1_skooq") +shader_parameter/outline_color = Color(0, 0, 0, 1) +shader_parameter/scale = 1.0 diff --git a/DungeonShooting_Godot/resource/material/Sawtooth.gdshader b/DungeonShooting_Godot/resource/material/Sawtooth.gdshader new file mode 100644 index 0000000..cbbc062 --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Sawtooth.gdshader @@ -0,0 +1,18 @@ +shader_type canvas_item; + +void vertex() { + VERTEX = VERTEX * vec2(4.0); +} + +void fragment() { + vec2 pixel_size = 1.0 / vec2(textureSize(TEXTURE, 0)); + vec4 color = vec4(0.0); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + color += texture(TEXTURE, UV + vec2(float(x), float(y)) * pixel_size / 2.0); + } + } + color /= 9.0; + COLOR = color; +} + diff --git a/DungeonShooting_Godot/resource/material/Sawtooth.tres b/DungeonShooting_Godot/resource/material/Sawtooth.tres new file mode 100644 index 0000000..fc7553f --- /dev/null +++ b/DungeonShooting_Godot/resource/material/Sawtooth.tres @@ -0,0 +1,6 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cca0ka64xmrrd"] + +[ext_resource type="Shader" path="res://resource/material/Sawtooth.gdshader" id="1_nrhtr"] + +[resource] +shader = ExtResource("1_nrhtr") diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush1.png b/DungeonShooting_Godot/resource/sprite/brush/Brush1.png new file mode 100644 index 0000000..c768e96 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush1.png.import b/DungeonShooting_Godot/resource/sprite/brush/Brush1.png.import new file mode 100644 index 0000000..1d0ac77 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1qqkdbgeiptt" +path="res://.godot/imported/Brush1.png-77a9f61d37eedcb2e34d8c6b4bac0049.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/brush/Brush1.png" +dest_files=["res://.godot/imported/Brush1.png-77a9f61d37eedcb2e34d8c6b4bac0049.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/brush/Brush2.png b/DungeonShooting_Godot/resource/sprite/brush/Brush2.png new file mode 100644 index 0000000..b74c0ed --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush2.png.import b/DungeonShooting_Godot/resource/sprite/brush/Brush2.png.import new file mode 100644 index 0000000..126d1e2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://diehy0xukqgxk" +path="res://.godot/imported/Brush2.png-98e4673c392b5d8c4f415172ae2c4d5a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/brush/Brush2.png" +dest_files=["res://.godot/imported/Brush2.png-98e4673c392b5d8c4f415172ae2c4d5a.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/brush/Brush3.png b/DungeonShooting_Godot/resource/sprite/brush/Brush3.png new file mode 100644 index 0000000..c77fef5 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush3.png.import b/DungeonShooting_Godot/resource/sprite/brush/Brush3.png.import new file mode 100644 index 0000000..18c8e64 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jnx4wfn5hu3u" +path="res://.godot/imported/Brush3.png-1030dd2952f08d45fe719009951c0ba1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/brush/Brush3.png" +dest_files=["res://.godot/imported/Brush3.png-1030dd2952f08d45fe719009951c0ba1.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/brush/Brush4.png b/DungeonShooting_Godot/resource/sprite/brush/Brush4.png new file mode 100644 index 0000000..5a7a53d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush4.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush4.png.import b/DungeonShooting_Godot/resource/sprite/brush/Brush4.png.import new file mode 100644 index 0000000..087a811 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crprpnkrl3owc" +path="res://.godot/imported/Brush4.png-56aadb405a3711a8f68b1ef228ca286c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/brush/Brush4.png" +dest_files=["res://.godot/imported/Brush4.png-56aadb405a3711a8f68b1ef228ca286c.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/brush/Brush5.png b/DungeonShooting_Godot/resource/sprite/brush/Brush5.png new file mode 100644 index 0000000..0d36bb0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush5.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/brush/Brush5.png.import b/DungeonShooting_Godot/resource/sprite/brush/Brush5.png.import new file mode 100644 index 0000000..cb793aa --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/brush/Brush5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsqowv1dswkci" +path="res://.godot/imported/Brush5.png-ad7fa73ae4dca0a5e86aca7805550870.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/brush/Brush5.png" +dest_files=["res://.godot/imported/Brush5.png-ad7fa73ae4dca0a5e86aca7805550870.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/collision/Collision0001.png b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0001.png new file mode 100644 index 0000000..f15c822 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0001.png.import b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0001.png.import new file mode 100644 index 0000000..7486e5b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwa4chrugc6b1" +path="res://.godot/imported/Collision0001.png-b3a9531219ad3848aa608212cbf871e9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/collision/Collision0001.png" +dest_files=["res://.godot/imported/Collision0001.png-b3a9531219ad3848aa608212cbf871e9.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/collision/Collision0002.png b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0002.png new file mode 100644 index 0000000..bd7564a --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0002.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0002.png.import b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0002.png.import new file mode 100644 index 0000000..b6cbe7b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/collision/Collision0002.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6fw4bjkoeyxj" +path="res://.godot/imported/Collision0002.png-46f7f7e5a15512ebbac0e24f19ca4b5f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/collision/Collision0002.png" +dest_files=["res://.godot/imported/Collision0002.png-46f7f7e5a15512ebbac0e24f19ca4b5f.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/bullet0005.png b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0005.png new file mode 100644 index 0000000..7844c54 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0005.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0005.png.import b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0005.png.import new file mode 100644 index 0000000..3791292 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/bullet/normal/bullet0005.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwk72cqlmii5b" +path="res://.godot/imported/bullet0005.png-140cec2433af182a66a845defdf21e80.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/bullet/normal/bullet0005.png" +dest_files=["res://.godot/imported/bullet0005.png-140cec2433af182a66a845defdf21e80.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/common/Circle.png b/DungeonShooting_Godot/resource/sprite/common/Circle.png new file mode 100644 index 0000000..b441812 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Circle.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Circle.png.import b/DungeonShooting_Godot/resource/sprite/common/Circle.png.import new file mode 100644 index 0000000..9929741 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgptnp74ive4r" +path="res://.godot/imported/Circle.png-f10b04321574b5b61f18782ad4666e8f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Circle.png" +dest_files=["res://.godot/imported/Circle.png-f10b04321574b5b61f18782ad4666e8f.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/common/Circle2.png b/DungeonShooting_Godot/resource/sprite/common/Circle2.png new file mode 100644 index 0000000..c27b68f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Circle2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Circle2.png.import b/DungeonShooting_Godot/resource/sprite/common/Circle2.png.import new file mode 100644 index 0000000..c29b719 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Circle2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hsevliqnq82n" +path="res://.godot/imported/Circle2.png-5d9ae3b57dcec8e8d491690a3375e573.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Circle2.png" +dest_files=["res://.godot/imported/Circle2.png-5d9ae3b57dcec8e8d491690a3375e573.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/common/Effect1.png b/DungeonShooting_Godot/resource/sprite/common/Effect1.png new file mode 100644 index 0000000..51ef9a9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Effect1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Effect1.png.import b/DungeonShooting_Godot/resource/sprite/common/Effect1.png.import new file mode 100644 index 0000000..cac194e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Effect1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csud4e6kc3iku" +path="res://.godot/imported/Effect1.png-5593fe280744b1b0454af7db53a1e7f2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Effect1.png" +dest_files=["res://.godot/imported/Effect1.png-5593fe280744b1b0454af7db53a1e7f2.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/common/MeleeAttack1.png b/DungeonShooting_Godot/resource/sprite/common/MeleeAttack1.png new file mode 100644 index 0000000..aaa2799 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/MeleeAttack1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/MeleeAttack1.png.import b/DungeonShooting_Godot/resource/sprite/common/MeleeAttack1.png.import new file mode 100644 index 0000000..a61597c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/MeleeAttack1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7jhe2mmctmr1" +path="res://.godot/imported/MeleeAttack1.png-8ffb69b4c92f5e98ed14834a32b5312e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/MeleeAttack1.png" +dest_files=["res://.godot/imported/MeleeAttack1.png-8ffb69b4c92f5e98ed14834a32b5312e.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/common/Smoke.png b/DungeonShooting_Godot/resource/sprite/common/Smoke.png new file mode 100644 index 0000000..f358c57 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Smoke.png.import b/DungeonShooting_Godot/resource/sprite/common/Smoke.png.import new file mode 100644 index 0000000..68e5d35 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h7hkgbwj1li" +path="res://.godot/imported/Smoke.png-6be33f9e163b005a6c8b78ac10d1eda3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Smoke.png" +dest_files=["res://.godot/imported/Smoke.png-6be33f9e163b005a6c8b78ac10d1eda3.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/common/Smoke2.png b/DungeonShooting_Godot/resource/sprite/common/Smoke2.png new file mode 100644 index 0000000..af4aa83 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke2.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Smoke2.png.import b/DungeonShooting_Godot/resource/sprite/common/Smoke2.png.import new file mode 100644 index 0000000..b76138f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rk73piti0qot" +path="res://.godot/imported/Smoke2.png-53fc0d00a99e950add50888572b483ae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Smoke2.png" +dest_files=["res://.godot/imported/Smoke2.png-53fc0d00a99e950add50888572b483ae.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/common/Smoke3.png b/DungeonShooting_Godot/resource/sprite/common/Smoke3.png new file mode 100644 index 0000000..bbb2085 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke3.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Smoke3.png.import b/DungeonShooting_Godot/resource/sprite/common/Smoke3.png.import new file mode 100644 index 0000000..50fb4e9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b07cxsgvpwlct" +path="res://.godot/imported/Smoke3.png-72a784fe79d416759eafa491453d043a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Smoke3.png" +dest_files=["res://.godot/imported/Smoke3.png-72a784fe79d416759eafa491453d043a.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/common/Smoke4.png b/DungeonShooting_Godot/resource/sprite/common/Smoke4.png new file mode 100644 index 0000000..89ff217 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke4.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/Smoke4.png.import b/DungeonShooting_Godot/resource/sprite/common/Smoke4.png.import new file mode 100644 index 0000000..388cf2e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/Smoke4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://du0f3km5jhxlg" +path="res://.godot/imported/Smoke4.png-b921bc0b8f3badacae30b598d888a3be.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/Smoke4.png" +dest_files=["res://.godot/imported/Smoke4.png-b921bc0b8f3badacae30b598d888a3be.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/common/debug_arrows.png b/DungeonShooting_Godot/resource/sprite/common/debug_arrows.png new file mode 100644 index 0000000..a92ff48 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/debug_arrows.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/common/debug_arrows.png.import b/DungeonShooting_Godot/resource/sprite/common/debug_arrows.png.import new file mode 100644 index 0000000..a33432f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/common/debug_arrows.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv0i11jk5te5u" +path="res://.godot/imported/debug_arrows.png-0130be43e2f8d11ebe79f2a44e759aa7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/common/debug_arrows.png" +dest_files=["res://.godot/imported/debug_arrows.png-0130be43e2f8d11ebe79f2a44e759aa7.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/effects/Circle.png b/DungeonShooting_Godot/resource/sprite/effects/Circle.png deleted file mode 100644 index b441812..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Circle.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/Circle.png.import b/DungeonShooting_Godot/resource/sprite/effects/Circle.png.import deleted file mode 100644 index 7b5d4f7..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Circle.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cgptnp74ive4r" -path="res://.godot/imported/Circle.png-a2c1c1644069aac7590ae57b452f8682.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/Circle.png" -dest_files=["res://.godot/imported/Circle.png-a2c1c1644069aac7590ae57b452f8682.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/effects/Circle2.png b/DungeonShooting_Godot/resource/sprite/effects/Circle2.png deleted file mode 100644 index c27b68f..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Circle2.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/Circle2.png.import b/DungeonShooting_Godot/resource/sprite/effects/Circle2.png.import deleted file mode 100644 index dfcc3c1..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Circle2.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://hsevliqnq82n" -path="res://.godot/imported/Circle2.png-ef3a2d65cdf8bc187c245a202bc736dd.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/Circle2.png" -dest_files=["res://.godot/imported/Circle2.png-ef3a2d65cdf8bc187c245a202bc736dd.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/effects/Explosion.png b/DungeonShooting_Godot/resource/sprite/effects/Explosion.png deleted file mode 100644 index dab1f49..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Explosion.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/Explosion.png.import b/DungeonShooting_Godot/resource/sprite/effects/Explosion.png.import deleted file mode 100644 index 27c5b4b..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/Explosion.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d8ot2wrdoe4j" -path="res://.godot/imported/Explosion.png-f6ade742e1df9fc7ae3c5f68bc2d2284.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/Explosion.png" -dest_files=["res://.godot/imported/Explosion.png-f6ade742e1df9fc7ae3c5f68bc2d2284.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/effects/common/Effect1.png b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png deleted file mode 100644 index 51ef9a9..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import b/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import deleted file mode 100644 index ded10aa..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Effect1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://csud4e6kc3iku" -path="res://.godot/imported/Effect1.png-b381c54ce9f36be8da8d9d5787e0d539.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/common/Effect1.png" -dest_files=["res://.godot/imported/Effect1.png-b381c54ce9f36be8da8d9d5787e0d539.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/effects/common/Smoke.png b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png deleted file mode 100644 index f358c57..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import deleted file mode 100644 index d7f7f6e..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://h7hkgbwj1li" -path="res://.godot/imported/Smoke.png-c890fc56df0c1a3ef083465f2627ab8b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/common/Smoke.png" -dest_files=["res://.godot/imported/Smoke.png-c890fc56df0c1a3ef083465f2627ab8b.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/effects/common/Smoke2.png b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke2.png deleted file mode 100644 index af4aa83..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke2.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke2.png.import b/DungeonShooting_Godot/resource/sprite/effects/common/Smoke2.png.import deleted file mode 100644 index f9e9f57..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/common/Smoke2.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://rk73piti0qot" -path="res://.godot/imported/Smoke2.png-bfcd0e73871f709da66c76e16b1ccd07.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/common/Smoke2.png" -dest_files=["res://.godot/imported/Smoke2.png-bfcd0e73871f709da66c76e16b1ccd07.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/effects/debug_arrows.png b/DungeonShooting_Godot/resource/sprite/effects/debug_arrows.png deleted file mode 100644 index a92ff48..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/debug_arrows.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/debug_arrows.png.import b/DungeonShooting_Godot/resource/sprite/effects/debug_arrows.png.import deleted file mode 100644 index 0a070ab..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/debug_arrows.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bv0i11jk5te5u" -path="res://.godot/imported/debug_arrows.png-8070fefa9c5a4f250534aaddd14d315c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/debug_arrows.png" -dest_files=["res://.godot/imported/debug_arrows.png-8070fefa9c5a4f250534aaddd14d315c.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/effects/explode/Explode_circle0001.png b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_circle0001.png deleted file mode 100644 index c20e52e..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_circle0001.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_circle0001.png.import b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_circle0001.png.import deleted file mode 100644 index d32a45b..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_circle0001.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ccdflg560oub6" -path="res://.godot/imported/Explode_circle0001.png-226d2b77cea80f656d4eb2869ee47062.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/explode/Explode_circle0001.png" -dest_files=["res://.godot/imported/Explode_circle0001.png-226d2b77cea80f656d4eb2869ee47062.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/effects/explode/Explode_line0001.png b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_line0001.png deleted file mode 100644 index b631b3f..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_line0001.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_line0001.png.import b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_line0001.png.import deleted file mode 100644 index 0f10321..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_line0001.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cquv6nomd3tpf" -path="res://.godot/imported/Explode_line0001.png-449ac783735384f2465771c25c401693.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/explode/Explode_line0001.png" -dest_files=["res://.godot/imported/Explode_line0001.png-449ac783735384f2465771c25c401693.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/effects/explode/Explode_pit0001.png b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_pit0001.png deleted file mode 100644 index 281d9ea..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_pit0001.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_pit0001.png.import b/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_pit0001.png.import deleted file mode 100644 index 2536123..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/explode/Explode_pit0001.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://6p1iq7sgw8lt" -path="res://.godot/imported/Explode_pit0001.png-e0ae86a6c1b6531083be57c318c78f11.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/explode/Explode_pit0001.png" -dest_files=["res://.godot/imported/Explode_pit0001.png-e0ae86a6c1b6531083be57c318c78f11.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/effects/weapon/Collision1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png deleted file mode 100644 index f15c822..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import deleted file mode 100644 index 1737a56..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/Collision1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dwa4chrugc6b1" -path="res://.godot/imported/Collision1.png-21b57f1716aaa61033dc15fa90c3af13.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/weapon/Collision1.png" -dest_files=["res://.godot/imported/Collision1.png-21b57f1716aaa61033dc15fa90c3af13.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/effects/weapon/KnifeHit1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png deleted file mode 100644 index 83465d0..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import deleted file mode 100644 index 890932d..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/KnifeHit1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dx07ta0asnmuw" -path="res://.godot/imported/KnifeHit1.png-2f433b2240ee3b74ce7f49e4905f3ded.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/weapon/KnifeHit1.png" -dest_files=["res://.godot/imported/KnifeHit1.png-2f433b2240ee3b74ce7f49e4905f3ded.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/effects/weapon/MeleeAttack1.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png deleted file mode 100644 index aaa2799..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import deleted file mode 100644 index 1faa5b9..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/MeleeAttack1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://7jhe2mmctmr1" -path="res://.godot/imported/MeleeAttack1.png-fcea1547355ce99fe204cf5180b8c02d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/weapon/MeleeAttack1.png" -dest_files=["res://.godot/imported/MeleeAttack1.png-fcea1547355ce99fe204cf5180b8c02d.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/effects/weapon/ShotFire.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png deleted file mode 100644 index 5c6d63a..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import deleted file mode 100644 index 66623d6..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b0jsyrbk4bydt" -path="res://.godot/imported/ShotFire.png-c837a3bb80e273a615c459f36fadc870.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/weapon/ShotFire.png" -dest_files=["res://.godot/imported/ShotFire.png-c837a3bb80e273a615c459f36fadc870.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/effects/weapon/ShotFire2.png b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire2.png deleted file mode 100644 index 2a6b618..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire2.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire2.png.import b/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire2.png.import deleted file mode 100644 index 109241d..0000000 --- a/DungeonShooting_Godot/resource/sprite/effects/weapon/ShotFire2.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cj8gb5dxnk8ov" -path="res://.godot/imported/ShotFire2.png-859bcfe4ad8b11b7eb348b8c54ee9e64.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/effects/weapon/ShotFire2.png" -dest_files=["res://.godot/imported/ShotFire2.png-859bcfe4ad8b11b7eb348b8c54ee9e64.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/explode/Explode_circle0001.png b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0001.png new file mode 100644 index 0000000..c20e52e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0001.png.import b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0001.png.import new file mode 100644 index 0000000..efa0875 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccdflg560oub6" +path="res://.godot/imported/Explode_circle0001.png-64a4b88d5f395e1a72e3c084f32a6fe3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/explode/Explode_circle0001.png" +dest_files=["res://.godot/imported/Explode_circle0001.png-64a4b88d5f395e1a72e3c084f32a6fe3.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/explode/Explode_circle0002.png b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0002.png new file mode 100644 index 0000000..b0fc911 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0002.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0002.png.import b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0002.png.import new file mode 100644 index 0000000..6f3e9dd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0002.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cusp3s5t7qbuy" +path="res://.godot/imported/Explode_circle0002.png-b571428f3da033f1870876090f852b5e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/explode/Explode_circle0002.png" +dest_files=["res://.godot/imported/Explode_circle0002.png-b571428f3da033f1870876090f852b5e.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/explode/Explode_circle0003.png b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0003.png new file mode 100644 index 0000000..dab1f49 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0003.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0003.png.import b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0003.png.import new file mode 100644 index 0000000..2363c21 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_circle0003.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4be6mi1egtiy" +path="res://.godot/imported/Explode_circle0003.png-4321be8a4dc1201188548c1bf9ff88ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/explode/Explode_circle0003.png" +dest_files=["res://.godot/imported/Explode_circle0003.png-4321be8a4dc1201188548c1bf9ff88ee.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/explode/Explode_line0001.png b/DungeonShooting_Godot/resource/sprite/explode/Explode_line0001.png new file mode 100644 index 0000000..b631b3f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_line0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/explode/Explode_line0001.png.import b/DungeonShooting_Godot/resource/sprite/explode/Explode_line0001.png.import new file mode 100644 index 0000000..17930b9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_line0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cquv6nomd3tpf" +path="res://.godot/imported/Explode_line0001.png-b37b4313423d54274710c5ed3d33789c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/explode/Explode_line0001.png" +dest_files=["res://.godot/imported/Explode_line0001.png-b37b4313423d54274710c5ed3d33789c.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/explode/Explode_pit0001.png b/DungeonShooting_Godot/resource/sprite/explode/Explode_pit0001.png new file mode 100644 index 0000000..281d9ea --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_pit0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/explode/Explode_pit0001.png.import b/DungeonShooting_Godot/resource/sprite/explode/Explode_pit0001.png.import new file mode 100644 index 0000000..f1551ac --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/explode/Explode_pit0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6p1iq7sgw8lt" +path="res://.godot/imported/Explode_pit0001.png-8fb768a27d312022da8befb9c8eb0639.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/explode/Explode_pit0001.png" +dest_files=["res://.godot/imported/Explode_pit0001.png-8fb768a27d312022da8befb9c8eb0639.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/BuffProp0011.png b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0011.png new file mode 100644 index 0000000..718794f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0011.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0011.png.import b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0011.png.import new file mode 100644 index 0000000..0e87026 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0011.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3lemqkwfnufw" +path="res://.godot/imported/BuffProp0011.png-cbec00a310f3df70762a02dad80ea824.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/prop/buff/BuffProp0011.png" +dest_files=["res://.godot/imported/BuffProp0011.png-cbec00a310f3df70762a02dad80ea824.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/BuffProp0012.png b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0012.png new file mode 100644 index 0000000..5660753 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0012.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0012.png.import b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0012.png.import new file mode 100644 index 0000000..b37352d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0012.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djhhig4ct8fgo" +path="res://.godot/imported/BuffProp0012.png-767200b9890d9fc7fd455c0aa41ecaad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/prop/buff/BuffProp0012.png" +dest_files=["res://.godot/imported/BuffProp0012.png-767200b9890d9fc7fd455c0aa41ecaad.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/BuffProp0013.png b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0013.png new file mode 100644 index 0000000..b70b0b2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0013.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0013.png.import b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0013.png.import new file mode 100644 index 0000000..4a815d4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0013.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8ykm3jbhjpxh" +path="res://.godot/imported/BuffProp0013.png-bdbfb79e3feb60c437df3d4205954e6c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/prop/buff/BuffProp0013.png" +dest_files=["res://.godot/imported/BuffProp0013.png-bdbfb79e3feb60c437df3d4205954e6c.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/BuffProp0014.png b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0014.png new file mode 100644 index 0000000..049c1a0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0014.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0014.png.import b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0014.png.import new file mode 100644 index 0000000..fe9a2a1 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/prop/buff/BuffProp0014.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddkno2rlclys0" +path="res://.godot/imported/BuffProp0014.png-3f30439d1b22d8ddbf02fe34bf967a18.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/prop/buff/BuffProp0014.png" +dest_files=["res://.godot/imported/BuffProp0014.png-3f30439d1b22d8ddbf02fe34bf967a18.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/common/Role_astonished.png b/DungeonShooting_Godot/resource/sprite/role/common/Role_astonished.png new file mode 100644 index 0000000..8d232dd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_astonished.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/common/Role_astonished.png.import b/DungeonShooting_Godot/resource/sprite/role/common/Role_astonished.png.import new file mode 100644 index 0000000..6eb2d0d --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_astonished.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b75k7hefqy3tm" +path="res://.godot/imported/Role_astonished.png-8166b8786411283003a535d1677d0104.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/common/Role_astonished.png" +dest_files=["res://.godot/imported/Role_astonished.png-8166b8786411283003a535d1677d0104.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/common/Role_notify.png b/DungeonShooting_Godot/resource/sprite/role/common/Role_notify.png new file mode 100644 index 0000000..f2bddef --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_notify.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/common/Role_notify.png.import b/DungeonShooting_Godot/resource/sprite/role/common/Role_notify.png.import new file mode 100644 index 0000000..0bd8a72 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_notify.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6jka6itu76x7" +path="res://.godot/imported/Role_notify.png-be3f9ba9bf6d85ab3633bbe6cbe960e3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/common/Role_notify.png" +dest_files=["res://.godot/imported/Role_notify.png-be3f9ba9bf6d85ab3633bbe6cbe960e3.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/common/Role_query.png b/DungeonShooting_Godot/resource/sprite/role/common/Role_query.png new file mode 100644 index 0000000..6e3c961 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_query.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/common/Role_query.png.import b/DungeonShooting_Godot/resource/sprite/role/common/Role_query.png.import new file mode 100644 index 0000000..ec5e582 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_query.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bda63puujv425" +path="res://.godot/imported/Role_query.png-99c4efcb33f8ce117e8e1704e40b8b3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/common/Role_query.png" +dest_files=["res://.godot/imported/Role_query.png-99c4efcb33f8ce117e8e1704e40b8b3e.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/common/Role_shadow1.png b/DungeonShooting_Godot/resource/sprite/role/common/Role_shadow1.png new file mode 100644 index 0000000..4f60087 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_shadow1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/common/Role_shadow1.png.import b/DungeonShooting_Godot/resource/sprite/role/common/Role_shadow1.png.import new file mode 100644 index 0000000..df48075 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/common/Role_shadow1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn58ax3t6rf4x" +path="res://.godot/imported/Role_shadow1.png-9a069b2ff77baecd95d4b2788df529f8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/common/Role_shadow1.png" +dest_files=["res://.godot/imported/Role_shadow1.png-9a069b2ff77baecd95d4b2788df529f8.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/enemy0002/Enemy0002.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png new file mode 100644 index 0000000..0f1a4ed --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import new file mode 100644 index 0000000..acce48a --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ba6ke6xp63lnv" +path="res://.godot/imported/Enemy0002.png-cf46c3b830873b4d0ccb2d0683f29d51.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002.png" +dest_files=["res://.godot/imported/Enemy0002.png-cf46c3b830873b4d0ccb2d0683f29d51.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/enemy0002/Enemy0002_attack.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_attack.png new file mode 100644 index 0000000..ed11edd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_attack.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_attack.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_attack.png.import new file mode 100644 index 0000000..5342ed6 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_attack.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byvhnaggvvfex" +path="res://.godot/imported/Enemy0002_attack.png-f20e305d5da437157c0eadd45ddd9904.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002_attack.png" +dest_files=["res://.godot/imported/Enemy0002_attack.png-f20e305d5da437157c0eadd45ddd9904.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/enemy0002/Enemy0002_dead.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_dead.png new file mode 100644 index 0000000..69431f9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_dead.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_dead.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_dead.png.import new file mode 100644 index 0000000..1c26740 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_dead.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x3tjqgdgp43n" +path="res://.godot/imported/Enemy0002_dead.png-9318cf73f87fed753124e3e669c47c34.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002_dead.png" +dest_files=["res://.godot/imported/Enemy0002_dead.png-9318cf73f87fed753124e3e669c47c34.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/enemy0002/Enemy0002_idle.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_idle.png new file mode 100644 index 0000000..5c65a43 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_idle.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_idle.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_idle.png.import new file mode 100644 index 0000000..c143170 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_idle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwafpoxpkx3lu" +path="res://.godot/imported/Enemy0002_idle.png-f012203897ea29b187025e9df2dee09e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002_idle.png" +dest_files=["res://.godot/imported/Enemy0002_idle.png-f012203897ea29b187025e9df2dee09e.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/enemy0002/Enemy0002_run.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_run.png new file mode 100644 index 0000000..c8dc00b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_run.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_run.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_run.png.import new file mode 100644 index 0000000..c1b8fdd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002_run.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dibftt2rj5omq" +path="res://.godot/imported/Enemy0002_run.png-6dfcd1cc185b0a4ee4497ba9526c1749.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002_run.png" +dest_files=["res://.godot/imported/Enemy0002_run.png-6dfcd1cc185b0a4ee4497ba9526c1749.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/role0001/Role0001_head.png b/DungeonShooting_Godot/resource/sprite/role/role0001/Role0001_head.png new file mode 100644 index 0000000..fd0f206 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/Role0001_head.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/Role0001_head.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/Role0001_head.png.import new file mode 100644 index 0000000..4526cc4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/Role0001_head.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw702ostmv2am" +path="res://.godot/imported/Role0001_head.png-9e4bb55990b7b54630895db4565f621f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/Role0001_head.png" +dest_files=["res://.godot/imported/Role0001_head.png-9e4bb55990b7b54630895db4565f621f.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/role0001/roll/Sprite-0002.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0002.png deleted file mode 100644 index df4b964..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0002.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0002.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0002.png.import deleted file mode 100644 index 10663d3..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0002.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d3thq2unooyl5" -path="res://.godot/imported/Sprite-0002.png-213031b39254f00c0c725e4252a9d486.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0002.png" -dest_files=["res://.godot/imported/Sprite-0002.png-213031b39254f00c0c725e4252a9d486.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/role0001/roll/Sprite-0003.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0003.png deleted file mode 100644 index 12b6942..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0003.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0003.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0003.png.import deleted file mode 100644 index c89343a..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0003.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ccqgkq5qv33il" -path="res://.godot/imported/Sprite-0003.png-e6803dc1c9e8f17b579f63f5e8cb8e23.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0003.png" -dest_files=["res://.godot/imported/Sprite-0003.png-e6803dc1c9e8f17b579f63f5e8cb8e23.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/role0001/roll/Sprite-0004.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0004.png deleted file mode 100644 index 6bc1574..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0004.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0004.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0004.png.import deleted file mode 100644 index 5e6e424..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0004.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://sknj4eflhbvc" -path="res://.godot/imported/Sprite-0004.png-8d2b0ef4221d99fc8d9133c4f11809ff.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0004.png" -dest_files=["res://.godot/imported/Sprite-0004.png-8d2b0ef4221d99fc8d9133c4f11809ff.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/role0001/roll/Sprite-0005.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0005.png deleted file mode 100644 index a1128d2..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0005.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0005.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0005.png.import deleted file mode 100644 index 7d04efe..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0005.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c8ijooj30lvpw" -path="res://.godot/imported/Sprite-0005.png-9c344cd4269051bef354e37f494af4b3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0005.png" -dest_files=["res://.godot/imported/Sprite-0005.png-9c344cd4269051bef354e37f494af4b3.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/role0001/roll/Sprite-0006.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0006.png deleted file mode 100644 index 0bb3b72..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0006.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0006.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0006.png.import deleted file mode 100644 index 2912fea..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0006.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://blqx76rvx6c34" -path="res://.godot/imported/Sprite-0006.png-1cb8bb9f32bbeef7eb914435df8b325e.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0006.png" -dest_files=["res://.godot/imported/Sprite-0006.png-1cb8bb9f32bbeef7eb914435df8b325e.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/role0001/roll/Sprite-0007.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0007.png deleted file mode 100644 index a7f4176..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0007.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0007.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0007.png.import deleted file mode 100644 index 3dc376b..0000000 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0007.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://48qebkjqggub" -path="res://.godot/imported/Sprite-0007.png-e2c0f4efb93a9c9e29fa2a8da4c24baf.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/role/role0001/roll/Sprite-0007.png" -dest_files=["res://.godot/imported/Sprite-0007.png-e2c0f4efb93a9c9e29fa2a8da4c24baf.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/role0001/roll/Sprite-0008.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png index b15c6ef..cea4550 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png.import index 8da943b..db9467b 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png.import +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0008.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dvrxriqd6dk1d" +uid="uid://b2hdk7nca5rda" path="res://.godot/imported/Sprite-0008.png-bf19680d71b1e849c210397f3a25fca2.ctex" metadata={ "vram_texture": false diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png index 12b6942..39d8915 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png.import index c606373..98a613f 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png.import +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0009.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ceqi6d4vhbpt" +uid="uid://bmoh16y1r2h1w" path="res://.godot/imported/Sprite-0009.png-d266a086bd0825b44bd46a64ac6248f3.ctex" metadata={ "vram_texture": false diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png index df4b964..55ebf73 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png.import index b6b498e..6482347 100644 --- a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png.import +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0010.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cp8d5kqfwcyjf" +uid="uid://do6ybmo0r04pp" path="res://.godot/imported/Sprite-0010.png-c80699f0403ae66453b70f57a31ecc59.ctex" metadata={ "vram_texture": false diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png new file mode 100644 index 0000000..e4bbce7 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png.import new file mode 100644 index 0000000..e95d2b4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0011.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3itgraiw7mns" +path="res://.godot/imported/Sprite-0011.png-f39da561788471562fea5b85fccb8f15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0011.png" +dest_files=["res://.godot/imported/Sprite-0011.png-f39da561788471562fea5b85fccb8f15.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/role0001/roll/Sprite-0012.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0012.png new file mode 100644 index 0000000..9d67eab --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0012.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0012.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0012.png.import new file mode 100644 index 0000000..a19b1ed --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0012.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cisayo3amq6sv" +path="res://.godot/imported/Sprite-0012.png-838a44169d52507787688a04449f37cc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0012.png" +dest_files=["res://.godot/imported/Sprite-0012.png-838a44169d52507787688a04449f37cc.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/role0001/roll/Sprite-0013.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0013.png new file mode 100644 index 0000000..f8ba5d0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0013.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0013.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0013.png.import new file mode 100644 index 0000000..954145b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0013.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtndan40ql7ou" +path="res://.godot/imported/Sprite-0013.png-cbdb81418692a4dd25c46861cf67e34f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0013.png" +dest_files=["res://.godot/imported/Sprite-0013.png-cbdb81418692a4dd25c46861cf67e34f.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/role0001/roll/Sprite-0014.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0014.png new file mode 100644 index 0000000..7b5dcb4 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0014.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0014.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0014.png.import new file mode 100644 index 0000000..b80afa8 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0014.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj30rfk3rndmm" +path="res://.godot/imported/Sprite-0014.png-56b06536a4dd9976774a8e1b4a6c7634.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0014.png" +dest_files=["res://.godot/imported/Sprite-0014.png-56b06536a4dd9976774a8e1b4a6c7634.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/role0001/roll/Sprite-0015.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0015.png new file mode 100644 index 0000000..80f40dd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0015.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0015.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0015.png.import new file mode 100644 index 0000000..8a4784c --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0015.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vs7ip3v274e2" +path="res://.godot/imported/Sprite-0015.png-582239a5457ef5c714a94f9ac0d9732d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0015.png" +dest_files=["res://.godot/imported/Sprite-0015.png-582239a5457ef5c714a94f9ac0d9732d.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/role0001/roll/Sprite-0016.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0016.png new file mode 100644 index 0000000..8c8b1e5 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0016.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0016.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0016.png.import new file mode 100644 index 0000000..b352eca --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0016.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7yrbkcy1g56a" +path="res://.godot/imported/Sprite-0016.png-c52581d1493a9b1c102d236e75a367e5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0016.png" +dest_files=["res://.godot/imported/Sprite-0016.png-c52581d1493a9b1c102d236e75a367e5.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/role0001/roll/Sprite-0017.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0017.png new file mode 100644 index 0000000..3496c24 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0017.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0017.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0017.png.import new file mode 100644 index 0000000..5c4fddd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0017.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7s4yf5ic37cd" +path="res://.godot/imported/Sprite-0017.png-d2eba82651f6d1a8ff6590ae66c55c9d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0017.png" +dest_files=["res://.godot/imported/Sprite-0017.png-d2eba82651f6d1a8ff6590ae66c55c9d.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/role0001/roll/Sprite-0018.png b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0018.png new file mode 100644 index 0000000..615dd45 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0018.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0018.png.import b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0018.png.import new file mode 100644 index 0000000..a505463 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/role0001/roll/Sprite-0018.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0ik1lwfjlr7y" +path="res://.godot/imported/Sprite-0018.png-c8c2aad9d6ff0d7438efa00005b2261a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/role0001/roll/Sprite-0018.png" +dest_files=["res://.godot/imported/Sprite-0018.png-c8c2aad9d6ff0d7438efa00005b2261a.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/ShotFire0001.png b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0001.png new file mode 100644 index 0000000..5c6d63a --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0001.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0001.png.import b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0001.png.import new file mode 100644 index 0000000..292d487 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0001.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0jsyrbk4bydt" +path="res://.godot/imported/ShotFire0001.png-9969783210ca604614cbdd429dd7b849.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/shootFire/ShotFire0001.png" +dest_files=["res://.godot/imported/ShotFire0001.png-9969783210ca604614cbdd429dd7b849.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/ShotFire0002.png b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0002.png new file mode 100644 index 0000000..2a6b618 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0002.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0002.png.import b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0002.png.import new file mode 100644 index 0000000..99ecd51 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/shootFire/ShotFire0002.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cj8gb5dxnk8ov" +path="res://.godot/imported/ShotFire0002.png-12459bc84060a207f5869b418ecc3c71.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/shootFire/ShotFire0002.png" +dest_files=["res://.godot/imported/ShotFire0002.png-12459bc84060a207f5869b418ecc3c71.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/Block.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Block.png new file mode 100644 index 0000000..e8b825e --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Block.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Block.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Block.png.import new file mode 100644 index 0000000..e90e860 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Block.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0878uloew5jo" +path="res://.godot/imported/Block.png-4258899b4697128b8bd3fbca1e9d2093.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Block.png" +dest_files=["res://.godot/imported/Block.png-4258899b4697128b8bd3fbca1e9d2093.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/Unknown.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Unknown.png new file mode 100644 index 0000000..a50162f --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Unknown.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Unknown.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Unknown.png.import new file mode 100644 index 0000000..3f9b7af --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Unknown.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://w54se0667dqv" +path="res://.godot/imported/Unknown.png-49f545b95bd2713bdaacd2b4caa7b3a1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Unknown.png" +dest_files=["res://.godot/imported/Unknown.png-49f545b95bd2713bdaacd2b4caa7b3a1.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/mapEditor/ErrorCell.png b/DungeonShooting_Godot/resource/sprite/ui/mapEditor/ErrorCell.png deleted file mode 100644 index e8b825e..0000000 --- a/DungeonShooting_Godot/resource/sprite/ui/mapEditor/ErrorCell.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/mapEditor/ErrorCell.png.import b/DungeonShooting_Godot/resource/sprite/ui/mapEditor/ErrorCell.png.import deleted file mode 100644 index a2f26be..0000000 --- a/DungeonShooting_Godot/resource/sprite/ui/mapEditor/ErrorCell.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://0878uloew5jo" -path="res://.godot/imported/ErrorCell.png-adb91a4f9cc859a7b631f14ff0f58d18.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/ui/mapEditor/ErrorCell.png" -dest_files=["res://.godot/imported/ErrorCell.png-adb91a4f9cc859a7b631f14ff0f58d18.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/roomMap/MapBar.png b/DungeonShooting_Godot/resource/sprite/ui/roomMap/MapBar.png new file mode 100644 index 0000000..2413168 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/roomMap/MapBar.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/roomMap/MapBar.png.import b/DungeonShooting_Godot/resource/sprite/ui/roomMap/MapBar.png.import new file mode 100644 index 0000000..850a99b --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/roomMap/MapBar.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://k621mhhkg65f" +path="res://.godot/imported/MapBar.png-b48b0548dd5961c6b8cbfded48cd342f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/roomMap/MapBar.png" +dest_files=["res://.godot/imported/MapBar.png-b48b0548dd5961c6b8cbfded48cd342f.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/roomUI/MapBar.png b/DungeonShooting_Godot/resource/sprite/ui/roomUI/MapBar.png deleted file mode 100644 index be17bb5..0000000 --- a/DungeonShooting_Godot/resource/sprite/ui/roomUI/MapBar.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/roomUI/MapBar.png.import b/DungeonShooting_Godot/resource/sprite/ui/roomUI/MapBar.png.import deleted file mode 100644 index 38c02ed..0000000 --- a/DungeonShooting_Godot/resource/sprite/ui/roomUI/MapBar.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://k621mhhkg65f" -path="res://.godot/imported/MapBar.png-b929285ef9227704736eaf783aa026b9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/ui/roomUI/MapBar.png" -dest_files=["res://.godot/imported/MapBar.png-b929285ef9227704736eaf783aa026b9.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/knife1.png b/DungeonShooting_Godot/resource/sprite/weapon/knife1.png deleted file mode 100644 index cf38cf3..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/knife1.png +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/knife1.png.import b/DungeonShooting_Godot/resource/sprite/weapon/knife1.png.import deleted file mode 100644 index e13d626..0000000 --- a/DungeonShooting_Godot/resource/sprite/weapon/knife1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bxhbsq0wb2yo1" -path="res://.godot/imported/knife1.png-7a8e87bb9fc40c8adf95391721186a58.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://resource/sprite/weapon/knife1.png" -dest_files=["res://.godot/imported/knife1.png-7a8e87bb9fc40c8adf95391721186a58.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/weapon0004/KnifeHit1.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/KnifeHit1.png new file mode 100644 index 0000000..83465d0 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/KnifeHit1.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/KnifeHit1.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/KnifeHit1.png.import new file mode 100644 index 0000000..892f5c9 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/KnifeHit1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dx07ta0asnmuw" +path="res://.godot/imported/KnifeHit1.png-80077e3967f264ba53464cfdd643f301.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0004/KnifeHit1.png" +dest_files=["res://.godot/imported/KnifeHit1.png-80077e3967f264ba53464cfdd643f301.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/weapon0004/Weapon0004.png b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/Weapon0004.png new file mode 100644 index 0000000..cf38cf3 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/Weapon0004.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/Weapon0004.png.import b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/Weapon0004.png.import new file mode 100644 index 0000000..13ac9e3 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/weapon/weapon0004/Weapon0004.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxhbsq0wb2yo1" +path="res://.godot/imported/Weapon0004.png-6163b5909ac0076acb9640932b1b3e9e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/weapon/weapon0004/Weapon0004.png" +dest_files=["res://.godot/imported/Weapon0004.png-6163b5909ac0076acb9640932b1b3e9e.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/Bullet0005.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0005.tres new file mode 100644 index 0000000..49e5677 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Bullet0005.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://jj8oh76pi53j"] + +[ext_resource type="Texture2D" uid="uid://cwk72cqlmii5b" path="res://resource/sprite/bullet/normal/bullet0005.png" id="1_qmb1b"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_qmb1b") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0001.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0001.tres new file mode 100644 index 0000000..5ac693b --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0001.tres @@ -0,0 +1,42 @@ +[gd_resource type="SpriteFrames" load_steps=6 format=3 uid="uid://pwg2tx7dmcvp"] + +[ext_resource type="Texture2D" uid="uid://dwa4chrugc6b1" path="res://resource/sprite/bullet/collision/Collision0001.png" id="1_fwdya"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_howuv"] +atlas = ExtResource("1_fwdya") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4qx75"] +atlas = ExtResource("1_fwdya") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n6ula"] +atlas = ExtResource("1_fwdya") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5lumy"] +atlas = ExtResource("1_fwdya") +region = Rect2(48, 0, 16, 16) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_howuv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4qx75") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n6ula") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5lumy") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 25.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0002.tres b/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0002.tres new file mode 100644 index 0000000..1da3ced --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/bullet/Collision0002.tres @@ -0,0 +1,42 @@ +[gd_resource type="SpriteFrames" load_steps=6 format=3 uid="uid://dkqd4513sog3f"] + +[ext_resource type="Texture2D" uid="uid://c6fw4bjkoeyxj" path="res://resource/sprite/bullet/collision/Collision0002.png" id="1_t062x"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_s52rj"] +atlas = ExtResource("1_t062x") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1edgh"] +atlas = ExtResource("1_t062x") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7sxvt"] +atlas = ExtResource("1_t062x") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_eske5"] +atlas = ExtResource("1_t062x") +region = Rect2(48, 0, 16, 16) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_s52rj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1edgh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7sxvt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eske5") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"default", +"speed": 25.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres b/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres deleted file mode 100644 index 69b6d5a..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/effect/KnifeHit1.tres +++ /dev/null @@ -1,53 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=8 format=3 uid="uid://dj8o7ws03bik4"] - -[ext_resource type="Texture2D" uid="uid://dx07ta0asnmuw" path="res://resource/sprite/effects/weapon/KnifeHit1.png" id="1_0yl3h"] - -[sub_resource type="AtlasTexture" id="1"] -atlas = ExtResource("1_0yl3h") -region = Rect2(0, 0, 64, 68) - -[sub_resource type="AtlasTexture" id="2"] -atlas = ExtResource("1_0yl3h") -region = Rect2(64, 0, 64, 68) - -[sub_resource type="AtlasTexture" id="3"] -atlas = ExtResource("1_0yl3h") -region = Rect2(128, 0, 64, 68) - -[sub_resource type="AtlasTexture" id="4"] -atlas = ExtResource("1_0yl3h") -region = Rect2(192, 0, 64, 68) - -[sub_resource type="AtlasTexture" id="5"] -atlas = ExtResource("1_0yl3h") -region = Rect2(256, 0, 64, 68) - -[sub_resource type="AtlasTexture" id="6"] -atlas = ExtResource("1_0yl3h") -region = Rect2(320, 0, 64, 68) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("1") -}, { -"duration": 1.0, -"texture": SubResource("2") -}, { -"duration": 1.0, -"texture": SubResource("3") -}, { -"duration": 1.0, -"texture": SubResource("4") -}, { -"duration": 1.0, -"texture": SubResource("5") -}, { -"duration": 1.0, -"texture": SubResource("6") -}], -"loop": false, -"name": &"default", -"speed": 30.0 -}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0011.tres b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0011.tres new file mode 100644 index 0000000..6a95208 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0011.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://bq7t8ruav5g41"] + +[ext_resource type="Texture2D" uid="uid://b3lemqkwfnufw" path="res://resource/sprite/prop/buff/BuffProp0011.png" id="1_abwtt"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_abwtt") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0012.tres b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0012.tres new file mode 100644 index 0000000..8416d7a --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0012.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://rksmm8jwex7l"] + +[ext_resource type="Texture2D" uid="uid://djhhig4ct8fgo" path="res://resource/sprite/prop/buff/BuffProp0012.png" id="1_kl6x5"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_kl6x5") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0013.tres b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0013.tres new file mode 100644 index 0000000..ae3883a --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0013.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://cdnrqfy0vfyu5"] + +[ext_resource type="Texture2D" uid="uid://8ykm3jbhjpxh" path="res://resource/sprite/prop/buff/BuffProp0013.png" id="1_sshn3"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_sshn3") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0014.tres b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0014.tres new file mode 100644 index 0000000..141074b --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/prop/buff/BuffProp0014.tres @@ -0,0 +1,14 @@ +[gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://ux70kddi6wwy"] + +[ext_resource type="Texture2D" uid="uid://ddkno2rlclys0" path="res://resource/sprite/prop/buff/BuffProp0014.png" id="1_0n30r"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_0n30r") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres new file mode 100644 index 0000000..42508d3 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres @@ -0,0 +1,117 @@ +[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://cnctpyrn02rhd"] + +[ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_inanc"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_jttte"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 0, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ff0sc"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mf7cn"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yvk4h"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pwcj2"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_frwnm"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_201od"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kteyh"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_huqt3"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6s1ko"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vq38t"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2b6x5"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6755u"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 48, 16, 24) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_jttte") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ff0sc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mf7cn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yvk4h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pwcj2") +}], +"loop": true, +"name": &"idle", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_frwnm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_201od") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kteyh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_huqt3") +}], +"loop": true, +"name": &"reverseRun", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_6s1ko") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vq38t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2b6x5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6755u") +}], +"loop": true, +"name": &"run", +"speed": 10.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres new file mode 100644 index 0000000..0f99c41 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres @@ -0,0 +1,228 @@ +[gd_resource type="SpriteFrames" load_steps=33 format=3 uid="uid://ctpkpxgcwb583"] + +[ext_resource type="Texture2D" uid="uid://ba6ke6xp63lnv" path="res://resource/sprite/role/enemy0002/Enemy0002.png" id="1_bvqwm"] +[ext_resource type="Texture2D" uid="uid://byvhnaggvvfex" path="res://resource/sprite/role/enemy0002/Enemy0002_attack.png" id="1_ery1t"] +[ext_resource type="Texture2D" uid="uid://bwafpoxpkx3lu" path="res://resource/sprite/role/enemy0002/Enemy0002_idle.png" id="2_755ta"] +[ext_resource type="Texture2D" uid="uid://dibftt2rj5omq" path="res://resource/sprite/role/enemy0002/Enemy0002_run.png" id="3_xwtnk"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_d1dtv"] +atlas = ExtResource("1_ery1t") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_26knc"] +atlas = ExtResource("1_ery1t") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t5gqm"] +atlas = ExtResource("1_ery1t") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5png4"] +atlas = ExtResource("1_ery1t") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cfnm3"] +atlas = ExtResource("1_ery1t") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_leh3j"] +atlas = ExtResource("1_ery1t") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_631w6"] +atlas = ExtResource("1_ery1t") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3o2tl"] +atlas = ExtResource("1_ery1t") +region = Rect2(224, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3l40f"] +atlas = ExtResource("1_ery1t") +region = Rect2(256, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jh6hg"] +atlas = ExtResource("1_ery1t") +region = Rect2(288, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b085l"] +atlas = ExtResource("1_ery1t") +region = Rect2(320, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ch6qh"] +atlas = ExtResource("1_ery1t") +region = Rect2(352, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_54fxr"] +atlas = ExtResource("1_ery1t") +region = Rect2(384, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pbkbq"] +atlas = ExtResource("2_755ta") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g3tja"] +atlas = ExtResource("2_755ta") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0dbdg"] +atlas = ExtResource("2_755ta") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_emsy8"] +atlas = ExtResource("2_755ta") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d2jr8"] +atlas = ExtResource("2_755ta") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kaina"] +atlas = ExtResource("2_755ta") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hhv1n"] +atlas = ExtResource("2_755ta") +region = Rect2(224, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_583v7"] +atlas = ExtResource("3_xwtnk") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2gvm7"] +atlas = ExtResource("3_xwtnk") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_614bw"] +atlas = ExtResource("3_xwtnk") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_okagi"] +atlas = ExtResource("3_xwtnk") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bpq0u"] +atlas = ExtResource("3_xwtnk") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pmrvk"] +atlas = ExtResource("3_xwtnk") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_18qid"] +atlas = ExtResource("3_xwtnk") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yxvkk"] +atlas = ExtResource("3_xwtnk") +region = Rect2(224, 0, 32, 32) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_d1dtv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_26knc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t5gqm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5png4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cfnm3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_leh3j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_631w6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3o2tl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3l40f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jh6hg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b085l") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ch6qh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_54fxr") +}], +"loop": false, +"name": &"attack", +"speed": 15.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_bvqwm") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_pbkbq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g3tja") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0dbdg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_emsy8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d2jr8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kaina") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hhv1n") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_583v7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2gvm7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_614bw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_okagi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bpq0u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pmrvk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_18qid") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yxvkk") +}], +"loop": true, +"name": &"run", +"speed": 10.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres index 8205354..99a459a 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Role0001.tres @@ -1,4 +1,4 @@ -[gd_resource type="SpriteFrames" load_steps=21 format=3 uid="uid://n11thtali6es"] +[gd_resource type="SpriteFrames" load_steps=26 format=3 uid="uid://n11thtali6es"] [ext_resource type="Texture2D" uid="uid://ekas4lqprrml" path="res://resource/sprite/role/role0001/idle/Sprite-0002.png" id="1_le6bk"] [ext_resource type="Texture2D" uid="uid://b81k08ofpf2oo" path="res://resource/sprite/role/role0001/idle/Sprite-0003.png" id="2_whsc2"] @@ -14,12 +14,17 @@ [ext_resource type="Texture2D" uid="uid://d32g0f5vk68sj" path="res://resource/sprite/role/role0001/run/Sprite-0004.png" id="12_cbabh"] [ext_resource type="Texture2D" uid="uid://cw83liyy6gnln" path="res://resource/sprite/role/role0001/run/Sprite-0003.png" id="13_u0cmp"] [ext_resource type="Texture2D" uid="uid://b1gh481w2xvsl" path="res://resource/sprite/role/role0001/run/Sprite-0002.png" id="14_nlfq5"] -[ext_resource type="Texture2D" uid="uid://sknj4eflhbvc" path="res://resource/sprite/role/role0001/roll/Sprite-0004.png" id="17_xnddk"] -[ext_resource type="Texture2D" uid="uid://c8ijooj30lvpw" path="res://resource/sprite/role/role0001/roll/Sprite-0005.png" id="18_1doii"] -[ext_resource type="Texture2D" uid="uid://blqx76rvx6c34" path="res://resource/sprite/role/role0001/roll/Sprite-0006.png" id="19_ilt25"] -[ext_resource type="Texture2D" uid="uid://48qebkjqggub" path="res://resource/sprite/role/role0001/roll/Sprite-0007.png" id="20_tp03g"] -[ext_resource type="Texture2D" uid="uid://dvrxriqd6dk1d" path="res://resource/sprite/role/role0001/roll/Sprite-0008.png" id="21_oocqa"] -[ext_resource type="Texture2D" uid="uid://ceqi6d4vhbpt" path="res://resource/sprite/role/role0001/roll/Sprite-0009.png" id="22_yc5ek"] +[ext_resource type="Texture2D" uid="uid://do6ybmo0r04pp" path="res://resource/sprite/role/role0001/roll/Sprite-0010.png" id="17_e31g7"] +[ext_resource type="Texture2D" uid="uid://b3itgraiw7mns" path="res://resource/sprite/role/role0001/roll/Sprite-0011.png" id="18_g0o3y"] +[ext_resource type="Texture2D" uid="uid://cisayo3amq6sv" path="res://resource/sprite/role/role0001/roll/Sprite-0012.png" id="19_s6xfs"] +[ext_resource type="Texture2D" uid="uid://dtndan40ql7ou" path="res://resource/sprite/role/role0001/roll/Sprite-0013.png" id="20_rclf1"] +[ext_resource type="Texture2D" uid="uid://dj30rfk3rndmm" path="res://resource/sprite/role/role0001/roll/Sprite-0014.png" id="21_eyvqg"] +[ext_resource type="Texture2D" uid="uid://b2hdk7nca5rda" path="res://resource/sprite/role/role0001/roll/Sprite-0008.png" id="21_oocqa"] +[ext_resource type="Texture2D" uid="uid://vs7ip3v274e2" path="res://resource/sprite/role/role0001/roll/Sprite-0015.png" id="22_aoq4g"] +[ext_resource type="Texture2D" uid="uid://bmoh16y1r2h1w" path="res://resource/sprite/role/role0001/roll/Sprite-0009.png" id="22_yc5ek"] +[ext_resource type="Texture2D" uid="uid://b7yrbkcy1g56a" path="res://resource/sprite/role/role0001/roll/Sprite-0016.png" id="23_8xesy"] +[ext_resource type="Texture2D" uid="uid://b7s4yf5ic37cd" path="res://resource/sprite/role/role0001/roll/Sprite-0017.png" id="24_83arr"] +[ext_resource type="Texture2D" uid="uid://c0ik1lwfjlr7y" path="res://resource/sprite/role/role0001/roll/Sprite-0018.png" id="25_6hy4b"] [resource] animations = [{ @@ -85,26 +90,41 @@ }, { "frames": [{ "duration": 1.0, -"texture": ExtResource("17_xnddk") -}, { -"duration": 1.0, -"texture": ExtResource("18_1doii") -}, { -"duration": 1.0, -"texture": ExtResource("19_ilt25") -}, { -"duration": 1.0, -"texture": ExtResource("20_tp03g") -}, { -"duration": 1.0, "texture": ExtResource("21_oocqa") }, { "duration": 1.0, "texture": ExtResource("22_yc5ek") +}, { +"duration": 1.0, +"texture": ExtResource("17_e31g7") +}, { +"duration": 1.0, +"texture": ExtResource("18_g0o3y") +}, { +"duration": 1.0, +"texture": ExtResource("19_s6xfs") +}, { +"duration": 1.0, +"texture": ExtResource("20_rclf1") +}, { +"duration": 1.0, +"texture": ExtResource("21_eyvqg") +}, { +"duration": 1.0, +"texture": ExtResource("22_aoq4g") +}, { +"duration": 1.0, +"texture": ExtResource("23_8xesy") +}, { +"duration": 1.0, +"texture": ExtResource("24_83arr") +}, { +"duration": 1.0, +"texture": ExtResource("25_6hy4b") }], "loop": false, "name": &"roll", -"speed": 15.0 +"speed": 18.0 }, { "frames": [{ "duration": 1.0, diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres deleted file mode 100644 index 600ba06..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres +++ /dev/null @@ -1,117 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://cnctpyrn02rhd"] - -[ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_xi6qw"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_jttte"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 0, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ff0sc"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_mf7cn"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_yvk4h"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_pwcj2"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_frwnm"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_201od"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_kteyh"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_huqt3"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6s1ko"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_vq38t"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_2b6x5"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6755u"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 48, 16, 24) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_jttte") -}], -"loop": true, -"name": &"default", -"speed": 5.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_ff0sc") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_mf7cn") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_yvk4h") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_pwcj2") -}], -"loop": true, -"name": &"idle", -"speed": 7.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_frwnm") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_201od") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_kteyh") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_huqt3") -}], -"loop": true, -"name": &"reverseRun", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_6s1ko") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_vq38t") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_2b6x5") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_6755u") -}], -"loop": true, -"name": &"run", -"speed": 10.0 -}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role_tip.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role_tip.tres new file mode 100644 index 0000000..f1a0e7a --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Role_tip.tres @@ -0,0 +1,107 @@ +[gd_resource type="SpriteFrames" load_steps=14 format=3 uid="uid://c8h5svp76h3kw"] + +[ext_resource type="Texture2D" uid="uid://b75k7hefqy3tm" path="res://resource/sprite/role/common/Role_astonished.png" id="1_tbb6m"] +[ext_resource type="Texture2D" uid="uid://6jka6itu76x7" path="res://resource/sprite/role/common/Role_notify.png" id="2_0e3tg"] +[ext_resource type="Texture2D" uid="uid://bda63puujv425" path="res://resource/sprite/role/common/Role_query.png" id="2_70ucj"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_fn2rk"] +atlas = ExtResource("2_0e3tg") +region = Rect2(0, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cofxm"] +atlas = ExtResource("2_0e3tg") +region = Rect2(10, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ml0d0"] +atlas = ExtResource("2_0e3tg") +region = Rect2(20, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_w7tts"] +atlas = ExtResource("2_0e3tg") +region = Rect2(30, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sfnsa"] +atlas = ExtResource("2_0e3tg") +region = Rect2(40, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i8sk2"] +atlas = ExtResource("2_0e3tg") +region = Rect2(50, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_iu1kr"] +atlas = ExtResource("2_0e3tg") +region = Rect2(60, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_men28"] +atlas = ExtResource("2_0e3tg") +region = Rect2(70, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mrwdd"] +atlas = ExtResource("2_0e3tg") +region = Rect2(80, 0, 10, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v47to"] +atlas = ExtResource("2_0e3tg") +region = Rect2(90, 0, 10, 10) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_tbb6m") +}], +"loop": false, +"name": &"astonished", +"speed": 5.0 +}, { +"frames": [], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_fn2rk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cofxm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ml0d0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_w7tts") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sfnsa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i8sk2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_iu1kr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_men28") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mrwdd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v47to") +}, { +"duration": 1.0, +"texture": null +}], +"loop": false, +"name": &"notify", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_70ucj") +}], +"loop": false, +"name": &"query", +"speed": 5.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004.tres index 57dbe94..28f90c2 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004.tres @@ -1,6 +1,7 @@ [gd_resource type="SpriteFrames" load_steps=2 format=3 uid="uid://k2tktysa7j86"] -[ext_resource type="Texture2D" uid="uid://bxhbsq0wb2yo1" path="res://resource/sprite/weapon/knife1.png" id="1_jb24v"] +[ext_resource type="Texture2D" uid="uid://bxhbsq0wb2yo1" path="res://resource/sprite/weapon/weapon0004/Weapon0004.png" id="1_jb24v"] + [resource] animations = [{ diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004_hit.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004_hit.tres new file mode 100644 index 0000000..878be23 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0004_hit.tres @@ -0,0 +1,53 @@ +[gd_resource type="SpriteFrames" load_steps=8 format=3 uid="uid://dj8o7ws03bik4"] + +[ext_resource type="Texture2D" uid="uid://dx07ta0asnmuw" path="res://resource/sprite/weapon/weapon0004/KnifeHit1.png" id="1_0yl3h"] + +[sub_resource type="AtlasTexture" id="1"] +atlas = ExtResource("1_0yl3h") +region = Rect2(0, 0, 64, 68) + +[sub_resource type="AtlasTexture" id="2"] +atlas = ExtResource("1_0yl3h") +region = Rect2(64, 0, 64, 68) + +[sub_resource type="AtlasTexture" id="3"] +atlas = ExtResource("1_0yl3h") +region = Rect2(128, 0, 64, 68) + +[sub_resource type="AtlasTexture" id="4"] +atlas = ExtResource("1_0yl3h") +region = Rect2(192, 0, 64, 68) + +[sub_resource type="AtlasTexture" id="5"] +atlas = ExtResource("1_0yl3h") +region = Rect2(256, 0, 64, 68) + +[sub_resource type="AtlasTexture" id="6"] +atlas = ExtResource("1_0yl3h") +region = Rect2(320, 0, 64, 68) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("1") +}, { +"duration": 1.0, +"texture": SubResource("2") +}, { +"duration": 1.0, +"texture": SubResource("3") +}, { +"duration": 1.0, +"texture": SubResource("4") +}, { +"duration": 1.0, +"texture": SubResource("5") +}, { +"duration": 1.0, +"texture": SubResource("6") +}], +"loop": false, +"name": &"default", +"speed": 30.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres index 1dfc8d7..f6d578c 100644 --- a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres +++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres @@ -148,6 +148,6 @@ "texture": SubResource("AtlasTexture_ol1l8") }], "loop": false, -"name": &"reloading", +"name": &"reloading_frame", "speed": 11.0 }] diff --git a/DungeonShooting_Godot/scene/Main.tscn b/DungeonShooting_Godot/scene/Main.tscn index 080a8f2..346e221 100644 --- a/DungeonShooting_Godot/scene/Main.tscn +++ b/DungeonShooting_Godot/scene/Main.tscn @@ -2,22 +2,10 @@ [ext_resource type="Script" path="res://src/game/GameApplication.cs" id="1_mh1cq"] [ext_resource type="Script" path="res://src/game/camera/GameCamera.cs" id="2_2j367"] +[ext_resource type="Shader" path="res://resource/material/OffsetVertex.gdshader" id="2_fxoum"] -[sub_resource type="Shader" id="1"] -code = "shader_type canvas_item; - -uniform vec2 offset = vec2(0.0 , 0.0); - -void vertex() { - - VERTEX += offset; - -} - -" - -[sub_resource type="ShaderMaterial" id="2"] -shader = SubResource("1") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_pjtkw"] +shader = ExtResource("2_fxoum") shader_parameter/offset = Vector2(0, 0) [node name="Main" type="Node2D" node_paths=PackedStringArray("SubViewport", "SubViewportContainer", "SceneRoot", "GlobalNodeRoot")] @@ -32,12 +20,13 @@ layer = -1 [node name="SubViewportContainer" type="SubViewportContainer" parent="ViewCanvas"] -material = SubResource("2") +material = SubResource("ShaderMaterial_pjtkw") offset_right = 480.0 offset_bottom = 270.0 scale = Vector2(4, 4) [node name="SubViewport" type="SubViewport" parent="ViewCanvas/SubViewportContainer"] +disable_3d = true handle_input_locally = false use_hdr_2d = true canvas_item_default_texture_filter = 0 @@ -47,6 +36,7 @@ [node name="SceneRoot" type="Node2D" parent="ViewCanvas/SubViewportContainer/SubViewport"] [node name="Camera2D" type="Camera2D" parent="ViewCanvas/SubViewportContainer/SubViewport"] +process_callback = 0 editor_draw_drag_margin = true script = ExtResource("2_2j367") diff --git a/DungeonShooting_Godot/scene/World.tscn b/DungeonShooting_Godot/scene/World.tscn index 76eca4e..bead9d8 100644 --- a/DungeonShooting_Godot/scene/World.tscn +++ b/DungeonShooting_Godot/scene/World.tscn @@ -27,28 +27,12 @@ layer_0/name = "Floor" layer_0/z_index = -10 layer_1/name = "Middle" -layer_1/enabled = true -layer_1/modulate = Color(1, 1, 1, 1) -layer_1/y_sort_enabled = false -layer_1/y_sort_origin = 0 -layer_1/z_index = 0 -layer_1/navigation_enabled = true layer_1/tile_data = PackedInt32Array() layer_2/name = "Top" -layer_2/enabled = true -layer_2/modulate = Color(1, 1, 1, 1) -layer_2/y_sort_enabled = false -layer_2/y_sort_origin = 0 layer_2/z_index = 10 -layer_2/navigation_enabled = true layer_2/tile_data = PackedInt32Array() layer_3/name = "AisleFloor" -layer_3/enabled = true -layer_3/modulate = Color(1, 1, 1, 1) -layer_3/y_sort_enabled = false -layer_3/y_sort_origin = 0 layer_3/z_index = -10 -layer_3/navigation_enabled = true layer_3/tile_data = PackedInt32Array() [node name="StaticSpriteRoot" type="Node2D" parent="."] diff --git a/DungeonShooting_Godot/scene/test/TestMask.tscn b/DungeonShooting_Godot/scene/test/TestMask.tscn new file mode 100644 index 0000000..19d360a --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestMask.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cnt6y33q15xfq"] + +[ext_resource type="Script" path="res://src/test/TestMask.cs" id="1_0yip6"] + +[node name="TestMask" type="Node2D" node_paths=PackedStringArray("PolygonNode")] +script = ExtResource("1_0yip6") +PolygonNode = NodePath("Polygon2D") + +[node name="Polygon2D" type="Polygon2D" parent="."] diff --git a/DungeonShooting_Godot/scene/test/TestMask2.tscn b/DungeonShooting_Godot/scene/test/TestMask2.tscn new file mode 100644 index 0000000..a18fde2 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestMask2.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=6 format=3 uid="uid://d2b8jufx70mkl"] + +[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 +scale = Vector2(4, 4) +script = ExtResource("1_rtexh") +Message = NodePath("Message") +Player = NodePath("SubViewport/Player") +Brush1 = ExtResource("2_bgpg8") +Brush2 = ExtResource("3_207p4") +metadata/_edit_horizontal_guides_ = [432.0, 436.0] +metadata/_edit_vertical_guides_ = [864.0, 868.0] + +[node name="SubViewport" type="SubViewport" parent="."] +disable_3d = true +handle_input_locally = false +use_hdr_2d = true +canvas_item_default_texture_filter = 0 +size = Vector2i(480, 270) +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) + +[node name="Player" type="AnimatedSprite2D" parent="SubViewport"] +z_index = 1 +position = Vector2(100, 100) +sprite_frames = ExtResource("7_dqhlh") +animation = &"idle" +offset = Vector2(0, -6) + +[node name="Message" type="Label" parent="."] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 diff --git a/DungeonShooting_Godot/scene/test/TestPerfectPixel.tscn b/DungeonShooting_Godot/scene/test/TestPerfectPixel.tscn new file mode 100644 index 0000000..5e7cd81 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestPerfectPixel.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=4 format=3 uid="uid://x801hit8cj6w"] + +[ext_resource type="Shader" path="res://resource/material/OffsetVertex.gdshader" id="1_8hyja"] +[ext_resource type="PackedScene" uid="uid://b3ybffxcq0kkb" path="res://scene/test/TestPerfectPixelScene.tscn" id="1_l3du1"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_lm6np"] +shader = ExtResource("1_8hyja") +shader_parameter/offset = Vector2(0, 0) + +[node name="TestPerfectPixel" type="SubViewportContainer"] +material = SubResource("ShaderMaterial_lm6np") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -4.0 +offset_top = -4.0 +offset_right = -4.0 +offset_bottom = -4.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(4, 4) + +[node name="SubViewport" type="SubViewport" parent="."] +disable_3d = true +handle_input_locally = false +use_hdr_2d = true +canvas_item_default_texture_filter = 0 +size = Vector2i(482, 272) +render_target_update_mode = 4 + +[node name="TestPerfectPixelScene" parent="SubViewport" node_paths=PackedStringArray("SubViewportContainer") instance=ExtResource("1_l3du1")] +SubViewportContainer = NodePath("../..") diff --git a/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn b/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn new file mode 100644 index 0000000..e8bcfc6 --- /dev/null +++ b/DungeonShooting_Godot/scene/test/TestPerfectPixelScene.tscn @@ -0,0 +1,81 @@ +[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")] +script = ExtResource("1_u6ihh") +Player = NodePath("Root/Player") +FpsLabel = NodePath("CanvasLayer/FPS") +Camera2D = NodePath("Camera2D") +Speed = 150.0 +CameraRecoveryScale = 7.0 +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) + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(0, -1) +rotation = 0.798384 +process_callback = 0 + +[node name="Root" type="Node2D" parent="."] + +[node name="Shell" type="Sprite2D" parent="Root"] +position = Vector2(113, 64) +texture = ExtResource("3_kc4l0") + +[node name="Shell2" type="Sprite2D" parent="Root"] +position = Vector2(150.78, 64.17) +texture = ExtResource("3_kc4l0") + +[node name="Shell3" type="Sprite2D" parent="Root"] +position = Vector2(129.23, 76.25) +rotation = -0.439823 +texture = ExtResource("3_kc4l0") + +[node name="Shell4" type="Sprite2D" parent="Root"] +position = Vector2(145.335, 92.68) +rotation = -3.64425 +texture = ExtResource("3_kc4l0") + +[node name="Shell5" type="Sprite2D" parent="Root"] +position = Vector2(116.22, 94.035) +rotation = 1.66679 +scale = Vector2(1.24, 1.24) +texture = ExtResource("3_kc4l0") + +[node name="Shell6" type="Sprite2D" parent="Root"] +position = Vector2(132.43, 58.21) +rotation = 0.785398 +scale = Vector2(1.265, 1.265) +texture = ExtResource("3_kc4l0") + +[node name="Shell7" type="Sprite2D" parent="Root"] +position = Vector2(169.315, 56.36) +texture = ExtResource("3_kc4l0") + +[node name="Player" type="CharacterBody2D" parent="Root"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Root/Player"] +shape = SubResource("RectangleShape2D_tmsub") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Root/Player"] +sprite_frames = ExtResource("4_6nerw") +animation = &"idle" +autoplay = "idle" + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="FPS" type="Label" parent="CanvasLayer"] +offset_left = 16.0 +offset_top = 11.0 +offset_right = 25.0 +offset_bottom = 51.0 diff --git a/DungeonShooting_Godot/scene/test/TestRoomFog.tscn b/DungeonShooting_Godot/scene/test/TestRoomFog.tscn index 87a0c1e..84daec1 100644 --- a/DungeonShooting_Godot/scene/test/TestRoomFog.tscn +++ b/DungeonShooting_Godot/scene/test/TestRoomFog.tscn @@ -1,8 +1,9 @@ [gd_scene load_steps=3 format=3 uid="uid://bgbjg8virrams"] -[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/effects/common/Smoke.png" id="1_bty2r"] +[ext_resource type="Texture2D" uid="uid://h7hkgbwj1li" path="res://resource/sprite/common/Smoke.png" id="1_bty2r"] [ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="1_d62vx"] + [node name="TestRoomFog" type="Node2D"] [node name="PointLight2D" type="PointLight2D" parent="."] diff --git a/DungeonShooting_Godot/src/config/ExcelConfig.cs b/DungeonShooting_Godot/src/config/ExcelConfig.cs index f9d7eaf..bf3c620 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig.cs @@ -44,6 +44,24 @@ public static Dictionary BulletBase_Map { get; private set; } /// + /// EnemyBase.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 + /// + public static List EnemyBase_List { get; private set; } + /// + /// EnemyBase.xlsx表数据集合, 里 Map 形式存储, key 为 Id + /// + public static Dictionary EnemyBase_Map { get; private set; } + + /// + /// LiquidMaterial.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 + /// + public static List LiquidMaterial_List { get; private set; } + /// + /// LiquidMaterial.xlsx表数据集合, 里 Map 形式存储, key 为 Id + /// + public static Dictionary LiquidMaterial_Map { get; private set; } + + /// /// Sound.xlsx表数据集合, 以 List 形式存储, 数据顺序与 Excel 表相同 /// public static List Sound_List { get; private set; } @@ -75,10 +93,13 @@ _InitActivityMaterialConfig(); _InitAiAttackAttrConfig(); _InitBulletBaseConfig(); + _InitEnemyBaseConfig(); + _InitLiquidMaterialConfig(); _InitSoundConfig(); _InitWeaponBaseConfig(); _InitActivityBaseRef(); + _InitEnemyBaseRef(); _InitWeaponBaseRef(); } private static void _InitActivityBaseConfig() @@ -153,6 +174,42 @@ throw new Exception("初始化表'BulletBase'失败!"); } } + private static void _InitEnemyBaseConfig() + { + try + { + var text = _ReadConfigAsText("res://resource/config/EnemyBase.json"); + EnemyBase_List = new List(JsonSerializer.Deserialize>(text)); + EnemyBase_Map = new Dictionary(); + foreach (var item in EnemyBase_List) + { + EnemyBase_Map.Add(item.Id, item); + } + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化表'EnemyBase'失败!"); + } + } + private static void _InitLiquidMaterialConfig() + { + try + { + var text = _ReadConfigAsText("res://resource/config/LiquidMaterial.json"); + LiquidMaterial_List = JsonSerializer.Deserialize>(text); + LiquidMaterial_Map = new Dictionary(); + foreach (var item in LiquidMaterial_List) + { + LiquidMaterial_Map.Add(item.Id, item); + } + } + catch (Exception e) + { + GD.PrintErr(e.ToString()); + throw new Exception("初始化表'LiquidMaterial'失败!"); + } + } private static void _InitSoundConfig() { try @@ -209,6 +266,25 @@ } } } + 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) diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs index d0d756b..f3fa9c6 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs @@ -26,6 +26,21 @@ public float Friction; /// + /// 重力缩放,如果为0则会关闭重力 + /// + [JsonInclude] + public float GravityScale; + + /// + /// 物体旋转控制类型:
+ /// 0.不受运动影响
+ /// 1.只受水平方向运动速度影响
+ /// 2.受水平和垂直运动方向影响, 可以做迫击炮炮弹的效果 + ///
+ [JsonInclude] + public byte RotationType; + + /// /// 旋转摩擦力 /// [JsonInclude] @@ -62,6 +77,12 @@ public float FallBounceRotation; /// + /// 动态开关碰撞器,在物体高度大于16时是否关闭碰撞检测 + /// + [JsonInclude] + public bool DynamicCollision; + + /// /// 返回浅拷贝出的新对象 /// public ActivityMaterial Clone() @@ -70,12 +91,15 @@ inst.Id = Id; inst.Remark = Remark; inst.Friction = Friction; + inst.GravityScale = GravityScale; + inst.RotationType = RotationType; inst.RotationFriction = RotationFriction; inst.Bounce = Bounce; inst.BounceStrength = BounceStrength; inst.FallBounceStrength = FallBounceStrength; inst.FallBounceSpeed = FallBounceSpeed; inst.FallBounceRotation = FallBounceRotation; + inst.DynamicCollision = DynamicCollision; return inst; } } diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_AiAttackAttr.cs b/DungeonShooting_Godot/src/config/ExcelConfig_AiAttackAttr.cs index 0dceead..c3c734c 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_AiAttackAttr.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_AiAttackAttr.cs @@ -20,6 +20,12 @@ public string Remark; /// + /// 锁定目标时是否站立不动 + /// + [JsonInclude] + public bool LockingStand; + + /// /// 开火时是否站立不动 /// [JsonInclude] @@ -75,6 +81,7 @@ var inst = new AiAttackAttr(); inst.Id = Id; inst.Remark = Remark; + inst.LockingStand = LockingStand; inst.FiringStand = FiringStand; inst.ShowSubline = ShowSubline; inst.LockingTime = LockingTime; diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs index 0f0dcb0..549ed11 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs @@ -50,7 +50,7 @@ /// 格式为[value]或者[min,max] /// [JsonInclude] - public float[] RepelRnage; + public float[] RepelRange; /// /// 子弹偏移角度区间
@@ -84,13 +84,6 @@ public float[] DistanceRange; /// - /// 是否开启重力下坠
- /// 只有Type为1时有效 - ///
- [JsonInclude] - public bool UseGravity; - - /// /// 初始纵轴速度区间
/// 只有Type为1时有效
/// 格式为[value]或者[min,max] @@ -107,10 +100,12 @@ public int[] BounceCount; /// - /// 在还有剩余反弹次数时撞到玩家时是否销毁子弹 + /// 子弹穿透次数区间
+ /// 只有Type为1时有效
+ /// 格式为[value]或者[min,max] ///
[JsonInclude] - public bool StrikeDestroy; + public int[] Penetration; /// /// 返回浅拷贝出的新对象 @@ -123,15 +118,14 @@ inst.Type = Type; inst.Prefab = Prefab; inst.HarmRange = HarmRange; - inst.RepelRnage = RepelRnage; + inst.RepelRange = RepelRange; inst.DeviationAngleRange = DeviationAngleRange; inst.SpeedRange = SpeedRange; inst.LifeTimeRange = LifeTimeRange; inst.DistanceRange = DistanceRange; - inst.UseGravity = UseGravity; inst.VerticalSpeed = VerticalSpeed; inst.BounceCount = BounceCount; - inst.StrikeDestroy = StrikeDestroy; + inst.Penetration = Penetration; return inst; } } diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs new file mode 100644 index 0000000..cedad80 --- /dev/null +++ b/DungeonShooting_Godot/src/config/ExcelConfig_EnemyBase.cs @@ -0,0 +1,94 @@ +using System.Text.Json.Serialization; +using System.Collections.Generic; + +namespace Config; + +public static partial class ExcelConfig +{ + public class EnemyBase + { + /// + /// 表Id + /// + [JsonInclude] + public string Id; + + /// + /// 绑定的ActivityBase表数据 + /// + public ActivityBase Activity; + + /// + /// 备注 + /// + [JsonInclude] + public string Remark; + + /// + /// 移动速度 + /// + [JsonInclude] + public float MoveSpeed; + + /// + /// 移动加速度 + /// + [JsonInclude] + public float Acceleration; + + /// + /// 移动摩擦力, 仅用于人物基础移动 + /// + [JsonInclude] + public float Friction; + + /// + /// 是否可以拾起武器 + /// + [JsonInclude] + public bool CanPickUpWeapon; + + /// + /// 视野半径, 单位像素, 发现玩家后改视野范围可以穿墙 + /// + [JsonInclude] + public float ViewRange; + + /// + /// 发现玩家后跟随玩家的视野半径 + /// + [JsonInclude] + public float TailAfterViewRange; + + /// + /// 背后的视野半径, 单位像素 + /// + [JsonInclude] + public float BackViewRange; + + /// + /// 返回浅拷贝出的新对象 + /// + public EnemyBase Clone() + { + var inst = new EnemyBase(); + inst.Id = Id; + inst.Activity = Activity; + inst.Remark = Remark; + inst.MoveSpeed = MoveSpeed; + inst.Acceleration = Acceleration; + inst.Friction = Friction; + inst.CanPickUpWeapon = CanPickUpWeapon; + inst.ViewRange = ViewRange; + inst.TailAfterViewRange = TailAfterViewRange; + inst.BackViewRange = BackViewRange; + return inst; + } + } + private class Ref_EnemyBase : EnemyBase + { + [JsonInclude] + public string __Activity; + + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_LiquidMaterial.cs b/DungeonShooting_Godot/src/config/ExcelConfig_LiquidMaterial.cs new file mode 100644 index 0000000..9fd52d3 --- /dev/null +++ b/DungeonShooting_Godot/src/config/ExcelConfig_LiquidMaterial.cs @@ -0,0 +1,62 @@ +using System.Text.Json.Serialization; +using System.Collections.Generic; + +namespace Config; + +public static partial class ExcelConfig +{ + public class LiquidMaterial + { + /// + /// 表Id + /// + [JsonInclude] + public string Id; + + /// + /// 备注 + /// + [JsonInclude] + public string Remark; + + /// + /// 笔刷贴图 + /// + [JsonInclude] + public string BrushTexture; + + /// + /// 补帧间距倍率(0-1) + /// + [JsonInclude] + public float Ffm; + + /// + /// 开始消退时间,单位秒
+ /// 小于0则永远不会消退 + ///
+ [JsonInclude] + public float Duration; + + /// + /// 消退速度, 也就是 Alpha 值每秒变化的速度 + /// + [JsonInclude] + public float WriteOffSpeed; + + /// + /// 返回浅拷贝出的新对象 + /// + public LiquidMaterial Clone() + { + var inst = new LiquidMaterial(); + inst.Id = Id; + inst.Remark = Remark; + inst.BrushTexture = BrushTexture; + inst.Ffm = Ffm; + inst.Duration = Duration; + inst.WriteOffSpeed = WriteOffSpeed; + return inst; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs index e45f05e..e3de8cf 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_WeaponBase.cs @@ -14,17 +14,17 @@ public string Id; /// - /// 属性绑定武器的Id,这个id时ActivityBase表Id,如果是Ai使用的数据, 则填空字符串串 - /// - public ActivityBase Activity; - - /// /// 备注 /// [JsonInclude] public string Remark; /// + /// 属性绑定武器的Id,这个id时ActivityBase表Id,如果是Ai使用的数据, 则填空字符串串 + /// + public ActivityBase Activity; + + /// /// 重量 /// [JsonInclude] @@ -40,6 +40,12 @@ public byte WeightType; /// + /// 标记是否是近战武器 + /// + [JsonInclude] + public bool IsMelee; + + /// /// 是否连续发射, 如果为false, 则每次发射都需要扣动扳机 /// [JsonInclude] @@ -167,6 +173,12 @@ public float FiringSpeedBackSpeed; /// + /// 松开扳机后射速消散开始时间, 单位: 秒 + /// + [JsonInclude] + public float FiringSpeedBackTime; + + /// /// 单次开火发射子弹数量区间
/// 格式为[value]或者[min,max] ///
@@ -298,7 +310,7 @@ /// 格式为[value]或者[min,max] ///
[JsonInclude] - public float[] MeleeAttackRepelRnage; + public float[] MeleeAttackRepelRange; /// /// 射击音效 @@ -375,10 +387,11 @@ { var inst = new WeaponBase(); inst.Id = Id; - inst.Activity = Activity; inst.Remark = Remark; + inst.Activity = Activity; inst.Weight = Weight; inst.WeightType = WeightType; + inst.IsMelee = IsMelee; inst.ContinuousShoot = ContinuousShoot; inst.AmmoCapacity = AmmoCapacity; inst.MaxAmmoCapacity = MaxAmmoCapacity; @@ -400,6 +413,7 @@ inst.FinalFiringSpeed = FinalFiringSpeed; inst.FiringSpeedAddSpeed = FiringSpeedAddSpeed; inst.FiringSpeedBackSpeed = FiringSpeedBackSpeed; + inst.FiringSpeedBackTime = FiringSpeedBackTime; inst.FireBulletCountRange = FireBulletCountRange; inst.DelayedTime = DelayedTime; inst.StartScatteringRange = StartScatteringRange; @@ -421,7 +435,7 @@ inst.ThrowCollisionSize = ThrowCollisionSize; inst.CanMeleeAttack = CanMeleeAttack; inst.MeleeAttackHarmRange = MeleeAttackHarmRange; - inst.MeleeAttackRepelRnage = MeleeAttackRepelRnage; + inst.MeleeAttackRepelRange = MeleeAttackRepelRange; inst.ShootSound = ShootSound; inst.BeginReloadSound = BeginReloadSound; inst.BeginReloadSoundDelayTime = BeginReloadSoundDelayTime; diff --git a/DungeonShooting_Godot/src/framework/Grid.cs b/DungeonShooting_Godot/src/framework/Grid.cs deleted file mode 100644 index ec37b93..0000000 --- a/DungeonShooting_Godot/src/framework/Grid.cs +++ /dev/null @@ -1,206 +0,0 @@ - -using System.Collections.Generic; -using Godot; - -/// -/// 网格数据结构, 通过 x 和 y 存储数据 -/// -public class Grid -{ - /// - /// 遍历网格数据回调 - /// - public delegate void EachGridCallback(int x, int y, T data); - - private readonly Dictionary> _map = new Dictionary>(); - - /// - /// 返回指定xy位置是否存在数据 - /// - public bool Contains(int x, int y) - { - if (_map.TryGetValue(x, out var value)) - { - return value.ContainsKey(y); - } - - return false; - } - - /// - /// 返回指定xy位置是否有数据 - /// - public bool Contains(Vector2I pos) - { - return Contains(pos.X, pos.Y); - } - - /// - /// 设置指定xy位置的数据 - /// - public void Set(int x, int y, T data) - { - if (_map.TryGetValue(x, out var value)) - { - value[y] = data; - } - else - { - value = new Dictionary(); - value.Add(y, data); - _map.Add(x, value); - } - } - - /// - /// 设置指定坐标的数据 - /// - public void Set(Vector2I pos, T data) - { - Set(pos.X, pos.Y, data); - } - - /// - /// 获取指定xy位置的数据 - /// - public T Get(int x, int y) - { - if (_map.TryGetValue(x, out var value)) - { - if (value.TryGetValue(y, out var v)) - { - return v; - } - } - - return default; - } - - /// - /// 获取指定坐标的数据 - /// - public T Get(Vector2I pos) - { - return Get(pos.X, pos.Y); - } - - /// - /// 移除指定xy位置存储的数据 - /// - public bool Remove(int x, int y) - { - if (_map.TryGetValue(x, out var value)) - { - return value.Remove(y); - } - - return false; - } - - /// - /// 往一个区域中填充指定的数据 - /// - /// 起点位置 - /// 区域大小 - /// 数据 - public void SetRect(Vector2I pos, Vector2I size, T data) - { - var x = pos.X; - var y = pos.Y; - for (var i = 0; i < size.X; i++) - { - for (var j = 0; j < size.Y; j++) - { - if (_map.TryGetValue(x + i, out var value)) - { - value[y + j] = data; - } - else - { - value = new Dictionary(); - value.Add(y + j, data); - _map.Add(x + i, value); - } - } - } - } - - /// - /// 移除指定区域数据 - /// - /// 起点位置 - /// 区域大小 - public void RemoveRect(Vector2I pos, Vector2I size) - { - var x = pos.X; - var y = pos.Y; - for (var i = 0; i < size.X; i++) - { - for (var j = 0; j < size.Y; j++) - { - if (_map.TryGetValue(x + i, out var value)) - { - value.Remove(y + j); - if (value.Count == 0) - { - _map.Remove(x + i); - } - } - } - } - } - - /// - /// 清除所有数据 - /// - public void Clear() - { - _map.Clear(); - } - - /// - /// 检测矩形区域内是否与其他数据有碰撞 - /// - /// 起点位置 - /// 区域大小 - public bool RectCollision(Vector2I pos, Vector2I size) - { - var x = pos.X; - var y = pos.Y; - var w = size.X; - var h = size.Y; - //先判断四个角 - if (Contains(x, y) || Contains(x + w - 1, y) || Contains(x, y + h - 1) || Contains(x + w - 1, y + h - 1)) - { - return true; - } - - //逐个点判断 - for (int i = 1; i < w; i++) - { - for (int j = 0; j < h; j++) - { - if (Contains(x + i, y + j)) - { - return true; - } - } - } - - return false; - } - - /// - /// 遍历网格数据 - /// - public void ForEach(EachGridCallback cb) - { - foreach (var pair1 in _map) - { - foreach (var pair2 in pair1.Value) - { - cb(pair1.Key, pair2.Key, pair2.Value); - } - } - } -} diff --git a/DungeonShooting_Godot/src/framework/InfiniteGrid.cs b/DungeonShooting_Godot/src/framework/InfiniteGrid.cs new file mode 100644 index 0000000..09b986f --- /dev/null +++ b/DungeonShooting_Godot/src/framework/InfiniteGrid.cs @@ -0,0 +1,206 @@ + +using System.Collections.Generic; +using Godot; + +/// +/// 无限大的网格数据结构, 通过 x 和 y 存储数据 +/// +public class InfiniteGrid +{ + /// + /// 遍历网格数据回调 + /// + public delegate void EachGridCallback(int x, int y, T data); + + private readonly Dictionary> _map = new Dictionary>(); + + /// + /// 返回指定xy位置是否存在数据 + /// + public bool Contains(int x, int y) + { + if (_map.TryGetValue(x, out var value)) + { + return value.ContainsKey(y); + } + + return false; + } + + /// + /// 返回指定xy位置是否有数据 + /// + public bool Contains(Vector2I pos) + { + return Contains(pos.X, pos.Y); + } + + /// + /// 设置指定xy位置的数据 + /// + public void Set(int x, int y, T data) + { + if (_map.TryGetValue(x, out var value)) + { + value[y] = data; + } + else + { + value = new Dictionary(); + value.Add(y, data); + _map.Add(x, value); + } + } + + /// + /// 设置指定坐标的数据 + /// + public void Set(Vector2I pos, T data) + { + Set(pos.X, pos.Y, data); + } + + /// + /// 获取指定xy位置的数据 + /// + public T Get(int x, int y) + { + if (_map.TryGetValue(x, out var value)) + { + if (value.TryGetValue(y, out var v)) + { + return v; + } + } + + return default; + } + + /// + /// 获取指定坐标的数据 + /// + public T Get(Vector2I pos) + { + return Get(pos.X, pos.Y); + } + + /// + /// 移除指定xy位置存储的数据 + /// + public bool Remove(int x, int y) + { + if (_map.TryGetValue(x, out var value)) + { + return value.Remove(y); + } + + return false; + } + + /// + /// 往一个区域中填充指定的数据 + /// + /// 起点位置 + /// 区域大小 + /// 数据 + public void SetRect(Vector2I pos, Vector2I size, T data) + { + var x = pos.X; + var y = pos.Y; + for (var i = 0; i < size.X; i++) + { + for (var j = 0; j < size.Y; j++) + { + if (_map.TryGetValue(x + i, out var value)) + { + value[y + j] = data; + } + else + { + value = new Dictionary(); + value.Add(y + j, data); + _map.Add(x + i, value); + } + } + } + } + + /// + /// 移除指定区域数据 + /// + /// 起点位置 + /// 区域大小 + public void RemoveRect(Vector2I pos, Vector2I size) + { + var x = pos.X; + var y = pos.Y; + for (var i = 0; i < size.X; i++) + { + for (var j = 0; j < size.Y; j++) + { + if (_map.TryGetValue(x + i, out var value)) + { + value.Remove(y + j); + if (value.Count == 0) + { + _map.Remove(x + i); + } + } + } + } + } + + /// + /// 清除所有数据 + /// + public void Clear() + { + _map.Clear(); + } + + /// + /// 检测矩形区域内是否与其他数据有碰撞 + /// + /// 起点位置 + /// 区域大小 + public bool RectCollision(Vector2I pos, Vector2I size) + { + var x = pos.X; + var y = pos.Y; + var w = size.X; + var h = size.Y; + //先判断四个角 + if (Contains(x, y) || Contains(x + w - 1, y) || Contains(x, y + h - 1) || Contains(x + w - 1, y + h - 1)) + { + return true; + } + + //逐个点判断 + for (int i = 1; i < w; i++) + { + for (int j = 0; j < h; j++) + { + if (Contains(x + i, y + j)) + { + return true; + } + } + } + + return false; + } + + /// + /// 遍历网格数据 + /// + public void ForEach(EachGridCallback cb) + { + foreach (var pair1 in _map) + { + foreach (var pair2 in pair1.Value) + { + cb(pair1.Key, pair2.Key, pair2.Value); + } + } + } +} diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index b077a48..e5d9cd2 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -10,7 +10,8 @@ /// 该类提供基础物体运动模拟, 互动接口, 自定义组件, 协程等功能
/// ActivityObject 子类实例化请不要直接使用 new, 而用该在类上标上 [Tool], 并在 ActivityObject.xlsx 配置文件中注册物体, 导出配置表后使用 ActivityObject.Create(id) 来创建实例.
///
-public abstract partial class ActivityObject : CharacterBody2D, IDestroy, ICoroutine +[Tool] +public partial class ActivityObject : CharacterBody2D, IDestroy, ICoroutine { /// /// 是否是调试模式 @@ -18,9 +19,14 @@ public static bool IsDebug { get; set; } /// + /// 实例唯一 Id + /// + public long Id { get; set; } + + /// /// 当前物体对应的配置数据, 如果不是通过 ActivityObject.Create() 函数创建出来的对象那么 ItemConfig 为 null /// - public ExcelConfig.ActivityBase ItemConfig { get; private set; } + public ExcelConfig.ActivityBase ActivityBase { get; private set; } /// /// 是否是静态物体, 如果为true, 则会禁用移动处理 @@ -68,6 +74,7 @@ /// /// 阴影偏移 /// + [Export] public Vector2 ShadowOffset { get; protected set; } = new Vector2(0, 2); /// @@ -121,7 +128,7 @@ /// /// 是否正在投抛过程中 /// - public bool IsThrowing => _throwForce != null && !_isFallOver; + public bool IsThrowing => VerticalSpeed != 0 && !_isFallOver; /// /// 当前物体的海拔高度, 如果大于0, 则会做自由落体运动, 也就是执行投抛逻辑 @@ -163,11 +170,6 @@ /// 是否启用垂直方向上的运动模拟, 默认开启, 如果禁用, 那么下落和投抛效果, 同样 Throw() 函数也将失效 /// public bool EnableVerticalMotion { get; set; } = true; - - /// - /// 撞到墙壁反弹时是否锁定旋转角度, 如果为 false, 则反弹后将直接修改旋转角度 - /// - public bool BounceLockRotation { get; set; } = true; /// /// 是否启用物体更新行为, 默认 true, 如果禁用, 则会停止当前物体的 Process(), PhysicsProcess() 调用, 并且禁用 Collision 节点, 禁用后所有组件也同样被禁用行为 @@ -215,21 +217,11 @@ /// public bool ShowOutline { - get => _showOutline; + get => _blendShaderMaterial == null ? false : _blendShaderMaterial.GetShaderParameter(_shader_show_outline).AsBool(); set { - if (_blendShaderMaterial != null) - { - if (value != _showOutline) - { - _blendShaderMaterial.SetShaderParameter("show_outline", value); - if (_shadowBlendShaderMaterial != null) - { - _shadowBlendShaderMaterial.SetShaderParameter("show_outline", value); - } - _showOutline = value; - } - } + _blendShaderMaterial?.SetShaderParameter(_shader_show_outline, value); + _shadowBlendShaderMaterial?.SetShaderParameter(_shader_show_outline, value); } } @@ -238,33 +230,36 @@ /// public Color OutlineColor { - get - { - if (!_initOutlineColor) - { - _initOutlineColor = true; - if (_blendShaderMaterial != null) - { - _outlineColor = _blendShaderMaterial.GetShaderParameter("outline_color").AsColor(); - } - } - - return _outlineColor; - } - set - { - _initOutlineColor = true; - if (value != _outlineColor) - { - _blendShaderMaterial.SetShaderParameter("outline_color", value); - } - - _outlineColor = value; - } + get => _blendShaderMaterial == null ? Colors.Black : _blendShaderMaterial.GetShaderParameter(_shader_outline_color).AsColor(); + set => _blendShaderMaterial?.SetShaderParameter(_shader_outline_color, value); } + /// + /// 灰度 + /// + public float Grey + { + get => _blendShaderMaterial == null ? 0 : _blendShaderMaterial.GetShaderParameter(_shader_grey).AsSingle(); + set => _blendShaderMaterial?.SetShaderParameter(_shader_grey, value); + } + + /// + /// 是否是自定义阴影纹理 + /// + public bool IsCustomShadowSprite { get; private set; } + + /// + /// 记录绘制液体的笔刷上一次绘制的位置
+ /// 每次调用 DrawLiquid() 后都会记录这一次绘制的位置, 记录这个位置用作执行补间操作, 但是一旦停止绘制了, 需要手动清理记录的位置, 也就是将 BrushPrevPosition 置为 null + ///
+ public Vector2I? BrushPrevPosition { get; set; } + // -------------------------------------------------------------------------------- + private static readonly StringName _shader_grey = "grey"; + private static readonly StringName _shader_outline_color = "outline_color"; + private static readonly StringName _shader_show_outline = "show_outline"; + //是否正在调用组件 Update 函数 private bool _updatingComp = false; //组件集合 @@ -272,7 +267,7 @@ //修改的组件集合, value 为 true 表示添加组件, false 表示移除组件 private readonly List> _changeComponents = new List>(); //上一帧动画名称 - private string _prevAnimation; + private StringName _prevAnimation; //上一帧动画 private int _prevAnimationFrame; @@ -321,17 +316,13 @@ private bool _processingBecomesStaticImage = false; + //击退外力 + private ExternalForce _repelForce; + // -------------------------------------------------------------------------------- //实例索引 private static long _instanceIndex = 0; - - //是否启用描边 - private bool _showOutline = false; - - //描边颜色 - private bool _initOutlineColor = false; - private Color _outlineColor = new Color(0, 0, 0, 1); //冻结显示的Sprite private FreezeSprite _freezeSprite; @@ -356,23 +347,34 @@ { ActivityMaterial = config.Material; } + + //GravityScale 为 0 时关闭重力 + if (ActivityMaterial.GravityScale == 0) + { + EnableVerticalMotion = false; + } World = world; - ItemConfig = config; + ActivityBase = config; +#if TOOLS Name = GetType().Name + (_instanceIndex++); +#endif + Id = _instanceIndex; + _blendShaderMaterial = AnimatedSprite.Material as ShaderMaterial; - _shadowBlendShaderMaterial = ShadowSprite.Material as ShaderMaterial; - if (_blendShaderMaterial != null) + IsCustomShadowSprite = ShadowSprite.Texture != null; + if (!IsCustomShadowSprite) //没有自定义阴影纹理 { - _showOutline = _blendShaderMaterial.GetShaderParameter("show_outline").AsBool(); + _shadowBlendShaderMaterial = ShadowSprite.Material as ShaderMaterial; + if (_shadowBlendShaderMaterial != null && _blendShaderMaterial != null) + { + var value = _blendShaderMaterial.GetShaderParameter(_shader_show_outline); + _shadowBlendShaderMaterial.SetShaderParameter(_shader_show_outline, value); + } + + ShadowSprite.Visible = false; } - if (_shadowBlendShaderMaterial != null) - { - _shadowBlendShaderMaterial.SetShaderParameter("show_outline", _showOutline); - } - - ShadowSprite.Visible = false; MotionMode = MotionModeEnum.Floating; MoveController = AddComponent(); IsStatic = config.IsStatic; @@ -386,7 +388,7 @@ { } - + /// /// 子类需要重写 _EnterTree() 函数, 请重写 EnterTree() /// @@ -423,21 +425,24 @@ ///
public void ShowShadowSprite() { - var anim = AnimatedSprite.Animation; - - var frame = AnimatedSprite.Frame; - if (_prevAnimation != anim || _prevAnimationFrame != frame) + if (!IsCustomShadowSprite) { - var frames = AnimatedSprite.SpriteFrames; - if (frames != null && frames.HasAnimation(anim)) + var anim = AnimatedSprite.Animation; + + var frame = AnimatedSprite.Frame; + if (_prevAnimation != anim || _prevAnimationFrame != frame) { - //切换阴影动画 - ShadowSprite.Texture = frames.GetFrameTexture(anim, frame); + var frames = AnimatedSprite.SpriteFrames; + if (frames != null && frames.HasAnimation(anim)) + { + //切换阴影动画 + ShadowSprite.Texture = frames.GetFrameTexture(anim, frame); + } } - } - _prevAnimation = anim; - _prevAnimationFrame = frame; + _prevAnimation = anim; + _prevAnimationFrame = frame; + } IsShowShadow = true; CalcShadowTransform(); @@ -500,13 +505,12 @@ public virtual void OnInit() { } - + /// /// 进入场景树时调用 /// public virtual void EnterTree() { - } /// @@ -514,7 +518,6 @@ /// public virtual void ExitTree() { - } /// @@ -658,10 +661,12 @@ { if (parent != null) { - parent.RemoveChild(this); + Reparent(root); } - - this.AddToActivityRoot(layer); + else + { + root.AddChild(this); + } } if (showShadow) @@ -836,7 +841,7 @@ for (int i = 0; i < _components.Count; i++) { var temp = _components[i]; - if (temp.Key == type) + if (temp.Key.IsAssignableTo(type)) { return temp.Value; } @@ -847,7 +852,7 @@ for (var i = 0; i < _changeComponents.Count; i++) { var temp = _components[i]; - if (temp.Value.GetType() == type) + if (temp.Value.GetType().IsAssignableTo(type)) { return temp.Value; } @@ -862,17 +867,96 @@ /// public T GetComponent() where T : Component { - var component = GetComponent(typeof(T)); - if (component == null) return null; - return (T)component; + for (int i = 0; i < _components.Count; i++) + { + var temp = _components[i]; + if (temp.Value is T component) + { + return component; + } + } + + if (_updatingComp) + { + for (var i = 0; i < _changeComponents.Count; i++) + { + var temp = _components[i]; + if (temp.Value is T component) + { + return component; + } + } + } + + return null; } /// + /// 根据类型获取所有相同类型的组件 + /// + public Component[] GetComponents(Type type) + { + var list = new List(); + for (int i = 0; i < _components.Count; i++) + { + var temp = _components[i]; + if (temp.Key.IsAssignableTo(type)) + { + list.Add(temp.Value); + } + } + + if (_updatingComp) + { + for (var i = 0; i < _changeComponents.Count; i++) + { + var temp = _components[i]; + if (temp.Value.GetType().IsAssignableTo(type)) + { + list.Add(temp.Value); + } + } + } + + return list.ToArray(); + } + + /// + /// 根据类型获取所有相同类型的组件 + /// + public T[] GetComponents() where T : Component + { + var list = new List(); + for (int i = 0; i < _components.Count; i++) + { + var temp = _components[i]; + if (temp.Value is T component) + { + list.Add(component); + } + } + + if (_updatingComp) + { + for (var i = 0; i < _changeComponents.Count; i++) + { + var temp = _components[i]; + if (temp.Value is T component) + { + list.Add(component); + } + } + } + + return list.ToArray(); + } + + /// /// 设置混色材质的颜色 /// public void SetBlendColor(Color color) { - _blendShaderMaterial.SetShaderParameter("blend", color); + _blendShaderMaterial?.SetShaderParameter("blend", color); } /// @@ -880,6 +964,10 @@ /// public Color GetBlendColor() { + if (_blendShaderMaterial == null) + { + return Colors.White; + } return _blendShaderMaterial.GetShaderParameter("blend").AsColor(); } @@ -888,7 +976,7 @@ ///
public void SetBlendSchedule(float value) { - _blendShaderMaterial.SetShaderParameter("schedule", value); + _blendShaderMaterial?.SetShaderParameter("schedule", value); } /// @@ -896,6 +984,10 @@ /// public float GetBlendSchedule() { + if (_blendShaderMaterial == null) + { + return default; + } return _blendShaderMaterial.GetShaderParameter("schedule").AsSingle(); } @@ -904,8 +996,8 @@ ///
public void SetBlendModulate(Color color) { - _blendShaderMaterial.SetShaderParameter("modulate", color); - _shadowBlendShaderMaterial.SetShaderParameter("modulate", color); + _blendShaderMaterial?.SetShaderParameter("modulate", color); + _shadowBlendShaderMaterial?.SetShaderParameter("modulate", color); } /// @@ -913,6 +1005,10 @@ /// public Color SetBlendModulate() { + if (_blendShaderMaterial == null) + { + return Colors.White; + } return _blendShaderMaterial.GetShaderParameter("modulate").AsColor(); } @@ -975,15 +1071,15 @@ { if (_playHitSchedule < 0.05f) { - _blendShaderMaterial.SetShaderParameter("schedule", 1); + _blendShaderMaterial?.SetShaderParameter("schedule", 1); } else if (_playHitSchedule < 0.15f) { - _blendShaderMaterial.SetShaderParameter("schedule", Mathf.Lerp(1, 0, (_playHitSchedule - 0.05f) / 0.1f)); + _blendShaderMaterial?.SetShaderParameter("schedule", Mathf.Lerp(1, 0, (_playHitSchedule - 0.05f) / 0.1f)); } if (_playHitSchedule >= 0.15f) { - _blendShaderMaterial.SetShaderParameter("schedule", 0); + _blendShaderMaterial?.SetShaderParameter("schedule", 0); _playHitSchedule = 0; _playHit = false; } @@ -1024,9 +1120,9 @@ var ysp = VerticalSpeed; _altitude += VerticalSpeed * delta; - _verticalSpeed -= GameConfig.G * delta; + _verticalSpeed -= GameConfig.G * ActivityMaterial.GravityScale * delta; - //当高度大于16时, 显示在所有物体上 + //当高度大于16时, 显示在所有物体上, 并且关闭碰撞 if (Altitude >= 16) { AnimatedSprite.ZIndex = 20; @@ -1035,6 +1131,11 @@ { AnimatedSprite.ZIndex = 0; } + //动态开关碰撞器 + if (ActivityMaterial.DynamicCollision) + { + Collision.Disabled = Altitude >= 16; + } //达到最高点 if (ysp > 0 && ysp * VerticalSpeed < 0) @@ -1119,17 +1220,20 @@ // 阴影 if (ShadowSprite.Visible) { - //更新阴影贴图, 使其和动画一致 - var anim = AnimatedSprite.Animation; - var frame = AnimatedSprite.Frame; - if (_prevAnimation != anim || _prevAnimationFrame != frame) + if (!IsCustomShadowSprite) { - //切换阴影动画 - ShadowSprite.Texture = AnimatedSprite.SpriteFrames.GetFrameTexture(anim, AnimatedSprite.Frame); - } + //更新阴影贴图, 使其和动画一致 + var anim = AnimatedSprite.Animation; + var frame = AnimatedSprite.Frame; + if (_prevAnimation != anim || _prevAnimationFrame != frame) + { + //切换阴影动画 + ShadowSprite.Texture = AnimatedSprite.SpriteFrames.GetFrameTexture(anim, AnimatedSprite.Frame); + } - _prevAnimation = anim; - _prevAnimationFrame = frame; + _prevAnimation = anim; + _prevAnimationFrame = frame; + } if (_freezeSprite == null || !_freezeSprite.IsFrozen) { @@ -1248,6 +1352,12 @@ ///
public void CalcShadowTransform() { + //偏移 + if (!IsCustomShadowSprite) + { + ShadowSprite.Offset = AnimatedSprite.Offset; + } + //缩放 ShadowSprite.Scale = AnimatedSprite.Scale; //阴影角度 @@ -1598,7 +1708,7 @@ _processingBecomesStaticImage = true; EnableBehavior = false; var roomInfo = AffiliationArea.RoomInfo; - var position = roomInfo.ToImageCanvasPosition(GlobalPosition); + var position = roomInfo.ToCanvasPosition(GlobalPosition); roomInfo.StaticImageCanvas.DrawActivityObjectInCanvas(this, position.X, position.Y, () => { Destroy(); @@ -1636,4 +1746,110 @@ } _freezeSprite.Unfreeze(); } + + /// + /// 获取中心点坐标 + /// + public Vector2 GetCenterPosition() + { + return AnimatedSprite.Position + Position; + } + + /// + /// 设置物体朝向 + /// + public void SetFace(FaceDirection face) + { + if ((face == FaceDirection.Left && Scale.X > 0) || (face == FaceDirection.Right && Scale.X < 0)) + { + Scale *= new Vector2(-1, 1); + } + } + + /// + /// 添加一个击退力 + /// + public void AddRepelForce(Vector2 velocity) + { + if (_repelForce == null) + { + _repelForce = new ExternalForce(ForceNames.Repel); + } + + //不在 MoveController 中 + if (_repelForce.MoveController == null) + { + _repelForce.Velocity = velocity; + MoveController.AddForce(_repelForce); + } + else + { + _repelForce.Velocity += velocity; + } + } + + /// + /// 获取击退力 + /// + public Vector2 GetRepelForce() + { + if (_repelForce == null || _repelForce.MoveController == null) + { + return Vector2.Zero; + } + + return _repelForce.Velocity; + } + + /// + /// 根据笔刷 id 在该物体位置绘制液体, 该 id 为 LiquidMaterial 表的 id
+ /// 需要清除记录的点就请将 BrushPrevPosition 置为 null + ///
+ public void DrawLiquid(string brushId) + { + if (AffiliationArea != null) + { + DrawLiquid(LiquidBrushManager.GetBrush(brushId)); + } + } + + /// + /// 根据笔刷数据在该物体位置绘制液体
+ /// 需要清除记录的点就请将 BrushPrevPosition 置为 null + ///
+ public void DrawLiquid(BrushImageData brush) + { + if (AffiliationArea != null) + { + var pos = AffiliationArea.RoomInfo.LiquidCanvas.ToLiquidCanvasPosition(Position); + AffiliationArea.RoomInfo.LiquidCanvas.DrawBrush(brush, BrushPrevPosition, pos, 0); + BrushPrevPosition = pos; + } + } + + /// + /// 根据笔刷 id 在该物体位置绘制液体, 该 id 为 LiquidMaterial 表的 id
+ /// 需要清除记录的点就请将 BrushPrevPosition 置为 null + ///
+ public void DrawLiquid(string brushId, Vector2I offset) + { + if (AffiliationArea != null) + { + DrawLiquid(LiquidBrushManager.GetBrush(brushId), offset); + } + } + + /// + /// 根据笔刷数据在该物体位置绘制液体
+ /// 需要清除记录的点就请将 BrushPrevPosition 置为 null + ///
+ public void DrawLiquid(BrushImageData brush, Vector2I offset) + { + if (AffiliationArea != null) + { + var pos = AffiliationArea.RoomInfo.LiquidCanvas.ToLiquidCanvasPosition(Position) + offset; + AffiliationArea.RoomInfo.LiquidCanvas.DrawBrush(brush, BrushPrevPosition, pos, 0); + BrushPrevPosition = pos; + } + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs index 69f87b8..cace31a 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_EditorTool.cs @@ -1,4 +1,5 @@ + using System; using System.Collections.Generic; using System.Reflection; @@ -25,12 +26,13 @@ sprite.ZIndex = -1; } - if (sprite.Material == null) + if (sprite.Texture == null && sprite.Material == null) //没有自定义纹理的情况下自动补全阴影材质 { var material = ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.ResourceLocalToScene = true; material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); - material.SetShaderParameter("schedule", 1); + material.SetShaderParameter("schedule", 1f); material.SetShaderParameter("modulate", new Color(1, 1, 1, 1)); sprite.Material = material; } @@ -43,6 +45,7 @@ { var material = ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.ResourceLocalToScene = true; material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); material.SetShaderParameter("schedule", 0); material.SetShaderParameter("modulate", new Color(1, 1, 1, 1)); diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs index 8372962..79056c5 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject_Init.cs @@ -19,6 +19,11 @@ /// public const string Id_enemy0001 = "enemy0001"; /// + /// 名称: 敌人2
+ /// 简介: 敌人2 + ///
+ public const string Id_enemy0002 = "enemy0002"; + /// /// 名称: 步枪
/// 简介: ///
@@ -84,6 +89,11 @@ /// public const string Id_bullet0004 = "bullet0004"; /// + /// 名称: 抛物线粘液子弹
+ /// 简介: + ///
+ public const string Id_bullet0005 = "bullet0005"; + /// /// 名称:
/// 简介: ///
@@ -105,9 +115,14 @@ public const string Id_shell0004 = "shell0004"; /// /// 名称:
- /// 简介: 敌人死亡碎片 + /// 简介: 敌人1死亡碎片 ///
- public const string Id_effect0001 = "effect0001"; + public const string Id_enemy_dead0001 = "enemy_dead0001"; + /// + /// 名称:
+ /// 简介: 敌人2死亡 + ///
+ public const string Id_enemy_dead0002 = "enemy_dead0002"; /// /// 名称: 鞋子
/// 简介: 提高移动速度 @@ -155,10 +170,30 @@ public const string Id_prop0009 = "prop0009"; /// /// 名称: 分裂子弹
- /// 简介: 子弹数量翻倍, 但是精准度和伤害降低 + /// 简介: 子弹数量翻倍, 但是精准度, 击退和伤害降低 ///
public const string Id_prop0010 = "prop0010"; /// + /// 名称: 弹射子弹
+ /// 简介: 子弹反弹次数+2 + ///
+ public const string Id_prop0011 = "prop0011"; + /// + /// 名称: 穿透子弹
+ /// 简介: 子弹穿透+1 + ///
+ public const string Id_prop0012 = "prop0012"; + /// + /// 名称: 武器背包
+ /// 简介: 武器容量+1 + ///
+ public const string Id_prop0013 = "prop0013"; + /// + /// 名称: 道具背包
+ /// 简介: 道具容量+1 + ///
+ public const string Id_prop0014 = "prop0014"; + /// /// 名称: 医药箱
/// 简介: 使用后回复一颗红心 ///
diff --git a/DungeonShooting_Godot/src/framework/activity/Component.cs b/DungeonShooting_Godot/src/framework/activity/Component.cs index a33d5e2..e8fa947 100644 --- a/DungeonShooting_Godot/src/framework/activity/Component.cs +++ b/DungeonShooting_Godot/src/framework/activity/Component.cs @@ -169,7 +169,6 @@ /// /// 如果启用了组件, 则每帧会调用一次 Process /// - /// public virtual void Process(float delta) { } @@ -177,7 +176,6 @@ /// /// 如果启用了组件, 则每物理帧会调用一次 PhysicsProcess /// - /// public virtual void PhysicsProcess(float delta) { } @@ -245,6 +243,16 @@ return Master.GetComponent(type); } + public T[] GetComponents() where T : Component, new() + { + return Master.GetComponents(); + } + + public Component[] GetComponents(Type type) + { + return Master.GetComponents(type); + } + public void RemoveComponent(Component component) { Master.RemoveComponent(component); diff --git a/DungeonShooting_Godot/src/framework/activity/ExternalForce.cs b/DungeonShooting_Godot/src/framework/activity/ExternalForce.cs index fee637c..4f06156 100644 --- a/DungeonShooting_Godot/src/framework/activity/ExternalForce.cs +++ b/DungeonShooting_Godot/src/framework/activity/ExternalForce.cs @@ -7,6 +7,11 @@ public class ExternalForce { /// + /// 所在的移动控制器 + /// + public MoveController MoveController { get; set; } + + /// /// 当前力的名称 /// public string Name { get; } diff --git a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs index 5575a61..ef0f435 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs @@ -210,6 +210,7 @@ public T AddForce(T force) where T : ExternalForce { RemoveForce(force.Name); + force.MoveController = this; _forceList.Add(force); return force; } @@ -223,6 +224,7 @@ { if (_forceList[i].Name == name) { + _forceList[i].MoveController = null; _forceList.RemoveAt(i); return; } @@ -276,6 +278,11 @@ ///
public void ClearForce() { + foreach (var force in _forceList) + { + force.MoveController = null; + } + _forceList.Clear(); } @@ -305,6 +312,7 @@ //自动销毁 if (CheckAutoDestroy(force)) { + force.MoveController = null; _forceList.Remove(force); externalForces[i] = null; } @@ -347,54 +355,69 @@ //新速度 var newVelocity = Master.Velocity; - if (!Master.BounceLockRotation) //跟着反弹角度 - { - Rotation = newVelocity.Angle(); - } - if (newVelocity.X == 0f && _basisVelocity.X * finallyVelocity.X > 0) - { - _basisVelocity.X = 0; - } - - if (newVelocity.Y == 0f && _basisVelocity.Y * finallyVelocity.Y > 0) - { - _basisVelocity.Y = 0; - } + // if (newVelocity.X == 0f && _basisVelocity.X * finallyVelocity.X > 0) + // { + // _basisVelocity.X = 0; + // } + // + // if (newVelocity.Y == 0f && _basisVelocity.Y * finallyVelocity.Y > 0) + // { + // _basisVelocity.Y = 0; + // } //是否撞到物体 KinematicCollision2D collision; - _flag -= delta; + _flag--; if (_flag <= 0 && (collision = Master.GetLastSlideCollision()) != null) //执行反弹操作 { //调用移动碰撞函数 Master.OnMoveCollision(collision); - if (Master.IsDestroyed) + if (Master.IsDestroyed || (Master is IPoolItem poolItem && poolItem.IsRecycled)) { return; } - //0.1秒内不能再触发第二次碰撞检测 - _flag = 0.1f; + //2帧内不能再触发第二次碰撞检测 + _flag = 2; var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f); newVelocity = finallyEf.Reflect(no); var rotation = newVelocity.Angle(); - if (!Master.BounceLockRotation) //跟着反弹角度 + 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; - var v = newVelocity / (length / Master.ActivityMaterial.BounceStrength); - for (var i = 0; i < _forceList.Count; i++) + if (length != 0) { - _forceList[i].Velocity = v; + var v = newVelocity / (length / Master.ActivityMaterial.BounceStrength); + for (var i = 0; i < _forceList.Count; i++) + { + _forceList[i].Velocity = v; + } } + //调用反弹函数 Master.OnBounce(rotation); } else //没有撞到物体 { + if (Master.ActivityMaterial.RotationType == 1) //跟着反弹角度 + { + Rotation = newVelocity.Angle(); + } + else if (Master.ActivityMaterial.RotationType == 2) //跟着反弹角度, 带垂直角度 + { + var rotation = Rotation = newVelocity.Angle(); + AnimatedSprite.Rotation = new Vector2(newVelocity.X, newVelocity.Y - Master.VerticalSpeed).Angle() - rotation; + } + //调整外力速率 for (var i = 0; i < _forceList.Count; i++) { diff --git a/DungeonShooting_Godot/src/framework/activity/components/StateBase.cs b/DungeonShooting_Godot/src/framework/activity/components/StateBase.cs index ce71a11..42a8e57 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/StateBase.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/StateBase.cs @@ -49,15 +49,6 @@ } /// - /// 是否允许切换至下一个状态, 该函数由状态机控制器调用, 不需要手动调用 - /// - /// 下一个状态类型 - public virtual bool CanChangeState(S next) - { - return true; - } - - /// /// 从当前状态退出时调用 /// /// 下一个状态类型 diff --git a/DungeonShooting_Godot/src/framework/activity/components/StateController.cs b/DungeonShooting_Godot/src/framework/activity/components/StateController.cs index bb1bbd8..942dd5f 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/StateController.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/StateController.cs @@ -5,7 +5,7 @@ /// /// 对象状态机控制器 /// -public class StateController : Component where T : ActivityObject where S : Enum +public class StateController : Component where T : ActivityObject where S : Enum { /// /// 获取当前状态 @@ -60,7 +60,7 @@ return; } - stateBase.Master = Master as T; + stateBase.Master = Master; stateBase.StateController = this; _states.Add(stateBase.State, stateBase); } @@ -133,8 +133,9 @@ CurrStateBase = newState; newState.Enter(default, arg); } - else if (CurrStateBase.CanChangeState(next)) + else { + // Debug.Log($"changeState: {CurrState} => {next}"); _isChangeState = !late; var prev = CurrStateBase.State; CurrStateBase.Exit(next); diff --git a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs index 6fd42c4..11acb6f 100644 --- a/DungeonShooting_Godot/src/framework/common/SeedRandom.cs +++ b/DungeonShooting_Godot/src/framework/common/SeedRandom.cs @@ -188,4 +188,81 @@ return RandomRangeInt(0, weightList.Length - 1); } + + /// + /// 返回指定区域内的随机坐标点, 该函数比较慢, 请谨慎调用 + /// + /// 碰撞区域数据 + /// 需要随机点的数量 + public Vector2[] GetRandomPositionInPolygon(List polygonDataList, int 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) + { + if (navigationPolygonData.Type == NavigationPolygonType.Out) + { + outCount++; + } + foreach (var vertex in navigationPolygonData.GetPoints()) + { + 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); + } + } + } + + var list = new List(); + while (true) + { + var flag = outCount == 0; + var point = new Vector2(RandomRangeInt(minX, maxX), RandomRangeInt(minY, maxY)); + + foreach (var navigationPolygonData in polygonDataList) + { + if (navigationPolygonData.Type == NavigationPolygonType.Out) + { + if (!flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point)) + { + flag = true; + } + } + else + { + if (flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point)) + { + flag = false; + } + } + } + + if (flag) + { + list.Add(point); + if (list.Count >= count) + { + return list.ToArray(); + } + } + } + } } \ 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 d139167..b102450 100644 --- a/DungeonShooting_Godot/src/framework/common/Utils.cs +++ b/DungeonShooting_Godot/src/framework/common/Utils.cs @@ -261,4 +261,49 @@ return point; } + + /// + /// 将 point 位置限制在 anchor 的周围, 最大距离为 distance, 并返回新的位置 + /// + public static Vector2 ConstrainDistance(Vector2 point, Vector2 anchor, float distance) + { + return (point - anchor).Normalized() * distance + anchor; + } + + /// + /// 返回一个点是否在 Polygon 内部 + /// + /// 多边形顶点 + /// 目标点 + public static bool IsPointInPolygon(Vector2[] polygon, Vector2 point) + { + var isInside = false; + for (int i = 0, j = polygon.Length - 1; i < polygon.Length; 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; + } + + /// + /// 根据法线翻转向量 + /// + public static Vector2 ReflectByNormal(Vector2 vector, Vector2 normal) + { + return vector.Reflect(normal.Rotated(Mathf.Pi * 0.5f)); + } + + /// + /// 根据法线翻转角度, 弧度制 + /// + public static float ReflectByNormal(float rotation, Vector2 normal) + { + return ReflectByNormal(Vector2.FromAngle(rotation), normal).Angle(); + } } \ 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 18371c0..d902fe9 100644 --- a/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs +++ b/DungeonShooting_Godot/src/framework/coroutine/ProxyCoroutineHandler.cs @@ -23,7 +23,7 @@ for (var i = 0; i < pairs.Length; i++) { var item = pairs[i]; - try + //try { var canNext = true; @@ -131,11 +131,11 @@ } } } - catch (Exception e) - { - Debug.LogError("执行协程发生异常: \n" + e); - ProxyStopCoroutine(ref coroutineList, item.Id); - } + // catch (Exception e) + // { + // Debug.LogError("执行协程发生异常: \n" + e); + // ProxyStopCoroutine(ref coroutineList, item.Id); + // } } } diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs index fe66f00..d943e6a 100644 --- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs +++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs @@ -90,7 +90,7 @@ //如果是玩家 if (activityObject == Player.Current) { - OnPlayerInsertRoom(); + CallDeferred(nameof(OnPlayerInsertRoom)); } } @@ -114,7 +114,7 @@ { return _includeItems.Count; } - + /// /// 统计符合条件的数量 /// @@ -224,6 +224,37 @@ return false; } + + /// + /// 遍历该该区域的物体 + /// + /// 操作函数, 返回 false 表示跳出循环 + public void ForEachIncludeItems(Func handler) + { + foreach (var activityObject in _includeItems) + { + if (!activityObject.IsDestroyed && handler(activityObject)) + { + return; + } + } + } + + /// + /// 遍历该进入该区域的物体 + /// + /// 操作函数, 返回 false 表示跳出循环 + public void ForEachEnterItems(Func handler) + { + foreach (var activityObject in _enterItems) + { + if (!activityObject.IsDestroyed && handler(activityObject)) + { + return; + } + } + } + /// /// 返回物体是否进入了该区域 @@ -238,8 +269,7 @@ if (body is ActivityObject activityObject) { _enterItems.Add(activityObject); - //注意需要延时调用 - CallDeferred(nameof(InsertItem), activityObject); + InsertItem(activityObject); } } @@ -261,7 +291,6 @@ EventManager.EmitEvent(EventEnum.OnPlayerEnterRoom, RoomInfo); IsFirstEnterFlag = false; } - public void Destroy() { diff --git a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs index ff9605b..a8e5533 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs @@ -35,7 +35,7 @@ private SeedRandom _random; //用于标记地图上的坐标是否被占用 - private Grid _roomGrid { get; } = new Grid(); + private InfiniteGrid _roomGrid { get; } = new InfiniteGrid(); //当前房间数量 private int _count = 0; @@ -63,8 +63,8 @@ //区域限制 private bool _enableLimitRange = true; - private int _rangeX = 200; - private int _rangeY = 200; + private int _rangeX = 120; + private int _rangeY = 120; //找房间失败次数, 过大则会关闭区域限制 private int _maxFailCount = 10; @@ -273,8 +273,11 @@ Debug.Log("超出区域失败次数: " + _failCount); if (_failCount >= _maxFailCount) { - _enableLimitRange = false; - Debug.Log("生成房间失败次数过多, 关闭区域限制!"); + //_enableLimitRange = false; + _failCount = 0; + _rangeX += 50; + _rangeY += 50; + Debug.Log("生成房间失败次数过多, 增大区域"); } } } diff --git a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs index cd1414f..643a556 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs @@ -28,6 +28,8 @@ //生成导航的结果 private GenerateNavigationResult _generateNavigationResult; + private InfiniteGrid _tempAisleFloorGrid = new InfiniteGrid(); + public DungeonTileMap(TileMap tileRoot) { _tileRoot = tileRoot; @@ -74,12 +76,39 @@ } else { - //var rectSize = roomInfo.RoomSplit.RoomInfo.Size; var rectPos = roomInfo.RoomSplit.RoomInfo.Position.AsVector2I(); - //var offset = roomInfo.GetOffsetPosition() / GameConfig.TileCellSizeVector2I; - - //填充tile操作 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) { @@ -114,7 +143,20 @@ _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) //编辑器模式, 指定预设 { @@ -133,8 +175,7 @@ preinstallInfo = roomInfo.RoomSplit.Preinstall[index]; } } - - + var roomPreinstall = new RoomPreinstall(roomInfo, preinstallInfo); roomInfo.RoomPreinstall = roomPreinstall; //执行预处理操作 @@ -149,6 +190,7 @@ { continue; } + //普通的直线连接 var doorDir1 = doorInfo.Direction; var doorDir2 = doorInfo.ConnectDoor.Direction; @@ -340,6 +382,34 @@ break; } } + + //先计算范围 + 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(); } } @@ -427,7 +497,12 @@ { for (int j = 0; j < size.Y; j++) { - _tileRoot.SetCell(layer, new Vector2I((int)pos.X + i, (int)pos.Y + j), 0, info.AutoTileCoord); + 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); } } } @@ -439,7 +514,12 @@ { for (int j = 0; j < size.Y; j++) { - _tileRoot.SetCell(layer, new Vector2I((int)pos.X + i, (int)pos.Y + j), 0); + 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); } } } diff --git a/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs b/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs index 3712c8b..308968e 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/AisleFogArea.cs @@ -66,29 +66,18 @@ if (body == Player.Current) { //注意需要延时调用 - CallDeferred(nameof(InsertItem)); + CallDeferred(nameof(InsertPlayer)); } } - - // private void OnBodyExited(Node2D body) - // { - // if (body == Player.Current) - // { - // //注意需要延时调用 - // CallDeferred(nameof(LeavePlayer)); - // } - // } - private void InsertItem() + private void InsertPlayer() { //Debug.Log("玩家进入过道"); - //RoomDoorInfo.ClearFog(); + if (!RoomDoorInfo.AisleFogMask.IsExplored) + { + EventManager.EmitEvent(EventEnum.OnPlayerFirstEnterAisle, RoomDoorInfo); + } + EventManager.EmitEvent(EventEnum.OnPlayerEnterAisle, RoomDoorInfo); FogMaskHandler.RefreshAisleFog(RoomDoorInfo); } - - // private void LeavePlayer() - // { - // //Debug.Log("玩家离开过道"); - // //RoomDoorInfo.DarkFog(); - // } } \ 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 cfa21e4..bff2c40 100644 --- a/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs +++ b/DungeonShooting_Godot/src/framework/map/fog/FogMaskHandler.cs @@ -51,7 +51,7 @@ { if (_prevRoomInfo != roomInfo) { - Debug.Log($"切换房间: {_prevRoomInfo?.Id} => {roomInfo.Id}"); + //Debug.Log($"切换房间: {_prevRoomInfo?.Id} => {roomInfo.Id}"); if (_prevRoomInfo != null) { //房间变暗 @@ -88,7 +88,7 @@ _prevRoomInfo = roomInfo; } - Debug.Log("RefreshRoomFog: " + roomInfo.Id); + //Debug.Log("RefreshRoomFog: " + roomInfo.Id); var fogMask = roomInfo.RoomFogMask; if (!fogMask.IsExplored) //未探索该区域 @@ -96,6 +96,9 @@ fogMask.IsExplored = true; fogMask.TransitionAlpha(0, 1); + //小地图亮起该房间 + roomInfo.PreviewSprite.Visible = true; + //刷新预览区域 foreach (var roomInfoDoor in roomInfo.Doors) { @@ -108,7 +111,7 @@ //显示预览过道 roomInfoDoor.PreviewRoomFogMask.SetActive(false); roomInfoDoor.PreviewAisleFogMask.SetActive(true); - roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(1); + roomInfoDoor.PreviewAisleFogMask.TransitionAlpha(0, 1); } } } @@ -136,12 +139,15 @@ private static void _RefreshAisleFog(RoomDoorInfo doorInfo) { - Debug.Log("RefreshAisleFog: " + doorInfo.RoomInfo.Id + doorInfo.Direction); + //Debug.Log("RefreshAisleFog: " + doorInfo.RoomInfo.Id + doorInfo.Direction); var fogMask = doorInfo.AisleFogMask; var connectDoor = doorInfo.ConnectDoor; if (!fogMask.IsExplored) //未探索该区域 { + //小地图亮起该过道 + doorInfo.AislePreviewSprite.Visible = true; + fogMask.IsExplored = true; doorInfo.PreviewAisleFogMask.IsExplored = true; doorInfo.PreviewRoomFogMask.IsExplored = true; diff --git a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs index 32ea79f..64a6675 100644 --- a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs +++ b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs @@ -176,7 +176,7 @@ List callDrawingCompleteList = null; using (var image = _viewportTexture.GetImage()) { - var startTime = DateTime.Now; + var startTime = DateTime.UtcNow; //File.WriteAllBytes("d:/image.png", image.SavePngToBuffer()); //绘制完成需要调用回调的列表 do @@ -210,9 +210,9 @@ ReclaimRenderSprite(item.RenderSprite); item.RenderSprite = null; } - } while (_drawingQueueItems.Count > 0 && (DateTime.Now - startTime).TotalMilliseconds < step1Time); + } while (_drawingQueueItems.Count > 0 && (DateTime.UtcNow - startTime).TotalMilliseconds < step1Time); - //Debug.Log($"当前帧绘制完成数量: {index}, 绘制队列数量: {_drawingQueueItems.Count}, 用时: {(DateTime.Now - startTime).TotalMilliseconds}毫秒"); + //Debug.Log($"当前帧绘制完成数量: {index}, 绘制队列数量: {_drawingQueueItems.Count}, 用时: {(DateTime.UtcNow - startTime).TotalMilliseconds}毫秒"); } //重绘画布 @@ -240,7 +240,7 @@ //处理下一批image if (_queueItems.Count > 0) { - var startTime = DateTime.Now; + var startTime = DateTime.UtcNow; var hasFail = false; //执行绘制操作 for (var i = 0; i < _queueItems.Count; i++) @@ -270,13 +270,13 @@ } //计算超时 - if ((DateTime.Now - startTime).TotalMilliseconds >= step2Time) + if ((DateTime.UtcNow - startTime).TotalMilliseconds >= step2Time) { break; } } - //Debug.Log($"当前帧进入绘制绘队列数量: {index}, 待绘制队列数量: {_queueItems.Count}, 绘制队列数量: {_drawingQueueItems.Count}, 用时: {(DateTime.Now - startTime).TotalMilliseconds}毫秒"); + //Debug.Log($"当前帧进入绘制绘队列数量: {index}, 待绘制队列数量: {_queueItems.Count}, 绘制队列数量: {_drawingQueueItems.Count}, 用时: {(DateTime.UtcNow - startTime).TotalMilliseconds}毫秒"); } } diff --git a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs index 8eeb2bb..e3ab686 100644 --- a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs +++ b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs @@ -11,7 +11,7 @@ public bool IsDestroyed { get; private set; } private readonly List> _list = new List>(); - private readonly Grid> _grid = new Grid>(); + private readonly InfiniteGrid> _grid = new InfiniteGrid>(); private readonly RoomInfo _roomInfo; //网格划分的格子大小 private readonly Vector2I _step; @@ -112,6 +112,12 @@ } } + /// + /// 获取指定圆形范围内所有已经被冻结的物体 + /// + /// 圆形中心点坐标 + /// 圆形半径 + /// 是否解冻物体 public List CollisionCircle(Vector2 position, float radius, bool unfreeze = false) { var len = radius * radius; diff --git a/DungeonShooting_Godot/src/framework/map/liquid/BrushImageData.cs b/DungeonShooting_Godot/src/framework/map/liquid/BrushImageData.cs new file mode 100644 index 0000000..3c1f4d0 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/liquid/BrushImageData.cs @@ -0,0 +1,124 @@ +using System; +using Godot; +using System.Collections.Generic; +using Config; + +/// +/// 液体笔刷数据 +/// +public class BrushImageData +{ + /// + /// 笔刷宽度 + /// + public int Width; + /// + /// 笔刷高度 + /// + public int Height; + /// + /// 笔刷所有有效像素点 + /// + public BrushPixelData[] Pixels; + + //有效像素范围 + public int PixelMinX = int.MaxValue; + public int PixelMinY = int.MaxValue; + public int PixelMaxX; + public int PixelMaxY; + + /// + /// 有效像素宽度 + /// + public int PixelWidth; + /// + /// 有效像素高度 + /// + public int PixelHeight; + /// + /// 笔刷材质 + /// + public ExcelConfig.LiquidMaterial Material; + + private static readonly Dictionary _imageData = new Dictionary(); + + public BrushImageData(ExcelConfig.LiquidMaterial material) + { + Material = material; + var image = GetImageData(material.BrushTexture); + var list = new List(); + var width = image.GetWidth(); + var height = image.GetHeight(); + var flag = false; + for (var x = 0; x < width; x++) + { + for (var y = 0; y < height; y++) + { + var pixel = image.GetPixel(x, y); + if (pixel.A > 0) + { + flag = true; + list.Add(new BrushPixelData() + { + X = x, + Y = y, + Color = pixel, + Material = material + }); + if (x < PixelMinX) + { + PixelMinX = x; + } + else if (x > PixelMaxX) + { + PixelMaxX = x; + } + + if (y < PixelMinY) + { + PixelMinY = y; + } + else if (y > PixelMaxY) + { + PixelMaxY = y; + } + } + } + } + + if (!flag) + { + throw new Exception("不能使用完全透明的图片作为笔刷!"); + } + + Pixels = list.ToArray(); + Width = width; + Height = height; + + PixelWidth = PixelMaxX - PixelMinX; + PixelHeight = PixelMaxY - PixelMinY; + } + + private static Image GetImageData(string path) + { + if (!_imageData.TryGetValue(path, out var image)) + { + var texture = ResourceManager.LoadTexture2D(path); + image = texture.GetImage(); + } + + return image; + } + + /// + /// 清除笔刷缓存数据 + /// + public static void ClearBrushData() + { + foreach (var keyValuePair in _imageData) + { + keyValuePair.Value.Dispose(); + } + _imageData.Clear(); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/liquid/BrushPixelData.cs b/DungeonShooting_Godot/src/framework/map/liquid/BrushPixelData.cs new file mode 100644 index 0000000..7535fe5 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/liquid/BrushPixelData.cs @@ -0,0 +1,25 @@ +using Config; +using Godot; + +/// +/// 用于记录笔刷上的像素点 +/// +public class BrushPixelData +{ + /// + /// x 坐标 + /// + public int X; + /// + /// y 坐标 + /// + public int Y; + /// + /// 像素颜色 + /// + public Color Color; + /// + /// 材质液体材质 + /// + public ExcelConfig.LiquidMaterial Material; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs b/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs new file mode 100644 index 0000000..75550b7 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/liquid/LiquidCanvas.cs @@ -0,0 +1,419 @@ + +using System; +using System.Collections.Generic; +using Godot; + +/// +/// 液体画布 +/// +public partial class LiquidCanvas : Sprite2D, IDestroy +{ + /// + /// 程序每帧最多等待执行时间, 超过这个时间的像素点将交到下一帧执行, 单位: 毫秒 + /// + public static float MaxWaitTime { get; set; } = 4f; + + /// + /// 画布缩放 + /// + public static int CanvasScale { get; } = 4; + + /// + /// 画布每秒更新频率 + /// + public static int UpdateFps { get; set; } = 30; + + public bool IsDestroyed { get; private set; } + + private Image _image; + private ImageTexture _texture; + + //画布上的像素点 + private LiquidPixel[,] _imagePixels; + //需要执行更新的像素点 + private List _updateImagePixels = new List(); + //画布已经运行的时间 + private float _runTime = 0; + private int _executeIndex = -1; + //用于记录补间操作下有变动的像素点 + private List _tempList = new List(); + //记录是否有像素点发生变动 + private bool _changeFlag = false; + //所属房间 + private RoomInfo _roomInfo; + private double _processTimer; + + public LiquidCanvas(RoomInfo roomInfo, int width, int height) + { + _roomInfo = roomInfo; + Centered = false; + Material = ResourceManager.Load(ResourcePath.resource_material_Sawtooth_tres); + + _image = Image.Create(width, height, false, Image.Format.Rgba8); + _texture = ImageTexture.CreateFromImage(_image); + Texture = _texture; + _imagePixels = new LiquidPixel[width, height]; + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + QueueFree(); + _texture.Dispose(); + _image.Dispose(); + } + + public override void _Process(double delta) + { + //这里待优化, 应该每次绘制都将像素点放入 _tempList 中, 然后帧结束再统一提交 + + _processTimer += delta; + if (_processTimer < 1d / UpdateFps) + { + return; + } + + var newDelta = _processTimer; + _processTimer %= 1d / UpdateFps; + + //更新消除逻辑 + if (_updateImagePixels.Count > 0) + { + var startIndex = _executeIndex; + if (_executeIndex < 0 || _executeIndex >= _updateImagePixels.Count) + { + _executeIndex = _updateImagePixels.Count - 1; + } + + var startTime = DateTime.UtcNow; + var isOver = false; + var index = 0; + for (; _executeIndex >= 0; _executeIndex--) + { + index++; + var imagePixel = _updateImagePixels[_executeIndex]; + if (UpdateImagePixel(imagePixel)) //移除 + { + _updateImagePixels.RemoveAt(_executeIndex); + if (_executeIndex < startIndex) + { + startIndex--; + } + } + + if (index > 200) + { + index = 0; + if ((DateTime.UtcNow - startTime).TotalMilliseconds > MaxWaitTime) //超过最大执行时间 + { + isOver = true; + break; + } + } + } + + if (!isOver && startIndex >= 0 && _executeIndex < 0) + { + _executeIndex = _updateImagePixels.Count - 1; + for (; _executeIndex >= startIndex; _executeIndex--) + { + index++; + var imagePixel = _updateImagePixels[_executeIndex]; + if (UpdateImagePixel(imagePixel)) //移除 + { + _updateImagePixels.RemoveAt(_executeIndex); + } + + if (index > 200) + { + index = 0; + if ((DateTime.UtcNow - startTime).TotalMilliseconds > MaxWaitTime) //超过最大执行时间 + { + break; + } + } + } + } + } + + if (_changeFlag) + { + _texture.Update(_image); + _changeFlag = false; + } + + _runTime += (float)newDelta; + } + + /// + /// 将画布外的坐标转为画布内的坐标 + /// + public Vector2I ToLiquidCanvasPosition(Vector2 position) + { + return (_roomInfo.ToCanvasPosition(position) / CanvasScale).AsVector2I(); + } + + /// + /// 根据画笔数据在画布上绘制液体, 转换坐标请调用 ToLiquidCanvasPosition() 函数 + /// + /// 画笔数据 + /// 绘制坐标, 相对于画布坐标 + public void DrawBrush(BrushImageData brush, Vector2I position) + { + DrawBrush(brush, null, position, 0); + } + + /// + /// 根据画笔数据在画布上绘制液体, 转换坐标请调用 ToLiquidCanvasPosition() 函数 + /// + /// 画笔数据 + /// 绘制坐标, 相对于画布坐标 + /// 旋转角度, 弧度制 + public void DrawBrush(BrushImageData brush, Vector2I position, float rotation) + { + DrawBrush(brush, null, position, rotation); + } + + /// + /// 根据画笔数据在画布上绘制液体, 转换坐标请调用 ToLiquidCanvasPosition() 函数 + /// + /// 画笔数据 + /// 上一帧坐标, 相对于画布坐标, 改参数用于两点距离较大时执行补间操作, 如果传 null, 则不会进行补间 + /// 绘制坐标, 相对于画布坐标 + /// 旋转角度, 弧度制 + public void DrawBrush(BrushImageData brush, Vector2I? prevPosition, Vector2I position, float rotation) + { + var center = new Vector2I(brush.Width, brush.Height) / 2; + var pos = position - center; + var canvasWidth = _texture.GetWidth(); + var canvasHeight = _texture.GetHeight(); + //存在上一次记录的点 + if (prevPosition != null) + { + var offset = new Vector2(position.X - prevPosition.Value.X, position.Y - prevPosition.Value.Y); + var maxL = brush.Material.Ffm * Mathf.Lerp( + brush.PixelHeight, + brush.PixelWidth, + Mathf.Abs(Mathf.Sin(offset.Angle() - rotation + Mathf.Pi * 0.5f)) + ); + var len = offset.Length(); + if (len > maxL) //距离太大了, 需要补间 + { + //Debug.Log($"距离太大了, 启用补间: len: {len}, maxL: {maxL}"); + var count = Mathf.CeilToInt(len / maxL); + var step = new Vector2(offset.X / count, offset.Y / count); + var prevPos = prevPosition.Value - center; + + for (var i = 1; i <= count; i++) + { + foreach (var brushPixel in brush.Pixels) + { + var brushPos = RotatePixels(brushPixel.X, brushPixel.Y, center.X, center.Y, rotation); + var x = (int)(prevPos.X + step.X * i + brushPos.X); + var y = (int)(prevPos.Y + step.Y * i + brushPos.Y); + if (x >= 0 && x < canvasWidth && y >= 0 && y < canvasHeight) + { + var temp = SetPixelData(x, y, brushPixel); + if (!temp.TempFlag) + { + temp.TempFlag = true; + _tempList.Add(temp); + } + } + } + } + + foreach (var brushPixel in brush.Pixels) + { + var brushPos = RotatePixels(brushPixel.X, brushPixel.Y, center.X, center.Y, rotation); + var x = pos.X + brushPos.X; + var y = pos.Y + brushPos.Y; + if (x >= 0 && x < canvasWidth && y >= 0 && y < canvasHeight) + { + var temp = SetPixelData(x, y, brushPixel); + if (!temp.TempFlag) + { + temp.TempFlag = true; + _tempList.Add(temp); + } + } + } + + foreach (var imagePixel in _tempList) + { + _changeFlag = true; + _image.SetPixel(imagePixel.X, imagePixel.Y, imagePixel.Color); + imagePixel.TempFlag = false; + } + + _tempList.Clear(); + return; + } + } + + foreach (var brushPixel in brush.Pixels) + { + var brushPos = RotatePixels(brushPixel.X, brushPixel.Y, center.X, center.Y, rotation); + var x = pos.X + brushPos.X; + var y = pos.Y + brushPos.Y; + if (x >= 0 && x < canvasWidth && y >= 0 && y < canvasHeight) + { + _changeFlag = true; + var temp = SetPixelData(x, y, brushPixel); + _image.SetPixel(x, y, temp.Color); + } + } + } + + /// + /// 返回是否碰到任何有效像素点 + /// + public bool Collision(int x, int y) + { + if (x >= 0 && x < _imagePixels.GetLength(0) && y >= 0 && y < _imagePixels.GetLength(1)) + { + var result = _imagePixels[x, y]; + if (result != null && result.IsRun) + { + return true; + } + } + return false; + } + + /// + /// 返回碰撞到的有效像素点数据 + /// + public LiquidPixel GetPixelData(int x, int y) + { + if (x >= 0 && x < _imagePixels.GetLength(0) && y >= 0 && y < _imagePixels.GetLength(1)) + { + var result = _imagePixels[x, y]; + if (result != null && result.IsRun) + { + return result; + } + } + + return null; + } + + /// + /// 更新像素点数据逻辑, 返回是否擦除 + /// + private bool UpdateImagePixel(LiquidPixel imagePixel) + { + if (imagePixel.Color.A > 0) + { + if (imagePixel.Timer > 0) //继续等待消散 + { + imagePixel.Timer -= _runTime - imagePixel.TempTime; + imagePixel.TempTime = _runTime; + } + else + { + imagePixel.Color.A -= imagePixel.Material.WriteOffSpeed * (_runTime - imagePixel.TempTime); + + if (imagePixel.Color.A <= 0) //完全透明了 + { + _changeFlag = true; + _image.SetPixel(imagePixel.X, imagePixel.Y, new Color(0, 0, 0, 0)); + imagePixel.IsRun = false; + imagePixel.IsUpdate = false; + return true; + } + else + { + _changeFlag = true; + _image.SetPixel(imagePixel.X, imagePixel.Y, imagePixel.Color); + imagePixel.TempTime = _runTime; + } + } + } + + return false; + } + + //记录像素点数据 + private LiquidPixel SetPixelData(int x, int y, BrushPixelData pixelData) + { + var temp = _imagePixels[x, y]; + if (temp == null) + { + temp = new LiquidPixel() + { + X = x, + Y = y, + Color = pixelData.Color, + Material = pixelData.Material, + Timer = pixelData.Material.Duration, + }; + _imagePixels[x, y] = temp; + + temp.IsRun = true; + temp.IsUpdate = temp.Material.Duration >= 0; + if (temp.IsUpdate) + { + _updateImagePixels.Add(temp); + } + temp.TempTime = _runTime; + } + else + { + if (temp.Material != pixelData.Material) + { + temp.Color = pixelData.Color; + temp.Material = pixelData.Material; + } + else + { + var tempColor = pixelData.Color; + temp.Color = new Color(tempColor.R, tempColor.G, tempColor.B, Mathf.Max(temp.Color.A, tempColor.A)); + } + + temp.Timer = pixelData.Material.Duration; + + var prevUpdate = temp.IsUpdate; + temp.IsUpdate = temp.Material.Duration >= 0; + if (!prevUpdate && temp.IsUpdate) + { + _updateImagePixels.Add(temp); + } + else if (prevUpdate && !temp.IsUpdate) + { + _updateImagePixels.Remove(temp); + } + + temp.IsRun = true; + temp.TempTime = _runTime; + } + + return temp; + } + + /// + /// 根据 rotation 旋转像素点坐标, 并返回旋转后的坐标, rotation 为弧度制角度, 旋转中心点为 centerX, centerY + /// + private Vector2I RotatePixels(int x, int y, int centerX, int centerY, float rotation) + { + if (rotation == 0) + { + return new Vector2I(x, y); + } + + x -= centerX; + y -= centerY; + var sv = Mathf.Sin(rotation); + var cv = Mathf.Cos(rotation); + var newX = Mathf.RoundToInt(x * cv - y * sv); + var newY = Mathf.RoundToInt(x * sv + y * cv); + newX += centerX; + newY += centerY; + return new Vector2I(newX, newY); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/liquid/LiquidPixel.cs b/DungeonShooting_Godot/src/framework/map/liquid/LiquidPixel.cs new file mode 100644 index 0000000..318b627 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/liquid/LiquidPixel.cs @@ -0,0 +1,47 @@ + + +using Config; +using Godot; + +/// +/// 液体画布上的像素点 +/// +public class LiquidPixel +{ + /// + /// x 坐标 + /// + public int X; + /// + /// y 坐标 + /// + public int Y; + /// + /// 像素颜色 + /// + public Color Color; + /// + /// 材质液体材质 + /// + public ExcelConfig.LiquidMaterial Material; + /// + /// 开始销退像素点的计时器 + /// + public float Timer; + /// + /// 记录是否正在画布上显示 + /// + public bool IsRun; + /// + /// 是否执行更新逻辑 + /// + public bool IsUpdate; + /// + /// 上一次操作 Alpha的 时间, 用该时间和画布的 RunTime 相减可以计算出 delta + /// + public float TempTime; + /// + /// 用于补间操作记录该像素点是否已经被绘制过, 以便于优化性能 + /// + public bool TempFlag; +} \ 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 987771d..fdc3258 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs @@ -159,9 +159,9 @@ 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)) ); - var offset = RoomInfo.GetOffsetPosition(); //var offset = RoomInfo.RoomSplit.RoomInfo.Position.AsVector2I(); - mark.Position = RoomInfo.GetWorldPosition() + (tempPos - offset); + //mark.Position = RoomInfo.GetWorldPosition() + tempPos - offset; + mark.Position = RoomInfo.ToGlobalPosition(tempPos); wave.Add(mark); } @@ -297,10 +297,19 @@ //播放出生动画 activityObject.StartCoroutine(OnActivityObjectBirth(activityObject)); activityObject.PutDown(GetDefaultLayer(activityMark)); + activityObject.UpdateFall((float)GameApplication.Instance.GetProcessDeltaTime()); + + if (activityObject is Enemy enemy) + { + //出生调用 + enemy.OnBornFromMark(); + } - var effect1 = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_common_Effect1_tscn); - effect1.Position = activityObject.Position + new Vector2(0, -activityMark.Altitude); - effect1.AddToActivityRoot(RoomLayerEnum.YSortLayer); + var effect = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_common_Effect1_tscn); + var node = (Node2D)effect; + node.Position = activityObject.Position + new Vector2(0, -activityMark.Altitude); + node.AddToActivityRoot(RoomLayerEnum.YSortLayer); + effect.PlayEffect(); } i++; @@ -428,8 +437,8 @@ } else if (activityMark.ActivityType == ActivityType.Enemy) //敌人类型 { - var enemy = (Enemy)activityObject; - if (activityMark.Attr.TryGetValue("Weapon", out var weaponId)) //使用的武器 + var role = (Role)activityObject; + if (role is Enemy enemy && activityMark.Attr.TryGetValue("Weapon", out var weaponId)) //使用的武器 { if (!string.IsNullOrEmpty(weaponId)) { @@ -449,7 +458,7 @@ if (activityMark.DerivedAttr.TryGetValue("Face", out var face)) //脸朝向, 应该只有 -1 和 1 { var faceDir = int.Parse(face); - enemy.Face = (FaceDirection)faceDir; + 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 9541c00..5af5be5 100644 --- a/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs +++ b/DungeonShooting_Godot/src/framework/map/preinstall/SpecialMarkType.cs @@ -5,7 +5,7 @@ public enum SpecialMarkType { /// - /// 正常类型 + /// 普通标记 /// Normal, /// diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs index 9e73a1d..a420fe5 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomDoorInfo.cs @@ -55,6 +55,21 @@ public DoorNavigationInfo Navigation; /// + /// 连接过道使用的导航网格 (暂未用到) + /// + public NavigationPolygonData AisleNavigation; + + /// + /// 连接过道使用预览纹理, 用于小地图 + /// + public ImageTexture AislePreviewTexture; + + /// + /// 连接过道使用预览图, 用于小地图 + /// + public TextureRect AislePreviewSprite; + + /// /// 门实例 /// public RoomDoor Door; @@ -80,6 +95,11 @@ public PreviewFogMask PreviewAisleFogMask; /// + /// 未探索的区域显示的问号 + /// + public Sprite2D UnknownSprite; + + /// /// 世界坐标下的原点坐标, 单位: 像素 /// public Vector2I GetWorldOriginPosition() @@ -91,6 +111,40 @@ } /// + /// 终点坐标, 单位: 格 + /// + public Vector2I GetEndPosition() + { + if (Direction == DoorDirection.E || Direction == DoorDirection.W) + { + return OriginPosition + new Vector2I(0, 4); + } + else if (Direction == DoorDirection.N || Direction == DoorDirection.S) + { + return OriginPosition + new Vector2I(4, 0); + } + + return default; + } + + /// + /// 世界坐标下的终点坐标, 单位: 像素 + /// + public Vector2I GetWorldEndPosition() + { + if (Direction == DoorDirection.E || Direction == DoorDirection.W) + { + return GetWorldOriginPosition() + new Vector2I(0, 4 * GameConfig.TileCellSize); + } + else if (Direction == DoorDirection.N || Direction == DoorDirection.S) + { + return GetWorldOriginPosition() + new Vector2I(4 * GameConfig.TileCellSize, 0); + } + + return default; + } + + /// /// 获取直连门过道区域数据, 单位: 格, 如果当前门连接区域带交叉点, 则报错 /// public Rect2I GetAisleRect() @@ -256,5 +310,15 @@ { PreviewAisleFogMask.Destroy(); } + + if (AislePreviewTexture != null) + { + AislePreviewTexture.Dispose(); + } + + if (AislePreviewSprite != null) + { + AislePreviewSprite.QueueFree(); + } } } \ 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 8883d1d..f1269ca 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -86,9 +86,9 @@ public ImageCanvas StaticImageCanvas; /// - /// 房间坐标相对于画布坐标偏移量, 单位: 像素 + /// 液体画布 /// - public Vector2I RoomOffset; + public LiquidCanvas LiquidCanvas; /// /// 房间迷雾 @@ -96,16 +96,47 @@ public FogMask RoomFogMask; /// + /// 房间坐标相对于画布坐标偏移量, 单位: 像素 + /// + public Vector2I RoomOffset { get; private set; } + + /// /// 房间算上连接通道所占用的区域 /// - public Rect2I OuterRange { get; private set; } + public Rect2I OuterRect { get; private set; } + + /// + /// 画布占用区域 + /// + public Rect2I CanvasRect { get; private set; } /// /// 是否处于闭关状态, 也就是房间门没有主动打开 /// public bool IsSeclusion { get; private set; } = false; + + /// + /// 用于标记攻击目标位置 + /// + public Dictionary MarkTargetPosition { get; private set; } = new Dictionary(); + + /// + /// 房间预览纹理, 用于小地图 + /// + public ImageTexture PreviewTexture { get; set; } + + /// + /// 房间预览图, 用于小地图 + /// + public TextureRect PreviewSprite { get; set; } + /// + /// 房间内的传送点, 单位: 格 + /// + public Vector2I Waypoints { get; set; } + public bool IsDestroyed { get; private set; } + private bool _openDoorFlag = true; // private bool _beReady = false; @@ -117,7 +148,7 @@ /// /// 重新计算占用的区域 /// - public void CalcOuterRange() + public void CalcRange() { var worldPos = GetWorldPosition(); var pos = new Vector2I(worldPos.X, worldPos.Y); @@ -200,8 +231,16 @@ break; } } + + OuterRect = new Rect2I(minX, minY, maxX - minX, maxY - minY); + + var cMinX = minX - GameConfig.TileCellSize; + var cMinY = minY - GameConfig.TileCellSize; + var cMaxX = maxX + GameConfig.TileCellSize; + var cMaxY = maxY + GameConfig.TileCellSize; + CanvasRect = new Rect2I(cMinX, cMinY, cMaxX - cMinX, cMaxY - cMinY); - OuterRange = new Rect2I(minX, minY, maxX - minX, maxY - minY); + RoomOffset = new Vector2I(worldPos.X - cMinX, worldPos.Y - cMinY); } /// @@ -225,6 +264,14 @@ } /// + /// 将房间配置中的坐标转为全局坐标, 单位: 像素 + /// + public Vector2 ToGlobalPosition(Vector2 pos) + { + return GetWorldPosition() + pos - GetOffsetPosition(); + } + + /// /// 获取房间横轴结束位置, 单位: 格 /// public int GetHorizontalEnd() @@ -276,9 +323,9 @@ /// /// 将世界坐标转为画布下的坐标 /// - public Vector2 ToImageCanvasPosition(Vector2 pos) + public Vector2 ToCanvasPosition(Vector2 pos) { - return pos - StaticImageCanvas.Position; + return pos - CanvasRect.Position; } public void Destroy() @@ -314,8 +361,14 @@ { StaticImageCanvas.Destroy(); } + + //销毁液体画布 + if (LiquidCanvas != null) + { + LiquidCanvas.Destroy(); + } - // + //销毁静态精灵节点 if (StaticSprite != null) { StaticSprite.Destroy(); @@ -332,6 +385,19 @@ { AffiliationArea.Destroy(); } + + //销毁预览图 + if (PreviewTexture != null) + { + PreviewTexture.Dispose(); + } + + if (PreviewSprite != null) + { + PreviewSprite.QueueFree(); + } + + MarkTargetPosition.Clear(); } /// @@ -452,4 +518,19 @@ } } } + + /// + /// 遍历房间以及后面的房间 + /// + public void EachRoom(Action callback) + { + callback(this); + if (Next != null) + { + foreach (var room in Next) + { + room.EachRoom(callback); + } + } + } } \ 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 index bc142da..460e2b2 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/NavigationPolygonData.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/NavigationPolygonData.cs @@ -44,7 +44,7 @@ } /// - /// 读取所有的坐标点 + /// 读取所有的坐标点, 单位: 像素 /// public Vector2[] GetPoints() { diff --git a/DungeonShooting_Godot/src/framework/pool/IPoolItem.cs b/DungeonShooting_Godot/src/framework/pool/IPoolItem.cs index 8ff53da..73c66db 100644 --- a/DungeonShooting_Godot/src/framework/pool/IPoolItem.cs +++ b/DungeonShooting_Godot/src/framework/pool/IPoolItem.cs @@ -11,7 +11,7 @@ /// /// 对象唯一标识,用于在对象池中区分对象类型,可以是资源路径,也可以是配置表id /// - string Logotype { get; } + string Logotype { get; set; } /// /// 当物体被回收时调用,也就是进入对象池 /// diff --git a/DungeonShooting_Godot/src/framework/pool/ObjectPool.cs b/DungeonShooting_Godot/src/framework/pool/ObjectPool.cs index 27f8e4c..b21242b 100644 --- a/DungeonShooting_Godot/src/framework/pool/ObjectPool.cs +++ b/DungeonShooting_Godot/src/framework/pool/ObjectPool.cs @@ -13,6 +13,10 @@ /// public static void Reclaim(IPoolItem poolItem) { + if (poolItem.IsRecycled) + { + return; + } var logotype = poolItem.Logotype; if (!_pool.TryGetValue(logotype, out var poolItems)) { diff --git a/DungeonShooting_Godot/src/game/AnimatorNames.cs b/DungeonShooting_Godot/src/game/AnimatorNames.cs index b393c9f..bf3d97d 100644 --- a/DungeonShooting_Godot/src/game/AnimatorNames.cs +++ b/DungeonShooting_Godot/src/game/AnimatorNames.cs @@ -1,4 +1,6 @@ +using Godot; + /// /// 预制动画名称 /// @@ -7,65 +9,85 @@ /// /// 默认动画 /// - public const string Default = "default"; + public static readonly StringName Default = "default"; /// /// 静止不动 /// - public const string Idle = "idle"; + public static readonly StringName Idle = "idle"; /// /// 奔跑 /// - public const string Run = "run"; + public static readonly StringName Run = "run"; /// /// 倒退奔跑 /// - public const string ReverseRun = "reverseRun"; + public static readonly StringName ReverseRun = "reverseRun"; /// /// 翻滚 /// - public const string Roll = "roll"; + public static readonly StringName Roll = "roll"; /// /// 武器泛光动画 /// - public const string Floodlight = "floodlight"; + public static readonly StringName Floodlight = "floodlight"; /// /// 开门动画 /// - public const string OpenDoor = "openDoor"; + public static readonly StringName OpenDoor = "openDoor"; /// /// 关门动画 /// - public const string CloseDoor = "closeDoor"; + public static readonly StringName CloseDoor = "closeDoor"; /// /// 开火 /// - public const string Fire = "fire"; + public static readonly StringName Fire = "fire"; /// /// 换弹 /// - public const string Reloading = "reloading"; + public static readonly StringName Reloading = "reloading"; /// /// 子弹上膛 /// - public const string BeLoaded = "beLoaded"; + public static readonly StringName BeLoaded = "beLoaded"; /// /// ui入场 /// - public const string In = "in"; + public static readonly StringName In = "in"; /// /// ui出场 /// - public const string Out = "out"; + public static readonly StringName Out = "out"; /// /// 显示动画 /// - public const string Show = "show"; + public static readonly StringName Show = "show"; /// /// 播放特效 /// - public const string Play = "play"; + public static readonly StringName Play = "play"; /// /// 物体移动 /// - public const string Move = "move"; + 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 976ffb4..04e90b5 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -31,23 +31,17 @@ /// 全局根节点 /// [Export] public Node2D GlobalNodeRoot; - - /// - /// 是否开启调试 - /// - [ExportGroup("Debug")] - [Export] public bool IsDebug; - + /// /// 游戏目标帧率 /// - public int TargetFps { get; private set; } = 60; + public int TargetFps { get; private set; } /// /// 鼠标指针 /// public Cursor Cursor { get; private set; } - + /// /// 游戏世界 /// @@ -97,6 +91,8 @@ InitRoomConfig(); //初始化武器数据 Weapon.InitWeaponAttribute(); + //初始化敌人数据 + Enemy.InitEnemyAttribute(); DungeonConfig = new DungeonConfig(); DungeonConfig.GroupName = RoomConfig.FirstOrDefault().Key; @@ -112,12 +108,10 @@ //固定帧率 //Engine.MaxFps = TargetFps; //调试绘制开关 - //IsDebug = true; - ActivityObject.IsDebug = IsDebug; + ActivityObject.IsDebug = false; //Engine.TimeScale = 0.2f; //调整窗口分辨率 OnWindowSizeChanged(); - RefreshSubViewportSize(); //窗体大小改变 GetWindow().SizeChanged += OnWindowSizeChanged; @@ -147,6 +141,7 @@ var newDelta = (float)delta; InputManager.Update(newDelta); SoundManager.Update(newDelta); + DragUiManager.Update(newDelta); //协程更新 ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta); @@ -190,8 +185,7 @@ /// public Vector2 GlobalToViewPosition(Vector2 globalPos) { - //return globalPos; - return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition; + return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition - GameCamera.Main.PixelOffset; } /// @@ -199,9 +193,7 @@ /// public Vector2 ViewToGlobalPosition(Vector2 viewPos) { - // 3.5写法 - //return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition; - return (viewPos - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale; + return (viewPos + GameCamera.Main.PixelOffset - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale; } public long StartCoroutine(IEnumerator able) @@ -280,11 +272,12 @@ private void RefreshSubViewportSize() { var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y); - s.X = s.X / 2 * 2; - s.Y = s.Y / 2 * 2; + s.X = s.X / 2 * 2 + 2; + s.Y = s.Y / 2 * 2 + 2; SubViewport.Size = s; SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale); SubViewportContainer.Size = s; + SubViewportContainer.Position = new Vector2(-PixelScale, -PixelScale); } //初始化鼠标 diff --git a/DungeonShooting_Godot/src/game/GameConfig.cs b/DungeonShooting_Godot/src/game/GameConfig.cs index 932ab28..c116698 100644 --- a/DungeonShooting_Godot/src/game/GameConfig.cs +++ b/DungeonShooting_Godot/src/game/GameConfig.cs @@ -52,7 +52,7 @@ public const string UiCodeDir = "src/game/ui/"; /// - /// TileMap 底板的层级 + /// TileMap 地板的层级 /// public const int FloorMapLayer = 0; /// diff --git a/DungeonShooting_Godot/src/game/activity/ForceNames.cs b/DungeonShooting_Godot/src/game/activity/ForceNames.cs index ae60220..f732a84 100644 --- a/DungeonShooting_Godot/src/game/activity/ForceNames.cs +++ b/DungeonShooting_Godot/src/game/activity/ForceNames.cs @@ -8,4 +8,8 @@ /// 投抛外力 /// public const string Throw = "throw"; + /// + /// 击退外力 + /// + public const string Repel = "repel"; } \ 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 56a6963..637b9b3 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs @@ -30,11 +30,14 @@ /// public uint AttackLayer { get; private set; } + /// + /// 产生爆炸的子弹数据 + /// + public BulletData BulletData { get; private set; } private bool _init = false; private float _hitRadius; - private int _minHarm; - private int _maxHarm; + private int _harm; private float _repelledRadius; private float _maxRepelled; @@ -52,14 +55,13 @@ /// /// 初始化爆炸数据 /// - /// 爆炸所在区域 + /// 产生爆炸的子弹数据 /// 攻击的层级 /// 伤害半径 - /// 最小伤害 - /// 最大伤害 + /// 造成的伤害 /// 击退半径 /// 最大击退速度 - public void Init(AffiliationArea affiliationArea, uint attackLayer, float hitRadius, int minHarm, int maxHarm, float repelledRadius, float maxRepelled) + public void Init(BulletData bulletData, uint attackLayer, float hitRadius, int harm, float repelledRadius, float maxRepelled) { if (!_init) { @@ -70,17 +72,18 @@ AnimationPlayer.AnimationFinished += OnAnimationFinish; BodyEntered += OnBodyEntered; } - + + BulletData = bulletData; AttackLayer = attackLayer; _hitRadius = hitRadius; - _minHarm = minHarm; - _maxHarm = maxHarm; + _harm = harm; _repelledRadius = repelledRadius; _maxRepelled = maxRepelled; CollisionMask = attackLayer | PhysicsLayer.Prop | PhysicsLayer.Debris; CircleShape.Radius = Mathf.Max(hitRadius, maxRepelled); //冲击波 + var affiliationArea = bulletData.TriggerRole?.AffiliationArea; if (affiliationArea != null) { ShockWave(affiliationArea); @@ -112,7 +115,7 @@ public void OnReclaim() { - GetParent().RemoveChild(this); + GetParent().CallDeferred(Node.MethodName.RemoveChild, this); } public void OnLeavePool() @@ -141,7 +144,7 @@ { if (o is Role role) //是角色 { - role.CallDeferred(nameof(role.Hurt), Utils.Random.RandomRangeInt(_minHarm, _maxHarm), angle); + role.CallDeferred(nameof(role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, _harm, angle); } else if (o is Bullet bullet) //是子弹 { @@ -158,7 +161,7 @@ { var repelled = (_repelledRadius - len) / _repelledRadius * _maxRepelled; //o.MoveController.SetAllVelocity(Vector2.Zero); - o.MoveController.AddForce(Vector2.FromAngle(angle) * repelled); + 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 fbd2791..785f4a8 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs @@ -1,17 +1,35 @@ +using System; using System.Collections; using System.Collections.Generic; -using Config; using Godot; +using Godot.Collections; /// /// 激光子弹 /// public partial class Laser : Area2D, IBullet { + /// + /// 激光默认宽度 + /// + public const float LaserDefaultWidth = 3f; + + /// + /// 子节点包含的例子特效, 在创建完成后自动播放 + /// + [Export] + public Array Particles2D { get; set; } + public CollisionShape2D Collision { get; private set; } public Sprite2D LineSprite { get; private set; } public RectangleShape2D Shape { get; private set; } + public event Action OnReclaimEvent; + public event Action OnLeavePoolEvent; + + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + public uint AttackLayer { get => CollisionMask; @@ -28,25 +46,29 @@ private List _coroutineList; private float _pixelScale; private float _speed = 2000; - - public override void _Ready() - { - Collision = GetNodeOrNull("CollisionShape2D"); - Collision.Disabled = true; - Shape = Collision.Shape as RectangleShape2D; - LineSprite = GetNodeOrNull("LineSprite"); - _pixelScale = 1f / LineSprite.Texture.GetHeight(); - - AreaEntered += OnArea2dEntered; - } + private Tween _tween; + private bool _init = false; public void InitData(BulletData data, uint attackLayer) { - InitData(data, attackLayer, 5); + InitData(data, attackLayer, LaserDefaultWidth); } public void InitData(BulletData data, uint attackLayer, float width) { + if (!_init) + { + Collision = GetNodeOrNull("CollisionShape2D"); + Collision.Disabled = true; + Shape = (RectangleShape2D)Collision.Shape; + LineSprite = GetNodeOrNull("LineSprite"); + _pixelScale = 1f / LineSprite.Texture.GetHeight(); + + AreaEntered += OnArea2dEntered; + + _init = true; + } + BulletData = data; AttackLayer = attackLayer; @@ -58,18 +80,24 @@ var parameters = PhysicsRayQueryParameters2D.Create(data.Position, targetPosition, PhysicsLayer.Wall); var result = GetWorld2D().DirectSpaceState.IntersectRay(parameters); float distance; - if (result != null && result.TryGetValue("position", out var point)) + var doRebound = false; //是否需要执行反弹 + Vector2? reboundPosition = null; + Vector2? reboundNormal = null; + if (result != null && result.TryGetValue("position", out var point)) //撞到墙壁 { - distance = Position.DistanceTo((Vector2)point); + doRebound = true; + reboundPosition = (Vector2)point; + reboundNormal = (Vector2)result["normal"]; + distance = Position.DistanceTo(reboundPosition.Value); } - else + else //没撞到墙壁 { distance = data.MaxDistance; } Collision.SetDeferred(CollisionShape2D.PropertyName.Disabled, false); Collision.Position = Vector2.Zero; - Shape.Size = Vector2.Zero;; + Shape.Size = Vector2.Zero; LineSprite.Scale = new Vector2(0, width * _pixelScale); //如果子弹会对玩家造成伤害, 则显示成红色 @@ -77,31 +105,49 @@ { LineSprite.Modulate = new Color(2.5f, 0.5f, 0.5f); } + else + { + LineSprite.Modulate = new Color(1.5f, 1.5f, 1.5f); + } //激光飞行时间 var time = distance / _speed; - var tween = CreateTween(); - tween.SetParallel(); - tween.TweenProperty(LineSprite, "scale", new Vector2(distance, width * _pixelScale), time); - tween.TweenProperty(Collision, "position", new Vector2(distance * 0.5f, 0), time); - tween.TweenProperty(Shape, "size", new Vector2(distance, width), time); - tween.Chain(); + _tween = CreateTween(); + _tween.SetParallel(); + _tween.TweenProperty(LineSprite, "scale", new Vector2(distance, width * _pixelScale), time); + _tween.TweenProperty(Collision, "position", new Vector2(distance * 0.5f, 0), time); + _tween.TweenProperty(Shape, "size", new Vector2(distance, width), time); + _tween.Chain(); //持续时间 // tween.TweenInterval(0.2f); // tween.Chain(); - tween.TweenCallback(Callable.From(() => + _tween.TweenCallback(Callable.From(() => { + //执行反弹 + if (doRebound) + { + CallDeferred(nameof(OnRebound), reboundPosition.Value, reboundNormal.Value); + } Collision.SetDeferred(CollisionShape2D.PropertyName.Disabled, false); })); - tween.Chain(); - tween.TweenProperty(LineSprite, "scale", new Vector2(distance, 0), 0.3f); - tween.Chain(); - tween.TweenCallback(Callable.From(() => + _tween.Chain(); + _tween.TweenProperty(LineSprite, "scale", new Vector2(distance, 0), 0.3f); + _tween.Chain(); + _tween.TweenCallback(Callable.From(() => { - Destroy(); + _tween = null; + DoReclaim(); })); - tween.Play(); + _tween.Play(); + + if (Particles2D != null) + { + foreach (var particles2D in Particles2D) + { + particles2D.Restart(); + } + } } public override void _Process(double delta) @@ -118,20 +164,47 @@ QueueFree(); } + + //激光撞墙反弹逻辑 + private void OnRebound(Vector2 position, Vector2 normal) + { + if (BulletData.BounceCount > 0) + { + var newDistance = BulletData.MaxDistance - BulletData.Position.DistanceTo(position); + if (newDistance > 0) + { + float rotation; + if (normal.X == 0 && normal.Y == 0) + { + rotation = (BulletData.Rotation + Mathf.Pi) % (Mathf.Pi * 2); + } + else + { + rotation = Utils.ReflectByNormal(BulletData.Rotation, normal); + } + + var bulletData = BulletData.Clone(); + bulletData.Position = position; + bulletData.BounceCount -= 1; + bulletData.MaxDistance = newDistance; + bulletData.Rotation = rotation; + FireManager.ShootBullet(bulletData, AttackLayer); + } + } + } private void OnArea2dEntered(Area2D other) { var role = other.AsActivityObject(); if (role != null) { - //计算子弹造成的伤害 - var damage = Utils.Random.RandomRangeInt(BulletData.MinHarm, BulletData.MaxHarm); - if (BulletData.TriggerRole != null) + //击退 + if (BulletData.Repel != 0) { - damage = BulletData.TriggerRole.RoleState.CallCalcDamageEvent(damage); + role.AddRepelForce(Vector2.FromAngle(Rotation) * BulletData.Repel); } //造成伤害 - role.CallDeferred(nameof(Role.Hurt), damage, Rotation); + role.CallDeferred(nameof(Role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); } } @@ -154,4 +227,40 @@ { ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList); } + + public void DoReclaim() + { + ObjectPool.Reclaim(this); + } + + public virtual void OnReclaim() + { + if (Particles2D != null) + { + foreach (var particles2D in Particles2D) + { + particles2D.Emitting = false; + } + } + if (OnReclaimEvent != null) + { + OnReclaimEvent(); + } + + if (_tween != null) + { + _tween.Dispose(); + _tween = null; + } + GetParent().CallDeferred(Node.MethodName.RemoveChild, this); + } + + public virtual void OnLeavePool() + { + StopAllCoroutine(); + if (OnLeavePoolEvent != null) + { + OnLeavePoolEvent(); + } + } } diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs index b997951..1a763f3 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs @@ -10,19 +10,19 @@ public override void OnLimeOver() { PlayBoom(); - Destroy(); + DoReclaim(); } public override void OnMaxDistance() { PlayBoom(); - Destroy(); + DoReclaim(); } public override void OnCollisionTarget(ActivityObject o) { PlayBoom(); - Destroy(); + DoReclaim(); } public override void OnMoveCollision(KinematicCollision2D lastSlideCollision) @@ -31,6 +31,7 @@ if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { PlayBoom(); + DoReclaim(); } else { @@ -43,6 +44,7 @@ { //播放撞击音效 SoundManager.PlaySoundByConfig("collision0001", Position, BulletData.TriggerRole); + //这里不调用父类的 OnFallToGround() 函数, 因为这种子弹落地不需要销毁 } /// @@ -50,17 +52,17 @@ /// public void PlayBoom() { - var explode = ObjectManager.GetExplode(ResourcePath.prefab_bullet_explode_Explode0001_tscn); + var explode = ObjectManager.GetPoolItem(ResourcePath.prefab_bullet_explode_Explode0001_tscn); var pos = Position; explode.Position = pos; explode.RotationDegrees = Utils.Random.RandomRangeInt(0, 360); explode.AddToActivityRootDeferred(RoomLayerEnum.YSortLayer); - explode.Init(BulletData.TriggerRole?.AffiliationArea, AttackLayer, 25, BulletData.MinHarm, BulletData.MaxHarm, 50, 150); + explode.Init(BulletData, AttackLayer, 25, BulletData.Harm, 50, BulletData.Repel); explode.RunPlay(BulletData.TriggerRole); if (AffiliationArea != null) { - var texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_effects_explode_Explode_pit0001_png); - var tempPos = AffiliationArea.RoomInfo.ToImageCanvasPosition(pos); + var texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_explode_Explode_pit0001_png); + var tempPos = AffiliationArea.RoomInfo.ToCanvasPosition(pos); AffiliationArea.RoomInfo.StaticImageCanvas.DrawImageInCanvas( texture, null, tempPos.X, tempPos.Y, Utils.Random.RandomRangeInt(0, 360), texture.GetWidth() / 2, texture.GetHeight() / 2, false diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BrushBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BrushBullet.cs new file mode 100644 index 0000000..c685601 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BrushBullet.cs @@ -0,0 +1,61 @@ + +using Godot; + +/// +/// 带笔刷的子弹 +/// +[Tool] +public partial class BrushBullet : Bullet +{ + /// + /// 笔刷 id + /// + [Export] + public string BrushId { get; set; } + + /// + /// 生效高度, 当物体离地高度小于这个值时生效, 当值小于 0 时一直生效 + /// + [Export] + public float EffectiveAltitude { get; set; } = -1; + + private BrushImageData _brushData; + + public override void OnInit() + { + base.OnInit(); + _brushData = LiquidBrushManager.GetBrush(BrushId); + } + + protected override void Process(float delta) + { + base.Process(delta); + //测试笔刷 + if (EffectiveAltitude < 0 || Altitude <= EffectiveAltitude) + { + DrawLiquid(_brushData); + } + else + { + BrushPrevPosition = null; + } + } + + public override void OnPlayDisappearEffect() + { + PlayDisappearEffect(ResourcePath.prefab_effect_bullet_BulletDisappear0002_tscn); + } + + public override void OnPlayCollisionEffect(KinematicCollision2D collision) + { + //测试笔刷 + DrawLiquid(_brushData); + PlayCollisionEffect(collision, ResourcePath.prefab_effect_bullet_BulletSmoke0002_tscn); + } + + public override void OnLeavePool() + { + base.OnLeavePool(); + BrushPrevPosition = null; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs index 0c24cdc..bf0a0dc 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs @@ -1,5 +1,8 @@ + +using System; using System.Collections; using Godot; +using Godot.Collections; /// /// 子弹类 @@ -7,11 +10,28 @@ [Tool] public partial class Bullet : ActivityObject, IBullet { + public event Action OnReclaimEvent; + public event Action OnLeavePoolEvent; + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + /// - /// 碰撞区域 + /// 子弹伤害碰撞区域 /// [Export, ExportFillNode] public Area2D CollisionArea { get; set; } + + /// + /// 子弹伤害碰撞检测形状 + /// + [Export, ExportFillNode] + public CollisionShape2D CollisionShape2D { get; set; } + + /// + /// 子节点包含的例子特效, 在创建完成后自动播放 + /// + [Export] + public Array Particles2D { get; set; } /// /// 攻击的层级 @@ -28,44 +48,60 @@ /// 当前反弹次数 /// public int CurrentBounce { get; protected set; } = 0; + + /// + /// 当前穿透次数 + /// + public int CurrentPenetration { get; protected set; } = 0; //当前子弹已经飞行的距离 private float CurrFlyDistance = 0; - + + private bool _init = false; + private bool _isEnemyBullet = false; + public override void OnInit() { - BounceLockRotation = false; - CollisionArea.AreaEntered += OnArea2dEntered; + base.OnInit(); + OutlineColor = new Color(2.5f, 0, 0); + SetBlendColor(new Color(2.0f, 2.0f, 2.0f)); } - + public virtual void InitData(BulletData data, uint attackLayer) { + if (!_init) + { + CollisionArea.AreaEntered += OnArea2dEntered; + _init = true; + } + + CurrentBounce = 0; + CurrentPenetration = 0; + CurrFlyDistance = 0; + BulletData = data; AttackLayer = attackLayer; Rotation = data.Rotation; - - float altitude; + var triggerRole = data.TriggerRole; - if (triggerRole != null) + if (data.TriggerRole != null && data.TriggerRole.AffiliationArea != null) //设置所属区域 { - altitude = -triggerRole.MountPoint.Position.Y; - if (triggerRole.AffiliationArea != null) //设置所属区域 + if (triggerRole.AffiliationArea != null) { triggerRole.AffiliationArea.InsertItem(this); } } - else - { - altitude = 8; - } - Position = data.Position + new Vector2(0, altitude); - Altitude = altitude; + Position = data.Position + new Vector2(0, data.Altitude); + Altitude = data.Altitude; if (data.VerticalSpeed != 0) { VerticalSpeed = data.VerticalSpeed; } - EnableVerticalMotion = data.BulletBase.UseGravity; + else + { + VerticalSpeed = 0; + } //BasisVelocity = new Vector2(data.FlySpeed, 0).Rotated(Rotation); MoveController.AddForce(new Vector2(data.FlySpeed, 0).Rotated(Rotation)); @@ -73,21 +109,40 @@ //如果子弹会对玩家造成伤害, 则显示红色描边 if (Player.Current.CollisionWithMask(attackLayer)) { - ShowBorderFlashes(); + if (!_isEnemyBullet) + { + _isEnemyBullet = true; + ShowOutline = true; + SetBlendSchedule(1); + } } + else if (_isEnemyBullet) + { + _isEnemyBullet = false; + ShowOutline = false; + SetBlendSchedule(0); + } + PutDown(RoomLayerEnum.YSortLayer); //播放子弹移动动画 PlaySpriteAnimation(AnimatorNames.Move); //强制更新下坠逻辑处理 UpdateFall((float)GetProcessDeltaTime()); - + //过期销毁 if (data.LifeTime > 0) { this.CallDelay(data.LifeTime, OnLimeOver); } + + if (Particles2D != null) + { + foreach (var particles2D in Particles2D) + { + particles2D.Restart(); + } + } } - public override void OnMoveCollision(KinematicCollision2D collision) { @@ -95,13 +150,8 @@ if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { //创建粒子特效 - var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletSmoke_tscn); - var smoke = packedScene.Instantiate(); - var rotated = AnimatedSprite.Position.Rotated(Rotation); - smoke.GlobalPosition = collision.GetPosition() + new Vector2(0, rotated.Y); - smoke.GlobalRotation = collision.GetNormal().Angle(); - smoke.AddToActivityRoot(RoomLayerEnum.YSortLayer); - Destroy(); + OnPlayCollisionEffect(collision); + DoReclaim(); } } @@ -112,30 +162,26 @@ { if (o is Role role) { - PlayDisappearEffect(); - - //计算子弹造成的伤害 - var damage = Utils.Random.RandomRangeInt(BulletData.MinHarm, BulletData.MaxHarm); - if (BulletData.TriggerRole != null) - { - damage = BulletData.TriggerRole.RoleState.CallCalcDamageEvent(damage); - } + OnPlayDisappearEffect(); //击退 if (role is not Player) //目标不是玩家才会触发击退 { - var attr = BulletData.Weapon.GetUseAttribute(BulletData.TriggerRole); - var repel = Utils.Random.RandomConfigRange(attr.Bullet.RepelRnage); - if (repel != 0) + if (BulletData.Repel != 0) { - //role.MoveController.AddForce(Vector2.FromAngle(BasisVelocity.Angle()) * repel); - role.MoveController.AddForce(Vector2.FromAngle(Velocity.Angle()) * repel); + role.AddRepelForce(Velocity.Normalized() * BulletData.Repel); } } //造成伤害 - role.CallDeferred(nameof(Role.Hurt), damage, Rotation); - Destroy(); + role.CallDeferred(nameof(Role.Hurt), BulletData.TriggerRole.IsDestroyed ? null : BulletData.TriggerRole, BulletData.Harm, Rotation); + + //穿透次数 + CurrentPenetration++; + if (CurrentPenetration > BulletData.Penetration) + { + DoReclaim(); + } } } @@ -144,8 +190,8 @@ /// public virtual void OnMaxDistance() { - PlayDisappearEffect(); - Destroy(); + OnPlayDisappearEffect(); + DoReclaim(); } /// @@ -153,8 +199,15 @@ /// public virtual void OnLimeOver() { - PlayDisappearEffect(); - Destroy(); + OnPlayDisappearEffect(); + DoReclaim(); + } + + protected override void OnFallToGround() + { + //落地销毁 + OnPlayDisappearEffect(); + DoReclaim(); } /// @@ -179,16 +232,53 @@ /// /// 播放子弹消失的特效 /// - public virtual void PlayDisappearEffect() + public virtual void OnPlayDisappearEffect() { - var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletDisappear_tscn); - var node = packedScene.Instantiate(); + PlayDisappearEffect(ResourcePath.prefab_effect_bullet_BulletDisappear0001_tscn); + } + + /// + /// 播放撞墙特效 + /// + public virtual void OnPlayCollisionEffect(KinematicCollision2D collision) + { + PlayCollisionEffect(collision, ResourcePath.prefab_effect_bullet_BulletSmoke0001_tscn); + } + + /// + /// 播放子弹消失特效 + /// + public void PlayDisappearEffect(string path) + { + var effect = ObjectManager.GetPoolItem(path); + var node = (Node2D)effect; node.GlobalPosition = AnimatedSprite.GlobalPosition; node.AddToActivityRoot(RoomLayerEnum.YSortLayer); + effect.PlayEffect(); + } + + + /// + /// 播放子弹消失特效 + /// + public void PlayCollisionEffect(KinematicCollision2D collision, string path) + { + var effect = ObjectManager.GetPoolItem(path); + var smoke = (Node2D)effect; + var rotated = AnimatedSprite.Position.Rotated(Rotation); + smoke.GlobalPosition = collision.GetPosition() + new Vector2(0, rotated.Y); + smoke.GlobalRotation = collision.GetNormal().Angle(); + smoke.AddToActivityRoot(RoomLayerEnum.YSortLayer); + effect.PlayEffect(); } protected override void Process(float delta) { + if (ActivityMaterial.DynamicCollision) + { + //子弹高度大于 16 关闭碰撞检测 + CollisionShape2D.Disabled = Altitude >= 16; + } //距离太大, 自动销毁 CurrFlyDistance += BulletData.FlySpeed * delta; if (CurrFlyDistance >= BulletData.MaxDistance) @@ -206,4 +296,41 @@ var activityObject = other.AsActivityObject(); OnCollisionTarget(activityObject); } + + public virtual void DoReclaim() + { + ObjectPool.Reclaim(this); + } + + public virtual void OnReclaim() + { + Visible = false; + if (Particles2D != null) + { + foreach (var particles2D in Particles2D) + { + particles2D.Emitting = false; + } + } + if (OnReclaimEvent != null) + { + OnReclaimEvent(); + } + if (AffiliationArea != null) + { + AffiliationArea.RemoveItem(this); + } + GetParent().CallDeferred(Node.MethodName.RemoveChild, this); + } + + public virtual void OnLeavePool() + { + Visible = true; + MoveController.ClearForce(); + StopAllCoroutine(); + if (OnLeavePoolEvent != null) + { + OnLeavePoolEvent(); + } + } } \ 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 6e74709..9611387 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs @@ -1,9 +1,19 @@  +using System; using Config; -public interface IBullet : IDestroy, ICoroutine +public interface IBullet : ICoroutine, IPoolItem { /// + /// 当物体被回收时的事件 + /// + event Action OnReclaimEvent; + /// + /// 离开对象池时的事件 + /// + event Action OnLeavePoolEvent; + + /// /// 攻击的层级 /// uint AttackLayer { get; set; } @@ -15,4 +25,8 @@ /// 初始化子弹数据 /// void InitData(BulletData data, uint attackLayer); + /// + /// 执行子弹回收操作 + /// + void DoReclaim(); } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/common/AutoFreezeObject.cs b/DungeonShooting_Godot/src/game/activity/common/AutoFreezeObject.cs new file mode 100644 index 0000000..7a3c94a --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/common/AutoFreezeObject.cs @@ -0,0 +1,77 @@ + +using Godot; + +/// +/// 停止移动后自动冻结对象 +/// +[Tool] +public partial class AutoFreezeObject : ActivityObject +{ + /// + /// 自动播放的动画, 物体会等待该动画播完完成后进入冻结状态, 该动画不能是循环动画 + /// + [Export] + public string AnimationName { get; set; } + + /// + /// 在冻结前是否变灰 + /// + [Export] + public bool AutoToGrey { get; set; } + + /// + /// 冻结次数 + /// + public int FreezeCount { get; private set; } + + private bool _playFlag = false; + private float _grey = 0; + + /// + /// 冻结时调用 + /// + protected virtual void OnFreeze() + { + } + + public override void OnInit() + { + if (!string.IsNullOrEmpty(AnimationName)) + { + _playFlag = true; + AnimatedSprite.AnimationFinished += OnAnimationFinished; + AnimatedSprite.Play(AnimationName); + } + } + + protected override void Process(float delta) + { + //落地静止后将弹壳变为静态贴图 + if (!_playFlag &&!IsThrowing && Altitude <= 0 && MoveController.IsMotionless()) + { + if (AutoToGrey && _grey < 1) + { + //变灰动画时间, 0.5秒 + _grey = Mathf.Min(1, _grey + delta / 0.5f); + Grey = _grey; + return; + } + if (AffiliationArea != null) + { + OnFreeze(); + Freeze(); + FreezeCount++; + } + else + { + Debug.Log(Name + "投抛到画布外了, 强制消除..."); + Destroy(); + } + } + } + + private void OnAnimationFinished() + { + _playFlag = false; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/package/IPackageItem.cs b/DungeonShooting_Godot/src/game/activity/package/IPackageItem.cs index aca7c9d..93a5774 100644 --- a/DungeonShooting_Godot/src/game/activity/package/IPackageItem.cs +++ b/DungeonShooting_Godot/src/game/activity/package/IPackageItem.cs @@ -1,13 +1,13 @@ /// -/// 可放入背包中的物体接口 +/// 可放入背包中的物体接口,泛型T表示所属角色对象类型 /// -public interface IPackageItem +public interface IPackageItem where T : Role { /// /// 物体所属角色 /// - Role Master { get; set; } + T Master { get; set; } /// /// 物体在背包中的索引, 如果不在背包中则为 -1 diff --git a/DungeonShooting_Godot/src/game/activity/package/Package.cs b/DungeonShooting_Godot/src/game/activity/package/Package.cs index 378f7ef..7c2d6e4 100644 --- a/DungeonShooting_Godot/src/game/activity/package/Package.cs +++ b/DungeonShooting_Godot/src/game/activity/package/Package.cs @@ -4,7 +4,7 @@ /// /// 物体背包类 /// -public class Package : Component where T : ActivityObject, IPackageItem +public class Package : Component where T : ActivityObject, IPackageItem where S : Role { /// /// 当前使用对象改变时回调 @@ -56,16 +56,15 @@ { capacity = 0; } - - if (capacity == Capacity) - { - return; - } - + if (ItemSlot == null) { ItemSlot = new T[capacity]; } + else if (capacity == Capacity) + { + return; + } else if (ItemSlot.Length > capacity) //删减格子 { var newArray = new T[capacity]; @@ -76,9 +75,8 @@ { newArray[i] = packageItem; } - else + else if (packageItem != null) //溢出的item { - //溢出的item packageItem.OnOverflowItem(); packageItem.Master = null; packageItem.PackageIndex = -1; @@ -97,7 +95,6 @@ ItemSlot = newArray; } Capacity = capacity; - } /// @@ -153,7 +150,7 @@ for (var i = 0; i < ItemSlot.Length; i++) { var item = ItemSlot[i]; - if (item != null && item.ItemConfig.Id == id) + if (item != null && item.ActivityBase.Id == id) { return i; } @@ -422,7 +419,7 @@ for (var i = 0; i < ItemSlot.Length; i++) { var packageItem = ItemSlot[i]; - if (packageItem != null && packageItem.ItemConfig.Id == itemId) + if (packageItem != null && packageItem.ActivityBase.Id == itemId) { return i; } @@ -444,7 +441,7 @@ for (var i = 0; i < ItemSlot.Length; i++) { var packageItem = ItemSlot[i]; - if (packageItem != null && packageItem.ItemConfig.Id == itemId) + if (packageItem != null && packageItem.ActivityBase.Id == itemId) { return packageItem; } diff --git a/DungeonShooting_Godot/src/game/activity/prop/Prop.cs b/DungeonShooting_Godot/src/game/activity/prop/Prop.cs index 1e937e9..c79dfc0 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/Prop.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/Prop.cs @@ -47,7 +47,7 @@ //阴影偏移 ShadowOffset = new Vector2(0, 2); GlobalRotation = 0; - var startHeight = -master.MountPoint.Position.Y; + var startHeight = 8; Throw(startPosition, startHeight, 0, Vector2.Zero, 0); //继承role的移动速度 diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs index ea3f772..93d7df6 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp.cs @@ -4,7 +4,7 @@ /// /// 主动使用道具 /// -public abstract partial class ActiveProp : Prop, IPackageItem +public abstract partial class ActiveProp : Prop, IPackageItem { public int PackageIndex { get; set; } @@ -230,7 +230,12 @@ { if (master is Player player) { - var item = player.ActivePropsPack.GetItemById(ItemConfig.Id); + if (player.ActivePropsPack.Capacity == 0) + { + //容量为0 + return; + } + var item = player.ActivePropsPack.GetItemById(ActivityBase.Id); if (item == null) //没有同类型物体 { if (!player.ActivePropsPack.HasVacancy()) //没有空位置, 扔掉当前道具 @@ -268,8 +273,13 @@ { if (master is Player player) { + if (player.ActivePropsPack.Capacity == 0) + { + //容量为0 + return new CheckInteractiveResult(this); + } //查找相同类型的道具 - var item = player.ActivePropsPack.GetItemById(ItemConfig.Id); + var item = player.ActivePropsPack.GetItemById(ActivityBase.Id); if (item == null) //没有同类型物体 { if (player.ActivePropsPack.HasVacancy()) //还有空位, 拾起道具 @@ -312,5 +322,6 @@ public virtual void OnOverflowItem() { + Master.ThrowActiveProp(PackageIndex); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs index e9f0852..2bac5e6 100644 --- a/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs +++ b/DungeonShooting_Godot/src/game/activity/prop/active/ActiveProp5001.cs @@ -27,6 +27,7 @@ weapon.SetTotalAmmo(weapon.Attribute.MaxAmmoCapacity); return 1; } + return 0; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0001.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0001.cs new file mode 100644 index 0000000..50c3417 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0001.cs @@ -0,0 +1,23 @@ + +using Godot; + +/// +/// 移速 buff, 移速 + 3 +/// +[Tool] +public partial class BuffProp0001 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.MoveSpeed += 30; + Master.RoleState.Acceleration += 400; + Master.RoleState.Friction += 300; + } + + public override void OnRemoveItem() + { + Master.RoleState.MoveSpeed -= 30; + Master.RoleState.Acceleration -= 400; + Master.RoleState.Friction -= 300; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0002.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0002.cs new file mode 100644 index 0000000..ec3b255 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0002.cs @@ -0,0 +1,20 @@ + +using Godot; + +/// +/// 血量上限buff, 心之容器 + 1 +/// +[Tool] +public partial class BuffProp0002 : BuffProp +{ + public override void OnPickUpItem() + { + Master.MaxHp += 2; + Master.Hp += 2; + } + + public override void OnRemoveItem() + { + Master.MaxHp -= 2; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0003.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0003.cs new file mode 100644 index 0000000..7ecf063 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0003.cs @@ -0,0 +1,20 @@ + +using Godot; + +/// +/// 护盾上限buff, 护盾 + 1 +/// +[Tool] +public partial class BuffProp0003 : BuffProp +{ + public override void OnPickUpItem() + { + Master.MaxShield += 1; + Master.Shield += 1; + } + + public override void OnRemoveItem() + { + Master.MaxShield -= 1; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0004.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0004.cs new file mode 100644 index 0000000..f66ab3b --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0004.cs @@ -0,0 +1,19 @@ + +using Godot; + +/// +/// 护盾恢复时间buff, 恢复时间 - 2.5s +/// +[Tool] +public partial class BuffProp0004 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.ShieldRecoveryTime -= 2.5f; + } + + public override void OnRemoveItem() + { + Master.RoleState.ShieldRecoveryTime += 2.5f; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0005.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0005.cs new file mode 100644 index 0000000..37783e6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0005.cs @@ -0,0 +1,24 @@ + +using Godot; + +/// +/// 提升伤害buff, 子弹伤害提升20% +/// +[Tool] +public partial class BuffProp0005 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcDamageEvent += CalcDamage; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcDamageEvent -= CalcDamage; + } + + private void CalcDamage(int originDamage, RefValue refValue) + { + refValue.Value += Mathf.CeilToInt(originDamage * 0.2f); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0006.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0006.cs new file mode 100644 index 0000000..8076c29 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0006.cs @@ -0,0 +1,19 @@ + +using Godot; + +/// +/// 延长无敌时间buff, 受伤后无敌时间 + 2s +/// +[Tool] +public partial class BuffProp0006 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.WoundedInvincibleTime += 2f; + } + + public override void OnRemoveItem() + { + Master.RoleState.WoundedInvincibleTime -= 2f; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0007.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0007.cs new file mode 100644 index 0000000..e83b525 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0007.cs @@ -0,0 +1,27 @@ + +using Godot; + +/// +/// 受伤时有15%概率抵消伤害 +/// +[Tool] +public partial class BuffProp0007 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcHurtDamageEvent += CalcHurtDamageEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcHurtDamageEvent -= CalcHurtDamageEvent; + } + + private void CalcHurtDamageEvent(int originDamage, RefValue refValue) + { + if (refValue.Value > 0 && Utils.Random.RandomBoolean(0.15f)) + { + refValue.Value = 0; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0008.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0008.cs new file mode 100644 index 0000000..b7d2de6 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0008.cs @@ -0,0 +1,31 @@ + +using Godot; + +/// +/// 眼镜, 提高武器50%精准度 +/// +[Tool] +public partial class BuffProp0008 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcStartScatteringEvent += CalcStartScatteringEvent; + Master.RoleState.CalcFinalScatteringEvent += CalcFinalScatteringEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcStartScatteringEvent -= CalcStartScatteringEvent; + Master.RoleState.CalcFinalScatteringEvent -= CalcFinalScatteringEvent; + } + + private void CalcStartScatteringEvent(float originValue, RefValue refValue) + { + refValue.Value *= 0.5f; + } + + private void CalcFinalScatteringEvent(float originValue, RefValue refValue) + { + refValue.Value *= 0.5f; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0009.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0009.cs new file mode 100644 index 0000000..4fad8f8 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0009.cs @@ -0,0 +1,31 @@ + +using Godot; + +/// +/// 高速子弹 子弹速度和射程提升25% +/// +[Tool] +public partial class BuffProp0009 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcBulletSpeedEvent += CalcBulletSpeedEvent; + Master.RoleState.CalcBulletDistanceEvent += CalcBulletDistanceEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcBulletSpeedEvent -= CalcBulletSpeedEvent; + Master.RoleState.CalcBulletDistanceEvent -= CalcBulletDistanceEvent; + } + + private void CalcBulletSpeedEvent(float originSpeed, RefValue speed) + { + speed.Value += originSpeed * 0.25f; + } + + private void CalcBulletDistanceEvent(float originDistance, RefValue distance) + { + distance.Value += originDistance * 0.25f; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0010.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0010.cs new file mode 100644 index 0000000..6254213 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0010.cs @@ -0,0 +1,63 @@ + +using Godot; + +/// +/// 分裂子弹 子弹数量翻倍, 但是精准度, 击退和伤害降低 +/// +[Tool] +public partial class BuffProp0010 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcBulletCountEvent += CalcBulletCountEvent; + Master.RoleState.CalcBulletDeviationAngleEvent += CalcBulletDeviationAngleEvent; + Master.RoleState.CalcDamageEvent += CalcDamageEvent; + Master.RoleState.CalcBulletSpeedEvent += CalcBulletSpeedEvent; + Master.RoleState.CalcBulletRepelEvent += CalcBulletRepelEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcBulletCountEvent -= CalcBulletCountEvent; + Master.RoleState.CalcBulletDeviationAngleEvent -= CalcBulletDeviationAngleEvent; + Master.RoleState.CalcDamageEvent -= CalcDamageEvent; + Master.RoleState.CalcBulletSpeedEvent -= CalcBulletSpeedEvent; + Master.RoleState.CalcBulletRepelEvent -= CalcBulletRepelEvent; + } + + private void CalcBulletCountEvent(int originCount, RefValue refValue) + { + refValue.Value += originCount; + } + + private void CalcBulletDeviationAngleEvent(float originAngle, RefValue refValue) + { + refValue.Value += Utils.Random.RandomRangeFloat(-8, 8); + } + + private void CalcDamageEvent(int originDamage, RefValue refValue) + { + if (refValue.Value <= 0) + { + return; + } + + refValue.Value = Mathf.Max(1, refValue.Value - Mathf.FloorToInt(refValue.Value * 0.35f)); + } + + private void CalcBulletSpeedEvent(float originSpeed, RefValue speed) + { + speed.Value += originSpeed * Utils.Random.RandomRangeFloat(-0.05f, 0.05f); + } + + private void CalcBulletRepelEvent(float originRepel, RefValue repel) + { + if (repel.Value < 0 || (Master.WeaponPack.ActiveItem != null && + Master.WeaponPack.ActiveItem.Attribute.IsMelee)) + { + return; + } + + repel.Value = Mathf.Max(1, repel.Value - Mathf.FloorToInt(repel.Value * 0.35f)); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0011.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0011.cs new file mode 100644 index 0000000..6485291 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0011.cs @@ -0,0 +1,24 @@ + +using Godot; + +/// +/// 弹射子弹 子弹反弹次数 +2 +/// +[Tool] +public partial class BuffProp0011 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcBulletBounceCountEvent += CalcBulletBounceCountEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcBulletBounceCountEvent -= CalcBulletBounceCountEvent; + } + + private void CalcBulletBounceCountEvent(int originBounce, RefValue bounce) + { + bounce.Value += 2; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0012.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0012.cs new file mode 100644 index 0000000..a24b0fc --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0012.cs @@ -0,0 +1,24 @@ + +using Godot; + +/// +/// 穿透子弹 子弹穿透+1 +/// +[Tool] +public partial class BuffProp0012 : BuffProp +{ + public override void OnPickUpItem() + { + Master.RoleState.CalcBulletPenetrationEvent += CalcBulletPenetrationEvent; + } + + public override void OnRemoveItem() + { + Master.RoleState.CalcBulletPenetrationEvent -= CalcBulletPenetrationEvent; + } + + private void CalcBulletPenetrationEvent(int origin, RefValue penetration) + { + penetration.Value += 1; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0013.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0013.cs new file mode 100644 index 0000000..e43270a --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0013.cs @@ -0,0 +1,18 @@ +using Godot; + +/// +/// 武器背包 武器容量+1 +/// +[Tool] +public partial class BuffProp0013 : BuffProp +{ + public override void OnPickUpItem() + { + Master.WeaponPack.SetCapacity(Master.WeaponPack.Capacity + 1); + } + + public override void OnRemoveItem() + { + Master.WeaponPack.SetCapacity(Master.WeaponPack.Capacity - 1); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0014.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0014.cs new file mode 100644 index 0000000..b09db41 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffProp0014.cs @@ -0,0 +1,18 @@ +using Godot; + +/// +/// 道具背包 道具容量+1 +/// +[Tool] +public partial class BuffProp0014 : BuffProp +{ + public override void OnPickUpItem() + { + Master.ActivePropsPack.SetCapacity(Master.ActivePropsPack.Capacity + 1); + } + + public override void OnRemoveItem() + { + Master.ActivePropsPack.SetCapacity(Master.ActivePropsPack.Capacity - 1); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0001.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0001.cs deleted file mode 100644 index 5ee7937..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0001.cs +++ /dev/null @@ -1,23 +0,0 @@ - -using Godot; - -/// -/// 移速 buff, 移速 + 3 -/// -[Tool] -public partial class BuffPropProp0001 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.MoveSpeed += 30; - Master.RoleState.Acceleration += 400; - Master.RoleState.Friction += 300; - } - - public override void OnRemoveItem() - { - Master.RoleState.MoveSpeed -= 30; - Master.RoleState.Acceleration -= 400; - Master.RoleState.Friction -= 300; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0002.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0002.cs deleted file mode 100644 index 198ad79..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0002.cs +++ /dev/null @@ -1,20 +0,0 @@ - -using Godot; - -/// -/// 血量上限buff, 心之容器 + 1 -/// -[Tool] -public partial class BuffPropProp0002 : BuffProp -{ - public override void OnPickUpItem() - { - Master.MaxHp += 2; - Master.Hp += 2; - } - - public override void OnRemoveItem() - { - Master.MaxHp -= 2; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0003.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0003.cs deleted file mode 100644 index 64f9fde..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0003.cs +++ /dev/null @@ -1,20 +0,0 @@ - -using Godot; - -/// -/// 护盾上限buff, 护盾 + 1 -/// -[Tool] -public partial class BuffPropProp0003 : BuffProp -{ - public override void OnPickUpItem() - { - Master.MaxShield += 1; - Master.Shield += 1; - } - - public override void OnRemoveItem() - { - Master.MaxShield -= 1; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0004.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0004.cs deleted file mode 100644 index 306ae09..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0004.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using Godot; - -/// -/// 护盾恢复时间buff, 恢复时间 - 1.5s -/// -[Tool] -public partial class BuffPropProp0004 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.ShieldRecoveryTime -= 1.5f; - } - - public override void OnRemoveItem() - { - Master.RoleState.ShieldRecoveryTime += 1.5f; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0005.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0005.cs deleted file mode 100644 index 8beac22..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0005.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using Godot; - -/// -/// 提升伤害buff, 子弹伤害提升20% -/// -[Tool] -public partial class BuffPropProp0005 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.CalcDamageEvent += CalcDamage; - } - - public override void OnRemoveItem() - { - Master.RoleState.CalcDamageEvent -= CalcDamage; - } - - private void CalcDamage(int originDamage, RefValue refValue) - { - refValue.Value += Mathf.CeilToInt(originDamage * 0.2f); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0006.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0006.cs deleted file mode 100644 index 4c91d6d..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0006.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using Godot; - -/// -/// 延长无敌时间buff, 受伤后无敌时间 + 2s -/// -[Tool] -public partial class BuffPropProp0006 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.WoundedInvincibleTime += 2f; - } - - public override void OnRemoveItem() - { - Master.RoleState.WoundedInvincibleTime -= 2f; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0007.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0007.cs deleted file mode 100644 index 7c39b5c..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0007.cs +++ /dev/null @@ -1,27 +0,0 @@ - -using Godot; - -/// -/// 受伤时有15%概率抵消伤害 -/// -[Tool] -public partial class BuffPropProp0007 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.CalcHurtDamageEvent += CalcHurtDamageEvent; - } - - public override void OnRemoveItem() - { - Master.RoleState.CalcHurtDamageEvent -= CalcHurtDamageEvent; - } - - private void CalcHurtDamageEvent(int originDamage, RefValue refValue) - { - if (refValue.Value > 0 && Utils.Random.RandomBoolean(0.15f)) - { - refValue.Value = 0; - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0008.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0008.cs deleted file mode 100644 index 7946f62..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0008.cs +++ /dev/null @@ -1,31 +0,0 @@ - -using Godot; - -/// -/// 眼镜, 提高武器50%精准度 -/// -[Tool] -public partial class BuffPropProp0008 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.CalcStartScatteringEvent += CalcStartScatteringEvent; - Master.RoleState.CalcFinalScatteringEvent += CalcFinalScatteringEvent; - } - - public override void OnRemoveItem() - { - Master.RoleState.CalcStartScatteringEvent -= CalcStartScatteringEvent; - Master.RoleState.CalcFinalScatteringEvent -= CalcFinalScatteringEvent; - } - - private void CalcStartScatteringEvent(Weapon weapon, float originValue, RefValue refValue) - { - refValue.Value *= 0.5f; - } - - private void CalcFinalScatteringEvent(Weapon weapon, float originValue, RefValue refValue) - { - refValue.Value *= 0.5f; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0009.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0009.cs deleted file mode 100644 index 38b9e45..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0009.cs +++ /dev/null @@ -1,31 +0,0 @@ - -using Godot; - -/// -/// 高速子弹 子弹速度和射程提升25% -/// -[Tool] -public partial class BuffPropProp0009 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.CalcBulletSpeedEvent += CalcBulletSpeedEvent; - Master.RoleState.CalcBulletDistanceEvent += CalcBulletDistanceEvent; - } - - public override void OnRemoveItem() - { - Master.RoleState.CalcBulletSpeedEvent -= CalcBulletSpeedEvent; - Master.RoleState.CalcBulletDistanceEvent -= CalcBulletDistanceEvent; - } - - private void CalcBulletSpeedEvent(Weapon weapon, float originSpeed, RefValue speed) - { - speed.Value += originSpeed * 0.25f; - } - - private void CalcBulletDistanceEvent(Weapon weapon, float originDistance, RefValue distance) - { - distance.Value += originDistance * 0.25f; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0010.cs b/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0010.cs deleted file mode 100644 index b359f48..0000000 --- a/DungeonShooting_Godot/src/game/activity/prop/buff/BuffPropProp0010.cs +++ /dev/null @@ -1,50 +0,0 @@ - -using Godot; - -/// -/// 分裂子弹 子弹数量翻倍, 但是精准度和伤害降低 -/// -[Tool] -public partial class BuffPropProp0010 : BuffProp -{ - public override void OnPickUpItem() - { - Master.RoleState.CalcBulletCountEvent += CalcBulletCountEvent; - Master.RoleState.CalcBulletDeviationAngleEvent += CalcBulletDeviationAngleEvent; - Master.RoleState.CalcDamageEvent += CalcDamageEvent; - Master.RoleState.CalcBulletSpeedEvent += CalcBulletSpeedEvent; - } - - public override void OnRemoveItem() - { - Master.RoleState.CalcBulletCountEvent -= CalcBulletCountEvent; - Master.RoleState.CalcBulletDeviationAngleEvent -= CalcBulletDeviationAngleEvent; - Master.RoleState.CalcDamageEvent -= CalcDamageEvent; - Master.RoleState.CalcBulletSpeedEvent -= CalcBulletSpeedEvent; - } - - private void CalcBulletCountEvent(Weapon weapon, int originCount, RefValue refValue) - { - refValue.Value += originCount; - } - - private void CalcBulletDeviationAngleEvent(Weapon weapon, float originAngle, RefValue refValue) - { - refValue.Value += Utils.Random.RandomRangeFloat(-8, 8); - } - - private void CalcDamageEvent(int originDamage, RefValue refValue) - { - if (refValue.Value <= 0) - { - return; - } - - refValue.Value = Mathf.Max(1, refValue.Value - Mathf.FloorToInt(originDamage * 0.4f)); - } - - private void CalcBulletSpeedEvent(Weapon weapon, float originSpeed, RefValue speed) - { - speed.Value += originSpeed * Utils.Random.RandomRangeFloat(-0.05f, 0.05f); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index f9a1f9f..2facc09 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -1,3 +1,4 @@ + using System.Collections; using System.Collections.Generic; using Godot; @@ -15,7 +16,7 @@ /// /// 角色属性 /// - public RoleState RoleState { get; } = new RoleState(); + public RoleState RoleState { get; private set; } /// /// 默认攻击对象层级 @@ -57,24 +58,8 @@ /// /// 携带的主动道具包裹 /// - public Package ActivePropsPack { get; private set; } - - /// - /// 角色携带的武器背包 - /// - public Package WeaponPack { get; private set; } - - /// - /// 武器挂载点 - /// - [Export, ExportFillNode] - public MountRotation MountPoint { get; set; } - /// - /// 背后武器的挂载点 - /// - [Export, ExportFillNode] - public Marker2D BackMountPoint { get; set; } - + public Package ActivePropsPack { get; private set; } + /// /// 互动碰撞区域 /// @@ -88,6 +73,47 @@ public CollisionShape2D InteractiveCollision { get; set; } /// + /// 用于提示状态的根节点 + /// + [Export, ExportFillNode] + public Node2D TipRoot { get; set; } + + /// + /// 用于提示当前敌人状态 + /// + [Export, ExportFillNode] + public AnimatedSprite2D TipSprite { get; set; } + + /// + /// 动画播放器 + /// + [Export, ExportFillNode] + public AnimationPlayer AnimationPlayer { get; set; } + + /// + /// 脸的朝向 + /// + public FaceDirection Face { get => _face; set => SetFace(value); } + private FaceDirection _face; + + /// + /// 角色携带的武器背包 + /// + public Package WeaponPack { get; private set; } + + /// + /// 武器挂载点 + /// + [Export, ExportFillNode] + public MountRotation MountPoint { get; set; } + + /// + /// 背后武器的挂载点 + /// + [Export, ExportFillNode] + public Marker2D BackMountPoint { get; set; } + + /// /// 近战碰撞检测区域 /// [Export, ExportFillNode] @@ -109,12 +135,36 @@ /// 武器挂载点是否始终指向目标 /// public bool MountLookTarget { get; set; } = true; + + /// + /// 是否处于攻击中, 近战攻击远程攻击都算 + /// + public bool IsAttack + { + get + { + if (AttackTimer > 0 || MeleeAttackTimer > 0) + { + return true; + } + var weapon = WeaponPack.ActiveItem; + if (weapon != null) + { + return weapon.GetAttackTimer() > 0 || weapon.GetContinuousCount() > 0; + } + return false; + } + } + + /// + /// 攻击计时器 + /// + public float AttackTimer { get; set; } /// - /// 脸的朝向 + /// 近战计时器 /// - public FaceDirection Face { get => _face; set => SetFace(value); } - private FaceDirection _face; + public float MeleeAttackTimer { get; set; } /// /// 是否死亡 @@ -241,36 +291,32 @@ private bool _invincible = false; /// - /// 当前角色所看向的对象, 也就是枪口指向的对象 - /// - public ActivityObject LookTarget { get; set; } - - /// /// 当前可以互动的物体 /// public ActivityObject InteractiveItem { get; private set; } - - /// - /// 是否可以翻滚 - /// - public bool CanRoll => _rollCoolingTimer <= 0; - - /// - /// 是否处于近战攻击中 - /// - public bool IsMeleeAttack { get; private set; } - + /// /// 瞄准辅助线, 需要手动调用 InitSubLine() 初始化 /// public SubLine SubLine { get; private set; } - //翻滚冷却计时器 - private float _rollCoolingTimer = 0; + /// + /// 所有角色碰撞的物体 + /// + public List InteractiveItemList { get; } = new List(); + + /// + /// 角色看向的坐标 + /// + public Vector2 LookPosition { get; protected set; } + + /// + /// 是否可以在没有武器时发动攻击 + /// + public bool NoWeaponAttack { get; set; } + //初始缩放 private Vector2 _startScale; - //所有角色碰撞的物体 - private readonly List _interactiveItemList = new List(); //当前可互动的物体 private CheckInteractiveResult _currentResultData; private uint _currentLayer; @@ -282,9 +328,26 @@ private long _invincibleFlashingId = -1; //护盾恢复计时器 private float _shieldRecoveryTimer = 0; - //近战计时器 - private float _meleeAttackTimer = 0; + protected override void OnExamineExportFillNode(string propertyName, Node node, bool isJustCreated) + { + base.OnExamineExportFillNode(propertyName, node, isJustCreated); + if (propertyName == nameof(TipSprite)) + { + var sprite = (AnimatedSprite2D)node; + sprite.SpriteFrames = + ResourceManager.Load(ResourcePath.resource_spriteFrames_role_Role_tip_tres); + } + } + + /// + /// 创建角色的 RoleState 对象 + /// + protected virtual RoleState OnCreateRoleState() + { + return new RoleState(); + } + /// /// 当血量改变时调用 /// @@ -323,9 +386,11 @@ /// /// 当受伤时调用 /// + /// 触发伤害的对象, 为 null 表示不存在对象或者对象已经被销毁 /// 受到的伤害 + /// 伤害角度(弧度制) /// 是否受到真实伤害, 如果为false, 则表示该伤害被互动格挡掉了 - protected virtual void OnHit(int damage, bool realHarm) + protected virtual void OnHit(ActivityObject target, int damage, float angle, bool realHarm) { } @@ -353,28 +418,8 @@ protected virtual void OnDie() { } - - /// - /// 当拾起某个武器时调用 - /// - protected virtual void OnPickUpWeapon(Weapon weapon) - { - } - /// - /// 当扔掉某个武器时调用 - /// - protected virtual void OnThrowWeapon(Weapon weapon) - { - } - - /// - /// 当切换到某个武器时调用 - /// - protected virtual void OnExchangeWeapon(Weapon weapon) - { - } - + /// /// 当拾起某个主动道具时调用 /// @@ -409,16 +454,14 @@ protected virtual void OnRemoveBuffProp(BuffProp buffProp) { } - + public override void OnInit() { - ActivePropsPack = AddComponent>(); - ActivePropsPack.SetCapacity(1); - WeaponPack = AddComponent>(); - WeaponPack.SetCapacity(4); - + RoleState = OnCreateRoleState(); + ActivePropsPack = AddComponent>(); + ActivePropsPack.SetCapacity(RoleState.CanPickUpWeapon ? 1 : 0); + _startScale = Scale; - MountPoint.Master = this; HurtArea.CollisionLayer = CollisionLayer; HurtArea.CollisionMask = 0; @@ -430,6 +473,13 @@ InteractiveArea.BodyEntered += _OnPropsEnter; InteractiveArea.BodyExited += _OnPropsExit; + //------------------------ + + WeaponPack = AddComponent>(); + WeaponPack.SetCapacity(2); + + MountPoint.Master = this; + MeleeAttackCollision.Disabled = true; //切换武器回调 WeaponPack.ChangeActiveItemEvent += OnChangeActiveItem; @@ -443,44 +493,27 @@ { return; } - if (_rollCoolingTimer > 0) + + if (AttackTimer > 0) { - _rollCoolingTimer -= delta; + AttackTimer -= delta; } - if (_meleeAttackTimer > 0) + if (MeleeAttackTimer > 0) { - _meleeAttackTimer -= delta; - } - - //看向目标 - if (LookTarget != null && MountLookTarget) - { - Vector2 pos = LookTarget.GlobalPosition; - //脸的朝向 - var gPos = GlobalPosition; - if (pos.X > gPos.X && Face == FaceDirection.Left) - { - Face = FaceDirection.Right; - } - else if (pos.X < gPos.X && Face == FaceDirection.Right) - { - Face = FaceDirection.Left; - } - //枪口跟随目标 - MountPoint.SetLookAt(pos); + MeleeAttackTimer -= delta; } //检查可互动的物体 bool findFlag = false; - for (int i = 0; i < _interactiveItemList.Count; i++) + for (int i = 0; i < InteractiveItemList.Count; i++) { - var item = _interactiveItemList[i]; + var item = InteractiveItemList[i]; if (item == null || item.IsDestroyed) { - _interactiveItemList.RemoveAt(i--); + InteractiveItemList.RemoveAt(i--); } - else + else if (!item.IsThrowing) { //找到可互动的物体了 if (!findFlag) @@ -578,8 +611,17 @@ } } } + + if (Face == FaceDirection.Right) + { + TipRoot.Scale = Vector2.One; + } + else + { + TipRoot.Scale = new Vector2(-1, 1); + } } - + /// /// 初始化瞄准辅助线 /// @@ -593,50 +635,7 @@ SubLine = AddComponent(); } - /// - /// 当武器放到后背时调用, 用于设置武器位置和角度 - /// - /// 武器实例 - /// 放入武器背包的位置 - public virtual void OnPutBackMount(Weapon weapon, int index) - { - if (index < 8) - { - if (index % 2 == 0) - { - weapon.Position = new Vector2(-4, 3); - weapon.RotationDegrees = 90 - (index / 2f) * 20; - weapon.Scale = new Vector2(-1, 1); - } - else - { - weapon.Position = new Vector2(4, 3); - weapon.RotationDegrees = 270 + (index - 1) / 2f * 20; - weapon.Scale = new Vector2(1, 1); - } - } - else - { - weapon.Visible = false; - } - } - protected override void OnAffiliationChange(AffiliationArea prevArea) - { - //身上的武器的所属区域也得跟着变 - WeaponPack.ForEach((weapon, i) => - { - if (AffiliationArea != null) - { - AffiliationArea.InsertItem(weapon); - } - else if (weapon.AffiliationArea != null) - { - weapon.AffiliationArea.RemoveItem(weapon); - } - }); - } - /// /// 是否是满血 /// @@ -646,38 +645,6 @@ } /// - /// 获取当前角色的中心点坐标 - /// - public Vector2 GetCenterPosition() - { - return MountPoint.GlobalPosition; - } - - /// - /// 使角色看向指定的坐标, - /// 注意, 调用该函数会清空 LookTarget, 因为拥有 LookTarget 时也会每帧更新玩家视野位置 - /// - public void LookTargetPosition(Vector2 pos) - { - LookTarget = null; - if (MountLookTarget) - { - //脸的朝向 - var gPos = GlobalPosition; - if (pos.X > gPos.X && Face == FaceDirection.Left) - { - Face = FaceDirection.Right; - } - else if (pos.X < gPos.X && Face == FaceDirection.Right) - { - Face = FaceDirection.Left; - } - //枪口跟随目标 - MountPoint.SetLookAt(pos); - } - } - - /// /// 判断指定坐标是否在角色视野方向 /// public bool IsPositionInForward(Vector2 pos) @@ -686,101 +653,9 @@ return (Face == FaceDirection.Left && pos.X <= gps.X) || (Face == FaceDirection.Right && pos.X >= gps.X); } - - /// - /// 返回所有武器是否弹药都打光了 - /// - public bool IsAllWeaponTotalAmmoEmpty() - { - foreach (var weapon in WeaponPack.ItemSlot) - { - if (weapon != null && !weapon.IsTotalAmmoEmpty()) - { - return false; - } - } - - return true; - } - //------------------------------------------------------------------------------------- /// - /// 拾起一个武器, 返回是否成功拾起, 如果不想立刻切换到该武器, exchange 请传 false - /// - /// 武器对象 - /// 是否立即切换到该武器, 默认 true - public bool PickUpWeapon(Weapon weapon, bool exchange = true) - { - if (WeaponPack.PickupItem(weapon, exchange) != -1) - { - //从可互动队列中移除 - _interactiveItemList.Remove(weapon); - OnPickUpWeapon(weapon); - return true; - } - - return false; - } - - /// - /// 切换到下一个武器 - /// - public void ExchangeNextWeapon() - { - var weapon = WeaponPack.ActiveItem; - WeaponPack.ExchangeNext(); - if (WeaponPack.ActiveItem != weapon) - { - OnExchangeWeapon(WeaponPack.ActiveItem); - } - } - - /// - /// 切换到上一个武器 - /// - public void ExchangePrevWeapon() - { - var weapon = WeaponPack.ActiveItem; - WeaponPack.ExchangePrev(); - if (WeaponPack.ActiveItem != weapon) - { - OnExchangeWeapon(WeaponPack.ActiveItem); - } - } - - /// - /// 扔掉当前使用的武器, 切换到上一个武器 - /// - public void ThrowWeapon() - { - ThrowWeapon(WeaponPack.ActiveIndex); - } - - /// - /// 扔掉指定位置的武器 - /// - /// 武器在武器背包中的位置 - public void ThrowWeapon(int index) - { - var weapon = WeaponPack.GetItem(index); - if (weapon == null) - { - return; - } - - var temp = weapon.AnimatedSprite.Position; - if (Face == FaceDirection.Left) - { - temp.Y = -temp.Y; - } - //var pos = GlobalPosition + temp.Rotated(weapon.GlobalRotation); - WeaponPack.RemoveItem(index); - //播放抛出效果 - weapon.ThrowWeapon(this, GlobalPosition); - } - - /// /// 拾起主动道具, 返回是否成功拾起, 如果不想立刻切换到该道具, exchange 请传 false /// /// 主动道具对象 @@ -790,7 +665,7 @@ if (ActivePropsPack.PickupItem(activeProp, exchange) != -1) { //从可互动队列中移除 - _interactiveItemList.Remove(activeProp); + InteractiveItemList.Remove(activeProp); OnPickUpActiveProp(activeProp); return true; } @@ -799,32 +674,6 @@ } /// - /// 切换到下一个武器 - /// - public void ExchangeNextActiveProp() - { - var prop = ActivePropsPack.ActiveItem; - ActivePropsPack.ExchangeNext(); - if (prop != ActivePropsPack.ActiveItem) - { - OnExchangeActiveProp(ActivePropsPack.ActiveItem); - } - } - - /// - /// 切换到上一个武器 - /// - public void ExchangePrevActiveProp() - { - var prop = ActivePropsPack.ActiveItem; - ActivePropsPack.ExchangePrev(); - if (prop != ActivePropsPack.ActiveItem) - { - OnExchangeActiveProp(ActivePropsPack.ActiveItem); - } - } - - /// /// 扔掉当前使用的道具 /// public void ThrowActiveProp() @@ -901,8 +750,7 @@ //播放抛出效果 buffProp.ThrowProp(this, GlobalPosition); } - - //------------------------------------------------------------------------------------- + /// /// 返回是否存在可互动的物体 @@ -926,55 +774,8 @@ return null; } - - /// - /// 触发换弹 - /// - public virtual void Reload() - { - if (WeaponPack.ActiveItem != null) - { - WeaponPack.ActiveItem.Reload(); - } - } - - /// - /// 触发攻击 - /// - public virtual void Attack() - { - if (!IsMeleeAttack && WeaponPack.ActiveItem != null) - { - WeaponPack.ActiveItem.Trigger(this); - } - } - - /// - /// 触发近战攻击 - /// - public virtual void MeleeAttack() - { - if (IsMeleeAttack || _meleeAttackTimer > 0) - { - return; - } - - if (WeaponPack.ActiveItem != null && WeaponPack.ActiveItem.Attribute.CanMeleeAttack) - { - IsMeleeAttack = true; - _meleeAttackTimer = RoleState.MeleeAttackTime; - MountLookTarget = false; - - //WeaponPack.ActiveItem.TriggerMeleeAttack(this); - //播放近战动画 - PlayAnimation_MeleeAttack(() => - { - MountLookTarget = true; - IsMeleeAttack = false; - }); - } - } - + + /// /// 触发使用道具 /// @@ -990,9 +791,10 @@ /// /// 受到伤害, 如果是在碰撞信号处理函数中调用该函数, 请使用 CallDeferred 来延时调用, 否则很有可能导致报错 /// + /// 触发伤害的对象, 为 null 表示不存在对象或者对象已经被销毁 /// 伤害的量 /// 伤害角度(弧度制) - public virtual void Hurt(int damage, float angle) + public virtual void Hurt(ActivityObject target, int damage, float angle) { //受伤闪烁, 无敌状态 if (Invincible) @@ -1009,7 +811,7 @@ } else { - damage = RoleState.CallCalcHurtDamageEvent(damage); + damage = RoleState.CalcHurtDamage(damage); if (damage > 0) { Hp -= damage; @@ -1021,7 +823,7 @@ // blood.Rotation = angle; // GameApplication.Instance.Node3D.GetRoot().AddChild(blood); } - OnHit(damage, !flag); + OnHit(target, damage, angle, !flag); //受伤特效 PlayHitAnimation(); @@ -1102,9 +904,9 @@ { if (other is ActivityObject propObject && !propObject.CollisionWithMask(PhysicsLayer.OnHand)) { - if (!_interactiveItemList.Contains(propObject)) + if (!InteractiveItemList.Contains(propObject)) { - _interactiveItemList.Add(propObject); + InteractiveItemList.Add(propObject); } } } @@ -1117,9 +919,9 @@ { if (other is ActivityObject propObject) { - if (_interactiveItemList.Contains(propObject)) + if (InteractiveItemList.Contains(propObject)) { - _interactiveItemList.Remove(propObject); + InteractiveItemList.Remove(propObject); } if (InteractiveItem == propObject) { @@ -1130,87 +932,8 @@ } } } - - /// - /// 切换当前使用的武器的回调 - /// - private void OnChangeActiveItem(Weapon weapon) - { - //这里处理近战区域 - if (weapon != null) - { - MeleeAttackCollision.Polygon = Utils.CreateSectorPolygon( - Utils.ConvertAngle(-MeleeAttackAngle / 2f), - (weapon.GetLocalFirePosition() - weapon.GripPoint.Position).Length() * 1.2f, - MeleeAttackAngle, - 6 - ); - MeleeAttackArea.CollisionMask = AttackLayer | PhysicsLayer.Bullet; - } - } - - /// - /// 近战区域碰到敌人 - /// - private void OnMeleeAttackBodyEntered(Node2D body) - { - var activeWeapon = WeaponPack.ActiveItem; - if (activeWeapon == null) - { - return; - } - var activityObject = body.AsActivityObject(); - if (activityObject != null) - { - if (activityObject is Role role) //攻击角色 - { - var damage = Utils.Random.RandomConfigRange(activeWeapon.Attribute.MeleeAttackHarmRange); - damage = RoleState.CallCalcDamageEvent(damage); - - //击退 - if (role is not Player) //目标不是玩家才会触发击退 - { - var attr = IsAi ? activeWeapon.AiUseAttribute : activeWeapon.PlayerUseAttribute; - var repel = Utils.Random.RandomConfigRange(attr.MeleeAttackRepelRnage); - var position = role.GlobalPosition - MountPoint.GlobalPosition; - var v2 = position.Normalized() * repel; - role.MoveController.AddForce(v2); - } - - role.CallDeferred(nameof(Hurt), damage, (role.GetCenterPosition() - GlobalPosition).Angle()); - } - else if (activityObject is Bullet bullet) //攻击子弹 - { - var attackLayer = bullet.AttackLayer; - if (CollisionWithMask(attackLayer)) //是攻击玩家的子弹 - { - bullet.PlayDisappearEffect(); - bullet.Destroy(); - } - } - } - } - - protected override void OnDestroy() - { - //销毁道具 - foreach (var buffProp in BuffPropPack) - { - buffProp.Destroy(); - } - BuffPropPack.Clear(); - ActivePropsPack.Destroy(); - WeaponPack.Destroy(); - } - - /// - /// 翻滚结束 - /// - public void OverRoll() - { - _rollCoolingTimer = RoleState.RollTime; - } - + + /// /// 返回当前角色是否是玩家 /// @@ -1241,4 +964,349 @@ return Mathf.Pi - rotation; } + + /// + /// 获取开火点高度 + /// + public virtual float GetFirePointAltitude() + { + return -MountPoint.Position.Y; + } + + /// + /// 当拾起某个武器时调用 + /// + protected virtual void OnPickUpWeapon(Weapon weapon) + { + } + + /// + /// 当扔掉某个武器时调用 + /// + protected virtual void OnThrowWeapon(Weapon weapon) + { + } + + /// + /// 当切换到某个武器时调用 + /// + protected virtual void OnExchangeWeapon(Weapon weapon) + { + } + + /// + /// 当武器放到后背时调用, 用于设置武器位置和角度 + /// + /// 武器实例 + /// 放入武器背包的位置 + public virtual void OnPutBackMount(Weapon weapon, int index) + { + if (index < 8) + { + if (index % 2 == 0) + { + weapon.Position = new Vector2(-4, 3); + weapon.RotationDegrees = 90 - (index / 2f) * 20; + weapon.Scale = new Vector2(-1, 1); + } + else + { + weapon.Position = new Vector2(4, 3); + weapon.RotationDegrees = 270 + (index - 1) / 2f * 20; + weapon.Scale = new Vector2(1, 1); + } + } + else + { + weapon.Visible = false; + } + } + + protected override void OnAffiliationChange(AffiliationArea prevArea) + { + //身上的武器的所属区域也得跟着变 + WeaponPack.ForEach((weapon, i) => + { + if (AffiliationArea != null) + { + AffiliationArea.InsertItem(weapon); + } + else if (weapon.AffiliationArea != null) + { + weapon.AffiliationArea.RemoveItem(weapon); + } + }); + } + + public virtual void LookTargetPosition(Vector2 pos) + { + LookPosition = pos; + if (MountLookTarget) + { + //脸的朝向 + var gPos = Position; + if (pos.X > gPos.X && Face == FaceDirection.Left) + { + Face = FaceDirection.Right; + } + else if (pos.X < gPos.X && Face == FaceDirection.Right) + { + Face = FaceDirection.Left; + } + //枪口跟随目标 + MountPoint.SetLookAt(pos); + } + } + + /// + /// 返回所有武器是否弹药都打光了 + /// + public virtual bool IsAllWeaponTotalAmmoEmpty() + { + foreach (var weapon in WeaponPack.ItemSlot) + { + if (weapon != null && !weapon.IsTotalAmmoEmpty()) + { + return false; + } + } + + return true; + } + + //------------------------------------------------------------------------------------- + + /// + /// 拾起一个武器, 返回是否成功拾起, 如果不想立刻切换到该武器, exchange 请传 false + /// + /// 武器对象 + /// 是否立即切换到该武器, 默认 true + public bool PickUpWeapon(Weapon weapon, bool exchange = true) + { + if (WeaponPack.PickupItem(weapon, exchange) != -1) + { + //从可互动队列中移除 + InteractiveItemList.Remove(weapon); + OnPickUpWeapon(weapon); + return true; + } + + return false; + } + + /// + /// 切换到下一个武器 + /// + public void ExchangeNextWeapon() + { + var weapon = WeaponPack.ActiveItem; + WeaponPack.ExchangeNext(); + if (WeaponPack.ActiveItem != weapon) + { + OnExchangeWeapon(WeaponPack.ActiveItem); + } + } + + /// + /// 切换到上一个武器 + /// + public void ExchangePrevWeapon() + { + var weapon = WeaponPack.ActiveItem; + WeaponPack.ExchangePrev(); + if (WeaponPack.ActiveItem != weapon) + { + OnExchangeWeapon(WeaponPack.ActiveItem); + } + } + + /// + /// 扔掉当前使用的武器, 切换到上一个武器 + /// + public void ThrowWeapon() + { + ThrowWeapon(WeaponPack.ActiveIndex); + } + + /// + /// 扔掉指定位置的武器 + /// + /// 武器在武器背包中的位置 + public void ThrowWeapon(int index) + { + var weapon = WeaponPack.GetItem(index); + if (weapon == null) + { + return; + } + + var temp = weapon.AnimatedSprite.Position; + if (Face == FaceDirection.Left) + { + temp.Y = -temp.Y; + } + //var pos = GlobalPosition + temp.Rotated(weapon.GlobalRotation); + WeaponPack.RemoveItem(index); + //播放抛出效果 + weapon.ThrowWeapon(this, GlobalPosition); + } + + /// + /// 扔掉所有武器 + /// + public void ThrowAllWeapon() + { + var weapons = WeaponPack.GetAndClearItem(); + for (var i = 0; i < weapons.Length; i++) + { + weapons[i].ThrowWeapon(this); + } + } + + /// + /// 切换到下一个武器 + /// + public void ExchangeNextActiveProp() + { + var prop = ActivePropsPack.ActiveItem; + ActivePropsPack.ExchangeNext(); + if (prop != ActivePropsPack.ActiveItem) + { + OnExchangeActiveProp(ActivePropsPack.ActiveItem); + } + } + + /// + /// 切换到上一个武器 + /// + public void ExchangePrevActiveProp() + { + var prop = ActivePropsPack.ActiveItem; + ActivePropsPack.ExchangePrev(); + if (prop != ActivePropsPack.ActiveItem) + { + OnExchangeActiveProp(ActivePropsPack.ActiveItem); + } + } + + //------------------------------------------------------------------------------------- + + + /// + /// 触发换弹 + /// + public virtual void Reload() + { + if (WeaponPack.ActiveItem != null) + { + WeaponPack.ActiveItem.Reload(); + } + } + + /// + /// 攻击函数 + /// + public virtual void Attack() + { + if (MeleeAttackTimer <= 0 && WeaponPack.ActiveItem != null) + { + WeaponPack.ActiveItem.Trigger(this); + } + } + + /// + /// 触发近战攻击 + /// + public virtual void MeleeAttack() + { + if (IsAttack) + { + return; + } + + if (WeaponPack.ActiveItem != null && !WeaponPack.ActiveItem.Reloading && WeaponPack.ActiveItem.Attribute.CanMeleeAttack) + { + MeleeAttackTimer = RoleState.MeleeAttackTime; + MountLookTarget = false; + + //播放近战动画 + PlayAnimation_MeleeAttack(() => + { + MountLookTarget = true; + }); + } + } + + /// + /// 切换当前使用的武器的回调 + /// + private void OnChangeActiveItem(Weapon weapon) + { + //这里处理近战区域 + if (weapon != null) + { + MeleeAttackCollision.Polygon = Utils.CreateSectorPolygon( + Utils.ConvertAngle(-MeleeAttackAngle / 2f), + (weapon.GetLocalFirePosition() + weapon.GetGripPosition()).Length() * 1.1f, + MeleeAttackAngle, + 6 + ); + MeleeAttackArea.CollisionMask = AttackLayer | PhysicsLayer.Bullet; + } + } + + /// + /// 近战区域碰到敌人 + /// + private void OnMeleeAttackBodyEntered(Node2D body) + { + var activeWeapon = WeaponPack.ActiveItem; + if (activeWeapon == null) + { + return; + } + var activityObject = body.AsActivityObject(); + if (activityObject != null) + { + if (activityObject is Role role) //攻击角色 + { + 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(); + } + } + } + } + + protected override void OnDestroy() + { + //销毁道具 + foreach (var buffProp in BuffPropPack) + { + buffProp.Destroy(); + } + BuffPropPack.Clear(); + ActivePropsPack.Destroy(); + + WeaponPack.Destroy(); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs index c2c629b..2af6bf3 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 bool CanPickUpWeapon = false; + + /// /// 移动速度 /// public float MoveSpeed = 120f; @@ -22,16 +27,6 @@ public float Friction = 900f; /// - /// 翻滚速度 - /// - public float RollSpeed = 180f; - - /// - /// 翻滚冷却时间 - /// - public float RollTime = 0.5f; - - /// /// 单格护盾恢复时间, 单位: 秒 /// public float ShieldRecoveryTime = 18; @@ -55,7 +50,7 @@ /// 攻击/发射后计算伤害 /// public event Action> CalcDamageEvent; - public int CallCalcDamageEvent(int damage) + public int CalcDamage(int damage) { if (CalcDamageEvent != null) { @@ -71,7 +66,7 @@ /// 受伤后计算受到的伤害 /// public event Action> CalcHurtDamageEvent; - public int CallCalcHurtDamageEvent(int damage) + public int CalcHurtDamage(int damage) { if (CalcHurtDamageEvent != null) { @@ -86,13 +81,13 @@ /// /// 武器初始散射值增量 /// - public event Action> CalcStartScatteringEvent; - public float CallCalcStartScatteringEvent(Weapon weapon, float value) + public event Action> CalcStartScatteringEvent; + public float CalcStartScattering(float value) { if (CalcStartScatteringEvent != null) { var result = new RefValue(value); - CalcStartScatteringEvent(weapon, value, result); + CalcStartScatteringEvent(value, result); return result.Value; } @@ -102,13 +97,13 @@ /// /// 武器最终散射值增量 /// - public event Action> CalcFinalScatteringEvent; - public float CallCalcFinalScatteringEvent(Weapon weapon, float value) + public event Action> CalcFinalScatteringEvent; + public float CalcFinalScattering(float value) { if (CalcFinalScatteringEvent != null) { var result = new RefValue(value); - CalcFinalScatteringEvent(weapon, value, result); + CalcFinalScatteringEvent(value, result); return result.Value; } @@ -118,13 +113,13 @@ /// /// 武器开火发射子弹数量 /// - public event Action> CalcBulletCountEvent; - public int CallCalcBulletCountEvent(Weapon weapon, int count) + public event Action> CalcBulletCountEvent; + public int CalcBulletCount(int count) { if (CalcBulletCountEvent != null) { var result = new RefValue(count); - CalcBulletCountEvent(weapon, count, result); + CalcBulletCountEvent(count, result); return result.Value; } @@ -134,13 +129,13 @@ /// /// 子弹偏移角度, 角度制 /// - public event Action> CalcBulletDeviationAngleEvent; - public float CallCalcBulletDeviationAngleEvent(Weapon weapon, float angle) + public event Action> CalcBulletDeviationAngleEvent; + public float CalcBulletDeviationAngle(float angle) { if (CalcBulletDeviationAngleEvent != null) { var result = new RefValue(angle); - CalcBulletDeviationAngleEvent(weapon, angle, result); + CalcBulletDeviationAngleEvent(angle, result); return result.Value; } @@ -150,13 +145,13 @@ /// /// 子弹速度 /// - public event Action> CalcBulletSpeedEvent; - public float CallCalcBulletSpeedEvent(Weapon weapon, float speed) + public event Action> CalcBulletSpeedEvent; + public float CalcBulletSpeed(float speed) { if (CalcBulletSpeedEvent != null) { var result = new RefValue(speed); - CalcBulletSpeedEvent(weapon, speed, result); + CalcBulletSpeedEvent(speed, result); return result.Value; } @@ -166,13 +161,61 @@ /// /// 子弹射程 /// - public event Action> CalcBulletDistanceEvent; - public float CallCalcBulletDistanceEvent(Weapon weapon, float distance) + public event Action> CalcBulletDistanceEvent; + public float CalcBulletDistance(float distance) { if (CalcBulletDistanceEvent != null) { var result = new RefValue(distance); - CalcBulletDistanceEvent(weapon, distance, result); + CalcBulletDistanceEvent(distance, result); + return result.Value; + } + + return distance; + } + + /// + /// 子弹击退 + /// + public event Action> CalcBulletRepelEvent; + public float CalcBulletRepel(float distance) + { + if (CalcBulletRepelEvent != null) + { + var result = new RefValue(distance); + CalcBulletRepelEvent(distance, result); + return result.Value; + } + + return distance; + } + + /// + /// 子弹反弹次数 + /// + public event Action> CalcBulletBounceCountEvent; + public int CalcBulletBounceCount(int distance) + { + if (CalcBulletBounceCountEvent != null) + { + var result = new RefValue(distance); + CalcBulletBounceCountEvent(distance, result); + return result.Value; + } + + return distance; + } + + /// + /// 子弹穿透次数 + /// + public event Action> CalcBulletPenetrationEvent; + public int CalcBulletPenetration(int distance) + { + if (CalcBulletPenetrationEvent != null) + { + var result = new RefValue(distance); + CalcBulletPenetrationEvent(distance, result); return result.Value; } diff --git a/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs index 8de62e5..57f7b88 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role_Animation.cs @@ -43,13 +43,15 @@ GameCamera.Main.DirectionalShake(Vector2.FromAngle(Mathf.DegToRad(-r)) * 6); } //播放特效 - var sprite = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_weapon_MeleeAttack1_tscn); - var localFirePosition = activeItem.GetLocalFirePosition() - activeItem.GripPoint.Position; + var effect = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_weapon_MeleeAttack1_tscn); + var sprite = (Node2D)effect; + var localFirePosition = activeItem.GetLocalFirePosition() - activeItem.Position; localFirePosition *= 0.9f; sprite.Position = p1 + localFirePosition.Rotated(Mathf.DegToRad(r)); sprite.RotationDegrees = r; AddChild(sprite); - + effect.PlayEffect(); + //启用近战碰撞区域 MeleeAttackCollision.Disabled = false; })); diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/AIStateEnum.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/AIStateEnum.cs new file mode 100644 index 0000000..9b923d5 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/AIStateEnum.cs @@ -0,0 +1,40 @@ + +public enum AIStateEnum +{ + /// + /// Ai 状态, 正常, 未发现目标 + /// + AiNormal, + /// + /// 找到玩家,准备通知其他敌人 + /// + AiNotify, + /// + /// 惊讶状态 + /// + AiAstonished, + /// + /// 收到其他敌人通知, 前往发现目标的位置 + /// + AiLeaveFor, + /// + /// 发现目标, 目标不在视野内, 但是知道位置 + /// + AiTailAfter, + /// + /// 目标在视野内, 跟进目标, 如果距离在子弹有效射程内, 则开火 + /// + AiFollowUp, + /// + /// 距离足够近, 在目标附近随机移动 + /// + AiSurround, + /// + /// Ai 寻找弹药 + /// + AiFindAmmo, + /// + /// Ai攻击 + /// + AiAttack, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/AiAttackState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/AiAttackState.cs deleted file mode 100644 index 62bc132..0000000 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/AiAttackState.cs +++ /dev/null @@ -1,43 +0,0 @@ - -/// -/// 调用 Enemy.EnemyAttack() 函数返回的结果 -/// -public enum AiAttackState -{ - /// - /// 未触发 EnemyAttack() - /// - None, - /// - /// 触发切换武器 - /// - ExchangeWeapon, - /// - /// 没有弹药了 - /// - NoAmmo, - /// - /// 换弹中 - /// - Reloading, - /// - /// 触发换弹 - /// - TriggerReload, - /// - /// 没有武器 - /// - NoWeapon, - /// - /// 正在锁定目标中 - /// - LockingTime, - /// - /// 攻击间隙时间 - /// - AttackInterval, - /// - /// 成功触发攻击 - /// - Attack, -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs index 8de6844..47aa18d 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs @@ -12,10 +12,13 @@ using System; +using System.Collections.Generic; +using Config; +using EnemyState; using Godot; /// -/// 基础敌人 +/// 高级敌人,可以携带武器 /// [Tool] public partial class Enemy : Role @@ -28,51 +31,108 @@ /// /// 敌人身上的状态机控制器 /// - public StateController StateController { get; private set; } - - /// - /// 视野半径, 单位像素, 发现玩家后改视野范围可以穿墙 - /// - public float ViewRange { get; set; } = 250; - - /// - /// 发现玩家后的视野半径 - /// - public float TailAfterViewRange { get; set; } = 400; - - /// - /// 背后的视野半径, 单位像素 - /// - public float BackViewRange { get; set; } = 50; - + public StateController StateController { get; private set; } + /// /// 视野检测射线, 朝玩家打射线, 检测是否碰到墙 /// - public RayCast2D ViewRay { get; private set; } + [Export, ExportFillNode] + public RayCast2D ViewRay { get; set; } /// /// 导航代理 /// - public NavigationAgent2D NavigationAgent2D { get; private set; } + [Export, ExportFillNode] + public NavigationAgent2D NavigationAgent2D { get; set; } /// /// 导航代理中点 /// - public Marker2D NavigationPoint { get; private set; } + [Export, ExportFillNode] + public Marker2D NavigationPoint { get; set; } /// - /// Ai攻击状态, 调用 EnemyAttack() 函数后会刷新 + /// 不通过武发射子弹的开火点 /// - public AiAttackState AttackState { get; private set; } + [Export, ExportFillNode] + public Marker2D FirePoint { get; set; } - //锁定目标时间 - private float _lockTargetTime = 0; + /// + /// 当前敌人所看向的对象, 也就是枪口指向的对象 + /// + public ActivityObject LookTarget { get; set; } + /// + /// 攻击锁定目标时间 + /// + public float LockingTime { get; set; } = 1f; + + /// + /// 锁定目标已经走过的时间 + /// + public float LockTargetTime { get; set; } = 0; + + /// + /// 敌人属性 + /// + public EnemyRoleState EnemyRoleState { get; private set; } + + /// + /// 敌人属性 + /// + private ExcelConfig.EnemyBase _enemyAttribute; + + private static bool _init = false; + private static Dictionary _enemyAttributeMap = + new Dictionary(); + + /// + /// 初始化敌人属性数据 + /// + public static void InitEnemyAttribute() + { + if (_init) + { + return; + } + + _init = true; + foreach (var enemyAttr in ExcelConfig.EnemyBase_List) + { + if (enemyAttr.Activity != null) + { + if (!_enemyAttributeMap.TryAdd(enemyAttr.Activity.Id, enemyAttr)) + { + Debug.LogError("发现重复注册的敌人属性: " + enemyAttr.Id); + } + } + } + } + + /// + /// 根据 ActivityBase.Id 获取对应敌人的属性数据 + /// + public static ExcelConfig.EnemyBase GetEnemyAttribute(string itemId) + { + if (itemId == null) + { + return null; + } + if (_enemyAttributeMap.TryGetValue(itemId, out var attr)) + { + return attr; + } + + throw new Exception($"敌人'{itemId}'没有在 EnemyBase 表中配置属性数据!"); + } + public override void OnInit() { base.OnInit(); + IsAi = true; - StateController = AddComponent>(); + + StateController = AddComponent>(); AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Player; EnemyLayer = PhysicsLayer.Player; @@ -83,29 +143,40 @@ MaxHp = 20; Hp = 20; - //视野射线 - ViewRay = GetNode("ViewRay"); - NavigationPoint = GetNode("NavigationPoint"); - NavigationAgent2D = NavigationPoint.GetNode("NavigationAgent2D"); - - //PathSign = new PathSign(this, PathSignLength, GameApplication.Instance.Node3D.Player); - //注册Ai状态机 StateController.Register(new AiNormalState()); - StateController.Register(new AiProbeState()); StateController.Register(new AiTailAfterState()); StateController.Register(new AiFollowUpState()); StateController.Register(new AiLeaveForState()); StateController.Register(new AiSurroundState()); StateController.Register(new AiFindAmmoState()); + StateController.Register(new AiAttackState()); + StateController.Register(new AiAstonishedState()); + StateController.Register(new AiNotifyState()); //默认状态 - StateController.ChangeStateInstant(AiStateEnum.AiNormal); + StateController.ChangeStateInstant(AIStateEnum.AiNormal); + } + + protected override RoleState OnCreateRoleState() + { + var roleState = new EnemyRoleState(); + EnemyRoleState = roleState; + var enemyBase = GetEnemyAttribute(ActivityBase.Id).Clone(); + _enemyAttribute = enemyBase; + + roleState.CanPickUpWeapon = enemyBase.CanPickUpWeapon; + roleState.MoveSpeed = enemyBase.MoveSpeed; + roleState.Acceleration = enemyBase.Acceleration; + roleState.Friction = enemyBase.Friction; + roleState.ViewRange = enemyBase.ViewRange; + roleState.TailAfterViewRange = enemyBase.TailAfterViewRange; + roleState.BackViewRange = enemyBase.BackViewRange; + return roleState; } public override void EnterTree() { - base.EnterTree(); if (!World.Enemy_InstanceList.Contains(this)) { World.Enemy_InstanceList.Add(this); @@ -114,32 +185,29 @@ public override void ExitTree() { - base.ExitTree(); World.Enemy_InstanceList.Remove(this); } protected override void OnDie() { //扔掉所有武器 - var weapons = WeaponPack.GetAndClearItem(); - for (var i = 0; i < weapons.Length; i++) - { - weapons[i].ThrowWeapon(this); - } + ThrowAllWeapon(); var effPos = Position + new Vector2(0, -Altitude); //血液特效 - var blood = ResourceManager.LoadAndInstantiate(ResourcePath.prefab_effect_enemy_EnemyBloodEffect_tscn); + var blood = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_enemy_EnemyBlood0001_tscn); blood.Position = effPos - new Vector2(0, 12); blood.AddToActivityRoot(RoomLayerEnum.NormalLayer); - + blood.PlayEffect(); + + var realVelocity = GetRealVelocity(); //创建敌人碎片 var count = Utils.Random.RandomRangeInt(3, 6); for (var i = 0; i < count; i++) { - var debris = Create(Ids.Id_effect0001); + var debris = Create(Ids.Id_enemy_dead0001); debris.PutDown(effPos, RoomLayerEnum.NormalLayer); - debris.InheritVelocity(this); + debris.MoveController.AddForce(Velocity + realVelocity); } //派发敌人死亡信号 @@ -154,94 +222,76 @@ { return; } - //目标在视野内的时间 - var currState = StateController.CurrState; - if (currState == AiStateEnum.AiSurround || currState == AiStateEnum.AiFollowUp) + + //看向目标 + if (LookTarget != null && MountLookTarget) { - var weapon = WeaponPack.ActiveItem; - if (weapon != null) + var pos = LookTarget.Position; + LookPosition = pos; + //脸的朝向 + var gPos = Position; + if (pos.X > gPos.X && Face == FaceDirection.Left) { - if (weapon.GetBeLoadedStateState() >= 2 && !weapon.IsAttackIntervalTime()) //必须在可以开火时记录时间 - { - _lockTargetTime += delta; - } - else - { - _lockTargetTime = 0; - } - - if (AttackState == AiAttackState.LockingTime) //锁定玩家状态 - { - var aiLockRemainderTime = weapon.GetAiLockRemainderTime(); - MountLookTarget = aiLockRemainderTime >= weapon.Attribute.AiAttackAttr.LockAngleTime; - //更新瞄准辅助线 - if (weapon.Attribute.AiAttackAttr.ShowSubline) - { - if (SubLine == null) - { - InitSubLine(); - } - else - { - SubLine.Enable = true; - } - - //播放警告删掉动画 - if (!SubLine.IsPlayWarnAnimation && aiLockRemainderTime <= 0.5f) - { - SubLine.PlayWarnAnimation(0.5f); - } - } - } - else - { - //关闭辅助线 - if (SubLine != null) - { - SubLine.Enable = false; - } - - if (AttackState == AiAttackState.Attack || AttackState == AiAttackState.AttackInterval) - { - if (weapon.Attribute.AiAttackAttr.AttackLockAngle) //开火时锁定枪口角度 - { - //连发状态锁定角度 - MountLookTarget = !(weapon.GetContinuousCount() > 0 || weapon.GetAttackTimer() > 0); - } - else - { - MountLookTarget = true; - } - } - else - { - MountLookTarget = true; - } - } + Face = FaceDirection.Right; } - else + else if (pos.X < gPos.X && Face == FaceDirection.Right) { - MountLookTarget = true; - _lockTargetTime = 0; + Face = FaceDirection.Left; } - } - else - { - MountLookTarget = true; - _lockTargetTime = 0; + //枪口跟随目标 + MountPoint.SetLookAt(pos); } - //拾起武器操作 - EnemyPickUpWeapon(); + if (EnemyRoleState.CanPickUpWeapon) + { + //拾起武器操作 + EnemyPickUpWeapon(); + } } - protected override void OnHit(int damage, bool realHarm) + public override bool IsAllWeaponTotalAmmoEmpty() + { + if (!_enemyAttribute.CanPickUpWeapon) + { + return false; + } + return base.IsAllWeaponTotalAmmoEmpty(); + } + + protected override void OnHit(ActivityObject target, int damage, float angle, bool realHarm) { //受到伤害 var state = StateController.CurrState; - if (state == AiStateEnum.AiNormal || state == AiStateEnum.AiProbe || state == AiStateEnum.AiLeaveFor) + if (state == AIStateEnum.AiNormal) { - StateController.ChangeState(AiStateEnum.AiTailAfter); + LookTarget = target; + //判断是否进入通知状态 + if (World.Enemy_InstanceList.FindIndex(enemy => + enemy != this && !enemy.IsDie && enemy.AffiliationArea == AffiliationArea && + enemy.StateController.CurrState == AIStateEnum.AiNormal) != -1) + { + //进入惊讶状态, 然后再进入通知状态 + StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiNotify); + } + else + { + //进入惊讶状态, 然后再进入跟随状态 + StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiTailAfter); + } + } + else if (state == AIStateEnum.AiLeaveFor) + { + LookTarget = target; + StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiTailAfter); + } + else if (state == AIStateEnum.AiFindAmmo) + { + if (LookTarget == null) + { + LookTarget = target; + var findAmmo = (AiFindAmmoState)StateController.CurrStateBase; + StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, findAmmo.TargetWeapon); + } } } @@ -337,43 +387,6 @@ } /// - /// 检查是否能切换到 AiStateEnum.AiLeaveFor 状态 - /// - /// - public bool CanChangeLeaveFor() - { - if (!World.Enemy_IsFindTarget) - { - return false; - } - - var currState = StateController.CurrState; - if (currState == AiStateEnum.AiNormal || currState == AiStateEnum.AiProbe) - { - //判断是否在同一个房间内 - return World.Enemy_FindTargetAffiliationSet.Contains(AffiliationArea); - } - - return false; - } - - /// - /// Ai触发的攻击 - /// - public void EnemyAttack() - { - var weapon = WeaponPack.ActiveItem; - if (weapon != null) - { - AttackState = weapon.AiTriggerAttackState(); - } - else //没有武器 - { - AttackState = AiAttackState.NoWeapon; - } - } - - /// /// 获取武器攻击范围 (最大距离值与最小距离的中间值) /// /// 从最小到最大距离的过渡量, 0 - 1, 默认 0.5 @@ -396,7 +409,7 @@ var isForward = IsPositionInForward(target); if (isForward) { - if (GlobalPosition.DistanceSquaredTo(target) <= ViewRange * ViewRange) //没有超出视野半径 + if (GlobalPosition.DistanceSquaredTo(target) <= EnemyRoleState.ViewRange * EnemyRoleState.ViewRange) //没有超出视野半径 { return true; } @@ -413,7 +426,7 @@ var isForward = IsPositionInForward(target); if (isForward) { - if (GlobalPosition.DistanceSquaredTo(target) <= TailAfterViewRange * TailAfterViewRange) //没有超出视野半径 + if (GlobalPosition.DistanceSquaredTo(target) <= EnemyRoleState.TailAfterViewRange * EnemyRoleState.TailAfterViewRange) //没有超出视野半径 { return true; } @@ -423,7 +436,7 @@ } /// - /// 调用视野检测, 如果被墙壁和其它物体遮挡, 则返回被挡住视野的物体对象, 视野无阻则返回 null + /// 调用视野检测, 如果被墙壁和其它物体遮挡, 则返回true /// public bool TestViewRayCast(Vector2 target) { @@ -448,7 +461,7 @@ { //这几个状态不需要主动拾起武器操作 var state = StateController.CurrState; - if (state == AiStateEnum.AiNormal) + if (state == AIStateEnum.AiNormal || state == AIStateEnum.AiNotify || state == AIStateEnum.AiAstonished || state == AIStateEnum.AiAttack) { return; } @@ -468,7 +481,7 @@ return; } - var index = WeaponPack.FindIndex((we, i) => we.ItemConfig.Id == weapon.ItemConfig.Id); + var index = WeaponPack.FindIndex((we, i) => we.ActivityBase.Id == weapon.ActivityBase.Id); if (index != -1) //与武器背包中武器类型相同, 补充子弹 { if (!WeaponPack.GetItem(index).IsAmmoFull()) @@ -496,20 +509,64 @@ // } } } - + /// - /// 获取锁定目标的时间 + /// 获取锁定目标的剩余时间 /// - public float GetLockTime() + public float GetLockRemainderTime() { - return _lockTargetTime; + var weapon = WeaponPack.ActiveItem; + if (weapon == null) + { + return LockingTime - LockTargetTime; + } + return weapon.Attribute.AiAttackAttr.LockingTime - LockTargetTime; + } + + public override void LookTargetPosition(Vector2 pos) + { + LookTarget = null; + base.LookTargetPosition(pos); + } + + /// + /// 执行移动操作 + /// + public void DoMove() + { + AnimatedSprite.Play(AnimatorNames.Run); + //计算移动 + var nextPos = NavigationAgent2D.GetNextPathPosition(); + BasisVelocity = (nextPos - Position - NavigationPoint.Position).Normalized() * RoleState.MoveSpeed; } /// - /// 强制设置锁定目标时间 + /// 执行站立操作 /// - public void SetLockTargetTime(float time) + public void DoIdle() { - _lockTargetTime = time; + AnimatedSprite.Play(AnimatorNames.Idle); + BasisVelocity = Vector2.Zero; + } + + /// + /// 更新房间中标记的目标位置 + /// + public void UpdateMarkTargetPosition() + { + if (LookTarget != null) + { + AffiliationArea.RoomInfo.MarkTargetPosition[LookTarget.Id] = LookTarget.Position; + } + } + + /// + /// 从标记出生时调用, 预加载波不会调用 + /// + public virtual void OnBornFromMark() + { + //罚站 0.7 秒 + StateController.Enable = false; + this.CallDelay(0.7f, () => StateController.Enable = true); } } diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs new file mode 100644 index 0000000..174b52e --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/EnemyRoleState.cs @@ -0,0 +1,18 @@ + +public class EnemyRoleState : RoleState +{ + /// + /// 视野半径, 单位像素, 发现玩家后改视野范围可以穿墙 + /// + public float ViewRange = 250; + + /// + /// 发现玩家后跟随玩家的视野半径 + /// + public float TailAfterViewRange = 400; + + /// + /// 背后的视野半径, 单位像素 + /// + public float BackViewRange = 50; +} \ 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 new file mode 100644 index 0000000..db8f51d --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs @@ -0,0 +1,84 @@ + +using Config; +using Godot; + +/// +/// 没有武器的敌人 +/// +[Tool] +public partial class NoWeaponEnemy : Enemy +{ + private BrushImageData _brushData; + + public override void OnInit() + { + base.OnInit(); + NoWeaponAttack = true; + AnimationPlayer.AnimationFinished += OnAnimationFinished; + + _brushData = LiquidBrushManager.GetBrush("0002"); + } + + protected override void Process(float delta) + { + base.Process(delta); + + //测试笔刷 + DrawLiquid(_brushData); + } + + public override void Attack() + { + if (AnimationPlayer.CurrentAnimation != AnimatorNames.Attack) + { + AnimationPlayer.Play(AnimatorNames.Attack); + } + } + + /// + /// 开始执行攻击逻辑 + /// + public virtual void OnAttack() + { + //攻击特效 + var effect = ObjectManager.GetPoolItem(ResourcePath.prefab_effect_weapon_ShotFire3_tscn); + var node = (Node2D)effect; + node.GlobalPosition = FirePoint.GlobalPosition; + node.Rotation = MountPoint.Rotation; + node.AddToActivityRoot(RoomLayerEnum.YSortLayer); + effect.PlayEffect(); + + var targetPosition = LookTarget.GetCenterPosition(); + var bulletData = FireManager.GetBulletData(this, 0, ExcelConfig.BulletBase_Map["0006"]); + for (var i = 0; i < 8; i++) + { + var data = bulletData.Clone(); + var tempPos = new Vector2(targetPosition.X + Utils.Random.RandomRangeInt(-30, 30), targetPosition.Y + Utils.Random.RandomRangeInt(-30, 30)); + FireManager.SetParabolaTarget(data, tempPos); + FireManager.ShootBullet(data, AttackLayer); + } + } + + protected override void OnDie() + { + var realVelocity = GetRealVelocity(); + var effPos = Position; + var debris = Create(Ids.Id_enemy_dead0002); + debris.PutDown(effPos, RoomLayerEnum.NormalLayer); + debris.MoveController.AddForce(Velocity + realVelocity); + debris.SetFace(Face); + debris.BrushPrevPosition = BrushPrevPosition; + + //派发敌人死亡信号 + EventManager.EmitEvent(EventEnum.OnEnemyDie, this); + Destroy(); + } + + private void OnAnimationFinished(StringName name) + { + if (name == AnimatorNames.Attack) + { + AttackTimer = 3f; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AIStateEnum.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AIStateEnum.cs deleted file mode 100644 index 6bb8db4..0000000 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AIStateEnum.cs +++ /dev/null @@ -1,32 +0,0 @@ - -public enum AiStateEnum -{ - /// - /// Ai 状态, 正常, 未发现目标 - /// - AiNormal, - /// - /// 发现目标, 但不知道在哪 - /// - AiProbe, - /// - /// 收到其他敌人通知, 前往发现目标的位置 - /// - AiLeaveFor, - /// - /// 发现目标, 目标不在视野内, 但是知道位置 - /// - AiTailAfter, - /// - /// 目标在视野内, 跟进目标, 如果距离在子弹有效射程内, 则开火 - /// - AiFollowUp, - /// - /// 距离足够近, 在目标附近随机移动 - /// - AiSurround, - /// - /// Ai 寻找弹药 - /// - AiFindAmmo, -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAstonishedState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAstonishedState.cs new file mode 100644 index 0000000..c39aff9 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAstonishedState.cs @@ -0,0 +1,56 @@ +using Godot; + +namespace EnemyState; + +/// +/// 发现目标时的惊讶状态 +/// +public class AiAstonishedState : StateBase +{ + /// + /// 下一个状态 + /// + public AIStateEnum NextState; + + private float _timer; + private object[] _args; + + public AiAstonishedState() : base(AIStateEnum.AiAstonished) + { + } + + public override void Enter(AIStateEnum prev, params object[] args) + { + if (args.Length == 0) + { + Debug.Log("进入 AINormalStateEnum.AiAstonished 状态必传入下一个状态做完参数!"); + ChangeState(prev); + return; + } + + _args = args; + + NextState = (AIStateEnum)args[0]; + _timer = 0.6f; + + //播放惊讶表情 + Master.AnimationPlayer.Play(AnimatorNames.Astonished); + } + + public override void Process(float delta) + { + Master.DoIdle(); + _timer -= delta; + if (_timer <= 0) + { + if (_args.Length == 1) + { + ChangeState(NextState); + } + else if (_args.Length == 2) + { + ChangeState(NextState, _args[1]); + } + } + } +} \ 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 new file mode 100644 index 0000000..6b70f5e --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiAttackState.cs @@ -0,0 +1,309 @@ +using System; +using Godot; + +namespace EnemyState; + +/// +/// ai 攻击状态 +/// +public class AiAttackState : StateBase +{ + /// + /// 上一个状态 + /// + public AIStateEnum PrevState; + + /// + /// 武器攻击状态 + /// + public AiAttackEnum AttackState; + + //是否移动结束 + private bool _isMoveOver; + + //移动停顿计时器 + private float _pauseTimer; + private bool _moveFlag; + + //下一个移动点 + private Vector2 _nextPosition; + + //上一帧位置 + private Vector2 _prevPos; + //卡在一个位置的时间 + private float _lockTimer; + //进入状态的时候是否有武器 + private bool _hasWeapon = true; + + public AiAttackState() : base(AIStateEnum.AiAttack) + { + } + + public override void Enter(AIStateEnum prev, params object[] args) + { + if (Master.LookTarget == null) + { + throw new Exception("进入 AIAdvancedStateEnum.AiAttack 状态时角色没有攻击目标!"); + } + + var weapon = Master.WeaponPack.ActiveItem; + + if (weapon != null) + { + _hasWeapon = true; + if (!weapon.TriggerIsReady()) + { + throw new Exception("进入 AIAdvancedStateEnum.AiAttack 状态时角色武器还无法触动扳机!"); + } + } + else + { + _hasWeapon = false; + if (Master.IsAttack) + { + throw new Exception("进入 AIAdvancedStateEnum.AiAttack 状态时角色攻击状态还没准备好"); + } + } + + Master.BasisVelocity = Vector2.Zero; + AttackState = AiAttackEnum.None; + Master.LockTargetTime = 0; + PrevState = prev; + + _isMoveOver = true; + _pauseTimer = 0; + _moveFlag = false; + } + + public override void Exit(AIStateEnum next) + { + Master.MountLookTarget = true; + Master.LockTargetTime = 0; + } + + public override void Process(float delta) + { + //更新标记位置 + Master.UpdateMarkTargetPosition(); + + if (_hasWeapon) + { + WeaponRoleProcess(delta); + } + else + { + NoWeaponRoleProcess(delta); + } + } + + //有武器的敌人更新逻辑 + private void WeaponRoleProcess(float delta) + { + var weapon = Master.WeaponPack.ActiveItem; + if (weapon == null) + { + //攻击结束 + ChangeState(PrevState); + } + else if (AttackState == AiAttackEnum.AttackInterval) //攻击完成 + { + if (weapon.GetAttackTimer() <= 0) //攻击冷却完成 + { + Master.MountLookTarget = true; + //这里要做换弹判断, 还有上膛判断 + if (weapon.CurrAmmo <= 0) //换弹判断 + { + if (!weapon.Reloading) + { + weapon.Reload(); + } + } + else if (weapon.GetBeLoadedStateState() != 2) //上膛 + { + if (weapon.GetBeLoadedStateState() == 0) + { + weapon.BeLoaded(); + } + } + else + { + //攻击结束 + ChangeState(PrevState); + } + } + MoveHandler(delta); + } + else //攻击状态 + { + //触发扳机 + AttackState = weapon.AiTriggerAttackState(); + + if (AttackState == AiAttackEnum.LockingTime) //锁定玩家状态 + { + Master.LockTargetTime += delta; + + var aiLockRemainderTime = Master.GetLockRemainderTime(); + Master.MountLookTarget = aiLockRemainderTime >= weapon.Attribute.AiAttackAttr.LockAngleTime; + //更新瞄准辅助线 + if (weapon.Attribute.AiAttackAttr.ShowSubline) + { + if (Master.SubLine == null) + { + Master.InitSubLine(); + } + else + { + Master.SubLine.Enable = true; + } + + //播放警告删掉动画 + if (!Master.SubLine.IsPlayWarnAnimation && aiLockRemainderTime <= 0.5f) + { + Master.SubLine.PlayWarnAnimation(0.5f); + } + } + + if (weapon.Attribute.AiAttackAttr.LockingStand) //锁定目标时站立不动 + { + Master.DoIdle(); + } + else //正常移动 + { + MoveHandler(delta); + } + } + else + { + Master.LockTargetTime = 0; + //关闭辅助线 + if (Master.SubLine != null) + { + Master.SubLine.Enable = false; + } + + if (AttackState == AiAttackEnum.Attack || AttackState == AiAttackEnum.AttackInterval) + { + if (weapon.Attribute.AiAttackAttr.AttackLockAngle) //开火时锁定枪口角度 + { + //连发状态锁定角度 + Master.MountLookTarget = !(weapon.GetContinuousCount() > 0 || weapon.GetAttackTimer() > 0); + } + else + { + Master.MountLookTarget = true; + } + } + else + { + Master.MountLookTarget = true; + } + + if (AttackState == AiAttackEnum.Attack && weapon.Attribute.AiAttackAttr.FiringStand) //开火时站立不动 + { + Master.DoIdle(); + } + else //正常移动 + { + MoveHandler(delta); + } + } + } + } + + //没有武器的敌人攻击逻辑 + private void NoWeaponRoleProcess(float delta) + { + var weapon = Master.WeaponPack.ActiveItem; + if (weapon != null) + { + //找到武器了, 攻击结束 + ChangeState(PrevState); + } + else if (Master.AttackTimer > 0 || Master.MeleeAttackTimer > 0) //攻击结束 + { + ChangeState(PrevState); + } + else //攻击状态 + { + Master.Attack(); + } + } + + private void MoveHandler(float delta) + { + + if (_pauseTimer >= 0) + { + Master.AnimatedSprite.Play(AnimatorNames.Idle); + _pauseTimer -= delta; + } + else if (_isMoveOver) //移动已经完成 + { + RunOver(Master.LookTarget.Position); + _isMoveOver = false; + } + else + { + var masterPosition = Master.Position; + if (_lockTimer >= 1) //卡在一个点超过一秒 + { + RunOver(Master.LookTarget.Position); + _isMoveOver = false; + _lockTimer = 0; + } + else if (Master.NavigationAgent2D.IsNavigationFinished()) //到达终点 + { + _pauseTimer = Utils.Random.RandomRangeFloat(0f, 0.5f); + _isMoveOver = true; + _moveFlag = false; + //站立 + Master.DoIdle(); + } + else if (!_moveFlag) + { + _moveFlag = true; + //移动 + Master.DoMove(); + } + else + { + var lastSlideCollision = Master.GetLastSlideCollision(); + if (lastSlideCollision != null && lastSlideCollision.GetCollider() is Role) //碰到其他角色 + { + _pauseTimer = Utils.Random.RandomRangeFloat(0f, 0.3f); + _isMoveOver = true; + _moveFlag = false; + //站立 + Master.DoIdle(); + } + else + { + //移动 + Master.DoMove(); + } + + if (_prevPos.DistanceSquaredTo(masterPosition) <= 1 * delta) + { + _lockTimer += delta; + } + else + { + _lockTimer = 0; + _prevPos = masterPosition; + } + } + } + } + + private void RunOver(Vector2 targetPos) + { + var weapon = Master.WeaponPack.ActiveItem; + var distance = (int)(weapon == null ? 150 : (Utils.GetConfigRangeStart(weapon.Attribute.Bullet.DistanceRange) * 0.7f)); + _nextPosition = new Vector2( + targetPos.X + Utils.Random.RandomRangeInt(-distance, distance), + targetPos.Y + Utils.Random.RandomRangeInt(-distance, distance) + ); + Master.NavigationAgent2D.TargetPosition = _nextPosition; + } + +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs index 79cb04e..207795b 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs @@ -1,57 +1,100 @@ +using System; using Godot; +namespace EnemyState; + /// /// Ai 寻找弹药, 进入该状态需要在参数中传入目标武器对象 /// -public class AiFindAmmoState : StateBase +public class AiFindAmmoState : StateBase { - - private Weapon _target; + /// + /// 目标武器 + /// + public Weapon TargetWeapon; //导航目标点刷新计时器 private float _navigationUpdateTimer = 0; private float _navigationInterval = 1f; - - private bool _isInTailAfterRange = false; + private float _tailAfterTimer = 0; + private ActivityObject _attackTarget; - public AiFindAmmoState() : base(AiStateEnum.AiFindAmmo) + private float _idleTimer = 0; + private bool _playAnimFlag = false; + + public AiFindAmmoState() : base(AIStateEnum.AiFindAmmo) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { if (args.Length == 0) { - Debug.LogError("进入 AiStateEnum.AiFindAmmo 状态必须要把目标武器当成参数传过来"); - ChangeState(prev); - return; + throw new Exception("进入 AiStateEnum.AiFindAmmo 状态必须要把目标武器当成参数传过来"); } + if (args.Length >= 2) + { + _attackTarget = (ActivityObject)args[1]; + } + else + { + _attackTarget = null; + } + SetTargetWeapon((Weapon)args[0]); - _navigationUpdateTimer = 0; - _isInTailAfterRange = false; + _navigationUpdateTimer = _navigationInterval; _tailAfterTimer = 0; //标记武器 - _target.SetSign(SignNames.AiFindWeaponSign, Master); + TargetWeapon.SetSign(SignNames.AiFindWeaponSign, Master); + + _playAnimFlag = prev == AIStateEnum.AiLeaveFor; + if (_playAnimFlag) + { + Master.AnimationPlayer.Play(AnimatorNames.Query); + } } public override void Process(float delta) { + if (_playAnimFlag && _idleTimer > 0) + { + _idleTimer -= delta; + return; + } + if (!Master.IsAllWeaponTotalAmmoEmpty()) //已经有弹药了 { - ChangeState(GetNextState()); + RunNextState(); return; } + if (Master.LookTarget == null) //没有目标 + { + //临时处理 + var player = Player.Current; + var playerPos = player.GetCenterPosition(); + if (Master.IsInViewRange(playerPos) && !Master.TestViewRayCast(playerPos)) //发现玩家 + { + //关闭射线检测 + Master.TestViewRayCastOver(); + //发现玩家 + Master.LookTarget = player; + //进入惊讶状态, 然后再进入通知状态 + ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, TargetWeapon); + return; + } + } + //更新目标位置 if (_navigationUpdateTimer <= 0) { //每隔一段时间秒更改目标位置 _navigationUpdateTimer = _navigationInterval; - var position = _target.GlobalPosition; + var position = TargetWeapon.GlobalPosition; Master.NavigationAgent2D.TargetPosition = position; } else @@ -59,94 +102,103 @@ _navigationUpdateTimer -= delta; } - var playerPos = Player.Current.GetCenterPosition(); - //枪口指向玩家 - Master.LookTargetPosition(playerPos); - - if (_target.IsDestroyed || _target.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走 + if (TargetWeapon.IsDestroyed || TargetWeapon.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走 { //再去寻找其他武器 SetTargetWeapon(Master.FindTargetWeapon()); - if (_target == null) //也没有其他可用的武器了 + if (TargetWeapon == null) //也没有其他可用的武器了 { - ChangeState(GetNextState()); + RunNextState(); } } - else if (_target.Master == Master) //已经被自己拾起 + else if (TargetWeapon.Master == Master) //已经被自己拾起 { - ChangeState(GetNextState()); + RunNextState(); } - else if (_target.Master != null) //武器已经被其他角色拾起! + else if (TargetWeapon.Master != null) //武器已经被其他角色拾起! { //再去寻找其他武器 SetTargetWeapon(Master.FindTargetWeapon()); - if (_target == null) //也没有其他可用的武器了 + if (TargetWeapon == null) //也没有其他可用的武器了 { - ChangeState(GetNextState()); + RunNextState(); } } else { - //检测目标没有超出跟随视野距离 - _isInTailAfterRange = Master.IsInTailAfterViewRange(playerPos); - if (_isInTailAfterRange) + if (Master.LookTarget != null) { - _tailAfterTimer = 0; - } - else - { - _tailAfterTimer += delta; + //检测目标没有超出跟随视野距离 + var isInTailAfterRange = Master.IsInTailAfterViewRange(Master.LookTarget.GetCenterPosition()); + if (isInTailAfterRange) + { + _tailAfterTimer = 0; + } + else + { + _tailAfterTimer += delta; + } } //向武器移动 if (!Master.NavigationAgent2D.IsNavigationFinished()) { - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = - (nextPos - Master.GlobalPosition - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; + //移动 + Master.DoMove(); } else { - Master.BasisVelocity = Vector2.Zero; + //站立 + Master.DoIdle(); } } } - private AiStateEnum GetNextState() + private void RunNextState() { - return _tailAfterTimer > 10 ? AiStateEnum.AiNormal : AiStateEnum.AiTailAfter; + if (_attackTarget != null) + { + ChangeState(AIStateEnum.AiLeaveFor, _attackTarget); + } + else if (Master.LookTarget != null) + { + ChangeState(_tailAfterTimer > 10 ? AIStateEnum.AiNormal : AIStateEnum.AiTailAfter); + } + else + { + ChangeState(AIStateEnum.AiNormal); + } } private void SetTargetWeapon(Weapon weapon) { - _target = weapon; - //设置目标点 - if (_target != null) + TargetWeapon = weapon; + if (weapon != null) { - Master.NavigationAgent2D.TargetPosition = _target.GlobalPosition; + //设置目标点 + Master.NavigationAgent2D.TargetPosition = TargetWeapon.GlobalPosition; } } public override void DebugDraw() { - if (_target != null) + if (TargetWeapon != null) { - Master.DrawLine(Vector2.Zero, Master.ToLocal(_target.GlobalPosition), Colors.Purple); + Master.DrawLine(Vector2.Zero, Master.ToLocal(TargetWeapon.GlobalPosition), Colors.Purple); - if (_tailAfterTimer <= 0) + if (Master.LookTarget != null) { - Master.DrawLine(Vector2.Zero, Master.ToLocal(Player.Current.GetCenterPosition()), Colors.Orange); + if (_tailAfterTimer <= 0) + { + Master.DrawLine(Vector2.Zero, Master.ToLocal(Master.LookTarget.GetCenterPosition()), Colors.Orange); + } + else if (_tailAfterTimer <= 10) + { + Master.DrawLine(Vector2.Zero, Master.ToLocal(Master.LookTarget.GetCenterPosition()), Colors.Blue); + } } - else if (_tailAfterTimer <= 10) - { - Master.DrawLine(Vector2.Zero, Master.ToLocal(Player.Current.GetCenterPosition()), Colors.Blue); - } - } } } \ No newline at end of file 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 02d1de1..c6ae3d6 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFollowUpState.cs @@ -1,21 +1,29 @@ +using System; using Godot; +namespace EnemyState; + /// /// 目标在视野内, 跟进目标, 如果距离在子弹有效射程内, 则开火 /// -public class AiFollowUpState : StateBase +public class AiFollowUpState : StateBase { //导航目标点刷新计时器 private float _navigationUpdateTimer = 0; private float _navigationInterval = 0.3f; - public AiFollowUpState() : base(AiStateEnum.AiFollowUp) + public AiFollowUpState() : base(AIStateEnum.AiFollowUp) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { + if (Master.LookTarget == null) + { + throw new Exception("进入 AIAdvancedStateEnum.AiFollowUp 状态时角色没有攻击目标!"); + } + _navigationUpdateTimer = 0; Master.TargetInView = true; } @@ -29,17 +37,17 @@ var targetWeapon = Master.FindTargetWeapon(); if (targetWeapon != null) { - ChangeState(AiStateEnum.AiFindAmmo, targetWeapon); + ChangeState(AIStateEnum.AiFindAmmo, targetWeapon); return; } else { //切换到随机移动状态 - ChangeState(AiStateEnum.AiSurround); + ChangeState(AIStateEnum.AiSurround); } } - var playerPos = Player.Current.GetCenterPosition(); + var playerPos = Master.LookTarget.GetCenterPosition(); //更新玩家位置 if (_navigationUpdateTimer <= 0) @@ -53,40 +61,29 @@ _navigationUpdateTimer -= delta; } - var masterPosition = Master.GlobalPosition; - //是否在攻击范围内 var inAttackRange = false; var weapon = Master.WeaponPack.ActiveItem; + var distanceSquared = Master.Position.DistanceSquaredTo(playerPos); if (weapon != null) { - inAttackRange = masterPosition.DistanceSquaredTo(playerPos) <= Mathf.Pow(Master.GetWeaponRange(0.7f), 2); - } - - //枪口指向玩家 - Master.LookTargetPosition(playerPos); - - if (!Master.NavigationAgent2D.IsNavigationFinished()) - { - if (weapon == null || !weapon.Attribute.AiAttackAttr.FiringStand || - (Master.AttackState != AiAttackState.LockingTime && Master.AttackState != AiAttackState.Attack)) - { - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - masterPosition - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; - } - else - { - Master.AnimatedSprite.Play(AnimatorNames.Idle); - Master.BasisVelocity = Vector2.Zero; - } + inAttackRange = distanceSquared <= Mathf.Pow(Master.GetWeaponRange(0.7f), 2); } else { - Master.BasisVelocity = Vector2.Zero; + inAttackRange = distanceSquared <= Mathf.Pow(Master.EnemyRoleState.ViewRange * 0.7f, 2); + } + + if (!Master.NavigationAgent2D.IsNavigationFinished()) + { + //移动 + Master.DoMove(); + } + else + { + //站立 + Master.DoIdle(); } //检测玩家是否在视野内 @@ -101,30 +98,50 @@ Master.TargetInView = false; } - //在视野中, 或者锁敌状态下, 或者攻击状态下, 继续保持原本逻辑 - if (Master.TargetInView || Master.AttackState == AiAttackState.LockingTime || Master.AttackState == AiAttackState.Attack) + //在视野中 + if (Master.TargetInView) { + //更新标记位置 + Master.UpdateMarkTargetPosition(); if (inAttackRange) //在攻击范围内 { - //发起攻击 - Master.EnemyAttack(); - - //距离够近, 可以切换到环绕模式 - if (Master.GlobalPosition.DistanceSquaredTo(playerPos) <= Mathf.Pow(Utils.GetConfigRangeStart(weapon.Attribute.Bullet.DistanceRange), 2) * 0.7f) + if (weapon != null) { - ChangeState(AiStateEnum.AiSurround); + //距离够近, 可以切换到环绕模式 + if (distanceSquared <= Mathf.Pow(Utils.GetConfigRangeStart(weapon.Attribute.Bullet.DistanceRange) * 0.7f, 2)) + { + ChangeState(AIStateEnum.AiSurround); + } + else if (weapon.TriggerIsReady()) //可以攻击 + { + //攻击状态 + ChangeState(AIStateEnum.AiAttack); + } + } + else + { + //距离够近, 可以切换到环绕模式 + if (distanceSquared <= Mathf.Pow(Master.EnemyRoleState.ViewRange * 0.7f, 2)) + { + ChangeState(AIStateEnum.AiSurround); + } + else if (!Master.IsAttack && Master.NoWeaponAttack) //可以在没有武器时发起攻击 + { + //攻击状态 + ChangeState(AIStateEnum.AiAttack); + } } } } else //不在视野中 { - ChangeState(AiStateEnum.AiTailAfter); + ChangeState(AIStateEnum.AiTailAfter); } } public override void DebugDraw() { - var playerPos = Player.Current.GetCenterPosition(); + var playerPos = Master.LookTarget.GetCenterPosition(); Master.DrawLine(new Vector2(0, -8), Master.ToLocal(playerPos), Colors.Red); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiLeaveForState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiLeaveForState.cs index bb1c761..2ec0526 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiLeaveForState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiLeaveForState.cs @@ -1,31 +1,39 @@ +using System; using Godot; +namespace EnemyState; + /// /// 收到其他敌人通知, 前往发现目标的位置 /// -public class AiLeaveForState : StateBase +public class AiLeaveForState : StateBase { //导航目标点刷新计时器 private float _navigationUpdateTimer = 0; private float _navigationInterval = 0.3f; + + //目标 + private ActivityObject _target; + //目标点 + private Vector2 _targetPosition; - public AiLeaveForState() : base(AiStateEnum.AiLeaveFor) + private float _idleTimer = 0; + private bool _playAnimFlag = false; + + public AiLeaveForState() : base(AIStateEnum.AiLeaveFor) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { - if (Master.World.Enemy_IsFindTarget) + if (args.Length == 0) { - Master.NavigationAgent2D.TargetPosition = Master.World.Enemy_FindTargetPosition; + throw new Exception("进入 AINormalStateEnum.AiLeaveFor 状态必须带上目标对象"); } - else - { - ChangeState(prev); - return; - } - + + _target = (ActivityObject)args[0]; + //先检查弹药是否打光 if (Master.IsAllWeaponTotalAmmoEmpty()) { @@ -33,13 +41,37 @@ var targetWeapon = Master.FindTargetWeapon(); if (targetWeapon != null) { - ChangeState(AiStateEnum.AiFindAmmo, targetWeapon); + ChangeState(AIStateEnum.AiFindAmmo, targetWeapon, _target); + return; } } + + _idleTimer = 1; + _targetPosition = _target.GetCenterPosition(); + Master.LookTargetPosition(_targetPosition); + + _playAnimFlag = prev != AIStateEnum.AiFindAmmo; + if (_playAnimFlag) + { + Master.AnimationPlayer.Play(AnimatorNames.Query); + } + + //看向目标位置 + Master.LookTargetPosition(_target.GetCenterPosition()); + } + + public override void Exit(AIStateEnum next) + { + Master.AnimationPlayer.Play(AnimatorNames.Reset); } public override void Process(float delta) { + if (_playAnimFlag && _idleTimer > 0) + { + _idleTimer -= delta; + return; + } //这个状态下不会有攻击事件, 所以没必要每一帧检查是否弹药耗尽 //更新玩家位置 @@ -47,7 +79,11 @@ { //每隔一段时间秒更改目标位置 _navigationUpdateTimer = _navigationInterval; - Master.NavigationAgent2D.TargetPosition = Master.World.Enemy_FindTargetPosition; + if (Master.AffiliationArea.RoomInfo.MarkTargetPosition.TryGetValue(_target.Id, out var pos)) + { + _targetPosition = pos; + } + Master.NavigationAgent2D.TargetPosition = _targetPosition; } else { @@ -56,16 +92,14 @@ if (!Master.NavigationAgent2D.IsNavigationFinished()) { - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.LookTargetPosition(Master.World.Enemy_FindTargetPosition); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - Master.GlobalPosition - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; + Master.LookTargetPosition(_targetPosition); + //移动 + Master.DoMove(); } else { - Master.BasisVelocity = Vector2.Zero; + //站立 + Master.DoIdle(); } var playerPos = Player.Current.GetCenterPosition(); @@ -77,7 +111,8 @@ //关闭射线检测 Master.TestViewRayCastOver(); //切换成发现目标状态 - ChangeState(AiStateEnum.AiFollowUp); + Master.LookTarget = Player.Current; + ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFollowUp); return; } else @@ -90,7 +125,7 @@ //移动到目标掉了, 还没发现目标 if (Master.NavigationAgent2D.IsNavigationFinished()) { - ChangeState(AiStateEnum.AiNormal); + ChangeState(AIStateEnum.AiNormal); } } diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNormalState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNormalState.cs index b0a208c..c4635c9 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNormalState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNormalState.cs @@ -1,15 +1,15 @@ +using System.Linq; using Godot; +namespace EnemyState; + /// /// AI 正常状态 /// -public class AiNormalState : StateBase +public class AiNormalState : StateBase { - //是否发现玩家 - private bool _isFindPlayer; - - //下一个运动的角度 + //下一个运动的坐标 private Vector2 _nextPos; //是否移动结束 @@ -30,116 +30,113 @@ //卡在一个位置的时间 private float _lockTimer; - public AiNormalState() : base(AiStateEnum.AiNormal) + public AiNormalState() : base(AIStateEnum.AiNormal) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { - _isFindPlayer = false; _isMoveOver = true; _againstWall = false; _againstWallNormalAngle = 0; _pauseTimer = 0; _moveFlag = false; + Master.LookTarget = null; } public override void Process(float delta) { - //其他敌人发现玩家 - if (Master.CanChangeLeaveFor()) + //检测玩家 + var player = Player.Current; + //玩家中心点坐标 + var playerPos = player.GetCenterPosition(); + + if (Master.IsInViewRange(playerPos) && !Master.TestViewRayCast(playerPos)) //发现玩家 { - ChangeState(AiStateEnum.AiLeaveFor); + //关闭射线检测 + Master.TestViewRayCastOver(); + //发现玩家 + Master.LookTarget = player; + //判断是否进入通知状态 + if (Master.World.Enemy_InstanceList.FindIndex(enemy => + enemy != Master && !enemy.IsDie && enemy.AffiliationArea == Master.AffiliationArea && + enemy.StateController.CurrState == AIStateEnum.AiNormal) != -1) + { + //进入惊讶状态, 然后再进入通知状态 + ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiNotify); + } + else + { + //进入惊讶状态, 然后再进入跟随状态 + ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiTailAfter); + } return; } - - if (_isFindPlayer) //已经找到玩家了 + else if (_pauseTimer >= 0) { - //现临时处理, 直接切换状态 - ChangeState(AiStateEnum.AiTailAfter); + Master.AnimatedSprite.Play(AnimatorNames.Idle); + _pauseTimer -= delta; } - else //没有找到玩家 + else if (_isMoveOver) //没发现玩家, 且已经移动完成 { - //检测玩家 - var player = Player.Current; - //玩家中心点坐标 - var playerPos = player.GetCenterPosition(); - - if (Master.IsInViewRange(playerPos) && !Master.TestViewRayCast(playerPos)) //发现玩家 - { - //发现玩家 - _isFindPlayer = true; - } - else if (_pauseTimer >= 0) - { - Master.AnimatedSprite.Play(AnimatorNames.Idle); - _pauseTimer -= delta; - } - else if (_isMoveOver) //没发现玩家, 且已经移动完成 + RunOver(); + _isMoveOver = false; + } + else //移动中 + { + if (_lockTimer >= 1) //卡在一个点超过一秒 { RunOver(); _isMoveOver = false; + _lockTimer = 0; } - else //移动中 + else if (Master.NavigationAgent2D.IsNavigationFinished()) //到达终点 { - if (_lockTimer >= 1) //卡在一个点超过一秒 + _pauseTimer = Utils.Random.RandomRangeFloat(0.3f, 2f); + _isMoveOver = true; + _moveFlag = false; + //站立 + Master.DoIdle(); + } + else if (!_moveFlag) + { + _moveFlag = true; + var pos = Master.Position; + //移动 + Master.DoMove(); + _prevPos = pos; + } + else + { + var pos = Master.Position; + var lastSlideCollision = Master.GetLastSlideCollision(); + if (lastSlideCollision != null && lastSlideCollision.GetCollider() is Role) //碰到其他角色 { - RunOver(); - _isMoveOver = false; - _lockTimer = 0; - } - else if (Master.NavigationAgent2D.IsNavigationFinished()) //到达终点 - { - _pauseTimer = Utils.Random.RandomRangeFloat(0.3f, 2f); + _pauseTimer = Utils.Random.RandomRangeFloat(0.1f, 0.5f); _isMoveOver = true; _moveFlag = false; - Master.BasisVelocity = Vector2.Zero; - } - else if (!_moveFlag) - { - _moveFlag = true; - var pos = Master.GlobalPosition; - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - pos - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; - _prevPos = pos; + //站立 + Master.DoIdle(); } else { - var pos = Master.GlobalPosition; - var lastSlideCollision = Master.GetLastSlideCollision(); - if (lastSlideCollision != null && lastSlideCollision.GetCollider() is Role) //碰到其他角色 - { - _pauseTimer = Utils.Random.RandomRangeFloat(0.1f, 0.5f); - _isMoveOver = true; - _moveFlag = false; - Master.BasisVelocity = Vector2.Zero; - } - else - { - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - pos - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; - } + //移动 + Master.DoMove(); + } - if (_prevPos.DistanceSquaredTo(pos) <= 0.01f) - { - _lockTimer += delta; - } - else - { - _prevPos = pos; - } + if (_prevPos.DistanceSquaredTo(pos) <= 0.01f) + { + _lockTimer += delta; + } + else + { + _prevPos = pos; } } - - //关闭射线检测 - Master.TestViewRayCastOver(); } + + //关闭射线检测 + Master.TestViewRayCastOver(); } //移动结束 diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNotifyState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNotifyState.cs new file mode 100644 index 0000000..09a6b08 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiNotifyState.cs @@ -0,0 +1,37 @@ +using System; + +namespace EnemyState; + +/// +/// 发现目标, 通知其它敌人 +/// +public class AiNotifyState : StateBase +{ + private float _timer; + + public AiNotifyState() : base(AIStateEnum.AiNotify) + { + } + + public override void Enter(AIStateEnum prev, params object[] args) + { + if (Master.LookTarget == null) + { + throw new Exception("进入 AIAdvancedStateEnum.AiNotify 没有攻击目标!"); + } + _timer = 1.2f; + //通知其它角色 + Master.World.NotifyEnemyTarget(Master, Master.LookTarget); + Master.AnimationPlayer.Play(AnimatorNames.Notify); + } + + public override void Process(float delta) + { + Master.DoIdle(); + _timer -= delta; + if (_timer <= 0) + { + ChangeState(AIStateEnum.AiTailAfter); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiProbeState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiProbeState.cs deleted file mode 100644 index 1015095..0000000 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiProbeState.cs +++ /dev/null @@ -1,20 +0,0 @@ - -/// -/// Ai 不确定玩家位置 -/// -public class AiProbeState : StateBase -{ - public AiProbeState() : base(AiStateEnum.AiProbe) - { - } - - public override void Process(float delta) - { - //其他敌人发现玩家 - if (Master.CanChangeLeaveFor()) - { - ChangeState(AiStateEnum.AiLeaveFor); - return; - } - } -} \ No newline at end of file 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 967cc65..2d3c914 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiSurroundState.cs @@ -1,10 +1,13 @@ +using System; using Godot; +namespace EnemyState; + /// /// 距离目标足够近, 在目标附近随机移动, 并开火 /// -public class AiSurroundState : StateBase +public class AiSurroundState : StateBase { //是否移动结束 private bool _isMoveOver; @@ -21,12 +24,17 @@ //卡在一个位置的时间 private float _lockTimer; - public AiSurroundState() : base(AiStateEnum.AiSurround) + public AiSurroundState() : base(AIStateEnum.AiSurround) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { + if (Master.LookTarget == null) + { + throw new Exception("进入 AIAdvancedStateEnum.AiSurround 状态时角色没有攻击目标!"); + } + Master.TargetInView = true; _isMoveOver = true; _pauseTimer = 0; @@ -42,16 +50,12 @@ var targetWeapon = Master.FindTargetWeapon(); if (targetWeapon != null) { - ChangeState(AiStateEnum.AiFindAmmo, targetWeapon); + ChangeState(AIStateEnum.AiFindAmmo, targetWeapon); return; } } - var playerPos = Player.Current.GetCenterPosition(); - var weapon = Master.WeaponPack.ActiveItem; - - //枪口指向玩家 - Master.LookTargetPosition(playerPos); + var playerPos = Master.LookTarget.GetCenterPosition(); //检测玩家是否在视野内 if (Master.IsInTailAfterViewRange(playerPos)) @@ -65,12 +69,12 @@ Master.TargetInView = false; } - //在视野中, 或者锁敌状态下, 或者攻击状态下, 继续保持原本逻辑 - if (Master.TargetInView || - (weapon != null && weapon.Attribute.AiAttackAttr.FiringStand && - (Master.AttackState == AiAttackState.LockingTime || Master.AttackState == AiAttackState.Attack) - )) + //在视野中 + if (Master.TargetInView) { + //更新标记位置 + Master.UpdateMarkTargetPosition(); + if (_pauseTimer >= 0) { Master.AnimatedSprite.Play(AnimatorNames.Idle); @@ -83,6 +87,7 @@ } else { + var masterPosition = Master.Position; if (_lockTimer >= 1) //卡在一个点超过一秒 { RunOver(playerPos); @@ -94,76 +99,73 @@ _pauseTimer = Utils.Random.RandomRangeFloat(0f, 0.5f); _isMoveOver = true; _moveFlag = false; - Master.BasisVelocity = Vector2.Zero; + //站立 + Master.DoIdle(); } else if (!_moveFlag) { _moveFlag = true; - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = - (nextPos - Master.GlobalPosition - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; + //移动 + Master.DoMove(); } else { - var pos = Master.GlobalPosition; var lastSlideCollision = Master.GetLastSlideCollision(); if (lastSlideCollision != null && lastSlideCollision.GetCollider() is Role) //碰到其他角色 { _pauseTimer = Utils.Random.RandomRangeFloat(0f, 0.3f); _isMoveOver = true; _moveFlag = false; - Master.BasisVelocity = Vector2.Zero; + //站立 + Master.DoIdle(); } else { - //判断开火状态, 进行移动 - if (weapon == null || !weapon.Attribute.AiAttackAttr.FiringStand || - (Master.AttackState != AiAttackState.LockingTime && Master.AttackState != AiAttackState.Attack)) - { //正常移动 - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - pos - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; - } - else //站立不动 - { - Master.AnimatedSprite.Play(AnimatorNames.Idle); - Master.BasisVelocity = Vector2.Zero; - } + //移动 + Master.DoMove(); } - if (_prevPos.DistanceSquaredTo(pos) <= 0.01f) + if (_prevPos.DistanceSquaredTo(masterPosition) <= 1 * delta) { _lockTimer += delta; } else { - _prevPos = pos; + _lockTimer = 0; + _prevPos = masterPosition; } } + var weapon = Master.WeaponPack.ActiveItem; if (weapon != null) { - var position = Master.GlobalPosition; - if (position.DistanceSquaredTo(playerPos) > Mathf.Pow(Master.GetWeaponRange(0.7f), 2)) //玩家离开正常射击范围 + if (masterPosition.DistanceSquaredTo(playerPos) > Mathf.Pow(Master.GetWeaponRange(0.7f), 2)) //玩家离开正常射击范围 { - ChangeState(AiStateEnum.AiFollowUp); + ChangeState(AIStateEnum.AiFollowUp); } - else + else if (weapon.TriggerIsReady()) //可以攻击 { //发起攻击 - Master.EnemyAttack(); + ChangeState(AIStateEnum.AiAttack); + } + } + else + { + if (masterPosition.DistanceSquaredTo(playerPos) > Mathf.Pow(Master.EnemyRoleState.ViewRange * 0.7f, 2)) //玩家离开正常射击范围 + { + ChangeState(AIStateEnum.AiFollowUp); + } + else if (!Master.IsAttack && Master.NoWeaponAttack) //可以在没有武器时发起攻击 + { + //攻击状态 + ChangeState(AIStateEnum.AiAttack); } } } } else //目标离开视野 { - ChangeState(AiStateEnum.AiTailAfter); + ChangeState(AIStateEnum.AiTailAfter); } } diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiTailAfterState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiTailAfterState.cs index 87b21aa..4fa2cc5 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiTailAfterState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiTailAfterState.cs @@ -1,10 +1,13 @@ +using System; using Godot; +namespace EnemyState; + /// -/// AI 发现玩家, 跟随玩家 +/// AI 发现玩家, 跟随玩家, 但是不在视野范围内 /// -public class AiTailAfterState : StateBase +public class AiTailAfterState : StateBase { /// /// 目标是否在视野半径内 @@ -18,12 +21,17 @@ //目标从视野消失时已经过去的时间 private float _viewTimer; - public AiTailAfterState() : base(AiStateEnum.AiTailAfter) + public AiTailAfterState() : base(AIStateEnum.AiTailAfter) { } - public override void Enter(AiStateEnum prev, params object[] args) + public override void Enter(AIStateEnum prev, params object[] args) { + if (Master.LookTarget == null) + { + throw new Exception("进入 AIAdvancedStateEnum.AiTailAfter 状态时角色没有攻击目标!"); + } + _isInViewRange = true; _navigationUpdateTimer = 0; _viewTimer = 0; @@ -35,16 +43,16 @@ var targetWeapon = Master.FindTargetWeapon(); if (targetWeapon != null) { - ChangeState(AiStateEnum.AiFindAmmo, targetWeapon); + ChangeState(AIStateEnum.AiFindAmmo, targetWeapon); } } } - + public override void Process(float delta) { //这个状态下不会有攻击事件, 所以没必要每一帧检查是否弹药耗尽 - var playerPos = Player.Current.GetCenterPosition(); + var playerPos = Master.LookTarget.GetCenterPosition(); //更新玩家位置 if (_navigationUpdateTimer <= 0) @@ -58,30 +66,15 @@ _navigationUpdateTimer -= delta; } - //枪口指向玩家 - Master.LookTargetPosition(playerPos); - if (!Master.NavigationAgent2D.IsNavigationFinished()) { - var weapon = Master.WeaponPack.ActiveItem; - if (weapon == null || !weapon.Attribute.AiAttackAttr.FiringStand || - (Master.AttackState != AiAttackState.LockingTime && Master.AttackState != AiAttackState.Attack)) - { - //计算移动 - var nextPos = Master.NavigationAgent2D.GetNextPathPosition(); - Master.AnimatedSprite.Play(AnimatorNames.Run); - Master.BasisVelocity = (nextPos - Master.GlobalPosition - Master.NavigationPoint.Position).Normalized() * - Master.RoleState.MoveSpeed; - } - else - { - Master.AnimatedSprite.Play(AnimatorNames.Idle); - Master.BasisVelocity = Vector2.Zero; - } + //移动 + Master.DoMove(); } else { - Master.BasisVelocity = Vector2.Zero; + //站立 + Master.DoIdle(); } //检测玩家是否在视野内, 如果在, 则切换到 AiTargetInView 状态 if (Master.IsInTailAfterViewRange(playerPos)) @@ -91,7 +84,7 @@ //关闭射线检测 Master.TestViewRayCastOver(); //切换成发现目标状态 - ChangeState(AiStateEnum.AiFollowUp); + ChangeState(AIStateEnum.AiFollowUp); return; } else @@ -111,7 +104,7 @@ { if (_viewTimer > 10) //10秒 { - ChangeState(AiStateEnum.AiNormal); + ChangeState(AIStateEnum.AiNormal); } else { @@ -122,7 +115,7 @@ public override void DebugDraw() { - var playerPos = Player.Current.GetCenterPosition(); + var playerPos = Master.LookTarget.GetCenterPosition(); if (_isInViewRange) { Master.DrawLine(new Vector2(0, -8), Master.ToLocal(playerPos), Colors.Orange); diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index f543bf1..53909ad 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -1,4 +1,5 @@ using System; +using Config; using Godot; @@ -18,6 +19,18 @@ /// public StateController StateController { get; private set; } + public PlayerRoleState PlayerRoleState { get; private set; } + + /// + /// 是否可以翻滚 + /// + public bool CanRoll => _rollCoolingTimer <= 0; + + //翻滚冷却计时器 + private float _rollCoolingTimer = 0; + + private BrushImageData _brushData2; + /// /// 设置当前操作的玩家对象 /// @@ -44,14 +57,17 @@ MaxShield = 0; Shield = 0; + WeaponPack.SetCapacity(4); + 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); - //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f); // this.CallDelay(0.5f, () => // { // var weapon = Create(Ids.Id_weapon0009); @@ -64,8 +80,17 @@ StateController.Register(new PlayerRollState()); //默认状态 StateController.ChangeStateInstant(PlayerStateEnum.Idle); - + //InitSubLine(); + + _brushData2 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0001"]); + } + + protected override RoleState OnCreateRoleState() + { + var roleState = new PlayerRoleState(); + PlayerRoleState = roleState; + return roleState; } protected override void Process(float delta) @@ -75,10 +100,16 @@ { return; } - //脸的朝向 - if (LookTarget == null) + + if (_rollCoolingTimer > 0) { - var gPos = GlobalPosition; + _rollCoolingTimer -= delta; + } + + if (MountLookTarget) //看向目标 + { + //脸的朝向 + var gPos = Position; Vector2 mousePos = InputManager.CursorPosition; if (mousePos.X > gPos.X && Face == FaceDirection.Left) { @@ -88,12 +119,9 @@ { Face = FaceDirection.Left; } - - if (MountLookTarget) - { - //枪口跟随鼠标 - MountPoint.SetLookAt(mousePos); - } + + //枪口跟随鼠标 + MountPoint.SetLookAt(mousePos); } if (InputManager.ExchangeWeapon) //切换武器 @@ -159,6 +187,10 @@ { UseActiveProp(); } + else if (InputManager.ExchangeProp) //切换道具 + { + ExchangeNextActiveProp(); + } else if (InputManager.RemoveProp) //扔掉道具 { ThrowActiveProp(); @@ -168,14 +200,14 @@ { //Hurt(1000, 0); Hp = 0; - Hurt(1000, 0); + Hurt(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(1000, 0); + ((Enemy)enemy).Hurt(this, 1000, 0); } } // //测试用 @@ -191,6 +223,24 @@ // freezeSprite.ActivityObject.MoveController.AddForce(temp.Normalized() * 300 * (25f - temp.Length()) / 25f); // } // } + + if (Face == FaceDirection.Right) + { + TipRoot.Scale = Vector2.One; + } + else + { + TipRoot.Scale = new Vector2(-1, 1); + } + + //测试刷地 + //DrawLiquid(_brushData2); + } + + protected override void OnAffiliationChange(AffiliationArea prevArea) + { + //BrushPrevPosition = null; + base.OnAffiliationChange(prevArea); } protected override void OnPickUpWeapon(Weapon weapon) @@ -209,7 +259,7 @@ return 1; } - protected override void OnHit(int damage, bool realHarm) + protected override void OnHit(ActivityObject target, int damage, float angle, bool realHarm) { //进入无敌状态 if (realHarm) //真实伤害 @@ -321,6 +371,14 @@ } } + /// + /// 翻滚结束 + /// + public void OverRoll() + { + _rollCoolingTimer = PlayerRoleState.RollCoolingTime; + } + // protected override void DebugDraw() // { // base.DebugDraw(); diff --git a/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs b/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs new file mode 100644 index 0000000..f52b21d --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/role/player/PlayerRoleState.cs @@ -0,0 +1,18 @@ + +public class PlayerRoleState : RoleState +{ + /// + /// 翻滚速度 + /// + public float RollSpeed = 170f; + + /// + /// 翻滚持续时间 + /// + public float RollTime = 0.15f; + + /// + /// 翻滚冷却时间 + /// + public float RollCoolingTime = 0.4f; +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs index 229b5df..8af732a 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/state/PlayerRollState.cs @@ -22,7 +22,6 @@ } _coroutineId = Master.StartCoroutine(RunRoll()); - Master.AnimatedSprite.Play(AnimatorNames.Roll); //隐藏武器 Master.BackMountPoint.Visible = false; @@ -32,7 +31,7 @@ //翻滚移动方向 _moveDir = InputManager.MoveAxis; - Master.BasisVelocity = _moveDir * Master.RoleState.RollSpeed; + Master.BasisVelocity = _moveDir * Master.PlayerRoleState.RollSpeed; } public override void Exit(PlayerStateEnum next) @@ -42,18 +41,36 @@ Master.MountPoint.Visible = true; //启用伤害碰撞 Master.HurtCollision.Disabled = false; + Master.BasisVelocity = Master.BasisVelocity.LimitLength(Master.RoleState.MoveSpeed); } public override void Process(float delta) { - Master.BasisVelocity = _moveDir * Master.RoleState.RollSpeed; + Master.BasisVelocity = _moveDir * Master.PlayerRoleState.RollSpeed; } //翻滚逻辑处理 private IEnumerator RunRoll() { + Master.AnimatedSprite.Play(AnimatorNames.Roll); + + Master.MountLookTarget = false; + var face = Master.Face; + var velocity = Master.BasisVelocity; + if (velocity.X > 0 && face == FaceDirection.Left) + { + Master.Face = FaceDirection.Right; + } + else if (velocity.X < 0 && face == FaceDirection.Right) + { + Master.Face = FaceDirection.Left; + } + yield return Master.AnimatedSprite.ToSignal(Master.AnimatedSprite, AnimatedSprite2D.SignalName.AnimationFinished); _coroutineId = -1; + + Master.MountLookTarget = true; + Master.Face = face; Master.OverRoll(); if (InputManager.MoveAxis != Vector2.Zero) //切换到移动状态 { diff --git a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs b/DungeonShooting_Godot/src/game/activity/shell/Shell.cs deleted file mode 100644 index 379448d..0000000 --- a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs +++ /dev/null @@ -1,32 +0,0 @@ - -using Godot; - -/// -/// 弹壳类 -/// -[Tool] -public partial class Shell : ActivityObject -{ - public override void OnInit() - { - ShadowOffset = new Vector2(0, 1); - ThrowCollisionSize = new Vector2(5, 5); - } - - protected override void Process(float delta) - { - //落地静止后将弹壳变为静态贴图 - if (!IsThrowing && Altitude <= 0 && MoveController.IsMotionless()) - { - if (AffiliationArea != null) - { - Freeze(); - } - else - { - Debug.Log("弹壳投抛到画布外了, 强制消除..."); - Destroy(); - } - } - } -} \ 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 new file mode 100644 index 0000000..9ee4dc5 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/weapon/AiAttackEnum.cs @@ -0,0 +1,43 @@ + +/// +/// 调用 Weapon.AiTriggerAttackState() 函数返回的结果 +/// +public enum AiAttackEnum +{ + /// + /// 未触发 AiTriggerAttackState() + /// + None, + /// + /// 触发切换武器 + /// + ExchangeWeapon, + /// + /// 没有弹药了 + /// + NoAmmo, + /// + /// 换弹中 + /// + Reloading, + /// + /// 触发换弹 + /// + TriggerReload, + /// + /// 没有武器 + /// + NoWeapon, + /// + /// 正在锁定目标中 + /// + LockingTime, + /// + /// 攻击间隙时间 + /// + AttackInterval, + /// + /// 成功触发攻击 + /// + Attack, +} \ 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 b59ba0e..87408d0 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -6,7 +6,7 @@ /// /// 武器的基类 /// -public abstract partial class Weapon : ActivityObject, IPackageItem +public abstract partial class Weapon : ActivityObject, IPackageItem { /// /// 武器使用的属性数据, 该属性会根据是否是玩家使用武器, 如果是Ai使用武器, 则会返回 AiUseAttribute 的属性对象 @@ -57,12 +57,6 @@ /// [Export, ExportFillNode] public Marker2D ShellPoint { get; set; } - - /// - /// 武器握把位置 - /// - [Export, ExportFillNode] - public Marker2D GripPoint { get; set; } /// /// 武器的当前散射半径 @@ -146,7 +140,7 @@ public bool NoMasterCanTrigger { get; set; } = true; /// - /// 上一次触发改武器开火的角色 + /// 上一次触发改武器开火的角色, 可能为 null /// public Role TriggerRole { get; private set; } @@ -155,6 +149,11 @@ /// public long TriggerRoleAttackLayer { get; private set; } + /// + /// 武器当前射速 + /// + public float CurrentFiringSpeed { get; private set; } + //-------------------------------------------------------------------------------------------- //用于记录是否有角色操作过这把武器 @@ -208,8 +207,14 @@ //当前后坐力导致的偏移长度 private float _currBacklashLength = 0; - //临时存放动画精灵位置 - private Vector2 _tempAnimatedSpritePosition; + //握把位置 + private Vector2 _gripPoint; + + //持握时 Sprite 偏移 + private Vector2 _gripOffset; + + //碰撞器位置 + private Vector2 _collPoint; //换弹计时器 private float _reloadTimer = 0; @@ -279,22 +284,29 @@ return attr; } - throw new Exception($"武器'{itemId}'没有在 Weapon 表中配置属性数据!"); + throw new Exception($"武器'{itemId}'没有在 WeaponBase 表中配置属性数据!"); } public override void OnInit() { - InitWeapon(GetWeaponAttribute(ItemConfig.Id).Clone()); - AnimatedSprite.AnimationFinished += OnAnimationFinished; + InitWeapon(GetWeaponAttribute(ActivityBase.Id).Clone()); + AnimatedSprite.AnimationFinished += OnAnimatedSpriteFinished; + AnimationPlayer.AnimationFinished += OnAnimationPlayerFinished; + _gripPoint = AnimatedSprite.Position; + _gripOffset = AnimatedSprite.Offset; + _collPoint = Collision.Position; + AnimatedSprite.Position = Vector2.Zero; + AnimatedSprite.Offset = Vector2.Zero; + Collision.Position = Vector2.Zero; } /// /// 初始化武器属性 /// - public void InitWeapon(ExcelConfig.WeaponBase attribute) + private void InitWeapon(ExcelConfig.WeaponBase attribute) { _playerWeaponAttribute = attribute; - _weaponAttribute = attribute; + SetCurrentWeaponAttribute(attribute); if (attribute.AiUseAttribute != null) { _aiWeaponAttribute = attribute.AiUseAttribute; @@ -307,7 +319,7 @@ if (Attribute.AmmoCapacity > Attribute.MaxAmmoCapacity) { Attribute.AmmoCapacity = Attribute.MaxAmmoCapacity; - Debug.LogError("弹夹的容量不能超过弹药上限, 武器id: " + ItemConfig.Id); + Debug.LogError("弹夹的容量不能超过弹药上限, 武器id: " + ActivityBase.Id); } //弹药量 CurrAmmo = Attribute.AmmoCapacity; @@ -433,7 +445,6 @@ public override void EnterTree() { - base.EnterTree(); //收集落在地上的武器 if (IsInGround()) { @@ -443,7 +454,6 @@ public override void ExitTree() { - base.ExitTree(); World.Weapon_UnclaimedWeapons.Remove(this); } @@ -462,6 +472,8 @@ _attackTimer = _attackTimer > 0 ? _attackTimer - delta : 0; //武器的当前散射半径 ScatteringRangeBackHandler(delta); + //武器当前射速 + FiringSpeedBackHandler(delta); //松开扳机 if (_triggerFlag || _downTimer > 0) { @@ -606,7 +618,7 @@ //自动上膛 if (_beLoadedState == -1) { - BeLoadedHandler(); + BeLoaded(); } } } @@ -657,12 +669,21 @@ } } - //散射值销退 + //散射值消退 if (_noAttackTime >= Attribute.ScatteringRangeBackDelayTime) { ScatteringRangeBackHandler(delta); } + if (_triggerFlag) //射速增加 + { + FiringSpeedAddHandler(delta); + } + else if (_noAttackTime >= Attribute.FiringSpeedBackTime) //射速消退 + { + FiringSpeedBackHandler(delta); + } + _triggerTimer = _triggerTimer > 0 ? _triggerTimer - delta : 0; _triggerFlag = false; _attackFlag = false; @@ -712,13 +733,13 @@ { TriggerRole = triggerRole; TriggerRoleAttackLayer = triggerRole.AttackLayer; - _weaponAttribute = triggerRole.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute; + SetCurrentWeaponAttribute(triggerRole.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute); } else if (Master != null) { TriggerRole = Master; TriggerRoleAttackLayer = Master.AttackLayer; - _weaponAttribute = Master.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute; + SetCurrentWeaponAttribute(Master.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute); } //是否第一帧按下 @@ -735,7 +756,7 @@ else if (_attackTimer <= 0) { //触发上膛操作 - BeLoadedHandler(); + BeLoaded(); } } } @@ -896,7 +917,7 @@ } /// - /// 获取攻击冷却计时时间, 等于 0 表示冷却完成 + /// 获取攻击冷却计时时间, 小于等于 0 表示冷却完成 /// public float GetAttackTimer() { @@ -912,6 +933,14 @@ } /// + /// 是否可以按下扳机并发射了 + /// + public bool TriggerIsReady() + { + return GetBeLoadedStateState() >= 2 && !IsAttackIntervalTime(); + } + + /// /// 获取上膛状态,-1: 等待执行自动上膛 , 0: 未上膛, 1: 上膛中, 2: 已经完成上膛 /// public sbyte GetBeLoadedStateState() @@ -996,7 +1025,7 @@ } //开火间隙, 这里的60指的是60秒 - _fireInterval = 60 / Attribute.StartFiringSpeed; + _fireInterval = 60 / CurrentFiringSpeed; //攻击冷却 _attackTimer += _fireInterval; @@ -1034,14 +1063,14 @@ var bulletCount = Utils.Random.RandomConfigRange(Attribute.FireBulletCountRange); if (Master != null) { - bulletCount = Master.RoleState.CallCalcBulletCountEvent(this, bulletCount); + bulletCount = Master.RoleState.CalcBulletCount(bulletCount); fireRotation += Master.MountPoint.RealRotation; } else { fireRotation += GlobalRotation; } - + //创建子弹 for (var i = 0; i < bulletCount; i++) { @@ -1211,7 +1240,7 @@ /// public void Reload() { - if (CurrAmmo < Attribute.AmmoCapacity && ResidueAmmo > 0 && !Reloading && _beLoadedState != 1) + if (!Reloading && CurrAmmo < Attribute.AmmoCapacity && ResidueAmmo > 0 && _beLoadedState != 1) { Reloading = true; _playReloadFinishSoundFlag = false; @@ -1265,6 +1294,59 @@ _reloadTimer = 0; _reloadUseTime = 0; } + + /// + /// 触发上膛 + /// + public void BeLoaded() + { + if (_beLoadedState > 0) + { + return; + } + //上膛抛弹 + if (!Attribute.ReloadThrowShell && !Attribute.ContinuousShoot && Attribute.BeLoadedTime > 0) + { + ThrowShellHandler(0.6f); + } + + //开始上膛 + OnBeginBeLoaded(); + + //上膛时间为0, 直接结束上膛 + if (Attribute.BeLoadedTime <= 0) + { + //直接上膛完成 + _beLoadedState = 2; + OnBeLoadedFinish(); + return; + } + + //上膛中 + _beLoadedState = 1; + _beLoadedStateTimer = Attribute.BeLoadedTime; + + //播放上膛动画 + if (IsAutoPlaySpriteFrames) + { + if (Attribute.BeLoadedSoundDelayTime <= 0) + { + PlaySpriteAnimation(AnimatorNames.BeLoaded); + PlayAnimationPlayer(AnimatorNames.BeLoaded); + } + else + { + this.CallDelay(Attribute.BeLoadedSoundDelayTime, () => + { + PlaySpriteAnimation(AnimatorNames.BeLoaded); + PlayAnimationPlayer(AnimatorNames.BeLoaded); + }); + } + } + + //播放上膛音效 + PlayBeLoadedSound(); + } //播放换弹开始音效 private void PlayBeginReloadSound() @@ -1340,7 +1422,7 @@ if (_attackTimer <= 0) { //执行自动上膛 - BeLoadedHandler(); + BeLoaded(); } else if (CurrAmmo > 0) { @@ -1415,53 +1497,6 @@ OnAloneReloadStateFinish(); } - //上膛处理 - private void BeLoadedHandler() - { - //上膛抛弹 - if (!Attribute.ReloadThrowShell && !Attribute.ContinuousShoot && Attribute.BeLoadedTime > 0) - { - ThrowShellHandler(0.6f); - } - - //开始上膛 - OnBeginBeLoaded(); - - //上膛时间为0, 直接结束上膛 - if (Attribute.BeLoadedTime <= 0) - { - //直接上膛完成 - _beLoadedState = 2; - OnBeLoadedFinish(); - return; - } - - //上膛中 - _beLoadedState = 1; - _beLoadedStateTimer = Attribute.BeLoadedTime; - - //播放上膛动画 - if (IsAutoPlaySpriteFrames) - { - if (Attribute.BeLoadedSoundDelayTime <= 0) - { - PlaySpriteAnimation(AnimatorNames.BeLoaded); - PlayAnimationPlayer(AnimatorNames.BeLoaded); - } - else - { - this.CallDelay(Attribute.BeLoadedSoundDelayTime, () => - { - PlaySpriteAnimation(AnimatorNames.BeLoaded); - PlayAnimationPlayer(AnimatorNames.BeLoaded); - }); - } - } - - //播放上膛音效 - PlayBeLoadedSound(); - } - //抛弹逻辑 private void ThrowShellHandler(float speedScale) { @@ -1475,13 +1510,13 @@ this.CallDelay(Attribute.ThrowShellDelayTime, () => { _reloadShellFlag = true; - ThrowShell(Attribute.Shell, speedScale); + FireManager.ThrowShell(this, Attribute.Shell, speedScale); }); } else if (Attribute.ThrowShellDelayTime == 0) { _reloadShellFlag = true; - ThrowShell(Attribute.Shell, speedScale); + FireManager.ThrowShell(this, Attribute.Shell, speedScale); } } @@ -1492,8 +1527,8 @@ var finalScatteringRange = Attribute.FinalScatteringRange; if (Master != null) { - startScatteringRange = Master.RoleState.CallCalcStartScatteringEvent(this, startScatteringRange); - finalScatteringRange = Master.RoleState.CallCalcFinalScatteringEvent(this, finalScatteringRange); + startScatteringRange = Master.RoleState.CalcStartScattering(startScatteringRange); + finalScatteringRange = Master.RoleState.CalcFinalScattering(finalScatteringRange); } if (startScatteringRange <= finalScatteringRange) { @@ -1514,8 +1549,8 @@ var finalScatteringRange = Attribute.FinalScatteringRange; if (Master != null) { - startScatteringRange = Master.RoleState.CallCalcStartScatteringEvent(this, startScatteringRange); - finalScatteringRange = Master.RoleState.CallCalcFinalScatteringEvent(this, finalScatteringRange); + startScatteringRange = Master.RoleState.CalcStartScattering(startScatteringRange); + finalScatteringRange = Master.RoleState.CalcFinalScattering(finalScatteringRange); } if (startScatteringRange <= finalScatteringRange) { @@ -1529,6 +1564,34 @@ } } + //射速增加处理 + private void FiringSpeedAddHandler(float delta) + { + if (Attribute.ContinuousShoot) + { + CurrentFiringSpeed = Mathf.MoveToward(CurrentFiringSpeed, Attribute.FinalFiringSpeed, + Attribute.FiringSpeedAddSpeed * delta); + } + else + { + CurrentFiringSpeed = Attribute.StartFiringSpeed; + } + } + + //射速衰减处理 + private void FiringSpeedBackHandler(float delta) + { + if (Attribute.ContinuousShoot) + { + CurrentFiringSpeed = Mathf.MoveToward(CurrentFiringSpeed, Attribute.StartFiringSpeed, + Attribute.FiringSpeedBackSpeed * delta); + } + else + { + CurrentFiringSpeed = Attribute.StartFiringSpeed; + } + } + /// /// 换弹计时器时间到, 执行换弹操作 /// @@ -1598,12 +1661,21 @@ } //帧动画播放结束 - private void OnAnimationFinished() + private void OnAnimatedSpriteFinished() { // Debug.Log("帧动画播放结束..."); AnimatedSprite.Play(AnimatorNames.Default); } + //动画播放器播放结束 + private void OnAnimationPlayerFinished(StringName name) + { + if (Master != null && !IsActive) + { + Master.OnPutBackMount(this, PackageIndex); + } + } + public override CheckInteractiveResult CheckInteractive(ActivityObject master) { var result = new CheckInteractiveResult(this); @@ -1612,9 +1684,14 @@ { if (Master == null) { + if (roleMaster.WeaponPack.Capacity == 0) + { + //容量为0 + return result; + } var masterWeapon = roleMaster.WeaponPack.ActiveItem; //查找是否有同类型武器 - var index = roleMaster.WeaponPack.FindIndex(ItemConfig.Id); + var index = roleMaster.WeaponPack.FindIndex(ActivityBase.Id); if (index != -1) //如果有这个武器 { if (CurrAmmo + ResidueAmmo != 0) //子弹不为空 @@ -1656,9 +1733,14 @@ { if (master is Role roleMaster) //与role互动 { + if (roleMaster.WeaponPack.Capacity == 0) + { + //容量为0 + return; + } var holster = roleMaster.WeaponPack; //查找是否有同类型武器 - var index = holster.FindIndex(ItemConfig.Id); + var index = holster.FindIndex(ActivityBase.Id); if (index != -1) //如果有这个武器 { if (CurrAmmo + ResidueAmmo == 0) //没有子弹了 @@ -1752,7 +1834,15 @@ var rotation = master.MountPoint.GlobalRotation; GlobalRotation = rotation; - startPosition -= GripPoint.Position.Rotated(rotation); + if (master.Face == FaceDirection.Right) + { + startPosition += _gripPoint.Rotated(rotation); + } + else + { + startPosition += new Vector2(_gripPoint.X, -_gripPoint.Y).Rotated(rotation); + } + var startHeight = -master.MountPoint.Position.Y; var velocity = new Vector2(20, 0).Rotated(rotation); var yf = Utils.Random.RandomRangeInt(50, 70); @@ -1787,7 +1877,7 @@ { //调整阴影 //ShadowOffset = new Vector2(0, Master.GlobalPosition.Y - GlobalPosition.Y); - ShadowOffset = new Vector2(0, -Master.MountPoint.Position.Y); + ShadowOffset = new Vector2(0, -Master.MountPoint.Position.Y + 2); //枪口默认抬起角度 RotationDegrees = -Attribute.DefaultAngle; ShowShadowSprite(); @@ -1799,6 +1889,12 @@ /// private void Conceal() { + //停止换弹动画 + if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying()) + { + AnimationPlayer.Play(AnimatorNames.Reset); + } + HideShadowSprite(); OnConceal(); } @@ -1812,9 +1908,13 @@ } GetParent().RemoveChild(this); _triggerRoleFlag = false; - _weaponAttribute = _playerWeaponAttribute; + SetCurrentWeaponAttribute(_playerWeaponAttribute); CollisionLayer = _tempLayer; - AnimatedSprite.Position = _tempAnimatedSpritePosition; + + //精灵位置, 旋转中心点 + AnimatedSprite.Position = Vector2.Zero; + AnimatedSprite.Offset = Vector2.Zero; + Collision.Position = Vector2.Zero; //清除 Ai 拾起标记 RemoveSign(SignNames.AiFindWeaponSign); //停止换弹 @@ -1822,6 +1922,11 @@ { StopReload(); } + //停止换弹动画 + if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying()) + { + AnimationPlayer.Play(AnimatorNames.Reset); + } OnRemove(Master); } @@ -1829,7 +1934,7 @@ { Pickup(); _triggerRoleFlag = true; - _weaponAttribute = Master.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute; + SetCurrentWeaponAttribute(Master.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute); //停止动画 AnimationPlayer.Stop(); //清除泛白效果 @@ -1837,10 +1942,9 @@ ZIndex = 0; //禁用碰撞 //Collision.Disabled = true; - //精灵位置 - _tempAnimatedSpritePosition = AnimatedSprite.Position; - var position = GripPoint.Position; - AnimatedSprite.Position = new Vector2(-position.X, -position.Y); + AnimatedSprite.Position = _gripPoint; + AnimatedSprite.Offset = _gripOffset; + Collision.Position = _collPoint; //修改层级 _tempLayer = CollisionLayer; CollisionLayer = PhysicsLayer.OnHand; @@ -1902,313 +2006,122 @@ { return AnimatedSprite.Position + ShellPoint.Position; } - - //-------------------------- ----- 子弹相关 ----------------------------- /// - /// 投抛弹壳的默认实现方式, shellId为弹壳id + /// 获取握把位置, 相当于武器的原点坐标 /// - protected ActivityObject ThrowShell(ExcelConfig.ActivityBase shell, float speedScale = 1) + public Vector2 GetGripPosition() { - var startPos = ShellPoint.GlobalPosition; - float startHeight; - if (Master != null) - { - var shellPosition = (Master != null ? Master.MountPoint.Position : Position) + ShellPoint.Position; - startHeight = -shellPosition.Y; - startPos.Y += startHeight; - } - else - { - startHeight = Altitude; - } - - var direction = GlobalRotationDegrees + Utils.Random.RandomRangeInt(-30, 30) + 180; - var verticalSpeed = Utils.Random.RandomRangeInt((int)(60 * speedScale), (int)(120 * speedScale)); - var velocity = new Vector2(Utils.Random.RandomRangeInt((int)(20 * speedScale), (int)(60 * speedScale)), 0).Rotated(direction * Mathf.Pi / 180); - var rotate = Utils.Random.RandomRangeInt((int)(-720 * speedScale), (int)(720 * speedScale)); - var shellInstance = Create(shell); - shellInstance.Rotation = (Master != null ? Master.MountPoint.RealRotation : Rotation); - shellInstance.Throw(startPos, startHeight, verticalSpeed, velocity, rotate); - shellInstance.InheritVelocity(Master != null ? Master : this); - if (Master == null) - { - AffiliationArea.InsertItem(shellInstance); - } - else - { - Master.AffiliationArea.InsertItem(shellInstance); - } - - return shellInstance; + return _gripPoint + _gripOffset; } - /// - /// 发射子弹 - /// - protected IBullet ShootBullet(float fireRotation, ExcelConfig.BulletBase bullet) + //设置当前使用的武器属性 + private void SetCurrentWeaponAttribute(ExcelConfig.WeaponBase attr) { - if (bullet.Type == 1) //实体子弹 + if (attr != _weaponAttribute) { - return ShootSolidBullet(fireRotation, bullet); + _weaponAttribute = attr; + //重置开火速率 + CurrentFiringSpeed = _weaponAttribute.StartFiringSpeed; } - else if (bullet.Type == 2) //激光子弹 - { - return ShootLaser(fireRotation, bullet); - } - - return null; - } - - /// - /// 发射子弹的默认实现方式 - /// - private Bullet ShootSolidBullet(float fireRotation, ExcelConfig.BulletBase bullet) - { - var data = new BulletData() - { - Weapon = this, - BulletBase = bullet, - TriggerRole = TriggerRole, - MinHarm = Utils.GetConfigRangeStart(bullet.HarmRange), - MaxHarm = Utils.GetConfigRangeEnd(bullet.HarmRange), - MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), - FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), - VerticalSpeed = Utils.Random.RandomConfigRange(bullet.VerticalSpeed), - BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), - Position = FirePoint.GlobalPosition, - }; - - var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); - if (TriggerRole != null) - { - data.FlySpeed = TriggerRole.RoleState.CallCalcBulletSpeedEvent(this, data.FlySpeed); - data.MaxDistance = TriggerRole.RoleState.CallCalcBulletDistanceEvent(this, data.MaxDistance); - deviationAngle = TriggerRole.RoleState.CallCalcBulletDeviationAngleEvent(this, deviationAngle); - } - - if (TriggerRole != null && TriggerRole.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 - { - data.FlySpeed *= AiUseAttribute.AiAttackAttr.BulletSpeedScale; - } - - data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); - //创建子弹 - var bulletInstance = Create(bullet.Prefab); - bulletInstance.InitData(data, GetAttackLayer()); - return bulletInstance; - } - - /// - /// 发射射线的默认实现方式 - /// - private Laser ShootLaser(float fireRotation, ExcelConfig.BulletBase bullet) - { - var data = new BulletData() - { - Weapon = this, - BulletBase = bullet, - TriggerRole = TriggerRole, - MinHarm = Utils.GetConfigRangeStart(bullet.HarmRange), - MaxHarm = Utils.GetConfigRangeEnd(bullet.HarmRange), - MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), - BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), - LifeTime = Utils.Random.RandomConfigRange(bullet.LifeTimeRange), - Position = FirePoint.GlobalPosition, - }; - - var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); - if (TriggerRole != null) - { - deviationAngle = TriggerRole.RoleState.CallCalcBulletDeviationAngleEvent(this, deviationAngle); - } - - data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); - //创建激光 - var laser = ResourceManager.LoadAndInstantiate(bullet.Prefab); - laser.AddToActivityRoot(RoomLayerEnum.YSortLayer); - laser.InitData(data, GetAttackLayer(), 3); - return laser; } //-------------------------------- Ai相关 ----------------------------- /// - /// Ai 调用, 刷新 Ai 攻击状态并返回, 并不会调用相应的函数 - /// - public AiAttackState AiRefreshAttackState() - { - AiAttackState flag; - if (IsTotalAmmoEmpty()) //当前武器弹药打空 - { - //切换到有子弹的武器 - var index = Master.WeaponPack.FindIndex((we, i) => !we.IsTotalAmmoEmpty()); - if (index != -1) - { - flag = AiAttackState.ExchangeWeapon; - } - else //所有子弹打光 - { - flag = AiAttackState.NoAmmo; - } - } - else if (Reloading) //换弹中 - { - flag = AiAttackState.TriggerReload; - } - else if (IsAmmoEmpty()) //弹夹已经打空 - { - flag = AiAttackState.Reloading; - } - else if (_beLoadedState == 0 || _beLoadedState == -1) //需要上膛 - { - flag = AiAttackState.AttackInterval; - } - else if (_beLoadedState == 1) //上膛中 - { - flag = AiAttackState.AttackInterval; - } - else if (_continuousCount >= 1) //连发中 - { - flag = AiAttackState.Attack; - } - else if (IsAttackIntervalTime()) //开火间隙 - { - flag = AiAttackState.AttackInterval; - } - else - { - var enemy = (Enemy)Master; - if (enemy.GetLockTime() >= Attribute.AiAttackAttr.LockingTime) //正常射击 - { - if (GetDelayedAttackTime() > 0) - { - flag = AiAttackState.Attack; - } - else - { - if (Attribute.ContinuousShoot) //连发 - { - flag = AiAttackState.Attack; - } - else //单发 - { - flag = AiAttackState.Attack; - } - } - } - else //锁定时间没到 - { - flag = AiAttackState.LockingTime; - } - } - - return flag; - } - - /// /// Ai调用, 触发扣动扳机, 并返回攻击状态 /// - public AiAttackState AiTriggerAttackState() + public AiAttackEnum AiTriggerAttackState() { - AiAttackState flag; + AiAttackEnum flag; if (IsTotalAmmoEmpty()) //当前武器弹药打空 { //切换到有子弹的武器 var index = Master.WeaponPack.FindIndex((we, i) => !we.IsTotalAmmoEmpty()); if (index != -1) { - flag = AiAttackState.ExchangeWeapon; + flag = AiAttackEnum.ExchangeWeapon; Master.WeaponPack.ExchangeByIndex(index); } else //所有子弹打光 { - flag = AiAttackState.NoAmmo; + flag = AiAttackEnum.NoAmmo; } } else if (Reloading) //换弹中 { - flag = AiAttackState.TriggerReload; + flag = AiAttackEnum.TriggerReload; } else if (IsAmmoEmpty()) //弹夹已经打空 { - flag = AiAttackState.Reloading; + flag = AiAttackEnum.Reloading; Reload(); } else if (_beLoadedState == 0 || _beLoadedState == -1) //需要上膛 { - flag = AiAttackState.AttackInterval; + flag = AiAttackEnum.AttackInterval; if (_attackTimer <= 0) { - Master.Attack(); + BeLoaded(); } } else if (_beLoadedState == 1) //上膛中 { - flag = AiAttackState.AttackInterval; + flag = AiAttackEnum.AttackInterval; } else if (_continuousCount >= 1) //连发中 { - flag = AiAttackState.Attack; + flag = AiAttackEnum.Attack; } else if (IsAttackIntervalTime()) //开火间隙 { - flag = AiAttackState.AttackInterval; + flag = AiAttackEnum.AttackInterval; } else { var enemy = (Enemy)Master; - if (enemy.GetLockTime() >= Attribute.AiAttackAttr.LockingTime) //正常射击 + if (enemy.LockTargetTime >= Attribute.AiAttackAttr.LockingTime) //正常射击 { if (GetDelayedAttackTime() > 0) { - flag = AiAttackState.Attack; + flag = AiAttackEnum.Attack; enemy.Attack(); if (_attackFlag) { - enemy.SetLockTargetTime(0); + enemy.LockingTime = 0; } } else { if (Attribute.ContinuousShoot) //连发 { - flag = AiAttackState.Attack; + flag = AiAttackEnum.Attack; enemy.Attack(); if (_attackFlag) { - enemy.SetLockTargetTime(0); + enemy.LockingTime = 0; } } else //单发 { - flag = AiAttackState.Attack; + flag = AiAttackEnum.Attack; enemy.Attack(); if (_attackFlag) { - enemy.SetLockTargetTime(0); + enemy.LockingTime = 0; } } } } else //锁定时间没到 { - flag = AiAttackState.LockingTime; + flag = AiAttackEnum.LockingTime; } } return flag; } - /// - /// 获取Ai锁定目标的剩余时间 - /// - /// - public float GetAiLockRemainderTime() - { - return Attribute.AiAttackAttr.LockingTime - ((Enemy)Master).GetLockTime(); - } - // /// // /// 获取 Ai 对于该武器的评分, 评分越高, 代表 Ai 会越优先选择该武器, 如果为 -1, 则表示 Ai 不会使用该武器 // /// diff --git a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs index 92a4cfe..a5fb906 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs @@ -17,19 +17,20 @@ //创建开火特效 if (!string.IsNullOrEmpty(Attribute.FireEffect)) { - var packedScene = ResourceManager.Load(Attribute.FireEffect); - var sprite = packedScene.Instantiate(); + var effect = ObjectManager.GetPoolItem(Attribute.FireEffect); + var sprite = (Node2D)effect; // sprite.GlobalPosition = FirePoint.GlobalPosition; // sprite.GlobalRotation = FirePoint.GlobalRotation; // sprite.AddToActivityRoot(RoomLayerEnum.YSortLayer); sprite.Position = GetLocalFirePosition(); AddChild(sprite); + effect.PlayEffect(); } } protected override void OnShoot(float fireRotation) { - ShootBullet(fireRotation, Attribute.Bullet); + FireManager.ShootBullet(this, fireRotation, Attribute.Bullet); } // //测试用, 敌人被消灭时触发手上武器开火 diff --git a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs index a8c3dff..4cc5b3c 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/knife/Knife.cs @@ -84,7 +84,7 @@ //播放挥刀特效 SpecialEffectManager.Play( Master, - ResourcePath.resource_spriteFrames_effect_KnifeHit1_tres, "default", + ResourcePath.resource_sprite_weapon_weapon0004_KnifeHit1_png, "default", Master.MountPoint.Position, Master.MountPoint.Rotation + Mathf.DegToRad(Attribute.UpliftAngle + 60), AnimatedSprite.Scale, @@ -130,32 +130,47 @@ if (activityObject is Role role) //碰到角色 { var damage = Utils.Random.RandomConfigRange(Attribute.Bullet.HarmRange); - damage = Master.RoleState.CallCalcDamageEvent(damage); - //击退 - if (role is not Player) //目标不是玩家才会触发击退 + //计算子弹造成的伤害 + if (TriggerRole != null) { - var attr = Master.IsAi ? AiUseAttribute : PlayerUseAttribute; - var repel = Utils.Random.RandomConfigRange(attr.Bullet.RepelRnage); - if (repel != 0) + 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); + } + if (repel != 0) + { + Vector2 position; + if (TriggerRole != null) { - var position = role.GlobalPosition - Master.MountPoint.GlobalPosition; - var v2 = position.Normalized() * repel; - role.MoveController.AddForce(v2); + position = role.GlobalPosition - TriggerRole.MountPoint.GlobalPosition; } + else + { + position = role.GlobalPosition - GlobalPosition; + } + var v2 = position.Normalized() * repel; + role.AddRepelForce(v2); } //造成伤害 - role.CallDeferred(nameof(Role.Hurt), damage, (role.GetCenterPosition() - GlobalPosition).Angle()); + role.CallDeferred(nameof(Role.Hurt), TriggerRole, damage, (role.GetCenterPosition() - GlobalPosition).Angle()); } else if (activityObject is Bullet bullet) //攻击子弹 { var attackLayer = bullet.AttackLayer; - if (Master.CollisionWithMask(attackLayer)) //是攻击玩家的子弹 + if (TriggerRole != null && TriggerRole.CollisionWithMask(attackLayer)) //是攻击玩家的子弹 { - bullet.PlayDisappearEffect(); - bullet.BasisVelocity = bullet.BasisVelocity.Rotated(Mathf.Pi); + //反弹子弹 + bullet.OnPlayDisappearEffect(); + bullet.MoveController.ScaleAllVelocity(-1); bullet.Rotation += Mathf.Pi; - bullet.AttackLayer = Master.AttackLayer; + bullet.AttackLayer = TriggerRole.AttackLayer; } } } diff --git a/DungeonShooting_Godot/src/game/camera/GameCamera.cs b/DungeonShooting_Godot/src/game/camera/GameCamera.cs index 27827a8..1c0ea3b 100644 --- a/DungeonShooting_Godot/src/game/camera/GameCamera.cs +++ b/DungeonShooting_Godot/src/game/camera/GameCamera.cs @@ -20,23 +20,22 @@ DataDelta = dataDelta; } } - + /// /// 当前场景的相机对象 /// public static GameCamera Main { get; private set; } /// - /// 相机坐标更新完成事件 + /// 相机坐标更新完成事件, 参数为 delta /// public event Action OnPositionUpdateEvent; /// /// 恢复系数 /// - [Export] - public float RecoveryCoefficient = 25f; - + [Export] public float RecoveryCoefficient = 25f; + /// /// 抖动开关 /// @@ -46,14 +45,17 @@ /// 镜头跟随鼠标进度 (0 - 1) /// public float FollowsMouseAmount = 0.15f; - + /// /// 相机跟随目标 /// private Role _followTarget; - - // 3.5 - //public Vector2 SubPixelPosition { get; private set; } + + /// + /// SubViewportContainer 中的像素偏移, 因为游戏开启了完美像素, SubViewport 节点下的相机运动会造成非常大的抖动, + /// 为了解决这个问题, 在 SubViewport 父节点中对 SubViewport 进行整体偏移, 以抵消相机造成的巨大抖动 + /// + public Vector2 PixelOffset { get; private set; } private long _index = 0; @@ -64,6 +66,8 @@ private Vector2 _camPos; private Vector2 _shakeOffset = Vector2.Zero; + + public ShaderMaterial _offsetShader; public GameCamera() { @@ -72,6 +76,7 @@ public override void _Ready() { + _offsetShader = (ShaderMaterial)GameApplication.Instance.SubViewportContainer.Material; _camPos = GlobalPosition; } @@ -81,36 +86,28 @@ var newDelta = (float)delta; _Shake(newDelta); - // 3.5 写法 - // var player = GameApplication.Instance.RoomManager.Player; - // var viewportContainer = GameApplication.Instance.SubViewportContainer; - // var camPos = player.GlobalPosition; - // _camPos = _camPos.Lerp(camPos, Mathf.Min(6 * newDelta, 1)) + _shakeOffset; - // SubPixelPosition = _camPos.Round() - _camPos; - // (viewportContainer.Material as ShaderMaterial)?.SetShaderParameter("offset", SubPixelPosition); - // GlobalPosition = _camPos.Round(); - - var world = GameApplication.Instance.World; if (world != null && !world.Pause && _followTarget != null) { var mousePosition = InputManager.CursorPosition; var targetPosition = _followTarget.GlobalPosition; - //if (targetPosition.DistanceSquaredTo(mousePosition) >= 39999.992F) // >= (60 / 0.3f) * (60 / 0.3f) if (targetPosition.DistanceSquaredTo(mousePosition) >= (60 / FollowsMouseAmount) * (60 / FollowsMouseAmount)) { _camPos = targetPosition.MoveToward(mousePosition, 60); } else { - //targetPos = targetPosition.Lerp(mousePosition, 0.3f); //这里的0.3就是上面的 (60 / 0.3f) * (60 / 0.3f) 中的 0.3 _camPos = targetPosition.Lerp(mousePosition, FollowsMouseAmount); } - //_camPos = _camPos.Lerp(targetPos, 20 * newDelta); - GlobalPosition = _camPos.Round(); + var cameraPosition = _camPos; + var roundPos = cameraPosition.Round(); + PixelOffset = roundPos - cameraPosition; + _offsetShader.SetShaderParameter("offset", PixelOffset); + GlobalPosition = roundPos; + Offset = _shakeOffset.Round(); - + //调用相机更新事件 if (OnPositionUpdateEvent != null) { @@ -200,9 +197,10 @@ { 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 + (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); diff --git a/DungeonShooting_Godot/src/game/data/BulletData.cs b/DungeonShooting_Godot/src/game/data/BulletData.cs index e15913f..a53fc26 100644 --- a/DungeonShooting_Godot/src/game/data/BulletData.cs +++ b/DungeonShooting_Godot/src/game/data/BulletData.cs @@ -5,10 +5,10 @@ /// /// 子弹数据 /// -public class BulletData +public class BulletData : IClone { /// - /// 发射该子弹的武器 + /// 发射该子弹的武器, 可能为null /// public Weapon Weapon; @@ -18,19 +18,19 @@ public ExcelConfig.BulletBase BulletBase; /// - /// 发射该子弹的角色 + /// 发射该子弹的角色, 可能为null /// public Role TriggerRole; /// - /// 最小伤害 + /// 造成的伤害 /// - public int MinHarm; - + public int Harm; + /// - /// 最大伤害 + /// 击退值 /// - public int MaxHarm; + public float Repel; /// /// 最大飞行距离 @@ -43,6 +43,11 @@ public float FlySpeed; /// + /// 初始离地高度 + /// + public float Altitude; + + /// /// 纵轴速度 /// public float VerticalSpeed; @@ -53,6 +58,11 @@ public int BounceCount; /// + /// 子弹最大穿透次数 + /// + public int Penetration; + + /// /// 子弹最大存在时间 /// public float LifeTime; @@ -66,4 +76,25 @@ /// 旋转角度 /// public float Rotation; + + public BulletData Clone() + { + return new BulletData + { + Weapon = Weapon, + BulletBase = BulletBase, + TriggerRole = TriggerRole, + Harm = Harm, + Repel = Repel, + MaxDistance = MaxDistance, + FlySpeed = FlySpeed, + Altitude = Altitude, + VerticalSpeed = VerticalSpeed, + BounceCount = BounceCount, + Penetration = Penetration, + LifeTime = LifeTime, + Position = Position, + Rotation = Rotation + }; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/DragBinder.cs b/DungeonShooting_Godot/src/game/data/DragBinder.cs new file mode 100644 index 0000000..4622dea --- /dev/null +++ b/DungeonShooting_Godot/src/game/data/DragBinder.cs @@ -0,0 +1,30 @@ + +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/effects/AutoDestroyParticles.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs index e7aba73..c05b1c4 100644 --- a/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs +++ b/DungeonShooting_Godot/src/game/effects/AutoDestroyParticles.cs @@ -1,22 +1,89 @@  using Godot; +using Godot.Collections; /// /// 到期自动销毁的粒子特效 /// -public partial class AutoDestroyParticles : GpuParticles2D +public partial class AutoDestroyParticles : GpuParticles2D, IEffect { /// /// 延时销毁时间 /// [Export] - public float DelayTime { get; set; } = 1f; + public float DelayTime { get; set; } = 2f; - public override async void _Ready() + /// + /// 子节点包含的例子特效, 在创建完成后自动播放 + /// + [Export] + public Array Particles2D { get; set; } + + public bool IsDestroyed { get; private set; } + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + + private double _timer; + private bool _isPlay; + + public virtual void PlayEffect() { Emitting = true; - var sceneTreeTimer = GetTree().CreateTimer(DelayTime); - await ToSignal(sceneTreeTimer, Timer.SignalName.Timeout); + Restart(); + if (Particles2D != null) + { + foreach (var gpuParticles2D in Particles2D) + { + gpuParticles2D.Emitting = true; + Restart(); + } + } + _timer = 0; + _isPlay = true; + } + + public override void _Process(double delta) + { + if (!_isPlay) + { + return; + } + _timer += delta; + if (_timer >= DelayTime) + { + Emitting = false; + if (Particles2D != null) + { + foreach (var gpuParticles2D in Particles2D) + { + gpuParticles2D.Emitting = false; + } + } + _isPlay = false; + ObjectPool.Reclaim(this); + } + } + + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; QueueFree(); } + + + public void OnReclaim() + { + GetParent().RemoveChild(this); + } + + public void OnLeavePool() + { + + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs index a24db0c..7dd66e6 100644 --- a/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs +++ b/DungeonShooting_Godot/src/game/effects/AutoDestroySprite.cs @@ -4,23 +4,35 @@ /// /// 到期自动销毁的帧动画 /// -public partial class AutoDestroySprite : AnimatedSprite2D +public partial class AutoDestroySprite : AnimatedSprite2D, IEffect { /// + /// 播放的动画名称 + /// + [Export] + public string AnimationName { get; set; } = "default"; + + /// /// 延时销毁时间 /// [Export] - public float DelayTime { get; set; } = 1f; - + public float DelayTime { get; set; } = 2f; + /// /// 子节点包含的例子特效, 在创建完成后自动播放 /// [Export] public Array Particles2D { get; set; } - public override async void _Ready() + public bool IsDestroyed { get; private set; } + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + + private double _timer; + private bool _isPlay; + + public virtual void PlayEffect() { - var sceneTreeTimer = GetTree().CreateTimer(DelayTime); if (Particles2D != null) { foreach (var gpuParticles2D in Particles2D) @@ -28,7 +40,51 @@ gpuParticles2D.Emitting = true; } } - await ToSignal(sceneTreeTimer, Timer.SignalName.Timeout); + _timer = 0; + _isPlay = true; + Play(AnimationName); + } + + public override void _Process(double delta) + { + if (!_isPlay) + { + return; + } + _timer += delta; + if (_timer >= DelayTime) + { + if (Particles2D != null) + { + foreach (var gpuParticles2D in Particles2D) + { + gpuParticles2D.Emitting = false; + } + } + _isPlay = false; + ObjectPool.Reclaim(this); + } + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; QueueFree(); } + + + public void OnReclaim() + { + GetParent().RemoveChild(this); + } + + public void OnLeavePool() + { + + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/Blood.cs b/DungeonShooting_Godot/src/game/effects/Blood.cs index 51c9832..ff21809 100644 --- a/DungeonShooting_Godot/src/game/effects/Blood.cs +++ b/DungeonShooting_Godot/src/game/effects/Blood.cs @@ -1,7 +1,7 @@ using Godot; /// -/// 血液溅射效果 +/// 血液溅射效果, 暂未用到 /// public partial class Blood : CpuParticles2D { diff --git a/DungeonShooting_Godot/src/game/effects/Effect1.cs b/DungeonShooting_Godot/src/game/effects/Effect1.cs deleted file mode 100644 index 485bd80..0000000 --- a/DungeonShooting_Godot/src/game/effects/Effect1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Godot; - -public partial class Effect1 : AutoDestroyParticles -{ - public override void _Ready() - { - var c = GetNode("GPUParticles2D"); - c.Amount = Utils.Random.RandomRangeInt(2, 6); - c.Emitting = true; - - base._Ready(); - } - -} diff --git a/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs b/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs deleted file mode 100644 index d96d1c2..0000000 --- a/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs +++ /dev/null @@ -1,48 +0,0 @@ - -using System.Collections; -using Godot; - -/// -/// 敌人死亡碎片 -/// -[Tool] -public partial class EnemyDebris : ActivityObject -{ - - private GpuParticles2D _gpuParticles2D; - private bool _playOver = false; - - public override void OnInit() - { - 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()); - } - - protected override void Process(float delta) - { - if (_playOver && !IsThrowing && Altitude <= 0 && MoveController.IsMotionless()) - { - MoveController.SetAllVelocity(Vector2.Zero); - Freeze(); - } - } - - public IEnumerator EmitParticles() - { - var gpuParticles2D = GetNode("GPUParticles2D"); - gpuParticles2D.Emitting = true; - yield return new WaitForSeconds(Utils.Random.RandomRangeFloat(1f, 2.5f)); - gpuParticles2D.Emitting = false; - yield return new WaitForSeconds(1); - _playOver = true; - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/IEffect.cs b/DungeonShooting_Godot/src/game/effects/IEffect.cs new file mode 100644 index 0000000..2c0e231 --- /dev/null +++ b/DungeonShooting_Godot/src/game/effects/IEffect.cs @@ -0,0 +1,11 @@ + +/// +/// 特效接口 +/// +public interface IEffect : IPoolItem +{ + /// + /// 播放特效 + /// + void PlayEffect(); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/SmearingSprite.cs b/DungeonShooting_Godot/src/game/effects/SmearingSprite.cs new file mode 100644 index 0000000..1e2fa24 --- /dev/null +++ b/DungeonShooting_Godot/src/game/effects/SmearingSprite.cs @@ -0,0 +1,70 @@ + +using Godot; + +/// +/// 拖影精灵 +/// +public partial class SmearingSprite : Sprite2D, IPoolItem +{ + public bool IsRecycled { get; set; } + public string Logotype { get; set; } + public bool IsDestroyed { get; set; } + + private double _timeOut = -1; + private double _totalTime = 0; + + /// + /// 从 ActivityObject 的 AnimatedSprite 中复制动画帧 + /// + public void FromActivityObject(ActivityObject activityObject) + { + var currentTexture = activityObject.GetCurrentTexture(); + Texture = currentTexture; + Offset = activityObject.AnimatedSprite.Offset; + GlobalPosition = activityObject.AnimatedSprite.GlobalPosition; + GlobalScale = activityObject.AnimatedSprite.GlobalScale; + GlobalRotation = activityObject.AnimatedSprite.GlobalRotation; + } + + /// + /// 设置显示的时间, 过期会自动回收 + /// + public void SetShowTimeout(float time) + { + _totalTime = time; + _timeOut = time; + } + + public override void _Process(double delta) + { + if (_timeOut > 0) + { + _timeOut -= delta; + Modulate = new Color(1, 1, 1, (float)(_timeOut / _totalTime)); + if (_timeOut <= 0) + { + ObjectPool.Reclaim(this); + } + } + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + QueueFree(); + } + public void OnReclaim() + { + GetParent().RemoveChild(this); + } + + public void OnLeavePool() + { + Modulate = Colors.White; + } +} \ 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 new file mode 100644 index 0000000..ff7ca48 --- /dev/null +++ b/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0001.cs @@ -0,0 +1,62 @@ + +using System.Collections; +using Godot; + +/// +/// 敌人死亡碎片 +/// +[Tool] +public partial class EnemyDead0001 : ActivityObject +{ + /// + /// 上一帧笔刷坐标 + /// + public Vector2I? PrevPosition = null; + private BrushImageData _brushData; + + private GpuParticles2D _gpuParticles2D; + private bool _playOver = false; + private bool _runBrush = true; + + public override void OnInit() + { + 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"); + } + + protected override void Process(float delta) + { + if (_playOver && !IsThrowing && Altitude <= 0 && MoveController.IsMotionless()) + { + MoveController.SetAllVelocity(Vector2.Zero); + Freeze(); + _runBrush = false; + } + else if (_runBrush && AffiliationArea != null && Altitude <= 1f) //测试笔刷 + { + var pos = AffiliationArea.RoomInfo.LiquidCanvas.ToLiquidCanvasPosition(Position); + AffiliationArea.RoomInfo.LiquidCanvas.DrawBrush(_brushData, PrevPosition, pos, 0); + PrevPosition = pos; + } + } + + public IEnumerator EmitParticles() + { + var gpuParticles2D = GetNode("GPUParticles2D"); + gpuParticles2D.Emitting = true; + yield return new WaitForSeconds(Utils.Random.RandomRangeFloat(1f, 2.5f)); + gpuParticles2D.Emitting = false; + yield return new WaitForSeconds(1); + _playOver = true; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0002.cs b/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0002.cs new file mode 100644 index 0000000..c498165 --- /dev/null +++ b/DungeonShooting_Godot/src/game/effects/enemy/EnemyDead0002.cs @@ -0,0 +1,29 @@ + +using Godot; + +[Tool] +public partial class EnemyDead0002 : AutoFreezeObject +{ + private BrushImageData _brushData; + + public override void OnInit() + { + base.OnInit(); + _brushData = LiquidBrushManager.GetBrush("0002"); + } + + protected override void Process(float delta) + { + base.Process(delta); + + //测试笔刷 + if (FreezeCount == 0) + { + DrawLiquid(_brushData); + } + else + { + BrushPrevPosition = null; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/event/EventEnum.cs b/DungeonShooting_Godot/src/game/event/EventEnum.cs index 632b0cb..e4e6e99 100644 --- a/DungeonShooting_Godot/src/game/event/EventEnum.cs +++ b/DungeonShooting_Godot/src/game/event/EventEnum.cs @@ -7,7 +7,7 @@ public enum EventEnum { /// - /// 敌人死亡, 参数为死亡的敌人的实例, 参数类型为 + /// 敌人死亡, 参数为死亡的敌人的实例, 参数类型为 /// OnEnemyDie, /// @@ -19,6 +19,14 @@ /// OnPlayerFirstEnterRoom, /// + /// 玩家进入过道时调用, 参数类型为进入该过道的门 + /// + OnPlayerEnterAisle, + /// + /// 玩家首次进入过道时调用, 参数类型为进入该过道的门 + /// + OnPlayerFirstEnterAisle, + /// /// 玩家可互动对象改变, 参数类型为 /// OnPlayerChangeInteractiveItem, diff --git a/DungeonShooting_Godot/src/game/manager/DragUiManager.cs b/DungeonShooting_Godot/src/game/manager/DragUiManager.cs new file mode 100644 index 0000000..e6f25ec --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/DragUiManager.cs @@ -0,0 +1,85 @@ +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/FireManager.cs b/DungeonShooting_Godot/src/game/manager/FireManager.cs new file mode 100644 index 0000000..65e7fa8 --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/FireManager.cs @@ -0,0 +1,295 @@ + +using Config; +using Godot; + +public static class FireManager +{ + + /// + /// 投抛弹壳的默认实现方式, shellId为弹壳id + /// + public static ActivityObject ThrowShell(Weapon weapon, ExcelConfig.ActivityBase shell, float speedScale = 1) + { + var startPos = weapon.ShellPoint.GlobalPosition; + float startHeight; + var master = weapon.Master; + if (master != null) + { + var shellPosition = master.MountPoint.Position + weapon.ShellPoint.Position; + startHeight = -shellPosition.Y; + startPos.Y += startHeight; + } + else + { + startHeight = weapon.Altitude; + } + + var direction = weapon.GlobalRotationDegrees + Utils.Random.RandomRangeInt(-30, 30) + 180; + var verticalSpeed = Utils.Random.RandomRangeInt((int)(60 * speedScale), (int)(120 * speedScale)); + var velocity = new Vector2(Utils.Random.RandomRangeInt((int)(20 * speedScale), (int)(60 * speedScale)), 0).Rotated(direction * Mathf.Pi / 180); + var rotate = Utils.Random.RandomRangeInt((int)(-720 * speedScale), (int)(720 * speedScale)); + var shellInstance = ActivityObject.Create(shell); + shellInstance.Rotation = (master != null ? master.MountPoint.RealRotation : weapon.Rotation); + shellInstance.Throw(startPos, startHeight, verticalSpeed, velocity, rotate); + shellInstance.InheritVelocity(master != null ? master : weapon); + if (master == null) + { + weapon.AffiliationArea.InsertItem(shellInstance); + } + else + { + master.AffiliationArea.InsertItem(shellInstance); + } + + return shellInstance; + } + + /// + /// 根据武器创建 BulletData + /// + public static BulletData GetBulletData(Weapon weapon, float fireRotation, ExcelConfig.BulletBase bullet) + { + if (bullet.Type == 1) //实体子弹 + { + return CreateSolidBulletData(weapon, fireRotation, bullet); + } + else if (bullet.Type == 2) //激光子弹 + { + return CreateLaserData(weapon, fireRotation, bullet); + } + else + { + Debug.LogError("暂未支持的子弹类型: " + bullet.Type); + } + + return null; + } + + /// + /// 根据角色创建 BulletData + /// + public static BulletData GetBulletData(Role trigger, float fireRotation, ExcelConfig.BulletBase bullet) + { + if (bullet.Type == 1) //实体子弹 + { + return CreateSolidBulletData(trigger, fireRotation, bullet); + } + + return null; + } + + /// + /// 计算进行抛物线运动的子弹击中目标所需要的速度等数据, 并设置 + /// + public static void SetParabolaTarget(BulletData bulletData, Vector2 targetPosition) + { + var distance = bulletData.Position.DistanceTo(targetPosition); + var height = bulletData.Altitude; + var time = distance / bulletData.FlySpeed; + bulletData.VerticalSpeed = -(height - 0.5f * GameConfig.G * time * time) / time; + bulletData.Rotation = bulletData.Position.AngleToPoint(targetPosition); + } + + /// + /// 通过武器发射子弹 + /// + public static IBullet ShootBullet(Weapon weapon, float fireRotation, ExcelConfig.BulletBase bullet) + { + if (bullet.Type == 1) //实体子弹 + { + return ShootSolidBullet(CreateSolidBulletData(weapon, fireRotation, bullet), weapon.GetAttackLayer()); + } + else if (bullet.Type == 2) //激光子弹 + { + return ShootLaser(CreateLaserData(weapon, fireRotation, bullet), weapon.GetAttackLayer()); + } + else + { + Debug.LogError("暂未支持的子弹类型: " + bullet.Type); + } + + return null; + } + + /// + /// 通 Role 对象直接发射子弹 + /// + public static IBullet ShootBullet(Role trigger, float fireRotation, ExcelConfig.BulletBase bullet) + { + if (bullet.Type == 1) //实体子弹 + { + return ShootSolidBullet(CreateSolidBulletData(trigger, fireRotation, bullet), trigger.AttackLayer); + } + + return null; + } + + /// + /// 通过 BulletData 直接发射子弹 + /// + public static IBullet ShootBullet(BulletData bulletData, uint attackLayer) + { + if (bulletData.BulletBase.Type == 1) //实体子弹 + { + return ShootSolidBullet(bulletData, attackLayer); + } + else if (bulletData.BulletBase.Type == 2) //激光子弹 + { + return ShootLaser(bulletData, attackLayer); + } + else + { + Debug.LogError("暂未支持的子弹类型: " + bulletData.BulletBase.Type); + } + + return null; + } + + /// + /// 发射子弹的默认实现方式 + /// + private static Bullet ShootSolidBullet(BulletData bulletData, uint attackLayer) + { + //创建子弹 + var bulletInstance = ObjectManager.GetBullet(bulletData.BulletBase.Prefab); + bulletInstance.InitData(bulletData, attackLayer); + return bulletInstance; + } + + /// + /// 发射射线的默认实现方式 + /// + private static Laser ShootLaser(BulletData bulletData, uint attackLayer) + { + //创建激光 + var laser = ObjectManager.GetLaser(bulletData.BulletBase.Prefab); + laser.AddToActivityRoot(RoomLayerEnum.YSortLayer); + laser.InitData(bulletData, attackLayer, Laser.LaserDefaultWidth); + return laser; + } + + //----------------------------------------------------------------------------------- + + private static BulletData CreateSolidBulletData(Weapon weapon, float fireRotation, ExcelConfig.BulletBase bullet) + { + var data = new BulletData() + { + Weapon = weapon, + BulletBase = bullet, + TriggerRole = weapon.TriggerRole, + Harm = Utils.Random.RandomConfigRange(bullet.HarmRange), + Repel = Utils.Random.RandomConfigRange(bullet.RepelRange), + MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), + FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), + VerticalSpeed = Utils.Random.RandomConfigRange(bullet.VerticalSpeed), + BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), + Penetration = Utils.Random.RandomConfigRange(bullet.Penetration), + Position = weapon.FirePoint.GlobalPosition, + }; + + var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); + if (weapon.TriggerRole != null) + { + data.Altitude = weapon.TriggerRole.GetFirePointAltitude(); + var roleState = weapon.TriggerRole.RoleState; + data.Harm = roleState.CalcDamage(data.Harm); + data.Repel = roleState.CalcBulletRepel(data.Repel); + data.FlySpeed = roleState.CalcBulletSpeed(data.FlySpeed); + data.MaxDistance = roleState.CalcBulletDistance(data.MaxDistance); + data.BounceCount = roleState.CalcBulletBounceCount(data.BounceCount); + data.Penetration = roleState.CalcBulletPenetration(data.Penetration); + deviationAngle = roleState.CalcBulletDeviationAngle(deviationAngle); + + if (weapon.TriggerRole.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 + { + data.FlySpeed *= weapon.AiUseAttribute.AiAttackAttr.BulletSpeedScale; + } + } + else + { + data.Altitude = 1; + } + + data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); + return data; + } + + private static BulletData CreateSolidBulletData(Role role, float fireRotation, ExcelConfig.BulletBase bullet) + { + var data = new BulletData() + { + Weapon = null, + BulletBase = bullet, + TriggerRole = role, + Harm = Utils.Random.RandomConfigRange(bullet.HarmRange), + Repel = Utils.Random.RandomConfigRange(bullet.RepelRange), + MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), + FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), + VerticalSpeed = Utils.Random.RandomConfigRange(bullet.VerticalSpeed), + BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), + Penetration = Utils.Random.RandomConfigRange(bullet.Penetration), + }; + + if (role is Enemy enemy) + { + data.Position = enemy.FirePoint.GlobalPosition; + } + else + { + data.Position = role.MountPoint.GlobalPosition; + } + + var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); + data.Altitude = role.GetFirePointAltitude(); + var roleState = role.RoleState; + data.Harm = roleState.CalcDamage(data.Harm); + data.Repel = roleState.CalcBulletRepel(data.Repel); + data.FlySpeed = roleState.CalcBulletSpeed(data.FlySpeed); + data.MaxDistance = roleState.CalcBulletDistance(data.MaxDistance); + data.BounceCount = roleState.CalcBulletBounceCount(data.BounceCount); + data.Penetration = roleState.CalcBulletPenetration(data.Penetration); + deviationAngle = roleState.CalcBulletDeviationAngle(deviationAngle); + + // if (role.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 + // { + // data.FlySpeed *= weapon.AiUseAttribute.AiAttackAttr.BulletSpeedScale; + // } + + data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); + return data; + } + + private static BulletData CreateLaserData(Weapon weapon, float fireRotation, ExcelConfig.BulletBase bullet) + { + var data = new BulletData() + { + Weapon = weapon, + BulletBase = bullet, + TriggerRole = weapon.TriggerRole, + Harm = Utils.Random.RandomConfigRange(bullet.HarmRange), + Repel = Utils.Random.RandomConfigRange(bullet.RepelRange), + MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), + BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), + LifeTime = Utils.Random.RandomConfigRange(bullet.LifeTimeRange), + Position = weapon.FirePoint.GlobalPosition, + }; + + var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); + if (weapon.TriggerRole != null) + { + data.Altitude = weapon.TriggerRole.GetFirePointAltitude(); + var roleState = weapon.TriggerRole.RoleState; + data.Harm = roleState.CalcDamage(data.Harm); + data.Repel = roleState.CalcBulletRepel(data.Repel); + data.BounceCount = roleState.CalcBulletBounceCount(data.BounceCount); + deviationAngle = roleState.CalcBulletDeviationAngle(deviationAngle); + } + else + { + data.Altitude = 1; + } + + data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); + return data; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/InputManager.cs b/DungeonShooting_Godot/src/game/manager/InputManager.cs index 6d92161..5442ed0 100644 --- a/DungeonShooting_Godot/src/game/manager/InputManager.cs +++ b/DungeonShooting_Godot/src/game/manager/InputManager.cs @@ -75,15 +75,24 @@ /// 是否按下打开地图按钮, 键鼠: 键盘Ctrl /// public static bool Map { get; private set; } + + /// + /// 菜单键, 键鼠: esc + /// + public static bool Menu { get; private set; } /// /// 更新输入管理器 /// public static void Update(float delta) { - var application = GameApplication.Instance; MoveAxis = Input.GetVector("move_left", "move_right", "move_up", "move_down"); - CursorPosition = application.GlobalToViewPosition(application.GetGlobalMousePosition()); + var application = GameApplication.Instance; + if (application != null) + { + CursorPosition = application.GlobalToViewPosition(application.GetGlobalMousePosition()); + } + ExchangeWeapon = Input.IsActionJustPressed("exchangeWeapon"); ThrowWeapon = Input.IsActionJustPressed("throwWeapon"); Interactive = Input.IsActionJustPressed("interactive"); @@ -93,5 +102,8 @@ Roll = Input.IsActionJustPressed("roll"); UseActiveProp = Input.IsActionJustPressed("useActiveProp"); RemoveProp = Input.IsActionJustPressed("removeProp"); + ExchangeProp = Input.IsActionJustPressed("exchangeProp"); + Map = Input.IsActionPressed("map"); + Menu = Input.IsActionJustPressed("menu"); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/LiquidBrushManager.cs b/DungeonShooting_Godot/src/game/manager/LiquidBrushManager.cs new file mode 100644 index 0000000..88fb064 --- /dev/null +++ b/DungeonShooting_Godot/src/game/manager/LiquidBrushManager.cs @@ -0,0 +1,33 @@ + +using System.Collections.Generic; +using Config; + +/// +/// 液体笔刷管理类 +/// +public static class LiquidBrushManager +{ + private static Dictionary _dictionary = new Dictionary(); + + /// + /// 根据 id 获取笔刷, 该 id 为 LiquidMaterial 表的 id + /// + public static BrushImageData GetBrush(string id) + { + if (!_dictionary.TryGetValue(id, out var brush)) + { + brush = new BrushImageData(ExcelConfig.LiquidMaterial_Map[id]); + _dictionary.Add(id, brush); + } + + return brush; + } + + /// + /// 清除缓存笔刷数据 + /// + public static void ClearData() + { + _dictionary.Clear(); + } +} \ 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 5338453..27206a3 100644 --- a/DungeonShooting_Godot/src/game/manager/ObjectManager.cs +++ b/DungeonShooting_Godot/src/game/manager/ObjectManager.cs @@ -1,15 +1,77 @@  +using Godot; + public static class ObjectManager { - public static Explode GetExplode(string resPath) + /// + /// 根据资源路径获取实例对象, 该对象必须实现 IPoolItem 接口 + /// + /// 资源路径 + public static IPoolItem GetPoolItem(string resPath) { - var explode = ObjectPool.GetItem(resPath); - if (explode == null) + var item = ObjectPool.GetItem(resPath); + if (item == null) { - explode = ResourceManager.LoadAndInstantiate(resPath); - explode.Logotype = resPath; + item = (IPoolItem)ResourceManager.LoadAndInstantiate(resPath); + item.Logotype = resPath; } - return explode; + return item; + } + + /// + /// 根据资源路径获取实例对象, 该对象必须实现 IPoolItem 接口 + /// + /// 资源路径 + public static T GetPoolItem(string resPath) where T : IPoolItem + { + var item = ObjectPool.GetItem(resPath); + if (item == null) + { + item = (T)(IPoolItem)ResourceManager.LoadAndInstantiate(resPath); + item.Logotype = resPath; + } + + return item; + } + + /// + /// 根据类型直接获取实例对象 + /// + public static T GetPoolItemByClass() where T : IPoolItem, new() + { + var name = typeof(T).FullName; + var item = ObjectPool.GetItem(name); + if (item == null) + { + item = new T(); + item.Logotype = name; + } + + return item; + } + + public static Bullet GetBullet(string id) + { + var bullet = ObjectPool.GetItem(id); + if (bullet == null) + { + bullet = ActivityObject.Create(id); + bullet.Logotype = id; + } + + return bullet; + } + + public static Laser GetLaser(string resPath) + { + var bullet = ObjectPool.GetItem(resPath); + if (bullet == null) + { + bullet = ResourceManager.LoadAndInstantiate(resPath); + bullet.Logotype = resPath; + } + + return bullet; } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/ResourceManager.cs b/DungeonShooting_Godot/src/game/manager/ResourceManager.cs index 6119cda..c4d4962 100644 --- a/DungeonShooting_Godot/src/game/manager/ResourceManager.cs +++ b/DungeonShooting_Godot/src/game/manager/ResourceManager.cs @@ -130,6 +130,17 @@ /// /// 场景路径 /// 是否使用缓存中的资源 + public static Node LoadAndInstantiate(string path, bool useCache = true) + { + var packedScene = Load(path, useCache); + return packedScene.Instantiate(); + } + + /// + /// 加载并且实例化场景, 并返回 + /// + /// 场景路径 + /// 是否使用缓存中的资源 public static T LoadAndInstantiate(string path, bool useCache = true) where T : Node { var packedScene = Load(path, useCache); diff --git a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs index 03b63e2..33f5a53 100644 --- a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs +++ b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs @@ -15,17 +15,21 @@ 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_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_Effect0001_tscn = "res://prefab/effect/enemy/Effect0001.tscn"; - public const string prefab_effect_enemy_EnemyBloodEffect_tscn = "res://prefab/effect/enemy/EnemyBloodEffect.tscn"; - public const string prefab_effect_weapon_BulletDisappear_tscn = "res://prefab/effect/weapon/BulletDisappear.tscn"; - public const string prefab_effect_weapon_BulletSmoke_tscn = "res://prefab/effect/weapon/BulletSmoke.tscn"; - public const string prefab_effect_weapon_FirePart_tscn = "res://prefab/effect/weapon/FirePart.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"; @@ -43,14 +47,20 @@ 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_RoleTemplate_tscn = "res://prefab/role/RoleTemplate.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_test_TestActivity_tscn = "res://prefab/test/TestActivity.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"; @@ -69,6 +79,7 @@ public const string prefab_ui_MapEditorSelectObject_tscn = "res://prefab/ui/MapEditorSelectObject.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"; @@ -86,6 +97,8 @@ 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 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_WeaponBase_json = "res://resource/config/WeaponBase.json"; public const string resource_curve_Curve1_tres = "res://resource/curve/Curve1.tres"; @@ -100,6 +113,14 @@ 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"; @@ -119,11 +140,13 @@ 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_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"; @@ -135,9 +158,11 @@ 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_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"; @@ -148,28 +173,36 @@ 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_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_effects_Circle_png = "res://resource/sprite/effects/Circle.png"; - public const string resource_sprite_effects_Circle2_png = "res://resource/sprite/effects/Circle2.png"; - public const string resource_sprite_effects_debug_arrows_png = "res://resource/sprite/effects/debug_arrows.png"; - public const string resource_sprite_effects_Explosion_png = "res://resource/sprite/effects/Explosion.png"; - public const string resource_sprite_effects_common_Effect1_png = "res://resource/sprite/effects/common/Effect1.png"; - public const string resource_sprite_effects_common_Smoke_png = "res://resource/sprite/effects/common/Smoke.png"; - public const string resource_sprite_effects_common_Smoke2_png = "res://resource/sprite/effects/common/Smoke2.png"; - public const string resource_sprite_effects_explode_Explode_circle0001_png = "res://resource/sprite/effects/explode/Explode_circle0001.png"; - public const string resource_sprite_effects_explode_Explode_line0001_png = "res://resource/sprite/effects/explode/Explode_line0001.png"; - public const string resource_sprite_effects_explode_Explode_pit0001_png = "res://resource/sprite/effects/explode/Explode_pit0001.png"; - public const string resource_sprite_effects_weapon_Collision1_png = "res://resource/sprite/effects/weapon/Collision1.png"; - public const string resource_sprite_effects_weapon_KnifeHit1_png = "res://resource/sprite/effects/weapon/KnifeHit1.png"; - public const string resource_sprite_effects_weapon_MeleeAttack1_png = "res://resource/sprite/effects/weapon/MeleeAttack1.png"; - public const string resource_sprite_effects_weapon_ShotFire_png = "res://resource/sprite/effects/weapon/ShotFire.png"; - public const string resource_sprite_effects_weapon_ShotFire2_png = "res://resource/sprite/effects/weapon/ShotFire2.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"; @@ -189,6 +222,10 @@ 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"; @@ -197,10 +234,20 @@ 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"; @@ -209,15 +256,17 @@ 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_Sprite0002_png = "res://resource/sprite/role/role0001/roll/Sprite-0002.png"; - public const string resource_sprite_role_role0001_roll_Sprite0003_png = "res://resource/sprite/role/role0001/roll/Sprite-0003.png"; - public const string resource_sprite_role_role0001_roll_Sprite0004_png = "res://resource/sprite/role/role0001/roll/Sprite-0004.png"; - public const string resource_sprite_role_role0001_roll_Sprite0005_png = "res://resource/sprite/role/role0001/roll/Sprite-0005.png"; - public const string resource_sprite_role_role0001_roll_Sprite0006_png = "res://resource/sprite/role/role0001/roll/Sprite-0006.png"; - public const string resource_sprite_role_role0001_roll_Sprite0007_png = "res://resource/sprite/role/role0001/roll/Sprite-0007.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"; @@ -228,11 +277,15 @@ 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_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"; @@ -252,15 +305,16 @@ 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_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_mapEditor_ErrorCell_png = "res://resource/sprite/ui/mapEditor/ErrorCell.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"; @@ -270,7 +324,6 @@ 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_MapBar_png = "res://resource/sprite/ui/roomUI/MapBar.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"; @@ -289,22 +342,26 @@ 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_knife1_png = "res://resource/sprite/weapon/knife1.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_effect_KnifeHit1_tres = "res://resource/spriteFrames/effect/KnifeHit1.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"; @@ -323,15 +380,23 @@ 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_Role1001_tres = "res://resource/spriteFrames/role/Role1001.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"; @@ -344,11 +409,15 @@ 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"; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs index f6a415b..f08c798 100644 --- a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs +++ b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs @@ -24,6 +24,7 @@ public const string MapEditorSelectObject = "MapEditorSelectObject"; 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"; @@ -894,6 +895,54 @@ } /// + /// 创建 RoomMap, 并返回UI实例, 该函数不会打开 Ui + /// + public static UI.RoomMap.RoomMapPanel Create_RoomMap() + { + return CreateUi(UiName.RoomMap); + } + + /// + /// 打开 RoomMap, 并返回UI实例 + /// + public static UI.RoomMap.RoomMapPanel Open_RoomMap() + { + return OpenUi(UiName.RoomMap); + } + + /// + /// 隐藏 RoomMap 的所有实例 + /// + public static void Hide_RoomMap() + { + var uiInstance = Get_RoomMap_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.HideUi(); + } + } + + /// + /// 销毁 RoomMap 的所有实例 + /// + public static void Destroy_RoomMap() + { + var uiInstance = Get_RoomMap_Instance(); + foreach (var uiPanel in uiInstance) + { + uiPanel.Destroy(); + } + } + + /// + /// 获取所有 RoomMap 的实例, 如果没有实例, 则返回一个空数组 + /// + public static UI.RoomMap.RoomMapPanel[] Get_RoomMap_Instance() + { + return GetUiInstance(nameof(UI.RoomMap.RoomMap)); + } + + /// /// 创建 RoomUI, 并返回UI实例, 该函数不会打开 Ui /// public static UI.RoomUI.RoomUIPanel Create_RoomUI() diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index c83bbf3..9ddf478 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using Godot; /// @@ -163,7 +164,7 @@ } //暂停游戏 - if (Input.IsActionJustPressed("ui_cancel")) + if (InputManager.Menu) { World.Pause = true; //鼠标改为Ui鼠标 @@ -183,9 +184,7 @@ OnCheckEnemy(); } - //更新敌人视野 - UpdateEnemiesView(); - if (GameApplication.Instance.IsDebug) + if (ActivityObject.IsDebug) { QueueRedraw(); } @@ -216,6 +215,9 @@ //生成寻路网格, 这一步操作只生成过道的导航 _dungeonTileMap.GenerateNavigationPolygon(GameConfig.AisleFloorMapLayer); yield return 0; + //将导航网格绑定到 DoorInfo 上 + //BindAisleNavigation(StartRoomInfo, _dungeonTileMap.GetPolygonData()); + //yield return 0; //挂载过道导航区域 _dungeonTileMap.MountNavigationPolygon(World.TileRoot); yield return 0; @@ -246,22 +248,7 @@ player.Name = "Player"; player.PutDown(RoomLayerEnum.YSortLayer); Player.SetCurrentPlayer(player); - yield return 0; - - //玩家手上添加武器 - //player.PickUpWeapon(ActivityObject.Create(ActivityObject.Ids.Id_weapon0001)); - // var weapon = ActivityObject.Create(ActivityObject.Ids.Id_weapon0001); - // weapon.PutDown(player.Position, RoomLayerEnum.NormalLayer); - // var weapon2 = ActivityObject.Create(ActivityObject.Ids.Id_weapon0002); - // weapon2.PutDown(player.Position, RoomLayerEnum.NormalLayer); - // var weapon3 = ActivityObject.Create(ActivityObject.Ids.Id_weapon0003); - // weapon3.PutDown(player.Position, RoomLayerEnum.NormalLayer); - // var weapon4 = ActivityObject.Create(ActivityObject.Ids.Id_weapon0004); - // weapon4.PutDown(player.Position, RoomLayerEnum.NormalLayer); - GameApplication.Instance.Cursor.SetGuiMode(false); - yield return 0; - //打开游戏中的ui UiManager.Open_RoomUI(); //派发进入地牢事件 @@ -301,6 +288,8 @@ GameApplication.Instance.DestroyWorld(); yield return 0; FogMaskHandler.ClearRecordRoom(); + LiquidBrushManager.ClearData(); + BrushImageData.ClearBrushData(); QueueRedraw(); //鼠标还原 GameApplication.Instance.Cursor.SetGuiMode(true); @@ -314,11 +303,59 @@ 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.CalcOuterRange(); + roomInfo.CalcRange(); //挂载房间导航区域 MountNavFromRoomInfo(roomInfo); //创建门 @@ -328,9 +365,13 @@ //创建 RoomStaticSprite CreateRoomStaticSprite(roomInfo); //创建静态精灵画布 - CreateRoomStaticSpriteCanvas(roomInfo); + CreateRoomStaticImageCanvas(roomInfo); + //创建液体区域 + CreateRoomLiquidCanvas(roomInfo); //创建迷雾遮罩 CreateRoomFogMask(roomInfo); + //创建房间/过道预览sprite + CreatePreviewSprite(roomInfo); } //挂载房间导航区域 @@ -421,21 +462,26 @@ World.Current.StaticSpriteRoot.AddChild(spriteRoot); roomInfo.StaticSprite = spriteRoot; } - - //创建静态精灵画布 - private void CreateRoomStaticSpriteCanvas(RoomInfo roomInfo) + + + //创建液体画布 + private void CreateRoomLiquidCanvas(RoomInfo roomInfo) { - var worldPos = roomInfo.GetWorldPosition(); - var rect = roomInfo.OuterRange; + var rect = roomInfo.CanvasRect; - var minX = rect.Position.X - GameConfig.TileCellSize; - var minY = rect.Position.Y - GameConfig.TileCellSize; - var maxX = rect.End.X + GameConfig.TileCellSize; - var maxY = rect.End.Y + GameConfig.TileCellSize; + var liquidCanvas = new LiquidCanvas(roomInfo, rect.Size.X, rect.Size.Y); + liquidCanvas.Position = rect.Position; + roomInfo.LiquidCanvas = liquidCanvas; + roomInfo.StaticSprite.AddChild(liquidCanvas); + } - var canvasSprite = new ImageCanvas(maxX - minX, maxY - minY); - canvasSprite.Position = new Vector2I(minX, minY); - roomInfo.RoomOffset = new Vector2I(worldPos.X - minX, worldPos.Y - minY); + //创建静态图像画布 + private void CreateRoomStaticImageCanvas(RoomInfo roomInfo) + { + var rect = roomInfo.CanvasRect; + + var canvasSprite = new ImageCanvas(rect.Size.X, rect.Size.Y); + canvasSprite.Position = rect.Position; roomInfo.StaticImageCanvas = canvasSprite; roomInfo.StaticSprite.AddChild(canvasSprite); } @@ -551,6 +597,117 @@ } } + private void CreatePreviewSprite(RoomInfo roomInfo) + { + //房间区域 + var sprite = new TextureRect(); + //sprite.Centered = false; + sprite.Texture = roomInfo.PreviewTexture; + sprite.Position = roomInfo.Position; + 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); + sprite.Material = material; + roomInfo.PreviewSprite = sprite; + + //过道 + if (roomInfo.Doors != null) + { + foreach (var doorInfo in roomInfo.Doors) + { + if (doorInfo.IsForward) + { + var aisleSprite = new TextureRect(); + //aisleSprite.Centered = false; + aisleSprite.Texture = doorInfo.AislePreviewTexture; + //调整过道预览位置 + + if (!doorInfo.HasCross) //不含交叉点 + { + 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); + } + } + 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; + } + } + } + + 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; + } + } + } + } + /// /// 玩家第一次进入某个房间回调 /// @@ -565,11 +722,11 @@ foreach (var enemy in World.Enemy_InstanceList) { //不与玩家处于同一个房间 - if (enemy.AffiliationArea != playerAffiliationArea) + if (!enemy.IsDestroyed && enemy.AffiliationArea != playerAffiliationArea) { - if (enemy.StateController.CurrState != AiStateEnum.AiNormal) + if (enemy.StateController.CurrState != AIStateEnum.AiNormal) { - enemy.StateController.ChangeState(AiStateEnum.AiNormal); + enemy.StateController.ChangeState(AIStateEnum.AiNormal); } } } @@ -620,30 +777,6 @@ } } - /// - /// 更新敌人视野 - /// - private void UpdateEnemiesView() - { - World.Enemy_IsFindTarget = false; - World.Enemy_FindTargetAffiliationSet.Clear(); - for (var i = 0; i < World.Enemy_InstanceList.Count; i++) - { - var enemy = World.Enemy_InstanceList[i]; - var state = enemy.StateController.CurrState; - if (state == AiStateEnum.AiFollowUp || state == AiStateEnum.AiSurround) //目标在视野内 - { - if (!World.Enemy_IsFindTarget) - { - World.Enemy_IsFindTarget = true; - World.Enemy_FindTargetPosition = Player.Current.GetCenterPosition(); - World.Enemy_FindTargetAffiliationSet.Add(Player.Current.AffiliationArea); - } - World.Enemy_FindTargetAffiliationSet.Add(enemy.AffiliationArea); - } - } - } - private void DisposeRoomInfo(RoomInfo roomInfo) { roomInfo.Destroy(); @@ -651,13 +784,17 @@ public override void _Draw() { - if (GameApplication.Instance.IsDebug) + if (ActivityObject.IsDebug) { if (_dungeonTileMap != null && _roomStaticNavigationList != null) { //绘制ai寻路区域 Utils.DrawNavigationPolygon(this, _roomStaticNavigationList.ToArray()); } + // StartRoomInfo?.EachRoom(info => + // { + // DrawRect(new Rect2(info.Waypoints * GameConfig.TileCellSize, new Vector2(16, 16)), Colors.Red); + // }); //绘制房间区域 // if (_dungeonGenerator != null) // { diff --git a/DungeonShooting_Godot/src/game/room/World.cs b/DungeonShooting_Godot/src/game/room/World.cs index 35af42b..35673f9 100644 --- a/DungeonShooting_Godot/src/game/room/World.cs +++ b/DungeonShooting_Godot/src/game/room/World.cs @@ -64,21 +64,6 @@ /// public List Enemy_InstanceList { get; } = new List(); - /// - /// 公共属性, 敌人是否找到目标, 如果找到目标, 则与目标同房间的所有敌人都会知道目标的位置 - /// - public bool Enemy_IsFindTarget { get; set; } - - /// - /// 公共属性, 敌人在哪个区域找到的目标, 所有该区域下的敌人都会知道目标的位置 - /// - public HashSet Enemy_FindTargetAffiliationSet { get; } = new HashSet(); - - /// - /// 公共属性, 敌人找到的目标的位置, 如果目标在视野内, 则一直更新 - /// - public Vector2 Enemy_FindTargetPosition { get; set; } - private bool _pause = false; private List _coroutineList; @@ -115,6 +100,31 @@ 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) { diff --git a/DungeonShooting_Godot/src/game/ui/bottomTips/BottomTipsPanel.cs b/DungeonShooting_Godot/src/game/ui/bottomTips/BottomTipsPanel.cs index a7bba64..495fb5d 100644 --- a/DungeonShooting_Godot/src/game/ui/bottomTips/BottomTipsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/bottomTips/BottomTipsPanel.cs @@ -69,24 +69,27 @@ yield return 0; //向上移动 - var frame = GameApplication.Instance.TargetFps * _animationTime; - var stepPixel = _movePixel / frame; - for (var i = 0; i < frame; i++) + var time = 0f; + while (time < _animationTime) { - pos.X = L_Panel.Instance.Position.X; - pos.Y -= stepPixel; - L_Panel.Instance.Position = pos; + L_Panel.Instance.Position = new Vector2( + pos.X, + pos.Y - Mathf.Lerp(0, _movePixel, Mathf.Min(time / _animationTime, 1)) + ); + time += (float)GetProcessDeltaTime(); yield return 0; } yield return new WaitForSeconds(3.5f); //向下移动 - for (var i = 0; i < frame; i++) + while (time > 0) { - pos.X = L_Panel.Instance.Position.X; - pos.Y += stepPixel; - L_Panel.Instance.Position = pos; + L_Panel.Instance.Position = new Vector2( + pos.X, + pos.Y - Mathf.Lerp(0, _movePixel, Mathf.Max(time / _animationTime, 0)) + ); + time -= (float)GetProcessDeltaTime(); yield return 0; } diff --git a/DungeonShooting_Godot/src/game/ui/editorTools/EditorTools.cs b/DungeonShooting_Godot/src/game/ui/editorTools/EditorTools.cs index bf3436d..ea4d712 100644 --- a/DungeonShooting_Godot/src/game/ui/editorTools/EditorTools.cs +++ b/DungeonShooting_Godot/src/game/ui/editorTools/EditorTools.cs @@ -8,801 +8,600 @@ /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer /// - public EditorTools_ScrollContainer L_ScrollContainer + public ScrollContainer L_ScrollContainer { get { - if (_L_ScrollContainer == null) _L_ScrollContainer = new EditorTools_ScrollContainer(this, GetNodeOrNull("ScrollContainer")); + if (_L_ScrollContainer == null) _L_ScrollContainer = new ScrollContainer((EditorToolsPanel)this, GetNode("ScrollContainer")); return _L_ScrollContainer; } } - private EditorTools_ScrollContainer _L_ScrollContainer; + private ScrollContainer _L_ScrollContainer; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.Confirm /// - public EditorTools_Confirm L_Confirm + public Confirm L_Confirm { get { - if (_L_Confirm == null) _L_Confirm = new EditorTools_Confirm(this, GetNodeOrNull("Confirm")); + if (_L_Confirm == null) _L_Confirm = new Confirm((EditorToolsPanel)this, GetNode("Confirm")); return _L_Confirm; } } - private EditorTools_Confirm _L_Confirm; + private Confirm _L_Confirm; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.Tips /// - public EditorTools_Tips L_Tips + public Tips L_Tips { get { - if (_L_Tips == null) _L_Tips = new EditorTools_Tips(this, GetNodeOrNull("Tips")); + if (_L_Tips == null) _L_Tips = new Tips((EditorToolsPanel)this, GetNode("Tips")); return _L_Tips; } } - private EditorTools_Tips _L_Tips; + private Tips _L_Tips; public EditorTools() : base(nameof(EditorTools)) { } + public sealed override void OnInitNestedUi() + { + + } + /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer.Label /// - public class EditorTools_Label : UiNode + public class Label : UiNode { - public EditorTools_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer.Button /// - public class EditorTools_Button : UiNode + public class Button : UiNode { - public EditorTools_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + public Button(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer /// - public class EditorTools_HBoxContainer : UiNode + public class HBoxContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label /// - public EditorTools_Label L_Label + public Label L_Label { get { - if (_L_Label == null) _L_Label = new EditorTools_Label(UiPanel, Instance.GetNodeOrNull("Label")); + if (_L_Label == null) _L_Label = new Label(UiPanel, Instance.GetNode("Label")); return _L_Label; } } - private EditorTools_Label _L_Label; + private Label _L_Label; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button /// - public EditorTools_Button L_Button + public Button L_Button { get { - if (_L_Button == null) _L_Button = new EditorTools_Button(UiPanel, Instance.GetNodeOrNull("Button")); + if (_L_Button == null) _L_Button = new Button(UiPanel, Instance.GetNode("Button")); return _L_Button; } } - private EditorTools_Button _L_Button; + private Button _L_Button; - public EditorTools_HBoxContainer(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + public HBoxContainer(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3.Label /// - public class EditorTools1_Label : UiNode + public class Label_1 : UiNode { - public EditorTools1_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools1_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label_1(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_1 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3.LineEdit /// - public class EditorTools_LineEdit : UiNode + public class LineEdit : UiNode { - public EditorTools_LineEdit(EditorTools uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } - public override EditorTools_LineEdit Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); + public LineEdit(EditorToolsPanel uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } + public override LineEdit Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3.Button /// - public class EditorTools1_Button : UiNode + public class Button_1 : UiNode { - public EditorTools1_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools1_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + public Button_1(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button_1 Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3 /// - public class EditorTools_HBoxContainer3 : UiNode + public class HBoxContainer3 : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label /// - public EditorTools1_Label L_Label + public Label_1 L_Label { get { - if (_L_Label == null) _L_Label = new EditorTools1_Label(UiPanel, Instance.GetNodeOrNull("Label")); + if (_L_Label == null) _L_Label = new Label_1(UiPanel, Instance.GetNode("Label")); return _L_Label; } } - private EditorTools1_Label _L_Label; + private Label_1 _L_Label; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.LineEdit /// - public EditorTools_LineEdit L_LineEdit + public LineEdit L_LineEdit { get { - if (_L_LineEdit == null) _L_LineEdit = new EditorTools_LineEdit(UiPanel, Instance.GetNodeOrNull("LineEdit")); + if (_L_LineEdit == null) _L_LineEdit = new LineEdit(UiPanel, Instance.GetNode("LineEdit")); return _L_LineEdit; } } - private EditorTools_LineEdit _L_LineEdit; + private LineEdit _L_LineEdit; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button /// - public EditorTools1_Button L_Button + public Button_1 L_Button { get { - if (_L_Button == null) _L_Button = new EditorTools1_Button(UiPanel, Instance.GetNodeOrNull("Button")); + if (_L_Button == null) _L_Button = new Button_1(UiPanel, Instance.GetNode("Button")); return _L_Button; } } - private EditorTools1_Button _L_Button; + private Button_1 _L_Button; - public EditorTools_HBoxContainer3(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer3 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + public HBoxContainer3(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer3 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer4.Label /// - public class EditorTools2_Label : UiNode + public class Label_2 : UiNode { - public EditorTools2_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools2_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label_2(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_2 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer4.Button /// - public class EditorTools2_Button : UiNode + public class Button_2 : UiNode { - public EditorTools2_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools2_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + public Button_2(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button_2 Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer4 /// - public class EditorTools_HBoxContainer4 : UiNode + public class HBoxContainer4 : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label /// - public EditorTools2_Label L_Label + public Label_2 L_Label { get { - if (_L_Label == null) _L_Label = new EditorTools2_Label(UiPanel, Instance.GetNodeOrNull("Label")); + if (_L_Label == null) _L_Label = new Label_2(UiPanel, Instance.GetNode("Label")); return _L_Label; } } - private EditorTools2_Label _L_Label; + private Label_2 _L_Label; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button /// - public EditorTools2_Button L_Button + public Button_2 L_Button { get { - if (_L_Button == null) _L_Button = new EditorTools2_Button(UiPanel, Instance.GetNodeOrNull("Button")); + if (_L_Button == null) _L_Button = new Button_2(UiPanel, Instance.GetNode("Button")); return _L_Button; } } - private EditorTools2_Button _L_Button; + private Button_2 _L_Button; - public EditorTools_HBoxContainer4(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer4 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + public HBoxContainer4(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer4 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer5.Label /// - public class EditorTools3_Label : UiNode + public class Label_3 : UiNode { - public EditorTools3_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools3_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label_3(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_3 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer5.Button /// - public class EditorTools3_Button : UiNode + public class Button_3 : UiNode { - public EditorTools3_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools3_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + public Button_3(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button_3 Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer5 /// - public class EditorTools_HBoxContainer5 : UiNode + public class HBoxContainer5 : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label /// - public EditorTools3_Label L_Label + public Label_3 L_Label { get { - if (_L_Label == null) _L_Label = new EditorTools3_Label(UiPanel, Instance.GetNodeOrNull("Label")); + if (_L_Label == null) _L_Label = new Label_3(UiPanel, Instance.GetNode("Label")); return _L_Label; } } - private EditorTools3_Label _L_Label; + private Label_3 _L_Label; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button /// - public EditorTools3_Button L_Button + public Button_3 L_Button { get { - if (_L_Button == null) _L_Button = new EditorTools3_Button(UiPanel, Instance.GetNodeOrNull("Button")); + if (_L_Button == null) _L_Button = new Button_3(UiPanel, Instance.GetNode("Button")); return _L_Button; } } - private EditorTools3_Button _L_Button; + private Button_3 _L_Button; - public EditorTools_HBoxContainer5(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Label - /// - public class EditorTools4_Label : UiNode - { - public EditorTools4_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools4_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomNameInput - /// - public class EditorTools_RoomNameInput : UiNode - { - public EditorTools_RoomNameInput(EditorTools uiPanel, Godot.LineEdit node) : base(uiPanel, node) { } - public override EditorTools_RoomNameInput Clone() => new (UiPanel, (Godot.LineEdit)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Label2 - /// - public class EditorTools_Label2 : UiNode - { - public EditorTools_Label2(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools_Label2 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomGroupSelect - /// - public class EditorTools_RoomGroupSelect : UiNode - { - public EditorTools_RoomGroupSelect(EditorTools uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } - public override EditorTools_RoomGroupSelect Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Label3 - /// - public class EditorTools_Label3 : UiNode - { - public EditorTools_Label3(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools_Label3 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomTypeSelect - /// - public class EditorTools_RoomTypeSelect : UiNode - { - public EditorTools_RoomTypeSelect(EditorTools uiPanel, Godot.OptionButton node) : base(uiPanel, node) { } - public override EditorTools_RoomTypeSelect Clone() => new (UiPanel, (Godot.OptionButton)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Button - /// - public class EditorTools4_Button : UiNode - { - public EditorTools4_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools4_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6 - /// - public class EditorTools_HBoxContainer6 : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label - /// - public EditorTools4_Label L_Label - { - get - { - if (_L_Label == null) _L_Label = new EditorTools4_Label(UiPanel, Instance.GetNodeOrNull("Label")); - return _L_Label; - } - } - private EditorTools4_Label _L_Label; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.RoomNameInput - /// - public EditorTools_RoomNameInput L_RoomNameInput - { - get - { - if (_L_RoomNameInput == null) _L_RoomNameInput = new EditorTools_RoomNameInput(UiPanel, Instance.GetNodeOrNull("RoomNameInput")); - return _L_RoomNameInput; - } - } - private EditorTools_RoomNameInput _L_RoomNameInput; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label2 - /// - public EditorTools_Label2 L_Label2 - { - get - { - if (_L_Label2 == null) _L_Label2 = new EditorTools_Label2(UiPanel, Instance.GetNodeOrNull("Label2")); - return _L_Label2; - } - } - private EditorTools_Label2 _L_Label2; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.RoomGroupSelect - /// - public EditorTools_RoomGroupSelect L_RoomGroupSelect - { - get - { - if (_L_RoomGroupSelect == null) _L_RoomGroupSelect = new EditorTools_RoomGroupSelect(UiPanel, Instance.GetNodeOrNull("RoomGroupSelect")); - return _L_RoomGroupSelect; - } - } - private EditorTools_RoomGroupSelect _L_RoomGroupSelect; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label3 - /// - public EditorTools_Label3 L_Label3 - { - get - { - if (_L_Label3 == null) _L_Label3 = new EditorTools_Label3(UiPanel, Instance.GetNodeOrNull("Label3")); - return _L_Label3; - } - } - private EditorTools_Label3 _L_Label3; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.RoomTypeSelect - /// - public EditorTools_RoomTypeSelect L_RoomTypeSelect - { - get - { - if (_L_RoomTypeSelect == null) _L_RoomTypeSelect = new EditorTools_RoomTypeSelect(UiPanel, Instance.GetNodeOrNull("RoomTypeSelect")); - return _L_RoomTypeSelect; - } - } - private EditorTools_RoomTypeSelect _L_RoomTypeSelect; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button - /// - public EditorTools4_Button L_Button - { - get - { - if (_L_Button == null) _L_Button = new EditorTools4_Button(UiPanel, Instance.GetNodeOrNull("Button")); - return _L_Button; - } - } - private EditorTools4_Button _L_Button; - - public EditorTools_HBoxContainer6(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer6 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer2.Label - /// - public class EditorTools5_Label : UiNode - { - public EditorTools5_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools5_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer2.Button - /// - public class EditorTools5_Button : UiNode - { - public EditorTools5_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools5_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer2 - /// - public class EditorTools_HBoxContainer2 : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label - /// - public EditorTools5_Label L_Label - { - get - { - if (_L_Label == null) _L_Label = new EditorTools5_Label(UiPanel, Instance.GetNodeOrNull("Label")); - return _L_Label; - } - } - private EditorTools5_Label _L_Label; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button - /// - public EditorTools5_Button L_Button - { - get - { - if (_L_Button == null) _L_Button = new EditorTools5_Button(UiPanel, Instance.GetNodeOrNull("Button")); - return _L_Button; - } - } - private EditorTools5_Button _L_Button; - - public EditorTools_HBoxContainer2(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + public HBoxContainer5(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer5 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer7.Label /// - public class EditorTools6_Label : UiNode + public class Label_4 : UiNode { - public EditorTools6_Label(EditorTools uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override EditorTools6_Label Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public Label_4(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_4 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer7.Button /// - public class EditorTools6_Button : UiNode + public class Button_4 : UiNode { - public EditorTools6_Button(EditorTools uiPanel, Godot.Button node) : base(uiPanel, node) { } - public override EditorTools6_Button Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + public Button_4(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button_4 Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer7 /// - public class EditorTools_HBoxContainer7 : UiNode + public class HBoxContainer7 : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Label /// - public EditorTools6_Label L_Label + public Label_4 L_Label { get { - if (_L_Label == null) _L_Label = new EditorTools6_Label(UiPanel, Instance.GetNodeOrNull("Label")); + if (_L_Label == null) _L_Label = new Label_4(UiPanel, Instance.GetNode("Label")); return _L_Label; } } - private EditorTools6_Label _L_Label; + private Label_4 _L_Label; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button /// - public EditorTools6_Button L_Button + public Button_4 L_Button { get { - if (_L_Button == null) _L_Button = new EditorTools6_Button(UiPanel, Instance.GetNodeOrNull("Button")); + if (_L_Button == null) _L_Button = new Button_4(UiPanel, Instance.GetNode("Button")); return _L_Button; } } - private EditorTools6_Button _L_Button; + private Button_4 _L_Button; - public EditorTools_HBoxContainer7(EditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_HBoxContainer7 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + public HBoxContainer7(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer7 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer8.Label + /// + public class Label_5 : UiNode + { + public Label_5(EditorToolsPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override Label_5 Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer8.Button + /// + public class Button_5 : UiNode + { + public Button_5(EditorToolsPanel uiPanel, Godot.Button node) : base(uiPanel, node) { } + public override Button_5 Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer8 + /// + public class HBoxContainer8 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.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 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.Button + /// + public Button_5 L_Button + { + get + { + if (_L_Button == null) _L_Button = new Button_5(UiPanel, Instance.GetNode("Button")); + return _L_Button; + } + } + private Button_5 _L_Button; + + public HBoxContainer8(EditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public override HBoxContainer8 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer /// - public class EditorTools_VBoxContainer : UiNode + public class VBoxContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer /// - public EditorTools_HBoxContainer L_HBoxContainer + public HBoxContainer L_HBoxContainer { get { - if (_L_HBoxContainer == null) _L_HBoxContainer = new EditorTools_HBoxContainer(UiPanel, Instance.GetNodeOrNull("HBoxContainer")); + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(UiPanel, Instance.GetNode("HBoxContainer")); return _L_HBoxContainer; } } - private EditorTools_HBoxContainer _L_HBoxContainer; + private HBoxContainer _L_HBoxContainer; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer3 /// - public EditorTools_HBoxContainer3 L_HBoxContainer3 + public HBoxContainer3 L_HBoxContainer3 { get { - if (_L_HBoxContainer3 == null) _L_HBoxContainer3 = new EditorTools_HBoxContainer3(UiPanel, Instance.GetNodeOrNull("HBoxContainer3")); + if (_L_HBoxContainer3 == null) _L_HBoxContainer3 = new HBoxContainer3(UiPanel, Instance.GetNode("HBoxContainer3")); return _L_HBoxContainer3; } } - private EditorTools_HBoxContainer3 _L_HBoxContainer3; + private HBoxContainer3 _L_HBoxContainer3; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer4 /// - public EditorTools_HBoxContainer4 L_HBoxContainer4 + public HBoxContainer4 L_HBoxContainer4 { get { - if (_L_HBoxContainer4 == null) _L_HBoxContainer4 = new EditorTools_HBoxContainer4(UiPanel, Instance.GetNodeOrNull("HBoxContainer4")); + if (_L_HBoxContainer4 == null) _L_HBoxContainer4 = new HBoxContainer4(UiPanel, Instance.GetNode("HBoxContainer4")); return _L_HBoxContainer4; } } - private EditorTools_HBoxContainer4 _L_HBoxContainer4; + private HBoxContainer4 _L_HBoxContainer4; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer5 /// - public EditorTools_HBoxContainer5 L_HBoxContainer5 + public HBoxContainer5 L_HBoxContainer5 { get { - if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new EditorTools_HBoxContainer5(UiPanel, Instance.GetNodeOrNull("HBoxContainer5")); + if (_L_HBoxContainer5 == null) _L_HBoxContainer5 = new HBoxContainer5(UiPanel, Instance.GetNode("HBoxContainer5")); return _L_HBoxContainer5; } } - private EditorTools_HBoxContainer5 _L_HBoxContainer5; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer6 - /// - public EditorTools_HBoxContainer6 L_HBoxContainer6 - { - get - { - if (_L_HBoxContainer6 == null) _L_HBoxContainer6 = new EditorTools_HBoxContainer6(UiPanel, Instance.GetNodeOrNull("HBoxContainer6")); - return _L_HBoxContainer6; - } - } - private EditorTools_HBoxContainer6 _L_HBoxContainer6; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer2 - /// - public EditorTools_HBoxContainer2 L_HBoxContainer2 - { - get - { - if (_L_HBoxContainer2 == null) _L_HBoxContainer2 = new EditorTools_HBoxContainer2(UiPanel, Instance.GetNodeOrNull("HBoxContainer2")); - return _L_HBoxContainer2; - } - } - private EditorTools_HBoxContainer2 _L_HBoxContainer2; + private HBoxContainer5 _L_HBoxContainer5; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer7 /// - public EditorTools_HBoxContainer7 L_HBoxContainer7 + public HBoxContainer7 L_HBoxContainer7 { get { - if (_L_HBoxContainer7 == null) _L_HBoxContainer7 = new EditorTools_HBoxContainer7(UiPanel, Instance.GetNodeOrNull("HBoxContainer7")); + if (_L_HBoxContainer7 == null) _L_HBoxContainer7 = new HBoxContainer7(UiPanel, Instance.GetNode("HBoxContainer7")); return _L_HBoxContainer7; } } - private EditorTools_HBoxContainer7 _L_HBoxContainer7; + private HBoxContainer7 _L_HBoxContainer7; - public EditorTools_VBoxContainer(EditorTools uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } - public override EditorTools_VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.HBoxContainer8 + /// + public HBoxContainer8 L_HBoxContainer8 + { + get + { + if (_L_HBoxContainer8 == null) _L_HBoxContainer8 = new HBoxContainer8(UiPanel, Instance.GetNode("HBoxContainer8")); + return _L_HBoxContainer8; + } + } + private HBoxContainer8 _L_HBoxContainer8; + + public VBoxContainer(EditorToolsPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) { } + public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer.MarginContainer /// - public class EditorTools_MarginContainer : UiNode + public class MarginContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.ScrollContainer.VBoxContainer /// - public EditorTools_VBoxContainer L_VBoxContainer + public VBoxContainer L_VBoxContainer { get { - if (_L_VBoxContainer == null) _L_VBoxContainer = new EditorTools_VBoxContainer(UiPanel, Instance.GetNodeOrNull("VBoxContainer")); + if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode("VBoxContainer")); return _L_VBoxContainer; } } - private EditorTools_VBoxContainer _L_VBoxContainer; + private VBoxContainer _L_VBoxContainer; - public EditorTools_MarginContainer(EditorTools uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } - public override EditorTools_MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); + public MarginContainer(EditorToolsPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) { } + public override MarginContainer Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.ScrollContainer /// - public class EditorTools_ScrollContainer : UiNode + public class ScrollContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorTools.MarginContainer /// - public EditorTools_MarginContainer L_MarginContainer + public MarginContainer L_MarginContainer { get { - if (_L_MarginContainer == null) _L_MarginContainer = new EditorTools_MarginContainer(UiPanel, Instance.GetNodeOrNull("MarginContainer")); + if (_L_MarginContainer == null) _L_MarginContainer = new MarginContainer(UiPanel, Instance.GetNode("MarginContainer")); return _L_MarginContainer; } } - private EditorTools_MarginContainer _L_MarginContainer; + private MarginContainer _L_MarginContainer; - public EditorTools_ScrollContainer(EditorTools uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } - public override EditorTools_ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); + public ScrollContainer(EditorToolsPanel uiPanel, Godot.ScrollContainer node) : base(uiPanel, node) { } + public override ScrollContainer Clone() => new (UiPanel, (Godot.ScrollContainer)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.Confirm /// - public class EditorTools_Confirm : UiNode + public class Confirm : UiNode { - public EditorTools_Confirm(EditorTools uiPanel, Godot.ConfirmationDialog node) : base(uiPanel, node) { } - public override EditorTools_Confirm Clone() => new (UiPanel, (Godot.ConfirmationDialog)Instance.Duplicate()); + public Confirm(EditorToolsPanel uiPanel, Godot.ConfirmationDialog node) : base(uiPanel, node) { } + public override Confirm Clone() => new (UiPanel, (Godot.ConfirmationDialog)Instance.Duplicate()); } /// /// 类型: , 路径: EditorTools.Tips /// - public class EditorTools_Tips : UiNode + public class Tips : UiNode { - public EditorTools_Tips(EditorTools uiPanel, Godot.AcceptDialog node) : base(uiPanel, node) { } - public override EditorTools_Tips Clone() => new (UiPanel, (Godot.AcceptDialog)Instance.Duplicate()); + public Tips(EditorToolsPanel uiPanel, Godot.AcceptDialog node) : base(uiPanel, node) { } + public override Tips Clone() => new (UiPanel, (Godot.AcceptDialog)Instance.Duplicate()); } /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer /// - public EditorTools_HBoxContainer S_HBoxContainer => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer; + public HBoxContainer S_HBoxContainer => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3.LineEdit /// - public EditorTools_LineEdit S_LineEdit => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer3.L_LineEdit; + public LineEdit S_LineEdit => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer3.L_LineEdit; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer3 /// - public EditorTools_HBoxContainer3 S_HBoxContainer3 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer3; + public HBoxContainer3 S_HBoxContainer3 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer3; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer4 /// - public EditorTools_HBoxContainer4 S_HBoxContainer4 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer4; + public HBoxContainer4 S_HBoxContainer4 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer4; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer5 /// - public EditorTools_HBoxContainer5 S_HBoxContainer5 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer5; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomNameInput - /// - public EditorTools_RoomNameInput S_RoomNameInput => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6.L_RoomNameInput; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Label2 - /// - public EditorTools_Label2 S_Label2 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6.L_Label2; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomGroupSelect - /// - public EditorTools_RoomGroupSelect S_RoomGroupSelect => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6.L_RoomGroupSelect; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.Label3 - /// - public EditorTools_Label3 S_Label3 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6.L_Label3; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6.RoomTypeSelect - /// - public EditorTools_RoomTypeSelect S_RoomTypeSelect => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6.L_RoomTypeSelect; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer6 - /// - public EditorTools_HBoxContainer6 S_HBoxContainer6 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer2 - /// - public EditorTools_HBoxContainer2 S_HBoxContainer2 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer2; + public HBoxContainer5 S_HBoxContainer5 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer5; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer7 /// - public EditorTools_HBoxContainer7 S_HBoxContainer7 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer7; + public HBoxContainer7 S_HBoxContainer7 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer7; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer.HBoxContainer8 + /// + public HBoxContainer8 S_HBoxContainer8 => L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer8; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer.VBoxContainer /// - public EditorTools_VBoxContainer S_VBoxContainer => L_ScrollContainer.L_MarginContainer.L_VBoxContainer; + public VBoxContainer S_VBoxContainer => L_ScrollContainer.L_MarginContainer.L_VBoxContainer; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer.MarginContainer /// - public EditorTools_MarginContainer S_MarginContainer => L_ScrollContainer.L_MarginContainer; + public MarginContainer S_MarginContainer => L_ScrollContainer.L_MarginContainer; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.ScrollContainer /// - public EditorTools_ScrollContainer S_ScrollContainer => L_ScrollContainer; + public ScrollContainer S_ScrollContainer => L_ScrollContainer; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.Confirm /// - public EditorTools_Confirm S_Confirm => L_Confirm; + public Confirm S_Confirm => L_Confirm; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorTools.Tips /// - public EditorTools_Tips S_Tips => L_Tips; + public Tips S_Tips => L_Tips; } diff --git a/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs index 7e9eaf8..864e2a4 100644 --- a/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/editorTools/EditorToolsPanel.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text.RegularExpressions; using Godot; +using Environment = System.Environment; #if TOOLS using Generator; @@ -46,24 +47,20 @@ L_Confirm.Instance.Canceled += OnCanceled; L_Confirm.Instance.CloseRequested += OnCanceled; L_Confirm.Instance.Confirmed += OnConfirm; - - InitSelectOptions(); var container = L_ScrollContainer.L_MarginContainer.L_VBoxContainer; //重新生成 ResourcePath container.L_HBoxContainer.L_Button.Instance.Pressed += GenerateResourcePath; - //重新打包房间配置 - container.L_HBoxContainer2.L_Button.Instance.Pressed += GenerateRoomConfig; //重新生成ui代码 container.L_HBoxContainer4.L_Button.Instance.Pressed += OnGenerateCurrentUiCode; //创建ui container.L_HBoxContainer3.L_Button.Instance.Pressed += OnCreateUI; //重新生成UiManagerMethods.cs代码 container.L_HBoxContainer5.L_Button.Instance.Pressed += GenerateUiManagerMethods; - //创建地牢房间 - container.L_HBoxContainer6.L_Button.Instance.Pressed += GenerateDungeonRoom; //导出excel表 container.L_HBoxContainer7.L_Button.Instance.Pressed += ExportExcel; + //打开excel表文件夹 + container.L_HBoxContainer8.L_Button.Instance.Pressed += OpenExportExcelFolder; } public override void OnHideUi() @@ -78,50 +75,11 @@ var container = L_ScrollContainer.L_MarginContainer.L_VBoxContainer; container.L_HBoxContainer.L_Button.Instance.Pressed -= GenerateResourcePath; - container.L_HBoxContainer2.L_Button.Instance.Pressed -= GenerateRoomConfig; container.L_HBoxContainer4.L_Button.Instance.Pressed -= OnGenerateCurrentUiCode; container.L_HBoxContainer3.L_Button.Instance.Pressed -= OnCreateUI; container.L_HBoxContainer5.L_Button.Instance.Pressed -= GenerateUiManagerMethods; - container.L_HBoxContainer6.L_Button.Instance.Pressed -= GenerateDungeonRoom; container.L_HBoxContainer7.L_Button.Instance.Pressed -= ExportExcel; - } - - public override void Process(float delta) - { - if (_createRoomGroupValueMap == null || _createRoomTypeValueMap == null) - { - InitSelectOptions(); - } - } - - //创建ui的下拉框数据 - private void InitSelectOptions() - { - _createRoomGroupValueMap = new Dictionary(); - _createRoomTypeValueMap = new Dictionary(); - var container = L_ScrollContainer.L_MarginContainer.L_VBoxContainer; - var select1 = container.L_HBoxContainer6.L_RoomGroupSelect.Instance; - select1.Clear(); - var directoryInfo = new DirectoryInfo(GameConfig.RoomTileDir); - var directoryInfoArray = directoryInfo.GetDirectories(); - for (var i = 0; i < directoryInfoArray.Length; i++) - { - var text = directoryInfoArray[i].Name; - select1.AddItem(text, i); - _createRoomGroupValueMap.Add(i, text); - } - - var select2 = container.L_HBoxContainer6.L_RoomTypeSelect.Instance; - select2.Clear(); - var dungeonRoomTypes = Enum.GetValues(); - for (var i = 0; i < dungeonRoomTypes.Length; i++) - { - var typeName = DungeonManager.DungeonRoomTypeToString(dungeonRoomTypes[i]); - var text = typeName + " (" + - DungeonManager.DungeonRoomTypeToDescribeString(dungeonRoomTypes[i]) + ")"; - select2.AddItem(text, i); - _createRoomTypeValueMap.Add(i, typeName); - } + container.L_HBoxContainer8.L_Button.Instance.Pressed -= OpenExportExcelFolder; } /// @@ -315,22 +273,7 @@ ShowTips("错误", "ResourcePath.cs生成失败! 前往控制台查看错误日志!"); } } - - /// - /// 重新打包房间配置 - /// - private void GenerateRoomConfig() - { - if (DungeonRoomGenerator.GenerateRoomConfig()) - { - ShowTips("提示", "打包地牢房间配置执行完成!"); - } - else - { - ShowTips("错误", "打包地牢房间配置执行失败! 前往控制台查看错误日志!"); - } - } - + /// /// 重新生成UiManagerMethods.cs代码 /// @@ -345,52 +288,7 @@ ShowTips("错误", "生成UiManagerMethods.cs代码执行失败! 前往控制台查看错误日志!"); } } - - /// - /// 创建地牢房间 - /// - private void GenerateDungeonRoom() - { - var node = L_ScrollContainer.L_MarginContainer.L_VBoxContainer.L_HBoxContainer6; - var group = _createRoomGroupValueMap[node.L_RoomGroupSelect.Instance.Selected]; - var type = _createRoomTypeValueMap[node.L_RoomTypeSelect.Instance.Selected]; - var roomName = node.L_RoomNameInput.Instance.Text; - - var pathName = group + "/" + type + "/" + roomName; - - ShowConfirm("提示", "是否创建房间:" + pathName, (result) => - { - if (result) - { - //检查名称是否合规 - if (!Regex.IsMatch(roomName, "^\\w+$")) - { - ShowTips("错误", "房间名称'" + roomName + "'不符合名称约束, 房间名称只允许包含大写字母和数字!"); - return; - } - - //检查是否有同名的Ui - var path = GameConfig.RoomTileDir + pathName + ".tscn"; - if (File.Exists(path)) - { - ShowTips("错误", "已经存在相同名称'" + pathName + "'的房间了, 不能重复创建!"); - return; - } - - //执行创建操作 - if (DungeonRoomGenerator.CreateDungeonRoom(group, type, roomName, true)) - { - ShowTips("提示", "创建房间成功!"); - } - else - { - ShowTips("错误", "创建房间失败! 前往控制台查看错误日志!"); - } - - } - }); - } - + /// /// 导出excel表 /// @@ -399,6 +297,15 @@ ExcelGenerator.ExportExcel(); ShowTips("提示", "已启动导表程序, 注意查看控制台信息!"); } + + /// + /// 使用资源管理器打开excel表文件夹 + /// + private void OpenExportExcelFolder() + { + var path = Environment.CurrentDirectory + "\\excel\\excelFile"; + System.Diagnostics.Process.Start("explorer.exe", path); + } /// /// 在编辑器中打开一个提示窗口 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs index 50c9957..205f45e 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs @@ -97,7 +97,7 @@ //绘制填充区域 private bool _drawFullRect = false; //负责存储自动图块数据 - private Grid _autoCellLayerGrid = new Grid(); + private InfiniteGrid _autoCellLayerGrid = new InfiniteGrid(); //用于生成导航网格 private DungeonTileMap _dungeonTileMap; //停止绘制多久后开始执行生成操作 diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMap.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMap.cs new file mode 100644 index 0000000..737698b --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMap.cs @@ -0,0 +1,181 @@ +namespace UI.RoomMap; + +/// +/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失 +/// +public abstract partial class RoomMap : UiBase +{ + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.Bg + /// + public Bg L_Bg + { + get + { + if (_L_Bg == null) _L_Bg = new Bg((RoomMapPanel)this, GetNode("Bg")); + return _L_Bg; + } + } + private Bg _L_Bg; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.MapBar + /// + public MapBar L_MapBar + { + get + { + if (_L_MapBar == null) _L_MapBar = new MapBar((RoomMapPanel)this, GetNode("MapBar")); + return _L_MapBar; + } + } + private MapBar _L_MapBar; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.MagnifyMapBar + /// + public MagnifyMapBar L_MagnifyMapBar + { + get + { + if (_L_MagnifyMapBar == null) _L_MagnifyMapBar = new MagnifyMapBar((RoomMapPanel)this, GetNode("MagnifyMapBar")); + return _L_MagnifyMapBar; + } + } + private MagnifyMapBar _L_MagnifyMapBar; + + + public RoomMap() : base(nameof(RoomMap)) + { + } + + public sealed override void OnInitNestedUi() + { + + } + + /// + /// 类型: , 路径: RoomMap.Bg + /// + public class Bg : UiNode + { + public Bg(RoomMapPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Bg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomMap.MapBar.DrawContainer.Root + /// + public class Root : UiNode + { + public Root(RoomMapPanel uiPanel, Godot.Node2D node) : base(uiPanel, node) { } + public override Root Clone() => new (UiPanel, (Godot.Node2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomMap.MapBar.DrawContainer.Mark + /// + public class Mark : UiNode + { + public Mark(RoomMapPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override Mark Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomMap.MapBar.DrawContainer + /// + public class DrawContainer : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.MapBar.Root + /// + public Root L_Root + { + get + { + if (_L_Root == null) _L_Root = new Root(UiPanel, Instance.GetNode("Root")); + return _L_Root; + } + } + private Root _L_Root; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.MapBar.Mark + /// + public Mark L_Mark + { + get + { + if (_L_Mark == null) _L_Mark = new Mark(UiPanel, Instance.GetNode("Mark")); + return _L_Mark; + } + } + private Mark _L_Mark; + + public DrawContainer(RoomMapPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override DrawContainer Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomMap.MapBar + /// + public class MapBar : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomMap.DrawContainer + /// + public DrawContainer L_DrawContainer + { + get + { + if (_L_DrawContainer == null) _L_DrawContainer = new DrawContainer(UiPanel, Instance.GetNode("DrawContainer")); + return _L_DrawContainer; + } + } + private DrawContainer _L_DrawContainer; + + public MapBar(RoomMapPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override MapBar Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomMap.MagnifyMapBar + /// + public class MagnifyMapBar : UiNode + { + public MagnifyMapBar(RoomMapPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override MagnifyMapBar Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + } + + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.Bg + /// + public Bg S_Bg => L_Bg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.MapBar.DrawContainer.Root + /// + public Root S_Root => L_MapBar.L_DrawContainer.L_Root; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.MapBar.DrawContainer.Mark + /// + public Mark S_Mark => L_MapBar.L_DrawContainer.L_Mark; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.MapBar.DrawContainer + /// + public DrawContainer S_DrawContainer => L_MapBar.L_DrawContainer; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.MapBar + /// + public MapBar S_MapBar => L_MapBar; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomMap.MagnifyMapBar + /// + public MagnifyMapBar S_MagnifyMapBar => L_MagnifyMapBar; + +} diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs new file mode 100644 index 0000000..d2d9c77 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs @@ -0,0 +1,396 @@ +using System.Collections.Generic; +using Godot; +using UI.RoomUI; + +namespace UI.RoomMap; + +/// +/// 房间的小地图 +/// +public partial class RoomMapPanel : RoomMap +{ + private EventFactory _factory = EventManager.CreateEventFactory(); + //需要刷新的问号的房间队列 + private List _needRefresh = new List(); + //正在使用的敌人标记列表 + private List _enemySpriteList = new List(); + //已经回收的敌人标记 + private Stack _spriteStack = new Stack(); + //是否放大地图 + private bool _isMagnifyMap = false; + + private DragBinder _dragBinder; + //放大地图后拖拽的偏移 + private Vector2 _mapOffset; + //放大地图后鼠标悬停的房间 + private RoomInfo _mouseHoverRoom; + private Color _originOutlineColor; + //是否展开地图 + private bool _pressMapFlag = false; + private Tween _transmissionTween; + + public override void OnCreateUi() + { + _ = S_Mark; + S_Bg.Instance.Visible = false; + S_MagnifyMapBar.Instance.Visible = false; + InitMap(); + _factory.AddEventListener(EventEnum.OnPlayerFirstEnterRoom, OnPlayerFirstEnterRoom); + _factory.AddEventListener(EventEnum.OnPlayerFirstEnterAisle, OnPlayerFirstEnterAisle); + + S_DrawContainer.Instance.Resized += OnDrawContainerResized; + } + + + public override void OnDestroyUi() + { + _factory.RemoveAllEventListener(); + + if (_dragBinder != null) + { + _dragBinder.UnBind(); + } + + if (_transmissionTween != null) + { + _transmissionTween.Dispose(); + } + } + + public override void Process(float delta) + { + if (_transmissionTween == null) //不在传送过程中 + { + if (!InputManager.Map) + { + _pressMapFlag = false; + } + //按下地图按键 + if (InputManager.Map && !_isMagnifyMap && !_pressMapFlag) //展开小地图 + { + if (UiManager.GetUiInstanceCount(UiManager.UiName.PauseMenu) == 0) + { + World.Current.Pause = true; + _pressMapFlag = true; + _isMagnifyMap = true; + MagnifyMap(); + } + } + else if (!InputManager.Map && _isMagnifyMap) //还原小地图 + { + ResetMap(); + _isMagnifyMap = false; + World.Current.Pause = false; + } + } + + //更新敌人位置 + { + var enemyList = World.Current.Enemy_InstanceList; + if (enemyList.Count == 0) //没有敌人 + { + foreach (var sprite in _enemySpriteList) + { + S_Root.RemoveChild(sprite); + _spriteStack.Push(sprite); + } + _enemySpriteList.Clear(); + } + else //更新位置 + { + var count = 0; //绘制数量 + for (var i = 0; i < enemyList.Count; i++) + { + var enemy = enemyList[i]; + if (!enemy.IsDestroyed && !enemy.IsDie && enemy.AffiliationArea != null && enemy.AffiliationArea.RoomInfo.RoomFogMask.IsExplored) + { + count++; + Sprite2D sprite; + if (i >= _enemySpriteList.Count) + { + if (_spriteStack.Count > 0) + { + sprite = _spriteStack.Pop(); + } + else + { + sprite = new Sprite2D(); + sprite.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Block_png); + sprite.Modulate = new Color(1, 0, 0); + } + _enemySpriteList.Add(sprite); + S_Root.AddChild(sprite); + } + else + { + sprite = _enemySpriteList[i]; + } + //更新标记位置 + sprite.Position = enemy.Position / 16; + } + } + + //回收多余的标记 + while (_enemySpriteList.Count > count) + { + var index = _enemySpriteList.Count - 1; + var sprite = _enemySpriteList[index]; + S_Root.RemoveChild(sprite); + _spriteStack.Push(sprite); + _enemySpriteList.RemoveAt(index); + } + } + } + + //更新预览图标 + if (_needRefresh.Count > 0) + { + foreach (var roomDoorInfo in _needRefresh) + { + HandlerRefreshUnknownSprite(roomDoorInfo); + } + _needRefresh.Clear(); + } + + //更新地图中心点位置 + if (!_isMagnifyMap) + { + 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; + } + + //传送 + 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; + } + } + + private void OnDrawContainerResized() + { + S_Mark.Instance.Position = S_DrawContainer.Instance.Size / 2; + } + + //放大小地图 + private void MagnifyMap() + { + GameApplication.Instance.Cursor.SetGuiMode(true); + S_DrawContainer.Reparent(S_MagnifyMapBar); + S_DrawContainer.Instance.Position = new Vector2(1, 1); + S_Bg.Instance.Visible = true; + S_MagnifyMapBar.Instance.Visible = true; + S_MapBar.Instance.Visible = false; + _mapOffset = Vector2.Zero; + + _dragBinder = DragUiManager.BindDrag(S_DrawContainer.Instance, (state, delta) => + { + if (state == DragState.DragMove) + { + _mapOffset += delta; + } + }); + } + + //还原小地图 + private void ResetMap() + { + GameApplication.Instance.Cursor.SetGuiMode(false); + S_DrawContainer.Reparent(S_MapBar); + S_DrawContainer.Instance.Position = new Vector2(1, 1); + S_Bg.Instance.Visible = false; + S_MagnifyMapBar.Instance.Visible = false; + S_MapBar.Instance.Visible = true; + ResetOutlineColor(); + + if (_dragBinder != null) + { + _dragBinder.UnBind(); + } + } + + private void ResetOutlineColor() + { + if (_mouseHoverRoom != null) + { + ((ShaderMaterial)_mouseHoverRoom.PreviewSprite.Material).SetShaderParameter("outline_color", _originOutlineColor); + _mouseHoverRoom = null; + } + } + + //初始化小地图 + private void InitMap() + { + var startRoom = GameApplication.Instance.DungeonManager.StartRoomInfo; + startRoom.EachRoom(roomInfo => + { + //房间 + roomInfo.PreviewSprite.Visible = false; + S_Root.AddChild(roomInfo.PreviewSprite); + + roomInfo.PreviewSprite.MouseEntered += () => + { + if (!_pressMapFlag) + { + return; + } + ResetOutlineColor(); + _mouseHoverRoom = roomInfo; + var shaderMaterial = (ShaderMaterial)roomInfo.PreviewSprite.Material; + _originOutlineColor = shaderMaterial.GetShaderParameter("outline_color").AsColor(); + //玩家所在的房间门是否打开 + var isOpen = !Player.Current.AffiliationArea.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 += () => + { + if (!_pressMapFlag) + { + return; + } + ResetOutlineColor(); + }; + + //过道 + if (roomInfo.Doors != null) + { + foreach (var roomInfoDoor in roomInfo.Doors) + { + if (roomInfoDoor.IsForward) + { + roomInfoDoor.AislePreviewSprite.Visible = false; + S_Root.AddChild(roomInfoDoor.AislePreviewSprite); + } + } + } + }); + } + + private void OnPlayerFirstEnterRoom(object data) + { + var roomInfo = (RoomInfo)data; + roomInfo.PreviewSprite.Visible = true; + + if (roomInfo.Doors!= null) + { + foreach (var roomDoor in roomInfo.Doors) + { + RefreshUnknownSprite(roomDoor); + } + } + } + + private void OnPlayerFirstEnterAisle(object data) + { + var roomDoorInfo = (RoomDoorInfo)data; + roomDoorInfo.AislePreviewSprite.Visible = true; + + RefreshUnknownSprite(roomDoorInfo); + RefreshUnknownSprite(roomDoorInfo.ConnectDoor); + } + + //进入刷新问号队列 + private void RefreshUnknownSprite(RoomDoorInfo roomDoorInfo) + { + if (!_needRefresh.Contains(roomDoorInfo)) + { + _needRefresh.Add(roomDoorInfo); + } + } + + //刷新问号 + private void HandlerRefreshUnknownSprite(RoomDoorInfo roomDoorInfo) + { + //是否探索房间 + var flag1 = roomDoorInfo.RoomInfo.RoomFogMask.IsExplored; + //是否探索过道 + var flag2 = roomDoorInfo.AisleFogMask.IsExplored; + if (flag1 == flag2) //不显示问号 + { + if (roomDoorInfo.UnknownSprite != null) + { + roomDoorInfo.UnknownSprite.QueueFree(); + roomDoorInfo.UnknownSprite = null; + } + } + else + { + var unknownSprite = roomDoorInfo.UnknownSprite ?? CreateUnknownSprite(roomDoorInfo); + var pos = (roomDoorInfo.OriginPosition + roomDoorInfo.GetEndPosition()) / 2; + if (!flag2) //偏向过道 + { + if (roomDoorInfo.Direction == DoorDirection.N) + pos += new Vector2I(0, -2); + else if (roomDoorInfo.Direction == DoorDirection.S) + pos += new Vector2I(0, 2); + else if (roomDoorInfo.Direction == DoorDirection.E) + pos += new Vector2I(2, 0); + else if (roomDoorInfo.Direction == DoorDirection.W) + pos += new Vector2I(-2, 0); + } + else //偏向房间 + { + if (roomDoorInfo.Direction == DoorDirection.N) + pos -= new Vector2I(0, -2); + else if (roomDoorInfo.Direction == DoorDirection.S) + pos -= new Vector2I(0, 2); + else if (roomDoorInfo.Direction == DoorDirection.E) + pos -= new Vector2I(2, 0); + else if (roomDoorInfo.Direction == DoorDirection.W) + pos -= new Vector2I(-2, 0); + } + unknownSprite.Position = pos; + } + } + + private Sprite2D CreateUnknownSprite(RoomDoorInfo roomInfoDoor) + { + var unknownSprite = new Sprite2D(); + unknownSprite.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Unknown_png); + unknownSprite.Scale = new Vector2(0.25f, 0.25f); + roomInfoDoor.UnknownSprite = unknownSprite; + S_Root.AddChild(unknownSprite); + return unknownSprite; + } + + private Vector2 CalcRootPosition(Vector2 pos) + { + return S_DrawContainer.Instance.Size / 2 - pos / 16 * S_Root.Instance.Scale; + } + + private void DoTransmission(Vector2 position) + { + var roomUI = (RoomUIPanel)ParentUi; + roomUI.S_Mask.Instance.Visible = true; + roomUI.S_Mask.Instance.Color = new Color(0, 0, 0, 0); + _transmissionTween = CreateTween(); + _transmissionTween.TweenProperty(roomUI.S_Mask.Instance, "color", new Color(0, 0, 0), 0.3f); + _transmissionTween.TweenCallback(Callable.From(() => + { + Player.Current.Position = position; + })); + _transmissionTween.TweenInterval(0.2f); + _transmissionTween.TweenProperty(roomUI.S_Mask.Instance, "color", new Color(0, 0, 0, 0), 0.3f); + _transmissionTween.TweenCallback(Callable.From(() => + { + _transmissionTween = null; + })); + _transmissionTween.Play(); + } +} diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBar.cs b/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBar.cs deleted file mode 100644 index e56f99c..0000000 --- a/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBar.cs +++ /dev/null @@ -1,204 +0,0 @@ -using Godot; - -namespace UI.RoomUI; - -public class ActivePropBar -{ - private RoomUI.RoomUI_ActivePropBar _activePropBar; - private ShaderMaterial _shaderMaterial; - private Vector2 _startCooldownPos; - private Vector2 _startCooldownSize; - private Vector2 _startChargePos; - private Rect2 _startChargeRect; - - private bool _initCooldown = false; - - public ActivePropBar(RoomUI.RoomUI_ActivePropBar activePropBar) - { - _activePropBar = activePropBar; - _shaderMaterial = (ShaderMaterial)_activePropBar.L_ActivePropSprite.Instance.Material; - _startCooldownPos = _activePropBar.L_CooldownProgress.Instance.Position; - _startCooldownSize = _activePropBar.L_CooldownProgress.Instance.Scale; - _startChargePos = _activePropBar.L_ChargeProgress.Instance.Position; - _startChargeRect = _activePropBar.L_ChargeProgress.Instance.RegionRect; - - SetActivePropTexture(null); - SetChargeProgress(1); - } - - public void OnShow() - { - - } - - public void OnHide() - { - - } - - public void Process(float delta) - { - var prop = Player.Current?.ActivePropsPack.ActiveItem; - if (prop != null) - { - SetActivePropCount(prop.Count); - SetActivePropTexture(prop.GetCurrentTexture()); - - //是否可以使用该道具 - if (prop.CheckUse()) - { - _shaderMaterial.SetShaderParameter("schedule", 0); - } - else - { - _shaderMaterial.SetShaderParameter("schedule", 0.6f); - } - - //冷却 - SetCooldownProgress(prop.GetCooldownProgress()); - - //充能进度 - SetChargeProgress(prop.ChargeProgress); - } - else - { - SetActivePropTexture(null); - } - } - - /// - /// 设置道具图标 - /// - public void SetActivePropTexture(Texture2D texture) - { - if (texture != null) - { - _activePropBar.L_ActivePropSprite.Instance.Texture = texture; - _activePropBar.Instance.Visible = true; - } - else - { - _activePropBar.Instance.Visible = false; - } - } - - /// - /// 设置道具数量 - /// - public void SetActivePropCount(int count) - { - if (count > 1) - { - _activePropBar.L_ActivePropCount.Instance.Visible = true; - _activePropBar.L_ActivePropCount.Instance.Text = count.ToString(); - } - else - { - _activePropBar.L_ActivePropCount.Instance.Visible = false; - } - } - - /// - /// 设置道具冷却进度 - /// - /// 进度: 0 - 1 - public void SetCooldownProgress(float progress) - { - progress = 1 - progress; - var colorRect = _activePropBar.L_CooldownProgress.Instance; - if (progress <= 0) - { - colorRect.Visible = false; - } - else - { - colorRect.Visible = true; - - //调整蒙板高度 - var rect = colorRect.RegionRect; - var size = rect.Size; - size.Y = progress; - rect.Size = size; - colorRect.RegionRect = rect; - - //调整蒙板位置 - var height = _startCooldownSize.Y * progress; - var position = colorRect.Position; - position.Y = _startCooldownPos.Y + (_startCooldownSize.Y - height); - colorRect.Position = position; - } - } - - /// - /// 设置充能进度条是否显示 - /// - public void SetChargeProgressVisible(bool visible) - { - var ninePatchRect = _activePropBar.L_ChargeProgressBar.Instance; - _activePropBar.L_ChargeProgress.Instance.Visible = visible; - if (ninePatchRect.Visible == visible && _initCooldown) - { - return; - } - - _initCooldown = true; - - var sprite = _activePropBar.L_CooldownProgress.Instance; - ninePatchRect.Visible = visible; - //调整冷却蒙板大小 - if (visible) - { - var rect = ninePatchRect.GetRect(); - - var position = sprite.Position; - position.X = _startCooldownPos.X + rect.Size.X - 1; - sprite.Position = position; - - var scale = sprite.Scale; - scale.X = _startCooldownSize.X - rect.Size.X + 1; - sprite.Scale = scale; - } - else - { - sprite.Position = _startCooldownPos; - sprite.Scale = _startCooldownSize; - } - } - - /// - /// 设置充能进度 - /// - /// 进度: 0 - 1 - public void SetChargeProgress(float progress) - { - if (progress >= 1) - { - SetChargeProgressVisible(false); - } - else - { - SetChargeProgressVisible(true); - - var height = _startChargeRect.Size.Y * progress; - var rectY = _startChargeRect.Size.Y * (1 - progress); - var posY = _startChargePos.Y + rectY; - - var sprite = _activePropBar.L_ChargeProgress.Instance; - - var position = sprite.Position; - position.Y = posY; - sprite.Position = position; - - var rect = sprite.RegionRect; - var rectPosition = rect.Position; - rectPosition.Y = rectY; - rect.Position = rectPosition; - - var rectSize = rect.Size; - rectSize.Y = height; - rect.Size = rectSize; - - sprite.RegionRect = rect; - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBarHandler.cs new file mode 100644 index 0000000..f01ec1b --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomUI/ActivePropBarHandler.cs @@ -0,0 +1,204 @@ +using Godot; + +namespace UI.RoomUI; + +public class ActivePropBarHandler +{ + private RoomUI.ActivePropBar _activePropBar; + private ShaderMaterial _shaderMaterial; + private Vector2 _startCooldownPos; + private Vector2 _startCooldownSize; + private Vector2 _startChargePos; + private Rect2 _startChargeRect; + + private bool _initCooldown = false; + + public ActivePropBarHandler(RoomUI.ActivePropBar activePropBar) + { + _activePropBar = activePropBar; + _shaderMaterial = (ShaderMaterial)_activePropBar.L_ActivePropSprite.Instance.Material; + _startCooldownPos = _activePropBar.L_CooldownProgress.Instance.Position; + _startCooldownSize = _activePropBar.L_CooldownProgress.Instance.Scale; + _startChargePos = _activePropBar.L_ChargeProgress.Instance.Position; + _startChargeRect = _activePropBar.L_ChargeProgress.Instance.RegionRect; + + SetActivePropTexture(null); + SetChargeProgress(1); + } + + public void OnShow() + { + + } + + public void OnHide() + { + + } + + public void Process(float delta) + { + var prop = Player.Current?.ActivePropsPack.ActiveItem; + if (prop != null) + { + SetActivePropCount(prop.Count); + SetActivePropTexture(prop.GetCurrentTexture()); + + //是否可以使用该道具 + if (prop.CheckUse()) + { + _shaderMaterial.SetShaderParameter("schedule", 0); + } + else + { + _shaderMaterial.SetShaderParameter("schedule", 0.6f); + } + + //冷却 + SetCooldownProgress(prop.GetCooldownProgress()); + + //充能进度 + SetChargeProgress(prop.ChargeProgress); + } + else + { + SetActivePropTexture(null); + } + } + + /// + /// 设置道具图标 + /// + public void SetActivePropTexture(Texture2D texture) + { + if (texture != null) + { + _activePropBar.L_ActivePropSprite.Instance.Texture = texture; + _activePropBar.Instance.Visible = true; + } + else + { + _activePropBar.Instance.Visible = false; + } + } + + /// + /// 设置道具数量 + /// + public void SetActivePropCount(int count) + { + if (count > 1) + { + _activePropBar.L_ActivePropCount.Instance.Visible = true; + _activePropBar.L_ActivePropCount.Instance.Text = count.ToString(); + } + else + { + _activePropBar.L_ActivePropCount.Instance.Visible = false; + } + } + + /// + /// 设置道具冷却进度 + /// + /// 进度: 0 - 1 + public void SetCooldownProgress(float progress) + { + progress = 1 - progress; + var colorRect = _activePropBar.L_CooldownProgress.Instance; + if (progress <= 0) + { + colorRect.Visible = false; + } + else + { + colorRect.Visible = true; + + //调整蒙板高度 + var rect = colorRect.RegionRect; + var size = rect.Size; + size.Y = progress; + rect.Size = size; + colorRect.RegionRect = rect; + + //调整蒙板位置 + var height = _startCooldownSize.Y * progress; + var position = colorRect.Position; + position.Y = _startCooldownPos.Y + (_startCooldownSize.Y - height); + colorRect.Position = position; + } + } + + /// + /// 设置充能进度条是否显示 + /// + public void SetChargeProgressVisible(bool visible) + { + var ninePatchRect = _activePropBar.L_ChargeProgressBar.Instance; + _activePropBar.L_ChargeProgress.Instance.Visible = visible; + if (ninePatchRect.Visible == visible && _initCooldown) + { + return; + } + + _initCooldown = true; + + var sprite = _activePropBar.L_CooldownProgress.Instance; + ninePatchRect.Visible = visible; + //调整冷却蒙板大小 + if (visible) + { + var rect = ninePatchRect.GetRect(); + + var position = sprite.Position; + position.X = _startCooldownPos.X + rect.Size.X - 1; + sprite.Position = position; + + var scale = sprite.Scale; + scale.X = _startCooldownSize.X - rect.Size.X + 1; + sprite.Scale = scale; + } + else + { + sprite.Position = _startCooldownPos; + sprite.Scale = _startCooldownSize; + } + } + + /// + /// 设置充能进度 + /// + /// 进度: 0 - 1 + public void SetChargeProgress(float progress) + { + if (progress >= 1) + { + SetChargeProgressVisible(false); + } + else + { + SetChargeProgressVisible(true); + + var height = _startChargeRect.Size.Y * progress; + var rectY = _startChargeRect.Size.Y * (1 - progress); + var posY = _startChargePos.Y + rectY; + + var sprite = _activePropBar.L_ChargeProgress.Instance; + + var position = sprite.Position; + position.Y = posY; + sprite.Position = position; + + var rect = sprite.RegionRect; + var rectPosition = rect.Position; + rectPosition.Y = rectY; + rect.Position = rectPosition; + + var rectSize = rect.Size; + rectSize.Y = height; + rect.Size = rectSize; + + sprite.RegionRect = rect; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBar.cs b/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBar.cs deleted file mode 100644 index 3203984..0000000 --- a/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBar.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Godot; - -namespace UI.RoomUI; - -/// -/// 互动提示文本 -/// -public class InteractiveTipBar -{ - private RoomUI.RoomUI_InteractiveTipBar _interactiveTipBar; - private EventBinder _binder; - private ActivityObject _interactiveTarget; - - public InteractiveTipBar(RoomUI.RoomUI_InteractiveTipBar interactiveTipBar) - { - interactiveTipBar.Instance.Visible = false; - _interactiveTipBar = interactiveTipBar; - } - - public void OnShow() - { - GameCamera.Main.OnPositionUpdateEvent += OnCameraPositionUpdate; - _binder = EventManager.AddEventListener(EventEnum.OnPlayerChangeInteractiveItem, OnPlayerChangeInteractiveItem); - } - - public void OnHide() - { - GameCamera.Main.OnPositionUpdateEvent -= OnCameraPositionUpdate; - _binder.RemoveEventListener(); - _binder = null; - } - - /// - /// 隐藏互动提示ui - /// - public void HideBar() - { - _interactiveTipBar.Instance.Visible = false; - } - - /// - /// 显示互动提示ui - /// - /// 所在坐标 - /// 显示文本 - /// 显示图标 - public void ShowBar(ActivityObject target, string showText, Texture2D icon) - { - _interactiveTipBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(_interactiveTarget.GlobalPosition); - _interactiveTipBar.L_Icon.Instance.Texture = icon; - _interactiveTipBar.Instance.Visible = true; - _interactiveTipBar.L_NameLabel.Instance.Text = showText; - } - - public void OnPlayerChangeInteractiveItem(object o) - { - if (o == null) - { - _interactiveTarget = null; - //隐藏互动提示 - HideBar(); - } - else - { - var result = (CheckInteractiveResult)o; - var interactiveItem = Player.Current.InteractiveItem; - //if (interactiveItem is Weapon) - var icon = result.GetIcon(); - if (icon != null) - { - _interactiveTarget = interactiveItem; - //显示互动提示 - ShowBar(result.Target, result.Target.ItemConfig.Name, icon); - } - else - { - _interactiveTarget = null; - } - } - } - - /// - /// 相机更新回调 - /// - public void OnCameraPositionUpdate(float delta) - { - if (_interactiveTarget != null) - { - _interactiveTipBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(_interactiveTarget.GlobalPosition); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBarHandler.cs new file mode 100644 index 0000000..205d689 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomUI/InteractiveTipBarHandler.cs @@ -0,0 +1,92 @@ +using Godot; + +namespace UI.RoomUI; + +/// +/// 互动提示文本 +/// +public class InteractiveTipBarHandler +{ + private RoomUI.InteractiveTipBar _interactiveTipBar; + private EventBinder _binder; + private ActivityObject _interactiveTarget; + + public InteractiveTipBarHandler(RoomUI.InteractiveTipBar interactiveTipBar) + { + interactiveTipBar.Instance.Visible = false; + _interactiveTipBar = interactiveTipBar; + } + + public void OnShow() + { + GameCamera.Main.OnPositionUpdateEvent += OnCameraPositionUpdate; + _binder = EventManager.AddEventListener(EventEnum.OnPlayerChangeInteractiveItem, OnPlayerChangeInteractiveItem); + } + + public void OnHide() + { + GameCamera.Main.OnPositionUpdateEvent -= OnCameraPositionUpdate; + _binder.RemoveEventListener(); + _binder = null; + } + + /// + /// 隐藏互动提示ui + /// + public void HideBar() + { + _interactiveTipBar.Instance.Visible = false; + } + + /// + /// 显示互动提示ui + /// + /// 所在坐标 + /// 显示文本 + /// 显示图标 + public void ShowBar(ActivityObject target, string showText, Texture2D icon) + { + _interactiveTipBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(_interactiveTarget.GlobalPosition); + _interactiveTipBar.L_Icon.Instance.Texture = icon; + _interactiveTipBar.Instance.Visible = true; + _interactiveTipBar.L_NameLabel.Instance.Text = showText; + } + + public void OnPlayerChangeInteractiveItem(object o) + { + if (o == null) + { + _interactiveTarget = null; + //隐藏互动提示 + HideBar(); + } + else + { + var result = (CheckInteractiveResult)o; + var interactiveItem = Player.Current.InteractiveItem; + //if (interactiveItem is Weapon) + var icon = result.GetIcon(); + if (icon != null) + { + _interactiveTarget = interactiveItem; + //显示互动提示 + ShowBar(result.Target, result.Target.ActivityBase.Name, icon); + } + else + { + _interactiveTarget = null; + } + } + } + + /// + /// 相机更新回调 + /// + public void OnCameraPositionUpdate(float delta) + { + if (_interactiveTarget != null) + { + _interactiveTipBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(_interactiveTarget.GlobalPosition); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/LifeBar.cs b/DungeonShooting_Godot/src/game/ui/roomUI/LifeBar.cs deleted file mode 100644 index f3dcbf3..0000000 --- a/DungeonShooting_Godot/src/game/ui/roomUI/LifeBar.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.Collections.Generic; -using Godot; - -namespace UI.RoomUI; - -public class LifeBar -{ - - private RoomUI.RoomUI_LifeBar _bar; - private UiGrid _grid; - private EventFactory _eventFactory; - private bool _refreshFlag = false; - - public LifeBar(RoomUI.RoomUI_LifeBar lifeBar) - { - _bar = lifeBar; - var uiNodeLife = lifeBar.L_Life; - - _grid = new UiGrid(uiNodeLife, typeof(LifeCell)); - _grid.SetColumns(20); - _grid.SetCellOffset(new Vector2I(1, 2)); - } - - public void OnShow() - { - _eventFactory = EventManager.CreateEventFactory(); - _eventFactory.AddEventListener(EventEnum.OnPlayerHpChange, o => RefreshLife()); - _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife()); - _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife()); - _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife()); - RefreshLife(); - } - - public void OnHide() - { - _eventFactory.RemoveAllEventListener(); - } - - public void Process(float delta) - { - if (_refreshFlag) - { - _refreshFlag = false; - HandlerRefreshLife(); - } - } - - public void RefreshLife() - { - _refreshFlag = true; - } - - private void HandlerRefreshLife() - { - var player = Player.Current; - if (player.MaxHp % 2 != 0) - { - Debug.LogError("玩家血量不是偶数!"); - } - - var list = new List(); - for (var i = 0; i < player.MaxHp / 2; i++) - { - if (player.Hp >= i * 2 + 2) - { - list.Add(LifeIconEnum.FullHeart); - } - else if (player.Hp >= i * 2 + 1) - { - list.Add(LifeIconEnum.HalfHeart); - } - else - { - list.Add(LifeIconEnum.EmptyHeart); - } - } - - for (var i = 0; i < player.MaxShield; i++) - { - if (player.Shield >= i + 1) - { - list.Add(LifeIconEnum.FullShield); - } - else - { - list.Add(LifeIconEnum.EmptyShield); - } - } - - //var maxHp - _grid.SetDataList(list.ToArray()); - } - -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs new file mode 100644 index 0000000..3bc3dd4 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomUI/LifeBarHandler.cs @@ -0,0 +1,94 @@ +using System.Collections.Generic; +using Godot; + +namespace UI.RoomUI; + +public class LifeBarHandler +{ + + private RoomUI.LifeBar _bar; + private UiGrid _grid; + private EventFactory _eventFactory; + private bool _refreshFlag = false; + + public LifeBarHandler(RoomUI.LifeBar lifeBar) + { + _bar = lifeBar; + var uiNodeLife = lifeBar.L_Life; + + _grid = new UiGrid(uiNodeLife, typeof(LifeCell)); + _grid.SetColumns(20); + _grid.SetCellOffset(new Vector2I(1, 2)); + } + + public void OnShow() + { + _eventFactory = EventManager.CreateEventFactory(); + _eventFactory.AddEventListener(EventEnum.OnPlayerHpChange, o => RefreshLife()); + _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife()); + _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife()); + _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife()); + RefreshLife(); + } + + public void OnHide() + { + _eventFactory.RemoveAllEventListener(); + } + + public void Process(float delta) + { + if (_refreshFlag) + { + _refreshFlag = false; + HandlerRefreshLife(); + } + } + + public void RefreshLife() + { + _refreshFlag = true; + } + + private void HandlerRefreshLife() + { + var player = Player.Current; + if (player.MaxHp % 2 != 0) + { + Debug.LogError("玩家血量不是偶数!"); + } + + var list = new List(); + for (var i = 0; i < player.MaxHp / 2; i++) + { + if (player.Hp >= i * 2 + 2) + { + list.Add(LifeIconEnum.FullHeart); + } + else if (player.Hp >= i * 2 + 1) + { + list.Add(LifeIconEnum.HalfHeart); + } + else + { + list.Add(LifeIconEnum.EmptyHeart); + } + } + + for (var i = 0; i < player.MaxShield; i++) + { + if (player.Shield >= i + 1) + { + list.Add(LifeIconEnum.FullShield); + } + else + { + list.Add(LifeIconEnum.EmptyShield); + } + } + + //var maxHp + _grid.SetDataList(list.ToArray()); + } + +} \ 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 6076f4e..d549158 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/LifeCell.cs @@ -2,7 +2,7 @@ namespace UI.RoomUI; -public class LifeCell : UiCell +public class LifeCell : UiCell { private int _type = -1; diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBar.cs b/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBar.cs deleted file mode 100644 index bb0b00b..0000000 --- a/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBar.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Godot; - -namespace UI.RoomUI; - -/// -/// 换弹进度组件 -/// -public class ReloadBar -{ - private RoomUI.RoomUI_ReloadBar _reloadBar; - private int width; - private float startX = 1; - - public ReloadBar(RoomUI.RoomUI_ReloadBar reloadBar) - { - reloadBar.Instance.Visible = false; - _reloadBar = reloadBar; - width = _reloadBar.L_Slot.Instance.Texture.GetWidth(); - //startX = -(width - 3) / 2f; - } - - public void OnShow() - { - GameCamera.Main.OnPositionUpdateEvent += OnCameraPositionUpdate; - } - - public void OnHide() - { - GameCamera.Main.OnPositionUpdateEvent -= OnCameraPositionUpdate; - } - - /// - /// 隐藏换弹进度组件 - /// - public void HideBar() - { - _reloadBar.Instance.Visible = false; - } - - /// - /// 显示换弹进度组件 - /// - /// 坐标 - /// 进度, 0 - 1 - public void ShowBar(Vector2 position, float progress) - { - _reloadBar.Instance.Visible = true; - _reloadBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(position); - progress = Mathf.Clamp(progress, 0, 1); - _reloadBar.L_Slot.L_Block.Instance.Position = new Vector2(startX + (width - 3) * progress, 0); - } - - /// - /// 相机更新回调 - /// - public void OnCameraPositionUpdate(float delta) - { - var player = Player.Current; - if (player.WeaponPack.ActiveItem != null && player.WeaponPack.ActiveItem.Reloading) - { - ShowBar(player.GlobalPosition, player.WeaponPack.ActiveItem.ReloadProgress); - } - else - { - HideBar(); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs new file mode 100644 index 0000000..e44c0ff --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomUI/ReloadBarHandler.cs @@ -0,0 +1,68 @@ +using Godot; + +namespace UI.RoomUI; + +/// +/// 换弹进度组件 +/// +public class ReloadBarHandler +{ + private RoomUI.ReloadBar _reloadBar; + private int width; + private float startX = 1; + + public ReloadBarHandler(RoomUI.ReloadBar reloadBar) + { + reloadBar.Instance.Visible = false; + _reloadBar = reloadBar; + width = _reloadBar.L_Slot.Instance.Texture.GetWidth(); + //startX = -(width - 3) / 2f; + } + + public void OnShow() + { + GameCamera.Main.OnPositionUpdateEvent += OnCameraPositionUpdate; + } + + public void OnHide() + { + GameCamera.Main.OnPositionUpdateEvent -= OnCameraPositionUpdate; + } + + /// + /// 隐藏换弹进度组件 + /// + public void HideBar() + { + _reloadBar.Instance.Visible = false; + } + + /// + /// 显示换弹进度组件 + /// + /// 坐标 + /// 进度, 0 - 1 + public void ShowBar(Vector2 position, float progress) + { + _reloadBar.Instance.Visible = true; + _reloadBar.Instance.GlobalPosition = GameApplication.Instance.ViewToGlobalPosition(position); + progress = Mathf.Clamp(progress, 0, 1); + _reloadBar.L_Slot.L_Block.Instance.Position = new Vector2(startX + (width - 3) * progress, 0); + } + + /// + /// 相机更新回调 + /// + public void OnCameraPositionUpdate(float delta) + { + var player = Player.Current; + if (player.WeaponPack.ActiveItem != null && player.WeaponPack.ActiveItem.Reloading) + { + ShowBar(player.GlobalPosition, player.WeaponPack.ActiveItem.ReloadProgress); + } + else + { + HideBar(); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs index 6085846..64f9203 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs @@ -8,655 +8,699 @@ /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.InteractiveTipBar /// - public RoomUI_InteractiveTipBar L_InteractiveTipBar + public InteractiveTipBar L_InteractiveTipBar { get { - if (_L_InteractiveTipBar == null) _L_InteractiveTipBar = new RoomUI_InteractiveTipBar(this, GetNodeOrNull("InteractiveTipBar")); + if (_L_InteractiveTipBar == null) _L_InteractiveTipBar = new InteractiveTipBar((RoomUIPanel)this, GetNode("InteractiveTipBar")); return _L_InteractiveTipBar; } } - private RoomUI_InteractiveTipBar _L_InteractiveTipBar; + private InteractiveTipBar _L_InteractiveTipBar; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.ReloadBar /// - public RoomUI_ReloadBar L_ReloadBar + public ReloadBar L_ReloadBar { get { - if (_L_ReloadBar == null) _L_ReloadBar = new RoomUI_ReloadBar(this, GetNodeOrNull("ReloadBar")); + if (_L_ReloadBar == null) _L_ReloadBar = new ReloadBar((RoomUIPanel)this, GetNode("ReloadBar")); return _L_ReloadBar; } } - private RoomUI_ReloadBar _L_ReloadBar; + private ReloadBar _L_ReloadBar; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control /// - public RoomUI_Control L_Control + public Control L_Control { get { - if (_L_Control == null) _L_Control = new RoomUI_Control(this, GetNodeOrNull("Control")); + if (_L_Control == null) _L_Control = new Control((RoomUIPanel)this, GetNode("Control")); return _L_Control; } } - private RoomUI_Control _L_Control; + private Control _L_Control; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.RoomMap + /// + public RoomMap L_RoomMap + { + get + { + if (_L_RoomMap == null) _L_RoomMap = new RoomMap((RoomUIPanel)this, GetNode("RoomMap")); + return _L_RoomMap; + } + } + private RoomMap _L_RoomMap; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Mask + /// + public Mask L_Mask + { + get + { + if (_L_Mask == null) _L_Mask = new Mask((RoomUIPanel)this, GetNode("Mask")); + return _L_Mask; + } + } + private Mask _L_Mask; public RoomUI() : base(nameof(RoomUI)) { } + public sealed override void OnInitNestedUi() + { + + var inst1 = this; + RecordNestedUi(inst1.L_RoomMap.Instance, null, UiManager.RecordType.Open); + inst1.L_RoomMap.Instance.OnCreateUi(); + inst1.L_RoomMap.Instance.OnInitNestedUi(); + + } + /// /// 类型: , 路径: RoomUI.InteractiveTipBar.Icon /// - public class RoomUI_Icon : UiNode + public class Icon : UiNode { - public RoomUI_Icon(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_Icon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public Icon(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override Icon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.InteractiveTipBar.InteractiveIcon /// - public class RoomUI_InteractiveIcon : UiNode + public class InteractiveIcon : UiNode { - public RoomUI_InteractiveIcon(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_InteractiveIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public InteractiveIcon(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override InteractiveIcon Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.InteractiveTipBar.Line2D /// - public class RoomUI_Line2D : UiNode + public class Line2D : UiNode { - public RoomUI_Line2D(RoomUI uiPanel, Godot.Line2D node) : base(uiPanel, node) { } - public override RoomUI_Line2D Clone() => new (UiPanel, (Godot.Line2D)Instance.Duplicate()); + public Line2D(RoomUIPanel uiPanel, Godot.Line2D node) : base(uiPanel, node) { } + public override Line2D Clone() => new (UiPanel, (Godot.Line2D)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.InteractiveTipBar.NameLabel /// - public class RoomUI_NameLabel : UiNode + public class NameLabel : UiNode { - public RoomUI_NameLabel(RoomUI uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override RoomUI_NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public NameLabel(RoomUIPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override NameLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.InteractiveTipBar /// - public class RoomUI_InteractiveTipBar : UiNode + public class InteractiveTipBar : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Icon /// - public RoomUI_Icon L_Icon + public Icon L_Icon { get { - if (_L_Icon == null) _L_Icon = new RoomUI_Icon(UiPanel, Instance.GetNodeOrNull("Icon")); + if (_L_Icon == null) _L_Icon = new Icon(UiPanel, Instance.GetNode("Icon")); return _L_Icon; } } - private RoomUI_Icon _L_Icon; + private Icon _L_Icon; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.InteractiveIcon /// - public RoomUI_InteractiveIcon L_InteractiveIcon + public InteractiveIcon L_InteractiveIcon { get { - if (_L_InteractiveIcon == null) _L_InteractiveIcon = new RoomUI_InteractiveIcon(UiPanel, Instance.GetNodeOrNull("InteractiveIcon")); + if (_L_InteractiveIcon == null) _L_InteractiveIcon = new InteractiveIcon(UiPanel, Instance.GetNode("InteractiveIcon")); return _L_InteractiveIcon; } } - private RoomUI_InteractiveIcon _L_InteractiveIcon; + private InteractiveIcon _L_InteractiveIcon; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Line2D /// - public RoomUI_Line2D L_Line2D + public Line2D L_Line2D { get { - if (_L_Line2D == null) _L_Line2D = new RoomUI_Line2D(UiPanel, Instance.GetNodeOrNull("Line2D")); + if (_L_Line2D == null) _L_Line2D = new Line2D(UiPanel, Instance.GetNode("Line2D")); return _L_Line2D; } } - private RoomUI_Line2D _L_Line2D; + private Line2D _L_Line2D; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.NameLabel /// - public RoomUI_NameLabel L_NameLabel + public NameLabel L_NameLabel { get { - if (_L_NameLabel == null) _L_NameLabel = new RoomUI_NameLabel(UiPanel, Instance.GetNodeOrNull("NameLabel")); + if (_L_NameLabel == null) _L_NameLabel = new NameLabel(UiPanel, Instance.GetNode("NameLabel")); return _L_NameLabel; } } - private RoomUI_NameLabel _L_NameLabel; + private NameLabel _L_NameLabel; - public RoomUI_InteractiveTipBar(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_InteractiveTipBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + public InteractiveTipBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override InteractiveTipBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.ReloadBar.Slot.Block /// - public class RoomUI_Block : UiNode + public class Block : UiNode { - public RoomUI_Block(RoomUI uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } - public override RoomUI_Block Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + public Block(RoomUIPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override Block Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.ReloadBar.Slot /// - public class RoomUI_Slot : UiNode + public class Slot : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.ReloadBar.Block /// - public RoomUI_Block L_Block + public Block L_Block { get { - if (_L_Block == null) _L_Block = new RoomUI_Block(UiPanel, Instance.GetNodeOrNull("Block")); + if (_L_Block == null) _L_Block = new Block(UiPanel, Instance.GetNode("Block")); return _L_Block; } } - private RoomUI_Block _L_Block; + private Block _L_Block; - public RoomUI_Slot(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_Slot Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public Slot(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override Slot Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.ReloadBar /// - public class RoomUI_ReloadBar : UiNode + public class ReloadBar : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Slot /// - public RoomUI_Slot L_Slot + public Slot L_Slot { get { - if (_L_Slot == null) _L_Slot = new RoomUI_Slot(UiPanel, Instance.GetNodeOrNull("Slot")); + if (_L_Slot == null) _L_Slot = new Slot(UiPanel, Instance.GetNode("Slot")); return _L_Slot; } } - private RoomUI_Slot _L_Slot; + private Slot _L_Slot; - public RoomUI_ReloadBar(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_ReloadBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + public ReloadBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override ReloadBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.LifeBar.Life /// - public class RoomUI_Life : UiNode + public class Life : UiNode { - public RoomUI_Life(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_Life Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public Life(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override Life Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.LifeBar /// - public class RoomUI_LifeBar : UiNode + public class LifeBar : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.Life /// - public RoomUI_Life L_Life + public Life L_Life { get { - if (_L_Life == null) _L_Life = new RoomUI_Life(UiPanel, Instance.GetNodeOrNull("Life")); + if (_L_Life == null) _L_Life = new Life(UiPanel, Instance.GetNode("Life")); return _L_Life; } } - private RoomUI_Life _L_Life; + private Life _L_Life; - public RoomUI_LifeBar(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_LifeBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: RoomUI.Control.MapBar - /// - public class RoomUI_MapBar : UiNode - { - public RoomUI_MapBar(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_MapBar Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public LifeBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override LifeBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ActivePropBg /// - public class RoomUI_ActivePropBg : UiNode + public class ActivePropBg : UiNode { - public RoomUI_ActivePropBg(RoomUI uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } - public override RoomUI_ActivePropBg Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + public ActivePropBg(RoomUIPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override ActivePropBg Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ActivePropSprite /// - public class RoomUI_ActivePropSprite : UiNode + public class ActivePropSprite : UiNode { - public RoomUI_ActivePropSprite(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_ActivePropSprite Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public ActivePropSprite(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override ActivePropSprite Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.CooldownProgress /// - public class RoomUI_CooldownProgress : UiNode + public class CooldownProgress : UiNode { - public RoomUI_CooldownProgress(RoomUI uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } - public override RoomUI_CooldownProgress Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + public CooldownProgress(RoomUIPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override CooldownProgress Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ActivePropCount /// - public class RoomUI_ActivePropCount : UiNode + public class ActivePropCount : UiNode { - public RoomUI_ActivePropCount(RoomUI uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override RoomUI_ActivePropCount Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public ActivePropCount(RoomUIPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override ActivePropCount Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ActivePropPanel /// - public class RoomUI_ActivePropPanel : UiNode + public class ActivePropPanel : UiNode { - public RoomUI_ActivePropPanel(RoomUI uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } - public override RoomUI_ActivePropPanel Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + public ActivePropPanel(RoomUIPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override ActivePropPanel Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ChargeProgressBar /// - public class RoomUI_ChargeProgressBar : UiNode + public class ChargeProgressBar : UiNode { - public RoomUI_ChargeProgressBar(RoomUI uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } - public override RoomUI_ChargeProgressBar Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + public ChargeProgressBar(RoomUIPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override ChargeProgressBar Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar.ChargeProgress /// - public class RoomUI_ChargeProgress : UiNode + public class ChargeProgress : UiNode { - public RoomUI_ChargeProgress(RoomUI uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } - public override RoomUI_ChargeProgress Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + public ChargeProgress(RoomUIPanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override ChargeProgress Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.ActivePropBar /// - public class RoomUI_ActivePropBar : UiNode + public class ActivePropBar : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ActivePropBg /// - public RoomUI_ActivePropBg L_ActivePropBg + public ActivePropBg L_ActivePropBg { get { - if (_L_ActivePropBg == null) _L_ActivePropBg = new RoomUI_ActivePropBg(UiPanel, Instance.GetNodeOrNull("ActivePropBg")); + if (_L_ActivePropBg == null) _L_ActivePropBg = new ActivePropBg(UiPanel, Instance.GetNode("ActivePropBg")); return _L_ActivePropBg; } } - private RoomUI_ActivePropBg _L_ActivePropBg; + private ActivePropBg _L_ActivePropBg; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ActivePropSprite /// - public RoomUI_ActivePropSprite L_ActivePropSprite + public ActivePropSprite L_ActivePropSprite { get { - if (_L_ActivePropSprite == null) _L_ActivePropSprite = new RoomUI_ActivePropSprite(UiPanel, Instance.GetNodeOrNull("ActivePropSprite")); + if (_L_ActivePropSprite == null) _L_ActivePropSprite = new ActivePropSprite(UiPanel, Instance.GetNode("ActivePropSprite")); return _L_ActivePropSprite; } } - private RoomUI_ActivePropSprite _L_ActivePropSprite; + private ActivePropSprite _L_ActivePropSprite; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.CooldownProgress /// - public RoomUI_CooldownProgress L_CooldownProgress + public CooldownProgress L_CooldownProgress { get { - if (_L_CooldownProgress == null) _L_CooldownProgress = new RoomUI_CooldownProgress(UiPanel, Instance.GetNodeOrNull("CooldownProgress")); + if (_L_CooldownProgress == null) _L_CooldownProgress = new CooldownProgress(UiPanel, Instance.GetNode("CooldownProgress")); return _L_CooldownProgress; } } - private RoomUI_CooldownProgress _L_CooldownProgress; + private CooldownProgress _L_CooldownProgress; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ActivePropCount /// - public RoomUI_ActivePropCount L_ActivePropCount + public ActivePropCount L_ActivePropCount { get { - if (_L_ActivePropCount == null) _L_ActivePropCount = new RoomUI_ActivePropCount(UiPanel, Instance.GetNodeOrNull("ActivePropCount")); + if (_L_ActivePropCount == null) _L_ActivePropCount = new ActivePropCount(UiPanel, Instance.GetNode("ActivePropCount")); return _L_ActivePropCount; } } - private RoomUI_ActivePropCount _L_ActivePropCount; + private ActivePropCount _L_ActivePropCount; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ActivePropPanel /// - public RoomUI_ActivePropPanel L_ActivePropPanel + public ActivePropPanel L_ActivePropPanel { get { - if (_L_ActivePropPanel == null) _L_ActivePropPanel = new RoomUI_ActivePropPanel(UiPanel, Instance.GetNodeOrNull("ActivePropPanel")); + if (_L_ActivePropPanel == null) _L_ActivePropPanel = new ActivePropPanel(UiPanel, Instance.GetNode("ActivePropPanel")); return _L_ActivePropPanel; } } - private RoomUI_ActivePropPanel _L_ActivePropPanel; + private ActivePropPanel _L_ActivePropPanel; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ChargeProgressBar /// - public RoomUI_ChargeProgressBar L_ChargeProgressBar + public ChargeProgressBar L_ChargeProgressBar { get { - if (_L_ChargeProgressBar == null) _L_ChargeProgressBar = new RoomUI_ChargeProgressBar(UiPanel, Instance.GetNodeOrNull("ChargeProgressBar")); + if (_L_ChargeProgressBar == null) _L_ChargeProgressBar = new ChargeProgressBar(UiPanel, Instance.GetNode("ChargeProgressBar")); return _L_ChargeProgressBar; } } - private RoomUI_ChargeProgressBar _L_ChargeProgressBar; + private ChargeProgressBar _L_ChargeProgressBar; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.ChargeProgress /// - public RoomUI_ChargeProgress L_ChargeProgress + public ChargeProgress L_ChargeProgress { get { - if (_L_ChargeProgress == null) _L_ChargeProgress = new RoomUI_ChargeProgress(UiPanel, Instance.GetNodeOrNull("ChargeProgress")); + if (_L_ChargeProgress == null) _L_ChargeProgress = new ChargeProgress(UiPanel, Instance.GetNode("ChargeProgress")); return _L_ChargeProgress; } } - private RoomUI_ChargeProgress _L_ChargeProgress; + private ChargeProgress _L_ChargeProgress; - public RoomUI_ActivePropBar(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_ActivePropBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + public ActivePropBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override ActivePropBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.WeaponBar.WeaponPanel.WeaponSprite /// - public class RoomUI_WeaponSprite : UiNode + public class WeaponSprite : UiNode { - public RoomUI_WeaponSprite(RoomUI uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } - public override RoomUI_WeaponSprite Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + public WeaponSprite(RoomUIPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override WeaponSprite Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.WeaponBar.WeaponPanel /// - public class RoomUI_WeaponPanel : UiNode + public class WeaponPanel : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.WeaponBar.WeaponSprite /// - public RoomUI_WeaponSprite L_WeaponSprite + public WeaponSprite L_WeaponSprite { get { - if (_L_WeaponSprite == null) _L_WeaponSprite = new RoomUI_WeaponSprite(UiPanel, Instance.GetNodeOrNull("WeaponSprite")); + if (_L_WeaponSprite == null) _L_WeaponSprite = new WeaponSprite(UiPanel, Instance.GetNode("WeaponSprite")); return _L_WeaponSprite; } } - private RoomUI_WeaponSprite _L_WeaponSprite; + private WeaponSprite _L_WeaponSprite; - public RoomUI_WeaponPanel(RoomUI uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } - public override RoomUI_WeaponPanel Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); + public WeaponPanel(RoomUIPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public override WeaponPanel Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.WeaponBar.AmmoCount /// - public class RoomUI_AmmoCount : UiNode + public class AmmoCount : UiNode { - public RoomUI_AmmoCount(RoomUI uiPanel, Godot.Label node) : base(uiPanel, node) { } - public override RoomUI_AmmoCount Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + public AmmoCount(RoomUIPanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override AmmoCount Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control.WeaponBar /// - public class RoomUI_WeaponBar : UiNode + public class WeaponBar : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.WeaponPanel /// - public RoomUI_WeaponPanel L_WeaponPanel + public WeaponPanel L_WeaponPanel { get { - if (_L_WeaponPanel == null) _L_WeaponPanel = new RoomUI_WeaponPanel(UiPanel, Instance.GetNodeOrNull("WeaponPanel")); + if (_L_WeaponPanel == null) _L_WeaponPanel = new WeaponPanel(UiPanel, Instance.GetNode("WeaponPanel")); return _L_WeaponPanel; } } - private RoomUI_WeaponPanel _L_WeaponPanel; + private WeaponPanel _L_WeaponPanel; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Control.AmmoCount /// - public RoomUI_AmmoCount L_AmmoCount + public AmmoCount L_AmmoCount { get { - if (_L_AmmoCount == null) _L_AmmoCount = new RoomUI_AmmoCount(UiPanel, Instance.GetNodeOrNull("AmmoCount")); + if (_L_AmmoCount == null) _L_AmmoCount = new AmmoCount(UiPanel, Instance.GetNode("AmmoCount")); return _L_AmmoCount; } } - private RoomUI_AmmoCount _L_AmmoCount; + private AmmoCount _L_AmmoCount; - public RoomUI_WeaponBar(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_WeaponBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + public WeaponBar(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override WeaponBar Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: RoomUI.Control /// - public class RoomUI_Control : UiNode + public class Control : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.LifeBar /// - public RoomUI_LifeBar L_LifeBar + public LifeBar L_LifeBar { get { - if (_L_LifeBar == null) _L_LifeBar = new RoomUI_LifeBar(UiPanel, Instance.GetNodeOrNull("LifeBar")); + if (_L_LifeBar == null) _L_LifeBar = new LifeBar(UiPanel, Instance.GetNode("LifeBar")); return _L_LifeBar; } } - private RoomUI_LifeBar _L_LifeBar; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.MapBar - /// - public RoomUI_MapBar L_MapBar - { - get - { - if (_L_MapBar == null) _L_MapBar = new RoomUI_MapBar(UiPanel, Instance.GetNodeOrNull("MapBar")); - return _L_MapBar; - } - } - private RoomUI_MapBar _L_MapBar; + private LifeBar _L_LifeBar; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.ActivePropBar /// - public RoomUI_ActivePropBar L_ActivePropBar + public ActivePropBar L_ActivePropBar { get { - if (_L_ActivePropBar == null) _L_ActivePropBar = new RoomUI_ActivePropBar(UiPanel, Instance.GetNodeOrNull("ActivePropBar")); + if (_L_ActivePropBar == null) _L_ActivePropBar = new ActivePropBar(UiPanel, Instance.GetNode("ActivePropBar")); return _L_ActivePropBar; } } - private RoomUI_ActivePropBar _L_ActivePropBar; + private ActivePropBar _L_ActivePropBar; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.WeaponBar /// - public RoomUI_WeaponBar L_WeaponBar + public WeaponBar L_WeaponBar { get { - if (_L_WeaponBar == null) _L_WeaponBar = new RoomUI_WeaponBar(UiPanel, Instance.GetNodeOrNull("WeaponBar")); + if (_L_WeaponBar == null) _L_WeaponBar = new WeaponBar(UiPanel, Instance.GetNode("WeaponBar")); return _L_WeaponBar; } } - private RoomUI_WeaponBar _L_WeaponBar; + private WeaponBar _L_WeaponBar; - public RoomUI_Control(RoomUI uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override RoomUI_Control Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + public Control(RoomUIPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Control Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: RoomUI.RoomMap + /// + public class RoomMap : UiNode + { + public RoomMap(RoomUIPanel uiPanel, UI.RoomMap.RoomMapPanel node) : base(uiPanel, node) { } + public override RoomMap Clone() + { + var uiNode = new RoomMap(UiPanel, (UI.RoomMap.RoomMapPanel)Instance.Duplicate()); + UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open); + uiNode.Instance.OnCreateUi(); + uiNode.Instance.OnInitNestedUi(); + return uiNode; + } + } + + /// + /// 类型: , 路径: RoomUI.Mask + /// + public class Mask : UiNode + { + public Mask(RoomUIPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Mask Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); } /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.Icon /// - public RoomUI_Icon S_Icon => L_InteractiveTipBar.L_Icon; + public Icon S_Icon => L_InteractiveTipBar.L_Icon; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.InteractiveIcon /// - public RoomUI_InteractiveIcon S_InteractiveIcon => L_InteractiveTipBar.L_InteractiveIcon; + public InteractiveIcon S_InteractiveIcon => L_InteractiveTipBar.L_InteractiveIcon; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.Line2D /// - public RoomUI_Line2D S_Line2D => L_InteractiveTipBar.L_Line2D; + public Line2D S_Line2D => L_InteractiveTipBar.L_Line2D; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.NameLabel /// - public RoomUI_NameLabel S_NameLabel => L_InteractiveTipBar.L_NameLabel; + public NameLabel S_NameLabel => L_InteractiveTipBar.L_NameLabel; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.InteractiveTipBar /// - public RoomUI_InteractiveTipBar S_InteractiveTipBar => L_InteractiveTipBar; + public InteractiveTipBar S_InteractiveTipBar => L_InteractiveTipBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.ReloadBar.Slot.Block /// - public RoomUI_Block S_Block => L_ReloadBar.L_Slot.L_Block; + public Block S_Block => L_ReloadBar.L_Slot.L_Block; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.ReloadBar.Slot /// - public RoomUI_Slot S_Slot => L_ReloadBar.L_Slot; + public Slot S_Slot => L_ReloadBar.L_Slot; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.ReloadBar /// - public RoomUI_ReloadBar S_ReloadBar => L_ReloadBar; + public ReloadBar S_ReloadBar => L_ReloadBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar.Life /// - public RoomUI_Life S_Life => L_Control.L_LifeBar.L_Life; + public Life S_Life => L_Control.L_LifeBar.L_Life; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.LifeBar /// - public RoomUI_LifeBar S_LifeBar => L_Control.L_LifeBar; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.MapBar - /// - public RoomUI_MapBar S_MapBar => L_Control.L_MapBar; + public LifeBar S_LifeBar => L_Control.L_LifeBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ActivePropBg /// - public RoomUI_ActivePropBg S_ActivePropBg => L_Control.L_ActivePropBar.L_ActivePropBg; + public ActivePropBg S_ActivePropBg => L_Control.L_ActivePropBar.L_ActivePropBg; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ActivePropSprite /// - public RoomUI_ActivePropSprite S_ActivePropSprite => L_Control.L_ActivePropBar.L_ActivePropSprite; + public ActivePropSprite S_ActivePropSprite => L_Control.L_ActivePropBar.L_ActivePropSprite; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.CooldownProgress /// - public RoomUI_CooldownProgress S_CooldownProgress => L_Control.L_ActivePropBar.L_CooldownProgress; + public CooldownProgress S_CooldownProgress => L_Control.L_ActivePropBar.L_CooldownProgress; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ActivePropCount /// - public RoomUI_ActivePropCount S_ActivePropCount => L_Control.L_ActivePropBar.L_ActivePropCount; + public ActivePropCount S_ActivePropCount => L_Control.L_ActivePropBar.L_ActivePropCount; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ActivePropPanel /// - public RoomUI_ActivePropPanel S_ActivePropPanel => L_Control.L_ActivePropBar.L_ActivePropPanel; + public ActivePropPanel S_ActivePropPanel => L_Control.L_ActivePropBar.L_ActivePropPanel; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ChargeProgressBar /// - public RoomUI_ChargeProgressBar S_ChargeProgressBar => L_Control.L_ActivePropBar.L_ChargeProgressBar; + public ChargeProgressBar S_ChargeProgressBar => L_Control.L_ActivePropBar.L_ChargeProgressBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar.ChargeProgress /// - public RoomUI_ChargeProgress S_ChargeProgress => L_Control.L_ActivePropBar.L_ChargeProgress; + public ChargeProgress S_ChargeProgress => L_Control.L_ActivePropBar.L_ChargeProgress; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.ActivePropBar /// - public RoomUI_ActivePropBar S_ActivePropBar => L_Control.L_ActivePropBar; + public ActivePropBar S_ActivePropBar => L_Control.L_ActivePropBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.WeaponBar.WeaponPanel.WeaponSprite /// - public RoomUI_WeaponSprite S_WeaponSprite => L_Control.L_WeaponBar.L_WeaponPanel.L_WeaponSprite; + public WeaponSprite S_WeaponSprite => L_Control.L_WeaponBar.L_WeaponPanel.L_WeaponSprite; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.WeaponBar.WeaponPanel /// - public RoomUI_WeaponPanel S_WeaponPanel => L_Control.L_WeaponBar.L_WeaponPanel; + public WeaponPanel S_WeaponPanel => L_Control.L_WeaponBar.L_WeaponPanel; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.WeaponBar.AmmoCount /// - public RoomUI_AmmoCount S_AmmoCount => L_Control.L_WeaponBar.L_AmmoCount; + public AmmoCount S_AmmoCount => L_Control.L_WeaponBar.L_AmmoCount; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control.WeaponBar /// - public RoomUI_WeaponBar S_WeaponBar => L_Control.L_WeaponBar; + public WeaponBar S_WeaponBar => L_Control.L_WeaponBar; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Control /// - public RoomUI_Control S_Control => L_Control; + public Control S_Control => L_Control; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.RoomMap + /// + public RoomMap S_RoomMap => L_RoomMap; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: RoomUI.Mask + /// + public Mask S_Mask => L_Mask; } diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs index 56f26c3..fe8d33e 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs @@ -8,21 +8,21 @@ /// public partial class RoomUIPanel : RoomUI { - private ReloadBar _reloadBar; - private InteractiveTipBar _interactiveTipBar; - private WeaponBar _weaponBar; - private ActivePropBar _activePropBar; - private LifeBar _lifeBar; + private ReloadBarHandler _reloadBar; + private InteractiveTipBarHandler _interactiveTipBar; + private WeaponBarHandler _weaponBar; + private ActivePropBarHandler _activePropBar; + private LifeBarHandler _lifeBar; private EventFactory _factory; public override void OnCreateUi() { - _reloadBar = new ReloadBar(L_ReloadBar); - _interactiveTipBar = new InteractiveTipBar(L_InteractiveTipBar); - _weaponBar = new WeaponBar(L_Control.L_WeaponBar); - _activePropBar = new ActivePropBar(L_Control.L_ActivePropBar); - _lifeBar = new LifeBar(L_Control.L_LifeBar); + _reloadBar = new ReloadBarHandler(L_ReloadBar); + _interactiveTipBar = new InteractiveTipBarHandler(L_InteractiveTipBar); + _weaponBar = new WeaponBarHandler(L_Control.L_WeaponBar); + _activePropBar = new ActivePropBarHandler(L_Control.L_ActivePropBar); + _lifeBar = new LifeBarHandler(L_Control.L_LifeBar); } public override void OnShowUi() @@ -60,7 +60,7 @@ private void OnPlayerPickUpProp(object propObj) { var prop = (Prop)propObj; - var message = $"{prop.ItemConfig.Name}\n{prop.ItemConfig.Intro}"; + var message = $"{prop.ActivityBase.Name}\n{prop.ActivityBase.Intro}"; BottomTipsPanel.ShowTips(prop.GetDefaultTexture(), message); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBar.cs b/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBar.cs deleted file mode 100644 index 01423cf..0000000 --- a/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBar.cs +++ /dev/null @@ -1,71 +0,0 @@ -using Godot; - -namespace UI.RoomUI; - -public class WeaponBar -{ - private RoomUI.RoomUI_WeaponBar _weaponBar; - - private int _prevAmmo = -1; - private int _prevResidue = -1; - - public WeaponBar(RoomUI.RoomUI_WeaponBar weaponBar) - { - _weaponBar = weaponBar; - SetWeaponTexture(null); - } - - public void OnShow() - { - } - - public void OnHide() - { - } - - public void Process(float delta) - { - var weapon = Player.Current?.WeaponPack.ActiveItem; - if (weapon != null) - { - SetWeaponTexture(weapon.GetCurrentTexture()); - SetWeaponAmmunition(weapon.CurrAmmo, weapon.ResidueAmmo); - } - else - { - SetWeaponTexture(null); - } - } - - /// - /// 设置显示在 ui 上武器的纹理 - /// - /// 纹理 - public void SetWeaponTexture(Texture2D texture) - { - if (texture != null) - { - _weaponBar.L_WeaponPanel.L_WeaponSprite.Instance.Texture = texture; - _weaponBar.Instance.Visible = true; - } - else - { - _weaponBar.Instance.Visible = false; - } - } - - /// - /// 设置弹药数据 - /// - /// 当前弹夹弹药量 - /// 剩余弹药总数 - public void SetWeaponAmmunition(int curr, int total) - { - if (curr != _prevAmmo || total != _prevResidue) - { - _weaponBar.L_AmmoCount.Instance.Text = curr + " / " + total; - _prevAmmo = curr; - _prevResidue = total; - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBarHandler.cs b/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBarHandler.cs new file mode 100644 index 0000000..0c8a67e --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/roomUI/WeaponBarHandler.cs @@ -0,0 +1,71 @@ +using Godot; + +namespace UI.RoomUI; + +public class WeaponBarHandler +{ + private RoomUI.WeaponBar _weaponBar; + + private int _prevAmmo = -1; + private int _prevResidue = -1; + + public WeaponBarHandler(RoomUI.WeaponBar weaponBar) + { + _weaponBar = weaponBar; + SetWeaponTexture(null); + } + + public void OnShow() + { + } + + public void OnHide() + { + } + + public void Process(float delta) + { + var weapon = Player.Current?.WeaponPack.ActiveItem; + if (weapon != null) + { + SetWeaponTexture(weapon.GetCurrentTexture()); + SetWeaponAmmunition(weapon.CurrAmmo, weapon.ResidueAmmo); + } + else + { + SetWeaponTexture(null); + } + } + + /// + /// 设置显示在 ui 上武器的纹理 + /// + /// 纹理 + public void SetWeaponTexture(Texture2D texture) + { + if (texture != null) + { + _weaponBar.L_WeaponPanel.L_WeaponSprite.Instance.Texture = texture; + _weaponBar.Instance.Visible = true; + } + else + { + _weaponBar.Instance.Visible = false; + } + } + + /// + /// 设置弹药数据 + /// + /// 当前弹夹弹药量 + /// 剩余弹药总数 + public void SetWeaponAmmunition(int curr, int total) + { + if (curr != _prevAmmo || total != _prevResidue) + { + _weaponBar.L_AmmoCount.Instance.Text = curr + " / " + total; + _prevAmmo = curr; + _prevResidue = total; + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/test/TestGridData.cs b/DungeonShooting_Godot/src/test/TestGridData.cs index b7db7cb..6049363 100644 --- a/DungeonShooting_Godot/src/test/TestGridData.cs +++ b/DungeonShooting_Godot/src/test/TestGridData.cs @@ -57,7 +57,7 @@ Debug.Log("TestGrid设置值用时: " + (DateTime.Now - time).Milliseconds); time = DateTime.Now; - var testGrid2 = new Grid(); + var testGrid2 = new InfiniteGrid(); for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) diff --git a/DungeonShooting_Godot/src/test/TestMask.cs b/DungeonShooting_Godot/src/test/TestMask.cs new file mode 100644 index 0000000..2954320 --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestMask.cs @@ -0,0 +1,207 @@ +using Godot; +using System; +using System.Collections.Generic; +using System.Linq; +using Godot.Collections; + +public partial class TestMask : Node2D +{ + [Export] + public Polygon2D PolygonNode; + + public List Result = new List(); + public override void _Ready() + { + //Geometry2D. + // var point = new Vector2[] + // { + // new Vector2(0, 0), + // new Vector2(0, 500), + // new Vector2(500, 500), + // new Vector2(500, 0) + // }; + // Result = Geometry2D.ClipPolygons(point, new Vector2[] + // { + // new Vector2(20, 20), + // new Vector2(20, 100), + // new Vector2(90, 50), + // }); + //PolygonNode.Polygon = clipPolygons[0]; + } + + public override void _Process(double delta) + { + //if (Input.IsActionJustPressed("fire")) + if (Input.IsActionPressed("fire") || Input.IsActionJustPressed("roll")) + { + var time = DateTime.Now; + RunTest(); + Debug.Log("用时: " + (DateTime.Now - time).TotalMilliseconds); + } + + if (Input.IsActionJustPressed("meleeAttack")) + { + for (var i = 0; i < Result.Count; i++) + { + var temp = Result[i]; + Result[i] = StreamlineVertices3(temp, 10, Mathf.DegToRad(15)); + Debug.Log($"优化前: {temp.Length}, 优化后: {Result[i].Length}"); + } + } + + if (Input.IsActionJustPressed("exchangeWeapon")) + { + Result.Clear(); + } + QueueRedraw(); + } + + private void RunTest() + { + var position = GetGlobalMousePosition(); + var circle = GetCircle(position, 50, 10); + //先检测有没有碰撞 + var flag = false; + for (var i = 0; i < Result.Count; i++) + { + var p = Result[i]; + if (CollisionPolygon(p, circle)) + { + flag = true; + var mergePolygons = Geometry2D.MergePolygons(p, circle); + Result.RemoveAt(i); + for (var j = 0; j < mergePolygons.Count; j++) + { + Result.Add(mergePolygons[j]); + //Result.Add(StreamlineVertices(mergePolygons[j], 50)); + //Result.Add(StreamlineVertices2(mergePolygons[j], Mathf.DegToRad(5))); + //Result.Add(StreamlineVertices3(mergePolygons[j], 20, Mathf.DegToRad(15))); + } + break; + } + } + + if (!flag) + { + Result.Add(circle); + //Result.Add(StreamlineVertices2(circle, Mathf.DegToRad(5))); + } + } + + private Vector2[] StreamlineVertices3(Vector2[] polygon, float d, float r) + { + if (polygon.Length <= 3) + { + return polygon; + } + + float v = d * d; + List list = new List(); + Vector2 tempPoint = polygon[0]; + Vector2 tempPoint2 = polygon[1]; + list.Add(tempPoint); + float tr = tempPoint.AngleToPoint(tempPoint2); + float delta = 0; + for (var i = 1; i < polygon.Length; i++) + { + var curr = polygon[i]; + var prev = polygon[i > 0 ? i - 1 : polygon.Length - 1]; + var next = polygon[i < polygon.Length - 1 ? i + 1 : 0]; + if (prev.DistanceSquaredTo(next) > v) + { + //list.Add(curr); + + var angle = curr.AngleToPoint(next); + delta += angle - tr; + if (Mathf.Abs(delta) >= r) + { + Debug.Log(i + ", 偏差角度: " + Mathf.RadToDeg(delta)); + tr = angle; + delta = 0; + //var result = Geometry2D.GetClosestPointToSegmentUncapped(curr, tempPoint, tempPoint2); + tempPoint = curr; + //tempPoint2 = next; + list.Add(tempPoint); + } + } + } + + return list.ToArray(); + } + + private bool CollisionPolygon(Vector2[] polygon1, Vector2[] polygon2) + { + for (int shape = 0; shape < 2; shape++) + { + if (shape == 1) + { + Vector2[] tmp = polygon1; + polygon1 = polygon2; + polygon2 = tmp; + } + + for (int a = 0; a < polygon1.Length; a++) + { + int b = (a + 1) % polygon1.Length; + float axisX = -(polygon1[b].Y - polygon1[a].Y); + float axisY = polygon1[b].X - polygon1[a].X; + + float mina = float.MaxValue; + float maxa = float.MinValue; + for (int p = 0; p < polygon1.Length; p++) + { + float t = polygon1[p].X * axisX + polygon1[p].Y * axisY; + mina = Math.Min(mina, t); + maxa = Math.Max(maxa, t); + } + + float minb = float.MaxValue; + float maxb = float.MinValue; + for (int p = 0; p < polygon2.Length; p++) + { + float t = polygon2[p].X * axisX + polygon2[p].Y * axisY; + minb = Math.Min(minb, t); + maxb = Math.Max(maxb, t); + } + + if (maxa < minb || mina > maxb) + return false; + } + } + + return true; + } + + private Vector2[] GetCircle(Vector2 position, float radius, int vertexCount) + { + Vector2[] vertices = new Vector2[vertexCount]; + + for (int i = 0; i < vertexCount; i++) + { + float angle = i * 2.0f * (float)Math.PI / vertexCount; + Vector2 vertex = position + new Vector2((float)Math.Cos(angle) * radius, (float)Math.Sin(angle) * radius); + vertices[i] = vertex; + } + + return vertices; + } + + public override void _Draw() + { + if (Result != null) + { + foreach (var vector2s in Result) + { + var list = vector2s.ToList(); + list.Add(vector2s[0]); + DrawPolyline(list.ToArray(), Colors.Red); + foreach (var vector2 in list) + { + DrawCircle(vector2, 2, Colors.Green); + } + } + //DrawColoredPolygon(Result[1], Colors.Red); + } + + } +} diff --git a/DungeonShooting_Godot/src/test/TestMask2.cs b/DungeonShooting_Godot/src/test/TestMask2.cs new file mode 100644 index 0000000..1207a6f --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestMask2.cs @@ -0,0 +1,57 @@ +using Godot; +using System; +using System.Collections.Generic; +using Config; + +public partial class TestMask2 : SubViewportContainer +{ + + [Export] + public Label Message; + + [Export] + public Node2D Player; + + [Export] + public Texture2D Brush1; + [Export] + public Texture2D Brush2; + + private BrushImageData _brushData1; + private BrushImageData _brushData2; + + private Vector2I? _prevPosition = null; + + private LiquidCanvas _liquidCanvas; + + public override void _Ready() + { + Engine.MaxFps = (int)DisplayServer.ScreenGetRefreshRate(); + //Engine.MaxFps = 5; + _brushData1 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0001"]); + _brushData2 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0002"]); + _liquidCanvas = new LiquidCanvas(null, (int)(Size.X / LiquidCanvas.CanvasScale), (int)(Size.X / LiquidCanvas.CanvasScale)); + GetNode("SubViewport").AddChild(_liquidCanvas); + } + + public override void _Process(double delta) + { + InputManager.Update((float)delta); + + //玩家移动 + Player.Position += InputManager.MoveAxis * 120 * (float)delta; + var pos = (Player.Position / LiquidCanvas.CanvasScale).AsVector2I(); + if (_prevPosition != null) + { + _liquidCanvas.DrawBrush(_brushData2, _prevPosition, pos, new Vector2(pos.X - _prevPosition.Value.X, pos.Y - _prevPosition.Value.Y).Angle()); + } + else + { + _liquidCanvas.DrawBrush(_brushData2, _prevPosition, pos, 0); + } + + //碰撞检测 + var mousePosition = (GetGlobalMousePosition() / (4 * LiquidCanvas.CanvasScale)).AsVector2I(); + Message.Text = "鼠标是否碰到毒液: " + _liquidCanvas.Collision(mousePosition.X, mousePosition.Y); + } +} diff --git a/DungeonShooting_Godot/src/test/TestPerfectPixelScene.cs b/DungeonShooting_Godot/src/test/TestPerfectPixelScene.cs new file mode 100644 index 0000000..1878e8a --- /dev/null +++ b/DungeonShooting_Godot/src/test/TestPerfectPixelScene.cs @@ -0,0 +1,81 @@ +using Godot; +using System; + +public partial class TestPerfectPixelScene : Node2D +{ + public enum HandlerType + { + UnHandler, + NormalHandler, + OffsetHandler + } + + [Export] + public CharacterBody2D Player; + + [Export] + public Label FpsLabel; + + [Export] + public Camera2D Camera2D; + + [Export] + public float Speed = 50; + + [Export] + public float CameraRecoveryScale = 5; + + [Export] + public SubViewportContainer SubViewportContainer; + + [Export] + public HandlerType Type; + + private ShaderMaterial _shaderMaterial; + private Vector2 _cameraPos; + + public override void _Ready() + { + if (SubViewportContainer != null) + { + _shaderMaterial = (ShaderMaterial)SubViewportContainer.Material; + } + } + + public override void _Process(double delta) + { + InputManager.Update((float)delta); + + + } + + public override void _PhysicsProcess(double delta) + { + FpsLabel.Text = "FPS: " + Engine.GetFramesPerSecond(); + Player.Velocity = InputManager.MoveAxis * Speed; + Player.MoveAndSlide(); + + var playerPos = Player.GlobalPosition; + //_cameraPos = playerPos; + _cameraPos = _cameraPos.MoveToward(playerPos, playerPos.DistanceTo(_cameraPos) * (float)delta * CameraRecoveryScale); + + if (Type == HandlerType.UnHandler) + { + Camera2D.GlobalPosition = _cameraPos; + } + else if (Type == HandlerType.NormalHandler) + { + Camera2D.GlobalPosition = _cameraPos.Round(); + } + else if (Type == HandlerType.OffsetHandler) + { + if (_shaderMaterial != null) + { + var cameraPosition = _cameraPos; + var offset = cameraPosition.Round() - cameraPosition; + _shaderMaterial.SetShaderParameter("offset", offset); + Camera2D.GlobalPosition = cameraPosition.Round(); + } + } + } +} diff --git a/README.md b/README.md index 0acf3f2..ddf21a1 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,6 @@ --- ### 其他 -**开发日志:** [开发日志.md](DungeonShooting_Document/开发日志.md) +**开发日志:** [开发日志.md](DungeonShooting_Document/开发日志.md) **哔哩哔哩:** https://space.bilibili.com/259437820 **项目Ui插件:** https://github.com/xlljc/Ds_Ui \ No newline at end of file