extends Control var TrayItemScene = preload("res://TrayItem.tscn") var is_open = true var _on_data_loaded_callback = null func _ready(): if OS.get_name() == "Web": _on_data_loaded_callback = JavaScriptBridge.create_callback(load_save) var callbacks = JavaScriptBridge.get_interface("godotCallbacks") callbacks.dataLoaded = _on_data_loaded_callback for i in range(5): add_item() await get_tree().process_frame _on_resized() func add_item(): var tray_item = TrayItemScene.instantiate() %Items.add_child(tray_item) func open(): is_open = true var tween = create_tween() tween.tween_property( self, "global_position", Vector2(get_viewport_rect().end.x - size.x, position.y), 0.25 ) func close(): is_open = false var tween = create_tween() tween.tween_property( self, "global_position", Vector2(get_viewport_rect().end.x, position.y), 0.25 ) func _on_resized(): %Button.global_position = global_position - Vector2(%Button.size.x, 0) var shape = RectangleShape2D.new() shape.size = size %TrayCollision/CollisionShape2D.shape = shape %TrayCollision/CollisionShape2D.position = size / 2 func _on_button_pressed(): if is_open: close() else: open() func _on_save_pressed(): if OS.get_name() == "Web": var to_save = [] var objects = get_tree().current_scene.get_node("%DropTarget").get_children() for obj in objects: to_save.append({ "position": { "x": obj.position.x, "y": obj.position.y, }, "rotation": obj.rotation, "object": "BuilderObject", }) JavaScriptBridge.download_buffer( JSON.stringify(to_save).to_utf8_buffer(), "CityBuilder-save.json", "application/json" ) func _on_load_pressed(): if OS.get_name() == "Web": JavaScriptBridge.eval("openLoadDialog()") func load_save(data: Array): var current_objects = get_tree().current_scene.get_node("%DropTarget").get_children() for obj in current_objects: obj.queue_free() var objects = JSON.parse_string(data[0]) for obj in objects: var scene = load("res://Objects/" + obj.object + ".tscn").instantiate() scene.position = Vector2(obj.position.x, obj.position.y) scene.rotation = obj.rotation get_tree().current_scene.get_node("%DropTarget").add_child(scene)