Restore Kat and Kim animalese voices

This commit is contained in:
Alexander Sellite 2026-08-21 21:32:58 -04:00
parent 8107e2d89c
commit 86e5980019
149 changed files with 1781 additions and 24 deletions

View file

@ -964,19 +964,20 @@ func _validate_profile_voice_navigation() -> void:
for item: Variant in page.call("_controls_under", sample_grid):
sample_buttons.append(item as Control)
_expect(
sample_buttons.size() == 1,
"The voice-set row must expose the project-owned robot set.",
sample_buttons.size() == 3,
"The voice-set row must expose kat, robot, and kim.",
)
if sample_buttons.size() != 1:
if sample_buttons.size() != 3:
page.queue_free()
await process_frame
return
var kat_button := sample_grid.get_node("VoiceSet_kat") as Button
var robot_button := sample_grid.get_node("VoiceSet_robot") as Button
var kim_button := sample_grid.get_node("VoiceSet_kim") as Button
_expect(kat_button.text == "kat", "The default voice set is not labeled kat.")
_expect(robot_button.text == "robot", "The tone voice set is not labeled robot.")
_expect(
robot_button.button_pressed,
"The project-owned robot voice set is not selected by default.",
)
_expect(kim_button.text == "kim", "The kim voice set is not labeled kim.")
_expect(kat_button.button_pressed, "The kat voice set is not selected by default.")
var option_controls: Array[Control] = []
var option_groups: Array = page.call("_controller_option_groups")
for item: Variant in option_groups[0]:
@ -991,12 +992,12 @@ func _validate_profile_voice_navigation() -> void:
),
"The controller voice zone does not contain every voice setting.",
)
_assert_directionally_reachable(robot_button, option_controls)
var robot_down := robot_button.get_node_or_null(
robot_button.focus_neighbor_bottom
_assert_directionally_reachable(kat_button, option_controls)
var kat_down := kat_button.get_node_or_null(
kat_button.focus_neighbor_bottom
) as Control
_expect(
robot_down != null and pitch_grid.is_ancestor_of(robot_down),
kat_down != null and pitch_grid.is_ancestor_of(kat_down),
"Down from the voice-set row does not enter the pitch row.",
)
if OS.has_environment("NETFISHING_PROFILE_VOICE_CAPTURE"):
@ -1020,6 +1021,18 @@ func _validate_profile_voice_navigation() -> void:
str(page.get("_draft_sample_set_id")) == "robot",
"Selecting robot did not update the profile draft.",
)
kim_button.grab_focus()
kim_button.button_pressed = true
kim_button.pressed.emit()
await process_frame
_expect(
root.gui_get_focus_owner() == kim_button,
"Selecting kim moved controller focus out of the voice-set row.",
)
_expect(
str(page.get("_draft_sample_set_id")) == "kim",
"Selecting kim did not update the profile draft.",
)
var category_controls: Array[Control] = []
for item: Variant in page.call(
"_controls_under", page.get("_category_list")

View file

@ -53,7 +53,7 @@ func _run_host() -> void:
"deep",
profile.speech_speed_id,
profile.call_id,
"robot",
"kim",
))
var save_manager := main.get("_save_manager") as PlayerSaveManager
assert(session.start_private_host(TEST_PORT))
@ -62,7 +62,7 @@ func _run_host() -> void:
) as Player
assert(local_avatar != null)
assert(local_avatar.get_animalese_voice_id() == "deep")
assert(local_avatar.get_animalese_sample_set_id() == "robot")
assert(local_avatar.get_animalese_sample_set_id() == "kim")
assert(save_manager.initialize_new_game())
main.call("_enter_gameplay")
for _frame: int in 4:
@ -114,7 +114,7 @@ func _run_host() -> void:
await process_frame
assert(not voice_messages.is_empty())
assert(str(voice_messages[0].get("voice_id", "")) == "deep")
assert(str(voice_messages[0].get("sample_set_id", "")) == "robot")
assert(str(voice_messages[0].get("sample_set_id", "")) == "kim")
var disconnect_deadline: int = Time.get_ticks_msec() + 8000
while (
Time.get_ticks_msec() < disconnect_deadline
@ -182,7 +182,7 @@ func _run_client() -> void:
"deep",
service.get_persisted_speech_speed_id(),
service.get_persisted_call_id(),
"robot",
"kim",
))
var apply_deadline: int = Time.get_ticks_msec() + 8000
while Time.get_ticks_msec() < apply_deadline and apply_results.is_empty():
@ -191,11 +191,11 @@ func _run_client() -> void:
assert(bool(apply_results[0][0]))
assert(service.get_persisted_appearance() == changed)
assert(service.get_persisted_voice_id() == "deep")
assert(service.get_persisted_sample_set_id() == "robot")
assert(service.get_persisted_sample_set_id() == "kim")
assert(Dictionary(session.get("_local_appearance_snapshot")) == changed)
var player := main.get_node("%PlayerSpawnService").get_local_player() as Player
assert(player.get_animalese_voice_id() == "deep")
assert(player.get_animalese_sample_set_id() == "robot")
assert(player.get_animalese_sample_set_id() == "kim")
var host_voice_messages: Array[Dictionary] = []
for message: Dictionary in chat_service.get_history():
if str(message.get("body", "")) == HOST_VOICE_MESSAGE:
@ -217,8 +217,8 @@ func _run_client() -> void:
host_voice_messages.append(message)
assert(not host_voice_messages.is_empty())
assert(str(host_voice_messages[0].get("voice_id", "")) == "deep")
assert(str(host_voice_messages[0].get("sample_set_id", "")) == "robot")
assert(remote_voice_samples.has("robot"))
assert(str(host_voice_messages[0].get("sample_set_id", "")) == "kim")
assert(remote_voice_samples.has("kim"))
var local_confirmations: Array[Dictionary] = []
chat_service.local_message_confirmed.connect(
func(message: Dictionary) -> void:
@ -238,7 +238,7 @@ func _run_client() -> void:
await process_frame
assert(not local_confirmations.is_empty())
assert(str(local_confirmations[0].get("voice_id", "")) == "deep")
assert(str(local_confirmations[0].get("sample_set_id", "")) == "robot")
assert(str(local_confirmations[0].get("sample_set_id", "")) == "kim")
print("Profile multiplayer client validation: PASS")
await _session_cleanup(main, session)