Files
Decked-Out-Defense/scenes/boom_box/scr_boom_box.gd

79 lines
2.5 KiB
GDScript

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)