79 lines
2.5 KiB
GDScript
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)
|