whittler/scripts/animal_friends_manager.gd
2026-01-29 13:26:42 +00:00

101 lines
3.1 KiB
GDScript

extends Node
## Manages the visibility of animal friends in the animal_friends group
## Animals start invisible and are revealed one at a time randomly as ranks are unlocked
const ANIMAL_FRIENDS_UNLOCK_ID: int = 6 # Forest Friends unlock
var all_animals: Array[Node] = []
var hidden_animals: Array[Node] = []
var revealed_animals: Array[Node] = []
var last_known_rank: int = 0
func _ready() -> void:
# Wait a frame to ensure all nodes are ready
call_deferred("_initialize")
func _initialize() -> void:
# Get all nodes in the animal_friends group
all_animals = get_tree().get_nodes_in_group("animal_friends")
if all_animals.is_empty():
Log.pr("Warning: No animal friends found in the animal_friends group")
return
# Shuffle the animals to randomize the order they'll be revealed
all_animals.shuffle()
# Start with all animals hidden
for animal in all_animals:
animal.visible = false
hidden_animals.append(animal)
Log.pr("Animal Friends Manager initialized with %d animals" % all_animals.size())
# Get the Forest Friends unlock to track its rank
var forest_friends = Unlocks.get_unlock_by_id(ANIMAL_FRIENDS_UNLOCK_ID)
if forest_friends:
last_known_rank = forest_friends.current_rank
# Reveal animals based on current rank (for game loads)
_reveal_animals_for_current_rank()
else:
Log.pr("Warning: Forest Friends unlock (ID %d) not found" % ANIMAL_FRIENDS_UNLOCK_ID)
# Connect to unlock signal to detect when new ranks are purchased
Unlocks.item_unlocked.connect(_on_item_unlocked)
func _reveal_animals_for_current_rank() -> void:
# Reveal one animal per rank in the Forest Friends unlock
var forest_friends = Unlocks.get_unlock_by_id(ANIMAL_FRIENDS_UNLOCK_ID)
if not forest_friends:
return
var ranks_to_reveal = forest_friends.current_rank
for i in range(ranks_to_reveal):
if hidden_animals.is_empty():
break
_reveal_next_animal()
func _on_item_unlocked() -> void:
# Check if the Forest Friends unlock was ranked up
var forest_friends = Unlocks.get_unlock_by_id(ANIMAL_FRIENDS_UNLOCK_ID)
if not forest_friends:
return
var current_rank = forest_friends.current_rank
var new_ranks = current_rank - last_known_rank
if new_ranks > 0:
Log.pr("Forest Friends ranked up! Revealing %d animal friend(s)" % new_ranks)
# Reveal one animal for each new rank
for i in range(new_ranks):
if hidden_animals.is_empty():
Log.pr("All animal friends have been revealed!")
break
_reveal_next_animal()
last_known_rank = current_rank
func _reveal_next_animal() -> void:
if hidden_animals.is_empty():
return
# Take the first animal from the shuffled hidden list (random order)
var animal = hidden_animals.pop_front()
animal.visible = true
revealed_animals.append(animal)
Log.pr("Revealed animal friend: %s (%d/%d visible)" % [animal.name, revealed_animals.size(), all_animals.size()])
## Debug function to manually reveal the next animal
func debug_reveal_next() -> void:
_reveal_next_animal()
## Debug function to hide all animals
func debug_reset_all() -> void:
for animal in all_animals:
animal.visible = false
hidden_animals = all_animals.duplicate()
revealed_animals.clear()
Log.pr("All animals hidden")