extends SceneTree ## Smoke test verifying: ## 1. Character editor has right_hand and right_foot options. ## 2. Water Buffalo Lodge Hat (hair_waterbuffalo_01) exists, resolves, and loads. ## 3. In world editor / build mode, controls_pill is hidden. ## 4. Main menu sound toggle is accessible when logged out and responds to 'M' key. var passed := 0 var failed := 0 func _initialize() -> void: _run() func _check(desc: String, cond: bool) -> bool: if cond: print(" PASS: ", desc) passed += 1 else: printerr(" FAIL: ", desc) failed += 1 return cond func _run() -> void: await process_frame print("SMOKE: Starting Editor Controls, Water Buffalo Hat & Sound verification...") # --- 1. Water Buffalo Hat & Character Editor Slots --- var AvatarCatalogScript = preload("res://scripts/avatar/avatar_catalog.gd") var catalog = AvatarCatalogScript.new() var cat_err = catalog.load_catalog() _check("Catalog loads successfully", cat_err == OK) var hat = catalog.resolve("hair_waterbuffalo_01") _check("hair_waterbuffalo_01 exists in catalog", not hat.is_empty()) _check("hair_waterbuffalo_01 slot is 'hair'", hat.get("slot", "") == "hair") _check("hair_waterbuffalo_01 mount_bone is 'HeadTop'", hat.get("mount_bone", "") == "HeadTop") _check("hair_waterbuffalo_01 display_name is 'Water Buffalo Lodge Hat'", hat.get("display_name", "") == "Water Buffalo Lodge Hat") var AvatarCustomizationUIScript = preload("res://scripts/avatar/avatar_customization_ui.gd") var ui = AvatarCustomizationUIScript.new() root.add_child(ui) await process_frame await process_frame var clothing_slots: Array = ui.CATEGORIES[1]["slots"] _check("Clothing category contains 'right_hand'", clothing_slots.has("right_hand")) _check("Clothing category contains 'right_foot'", clothing_slots.has("right_foot")) ui._select_slot("right_hand") await process_frame var right_hand_btn = ui.find_child("Item_right_hand_glove_01", true, false) _check("Item_right_hand_glove_01 exists in ItemList", right_hand_btn != null) ui._select_slot("right_foot") await process_frame var right_foot_btn = ui.find_child("Item_right_foot_boot_01", true, false) _check("Item_right_foot_boot_01 exists in ItemList", right_foot_btn != null) ui._select_slot("hair") await process_frame var hat_btn = ui.find_child("Item_hair_waterbuffalo_01", true, false) _check("Item_hair_waterbuffalo_01 exists in ItemList", hat_btn != null) # Equip water buffalo hat ui._on_equip_pressed("hair_waterbuffalo_01") await process_frame _check("Water Buffalo Hat equipped in loadout", ui.loadout.get_equipment("hair") == "hair_waterbuffalo_01") ui.queue_free() await process_frame # --- 2. Main Menu Sound Controls & Keyboard 'M' --- var audio_mgr = root.get_node_or_null("AudioManager") _check("AudioManager autoload exists", audio_mgr != null) if audio_mgr: audio_mgr.set_sound_enabled(true, false) var main_menu_scene = load("res://scenes/main_menu.tscn") var menu = main_menu_scene.instantiate() root.add_child(menu) await process_frame var sound_btn = menu.find_child("SoundButton", true, false) as Button _check("SoundButton exists on MainMenu", sound_btn != null) var auth_sound_btn = menu.find_child("AuthSoundButton", true, false) as Button _check("AuthSoundButton exists in AuthButtonsRow", auth_sound_btn != null) var panel_sound_btn = menu.find_child("PanelSoundButton", true, false) as Button _check("PanelSoundButton exists in AuthPanel", panel_sound_btn != null) _check("SoundButton text contains 'Sound: ON'", sound_btn != null and sound_btn.text.contains("Sound: ON")) _check("AuthSoundButton text contains 'Sound: ON'", auth_sound_btn != null and auth_sound_btn.text.contains("Sound: ON")) # Test 'M' key shortcut var key_ev = InputEventKey.new() key_ev.pressed = true key_ev.keycode = KEY_M menu._unhandled_input(key_ev) await process_frame _check("Pressing 'M' toggles sound OFF", audio_mgr != null and not audio_mgr.is_sound_enabled()) _check("SoundButton text updated to 'Sound: OFF'", sound_btn != null and sound_btn.text.contains("Sound: OFF")) _check("AuthSoundButton text updated to 'Sound: OFF'", auth_sound_btn != null and auth_sound_btn.text.contains("Sound: OFF")) # Toggle back ON with AuthSoundButton if auth_sound_btn != null: auth_sound_btn.emit_signal("pressed") await process_frame _check("AuthSoundButton click toggles sound ON", audio_mgr != null and audio_mgr.is_sound_enabled()) _check("SoundButton text restored to 'Sound: ON'", sound_btn != null and sound_btn.text.contains("Sound: ON")) menu.queue_free() await process_frame # --- 3. World Editor Controls Banner Hiding --- var game_scene = load("res://scenes/game.tscn") _check("game.tscn loads successfully", game_scene != null) if game_scene == null: _finish() return var game = game_scene.instantiate() root.add_child(game) await process_frame var pill = game.find_child("ControlsPill", true, false) as Control var hud_layer = game.find_child("InGameHUD", true, false) as CanvasLayer var hud_panel = game.find_child("HUDPanel", true, false) as Control _check("ControlsPill exists in game HUD", pill != null) _check("InGameHUD CanvasLayer exists", hud_layer != null) _check("HUDPanel exists in game HUD", hud_panel != null) _check("ControlsPill starts visible during regular play", pill != null and pill.visible) _check("InGameHUD starts visible during regular play", hud_layer != null and hud_layer.visible) _check("HUDPanel starts visible during regular play", hud_panel != null and hud_panel.visible) # Open build mode game._open_build_mode() await process_frame _check("ControlsPill is HIDDEN when in build mode", pill != null and not pill.visible) _check("InGameHUD is HIDDEN when in build mode", hud_layer != null and not hud_layer.visible) _check("HUDPanel is HIDDEN when in build mode", hud_panel != null and not hud_panel.visible) # Close build mode game._close_build_mode() await process_frame _check("ControlsPill is RESTORED when exiting build mode", pill != null and pill.visible) _check("InGameHUD is RESTORED when exiting build mode", hud_layer != null and hud_layer.visible) _check("HUDPanel is RESTORED when exiting build mode", hud_panel != null and hud_panel.visible) game.queue_free() await process_frame print("\n=== SMOKE RESULT: %d/%d passed ===" % [passed, passed + failed]) quit(0 if failed == 0 else 1) func _finish() -> void: print("\n=== SMOKE RESULT: %d/%d passed ===" % [passed, passed + failed]) quit(0 if failed == 0 else 1)