@@ -11,13 +11,21 @@ var max_cracks = 5 # Maximum number of crack layers
1111var current_crack_count = 0
1212var crack_sprites = []
1313
14+ # Pressure damage system
15+ var pressure_cracks = []
16+ var max_pressure_cracks = 8
17+ var current_pressure_cracks = 0
18+ var is_under_pressure = false
19+ var pressure_accumulation_timer = 0.0
20+ var pressure_crack_spawn_interval = 1.0 # Spawn new crack every second under pressure
21+
1422func _ready ():
1523 # Initialize with invisible effects
1624 red_flash .modulate .a = 0
1725 red_flash .color = Color (1 , 0 , 0 , 0 ) # Pure red, fully transparent initially
1826 print ("Damage effects initialized" )
1927
20- # Called when player takes damage
28+ # Called when player takes regular damage
2129func show_damage_effects ():
2230 print ("Showing damage effects - red flash and adding crack layer" )
2331 print ("Current crack count before: " , current_crack_count , "/" , max_cracks )
@@ -34,6 +42,32 @@ func show_damage_effects():
3442 else :
3543 print ("Max cracks reached, not adding more" )
3644
45+ # Called every frame while player is taking pressure damage
46+ func process_pressure_damage (delta ):
47+ if not is_under_pressure :
48+ is_under_pressure = true
49+ pressure_accumulation_timer = 0.0
50+ print ("PRESSURE DAMAGE STARTED - all cracks will persist" )
51+ # Cancel all existing crack fade timers
52+ cancel_all_crack_fades ()
53+
54+ pressure_accumulation_timer += delta
55+
56+ # Add new pressure crack every interval
57+ if pressure_accumulation_timer >= pressure_crack_spawn_interval and current_pressure_cracks < max_pressure_cracks :
58+ add_pressure_crack ()
59+ pressure_accumulation_timer = 0.0
60+
61+ # Grow existing pressure cracks over time
62+ grow_pressure_cracks (delta )
63+
64+ # Called when pressure damage stops
65+ func end_pressure_damage ():
66+ if is_under_pressure :
67+ is_under_pressure = false
68+ print ("PRESSURE DAMAGE ENDED - all cracks will start fading" )
69+ start_all_cracks_fade ()
70+
3771func add_crack_layer ():
3872 print ("Adding crack layer..." )
3973 current_crack_count += 1
@@ -51,16 +85,27 @@ func add_crack_layer():
5185 crack_sprite .texture = crack_texture
5286 print ("Crack texture loaded successfully" )
5387
54- # Set up the crack sprite properties
55- crack_sprite .layout_mode = 1
56- crack_sprite .anchors_preset = 15 # Fill the screen
57- crack_sprite .anchor_right = 1.0
58- crack_sprite .anchor_bottom = 1.0
59- crack_sprite .grow_horizontal = 2
60- crack_sprite .grow_vertical = 2
88+ # Set up the crack sprite properties for positioned cracks
89+ crack_sprite .layout_mode = 0 # Free positioning
6190 crack_sprite .mouse_filter = Control .MOUSE_FILTER_IGNORE
6291 crack_sprite .expand_mode = TextureRect .EXPAND_FIT_WIDTH_PROPORTIONAL
63- crack_sprite .stretch_mode = TextureRect .STRETCH_KEEP_CENTERED
92+ crack_sprite .stretch_mode = TextureRect .STRETCH_KEEP_ASPECT_CENTERED
93+
94+ # Random size for variety (between 50% and 150% of base size)
95+ var scale_factor = randf_range (0.5 , 1.5 )
96+ var crack_size = Vector2 (200 , 200 ) * scale_factor # Base size 200x200
97+ crack_sprite .custom_minimum_size = crack_size
98+ crack_sprite .size = crack_size
99+
100+ # Random position on screen (ensure cracks stay within screen bounds)
101+ var screen_size = get_viewport ().get_visible_rect ().size
102+ var max_x = screen_size .x - crack_size .x
103+ var max_y = screen_size .y - crack_size .y
104+ var random_pos = Vector2 (
105+ randf_range (0 , max_x ),
106+ randf_range (0 , max_y )
107+ )
108+ crack_sprite .position = random_pos
64109
65110 # Make cracks more visible with different opacities
66111 var crack_alpha = 0.8 - (current_crack_count * 0.1 ) # Start at 0.8, decrease slightly
@@ -69,18 +114,32 @@ func add_crack_layer():
69114 # Randomize the crack appearance
70115 crack_sprite .rotation = randf () * 2 * PI # Random rotation
71116
117+ # Mark as not fading yet
118+ crack_sprite .set_meta ("is_fading" , false )
119+
72120 # Add to scene
73121 add_child (crack_sprite )
74122 crack_sprites .append (crack_sprite )
75123
76- print ("Added crack layer " , current_crack_count , "/" , max_cracks , " with alpha: " , crack_alpha )
124+ print ("Added crack layer " , current_crack_count , "/" , max_cracks , " at position: " , random_pos , " with size: " , crack_size , " and alpha: " , crack_alpha )
77125 print ("Total crack sprites: " , crack_sprites .size ())
78126
127+ # Only start fade timer if NOT under pressure
128+ if not is_under_pressure :
129+ start_crack_fade_timer (crack_sprite )
130+
131+ func start_crack_fade_timer (crack_sprite ):
132+ # Store original alpha for restoration if needed
133+ crack_sprite .set_meta ("original_alpha" , crack_sprite .modulate .a )
134+
79135 # Fade out this crack over time (but make it slower so cracks accumulate)
80136 var crack_tween = create_tween ()
81137 crack_tween .tween_interval (crack_fade_time ) # Wait before starting to fade
82138 crack_tween .tween_property (crack_sprite , "modulate:a" , 0 , 1.0 ) # Then fade out over 1 second
83139 crack_tween .tween_callback (func (): remove_crack_layer (crack_sprite ))
140+
141+ # Store the tween reference so we can cancel it later if needed
142+ crack_sprite .set_meta ("fade_tween" , crack_tween )
84143
85144func remove_crack_layer (crack_sprite ):
86145 if crack_sprite and is_instance_valid (crack_sprite ):
@@ -96,6 +155,12 @@ func clear_all_cracks():
96155 crack .queue_free ()
97156 crack_sprites .clear ()
98157 current_crack_count = 0
158+
159+ for crack in pressure_cracks :
160+ if is_instance_valid (crack ):
161+ crack .queue_free ()
162+ pressure_cracks .clear ()
163+ current_pressure_cracks = 0
99164 print ("Cleared all crack layers" )
100165
101166# Test function - call this to manually test crack accumulation
@@ -104,3 +169,139 @@ func test_add_cracks():
104169 for i in range (3 ):
105170 show_damage_effects ()
106171 await get_tree ().create_timer (0.2 ).timeout # Small delay between cracks
172+
173+ func add_pressure_crack ():
174+ print ("Adding pressure crack..." )
175+ current_pressure_cracks += 1
176+
177+ # Create a new pressure crack sprite
178+ var crack_sprite = TextureRect .new ()
179+ crack_sprite .name = "PressureCrack" + str (current_pressure_cracks )
180+
181+ # Load the texture
182+ var crack_texture = load ("res://textures/effects/screen_crack.png" )
183+ if crack_texture == null :
184+ print ("ERROR: Could not load crack texture!" )
185+ return
186+
187+ crack_sprite .texture = crack_texture
188+
189+ # Set up as a pressure crack (starts smaller, will grow)
190+ crack_sprite .layout_mode = 0 # Free positioning
191+ crack_sprite .mouse_filter = Control .MOUSE_FILTER_IGNORE
192+ crack_sprite .expand_mode = TextureRect .EXPAND_FIT_WIDTH_PROPORTIONAL
193+ crack_sprite .stretch_mode = TextureRect .STRETCH_KEEP_ASPECT_CENTERED
194+
195+ # Start small and pick a final position immediately
196+ var initial_size = Vector2 (80 , 80 )
197+ var final_size = Vector2 (250 , 250 )
198+
199+ # Pick final position that accommodates the full grown size
200+ var screen_size = get_viewport ().get_visible_rect ().size
201+ var final_pos = Vector2 (
202+ randf_range (0 , screen_size .x - final_size .x ),
203+ randf_range (0 , screen_size .y - final_size .y )
204+ )
205+
206+ # Position crack so it grows from its center (adjust for size difference)
207+ var size_diff = (final_size - initial_size ) * 0.5
208+ var initial_pos = final_pos + size_diff
209+
210+ crack_sprite .position = initial_pos
211+ crack_sprite .custom_minimum_size = initial_size
212+ crack_sprite .size = initial_size
213+
214+ # Pressure cracks start more opaque and stay visible
215+ crack_sprite .modulate = Color (1 , 1 , 1 , 0.9 )
216+ crack_sprite .rotation = randf () * 2 * PI
217+
218+ # Store properties for jump-based growth
219+ crack_sprite .set_meta ("final_position" , final_pos )
220+ crack_sprite .set_meta ("final_size" , final_size )
221+ crack_sprite .set_meta ("growth_stage" , 0 ) # 0-4 growth stages
222+ crack_sprite .set_meta ("next_growth_time" , randf_range (0.5 , 2.0 )) # Random initial growth delay
223+ crack_sprite .set_meta ("is_fading" , false )
224+
225+ # Add to scene
226+ add_child (crack_sprite )
227+ pressure_cracks .append (crack_sprite )
228+
229+ print ("Added pressure crack " , current_pressure_cracks , "/" , max_pressure_cracks , " at: " , initial_pos )
230+
231+ func grow_pressure_cracks (delta ):
232+ for crack in pressure_cracks :
233+ if not is_instance_valid (crack ) or crack .get_meta ("is_fading" , false ):
234+ continue
235+
236+ var growth_stage = crack .get_meta ("growth_stage" , 0 )
237+ var next_growth_time = crack .get_meta ("next_growth_time" , 0.0 )
238+
239+ # Count down to next growth jump
240+ next_growth_time -= delta
241+ crack .set_meta ("next_growth_time" , next_growth_time )
242+
243+ # Time for a growth jump?
244+ if next_growth_time <= 0.0 and growth_stage < 4 : # 4 growth stages total
245+ growth_stage += 1
246+ crack .set_meta ("growth_stage" , growth_stage )
247+
248+ # Calculate new size based on growth stage
249+ var initial_size = Vector2 (80 , 80 )
250+ var final_size = crack .get_meta ("final_size" , Vector2 (250 , 250 ))
251+ var final_pos = crack .get_meta ("final_position" , crack .position )
252+
253+ # Interpolate size based on stage (0.2, 0.4, 0.6, 0.8, 1.0)
254+ var growth_factor = growth_stage / 4.0
255+ var new_size = initial_size .lerp (final_size , growth_factor )
256+
257+ # Update size instantly (jump growth)
258+ crack .size = new_size
259+ crack .custom_minimum_size = new_size
260+
261+ # Adjust position to grow from center
262+ var size_diff = (final_size - new_size ) * 0.5
263+ crack .position = final_pos + size_diff
264+
265+ # Set next growth time (random interval between 1-3 seconds)
266+ crack .set_meta ("next_growth_time" , randf_range (1.0 , 3.0 ))
267+
268+ print ("Pressure crack grew to stage " , growth_stage , "/4, size: " , new_size )
269+
270+ func start_all_cracks_fade ():
271+ print ("Starting fade for ALL cracks - regular: " , crack_sprites .size (), " pressure: " , pressure_cracks .size ())
272+
273+ # Fade regular cracks
274+ for crack in crack_sprites :
275+ if is_instance_valid (crack ) and not crack .get_meta ("is_fading" , false ):
276+ crack .set_meta ("is_fading" , true )
277+ var fade_tween = create_tween ()
278+ fade_tween .tween_property (crack , "modulate:a" , 0 , 2.0 ) # Fade out over 2 seconds
279+ fade_tween .tween_callback (func (): remove_crack_layer (crack ))
280+
281+ # Fade pressure cracks
282+ for crack in pressure_cracks :
283+ if is_instance_valid (crack ):
284+ crack .set_meta ("is_fading" , true )
285+ var fade_tween = create_tween ()
286+ fade_tween .tween_property (crack , "modulate:a" , 0 , 2.0 ) # Fade out over 2 seconds
287+ fade_tween .tween_callback (func (): remove_pressure_crack (crack ))
288+
289+ func remove_pressure_crack (crack_sprite ):
290+ if crack_sprite and is_instance_valid (crack_sprite ):
291+ pressure_cracks .erase (crack_sprite )
292+ crack_sprite .queue_free ()
293+ current_pressure_cracks = max (0 , current_pressure_cracks - 1 )
294+ print ("Removed pressure crack, remaining: " , current_pressure_cracks )
295+
296+ func cancel_all_crack_fades ():
297+ print ("Canceling all crack fade timers" )
298+ # Cancel fade timers for regular cracks
299+ for crack in crack_sprites :
300+ if is_instance_valid (crack ):
301+ var fade_tween = crack .get_meta ("fade_tween" , null )
302+ if fade_tween and is_instance_valid (fade_tween ):
303+ fade_tween .kill ()
304+ crack .set_meta ("fade_tween" , null )
305+ crack .set_meta ("is_fading" , false )
306+ # Restore full opacity in case it was mid-fade
307+ crack .modulate .a = crack .get_meta ("original_alpha" , 0.8 )
0 commit comments