PneumaticPlaything/Scripts/DynamicBackground.gd
Persephone Bubblegum-Holiday 7733b0cab4 fixes to dynamic background
2025-08-19 11:16:22 -07:00

85 lines
3.3 KiB
GDScript

extends Control
var currentStage: String
var playing = false
var index = 0
var cam_index = 1
var loaded_frames = []
var in_flows = []
var out_flows = []
var prev_frame_held = []
var animatables_handles = []
var rotationStages = [
"Balcony Stage",
"C-Stage",
"Prototype Road Stage",
"Mini Unit 1-Stage",
"1-Stage w 2-Stage Props",
"1-Stage",
"Turntable 1-Stage",
"2-Stage",
"Cyberamic 3-Stage",
]
func _ready() -> void:
if (GlobalVariables.title_dynamic == 1):
currentStage = rotationStages[randi() % rotationStages.size()]
$SubViewport.add_child(load(Stages.stages_info[currentStage]["scene"]).instantiate())
for curtain in Stages.stages_info[currentStage]["curtains"]:
for curtain_movement in Stages.stages_info[currentStage]["curtains"][curtain]:
get_node(Stages.stages_info[currentStage]["scene_ref_base"] + curtain)._movement_in(curtain_movement + " Up", 100000)
var cosmetics_count = 0
for cosmetic_subtable in Stages.stages_info[currentStage]["cosmetics"]:
for cosmetic in cosmetic_subtable:
var cosmetic_adjustment = load("res://Scenes/GUI/Controls/CosmeticAdjustment.tscn").instantiate()
cosmetic_adjustment.vis_name = cosmetic
cosmetic_adjustment.options = cosmetic_subtable[cosmetic]
cosmetic_adjustment.scene_handle = "../../" + Stages.stages_info[currentStage]["scene_ref_base"]
cosmetic_adjustment.drop_index = Stages.stages_info[currentStage]["cosmetic_defaults"][cosmetics_count]
cosmetics_count += 1
$SuperSecretInvisibleZone.add_child(cosmetic_adjustment)
for bit_number in Stages.stages_info[currentStage]["bit_mapping"]:
var bot = Stages.stages_info[currentStage]["bit_mapping"][bit_number]["bot"]
var in_flow = Stages.stages_info[currentStage]["bit_mapping"][bit_number]["flow_in"]
var out_flow = Stages.stages_info[currentStage]["bit_mapping"][bit_number]["flow_out"]
animatables_handles.push_back(get_node(Stages.stages_info[currentStage]["scene_ref_base"] + bot))
in_flows.push_back(in_flow)
out_flows.push_back(out_flow)
prev_frame_held.push_back(false)
for frame_string in RandomMovements.Cybers:
if (frame_string == ""): continue
var check_frame_split = frame_string.split()
check_frame_split.reverse()
var unpacked_frame = []
for i in Stages.stages_info[currentStage]["bit_mapping"]:
if ((check_frame_split[(i - 1) / 4].hex_to_int() & int(pow(2, ((i - 1) % 4)))) == int(pow(2, ((i - 1) % 4)))):
unpacked_frame.push_back(true)
else: unpacked_frame.push_back(false)
loaded_frames.push_back(unpacked_frame)
playing = true
func _physics_process(_delta: float) -> void:
if (playing):
if (index >= loaded_frames.size()):
index = 0
return
var j = 0
for i in Stages.stages_info[currentStage]["bit_mapping"]:
if (loaded_frames[index][j]):
if (!prev_frame_held[j]):
animatables_handles[j]._movement_in(Stages.stages_info[currentStage]["bit_mapping"][i]["movement"], in_flows[j])
prev_frame_held[j] = true
else:
if (prev_frame_held[j]):
animatables_handles[j]._movement_out(Stages.stages_info[currentStage]["bit_mapping"][i]["movement"], in_flows[j])
prev_frame_held[j] = false
j+=1
index += 1
if (index % 1800 == 0):
cam_index += 1
get_node(Stages.stages_info[currentStage]["scene_ref_base"] + "Angle " + str((cam_index % Stages.stages_info[currentStage]["camera_count"])+1)).current = true