This commit is contained in:
Nicholas Butzke
2026-08-02 02:20:02 -04:00
parent 61669627db
commit 922983429e
226 changed files with 34032 additions and 18521 deletions
+83 -2
View File
@@ -7,6 +7,8 @@ extends SceneTree
var _frames := 0
var _out_dir := "."
var _skin_id := ""
var _quick := false
var _player: Node = null
var _wman: Node = null
var _mode := "boot"
@@ -32,6 +34,10 @@ func _initialize() -> void:
var args := OS.get_cmdline_user_args()
if args.size() > 0:
_out_dir = args[0]
if args.size() > 1:
_skin_id = args[1]
if args.size() > 2:
_quick = args[2] == "quick"
change_scene_to_file("res://ui/main_menu/main_menu.tscn")
@@ -39,6 +45,12 @@ func _process(_delta: float) -> bool:
_frames += 1
if _mode == "boot":
if _frames == 40:
var skin_manager = root.get_node_or_null("SkinManager")
if not _skin_id.is_empty() and skin_manager \
and skin_manager.skins.has(_skin_id):
# Capture-only override: do not persist over the player's actual
# skin selection in user://.
skin_manager.active_skin_id = _skin_id
var nm = root.get_node_or_null("NetworkManager")
if nm and nm.has_method("start_singleplayer_match"):
nm.start_singleplayer_match(GameMode.DEATHMATCH)
@@ -62,7 +74,30 @@ func _process(_delta: float) -> bool:
return true
_player.set_physics_process(false)
_player.global_position = Vector3(0, 1.2, 14)
_mode = "spawn"
_mode = "quick" if _quick else "spawn"
_phase_frame = 0
return false
if _mode == "quick":
_phase_frame += 1
if _phase_frame == 15:
if not _skin_id.is_empty():
_verify_skin(_skin_id)
_snap("fp_quick_idle")
var quick_weapon = _wman.weapons.get(_wman.active_slot)
if quick_weapon and quick_weapon.has_method("_start_reload"):
quick_weapon._start_reload()
elif _phase_frame == 32:
_snap("fp_quick_reload")
elif _phase_frame == 38:
var skin_manager = root.get_node_or_null("SkinManager")
if skin_manager:
skin_manager.skin_changed.emit("aria")
elif _phase_frame == 48:
_verify_skin("aria")
_snap("fp_quick_skin_swap")
elif _phase_frame >= 55:
return true
return false
if _mode == "spawn":
@@ -121,7 +156,9 @@ func _process(_delta: float) -> bool:
if _mode == "knife_swing":
_phase_frame += 1
if _phase_frame == 20:
if _phase_frame == 10:
_snap("fp_knife_guard")
elif _phase_frame == 20:
var knife = _wman.weapons.get(4)
if knife and knife.has_method("_swing"):
knife._swing()
@@ -154,3 +191,47 @@ func _snap(tag: String) -> void:
var path := _out_dir + "/" + tag + ".png"
img.save_png(path)
print("fp_capture: saved ", path)
func _verify_skin(skin_id: String) -> void:
var skin_manager = root.get_node_or_null("SkinManager")
var weapon = _wman.weapons.get(_wman.active_slot) if _wman else null
var sleeve = weapon.get_node_or_null("ArmR/Sleeve") if weapon else null
var hand = weapon.get_node_or_null("ArmR/Hand") if weapon else null
if skin_manager == null or sleeve == null or hand == null:
printerr("fp_capture: skin swap verification missing arm")
return
var material = sleeve.get_active_material(0)
var actual = material.get_shader_parameter("albedo_color") \
if material is ShaderMaterial else null
var expected: Color = skin_manager.get_skin(skin_id).viewmodel_sleeve_color
var selected_skin: PlayerSkin = skin_manager.get_skin(skin_id)
var palm := hand.get_node_or_null("Palm") as MeshInstance3D
var palm_material := palm.get_active_material(0) if palm else null
var palm_actual = palm_material.get_shader_parameter("albedo_color") \
if palm_material is ShaderMaterial else null
var palm_expected: Color
match selected_skin.viewmodel_hand_style:
"bare":
palm_expected = selected_skin.viewmodel_skin_color
"android":
palm_expected = selected_skin.viewmodel_accent_color
_:
palm_expected = selected_skin.viewmodel_glove_color
var finger_segments: int = hand.find_children(
"Finger*", "MeshInstance3D", true, false).size()
var thumb_segments: int = hand.find_children(
"Thumb*", "MeshInstance3D", true, false).size()
if not (actual is Color and actual.is_equal_approx(expected)):
printerr("fp_capture: skin swap mismatch actual=%s expected=%s" % [
actual, expected])
elif not (palm_actual is Color and palm_actual.is_equal_approx(palm_expected)):
printerr("fp_capture: hand palette mismatch actual=%s expected=%s" % [
palm_actual, palm_expected])
elif finger_segments != 8 or thumb_segments != 2:
printerr("fp_capture: incomplete anime hand fingers=%d thumb=%d" % [
finger_segments, thumb_segments])
else:
print("fp_capture: live skin swap verified %s style=%s fingers=%d thumb=%d" % [
skin_id, selected_skin.viewmodel_hand_style,
finger_segments, thumb_segments])