class_name BoomBox extends StaticBody3D @export var button: InteractButton @export var button_collider: CollisionShape3D @export var cassette_selection_menu: PackedScene var cassettes_generated: int = 0 var reply_player: Hero var spawned_cassettes: Array[CassetteItem] = [] func _ready() -> void: button.hover_text = tr("PROMPT_RADIO_INTERACT") func generate_rarity() -> int: var weight_total: int = 0 for rarity: String in Data.Rarity: weight_total += Data.rarity_weights[rarity] var generated_rarity: int = NoiseRandom.randi_in_range(4 * cassettes_generated, 0, weight_total) cassettes_generated += 1 var decided_rarity: int = 0 for rarity: String in Data.Rarity: weight_total -= Data.rarity_weights[rarity] if generated_rarity >= weight_total: decided_rarity = Data.Rarity[rarity] break return decided_rarity func find_cassettes(role: Cassette.Role, rarity: Data.Rarity, allowed_cassettes: Array[Cassette]) -> void: var decided_rarity: int = rarity if rarity == null: decided_rarity = generate_rarity() var cassette_choices: Array[Cassette] = allowed_cassettes if !cassette_choices: cassette_choices = Cassette.get_role_cassettes(role) var cassettes: Array[Cassette] = [] var valid_cassettes_found: bool = false var testing_rarity: int = decided_rarity while !valid_cassettes_found: for cassette: Cassette in cassette_choices: if cassette.rarity == testing_rarity: cassettes.append(cassette) if cassettes.size() != 0: valid_cassettes_found = true testing_rarity -= 1 if testing_rarity < 0: testing_rarity = 4 if testing_rarity == decided_rarity: print("This character doesn't have any cassettes!") return var menu: ChooseCassetteScreen = cassette_selection_menu.instantiate() as ChooseCassetteScreen menu.add_cassettes(cassettes) menu.cassette_chosen.connect(output_cassette) reply_player.pause() reply_player.hud.add_child(menu) func output_cassette(cassette: Cassette) -> void: reply_player.add_cassette(cassette) reply_player.unpause() reply_player = null button_collider.disabled = false $StaticBody3D/AudioStreamPlayer3D.play() func _on_static_body_3d_button_interacted(_value: int, reply: Hero) -> void: reply_player = reply if reply.blank_cassettes >= 1: reply.blank_cassettes -= 1 else: return button_collider.disabled = true $StaticBody3D/AudioStreamPlayer3D.play() find_cassettes(reply.hero_class.role, reply.game_manager.level_config.waves[reply.game_manager.wave - 1].station, reply.game_manager.level_config.allowed_cassettes)