From ee69efe96532e83e7494ec16b5e76fc07ae7520a Mon Sep 17 00:00:00 2001 From: SepComet <202308010230@stu.csust.edu.cn> Date: Wed, 10 Jun 2026 08:49:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A9=E5=85=85=E6=B8=B8=E6=88=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E4=BF=9D=E6=8C=81=E6=95=8C=E4=BA=BA=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E8=A1=8C=E4=B8=BA=E4=B8=8D=E5=8F=98=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=BC=A9=E6=94=BE=E5=92=8C=E9=A2=9C=E8=89=B2=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E4=B8=8D=E5=90=8C=E6=95=8C=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- Assets/GameMain/DataTables/Enemy.txt | 16 +- Assets/GameMain/DataTables/Level.txt | 23 +- Assets/GameMain/Entities/BulletHandgun.prefab | 2 +- Assets/GameMain/Entities/MeleeEnemy.prefab | 50 +- Assets/GameMain/Entities/Player.prefab | 13 +- Assets/GameMain/Entities/RemoteEnemy.prefab | 48 +- Assets/GameMain/Materials/InstancingGrey.mat | 136 ---- .../Materials/InstancingGrey.mat.meta | 8 - Assets/GameMain/Scenes/Game.unity | 603 +++++++++++++++++- .../Scripts/Base/DataTable/DREnemy.cs | 23 +- .../Scripts/Base/Definition/Enum/EnemyType.cs | 5 + .../Base/Entity/EntityData/Enemy/EnemyData.cs | 4 + .../Entity/EntityLogic/Enemy/BatEnemy.cs | 6 + .../Entity/EntityLogic/Enemy/BatEnemy.cs.meta | 11 + .../Entity/EntityLogic/Enemy/EnemyBase.cs | 28 +- .../Entity/EntityLogic/Enemy/FireMageEnemy.cs | 6 + .../EntityLogic/Enemy/FireMageEnemy.cs.meta | 11 + .../Entity/EntityLogic/Enemy/GhostEnemy.cs | 6 + .../EntityLogic/Enemy/GhostEnemy.cs.meta | 11 + .../Entity/EntityLogic/Enemy/SkeletonEnemy.cs | 6 + .../EntityLogic/Enemy/SkeletonEnemy.cs.meta | 11 + .../EntityLogic/Enemy/SkeletonGiantEnemy.cs | 6 + .../Enemy/SkeletonGiantEnemy.cs.meta | 11 + 数据表/Entity/Enemy.xlsx | Bin 10841 -> 12750 bytes 数据表/Level.xlsx | Bin 10799 -> 12213 bytes 26 files changed, 812 insertions(+), 235 deletions(-) delete mode 100644 Assets/GameMain/Materials/InstancingGrey.mat delete mode 100644 Assets/GameMain/Materials/InstancingGrey.mat.meta create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs.meta create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs.meta create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs.meta create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs.meta create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs.meta diff --git a/.gitignore b/.gitignore index bd8d711..bdea508 100644 --- a/.gitignore +++ b/.gitignore @@ -91,4 +91,5 @@ Assets/GameMain/Configs/ResourceBuilder.xml /.dotnet /.omx /.vscode -/openspec/changes/archive \ No newline at end of file +/openspec/changes/archive +/.omc diff --git a/Assets/GameMain/DataTables/Enemy.txt b/Assets/GameMain/DataTables/Enemy.txt index be2eeb8..60d7698 100644 --- a/Assets/GameMain/DataTables/Enemy.txt +++ b/Assets/GameMain/DataTables/Enemy.txt @@ -1,6 +1,10 @@ -# 敌人基础属性表 -# Id EntityTypeId MaxHealth HpAddPerLevel AttackDamage AttackCooldown AttackRange Speed CoinDrop ExpDrop DropPercent Params -# int int int int int float float float int int float string -# 敌人编号 策划备注 实体编号 最大生命 每关卡增加生命 基础伤害 攻击间隔 攻击范围 移动速度 金币掉落 经验掉落 掉落概率 额外参数 - 1 近战敌人 101 50 50 1 1 1.5 3 5 1 0.3 [] - 2 远程敌人 102 40 40 1 2 8 2.5 4 2 0.2 [] +# Id 策划备注 EntityId MaxHealth HpAddPerLevel AttackDamage AttackCooldown AttackRange Speed CoinDrop ExpDrop DropPercent Scale Color Params +# int int int int int float float float int int float float string string +# 敌人编号 策划备注 实体编号 最大生命 每关卡增加生命 基础伤害 攻击间隔 攻击范围 移动速度 金币掉落 经验掉落 掉落概率 缩放 颜色 额外参数 + 1 近战敌人 101 50 50 1 1 1.5 3 5 1 0.3 1 #44FF44 [] + 2 远程敌人 102 40 40 1 2 8 2.5 4 2 0.2 1 #FF44FF [] + 3 蝙蝠(快) 101 20 15 1 0.8 1.2 6 3 1 0.4 0.5 #FF4444 [] + 4 骷髅兵(中) 101 80 60 2 1.2 1.8 2.5 6 2 0.3 1.3 #CCCCCC [] + 5 骷髅巨人(坦克) 101 200 120 3 2.5 2.5 1.5 10 3 0.25 2 #888888 [] + 6 幽灵(远程变体) 102 30 25 1 1.5 10 3 5 2 0.3 0.8 #88CCFF [] + 7 火焰法师(远程精英) 102 60 45 2 1 12 2 8 3 0.2 1.2 #FF8800 [] diff --git a/Assets/GameMain/DataTables/Level.txt b/Assets/GameMain/DataTables/Level.txt index 43a1f10..d2f8582 100644 --- a/Assets/GameMain/DataTables/Level.txt +++ b/Assets/GameMain/DataTables/Level.txt @@ -1,14 +1,13 @@ -# 关卡配置表 -# Id EnemyTypes EntityCounts Interval Duration +# Id 列1 EnemyTypes EntityCounts Interval Duration # int int[] int[] float[] int # 关卡号 策划备注 敌人类型 每次出怪数量 每次出怪间隔 关卡时间 - 1 第一关 [1,2] [5,2] [4,5] 60 - 2 第二关 [1] [10] [3] 60 - 3 第三关 [1] [10] [3] 60 - 4 第四关 [1] [10] [3] 60 - 5 第五关 [1] [10] [3] 60 - 6 第六关 [1] [10] [3] 60 - 7 第七关 [1] [10] [3] 60 - 8 第八关 [1] [10] [3] 60 - 9 第九关 [1] [10] [3] 60 - 10 第十关 [1] [10] [3] 60 + 1 第一关-新手引导 [1,2] [5,2] [4,5] 60 + 2 第二关-纯近战试炼 [1] [8] [3.5] 60 + 3 第三关-蝙蝠来袭 [1,3] [6,4] [3.5,3] 60 + 4 第四关-骷髅军团 [4,2] [6,4] [3,4] 60 + 5 第五关-近战海 [1,3] [10,5] [2.5,2] 60 + 6 第六关-幽灵之森 [4,6] [6,5] [3,3.5] 70 + 7 第七关-游击战 [3,6] [5,4] [3,3] 70 + 8 第八关-精英登场 [1,5,7] [8,2,3] [3,8,5] 80 + 9 第九关-生存极限 [4,5,7] [8,3,4] [2.5,6,3] 90 + 10 第十关-最终决战 [3,5,6,7] [10,3,5,4] [2,8,3,4] 120 diff --git a/Assets/GameMain/Entities/BulletHandgun.prefab b/Assets/GameMain/Entities/BulletHandgun.prefab index 1d83056..12ee07d 100644 --- a/Assets/GameMain/Entities/BulletHandgun.prefab +++ b/Assets/GameMain/Entities/BulletHandgun.prefab @@ -62,7 +62,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + - {fileID: 2100000, guid: 28c42f88cfe56e84e95c0d7545db8c1b, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 diff --git a/Assets/GameMain/Entities/MeleeEnemy.prefab b/Assets/GameMain/Entities/MeleeEnemy.prefab index 1d6c23a..be6adfb 100644 --- a/Assets/GameMain/Entities/MeleeEnemy.prefab +++ b/Assets/GameMain/Entities/MeleeEnemy.prefab @@ -11,9 +11,9 @@ GameObject: - component: {fileID: 7683855655592166216} - component: {fileID: 6418687210998749921} - component: {fileID: 4710806460657047075} - - component: {fileID: 1932268889601128120} - component: {fileID: 557030043145096197} - component: {fileID: 6353753365317756414} + - component: {fileID: 6116132977524560380} m_Layer: 8 m_Name: MeleeEnemy m_TagString: Untagged @@ -43,7 +43,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9166462022471897675} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &4710806460657047075 MeshRenderer: m_ObjectHideFlags: 0 @@ -64,7 +64,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 83e5fce2d1e5b3e4ab6551de03cc9c22, type: 2} + - {fileID: 2100000, guid: 429ed03405bf8854eab46552b7470ac0, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -86,29 +86,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!136 &1932268889601128120 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9166462022471897675} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 5376 - m_LayerOverridePriority: 0 - m_IsTrigger: 1 - m_ProvidesContacts: 0 - m_Enabled: 0 - serializedVersion: 2 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} --- !u!114 &557030043145096197 MonoBehaviour: m_ObjectHideFlags: 0 @@ -140,3 +117,24 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ce4964a40efccaa4fb22df63713b567b, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!65 &6116132977524560380 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9166462022471897675} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 0 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/GameMain/Entities/Player.prefab b/Assets/GameMain/Entities/Player.prefab index 8e8b24f..caa909f 100644 --- a/Assets/GameMain/Entities/Player.prefab +++ b/Assets/GameMain/Entities/Player.prefab @@ -150,13 +150,13 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5383497626468778460} serializedVersion: 2 - m_LocalRotation: {x: 0.5, y: 0, z: 0, w: 0.8660254} - m_LocalPosition: {x: 0, y: 15, z: -10} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 9112716898534404901} - m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!20 &4064848608618185461 Camera: m_ObjectHideFlags: 0 @@ -189,10 +189,10 @@ Camera: width: 1 height: 1 near clip plane: 0.3 - far clip plane: 200 + far clip plane: 50 field of view: 80 - orthographic: 0 - orthographic size: 15 + orthographic: 1 + orthographic size: 10 m_Depth: 0 m_CullingMask: serializedVersion: 2 @@ -506,7 +506,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f754cc5f339dcfa4aaec3aa32260c4b8, type: 3} m_Name: m_EditorClassIdentifier: - _isListening: 0 _direction: {x: 0, y: 0, z: 0} --- !u!114 &5456587199021485293 MonoBehaviour: diff --git a/Assets/GameMain/Entities/RemoteEnemy.prefab b/Assets/GameMain/Entities/RemoteEnemy.prefab index 4facb8d..997e3bb 100644 --- a/Assets/GameMain/Entities/RemoteEnemy.prefab +++ b/Assets/GameMain/Entities/RemoteEnemy.prefab @@ -11,9 +11,9 @@ GameObject: - component: {fileID: 7683855655592166216} - component: {fileID: 6418687210998749921} - component: {fileID: 4710806460657047075} - - component: {fileID: 1932268889601128120} - component: {fileID: 557030043145096197} - component: {fileID: 6353753365317756414} + - component: {fileID: 7797040268675747267} m_Layer: 8 m_Name: RemoteEnemy m_TagString: Untagged @@ -43,7 +43,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9166462022471897675} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &4710806460657047075 MeshRenderer: m_ObjectHideFlags: 0 @@ -86,29 +86,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!136 &1932268889601128120 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9166462022471897675} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 0 - serializedVersion: 2 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} --- !u!114 &557030043145096197 MonoBehaviour: m_ObjectHideFlags: 0 @@ -140,3 +117,24 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ce4964a40efccaa4fb22df63713b567b, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!135 &7797040268675747267 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9166462022471897675} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 0 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/GameMain/Materials/InstancingGrey.mat b/Assets/GameMain/Materials/InstancingGrey.mat deleted file mode 100644 index 87cc500..0000000 --- a/Assets/GameMain/Materials/InstancingGrey.mat +++ /dev/null @@ -1,136 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: InstancingGrey - m_Shader: {fileID: 4800000, guid: f17bc7e2694233349a8b22e96c5c43de, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 1 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BlendOp: 0 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _FlashAmount: 0 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _SampleGI: 0 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - - _Color: {r: 1, g: 0.29245266, b: 0.29245266, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _FlashColor: {r: 1, g: 1, b: 1, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] ---- !u!114 &4582237545370899445 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: - version: 7 diff --git a/Assets/GameMain/Materials/InstancingGrey.mat.meta b/Assets/GameMain/Materials/InstancingGrey.mat.meta deleted file mode 100644 index ab4237d..0000000 --- a/Assets/GameMain/Materials/InstancingGrey.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 83e5fce2d1e5b3e4ab6551de03cc9c22 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/GameMain/Scenes/Game.unity b/Assets/GameMain/Scenes/Game.unity index 42b3eee..d23a7fa 100644 --- a/Assets/GameMain/Scenes/Game.unity +++ b/Assets/GameMain/Scenes/Game.unity @@ -155,6 +155,124 @@ Transform: - {fileID: 1087406913} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &137790493 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 137790496} + - component: {fileID: 137790495} + - component: {fileID: 137790494} + m_Layer: 0 + m_Name: Point Light 4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &137790494 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137790493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!108 &137790495 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137790493} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 80 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &137790496 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137790493} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -25, y: 5, z: -25} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &203844586 GameObject: m_ObjectHideFlags: 0 @@ -208,7 +326,7 @@ Light: m_Type: 1 m_Shape: 0 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 + m_Intensity: 0.3 m_Range: 10 m_SpotAngle: 30 m_InnerSpotAngle: 21.80208 @@ -266,13 +384,249 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 203844586} serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &441607098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 441607101} + - component: {fileID: 441607100} + - component: {fileID: 441607099} + m_Layer: 0 + m_Name: Point Light 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &441607099 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 441607098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!108 &441607100 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 441607098} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 80 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &441607101 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 441607098} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 25, y: 5, z: 25} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &950467805 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 950467808} + - component: {fileID: 950467807} + - component: {fileID: 950467806} + m_Layer: 0 + m_Name: Point Light 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &950467806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950467805} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!108 &950467807 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950467805} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 80 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &950467808 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950467805} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -25, y: 5, z: 25} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &1087406912 GameObject: m_ObjectHideFlags: 0 @@ -428,10 +782,251 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1173691247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1173691250} + - component: {fileID: 1173691249} + - component: {fileID: 1173691248} + m_Layer: 0 + m_Name: Point Light 0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1173691248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173691247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!108 &1173691249 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173691247} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 80 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1173691250 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173691247} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &1176859345 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1176859348} + - component: {fileID: 1176859347} + - component: {fileID: 1176859346} + m_Layer: 0 + m_Name: Point Light 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1176859346 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1176859345} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!108 &1176859347 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1176859345} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 80 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1176859348 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1176859345} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 25, y: 5, z: -25} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 203844589} + - {fileID: 1173691250} + - {fileID: 441607101} + - {fileID: 1176859348} + - {fileID: 950467808} + - {fileID: 137790496} - {fileID: 1160234427} - {fileID: 3561987} diff --git a/Assets/GameMain/Scripts/Base/DataTable/DREnemy.cs b/Assets/GameMain/Scripts/Base/DataTable/DREnemy.cs index 7e99a7b..31a6ca7 100644 --- a/Assets/GameMain/Scripts/Base/DataTable/DREnemy.cs +++ b/Assets/GameMain/Scripts/Base/DataTable/DREnemy.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using UnityEngine; using UnityGameFramework.Runtime; namespace SepCore.DataTable @@ -30,6 +31,10 @@ namespace SepCore.DataTable public float DropPercent { get; private set; } + public float Scale { get; private set; } = 1f; + + public Color Color { get; private set; } = Color.white; + public Dictionary Params { get; private set; } public override bool ParseDataRow(string dataRowString, object userData) @@ -50,17 +55,23 @@ namespace SepCore.DataTable DropCoin = int.Parse(columnStrings[index++]); DropExp = int.Parse(columnStrings[index++]); DropPercent = float.Parse(columnStrings[index++]); + Scale = float.Parse(columnStrings[index++]); + Color = ParseColor(columnStrings[index++]); Params = DeserializeParams(columnStrings[index++]); return true; } - /// - /// 解参数 - /// - /// - /// - /// + private static Color ParseColor(string raw) + { + if (ColorUtility.TryParseHtmlString(raw.Trim(), out Color color)) + { + return color; + } + + return Color.white; + } + private Dictionary DeserializeParams(string rawParams) { if (!rawParams.StartsWith('[') || !rawParams.EndsWith(']')) diff --git a/Assets/GameMain/Scripts/Base/Definition/Enum/EnemyType.cs b/Assets/GameMain/Scripts/Base/Definition/Enum/EnemyType.cs index 97c9597..e7da740 100644 --- a/Assets/GameMain/Scripts/Base/Definition/Enum/EnemyType.cs +++ b/Assets/GameMain/Scripts/Base/Definition/Enum/EnemyType.cs @@ -5,5 +5,10 @@ namespace SepCore.Definition None = 0, MeleeEnemy = 1, RemoteEnemy = 2, + BatEnemy = 3, + SkeletonEnemy = 4, + SkeletonGiantEnemy = 5, + GhostEnemy = 6, + FireMageEnemy = 7, } } \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs index db61614..87b0d9c 100644 --- a/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs +++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs @@ -39,6 +39,10 @@ namespace SepCore.Entity public float DropPercent => _drEnemy.DropPercent; + public float Scale => _drEnemy.Scale; + + public Color Color => _drEnemy.Color; + public IReadOnlyDictionary Params => _drEnemy.Params; public bool TryGetParam(string key, out string value) diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs new file mode 100644 index 0000000..83210d2 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs @@ -0,0 +1,6 @@ +namespace SepCore.Entity +{ + public class BatEnemy : MeleeEnemy + { + } +} diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs.meta b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs.meta new file mode 100644 index 0000000..6792daa --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/BatEnemy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42fe1320652aa5444ab6b8ed8936d053 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/EnemyBase.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/EnemyBase.cs index 437244e..5509f92 100644 --- a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/EnemyBase.cs +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/EnemyBase.cs @@ -12,9 +12,18 @@ public abstract class EnemyBase : TargetableObject public virtual float AttackRange => 1f; public virtual void SetTarget(Transform target) => _target = target; - + protected EnemyData _enemyData; - + + protected override void OnShow(object userData) + { + base.OnShow(userData); + + if (userData is EnemyData enemyData) + { + ApplyVisualParams(enemyData); + } + } protected override void OnDead(EntityBase attacker) { @@ -35,8 +44,21 @@ public abstract class EnemyBase : TargetableObject }; GameEntry.Entity.ShowExpAsync(data).Forget(); } - + base.OnDead(attacker); } + + private void ApplyVisualParams(EnemyData data) + { + CachedTransform.localScale = Vector3.one * Mathf.Max(0.1f, data.Scale); + + var renderer = GetComponentInChildren(); + if (renderer != null) + { + var block = new MaterialPropertyBlock(); + block.SetColor("_BaseColor", data.Color); + renderer.SetPropertyBlock(block); + } + } } diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs new file mode 100644 index 0000000..a1a4ee2 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs @@ -0,0 +1,6 @@ +namespace SepCore.Entity +{ + public class FireMageEnemy : RemoteEnemy + { + } +} diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs.meta b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs.meta new file mode 100644 index 0000000..3b46cc3 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/FireMageEnemy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c04fa71c274a6f4088722608ba26587 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs new file mode 100644 index 0000000..1a4d092 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs @@ -0,0 +1,6 @@ +namespace SepCore.Entity +{ + public class GhostEnemy : RemoteEnemy + { + } +} diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs.meta b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs.meta new file mode 100644 index 0000000..912a195 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/GhostEnemy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2effd123b7296e448aea20b34fd24ce8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs new file mode 100644 index 0000000..fe062f5 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs @@ -0,0 +1,6 @@ +namespace SepCore.Entity +{ + public class SkeletonEnemy : MeleeEnemy + { + } +} diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs.meta b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs.meta new file mode 100644 index 0000000..5c38132 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonEnemy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21ea777a602cd034cb6177ef0efdea42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs new file mode 100644 index 0000000..1b6f4c9 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs @@ -0,0 +1,6 @@ +namespace SepCore.Entity +{ + public class SkeletonGiantEnemy : MeleeEnemy + { + } +} diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs.meta b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs.meta new file mode 100644 index 0000000..ed2e762 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Enemy/SkeletonGiantEnemy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3698c16c2f366404cbdd54efa880612b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/数据表/Entity/Enemy.xlsx b/数据表/Entity/Enemy.xlsx index 5047bb3ba28e6b8681bf2732c6fd42941acc06bd..987bc5ecfe0c03c5405d011f20b9fa3715eef688 100644 GIT binary patch delta 7390 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 delta 5507 zcmZ8_byyTm)b7%;bW3-qbW3-4NrQAtvw(zjERCRahm>^JE=ny33nD3964LOY_deh6 zK6n0@dFISJ?>T4Yk2&*B+QRi4TMSZ<*GiO{%(-NVDXp3MVWBG>Spm*8SQIHSy*ba(ATIhk1)0OGnu1x@Js zuDpE@nm_#PaR2TIfhEe$IMOy!G$z=pl7(K30p(-rEldFEl_wUqvi9VLNc``Vg^092 zQ!z5RqV`9cOH;nd;*LP6c<|ku1IVJE#ax*j)<@~lhWxQ3UT5Q)Fe6IsT%cwL!nUcN zyNr11iIulR%^wQa96yS_LksMUV*%mU356n9db~C=$WjDUXzi>#dk=E0iuSVU0*nc~ zn$;rZzat6GzV|)U^reW9Y>5s$4RbO+mJ&nWe=&ku1b-;EGC`ol<@>tsI%?20l?U!-Y zCUC)$dvecA(h%cr;7P`x|G>Rnzuq zDC+fv4D5E;11!Tv4lYBc0~?^xVluHJ*-9e=0ByKn5E>20XgRq=1TWOm=?UStl)1MS z2jmU&RgL1Zc=MF|24f{c^IFvL!z~vD)~KVvn zrpZog;|xmDVkzG~f_Qqd)EUZH#frn_16;#4=I+IA&Qo+0)2}Wf`2@r1RL8cXXRk-v z^iCq>GE5mkqxi;}j2QUQ4G_5ICUOY_hz;v7YxCj|?kI5$EzB=j~q``*a_@3V9 zY|DHNMsCWm7pO#N@QD~?-A^`*>~Y|B8_UeXT||$r^PpEWJ)2j3*nk7rzxP)?9ZYC zBR?!bjAqtPAw_tqV~AniWf3&%RK4qfMBC;G%0Nbd;k8GU6o)4aeMX5o6p}ML1yEh) zIu&g)pk3#mNIUM||FSaqDWJ2KFP;=TW#3!ejP$da1f=kTeFa?3e57spt)Bp)${6lO|ppf+f9-UvEp~tk}$T=g}40C9|di;w^ zrT{O1t`HMS4E-#laA~H4ab!-0Uj4`8*AJANb8`bfTHsU=eS^Wz7qxmUB~f;$hc>C{ z0*bCFewN{A(A;lfwy+=QT&aVHZX1b*6q{^#tNG|(`Ks`-nut6dHKy#_Lhod=k)LEvx z$*4)=cYBtbDwl_yncBQNhgoLw4~Wpn=3ge8Xo{pxU|Y?vt=p}IwEJn|68@hhTZc+j z_-lk0(Y6CBqL35v5OtNWjxvfj!m{f&OuZIsVF~N5s0udZEV7l?h-2cTckz3ILN-L3 zTk}u2$CRGPjB&WaCSeg&`FtvGB153{^rG;{=EhCyz|F#Y+~x&rDNM|H#GB#`1ONaD z8B9Y)4srvpIuptejh>*aTEA#GQshvu^H)>hASR0cUb8XMD6T=`@A$nyMdR2;LDyx8 zOrz$FhB}4@Uacyo>g;Sb1TO8dp4F4TGI0~O>M!!aN71adGr372#GSvo#LNe!6wmqP zL^%_cq(vX-oLjfOe{K+`L|#d7aHiPnA#b!p8{6*|FM^4KLw~Wj?e)2GmgL~PK_rzubHP^*Un5LORX!axMl8i{IGuZA8XR8& zWAzrPMlPws1oE5CS39)7awh{S#Gx{=*|#Kg98s3^9Vnrh0(_{u=YtBE9; z%C%xiGHR~twTXy6qy8sPvA9jmvXDyQOA%O}&J^C`~F?Ktaef>(>L^`w43{0{rPd#RbIv#{(l8iQ?wnk>G5dkUi>>G|y9 zdq<5=ZlchtUrnTB0n0*)deGs)9J}ubr7Czx3yT3pA_k?i@ADz%+eFm z*b{3&+#9H}mZ3KyBK^);+}3q!r0)o;5~oR$&|8l)N$zb~L@o{%jKr&WHh5mBm5>(k zSYSV>clQqF*yOAj+O92fLYy(0)F)fWe=g4!)T7uJr(#`FPIxiVEaI4yJ02d7qnoPp zggukLew z^48cy-&yqyF^vL9ud~bi$3#8|Mt)_|QY%wa$(JB>k<-Tj8y%%;v1hV@$2yEAmnAhR zuq_G)wpxm;V*Ikb_6-|#58f0wMyK5X2ElcX@2WhFWtchm9 zSq!n3eM5*YxwQ9>gl2*%U-KUIdO7!l!aHQg@KarYwk*G8 zQdPXzTUE(Rdn_pJ$UB$hITWZC*ZdDvfDG-+v;GrOaph17VsTQu^-tgC!bY$vvaa|y zdA1G-z+%+{Y9-(Pkg8QxSyu&`gkWg4l4tRqu8YnJ#HQnGjxKt>gnILs$Z?3KH_rJ~TVUsnCvkVEDxtdsPHPL(d-Tq|Fe zF^xM~nbsaNO`b%mDQ>+*iayR)iasLad91lz^an9FT2Y*PIo+CV{W8t9mtKfRm$2Xf ze_s$}V*3u;>+hr}sEDmU^xM}pW;5?;xXN|ug(fz3MNf7)8h_WA{q|^uceN(AH>id7 zMuwt|Jat5~$w3pxy7;98R_DQ*Qq4^3*CNT6uEw&0=BtNkD2vqh0+9wV*Z^X!W_G1d ze;G&(2Hza);m_usc0-5f*TA0pO?n}`iDnz5NT!$_Ktel^oXnqi?arVhp_Ykra==t} zgVM^{n;F+Q2MceoI)8+OTIxJJI+lu#(m@O9`DQR(#E0nu>ZrDk$bFc*0eYE)*NZ1TjsvUW=&?nAO&mU5B1J z_;S&9u?bLYRYq}heUDPbGlUp=2o9No?7F*KzAhq?Pv}&6zsRULOBxgJf|@I4qFkC2 z+)MF!>>zzfOV(QxFCn>d!T#PWCF#jE#6UQG(*tIdG92 zO#?-UJU?hfgkS#M@a7qUI@xljo!Gii)lFY`hwdOd&4?c8-f>I$-d7CWQL%ILv)@~W zJUqItNn!GulA>GLx3kp}Ugqa+Im0sGmk^kMfDj(GfXuKK?#O5GILUIkMCc#a$1TZ# zIEJ&Q02|ZBX##nq^0_P!GWCz(oBM%_?7sHzw6NligW@+g{sq2S}#~!$n<#3Y(kG^#=B9sR*t3xx9&0f0)@0)b=emvEoDBCk#*fK734{E?v0r=#FL>AgFH!;GVLBH2M(gBJ-?J5Swclpm!+eQ$op zo?C`O-vE~bL_bC;)MoY45tnB2N*Jw;a*r4HQpfD1FmGwuOJYs2wL1Z8@!JU(%Akb6 zHfRY?!pe*}We~T>re-+*nEULVUCi z0xK5nmg_(7@TR{w&|jw$vfIpm5wRi-g(EB_W@l@b& zb_!6&g!>>bp2Ah;EpFNuVm|GvYIei~sVpwtJ+$^eQS!sMfmqRfC&RCp@K9!_H5kVV zgOAOnQA^6|(@_FA>mbHFM@`6yE!6_B#8CCuVpp64w21_nf~lX0X(_N98c@NRNa~eK zR-^HFKah4~@gNAnR|?9M5|8GW4wsp2VdRU!kZB_Dyn5)mUM>cfa371#SEHmmen;|1OKP z;|vKP&U5v&|Fviq`vI$L%m8PxCGfQ>ZBj=$x^AVJ;U}?V#(`LZFbNuawSywjkbE7G z#Y&FIn3bQ;_UoaS&<_}vhLpf{nI1GP76LQaOduX6F#J=EuTpTZKF-MNJM76k z_w!>%pu4r-UNm7y+G+@hM1X%cLibPo`rj)-1po-2tLncE0YLlQV=;o|Ii-;u=l}q4 z3NHz`fRh|Co(|l>nf`yZNNp}LG8YK~8Mut=6+$9-n~N8DJ1@m*0 zBf{yyTHKtJ|NYZ4f0oC(5W%2SJDuEqWIOA<=7;=$+^# zdiRn%&vSqG{jK-==lkQ?Yt32foVm)r_V1i)@9X-NXjhq(R-s@Muo0}upnyQnk&P%+ zfQH&vdMIL6<$?gR!!uB4tuV=AbF@TEVk_9lFl85kAeO4X^s=rQNv6D0yRz%p2RSv% zO>Dc0R8rwof`iGHm*wu_krW{wPg0dOVv=LT zx+*84+BH1Dd(Kv!{z=JS7VJ2!-|8a_OhAMTy>}sVanT|=bG1wF7wIV8#e_sEaL8w! zR`!CTQDxC^D%}!Uq1WybddpXz`PfNv^Dk!tRog#lRYSp!E<1)2RQ1J5b?^|PJ*|s6 zPj{;PwyJG67EpXGR9SDXv1*xwf?%B%9?3T38vt?hB~553mY&(pZF9ay7>xQ9%-zBM z$SfF@ZJDLMz9b<}SuwfQoNTBvGwwSj(^3&|K6?3Z0hS(#eZ|)IoIi@=BNj||6rP|G z!X}lpSmB`Ii>9uGh7JXRKv-tn-N&EXVRUYqF#8(cOyH^^W@eS8>!k{N~sQBc{KZ?e( z=U^4C&*!YPLhIJE<~W3%APM8ka!v(HU*fH6UAbjep_>tuWP~==D?Zs0)VS{iH4o#< zbgKe@a%=rIrOvkZxM=re1UlsH%y;n9g!z7vf%gr}dB!_c9UindufOO7U#to?SZ_c- z$7yIJ5QP~kE6$&F^cxXJ*M^$~zKjgN|LnW&9A0iag>dG&-Nxwg12TiCo~7rLBL>CX zXQpJ+yIB!kd|{;<&-?oZzE%k1lbn#U?r!cre)Mh*?)(%E#66B*WC_o7pr1F$w!Dd#_$CD z8;!=Le7lR+E&aS5;g=KsO$5Xh0Y|+c>d=5rr$1P&t2gGBiu_JQ%BHiPdMP-&+xrek zGI>bVOZNr53~w9KXrUaNBJJAd_iZu)u3DZ+S>t|8MZBpYJXu~?3>N81qoVjOWbPfM z*Bgj+O7{kjN!Kr%H+x^6@$yiNh?Afk%L^o^{|0H!_(nTH;ORg`$}{V{^Zm4@gL?Ih z!SYK-W)F6OtNW=wO8vsJ!J5Gaqf=Xek!&$ZV`4Yew7xZZKW5eUIXph#{>l!;bC5fOuRcUeuLQeSG=|tJh3#gEYDYa6!N3`eeU@M2Yr<6|BTZLc| zDOOs>$V>>Y^en6Z_FU;Wwzax`fPF?P!$vj~Q#7$^59K`D<@@8U`U|!7KHP>(s|6od zbApC^N4tiYR>@nOZ;=PZU=tyS(dn_T@)PPy&_N(4p+E@QKC3q2CiS_A zaBu99VzE6#DVLpQ)%JW9uBtyyB4w`i@tPalj4raFP@nXE=;h+ch0hhH*ks9$#r$WD znWe&sTE7R5wEEfH-33E^mzOms-2oed{@RordU9^tV7sZ3^E<$pF(qKv7l#98)b8z* zz}0Z@Zc^+ADw!kNZSBv7KbZdG_>b`L0`)-*py!-$^w>|ZoXNo~@ml-m%+#wfIjDymkmFGK8rQX$iroU^5#m}kNh!EqRdHr= zvpyu^g#F8;pK>8n?gQeP5*|wKhG5f~rlqb=Mypvi{tk+fXubA+b4Fl&uY%?@eX}$y zbgHM@yS})Bsb0-rGrgqq)4Hr2ana?zQ(j717XSwI?xTJ=Gv4*_W&5vG;W#7nheD9Dzloph;#}(-_Bu}UxL!g=bkIB%vD(S7#$NT})w>FPB z4G%Hsrmazh$Ml%t&YPT3l??kE!?c znHe`ly)vAaDm&Wf3uxhZPIB<)(LAw{8l6X4_lxtU^z;JPFM~dlJ!QmmS&?GrH#C19 zEr2hCsbT|vuKrN5JAde0QHGg1Ln` zn5A7~u!L7mE)v%=CjKV_-IN#&*=Uq}1$b9FgXfg7TLjJE`3Jb}o{8IJIByC@Y;_D3 zPuvAIYE$t{6Bp*e`2ZSWI6C!{8IoEq2AS!A7zSCekSm~nAg`(H!{)zF|IVeu>K8-5 zBra3@GRb^b6T;7~z-G+UhtJg7-+dr9^J;*L{KdrceOBYeWx|F&PgQ37oW7VEz4vPZ z`9~C`*@f~5?C09T^R2W~7TgbeWDWL8aOuK7UK%tLs+tMS9OFAm3N=1p z>3>XUmDk=WKq*O3idjU0KuEGlIWp_CDv1x(Sj*ar+os2ZRcwck^D`QkxE_xBF6=_I zN3{&UTU3kZ(?H}}Rb6*w&s4|12v+_o5wBnBQDf8BR9@9QB(W6B5)K#HSbQR57%zU_ z@hn`yd9SAdLsa-@78+1+)kaSEG(*?%bg(aeDua!eG$NCAOi06wGcqdc4E+Cs7nz0& z2L4;v{tH^*zlH6;pauS0*!~;Z{|{`V=_))RQkXy?t!TL!DhNc3`JXeVvlYzA!d%P6 z$=cr1`Sv6BiBoeRmZoUiVf6)<8`p4`mJ*{)1^}@$8`g_3w4rirvGC1-4u~L>Y9bx; zNsOl5$hS)RBE9ake3PIggv0!%lauAar~dQ4i}%MKZ13~{*b6iK}dCRO2t8;VLVcc9w_35*kyU?tZ-Qs z`a@$G85eF<^6)PS%v{LAZ!%1*v&@CfLk|n$Yhe^8I0&hjzzCi2Twh zBt$s&sE60yf`_(@zxd5=Gl%`u$$4rsLvcfETE6)~s|i!l<*CcMVehVD>PHB577$jT zr76l*)NN7qt0~gr{Cv-7Xts=BZbH&(+{F3p^7PXqu^%1tEaL@>lK>gr%vpV9DFuvi zz)bueXIr8wIsdd9L!Zm1lgpstNV2a9`>|hPeKw9du>sy~?)?_ro~d#>Xlp*kDG=d+ zj!mC13JWCl=@!@D*vG*-7=wux&C@k7 z7u%?pT3Cc{mt6}*aSg_oSN_I7zd$j^TW`hJtU%34oUGK0dV#d|u0J_}Ax}x^0jBTSW`f@- zpXYRht_VNKN;jO7hvl4EbqFrsGw3|g=7UiYwL00*`=tKTtg-3L@XZ@49E0h_ds5)G zY)bUAkmDHlXuYrS8A5y1y%$5Kz9!Pno;y)UVy{O$M-*6Y=I}ZyMl^mtbmgTetq2`! zcrlL}4(eo@gk`+%SGy3-y8!XChTU)GC`aOMs4DiQ{cr9Fpas12ZZGp(N|iSvvKk=^ z745d1R3(35z9qqo+L-M4a@c1;V7Fu-EwImO9nuy<4QbmRrVO0#b)PHAi~+7Yji!q(SKY+g zDxNCWb5u`0-PKd%(GqxLA)TE4X@b{HW_|KaGSa`wsE4{LN$vyggr7B<;l$Y}TE$jZ zf>Z6K}a@on#Ps*poND8;y`t{$~N=k2wYxc zl#P^cT_v&hdN1(qzF+M2P;*LgrxH5_THXjc!khZNyk-`i_lHZ=f~sBG59AXz1kGQS zuq)*Zz4A&BuOx@hvxix7BRXMU9z)v6 z)mmfbn>x0ir2-SqYAWF310#pAU-JbI)a7&EkFQ093=HU0nw1sei6t@JWb7^NqtKr>}AN0xvH@BNaUK*A-!vj8&l#nreohLpRSohrS*gE$DWq-PC z9J&9NTe~~Va;8kd#m1>(`%UmxhGcBr_Si4#a-y_Ye=dikxhzg4zagF)@QbO0Mh2tv zpH;T4lY`VtCt!?=tqn=K`YUS091t+`t7tN|@KHWradika*5z?`dozkog$uT=Q5{8! zf<<7X)uX&uC7M-D3ez`Q!I;P}TsR~ezw-$C`*I&;iL9Cf@g43Q(o&Dln zHEEX(k2|rsJ_c8Oywa%`Sq_)hLU>A70$F7}pa1(%i%G{|?NLP&j6T7Q0g)q>e(SH~ z9O8|yTyZ2w!Dqj+mg43b@4FFv?n}!5ZuvyiFUHnD!mKr2?)QdG9cY90bYucPjMx0A zuW6f{@pBqI@T_L(h2o4IkQ{TBnnk%btC(z^%XV#ZcSpEa;aYX@&A|?HZ+uFc2ke8! zxZ__!Ys~6bBX|`nVm?Almtu+ngH1?5hmW`*T!@&;?;EB|>YOBeewd!url*8nd~8cR zS@{WZip>wZik+{*gB6%;OG9pIoq28gf8IND{9;bYnSzM(P;eO?|oNtI`2kYoi4xwU}5(BY9k_>YUA_{IMTok3i z2&6_S&}T;}EaX2tn!3k5*5+-Pd`0F_tMg*Kzlsr6ZL}-v@Rf>U*kR>l>9+jJS_X$# zY8_MuM|Wq#=cm1ih5Xo*%;NNYyK`3S7fqv41}_5y=aCQf2ZD+)&C8I5Nl4kmJUoJc zpQ0y&g>G=$IXo3`g1Sn7O`SPPHLgjoDKO$PX!830D)B4)PcGJ?UWV?jKZ!BxAPip4 zklU-_H%v1R9k^8Kw_O@jA~$KY#bO-qCQi4Qs=!teJtc({G;Za-B@|pFij1CJ#aPRn z0D&IGCKjwSvjV-@lzpvB4u<*Wk}t0Wyd%)Uxs@8uhTB5}N%XY=aj`W_U*LtS4pUN3s%pcnSvD9H3z z?(x0Mi4Qg_Y*Jn3aNlN1#Fj?Vn@>3%iV#{45?IQM=H?!aM_9=OZi>$4l|b-;Uic{qA97|-!HLzG_@l{5N5R#~A zK*pozVHUZ&c<{1fpA{lJ4T<+<{C~j#jQIN#f@|ghDFX-Oz!s2MnPlA!my>@>PDBG z4oRv3msgu^D-{ISRGl%HSe+P?apc^oJ}$nezjm0gCsO4ZTXy@?yiwbFw;#?|H5bt6 z87X!|Nu{FKU@B)dz_Qd6tJJZ^pg6y1G!WLfh`Ar?A-TbvK#u`CdQFgwxTL?2dU$7Y zle=)kor-`rgX+T>@0h#DLQ()a+j+_iY?Av;Cqo6{kIS(7u~#RsDtjK*ik&Ymt_94h z?##aPIgsP--j^X^?RqR3BlIQe?Y`_Q5iVfQ&jt%dPN zm}Tnxo9$io1IYJ|e9u7e!8 z-F2sLeF2T*TDe(FY zjXI{jMJ@iuQ_$y3W_XL_1MUzl&q?DilKyeP_M+GZ43XsT5V za9RuvzZCR->b*8D#&--$aK_)_vK{09u@$NT<0HJY85dpap9gAf$pb+#37r6;-`?Sh z{}yCna3;B(@6QBw=kY{v-BAO!!9I)D^e%0bh9&_;-qbZBn+H>wp*Db4dFjxj&ihVO zUpitn>9TL^$f1>-nqTZnXj%jPkb35jb|Z2_D>o}52El7^G*yKTLo{j( zI@#|N-VKN0=HO)OY-M5L;>>H}WC8yt>yejo2&%d{^|9Qvj+p+O{{AnG-|D~lkGr=P z5K+xIEqsKJcKojikL(9M31e~^LIw&}!G&wpkZQ#a`R`2+=HvkBUBONK^B1``bo~I|^Ts6v>{od69y!uE*jNUl_G$Y$>#G#IncU z2r?<%>9EK>c5I7l7tVYAGYswHD-F2zg}KyaE7UHRq1p(0;Q&wMRC4mT;eO@uPa&j| zB%^jq_an*>$Mh^V>8|6TSeGo-$Db@hbK=5h0G_ zJ%c+Y!zl8!pOX5?0SP>sYbb_Z^hBX{9+)^aJKv;O2r)EQSvAc1&u2a>FU^>0#COu5 zlJ&jFL{`h8>WFELDY8D4=PmMzq35vGUgI`5!)C|4+$fl_T05xqFV0V6CjBRmWo)~U!qn5;9IDI!4CXDegQR!r9!by-;}l9 z<0O*#a80vf)I>KN@fdd@S|5-FA2>Z$Z{4*RDWjVJ_|o; z4l|OCHTM5tqFY#nsDCr3H_!&&G*kpArVQHKbSwd^c3x5fJ9O~7_HDg?I{ZpI%Y(Gg+KWNIlx9q^B?Ao z2n3?|-AQnQB{(ElaDsEmzHi@i z&VKFvyr1{;eyYt`qmN#rwccvZ>NT28Yqjc{VNta)tk~6HVPMQ4-LS--Ua z?w7AR4f$BL{aG-}MiEroVE61bKT8NDCYW&ts5x=yaUI$`EluEB4i2^4_<ez6NZ2XJGEre2ZxlZ9o0=weoIT@>P(=;2 z($JIpd5M36k7oaUmdn@;tELE#fDZ!$g8~Cq*%BXKTnUhbu)tG-R86?jl<&k6`vZH{%FOnd6FhyI{WAmA zh}C$O@jK69iyyi+Xs*dfD>|Vo5oi%cpO`RQu|^^4x-kenIewqiyd^8ts84}Z3N58L z4PCr!spdJ=ptIJdV?5)cE2b!@JC&C%5zV9uLpQ1!P40$!FF-!r3#sx}?dk4uUGm#$ zAzH0jLph%I7dnYxu=I>q4|&8!t{H$~Alk+c3TF})dYGY?6kIh*fl@5eDB$FC#i2FC zLbSC%kB@QZQ^mcLVayPXc&5S64OjSjR&V(gF#CNe3Sva^<7XH0r<*lc;h<@|fb-Xh z#E?=1D#!v7C2IQ7ZIU$t42&P-35fy}mu{GFz>gig&T=It9VCWou76Fv@zb%jNt=bt z)8F?R3H~d+>j6>2s_A-tsC&IElYt%V{e(}q52+*2RP3C!l~dnUomHMxMXonm>&VyD zC|T@zDae;rqWE2XX$Ip`azI0LfbrwaKmqW)OOUGsE>cZP(M_WwAijWEq&^Fzlh3FR zD}qerUa?Uq{8pRk)puyjIcug0{RLxbC#7#H*@CHCDDW>c7#S>@7Jpo=a+wlO?Vy;D!j9m8+} z17i7SIm$`qZN&Q&V?Cssr02(O~RUcqnY8OXtdd!VRlRbhbTQ9uD`!jclL5)Nmfdb>ar zM@Tz`QchRr%NKF%Qcix9Ev;doMAqyQm7Fd~C`rL$j_wvmyY@PEmmg`=;5Fj$U35o< zy)aG@6f4vbdypxXEu{6r87KQkCp7Ux{*%HPz_XIiV~?^vFnhBp<~tE}qSvS%e&ArwTxx3N8TSglg1gwYyMnTwq{CM@V^jCUS6ncZR^x1 zJXg|>0-CD$=ECX|vC#){@YMFd@$L-XZx<$L?=da#c(Q&)*@oV^255$zft1)nGx-_D z_ej-eY3}33X*enX|l_YNjlfSsmbm|uHR@cq>;GtoTT+g8f6`HxMrH8p#Vo5UI z!^VRJf3ax(;AXTN+hKVo#Ed_U#ZMln#o3dMq+<%#N_H!rf+*KjM-`}c9oN!VKEwRy z_nq&mZy)K?%g@vn9`cOz3i61K3{rkS|MEvYk$XU%_&u!8_^~=!>zyu(0Httq~hx#X570uiaPmQcJkLE6fI7eG9{>20$#jb=B;v8A7q>VG- zRV`D@D!`_8TyZEBc4js07^sr^dv7(N_Dosp(EdRNxMe3-R~V>yUmC)dHR#xWBC=&} zAK;{rqe?lgrV6#?4k9;$H()?R?@=dj5B1|4rCq z!2cKa|FN(F|F^;>k~fZHi6ddIzWMbW^Ric~;bCC#VIV=QKu{n=S#f}qXyhbhJ%6xr z#i^ZY)(hFRw<9M4T=!P@-Q0@Rz#2Z2<~O3zk~~HX;mFC?_@>N3&=U9cerKT!goNA2 zrzyw}RB4u9f-M?SqV+~qp+}BLj3{ZwbN#D=OM0f+`Y>qu*wAS&u33p-6h>kQ9x;`c zyaU&aM7YL#b&$4vTL`I~jWO2dyklE8yq(|WC+)3Ul+2rc_; zm}vTWTJ_DEGK!X*Y48zmS)~exKbB}nX@bFAW}D~^UdZN+&yS~bU7J^#V-SMaEHjZ) zY#c!IJI;1Z7l(A}9weu3o3;a~%x>Tmn-X1F)7SvpDkxlQaJyRXFnj9viR$tuYDWzN zM}LicDUPiA^KFbV*@fqrCCk32zKFuLGh}iuZ|#nQOTeEj>(lL^Pub29+d}8zZ@;q< zlgtenCZTM+7WQ3hmmon7T5w=tL{n`dn>7zL6mR<7JdON>R$UBwTV!F2QQfHt`&I&c zo7rZz5#?ZRnp`EA{7N&L z)mP;ukH3wj^0K*=g}?hJBqW>=etxea6CcD~+=dV91;%`r(bgN+uXHt&Xg6-zl6+Qg*3U~F zy*n>{C%9egypSyQs8*_9KTyYf#R&{s_RmqA#P3Wm6}G)EL5@t_g=fo~)r?nHY1U`> zR!7@QgJM0j21`NX$vQwYwdo<~CaeTBHY6uNXc6 z^a~9%f1u;xM48GE&`AiGE@OeKUZGaEy|r51?~kqO3YG5F<-v?^S2U`0>AM!K>pNNU zd?IvY?3hF9u}nBPI-rqbD)D_NOXTy!)m%I)N$peFGl8xY6mG#j5!^whUnzI>3Ah#Z zEoBRaa&{79J!tcS&TGFf9Iqq|FwREO&G3Ko*3^Y^w@gG4x2YaE$=tUl9-_Sr%jb9UaXLwxS*mYw|EP8K^TrqoT( z-SBEsA8#j)y>0_PJ$)6Gcv@D2;{gvjF{rMH4Q*llQ5y6wo0ONpatA_%fk_a9fdRaj zCm%-+cMo4jYj<`ZC&wYf~R?wpEG)^3X{mE8`tba_wf1O797MY#z9$XtxJfm&QPE zR|Kwwdwv}Mjve9I9=@7OqWjKeH05zrQgxJKHCE@Zvfcz%zP7@o=M8?^Y#n{9+Y z^E_j7Y|+s4*jjttmU z@8EGyjzg?3)2vm2FKaxP3Lo~U&H(_8mK{D>akF1$&9ojuM@p>kZ1ELS-*!E|2DfZ` zC9rW`%~#8gy0jvQaQoM6zkvr~shWO{VR5t}6wr+RB zr*GuN2^eC4<1_;i9fkImZ^qE5$;> zd=6v4qf%#gf4W8bcOA=(CDt)})CQ%=CgQc#+3Xrb>w-j#E7A#9I*KJs{Sw=wU!y1n zN*qCt=eJTT2StZ|YP28nN+9l_Ch7iE8axz56(BrW-!rNm-Si%20@STkGo(iaELW|q zKQ3(!!2imqrGuvHLwJ)`>^&lo#TW9KPF1m3Q64Ic=OCqp3ei1IRAo+Kf{e83POgfm zkN}Kx`gWS~%_2P0Tn}{WG!EZo+lM2(uEdpdW7|PhFWVi#!=F$y|M3=dRrk>@srIZ+ z>bU`9Kl;IGs)OY_u14w&+K3rZu@$t1VEn+T70=25ktIcY{MH{>!lJnqlQo_S^l07a z8y#$_@)57Fv#Nr#H2@Hi-bXliZ-DX1*9A!io^ zBtXWM3oOj(>f_Lgi6@7=ZUgqkaRuXrl+KP|wdd4ttP>r|JhPx42rtc}kUS6B<&No> z6tdD+`|I+VNl)2DZJ8G$97ntrLMlA7e}l3S#(Of&uLDYd+Z2Hq?B3paC-1QVV9oN) zOaFR#nH}Jr11tGdiFkbztx}NRR6y4cKviibPUSk?d^5`jX4qNv9^NURJqy$uw&T0A z0eSyiGDgRYNs_))rZwk72i9aZfZ)(oXM|mD68-X$vD#qq<>%C76;SQ5_!x>|h{%_- zHK<+Ox)L^m83mJ4lV)Bs6fWKR5Rrw&4syLFaLxF+BQH~XP+Vc6!y@r{uAT6fN`VS$ zqzaX!O=1t1qqIg#k_L)4L~S;SQb&1+f~Y@ye0iw6Tk@u_Gb6chwYxLi*)_0Th{hi^^Jsw-v5kA>rtM^rT_REtQ_U{eB z{eD&CcM>Em#EC;H4K^y6<^|ls8107}vXwKtvsSVoXJtB$R9Cc)ngL^E*+~b@ z;%<-gLe;{D(Mv%HeyJk<6Km9 zM2nS5vRgLaP&&jMA^K<~`x*mdWEr+lt=DEUE10KR7$1#qZhW9OLx&s`?^==q{_rwK z8m+{F1#fHMD}e8krTQWG>QBPE7YNd1)45t~^I~}?bd!d=1a|_B* z%I(5KO>E+UZI7~1pQ;q=f}v{!4Jyc)j$8eVPn5}EYB&ZLQ^>B!*^bff(}&88^$OEU z-AT|(=~ks#J^4SMZ^kUYCzth;BOI{`5jjOSPY=4@f7k*|Ovn<}iu%0oW>od#rdM5D z0D4Y7J${aXMv2*3ku?)2J~>%mqhz@W$e!H3HFKp^{WNG|`++`PjUG za34R${!UQ1hC|{<xt@krw zIlOmkFv=Ugzz1RHso%sEiMVr9>|58uBwAD?>?fe^`}5^Fy|5o4%sc&;F;hRDJCR9q zMFTx<&%hU^f#dJcSAE{(hRIZ=c2f})rEm)CZVa=J7Ic$G{79hRQMDGqm||+RL$AVV z#ak>M$3t&XLx;gF#2uJE18nP^)=XQ>(7g@sJMEkc>r{+I3;jT&HI~_oQ-1G>Y=qiTlCYdEiS>^Ac>VE20jT zf1%mTKu0%)OCKy7HQ169t=#YII<()ABpiP*4YZuj z)_bbHvCy;`SuegJjw7T&6VV}_Idy=pTKY9Z?w7|^z8OslisA#*DQYod3mT+ zQ;>VkOICZRvHZ+bXP=)y28TDSi3$iG%`4iMKfZAv#qiY(eAb#VJ#jkK=+eVl(*utP z$gKZn^|Ad1$Ogpqj7{=cU(#^q>X{-mhCa_n6%h8wuiuF!5;tbiCc^#O0q(soBDMRA zwIV};fx&w@z!^%tclNM$_Au4*b+L9g{&S3L{y5>>&xtMbJLL{5=@S8$T6qOCT#RTc zo5ntJ>vfp)AeJvic+bh8I2|_P?6flNNRIz6BQd1H;+kYcAJ*zIJ&xlBgxIDE-nrO7 zB@@BltbHKLSlkr8#Cifs5R|-A& z!#*-^6SFFSUt5Kqg@*axe6xND|`ELTC>c-#G1xCy~-S`-}1+9Ga ztB_H(o7@;-lUxa`uv@>XNowz5{5CE7-2dTWVdNNezj5YD5d^QM2n&b*;&%UTNc>Z% zmjDbb4CTwXMFU}B7K0O}f;cjB!|a z6V4C-@nqwJ3jsh*um~U@S+Pm~xW&hp+MHh60$6{s{>}T20CLPGB-;KGc<~k9@7)~S z-&tFGxO4oowEyWU;K0BT{RhP!0z{010D{RuK>Fv#@4xSb{t5bk`T}Am`9A}kA)*{W VNG1mW6Yph{Kwj#Jp!>7Te*qE_3B&*Z