Skip to content

Commit c39e3cb

Browse files
committed
better damage cracks
1 parent af9b52c commit c39e3cb

2 files changed

Lines changed: 231 additions & 10 deletions

File tree

scripts/damage_effects.gd

Lines changed: 211 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,21 @@ var max_cracks = 5 # Maximum number of crack layers
1111
var current_crack_count = 0
1212
var 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+
1422
func _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
2129
func 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+
3771
func 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

85144
func 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)

scripts/player.gd

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,29 @@ func process_dock(delta):
458458

459459
func process_depth_effects(delta):
460460
GameState.headroom = ((GameState.upgrades[GameState.Upgrade.DEPTH_RESISTANCE] + 1) * 100 - GameState.depth)
461+
462+
# Get reference to damage effects
463+
var ui_node = get_node("/root/Node3D/UI")
464+
var damage_effects = null
465+
if ui_node:
466+
if ui_node.has_node("DamageEffects"):
467+
damage_effects = ui_node.get_node("DamageEffects")
468+
else:
469+
# Create damage effects instance if it doesn't exist
470+
damage_effects = load("res://scenes/damage_effects.tscn").instantiate()
471+
ui_node.add_child(damage_effects)
472+
461473
if GameState.headroom < 0:
462474
add_trauma(0.1)
463475
GameState.health += GameState.headroom * delta
476+
477+
# Trigger pressure crack effects
478+
if damage_effects:
479+
damage_effects.process_pressure_damage(delta)
480+
else:
481+
# Safe depth - allow pressure cracks to start fading
482+
if damage_effects:
483+
damage_effects.end_pressure_damage()
464484

465485
# Lava damage only when actually in lava area (not just lava stage)
466486
if is_in_lava_area:

0 commit comments

Comments
 (0)