From 938e73efbfec7b568ad096075d359095f6e83ad1 Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:23:02 +0100 Subject: [PATCH 1/4] initial chain lightning pickup --- .../Graphics/Animation/ChainLightningOrb.anim | 72 +++++ .../Animation/ChainLightningOrb.anim.meta | 8 + .../Animation/ChainLightningOrb.controller | 72 +++++ .../ChainLightningOrb.controller.meta | 8 + Assets/Graphics/Materials/LightningLine.mat | 34 +++ .../Graphics/Materials/LightningLine.mat.meta | 8 + .../Pickups/ChainLightningEffect.prefab | 267 ++++++++++++++++++ .../Pickups/ChainLightningEffect.prefab.meta | 7 + .../Pickups/ChainLightningPickup.prefab | 159 +++++++++++ .../Pickups/ChainLightningPickup.prefab.meta | 7 + Assets/Scenes/BattleScene.unity | 66 +++++ .../Scripts/Pickups/ChainLightningEffect.cs | 221 +++++++++++++++ .../Pickups/ChainLightningEffect.cs.meta | 11 + .../Scripts/Pickups/ChainLightningPickup.cs | 62 ++++ .../Pickups/ChainLightningPickup.cs.meta | 11 + .../SceneManagers/BattleSceneManager.cs | 40 ++- .../SceneManagers/BattleSceneManager.cs.meta | 15 +- 17 files changed, 1064 insertions(+), 4 deletions(-) create mode 100644 Assets/Graphics/Animation/ChainLightningOrb.anim create mode 100644 Assets/Graphics/Animation/ChainLightningOrb.anim.meta create mode 100644 Assets/Graphics/Animation/ChainLightningOrb.controller create mode 100644 Assets/Graphics/Animation/ChainLightningOrb.controller.meta create mode 100644 Assets/Graphics/Materials/LightningLine.mat create mode 100644 Assets/Graphics/Materials/LightningLine.mat.meta create mode 100644 Assets/Prefabs/Pickups/ChainLightningEffect.prefab create mode 100644 Assets/Prefabs/Pickups/ChainLightningEffect.prefab.meta create mode 100644 Assets/Prefabs/Pickups/ChainLightningPickup.prefab create mode 100644 Assets/Prefabs/Pickups/ChainLightningPickup.prefab.meta create mode 100644 Assets/Scripts/Pickups/ChainLightningEffect.cs create mode 100644 Assets/Scripts/Pickups/ChainLightningEffect.cs.meta create mode 100644 Assets/Scripts/Pickups/ChainLightningPickup.cs create mode 100644 Assets/Scripts/Pickups/ChainLightningPickup.cs.meta diff --git a/Assets/Graphics/Animation/ChainLightningOrb.anim b/Assets/Graphics/Animation/ChainLightningOrb.anim new file mode 100644 index 00000000..074daf6b --- /dev/null +++ b/Assets/Graphics/Animation/ChainLightningOrb.anim @@ -0,0 +1,72 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ChainLightningOrb + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - serializedVersion: 2 + curve: + - time: 0 + value: {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + flags: 2 + m_SampleRate: 12 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: + - {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.083333336 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Graphics/Animation/ChainLightningOrb.anim.meta b/Assets/Graphics/Animation/ChainLightningOrb.anim.meta new file mode 100644 index 00000000..23bc940a --- /dev/null +++ b/Assets/Graphics/Animation/ChainLightningOrb.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6078190a2b3c4d5e6f70891a3b4c5d6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphics/Animation/ChainLightningOrb.controller b/Assets/Graphics/Animation/ChainLightningOrb.controller new file mode 100644 index 00000000..9a9ac976 --- /dev/null +++ b/Assets/Graphics/Animation/ChainLightningOrb.controller @@ -0,0 +1,72 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-7001001 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ChainLightningOrb + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: f6078190a2b3c4d5e6f70891a3b4c5d6, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-7001002 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -7001001} + m_Position: {x: 250, y: 110, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -7001001} +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ChainLightningOrb + serializedVersion: 5 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -7001002} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} diff --git a/Assets/Graphics/Animation/ChainLightningOrb.controller.meta b/Assets/Graphics/Animation/ChainLightningOrb.controller.meta new file mode 100644 index 00000000..9c3d706e --- /dev/null +++ b/Assets/Graphics/Animation/ChainLightningOrb.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08190a2b3c4d5e6f70891a3b4c5d6e7f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphics/Materials/LightningLine.mat b/Assets/Graphics/Materials/LightningLine.mat new file mode 100644 index 00000000..4b4c5757 --- /dev/null +++ b/Assets/Graphics/Materials/LightningLine.mat @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LightningLine + m_Shader: {fileID: 10101, guid: 0000000000000000e000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: + - _Color: {r: 0.6, g: 0.8, b: 1, a: 0.9} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Graphics/Materials/LightningLine.mat.meta b/Assets/Graphics/Materials/LightningLine.mat.meta new file mode 100644 index 00000000..91e8ddeb --- /dev/null +++ b/Assets/Graphics/Materials/LightningLine.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3b4c5d6e7f8091a2b3c4d5e6f70891a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab new file mode 100644 index 00000000..f3e2cc1b --- /dev/null +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab @@ -0,0 +1,267 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6000002} + - component: {fileID: 6000003} + - component: {fileID: 6000004} + - component: {fileID: 6000005} + m_Layer: 0 + m_Name: ChainLightningEffect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6000002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000001} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6000011} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b2c3d4e5f6078190a2b3c4d5e6f70891, type: 3} + m_Name: + m_EditorClassIdentifier: + _lineRenderer: {fileID: 6000012} + _lightningDisplayDuration: 0.15 +--- !u!212 &6000004 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000001} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 23827671 + m_SortingLayer: -1 + m_SortingOrder: 1 + m_Sprite: {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + m_Color: {r: 0, g: 0.85069597, b: 0.9716981, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!95 &6000005 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000001} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 08190a2b3c4d5e6f70891a3b4c5d6e7f, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &6000010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6000011} + - component: {fileID: 6000012} + m_Layer: 0 + m_Name: LightningLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6000011 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000010} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!120 &6000012 +LineRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6000010} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 23827671 + m_SortingLayer: -1 + m_SortingOrder: 2 + m_Positions: + - {x: 0, y: 0, z: 0} + - {x: 1, y: 0, z: 0} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.04 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + textureScale: {x: 1, y: 1} + shadowBias: 0.5 + generateLightingData: 0 + m_MaskInteraction: 0 + m_UseWorldSpace: 1 + m_Loop: 0 + m_ApplyActiveColorSpace: 0 diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab.meta b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab.meta new file mode 100644 index 00000000..07ad57e7 --- /dev/null +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d4e5f6078190a2b3c4d5e6f70891a3b4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab new file mode 100644 index 00000000..646fa97a --- /dev/null +++ b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7000002} + - component: {fileID: 7000003} + - component: {fileID: 7000004} + - component: {fileID: 7000005} + m_Layer: 0 + m_Name: ChainLightningPickup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7000002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7000001} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c3d4e5f6078190a2b3c4d5e6f70891a3, type: 3} + m_Name: + m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} + _scoreValue: 100 + _effectDuration: 60 + _effectText: Chain lightning! + _effectPrefab: {fileID: 6000001, guid: d4e5f6078190a2b3c4d5e6f70891a3b4, type: 3} + _damage: 15 + _fireInterval: 1.5 + _chainCount: 4 + _detectRadius: 12 + _chainJumpRange: 5 +--- !u!212 &7000004 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7000001} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 23827671 + m_SortingLayer: -1 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + m_Color: {r: 0, g: 0.9013953, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!61 &7000005 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7000001} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1, y: 1} + newSize: {x: 1, y: 1} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1, y: 1} + m_EdgeRadius: 0 diff --git a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab.meta b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab.meta new file mode 100644 index 00000000..3da199ea --- /dev/null +++ b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e5f6078190a2b3c4d5e6f70891a3b4c5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/BattleScene.unity b/Assets/Scenes/BattleScene.unity index 3ffd5afb..a63ba57b 100644 --- a/Assets/Scenes/BattleScene.unity +++ b/Assets/Scenes/BattleScene.unity @@ -10524,6 +10524,63 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 6cde6a2c228dc40d0b42ba0b19ca2fc3, type: 3} +--- !u!1001 &928173568 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 2050277062} + m_Modifications: + - target: {fileID: 7000001, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_Name + value: ChainLightningPickup + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalPosition.x + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} --- !u!1 &943254750 GameObject: m_ObjectHideFlags: 0 @@ -11451,6 +11508,9 @@ MonoBehaviour: - {fileID: 3306419623360918530, guid: c62e469089fde4fc98d1c3363f2ea177, type: 3} - {fileID: 3306419623360918530, guid: d109130e8f6de4b86a470d567292aa28, type: 3} - {fileID: 3306419623360918530, guid: 6cde6a2c228dc40d0b42ba0b19ca2fc3, type: 3} + - {fileID: 3306419623360918530, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + _startingPickupPrefab: {fileID: 0} + _startingPickupOffset: {x: 2, y: 0, z: 0} _levelUpUI: {fileID: 3736684284675310825} _activePickupsUI: {fileID: 1213143406} _activeUpgradesContainer: {fileID: 2111087225} @@ -34726,8 +34786,14 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2045264205} + - {fileID: 2045264206} m_Father: {fileID: 1577739326} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &2045264206 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7000002, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + m_PrefabInstance: {fileID: 928173568} + m_PrefabAsset: {fileID: 0} --- !u!1 &2111087225 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Pickups/ChainLightningEffect.cs b/Assets/Scripts/Pickups/ChainLightningEffect.cs new file mode 100644 index 00000000..ae128bf3 --- /dev/null +++ b/Assets/Scripts/Pickups/ChainLightningEffect.cs @@ -0,0 +1,221 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ChainLightningEffect : MonoBehaviour +{ + private float _duration; + private int _damage; + private float _fireInterval; + private int _chainCount; + private float _detectRadius; + private float _chainJumpRange; + + private float _expirationTime; + private Coroutine _effectCoroutine; + + [SerializeField] + [Tooltip("Optional LineRenderer to show lightning bolt (child object).")] + private LineRenderer _lineRenderer; + + [SerializeField] + [Tooltip("How long the lightning line is visible in seconds.")] + private float _lightningDisplayDuration = 0.15f; + + /// + /// Configure the effect. Call after instantiating, before the effect runs. + /// + public void Initialize( + float duration, + int damage, + float fireInterval, + int chainCount, + float detectRadius, + float chainJumpRange) + { + _duration = duration; + _damage = damage; + _fireInterval = fireInterval; + _chainCount = chainCount; + _detectRadius = detectRadius; + _chainJumpRange = chainJumpRange; + } + + /// + /// Add more time to the effect (e.g. when same pickup is collected again). + /// + public void ExtendDuration(float extraSeconds) + { + _expirationTime += extraSeconds; + } + + private void Start() + { + _expirationTime = Time.time + _duration; + _effectCoroutine = StartCoroutine(EffectLoop()); + } + + private void OnDisable() + { + if (_effectCoroutine != null) + { + StopCoroutine(_effectCoroutine); + } + } + + private IEnumerator EffectLoop() + { + // Wait for first strike after one interval (or strike immediately - plan says "each fireInterval") + yield return new WaitForSeconds(_fireInterval); + + while (Time.time < _expirationTime) + { + StrikeChainLightning(); + yield return new WaitForSeconds(_fireInterval); + } + + Destroy(gameObject); + } + + private void StrikeChainLightning() + { + Transform playerTransform = transform.parent != null ? transform.parent : Player.Instance.transform; + Vector3 origin = playerTransform.position; + + List chain = BuildChain(origin); + if (chain.Count == 0) + return; + + foreach (Enemy enemy in chain) + { + if (enemy != null && enemy.gameObject.activeInHierarchy) + { + enemy.TakeDamage(_damage); + enemy.Flash(); + if (SoundManager.Instance != null) + SoundManager.Instance.PlayHitSound(); + } + } + + ShowLightningBolt(origin, chain); + } + + private List BuildChain(Vector3 origin) + { + List chain = new List(); + List inRange = GetEnemiesInRange(origin, _detectRadius); + Enemy current = GetClosestEnemy(inRange, origin); + + if (current == null) + return chain; + + chain.Add(current); + Vector3 currentPos = current.transform.position; + + while (chain.Count < _chainCount) + { + inRange = GetEnemiesInRange(currentPos, _chainJumpRange); + Enemy next = GetClosestEnemyExcluding(inRange, currentPos, chain); + if (next == null) + break; + chain.Add(next); + currentPos = next.transform.position; + } + + return chain; + } + + private List GetEnemiesInRange(Vector3 position, float range) + { + List result = new List(); + RaycastHit2D[] hits = Physics2D.CircleCastAll(position, range, Vector2.zero); + + foreach (RaycastHit2D hit in hits) + { + if (hit.collider == null || !hit.collider.gameObject.CompareTag("Enemy")) + continue; + + var enemy = hit.collider.gameObject.GetComponent(); + if (enemy != null && enemy.gameObject.activeInHierarchy) + result.Add(enemy); + } + + return result; + } + + private Enemy GetClosestEnemy(List enemies, Vector3 fromPosition) + { + if (enemies == null || enemies.Count == 0) + return null; + + Enemy closest = null; + float minSqrDist = float.MaxValue; + + foreach (Enemy e in enemies) + { + if (e == null || !e.gameObject.activeInHierarchy) + continue; + + float sqrDist = (e.transform.position - fromPosition).sqrMagnitude; + if (sqrDist < minSqrDist) + { + minSqrDist = sqrDist; + closest = e; + } + } + + return closest; + } + + private Enemy GetClosestEnemyExcluding(List enemies, Vector3 fromPosition, List exclude) + { + if (enemies == null || enemies.Count == 0) + return null; + + var excludeSet = new HashSet(exclude); + Enemy closest = null; + float minSqrDist = float.MaxValue; + + foreach (Enemy e in enemies) + { + if (e == null || !e.gameObject.activeInHierarchy || excludeSet.Contains(e)) + continue; + + float sqrDist = (e.transform.position - fromPosition).sqrMagnitude; + if (sqrDist < minSqrDist) + { + minSqrDist = sqrDist; + closest = e; + } + } + + return closest; + } + + private void ShowLightningBolt(Vector3 origin, List chain) + { + if (_lineRenderer == null || chain.Count == 0) + return; + + StartCoroutine(ShowLightningCoroutine(origin, chain)); + } + + private IEnumerator ShowLightningCoroutine(Vector3 origin, List chain) + { + _lineRenderer.positionCount = chain.Count + 1; + _lineRenderer.SetPosition(0, origin); + + for (int i = 0; i < chain.Count; i++) + { + if (chain[i] != null && chain[i].gameObject.activeInHierarchy) + _lineRenderer.SetPosition(i + 1, chain[i].transform.position); + else + _lineRenderer.SetPosition(i + 1, i > 0 ? _lineRenderer.GetPosition(i) : origin); + } + + _lineRenderer.enabled = true; + yield return new WaitForSeconds(_lightningDisplayDuration); + if (_lineRenderer != null) + _lineRenderer.enabled = false; + } +} diff --git a/Assets/Scripts/Pickups/ChainLightningEffect.cs.meta b/Assets/Scripts/Pickups/ChainLightningEffect.cs.meta new file mode 100644 index 00000000..38ea8bc6 --- /dev/null +++ b/Assets/Scripts/Pickups/ChainLightningEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2c3d4e5f6078190a2b3c4d5e6f70891 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pickups/ChainLightningPickup.cs b/Assets/Scripts/Pickups/ChainLightningPickup.cs new file mode 100644 index 00000000..d3b569ef --- /dev/null +++ b/Assets/Scripts/Pickups/ChainLightningPickup.cs @@ -0,0 +1,62 @@ +using UnityEngine; + +public class ChainLightningPickup : PickupBase +{ + [SerializeField] + [Tooltip("Prefab of the hovering effect (ChainLightningEffect).")] + private GameObject _effectPrefab; + + [SerializeField] + [Tooltip("Damage per lightning strike per enemy.")] + private int _damage = 15; + + [SerializeField] + [Tooltip("Seconds between each chain lightning strike.")] + private float _fireInterval = 1.5f; + + [SerializeField] + [Tooltip("Max number of enemies hit per strike (chain length).")] + private int _chainCount = 4; + + [SerializeField] + [Tooltip("Radius to detect closest enemy from player.")] + private float _detectRadius = 12f; + + [SerializeField] + [Tooltip("Radius for lightning to jump to next enemy from last struck.")] + private float _chainJumpRange = 5f; + + protected override void OnCollect(Player player) + { + var existing = player.GetComponentInChildren(); + if (existing != null) + { + existing.ExtendDuration(_effectDuration); + return; + } + + if (_effectPrefab == null) + return; + + GameObject effectInstance = Instantiate(_effectPrefab, player.transform); + effectInstance.transform.localPosition = new Vector3(0, 1.2f, 0); + + var effect = effectInstance.GetComponent(); + if (effect != null) + { + effect.Initialize( + _effectDuration, + _damage, + _fireInterval, + _chainCount, + _detectRadius, + _chainJumpRange + ); + } + } + + protected override string GetEffectText() + { + return "Chain lightning!"; + } +} diff --git a/Assets/Scripts/Pickups/ChainLightningPickup.cs.meta b/Assets/Scripts/Pickups/ChainLightningPickup.cs.meta new file mode 100644 index 00000000..7f5d8fe3 --- /dev/null +++ b/Assets/Scripts/Pickups/ChainLightningPickup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3d4e5f6078190a2b3c4d5e6f70891a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SceneManagers/BattleSceneManager.cs b/Assets/Scripts/SceneManagers/BattleSceneManager.cs index 15b6628b..6cc9a702 100644 --- a/Assets/Scripts/SceneManagers/BattleSceneManager.cs +++ b/Assets/Scripts/SceneManagers/BattleSceneManager.cs @@ -91,6 +91,14 @@ public class BattleSceneManager : MonoBehaviour [Tooltip("List of pickup prefabs to randomly spawn")] private GameObject[] _pickupPrefabs; + [SerializeField] + [Tooltip("Optional pickup to spawn once at game start next to the player (e.g. Chain Lightning)")] + private GameObject _startingPickupPrefab; + + [SerializeField] + [Tooltip("Offset from player position for the starting pickup spawn")] + private Vector3 _startingPickupOffset = new Vector3(2f, 0f, 0f); + [SerializeField] [Tooltip("The level up UI prefab to spawn")] private GameObject _levelUpUI; @@ -242,12 +250,20 @@ void Start() _lastEnemySpawnTime = Time.time; _lastWaveSpawnTime = Time.time; _lastPickupSpawnTime = Time.time; - _pickupsOnScreen = 1; + // Count pickups already in scene (e.g. under Level/Pickups) so spawn limit is correct + _pickupsOnScreen = _pickupParentTransform != null ? _pickupParentTransform.childCount : 0; _gameStartTime = Time.time; SetCurrentLevel(_currentLevel); + if (_startingPickupPrefab != null && Player.Instance != null) + { + var startingPickup = Instantiate(_startingPickupPrefab, _pickupParentTransform, true); + startingPickup.transform.position = Player.Instance.transform.position + _startingPickupOffset; + _pickupsOnScreen++; + } + EventManager.AddListener( "EnemyDestroyed", (eventData) => @@ -827,13 +843,31 @@ private void SpawnDeath() private void SpawnPickup() { + if (_pickupPrefabs == null || _pickupPrefabs.Length == 0) + { + return; + } + if (_pickupsOnScreen >= _maxPickupsOnScreen) { return; } - var index = random.Next(_pickupPrefabs.Length); - var pickup = Instantiate(_pickupPrefabs[index], _pickupParentTransform, true); + // Filter out missing/broken prefab references + var validPrefabs = new List(); + foreach (var prefab in _pickupPrefabs) + { + if (prefab != null) + validPrefabs.Add(prefab); + } + + if (validPrefabs.Count == 0) + { + return; + } + + var index = random.Next(validPrefabs.Count); + var pickup = Instantiate(validPrefabs[index], _pickupParentTransform, true); pickup.transform.position = GetRandomSpawnPoint(); _pickupsOnScreen++; diff --git a/Assets/Scripts/SceneManagers/BattleSceneManager.cs.meta b/Assets/Scripts/SceneManagers/BattleSceneManager.cs.meta index c8eb932c..54aa3b70 100644 --- a/Assets/Scripts/SceneManagers/BattleSceneManager.cs.meta +++ b/Assets/Scripts/SceneManagers/BattleSceneManager.cs.meta @@ -3,7 +3,20 @@ guid: 84e681e7688644d2ba29ad98a6fe47a5 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - _spawnPlane: {instanceID: 0} + - _sentaurEnemyPrefab: {instanceID: 0} + - _antEnemyPrefab: {instanceID: 0} + - _headEnemyPrefab: {instanceID: 0} + - _mantisEnemyPrefab: {instanceID: 0} + - _deathEnemyPrefab: {instanceID: 0} + - _linearEnemyPrefab: {instanceID: 0} + - _randomEnemyPrefab: {instanceID: 0} + - _startingPickupPrefab: {fileID: 6000001, guid: d4e5f6078190a2b3c4d5e6f70891a3b4, type: 3} + - _levelUpUI: {instanceID: 0} + - _activePickupsUI: {instanceID: 0} + - _activeUpgradesContainer: {instanceID: 0} + - _backgroundMusic: {instanceID: 0} executionOrder: 0 icon: {instanceID: 0} userData: From 9563faecb9d7caa21bcdee0c8fb51f949cf9309c Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:59:53 +0100 Subject: [PATCH 2/4] add some j u i c e --- .../Graphics/Animation/ChainLightningOrb.anim | 72 +- .../Graphics/Sprites/Pickups/Seer_blink.png | Bin 0 -> 2895 bytes .../Sprites/Pickups/Seer_blink.png.meta | 728 ++++++++++++++++++ .../Pickups/ChainLightningEffect.prefab | 10 +- .../Pickups/ChainLightningPickup.prefab | 4 +- .../Scripts/Pickups/ChainLightningEffect.cs | 23 +- 6 files changed, 819 insertions(+), 18 deletions(-) create mode 100644 Assets/Graphics/Sprites/Pickups/Seer_blink.png create mode 100644 Assets/Graphics/Sprites/Pickups/Seer_blink.png.meta diff --git a/Assets/Graphics/Animation/ChainLightningOrb.anim b/Assets/Graphics/Animation/ChainLightningOrb.anim index 074daf6b..167adfc1 100644 --- a/Assets/Graphics/Animation/ChainLightningOrb.anim +++ b/Assets/Graphics/Animation/ChainLightningOrb.anim @@ -21,7 +21,51 @@ AnimationClip: - serializedVersion: 2 curve: - time: 0 - value: {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + value: {fileID: 3112027180600672057, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.083333336 + value: {fileID: -3658826879486719873, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.16666667 + value: {fileID: 231708683369588047, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.25 + value: {fileID: -1208587394263326236, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.33333334 + value: {fileID: 236422566541920856, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.41666669 + value: {fileID: -3508679888957169061, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.5 + value: {fileID: -6094687489715682315, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.58333337 + value: {fileID: 2883065883746469608, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.6666667 + value: {fileID: -8982159857408402294, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.75 + value: {fileID: -799279947985030534, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.83333337 + value: {fileID: 4510625927976728850, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 0.9166667 + value: {fileID: 2113366754050510075, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1 + value: {fileID: 4369064337180826890, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.0833334 + value: {fileID: -1969633779704712751, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.1666667 + value: {fileID: -3899788003005307118, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.25 + value: {fileID: -4962171180683232601, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.3333334 + value: {fileID: -2370864095218513919, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.4166667 + value: {fileID: 1049491602104027953, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.5 + value: {fileID: -4183983715464417217, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.5833334 + value: {fileID: -4233451866447810493, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.6666667 + value: {fileID: -2414805374548436684, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.75 + value: {fileID: -1628643192592974098, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - time: 1.8333334 + value: {fileID: 3935560846184996004, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} attribute: m_Sprite path: classID: 212 @@ -44,13 +88,35 @@ AnimationClip: isIntCurve: 0 isSerializeReferenceCurve: 0 pptrCurveMapping: - - {fileID: 21300000, guid: 5e2a42506cbea4b5293b0461bc112382, type: 3} + - {fileID: 3112027180600672057, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -3658826879486719873, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 231708683369588047, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -1208587394263326236, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 236422566541920856, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -3508679888957169061, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -6094687489715682315, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 2883065883746469608, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -8982159857408402294, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -799279947985030534, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 4510625927976728850, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 2113366754050510075, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 4369064337180826890, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -1969633779704712751, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -3899788003005307118, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -4962171180683232601, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -2370864095218513919, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 1049491602104027953, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -4183983715464417217, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -4233451866447810493, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -2414805374548436684, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: -1628643192592974098, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} + - {fileID: 3935560846184996004, guid: fc169414b3a5341e9a0b1241daa48455, type: 3} m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.083333336 + m_StopTime: 1.9166667 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 diff --git a/Assets/Graphics/Sprites/Pickups/Seer_blink.png b/Assets/Graphics/Sprites/Pickups/Seer_blink.png new file mode 100644 index 0000000000000000000000000000000000000000..a49e0ef11f4ad9be347afb81e0d2ad2cdc8376f3 GIT binary patch literal 2895 zcmb`JYarA6AICSVC0V)D(U7G=>j(!$l({6i%r*C+Qz2&wsgTR&-rVV+LeqsPqmoQ$ zlV&Pea@y$cGP6+9CN$Hw-~Z>F^WdB(|407^-^=g&`8<2Se((2(JvP;Cqu)HzsWGLW2F;xb z-Ix6Vnm63tO~$@`DmHN3D9s?Yn_;gwN4z%doJr3kudbI2cs*^0Z> zH181=v{&pj2z*He;SymBh7{9<+?qmm(+Yze`~g=Vk03>*@Yjs7(9oV(P+Fy7$BA@ zMON-Qsm)7J)$Ry)#uT8KInxXvR)3&&)^FV0?_kJn;1+apRBu;h?WbR`Q5lmlBr^)>0JW7g7HogpqfKC`%EVp{py{> ze~G1Dl;OGEQMk0UWE73?6q)qgCq7xnh4x@y@9SmIc4FE}EaRW~p%SOZb1@P0aN8!r zRO+sED*O3gNlbi5CXXygd019^DDq%=yVY%(BWy}#$oOo#J4HT_>WOCnvP}M&6_%o3 z^N%|UBX}3d$I+&8cD;GxEXL&c=bM-ErE?fUm331*ev*!0H_l$bj8yw}w8U`Xc+S#O z)LEsT3Z(Eqg@P+;wmjT;ZUyx~e{|)K4yAAWmEe&VZ(_10N2W82m@6i*4;deBDD3ue zg(8ja=JmvRSi?u`!;1Nvi=eTuPA93YJw*>X^^@bj%2P3pPS;)&buvu_AVxELn$pU_ zc4vi%F>fgHt#|NRL-cl7+2(g0_vMVM?{_E!dvc$_^+OxQUc0x$ZroCww0fZn`}S%0 zwiOTi@J5E)#~6eBaYv5$k!eDkc9n zq^t^dvg?;D*k%Q)EY1w=G(BEKT7NgPk4z$xc+M7g>44AHM{>62793`@goK+ zU2cZEkU}g-5fLer^)CRigJD>}yH-*i)9s1bAcJU60@BR-#3LpS(cJqnqw zLC15|`MlA5ROjBfbGmWXn9MP;i0`H@bgW*0dX*~n?51jO4gSLZYP<6j*_3-LC;!U# zJq>$pcVaJITOOwsRbqi_P<(Lm@SeDh;p6ibb~JSG&{C$ji^U!`0ieeOmJU8O zQ0OHFozgVxW%q^BDGI+ybwR+e-y-IH!1I59H{$7(Yj`OdM9s}3D+YDq3RJxK#RD~8 zdy2;q6D?4}yLd8-xuI=s$Fe^&E^;UX!od$bhN-s|&nqnkqS9LM+hr_4KF%L_4_Zl7 z&+wlp2|oX2O^KxKvU0J@SO3}0^?&jP)rKpqE+Romgd6Nc(WE|y- zw$4!?=^olARhQYrdfE$%UA<@v6Z&EI-pt1eOy3`Z?Rfm`&@LH^7MIlne4qT$tyJJu zp`-)C;zD9Yxc@4o(oAXWH9SDyD!}kl;C0M>nLn(=U9nMlBBFpld6&791c&C{dOopdsqKbCzVt&smN?&ZP0dW6fm$On&IaC$-(jo4H%PZ zY#m~Y`?xdc9nSs?il;Tap~TTF0rZed==)S}kQi^{Pr8O{Pgxs=ZfSJ_L365&iTc)$ zgD?8{&8vZAseK%{(+YY`>+>919Z`|GyHK|ieD2)hBe4g$vQIGmM4=}jW~$nFWLqdw zxH)vINP9oB$c?47q#Wg>n^Lu@ZUK71ikps=e}HbVAKcj6uc|U9%|y);Qlj{;R+{!7 z$0eEYKt}-vlYBXZQfMq=+&RN$8Qbrl$duei_&JUJ@$JKU26;^E5{GZ91v~J$0uZ0s zzBqd@x^RJ#G0={x#ErG9N#*X0Culxyn0t6cBA7J4bb46j_7T7y_T;P8ME5r(ia?n} zixjn&fSOL_L}e?dIBU9Z)zuPlt{X8?OiJfZfFVPbWxF?aMbrpnL%Y}YF3lY^w$vzO z_ngBIt&NSPOzN(QL}#rdkW4B?T)il}-qOz^erteNTzY;D6&c8LQ#YDUNkiuS&hBxF zoHIDTR_57QFSh*XHj1dnd7Z46T!Fjn9kU2)O8dj^Ony*vutX4Yw7(YUBkpT=!*&G< zl!5Od2LoEdN5{aF>a~kcZJr?dN<48?n@?6v3Dneo+-7QZj8j9{PQ*$F z7Rg8>y}nLn>8J;&uLIg}tQ;IXoZ(V)P+#HhkBlE621zfgQ4SymS~VTlUSYqjX*0MWUf)ruNN!4;w|+jp&@M6q5-e*F@0U2Aahh`E-isSh=Mjyc-^ z^}KB%FitL# zgZcI5w-@f3wk-_x5pTRaw_j7p_sc<;`8{REZam9<8PhUk0<#(qh&iB9NZrSaCaX2l zLl*Mlo`#3fEp /// Configure the effect. Call after instantiating, before the effect runs. @@ -79,8 +79,8 @@ private IEnumerator EffectLoop() private void StrikeChainLightning() { - Transform playerTransform = transform.parent != null ? transform.parent : Player.Instance.transform; - Vector3 origin = playerTransform.position; + // Lightning originates from the Seer sprite (this effect's position above the player) + Vector3 origin = transform.position; List chain = BuildChain(origin); if (chain.Count == 0) @@ -203,18 +203,25 @@ private void ShowLightningBolt(Vector3 origin, List chain) private IEnumerator ShowLightningCoroutine(Vector3 origin, List chain) { _lineRenderer.positionCount = chain.Count + 1; - _lineRenderer.SetPosition(0, origin); - + Vector3[] targetPositions = new Vector3[chain.Count]; for (int i = 0; i < chain.Count; i++) { if (chain[i] != null && chain[i].gameObject.activeInHierarchy) - _lineRenderer.SetPosition(i + 1, chain[i].transform.position); + targetPositions[i] = chain[i].transform.position; else - _lineRenderer.SetPosition(i + 1, i > 0 ? _lineRenderer.GetPosition(i) : origin); + targetPositions[i] = i > 0 ? targetPositions[i - 1] : origin; } _lineRenderer.enabled = true; - yield return new WaitForSeconds(_lightningDisplayDuration); + float elapsed = 0f; + while (elapsed < _lightningDisplayDuration) + { + _lineRenderer.SetPosition(0, transform.position); + for (int i = 0; i < targetPositions.Length; i++) + _lineRenderer.SetPosition(i + 1, targetPositions[i]); + elapsed += Time.deltaTime; + yield return null; + } if (_lineRenderer != null) _lineRenderer.enabled = false; } From 8bc41ec3a62b623907a86d0b28c23a6110a2281e Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:08:08 +0100 Subject: [PATCH 3/4] fix pickup spawning + add bobbing animation --- .../Pickups/ChainLightningEffect.prefab | 2 ++ .../Pickups/ChainLightningPickup.prefab | 4 ++-- Assets/Scenes/BattleScene.unity | 2 +- .../Scripts/Pickups/ChainLightningEffect.cs | 21 +++++++++++++++++++ .../Scripts/Pickups/ChainLightningPickup.cs | 2 +- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab index 63bc5a7d..1493a025 100644 --- a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab @@ -49,6 +49,8 @@ MonoBehaviour: m_EditorClassIdentifier: _lineRenderer: {fileID: 6000012} _lightningDisplayDuration: 0.15 + _bobAmplitude: 0.08 + _bobFrequency: 0.5 --- !u!212 &6000004 SpriteRenderer: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab index e934de98..84c74705 100644 --- a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab @@ -48,7 +48,7 @@ MonoBehaviour: m_EditorClassIdentifier: _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} _scoreValue: 100 - _effectDuration: 60 + _effectDuration: 10 _effectText: Chain lightning! _effectPrefab: {fileID: 6000001, guid: d4e5f6078190a2b3c4d5e6f70891a3b4, type: 3} _damage: 15 @@ -149,7 +149,7 @@ BoxCollider2D: m_SpriteTilingProperty: border: {x: 0, y: 0, z: 0, w: 0} pivot: {x: 0.5, y: 0.5} - oldSize: {x: 1, y: 1} + oldSize: {x: 0.84375, y: 0.5625} newSize: {x: 1, y: 1} adaptiveTilingThreshold: 0.5 drawMode: 0 diff --git a/Assets/Scenes/BattleScene.unity b/Assets/Scenes/BattleScene.unity index a63ba57b..a19f6d0d 100644 --- a/Assets/Scenes/BattleScene.unity +++ b/Assets/Scenes/BattleScene.unity @@ -11508,7 +11508,7 @@ MonoBehaviour: - {fileID: 3306419623360918530, guid: c62e469089fde4fc98d1c3363f2ea177, type: 3} - {fileID: 3306419623360918530, guid: d109130e8f6de4b86a470d567292aa28, type: 3} - {fileID: 3306419623360918530, guid: 6cde6a2c228dc40d0b42ba0b19ca2fc3, type: 3} - - {fileID: 3306419623360918530, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + - {fileID: 7000001, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} _startingPickupPrefab: {fileID: 0} _startingPickupOffset: {x: 2, y: 0, z: 0} _levelUpUI: {fileID: 3736684284675310825} diff --git a/Assets/Scripts/Pickups/ChainLightningEffect.cs b/Assets/Scripts/Pickups/ChainLightningEffect.cs index 3c873a8b..bdc1cb70 100644 --- a/Assets/Scripts/Pickups/ChainLightningEffect.cs +++ b/Assets/Scripts/Pickups/ChainLightningEffect.cs @@ -22,6 +22,16 @@ public class ChainLightningEffect : MonoBehaviour [Tooltip("How long the lightning line is visible in seconds.")] private float _lightningDisplayDuration = 0.5f; + [SerializeField] + [Tooltip("Vertical bobbing amplitude above the player (world units).")] + private float _bobAmplitude = 0.08f; + + [SerializeField] + [Tooltip("Bobbing speed (cycles per second).")] + private float _bobFrequency = 0.5f; + + private float _baseLocalY; + /// /// Configure the effect. Call after instantiating, before the effect runs. /// @@ -51,10 +61,21 @@ public void ExtendDuration(float extraSeconds) private void Start() { + _baseLocalY = transform.localPosition.y; _expirationTime = Time.time + _duration; _effectCoroutine = StartCoroutine(EffectLoop()); } + private void Update() + { + // Frequency in Hz (cycles per second); 2*PI converts to radians per second + float radiansPerSecond = _bobFrequency * 2f * Mathf.PI; + float bob = _bobAmplitude * Mathf.Sin(Time.time * radiansPerSecond); + var pos = transform.localPosition; + pos.y = _baseLocalY + bob; + transform.localPosition = pos; + } + private void OnDisable() { if (_effectCoroutine != null) diff --git a/Assets/Scripts/Pickups/ChainLightningPickup.cs b/Assets/Scripts/Pickups/ChainLightningPickup.cs index d3b569ef..bdf1ffe7 100644 --- a/Assets/Scripts/Pickups/ChainLightningPickup.cs +++ b/Assets/Scripts/Pickups/ChainLightningPickup.cs @@ -57,6 +57,6 @@ protected override void OnCollect(Player player) protected override string GetEffectText() { - return "Chain lightning!"; + return "Seer sees all!"; } } From 1ceac42f68c7a9d1eefd1720f8215fbfa2b8bdeb Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:16:41 +0100 Subject: [PATCH 4/4] layer of lightning bolt --- Assets/Prefabs/Pickups/ChainLightningEffect.prefab | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab index 1493a025..2d3b6fc9 100644 --- a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab @@ -202,9 +202,9 @@ LineRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 23827671 - m_SortingLayer: -1 - m_SortingOrder: 2 + m_SortingLayerID: 740904935 + m_SortingLayer: 2 + m_SortingOrder: 10 m_Positions: - {x: 0, y: 0, z: 0} - {x: 1, y: 0, z: 0}
jP)rKpqE+Romgd6Nc(WE|y- zw$4!?=^olARhQYrdfE$%UA<@v6Z&EI-pt1eOy3`Z?Rfm`&@LH^7MIlne4qT$tyJJu zp`-)C;zD9Yxc@4o(oAXWH9SDyD!}kl;C0M>nLn(=U9nMlBBFpld6&791c&C{dOopdsqKbCzVt&smN?&ZP0dW6fm$On&IaC$-(jo4H%PZ zY#m~Y`?xdc9nSs?il;Tap~TTF0rZed==)S}kQi^{Pr8O{Pgxs=ZfSJ_L365&iTc)$ zgD?8{&8vZAseK%{(+YY`>+>919Z`|GyHK|ieD2)hBe4g$vQIGmM4=}jW~$nFWLqdw zxH)vINP9oB$c?47q#Wg>n^Lu@ZUK71ikps=e}HbVAKcj6uc|U9%|y);Qlj{;R+{!7 z$0eEYKt}-vlYBXZQfMq=+&RN$8Qbrl$duei_&JUJ@$JKU26;^E5{GZ91v~J$0uZ0s zzBqd@x^RJ#G0={x#ErG9N#*X0Culxyn0t6cBA7J4bb46j_7T7y_T;P8ME5r(ia?n} zixjn&fSOL_L}e?dIBU9Z)zuPlt{X8?OiJfZfFVPbWxF?aMbrpnL%Y}YF3lY^w$vzO z_ngBIt&NSPOzN(QL}#rdkW4B?T)il}-qOz^erteNTzY;D6&c8LQ#YDUNkiuS&hBxF zoHIDTR_57QFSh*XHj1dnd7Z46T!Fjn9kU2)O8dj^Ony*vutX4Yw7(YUBkpT=!*&G< zl!5Od2LoEdN5{aF>a~kcZJr?dN<48?n@?6v3Dneo+-7QZj8j9{PQ*$F z7Rg8>y}nLn>8J;&uLIg}tQ;IXoZ(V)P+#HhkBlE621zfgQ4SymS~VTlUSYqjX*0MWUf)ruNN!4;w|+jp&@M6q5-e*F@0U2Aahh`E-isSh=Mjyc-^ z^}KB%FitL# zgZcI5w-@f3wk-_x5pTRaw_j7p_sc<;`8{REZam9<8PhUk0<#(qh&iB9NZrSaCaX2l zLl*Mlo`#3fEp /// Configure the effect. Call after instantiating, before the effect runs. @@ -79,8 +79,8 @@ private IEnumerator EffectLoop() private void StrikeChainLightning() { - Transform playerTransform = transform.parent != null ? transform.parent : Player.Instance.transform; - Vector3 origin = playerTransform.position; + // Lightning originates from the Seer sprite (this effect's position above the player) + Vector3 origin = transform.position; List chain = BuildChain(origin); if (chain.Count == 0) @@ -203,18 +203,25 @@ private void ShowLightningBolt(Vector3 origin, List chain) private IEnumerator ShowLightningCoroutine(Vector3 origin, List chain) { _lineRenderer.positionCount = chain.Count + 1; - _lineRenderer.SetPosition(0, origin); - + Vector3[] targetPositions = new Vector3[chain.Count]; for (int i = 0; i < chain.Count; i++) { if (chain[i] != null && chain[i].gameObject.activeInHierarchy) - _lineRenderer.SetPosition(i + 1, chain[i].transform.position); + targetPositions[i] = chain[i].transform.position; else - _lineRenderer.SetPosition(i + 1, i > 0 ? _lineRenderer.GetPosition(i) : origin); + targetPositions[i] = i > 0 ? targetPositions[i - 1] : origin; } _lineRenderer.enabled = true; - yield return new WaitForSeconds(_lightningDisplayDuration); + float elapsed = 0f; + while (elapsed < _lightningDisplayDuration) + { + _lineRenderer.SetPosition(0, transform.position); + for (int i = 0; i < targetPositions.Length; i++) + _lineRenderer.SetPosition(i + 1, targetPositions[i]); + elapsed += Time.deltaTime; + yield return null; + } if (_lineRenderer != null) _lineRenderer.enabled = false; } From 8bc41ec3a62b623907a86d0b28c23a6110a2281e Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:08:08 +0100 Subject: [PATCH 3/4] fix pickup spawning + add bobbing animation --- .../Pickups/ChainLightningEffect.prefab | 2 ++ .../Pickups/ChainLightningPickup.prefab | 4 ++-- Assets/Scenes/BattleScene.unity | 2 +- .../Scripts/Pickups/ChainLightningEffect.cs | 21 +++++++++++++++++++ .../Scripts/Pickups/ChainLightningPickup.cs | 2 +- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab index 63bc5a7d..1493a025 100644 --- a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab @@ -49,6 +49,8 @@ MonoBehaviour: m_EditorClassIdentifier: _lineRenderer: {fileID: 6000012} _lightningDisplayDuration: 0.15 + _bobAmplitude: 0.08 + _bobFrequency: 0.5 --- !u!212 &6000004 SpriteRenderer: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab index e934de98..84c74705 100644 --- a/Assets/Prefabs/Pickups/ChainLightningPickup.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningPickup.prefab @@ -48,7 +48,7 @@ MonoBehaviour: m_EditorClassIdentifier: _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} _scoreValue: 100 - _effectDuration: 60 + _effectDuration: 10 _effectText: Chain lightning! _effectPrefab: {fileID: 6000001, guid: d4e5f6078190a2b3c4d5e6f70891a3b4, type: 3} _damage: 15 @@ -149,7 +149,7 @@ BoxCollider2D: m_SpriteTilingProperty: border: {x: 0, y: 0, z: 0, w: 0} pivot: {x: 0.5, y: 0.5} - oldSize: {x: 1, y: 1} + oldSize: {x: 0.84375, y: 0.5625} newSize: {x: 1, y: 1} adaptiveTilingThreshold: 0.5 drawMode: 0 diff --git a/Assets/Scenes/BattleScene.unity b/Assets/Scenes/BattleScene.unity index a63ba57b..a19f6d0d 100644 --- a/Assets/Scenes/BattleScene.unity +++ b/Assets/Scenes/BattleScene.unity @@ -11508,7 +11508,7 @@ MonoBehaviour: - {fileID: 3306419623360918530, guid: c62e469089fde4fc98d1c3363f2ea177, type: 3} - {fileID: 3306419623360918530, guid: d109130e8f6de4b86a470d567292aa28, type: 3} - {fileID: 3306419623360918530, guid: 6cde6a2c228dc40d0b42ba0b19ca2fc3, type: 3} - - {fileID: 3306419623360918530, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} + - {fileID: 7000001, guid: e5f6078190a2b3c4d5e6f70891a3b4c5, type: 3} _startingPickupPrefab: {fileID: 0} _startingPickupOffset: {x: 2, y: 0, z: 0} _levelUpUI: {fileID: 3736684284675310825} diff --git a/Assets/Scripts/Pickups/ChainLightningEffect.cs b/Assets/Scripts/Pickups/ChainLightningEffect.cs index 3c873a8b..bdc1cb70 100644 --- a/Assets/Scripts/Pickups/ChainLightningEffect.cs +++ b/Assets/Scripts/Pickups/ChainLightningEffect.cs @@ -22,6 +22,16 @@ public class ChainLightningEffect : MonoBehaviour [Tooltip("How long the lightning line is visible in seconds.")] private float _lightningDisplayDuration = 0.5f; + [SerializeField] + [Tooltip("Vertical bobbing amplitude above the player (world units).")] + private float _bobAmplitude = 0.08f; + + [SerializeField] + [Tooltip("Bobbing speed (cycles per second).")] + private float _bobFrequency = 0.5f; + + private float _baseLocalY; + /// /// Configure the effect. Call after instantiating, before the effect runs. /// @@ -51,10 +61,21 @@ public void ExtendDuration(float extraSeconds) private void Start() { + _baseLocalY = transform.localPosition.y; _expirationTime = Time.time + _duration; _effectCoroutine = StartCoroutine(EffectLoop()); } + private void Update() + { + // Frequency in Hz (cycles per second); 2*PI converts to radians per second + float radiansPerSecond = _bobFrequency * 2f * Mathf.PI; + float bob = _bobAmplitude * Mathf.Sin(Time.time * radiansPerSecond); + var pos = transform.localPosition; + pos.y = _baseLocalY + bob; + transform.localPosition = pos; + } + private void OnDisable() { if (_effectCoroutine != null) diff --git a/Assets/Scripts/Pickups/ChainLightningPickup.cs b/Assets/Scripts/Pickups/ChainLightningPickup.cs index d3b569ef..bdf1ffe7 100644 --- a/Assets/Scripts/Pickups/ChainLightningPickup.cs +++ b/Assets/Scripts/Pickups/ChainLightningPickup.cs @@ -57,6 +57,6 @@ protected override void OnCollect(Player player) protected override string GetEffectText() { - return "Chain lightning!"; + return "Seer sees all!"; } } From 1ceac42f68c7a9d1eefd1720f8215fbfa2b8bdeb Mon Sep 17 00:00:00 2001 From: JoshuaMoelans <60878493+JoshuaMoelans@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:16:41 +0100 Subject: [PATCH 4/4] layer of lightning bolt --- Assets/Prefabs/Pickups/ChainLightningEffect.prefab | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab index 1493a025..2d3b6fc9 100644 --- a/Assets/Prefabs/Pickups/ChainLightningEffect.prefab +++ b/Assets/Prefabs/Pickups/ChainLightningEffect.prefab @@ -202,9 +202,9 @@ LineRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 23827671 - m_SortingLayer: -1 - m_SortingOrder: 2 + m_SortingLayerID: 740904935 + m_SortingLayer: 2 + m_SortingOrder: 10 m_Positions: - {x: 0, y: 0, z: 0} - {x: 1, y: 0, z: 0}