Make fishing challenge scale with catch quality

This commit is contained in:
Alexander Sellite 2026-08-03 00:43:19 -04:00
parent c806e7ca6f
commit 46df74361a
10 changed files with 128 additions and 32 deletions

View file

@ -11,6 +11,3 @@ barrier_health_max = 7
first_barrier_margin = 0.14
final_barrier_margin = 0.1
minimum_barrier_spacing = 0.14
chase_start_delay = 1.0
chase_start_offset = 0.16
chase_speed = 0.145

View file

@ -11,6 +11,3 @@ barrier_health_max = 8
first_barrier_margin = 0.13
final_barrier_margin = 0.09
minimum_barrier_spacing = 0.14
chase_start_delay = 1.1
chase_start_offset = 0.18
chase_speed = 0.15

View file

@ -4,6 +4,7 @@ extends Node
const CatchDifficultyProfileType = preload(
"res://fishing/catch_difficulty_profile.gd"
)
const FishQualityType = preload("res://fish/fish_quality.gd")
signal encounter_updated(
progress: float,
@ -42,6 +43,13 @@ class Barrier:
maximum_health = barrier_health
# Fight movement uses one shared baseline. Species and quality difficulty comes
# from barrier placement and health, while reel upgrades affect only the
# player's progress speed.
const CHASE_START_DELAY: float = 0.5
const CHASE_START_OFFSET: float = 0.04
const CHASE_SPEED: float = 0.07
@export_category("Accessibility")
@export var auto_click_enabled: bool = false
@export_range(0.05, 2.0, 0.01) var auto_click_interval: float = 0.20
@ -60,9 +68,8 @@ var _active_barrier_index: int = -1
var _reel_input_held: bool = false
var _reel_speed: float = 0.0
var _click_power: int = 1
var _chase_start_delay: float = 0.0
var _fish_quality: int = FishQualityType.Tier.BORING
var _chase_delay_remaining: float = 0.0
var _chase_speed: float = 0.0
var _failure_epsilon: float = 0.0001
var _auto_click_accumulator: float = 0.0
var _rng: RandomNumberGenerator = RandomNumberGenerator.new()
@ -103,6 +110,7 @@ func start_encounter(
profile: CatchDifficultyProfileType,
reel_speed: float,
click_power: int,
fish_quality: int = FishQualityType.Tier.BORING,
) -> void:
reset()
if profile == null:
@ -111,10 +119,13 @@ func start_encounter(
_reel_speed = maxf(reel_speed, 0.0)
_click_power = maxi(click_power, 1)
_chase_start_delay = maxf(profile.chase_start_delay, 0.0)
_chase_delay_remaining = _chase_start_delay
chase_progress = -maxf(profile.chase_start_offset, 0.01)
_chase_speed = maxf(profile.chase_speed, 0.0)
_fish_quality = (
fish_quality
if FishQualityType.is_valid(fish_quality)
else FishQualityType.Tier.BORING
)
_chase_delay_remaining = CHASE_START_DELAY
chase_progress = -CHASE_START_OFFSET
_seed_encounter_rng()
_generate_barriers(profile)
progress = 0.0
@ -127,12 +138,13 @@ func start_authoritative_encounter(
reel_speed: float,
click_power: int,
seed: int,
fish_quality: int = FishQualityType.Tier.BORING,
) -> void:
var previous_test_mode: bool = use_deterministic_test_seed
var previous_seed: int = deterministic_test_seed
use_deterministic_test_seed = true
deterministic_test_seed = seed
start_encounter(profile, reel_speed, click_power)
start_encounter(profile, reel_speed, click_power, fish_quality)
use_deterministic_test_seed = previous_test_mode
deterministic_test_seed = previous_seed
@ -168,9 +180,8 @@ func reset() -> void:
_reel_input_held = false
_reel_speed = 0.0
_click_power = 1
_chase_start_delay = 0.0
_fish_quality = FishQualityType.Tier.BORING
_chase_delay_remaining = 0.0
_chase_speed = 0.0
_auto_click_accumulator = 0.0
emit_signal(
"encounter_updated",
@ -215,7 +226,7 @@ func _update_chase(delta: float) -> void:
if active_delta <= 0.0:
return
chase_progress = minf(
chase_progress + _chase_speed * active_delta,
chase_progress + CHASE_SPEED * active_delta,
1.0
)
@ -302,7 +313,14 @@ func _generate_barriers(profile: CatchDifficultyProfileType) -> void:
+ spacing * float(barrier_index)
+ random_offsets[barrier_index] * random_slack
)
var health: int = _rng.randi_range(health_range.x, health_range.y)
var base_health: int = _rng.randi_range(
health_range.x,
health_range.y,
)
var health: int = FishQualityType.apply_barrier_health(
base_health,
_fish_quality,
)
_barriers.append(Barrier.new(position, health))

View file

@ -8,9 +8,6 @@ extends Resource
@export_range(0.0, 0.45, 0.01) var first_barrier_margin: float = 0.15
@export_range(0.0, 0.45, 0.01) var final_barrier_margin: float = 0.10
@export_range(0.01, 1.0, 0.01) var minimum_barrier_spacing: float = 0.15
@export_range(0.0, 5.0, 0.05) var chase_start_delay: float = 1.0
@export_range(0.01, 0.5, 0.01) var chase_start_offset: float = 0.15
@export_range(0.0, 2.0, 0.01) var chase_speed: float = 0.14
func get_barrier_count_range() -> Vector2i:

View file

@ -11,6 +11,3 @@ barrier_health_max = 7
first_barrier_margin = 0.15
final_barrier_margin = 0.1
minimum_barrier_spacing = 0.15
chase_start_delay = 1.0
chase_start_offset = 0.15
chase_speed = 0.14

View file

@ -919,6 +919,10 @@ func _activate_bite() -> void:
state = FishingState.FIGHTING
_state_time_remaining = 0.0
_withdrawal_input_held = false
_pending_catch = _fish_selector.create_catch(_selected_fish)
if _pending_catch == null or not _pending_catch.is_valid():
_cancel_attempt()
return
bite_activated.emit()
status_changed.emit("fish on!")
_presentation.set_line_mode(FishingPresentationType.LineMode.TAUT)
@ -926,7 +930,8 @@ func _activate_bite() -> void:
_catch_controller.start_encounter(
_selected_fish.catch_profile,
_get_effective_reel_speed(),
_get_effective_barrier_damage()
_get_effective_barrier_damage(),
_pending_catch.quality,
)
_catch_controller.set_reel_input(
Input.is_action_pressed("fish_primary")
@ -993,7 +998,6 @@ func _on_catch_completed() -> void:
_cancel_attempt()
return
_pending_catch = _fish_selector.create_catch(_selected_fish)
if _pending_catch == null or not _pending_catch.is_valid():
_cancel_attempt()
return